From 6470a2996c0f5c66b790f7e6c3e2475541d932c3 Mon Sep 17 00:00:00 2001 From: mariomitte Date: Fri, 31 Jul 2026 18:47:37 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20ukloni=20DOCX=20za=C5=A1titu=20za=20ure?= =?UTF-8?q?=C4=91ivanje=20izvje=C5=A1taja?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generirani servisni DOCX preuzimao je document/write zaštitu iz predloška pa je Word datoteka bila neurediva.\n\nDodano je uklanjanje documentProtection/writeProtection/readOnlyRecommended postavki pri kreiranju DOCX dokumenta te regresijski test koji provjerava da zaštita nije prisutna u word/settings.xml.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../tests/test_work_order_images_endpoint.py | 3 +++ backend/modules/fleet/views.py | 25 +++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/backend/modules/fleet/tests/test_work_order_images_endpoint.py b/backend/modules/fleet/tests/test_work_order_images_endpoint.py index 53982d5..f881b8a 100644 --- a/backend/modules/fleet/tests/test_work_order_images_endpoint.py +++ b/backend/modules/fleet/tests/test_work_order_images_endpoint.py @@ -268,3 +268,6 @@ class WorkOrderImagesEndpointTests(TestCase): archive = zipfile.ZipFile(BytesIO(response.content)) media_files = [name for name in archive.namelist() if name.startswith('word/media/')] self.assertTrue(media_files, archive.namelist()) + settings_xml = archive.read('word/settings.xml').decode('utf-8') + self.assertNotIn('documentProtection', settings_xml) + self.assertNotIn('writeProtection', settings_xml) diff --git a/backend/modules/fleet/views.py b/backend/modules/fleet/views.py index 0074513..50a92ca 100644 --- a/backend/modules/fleet/views.py +++ b/backend/modules/fleet/views.py @@ -1607,11 +1607,32 @@ def _create_docx_document(template_name=None): except ModuleNotFoundError: raise DRFValidationError({"detail": "DOCX generiranje nije dostupno: nedostaje python-docx paket."}) if not template_name: - return Document() + document = Document() + _remove_docx_edit_restrictions(document) + return document template_path = DOCX_TEMPLATE_DIR / template_name if not template_path.exists(): raise DRFValidationError({"detail": f"DOCX template nije pronađen: {template_name}."}) - return Document(str(template_path)) + document = Document(str(template_path)) + _remove_docx_edit_restrictions(document) + return document + + +def _remove_docx_edit_restrictions(document): + try: + settings_element = document.settings.element + except AttributeError: + return document + + protected_tags = ( + '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}documentProtection', + '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}writeProtection', + '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}readOnlyRecommended', + ) + for tag_name in protected_tags: + for element in list(settings_element.findall(tag_name)): + settings_element.remove(element) + return document def _set_docx_cell_text(table, row_index, col_index, value):