diff --git a/document_page_reference_search/README.rst b/document_page_reference_search/README.rst new file mode 100644 index 00000000..31b39530 --- /dev/null +++ b/document_page_reference_search/README.rst @@ -0,0 +1,87 @@ +============================== +Document Page Reference Search +============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/11.0/document_page_reference_search + :alt: OCA/knowledge +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/knowledge-11-0/knowledge-11-0-document_page_reference_search + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/118/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows you to reference a record in document pages. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To reference records in pages you must set rules. Document rules let you +define which models can be referenced and which field will be used as identifier. +For example, we could create a rule named 'RULE1' that allows you to reference +res.partner records based on its 'ref' field. + +When editing a document page add elements like ${XYZ} where X is the rule's identifier, +Y is a separator and Z is the value of the record's field we will search. +Now, when viewing the document, it will link directly to the record. +Also, the name will be parsed as the display name. + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Creu Blanca + +Contributors +~~~~~~~~~~~~ + +* Enric Tobella +* Jaime Arroyo + +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_reference_search/__init__.py b/document_page_reference_search/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/document_page_reference_search/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/document_page_reference_search/__manifest__.py b/document_page_reference_search/__manifest__.py new file mode 100644 index 00000000..416fd4cd --- /dev/null +++ b/document_page_reference_search/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Document Page Reference Search', + 'summary': """ + Search on other modules from document page as references""", + 'version': '11.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'Creu Blanca,Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/knowledge', + 'depends': [ + 'document_page_reference', + ], + 'data': [ + 'data/parameters.xml', + 'security/ir.model.access.csv', + 'views/document_page_reference_rule.xml', + ], +} diff --git a/document_page_reference_search/data/parameters.xml b/document_page_reference_search/data/parameters.xml new file mode 100644 index 00000000..c7dcd0e4 --- /dev/null +++ b/document_page_reference_search/data/parameters.xml @@ -0,0 +1,10 @@ + + + + + document.reference.separator + º + + + diff --git a/document_page_reference_search/models/__init__.py b/document_page_reference_search/models/__init__.py new file mode 100644 index 00000000..ab714d46 --- /dev/null +++ b/document_page_reference_search/models/__init__.py @@ -0,0 +1,2 @@ +from . import document_page +from . import document_page_reference_rule diff --git a/document_page_reference_search/models/document_page.py b/document_page_reference_search/models/document_page.py new file mode 100644 index 00000000..8d6573d5 --- /dev/null +++ b/document_page_reference_search/models/document_page.py @@ -0,0 +1,42 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import re +from ast import literal_eval +from odoo import api, models, _ +from odoo.exceptions import ValidationError + + +class DocumentPage(models.Model): + _inherit = 'document.page' + + @api.constrains('reference') + def _check_reference(self): + super(DocumentPage, self)._check_reference() + separator = self.env['ir.config_parameter'].get_param( + 'document.reference.separator' + ) + for record in self: + if separator and re.match( + '^.*%s.*$' % separator, record.reference + ): + raise ValidationError(_( + 'Reference cannot include the separator')) + + def _get_document(self, code): + separator = self.env['ir.config_parameter'].get_param( + 'document.reference.separator' + ) + if separator and re.match('^.*%s.*$' % separator, code): + data = code.split(separator) + rule = self.env['document.page.reference.rule'].search([ + ('name', '=', data[0]) + ]) + if not rule: + return False + element = self.env[rule.model_id.model].search([ + (rule.field_id.name, '=', data[1]) + ] + literal_eval(rule.extra_domain or '[]'), limit=1) + if element: + return element + return False + return super()._get_document(code) diff --git a/document_page_reference_search/models/document_page_reference_rule.py b/document_page_reference_search/models/document_page_reference_rule.py new file mode 100644 index 00000000..05c1c228 --- /dev/null +++ b/document_page_reference_search/models/document_page_reference_rule.py @@ -0,0 +1,25 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class DocumentPageReferenceRule(models.Model): + + _name = 'document.page.reference.rule' + _description = 'Document Page Reference Rule' + + name = fields.Char(required=True) + model_id = fields.Many2one('ir.model') + model_name = fields.Char(readonly=True, related='model_id.model') + field_id = fields.Many2one('ir.model.fields') + extra_domain = fields.Char(default='[]') + active = fields.Boolean(default=True) + + _sql_constraints = [ + ('name_uniq', 'unique (name)', "This name already exists !"), + ] + + @api.onchange('model_id') + def onchange_model(self): + self.field_id = False diff --git a/document_page_reference_search/readme/CONTRIBUTORS.rst b/document_page_reference_search/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..94e7b0a4 --- /dev/null +++ b/document_page_reference_search/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Enric Tobella +* Jaime Arroyo diff --git a/document_page_reference_search/readme/DESCRIPTION.rst b/document_page_reference_search/readme/DESCRIPTION.rst new file mode 100644 index 00000000..2481bee5 --- /dev/null +++ b/document_page_reference_search/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows you to reference a record in document pages. diff --git a/document_page_reference_search/readme/USAGE.rst b/document_page_reference_search/readme/USAGE.rst new file mode 100644 index 00000000..fe241527 --- /dev/null +++ b/document_page_reference_search/readme/USAGE.rst @@ -0,0 +1,9 @@ +To reference records in pages you must set rules. Document rules let you +define which models can be referenced and which field will be used as identifier. +For example, we could create a rule named 'RULE1' that allows you to reference +res.partner records based on its 'ref' field. + +When editing a document page add elements like ${XYZ} where X is the rule's identifier, +Y is a separator and Z is the value of the record's field we will search. +Now, when viewing the document, it will link directly to the record. +Also, the name will be parsed as the display name. diff --git a/document_page_reference_search/security/ir.model.access.csv b/document_page_reference_search/security/ir.model.access.csv new file mode 100644 index 00000000..da2a06bd --- /dev/null +++ b/document_page_reference_search/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +document_page_rule_user,document.page.rule user,model_document_page_reference_rule,knowledge.group_document_user,1,0,0,0 +document_page_rule_manager,document.page.rule manager user,model_document_page_reference_rule,document_page.group_document_manager,1,1,1,0 diff --git a/document_page_reference_search/static/description/icon.png b/document_page_reference_search/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/document_page_reference_search/static/description/icon.png differ diff --git a/document_page_reference_search/static/description/index.html b/document_page_reference_search/static/description/index.html new file mode 100644 index 00000000..45cc0192 --- /dev/null +++ b/document_page_reference_search/static/description/index.html @@ -0,0 +1,432 @@ + + + + + + +Document Page Reference Search + + + + + + diff --git a/document_page_reference_search/tests/__init__.py b/document_page_reference_search/tests/__init__.py new file mode 100644 index 00000000..a1417b9f --- /dev/null +++ b/document_page_reference_search/tests/__init__.py @@ -0,0 +1 @@ +from . import test_document_page_reference_search diff --git a/document_page_reference_search/tests/test_document_page_reference_search.py b/document_page_reference_search/tests/test_document_page_reference_search.py new file mode 100644 index 00000000..5491b7e5 --- /dev/null +++ b/document_page_reference_search/tests/test_document_page_reference_search.py @@ -0,0 +1,53 @@ +# Copyright 2019 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase +from odoo.exceptions import ValidationError + + +class TestDocumentPageReferenceSearch(TransactionCase): + + def setUp(self): + super().setUp() + self.partner_id = self.env['res.partner'].create({ + 'name': 'Contact', + 'ref': 'REF1' + }) + res_partner = self.env['ir.model'].search( + [('model', '=', 'res.partner')] + ) + ref_field = self.env['ir.model.fields'].search( + [('model_id', '=', res_partner.id), ('name', '=', 'ref')] + ) + self.rule = self.env['document.page.reference.rule'].create({ + 'name': 'RULE', + 'model_id': res_partner.id, + 'field_id': ref_field.id + }) + self.page_1 = self.env['document.page'].create({ + 'name': 'Page 1' + }) + + def test_document_page_reference_search(self): + separator = self.env['ir.config_parameter'].get_param( + 'document.reference.separator' + ) + code_1 = 'R%sREF1' % separator + result = self.env['document.page']._get_document(code_1) + self.assertFalse(result) + + code_2 = 'RULE%sREF2' + result = self.env['document.page']._get_document(code_2) + self.assertFalse(result) + + code_3 = 'RULE%sREF1' % separator + result = self.env['document.page']._get_document(code_3) + self.assertEqual(result, self.partner_id) + + with self.assertRaises(ValidationError): + test_ref = 'Test%sref' % separator + self.page_1.write({ + 'reference': test_ref + }) + self.rule.onchange_model() + self.assertFalse(self.rule.field_id) diff --git a/document_page_reference_search/views/document_page_reference_rule.xml b/document_page_reference_search/views/document_page_reference_rule.xml new file mode 100644 index 00000000..781b88c6 --- /dev/null +++ b/document_page_reference_search/views/document_page_reference_rule.xml @@ -0,0 +1,64 @@ + + + + + + + document.page.reference.rule.form (in document_page_reference_search) + document.page.reference.rule + +
+
+ + + + + + + + + + + + + + + document.page.reference.rule.search (in document_page_reference_search) + document.page.reference.rule + + + + + + + + + + document.page.reference.rule.tree (in document_page_reference_search) + document.page.reference.rule + + + + + + + + + + + Document Page Reference Rule + document.page.reference.rule + tree,form + [] + {} + + + + Document Page Reference Rule + + + + + +