From ff36ea78bcb44e2a5c3fa2ae5c209572d00adee8 Mon Sep 17 00:00:00 2001 From: Juan Alberto Raja Date: Tue, 8 Jul 2025 12:26:22 +0200 Subject: [PATCH 1/6] [ADD] document_page_tag_print_control: restrict document printing based on tag configuration --- document_page_tag_print_control/README.rst | 108 +++++ document_page_tag_print_control/__init__.py | 3 + .../__manifest__.py | 20 + document_page_tag_print_control/i18n/ca_ES.po | 58 +++ document_page_tag_print_control/i18n/es.po | 58 +++ .../models/__init__.py | 5 + .../models/document_page.py | 20 + .../models/document_page_tag.py | 12 + .../models/report_document_page.py | 37 ++ .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 5 + .../readme/USAGE.md | 11 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 454 ++++++++++++++++++ .../tests/__init__.py | 3 + .../test_document_page_tag_print_control.py | 90 ++++ .../views/document_page_tag.xml | 53 ++ 17 files changed, 940 insertions(+) create mode 100644 document_page_tag_print_control/README.rst create mode 100644 document_page_tag_print_control/__init__.py create mode 100644 document_page_tag_print_control/__manifest__.py create mode 100644 document_page_tag_print_control/i18n/ca_ES.po create mode 100644 document_page_tag_print_control/i18n/es.po create mode 100644 document_page_tag_print_control/models/__init__.py create mode 100644 document_page_tag_print_control/models/document_page.py create mode 100644 document_page_tag_print_control/models/document_page_tag.py create mode 100644 document_page_tag_print_control/models/report_document_page.py create mode 100644 document_page_tag_print_control/readme/CONTRIBUTORS.md create mode 100644 document_page_tag_print_control/readme/DESCRIPTION.md create mode 100644 document_page_tag_print_control/readme/USAGE.md create mode 100644 document_page_tag_print_control/static/description/icon.png create mode 100644 document_page_tag_print_control/static/description/index.html create mode 100644 document_page_tag_print_control/tests/__init__.py create mode 100644 document_page_tag_print_control/tests/test_document_page_tag_print_control.py create mode 100644 document_page_tag_print_control/views/document_page_tag.xml diff --git a/document_page_tag_print_control/README.rst b/document_page_tag_print_control/README.rst new file mode 100644 index 00000000..56ea4ae2 --- /dev/null +++ b/document_page_tag_print_control/README.rst @@ -0,0 +1,108 @@ +=============================== +Document Page Tag Print Control +=============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c08c914a87dd77f1d5c07e7716f9f40c7341917cc62a95efe6c0035fce9a9eaf + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github + :target: https://github.com/OCA/knowledge/tree/16.0/document_page_tag_print_control + :alt: OCA/knowledge +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/knowledge-16-0/knowledge-16-0-document_page_tag_print_control + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/knowledge&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds print control functionality to document pages based on +tags. It allows users to control which document pages cannot be printed +by configuring tags with a "Not Printable" attribute. + +When a document page has one or more tags marked as not printable, +printing functionality will be disabled and a warning will be shown if +attempted. + +Users with the "Manager" role in the "Document Knowledge" section (under +Settings > Users > Access Rights > Other) are exempt from these +restrictions and can print any document page regardless of its tags. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To restrict the printing of document pages using tags: + +1. Go to Document Management > Configuration > Tags. +2. Create or edit existing tags and use the "Not Printable" checkbox to + prevent printing. +3. Check "Not Printable" for tags that should block printing. +4. Assign these tags to document pages. If any tag on a page is marked + as not printable, the entire page will be blocked from printing. +5. If you attempt to print such pages, the system will raise a warning + and prevent the action. +6. All tags allow printing by default for compatibility. + +Users with the **Manager** role in the "Document Knowledge" section +(Settings > Users > Access Rights > Other) are not affected by this +restriction. They can always print any document page. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Sygel + +Contributors +------------ + +- `Sygel `__ + + - Juan Alberto Raja + - Valentín Vinagre + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/knowledge `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/document_page_tag_print_control/__init__.py b/document_page_tag_print_control/__init__.py new file mode 100644 index 00000000..f13e006e --- /dev/null +++ b/document_page_tag_print_control/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2025 Juan Alberto Raja +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models diff --git a/document_page_tag_print_control/__manifest__.py b/document_page_tag_print_control/__manifest__.py new file mode 100644 index 00000000..ad7c65e5 --- /dev/null +++ b/document_page_tag_print_control/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2025 Juan Alberto Raja +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Document Page Tag Print Control", + "summary": "Restricts document page printing based on assigned tags", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "Sygel, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/knowledge", + "category": "Knowledge", + "depends": [ + "document_page_tag", + ], + "data": [ + "views/document_page_tag.xml", + ], + "installable": True, + "application": False, + "auto_install": False, +} diff --git a/document_page_tag_print_control/i18n/ca_ES.po b/document_page_tag_print_control/i18n/ca_ES.po new file mode 100644 index 00000000..2b5b3286 --- /dev/null +++ b/document_page_tag_print_control/i18n/ca_ES.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# * document_page_tag_print_control +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: \n" + +#. module: document_page_tag_print_control +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "None of the selected document pages can be printed due to their tags." +msgstr "Cap de les pàgines seleccionades es pot imprimir a causa de les seves etiquetes." + +#. module: document_page_tag_print_control +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "Some pages cannot be printed due to their tags:\n" +msgstr "Algunes pàgines no es poden imprimir a causa de les seves etiquetes:\n" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "Is Not Printable" +msgstr "No és imprimible" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable +msgid "Indicates if the document cannot be printed based on its tags" +msgstr "Indica si el document no es pot imprimir basant-se en les seves etiquetes" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "If checked, pages with this tag cannot be printed" +msgstr "Si està marcat, les pàgines amb aquesta etiqueta no es poden imprimir" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_form_inherit_print +msgid "Print" +msgstr "Imprimir" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Printable Tags" +msgstr "Etiquetes imprimibles" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Non-Printable Tags" +msgstr "Etiquetes no imprimibles" diff --git a/document_page_tag_print_control/i18n/es.po b/document_page_tag_print_control/i18n/es.po new file mode 100644 index 00000000..e08e15c2 --- /dev/null +++ b/document_page_tag_print_control/i18n/es.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# * document_page_tag_print_control +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: \n" + +#. module: document_page_tag_print_control +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "None of the selected document pages can be printed due to their tags." +msgstr "Ninguna de las páginas seleccionadas se puede imprimir debido a sus etiquetas." + +#. module: document_page_tag_print_control +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "Some pages cannot be printed due to their tags:\n" +msgstr "Algunas páginas no se pueden imprimir debido a sus etiquetas:\n" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "Is Not Printable" +msgstr "No es imprimible" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable +msgid "Indicates if the document cannot be printed based on its tags" +msgstr "Indica si el documento no puede ser impreso basándose en sus etiquetas" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "If checked, pages with this tag cannot be printed" +msgstr "Si está marcado, las páginas con esta etiqueta no se pueden imprimir" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_form_inherit_print +msgid "Print" +msgstr "Imprimir" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Printable Tags" +msgstr "Etiquetas imprimibles" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Non-Printable Tags" +msgstr "Etiquetas no imprimibles" diff --git a/document_page_tag_print_control/models/__init__.py b/document_page_tag_print_control/models/__init__.py new file mode 100644 index 00000000..9da26f3c --- /dev/null +++ b/document_page_tag_print_control/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2025 Juan Alberto Raja +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import document_page_tag +from . import document_page +from . import report_document_page diff --git a/document_page_tag_print_control/models/document_page.py b/document_page_tag_print_control/models/document_page.py new file mode 100644 index 00000000..23790926 --- /dev/null +++ b/document_page_tag_print_control/models/document_page.py @@ -0,0 +1,20 @@ +# Copyright 2025 Juan Alberto Raja +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class DocumentPage(models.Model): + _inherit = "document.page" + + is_not_printable = fields.Boolean( + compute="_compute_is_not_printable", + store=True, + help="Indicates if the document cannot be printed based on its tags", + ) + + @api.depends("tag_ids", "tag_ids.is_not_printable") + def _compute_is_not_printable(self): + for record in self: + record.is_not_printable = any( + tag.is_not_printable for tag in record.tag_ids + ) diff --git a/document_page_tag_print_control/models/document_page_tag.py b/document_page_tag_print_control/models/document_page_tag.py new file mode 100644 index 00000000..daa27c50 --- /dev/null +++ b/document_page_tag_print_control/models/document_page_tag.py @@ -0,0 +1,12 @@ +# Copyright 2025 Juan Alberto Raja +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class DocumentPageTag(models.Model): + _inherit = "document.page.tag" + + is_not_printable = fields.Boolean( + default=False, + help="If checked, pages with this tag cannot be printed", + ) diff --git a/document_page_tag_print_control/models/report_document_page.py b/document_page_tag_print_control/models/report_document_page.py new file mode 100644 index 00000000..204bd9af --- /dev/null +++ b/document_page_tag_print_control/models/report_document_page.py @@ -0,0 +1,37 @@ +# Copyright 2025 Juan Alberto Raja +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, api, models +from odoo.exceptions import UserError + + +class ReportDocumentPage(models.AbstractModel): + _name = "report.document_page.report_documentpage" + _description = "Document Page Report with Print Control" + + @api.model + def _get_report_values(self, docids, data=None): + docs = self.env["document.page"].browse(docids).exists() + printable_docs = docs + + if not self.env.user.has_group("document_page.group_document_manager"): + printable_docs = docs.filtered(lambda d: not d.is_not_printable) + + if not printable_docs: + raise UserError( + _("None of the selected pages can be printed due to their tags.") + ) + + if len(printable_docs) < len(docs): + non_printable = docs - printable_docs + raise UserError( + _("Some pages cannot be printed due to their tags:\n") + + "\n".join(f"- {doc.name}" for doc in non_printable) + ) + + report_values = { + "doc_ids": printable_docs.ids, + "doc_model": "document.page", + "docs": printable_docs, + } + + return report_values diff --git a/document_page_tag_print_control/readme/CONTRIBUTORS.md b/document_page_tag_print_control/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..0734b46f --- /dev/null +++ b/document_page_tag_print_control/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Sygel](https://www.sygel.es) + - Juan Alberto Raja + - Valentín Vinagre diff --git a/document_page_tag_print_control/readme/DESCRIPTION.md b/document_page_tag_print_control/readme/DESCRIPTION.md new file mode 100644 index 00000000..8954f836 --- /dev/null +++ b/document_page_tag_print_control/readme/DESCRIPTION.md @@ -0,0 +1,5 @@ +This module adds print control functionality to document pages based on tags. It allows users to control which document pages cannot be printed by configuring tags with a "Not Printable" attribute. + +When a document page has one or more tags marked as not printable, printing functionality will be disabled and a warning will be shown if attempted. + +Users with the "Manager" role in the "Document Knowledge" section (under Settings > Users > Access Rights > Other) are exempt from these restrictions and can print any document page regardless of its tags. diff --git a/document_page_tag_print_control/readme/USAGE.md b/document_page_tag_print_control/readme/USAGE.md new file mode 100644 index 00000000..da4c6854 --- /dev/null +++ b/document_page_tag_print_control/readme/USAGE.md @@ -0,0 +1,11 @@ +To restrict the printing of document pages using tags: + +1. Go to Document Management > Configuration > Tags. +2. Create or edit existing tags and use the "Not Printable" checkbox to prevent printing. +3. Check "Not Printable" for tags that should block printing. +4. Assign these tags to document pages. If any tag on a page is marked as not printable, the entire page will be blocked from printing. +5. If you attempt to print such pages, the system will raise a warning and prevent the action. +6. All tags allow printing by default for compatibility. + +Users with the **Manager** role in the "Document Knowledge" section (Settings > Users > Access Rights > Other) are not affected by this restriction. They can always print any document page. + diff --git a/document_page_tag_print_control/static/description/icon.png b/document_page_tag_print_control/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/document_page_tag_print_control/static/description/index.html b/document_page_tag_print_control/static/description/index.html new file mode 100644 index 00000000..11702390 --- /dev/null +++ b/document_page_tag_print_control/static/description/index.html @@ -0,0 +1,454 @@ + + + + + +Document Page Tag Print Control + + + +
+

Document Page Tag Print Control

+ + +

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

+

This module adds print control functionality to document pages based on +tags. It allows users to control which document pages cannot be printed +by configuring tags with a “Not Printable” attribute.

+

When a document page has one or more tags marked as not printable, +printing functionality will be disabled and a warning will be shown if +attempted.

+

Users with the “Manager” role in the “Document Knowledge” section (under +Settings > Users > Access Rights > Other) are exempt from these +restrictions and can print any document page regardless of its tags.

+

Table of contents

+ +
+

Usage

+

To restrict the printing of document pages using tags:

+
    +
  1. Go to Document Management > Configuration > Tags.
  2. +
  3. Create or edit existing tags and use the “Not Printable” checkbox to +prevent printing.
  4. +
  5. Check “Not Printable” for tags that should block printing.
  6. +
  7. Assign these tags to document pages. If any tag on a page is marked +as not printable, the entire page will be blocked from printing.
  8. +
  9. If you attempt to print such pages, the system will raise a warning +and prevent the action.
  10. +
  11. All tags allow printing by default for compatibility.
  12. +
+

Users with the Manager role in the “Document Knowledge” section +(Settings > Users > Access Rights > Other) are not affected by this +restriction. They can always print any document page.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Sygel
  • +
+
+
+

Contributors

+
    +
  • Sygel
      +
    • Juan Alberto Raja
    • +
    • Valentín Vinagre
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/knowledge project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/document_page_tag_print_control/tests/__init__.py b/document_page_tag_print_control/tests/__init__.py new file mode 100644 index 00000000..8cf16005 --- /dev/null +++ b/document_page_tag_print_control/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2025 Juan Alberto Raja +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import test_document_page_tag_print_control diff --git a/document_page_tag_print_control/tests/test_document_page_tag_print_control.py b/document_page_tag_print_control/tests/test_document_page_tag_print_control.py new file mode 100644 index 00000000..bf0c7819 --- /dev/null +++ b/document_page_tag_print_control/tests/test_document_page_tag_print_control.py @@ -0,0 +1,90 @@ +from odoo.exceptions import UserError +from odoo.tests import tagged +from odoo.tests.common import TransactionCase + + +@tagged("post_install", "-at_install") +class TestDocumentPrintControl(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.printable_tag = cls.env["document.page.tag"].create( + {"name": "Printable", "is_not_printable": False} + ) + cls.non_printable_tag = cls.env["document.page.tag"].create( + {"name": "Non-Printable", "is_not_printable": True} + ) + cls.doc_without_tags = cls.env["document.page"].create( + {"name": "Document Without Tags", "content": "Content"} + ) + cls.doc_printable = cls.env["document.page"].create( + { + "name": "Printable Document", + "content": "Content", + "tag_ids": [(4, cls.printable_tag.id)], + } + ) + cls.doc_non_printable = cls.env["document.page"].create( + { + "name": "Non-Printable Document", + "content": "Content", + "tag_ids": [(4, cls.non_printable_tag.id)], + } + ) + cls.doc_mixed_tags = cls.env["document.page"].create( + { + "name": "Mixed Tags Document", + "content": "Content", + "tag_ids": [(4, cls.printable_tag.id), (4, cls.non_printable_tag.id)], + } + ) + + def test_document_without_tags_is_printable(self): + """Document without tags is printable.""" + self.assertFalse(self.doc_without_tags.is_not_printable) + + def test_document_with_printable_tag(self): + """Document with printable tag is printable.""" + self.assertFalse(self.doc_printable.is_not_printable) + + def test_document_with_non_printable_tag(self): + """Document with non-printable tag is not printable.""" + self.assertTrue(self.doc_non_printable.is_not_printable) + + def test_document_with_mixed_tags(self): + """Document with mixed tags is not printable.""" + self.assertTrue(self.doc_mixed_tags.is_not_printable) + + def test_report_non_printable_raises_error(self): + """Report fails if all documents are non-printable.""" + with self.assertRaises(UserError) as ctx: + self.env["report.document_page.report_documentpage"]._get_report_values( + [self.doc_non_printable.id] + ) + self.assertIn("None of the selected pages can be printed", str(ctx.exception)) + + def test_report_mixed_docs_raises_error(self): + """Report fails if some documents are non-printable.""" + with self.assertRaises(UserError) as ctx: + self.env["report.document_page.report_documentpage"]._get_report_values( + [self.doc_printable.id, self.doc_non_printable.id] + ) + self.assertIn("Some pages cannot be printed", str(ctx.exception)) + self.assertIn(self.doc_non_printable.name, str(ctx.exception)) + + def test_report_printable_docs(self): + """Report returns correct values for printable documents.""" + values = self.env[ + "report.document_page.report_documentpage" + ]._get_report_values([self.doc_printable.id]) + self.assertEqual(values["doc_ids"], [self.doc_printable.id]) + self.assertEqual(values["doc_model"], "document.page") + self.assertEqual(values["docs"].ids, [self.doc_printable.id]) + + def test_manager_bypasses_print_restrictions(self): + """Manager can print any document.""" + self.env.user.groups_id |= self.env.ref("document_page.group_document_manager") + values = self.env[ + "report.document_page.report_documentpage" + ]._get_report_values([self.doc_non_printable.id]) + self.assertEqual(values["doc_ids"], [self.doc_non_printable.id]) diff --git a/document_page_tag_print_control/views/document_page_tag.xml b/document_page_tag_print_control/views/document_page_tag.xml new file mode 100644 index 00000000..1d3bafcf --- /dev/null +++ b/document_page_tag_print_control/views/document_page_tag.xml @@ -0,0 +1,53 @@ + + + + + document.page.tag.form.extended + document.page.tag + + + + + + + + + + document.page.tag.tree.extended + document.page.tag + + + + + + + + + + document.page.tag.search.extended + document.page.tag + + + + + + + + + + + + + From 6700c195795f70f29970c413ad9481ecb57f73f5 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Mon, 21 Jul 2025 11:32:01 +0000 Subject: [PATCH 2/6] [UPD] Update document_page_tag_print_control.pot --- document_page_tag_print_control/i18n/ca_ES.po | 65 ++++++++++------- .../i18n/document_page_tag_print_control.pot | 69 +++++++++++++++++++ document_page_tag_print_control/i18n/es.po | 64 ++++++++++------- 3 files changed, 152 insertions(+), 46 deletions(-) create mode 100644 document_page_tag_print_control/i18n/document_page_tag_print_control.pot diff --git a/document_page_tag_print_control/i18n/ca_ES.po b/document_page_tag_print_control/i18n/ca_ES.po index 2b5b3286..c2e38328 100644 --- a/document_page_tag_print_control/i18n/ca_ES.po +++ b/document_page_tag_print_control/i18n/ca_ES.po @@ -9,33 +9,26 @@ msgstr "" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" +"Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: ca\n" "Plural-Forms: \n" #. module: document_page_tag_print_control -#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 -#, python-format -msgid "None of the selected document pages can be printed due to their tags." -msgstr "Cap de les pàgines seleccionades es pot imprimir a causa de les seves etiquetes." +#: model:ir.model,name:document_page_tag_print_control.model_document_page_tag +msgid "A keyword for document pages" +msgstr "" #. module: document_page_tag_print_control -#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 -#, python-format -msgid "Some pages cannot be printed due to their tags:\n" -msgstr "Algunes pàgines no es poden imprimir a causa de les seves etiquetes:\n" +#: model:ir.model,name:document_page_tag_print_control.model_document_page +msgid "Document Page" +msgstr "" #. module: document_page_tag_print_control -#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable -msgid "Is Not Printable" -msgstr "No és imprimible" - -#. module: document_page_tag_print_control -#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable -msgid "Indicates if the document cannot be printed based on its tags" -msgstr "Indica si el document no es pot imprimir basant-se en les seves etiquetes" +#: model:ir.model,name:document_page_tag_print_control.model_report_document_page_report_documentpage +msgid "Document Page Report with Print Control" +msgstr "" #. module: document_page_tag_print_control #: model:ir.model.fields,help:document_page_tag_print_control.field_document_page_tag__is_not_printable @@ -43,9 +36,30 @@ msgid "If checked, pages with this tag cannot be printed" msgstr "Si està marcat, les pàgines amb aquesta etiqueta no es poden imprimir" #. module: document_page_tag_print_control -#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_form_inherit_print -msgid "Print" -msgstr "Imprimir" +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable +msgid "Indicates if the document cannot be printed based on its tags" +msgstr "" +"Indica si el document no es pot imprimir basant-se en les seves etiquetes" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page__is_not_printable +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "Is Not Printable" +msgstr "No és imprimible" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Non-Printable Tags" +msgstr "Etiquetes no imprimibles" + +#. module: document_page_tag_print_control +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, fuzzy, python-format +msgid "None of the selected pages can be printed due to their tags." +msgstr "" +"Cap de les pàgines seleccionades es pot imprimir a causa de les seves " +"etiquetes." #. module: document_page_tag_print_control #: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended @@ -53,6 +67,11 @@ msgid "Printable Tags" msgstr "Etiquetes imprimibles" #. module: document_page_tag_print_control -#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended -msgid "Non-Printable Tags" -msgstr "Etiquetes no imprimibles" +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "Some pages cannot be printed due to their tags:\n" +msgstr "Algunes pàgines no es poden imprimir a causa de les seves etiquetes:\n" + +#~ msgid "Print" +#~ msgstr "Imprimir" diff --git a/document_page_tag_print_control/i18n/document_page_tag_print_control.pot b/document_page_tag_print_control/i18n/document_page_tag_print_control.pot new file mode 100644 index 00000000..b89258c0 --- /dev/null +++ b/document_page_tag_print_control/i18n/document_page_tag_print_control.pot @@ -0,0 +1,69 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_tag_print_control +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: document_page_tag_print_control +#: model:ir.model,name:document_page_tag_print_control.model_document_page_tag +msgid "A keyword for document pages" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model,name:document_page_tag_print_control.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model,name:document_page_tag_print_control.model_report_document_page_report_documentpage +msgid "Document Page Report with Print Control" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "If checked, pages with this tag cannot be printed" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable +msgid "Indicates if the document cannot be printed based on its tags" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page__is_not_printable +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "Is Not Printable" +msgstr "" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Non-Printable Tags" +msgstr "" + +#. module: document_page_tag_print_control +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "None of the selected pages can be printed due to their tags." +msgstr "" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Printable Tags" +msgstr "" + +#. module: document_page_tag_print_control +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "Some pages cannot be printed due to their tags:\n" +msgstr "" diff --git a/document_page_tag_print_control/i18n/es.po b/document_page_tag_print_control/i18n/es.po index e08e15c2..74c23d0e 100644 --- a/document_page_tag_print_control/i18n/es.po +++ b/document_page_tag_print_control/i18n/es.po @@ -9,33 +9,26 @@ msgstr "" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" -"Language: es\n" "Plural-Forms: \n" #. module: document_page_tag_print_control -#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 -#, python-format -msgid "None of the selected document pages can be printed due to their tags." -msgstr "Ninguna de las páginas seleccionadas se puede imprimir debido a sus etiquetas." +#: model:ir.model,name:document_page_tag_print_control.model_document_page_tag +msgid "A keyword for document pages" +msgstr "" #. module: document_page_tag_print_control -#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 -#, python-format -msgid "Some pages cannot be printed due to their tags:\n" -msgstr "Algunas páginas no se pueden imprimir debido a sus etiquetas:\n" +#: model:ir.model,name:document_page_tag_print_control.model_document_page +msgid "Document Page" +msgstr "" #. module: document_page_tag_print_control -#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable -msgid "Is Not Printable" -msgstr "No es imprimible" - -#. module: document_page_tag_print_control -#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable -msgid "Indicates if the document cannot be printed based on its tags" -msgstr "Indica si el documento no puede ser impreso basándose en sus etiquetas" +#: model:ir.model,name:document_page_tag_print_control.model_report_document_page_report_documentpage +msgid "Document Page Report with Print Control" +msgstr "" #. module: document_page_tag_print_control #: model:ir.model.fields,help:document_page_tag_print_control.field_document_page_tag__is_not_printable @@ -43,9 +36,29 @@ msgid "If checked, pages with this tag cannot be printed" msgstr "Si está marcado, las páginas con esta etiqueta no se pueden imprimir" #. module: document_page_tag_print_control -#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_form_inherit_print -msgid "Print" -msgstr "Imprimir" +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable +msgid "Indicates if the document cannot be printed based on its tags" +msgstr "Indica si el documento no puede ser impreso basándose en sus etiquetas" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page__is_not_printable +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "Is Not Printable" +msgstr "No es imprimible" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Non-Printable Tags" +msgstr "Etiquetas no imprimibles" + +#. module: document_page_tag_print_control +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, fuzzy, python-format +msgid "None of the selected pages can be printed due to their tags." +msgstr "" +"Ninguna de las páginas seleccionadas se puede imprimir debido a sus " +"etiquetas." #. module: document_page_tag_print_control #: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended @@ -53,6 +66,11 @@ msgid "Printable Tags" msgstr "Etiquetas imprimibles" #. module: document_page_tag_print_control -#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended -msgid "Non-Printable Tags" -msgstr "Etiquetas no imprimibles" +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "Some pages cannot be printed due to their tags:\n" +msgstr "Algunas páginas no se pueden imprimir debido a sus etiquetas:\n" + +#~ msgid "Print" +#~ msgstr "Imprimir" From 4cc6bb4382f79218303ac53baa122b4799468b3e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 21 Jul 2025 11:34:11 +0000 Subject: [PATCH 3/6] [BOT] post-merge updates --- document_page_tag_print_control/README.rst | 8 ++++-- .../static/description/index.html | 28 +++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/document_page_tag_print_control/README.rst b/document_page_tag_print_control/README.rst index 56ea4ae2..bb7a19f0 100644 --- a/document_page_tag_print_control/README.rst +++ b/document_page_tag_print_control/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + =============================== Document Page Tag Print Control =============================== @@ -7,13 +11,13 @@ Document Page Tag Print Control !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c08c914a87dd77f1d5c07e7716f9f40c7341917cc62a95efe6c0035fce9a9eaf + !! source digest: sha256:a0f09cf4d97cd2f79b48c2e81cea58e31f8e6a0f4616dcce0ff0d995a5c0da4c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github diff --git a/document_page_tag_print_control/static/description/index.html b/document_page_tag_print_control/static/description/index.html index 11702390..6a8183c6 100644 --- a/document_page_tag_print_control/static/description/index.html +++ b/document_page_tag_print_control/static/description/index.html @@ -3,7 +3,7 @@ -Document Page Tag Print Control +README.rst -
-

Document Page Tag Print Control

+
+ + +Odoo Community Association + +
+

Document Page Tag Print Control

-

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

This module adds print control functionality to document pages based on tags. It allows users to control which document pages cannot be printed by configuring tags with a “Not Printable” attribute.

@@ -393,7 +398,7 @@ restrictions and can print any document page regardless of its tags.

-

Usage

+

Usage

To restrict the printing of document pages using tags:

  1. Go to Document Management > Configuration > Tags.
  2. @@ -411,7 +416,7 @@ and prevent the action. restriction. They can always print any document page.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -419,15 +424,15 @@ If you spotted it first, help us to smash it by providing a detailed and welcome

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Sygel
-

Contributors

+

Contributors

  • Sygel
    • Juan Alberto Raja
    • @@ -437,7 +442,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
+
From ce84e9fda4d643a9b50c9f696239974484fbca90 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 22 Jul 2025 06:49:17 +0000 Subject: [PATCH 4/6] Added translation using Weblate (Italian) --- document_page_tag_print_control/i18n/it.po | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 document_page_tag_print_control/i18n/it.po diff --git a/document_page_tag_print_control/i18n/it.po b/document_page_tag_print_control/i18n/it.po new file mode 100644 index 00000000..4328a7f0 --- /dev/null +++ b/document_page_tag_print_control/i18n/it.po @@ -0,0 +1,70 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_tag_print_control +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: document_page_tag_print_control +#: model:ir.model,name:document_page_tag_print_control.model_document_page_tag +msgid "A keyword for document pages" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model,name:document_page_tag_print_control.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model,name:document_page_tag_print_control.model_report_document_page_report_documentpage +msgid "Document Page Report with Print Control" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "If checked, pages with this tag cannot be printed" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,help:document_page_tag_print_control.field_document_page__is_not_printable +msgid "Indicates if the document cannot be printed based on its tags" +msgstr "" + +#. module: document_page_tag_print_control +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page__is_not_printable +#: model:ir.model.fields,field_description:document_page_tag_print_control.field_document_page_tag__is_not_printable +msgid "Is Not Printable" +msgstr "" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Non-Printable Tags" +msgstr "" + +#. module: document_page_tag_print_control +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "None of the selected pages can be printed due to their tags." +msgstr "" + +#. module: document_page_tag_print_control +#: model_terms:ir.ui.view,arch_db:document_page_tag_print_control.view_document_page_tag_search_extended +msgid "Printable Tags" +msgstr "" + +#. module: document_page_tag_print_control +#. odoo-python +#: code:addons/document_page_tag_print_control/models/report_document_page.py:0 +#, python-format +msgid "Some pages cannot be printed due to their tags:\n" +msgstr "" From 7c4b6bf9333b48b3a6e75f24b8f93fc548bdd6e1 Mon Sep 17 00:00:00 2001 From: Juan Alberto Raja Date: Mon, 28 Jul 2025 03:06:47 +0200 Subject: [PATCH 5/6] [IMP] document_page_tag_print_control: pre-commit auto fixes --- document_page_tag_print_control/README.rst | 16 ++++------ .../pyproject.toml | 3 ++ .../static/description/index.html | 30 ++++++++----------- 3 files changed, 21 insertions(+), 28 deletions(-) create mode 100644 document_page_tag_print_control/pyproject.toml diff --git a/document_page_tag_print_control/README.rst b/document_page_tag_print_control/README.rst index bb7a19f0..64a2c0a3 100644 --- a/document_page_tag_print_control/README.rst +++ b/document_page_tag_print_control/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - =============================== Document Page Tag Print Control =============================== @@ -17,17 +13,17 @@ Document Page Tag Print Control .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github - :target: https://github.com/OCA/knowledge/tree/16.0/document_page_tag_print_control + :target: https://github.com/OCA/knowledge/tree/17.0/document_page_tag_print_control :alt: OCA/knowledge .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/knowledge-16-0/knowledge-16-0-document_page_tag_print_control + :target: https://translation.odoo-community.org/projects/knowledge-17-0/knowledge-17-0-document_page_tag_print_control :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/knowledge&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/knowledge&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -74,7 +70,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -107,6 +103,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/knowledge `_ project on GitHub. +This module is part of the `OCA/knowledge `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/document_page_tag_print_control/pyproject.toml b/document_page_tag_print_control/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/document_page_tag_print_control/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/document_page_tag_print_control/static/description/index.html b/document_page_tag_print_control/static/description/index.html index 6a8183c6..86ea8d32 100644 --- a/document_page_tag_print_control/static/description/index.html +++ b/document_page_tag_print_control/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Document Page Tag Print Control -
+
+

Document Page Tag Print Control

- -
-Odoo Community Association - -
-

Document Page Tag Print Control

-

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

This module adds print control functionality to document pages based on tags. It allows users to control which document pages cannot be printed by configuring tags with a “Not Printable” attribute.

@@ -398,7 +393,7 @@ restrictions and can print any document page regardless of its tags.

-

Usage

+

Usage

To restrict the printing of document pages using tags:

  1. Go to Document Management > Configuration > Tags.
  2. @@ -416,23 +411,23 @@ and prevent the action. restriction. They can always print any document page.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Sygel
-

Contributors

+

Contributors

  • Sygel
    • Juan Alberto Raja
    • @@ -442,7 +437,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
-
From 555c2c5ad1b9954579be02d2563876195bde71f5 Mon Sep 17 00:00:00 2001 From: Juan Alberto Raja Date: Mon, 28 Jul 2025 03:07:00 +0200 Subject: [PATCH 6/6] [MIG] document_page_tag_print_control: Migration to 17.0 --- document_page_tag_print_control/__manifest__.py | 2 +- .../tests/test_document_page_tag_print_control.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/document_page_tag_print_control/__manifest__.py b/document_page_tag_print_control/__manifest__.py index ad7c65e5..ddd72de6 100644 --- a/document_page_tag_print_control/__manifest__.py +++ b/document_page_tag_print_control/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Document Page Tag Print Control", "summary": "Restricts document page printing based on assigned tags", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "license": "AGPL-3", "author": "Sygel, Odoo Community Association (OCA)", "website": "https://github.com/OCA/knowledge", diff --git a/document_page_tag_print_control/tests/test_document_page_tag_print_control.py b/document_page_tag_print_control/tests/test_document_page_tag_print_control.py index bf0c7819..5678da3d 100644 --- a/document_page_tag_print_control/tests/test_document_page_tag_print_control.py +++ b/document_page_tag_print_control/tests/test_document_page_tag_print_control.py @@ -39,6 +39,14 @@ class TestDocumentPrintControl(TransactionCase): } ) + for doc in [ + cls.doc_without_tags, + cls.doc_printable, + cls.doc_non_printable, + cls.doc_mixed_tags, + ]: + doc._compute_is_not_printable() + def test_document_without_tags_is_printable(self): """Document without tags is printable.""" self.assertFalse(self.doc_without_tags.is_not_printable) @@ -57,6 +65,9 @@ class TestDocumentPrintControl(TransactionCase): def test_report_non_printable_raises_error(self): """Report fails if all documents are non-printable.""" + self.env.user.groups_id -= self.env.ref("document_page.group_document_manager") + self.doc_non_printable._compute_is_not_printable() + with self.assertRaises(UserError) as ctx: self.env["report.document_page.report_documentpage"]._get_report_values( [self.doc_non_printable.id] @@ -65,6 +76,10 @@ class TestDocumentPrintControl(TransactionCase): def test_report_mixed_docs_raises_error(self): """Report fails if some documents are non-printable.""" + self.env.user.groups_id -= self.env.ref("document_page.group_document_manager") + self.doc_printable._compute_is_not_printable() + self.doc_non_printable._compute_is_not_printable() + with self.assertRaises(UserError) as ctx: self.env["report.document_page.report_documentpage"]._get_report_values( [self.doc_printable.id, self.doc_non_printable.id]