From 86911287c3a1fce43f013f58dd7dd0ab397fed9f Mon Sep 17 00:00:00 2001 From: Sandip Mangukiya Date: Wed, 29 May 2019 10:54:12 -0700 Subject: [PATCH] [IMP]16335: 12.0 improve dynamic content generation [UPD] README.rst [UPD] Update agreement_legal.pot --- agreement_legal/README.rst | 6 + agreement_legal/__manifest__.py | 2 + agreement_legal/i18n/agreement_legal.pot | 285 +++++++++++++----- agreement_legal/models/agreement.py | 50 +-- agreement_legal/models/agreement_appendix.py | 52 +--- agreement_legal/models/agreement_clause.py | 43 +-- agreement_legal/models/agreement_recital.py | 72 ++--- agreement_legal/models/agreement_section.py | 44 +-- agreement_legal/readme/USAGE.rst | 6 + agreement_legal/report/agreement.xml | 2 +- agreement_legal/static/description/index.html | 5 + .../static/src/js/domain_widget_ext.js | 77 +++++ .../static/src/xml/domain_widget_view.xml | 179 +++++++++++ agreement_legal/views/agreement.xml | 25 +- agreement_legal/views/agreement_appendix.xml | 17 +- agreement_legal/views/agreement_clause.xml | 17 +- agreement_legal/views/agreement_recital.xml | 23 +- agreement_legal/views/agreement_section.xml | 17 +- 18 files changed, 583 insertions(+), 339 deletions(-) create mode 100644 agreement_legal/static/src/js/domain_widget_ext.js create mode 100644 agreement_legal/static/src/xml/domain_widget_view.xml diff --git a/agreement_legal/README.rst b/agreement_legal/README.rst index 430176782..07d197031 100644 --- a/agreement_legal/README.rst +++ b/agreement_legal/README.rst @@ -61,6 +61,12 @@ To use this module: * Follow the process to get the required approval * Send the invitation to the customer to review and sign the agreement +* Define Field using widget domain but having partial_use option true: +* For Ex: +* + Known issues / Roadmap ====================== diff --git a/agreement_legal/__manifest__.py b/agreement_legal/__manifest__.py index 253180cbb..f561b0921 100644 --- a/agreement_legal/__manifest__.py +++ b/agreement_legal/__manifest__.py @@ -37,6 +37,8 @@ ], "demo": [ "demo/demo.xml" + 'qweb': [ + "static/src/xml/domain_widget_view.xml", ], "post_init_hook": "post_init_agreement_legal", "application": True, diff --git a/agreement_legal/i18n/agreement_legal.pot b/agreement_legal/i18n/agreement_legal.pot index ba5df9f01..f94f02903 100644 --- a/agreement_legal/i18n/agreement_legal.pot +++ b/agreement_legal/i18n/agreement_legal.pot @@ -13,6 +13,13 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:72 +#, python-format +msgid "# Code editor" +msgstr "" + #. module: agreement_legal #: selection:agreement,state:0 #: model:ir.model.fields,field_description:agreement_legal.field_agreement__active @@ -23,6 +30,42 @@ msgstr "" msgid "Active" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:86 +#, python-format +msgid "Add branch" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:38 +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:56 +#, python-format +msgid "Add filter" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:123 +#, python-format +msgid "Add new value" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:85 +#, python-format +msgid "Add node" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:124 +#, python-format +msgid "Add tag" +msgstr "" + #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_form_view msgid "Administration" @@ -258,6 +301,13 @@ msgstr "" msgid "Clauses" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:169 +#, python-format +msgid "Close" +msgstr "" + #. module: agreement_legal #: model:ir.model.fields,field_description:agreement_legal.field_agreement__color msgid "Color" @@ -431,6 +481,13 @@ msgstr "" msgid "Default Value" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:84 +#, python-format +msgid "Delete node" +msgstr "" + #. module: agreement_legal #: model:ir.model.fields,help:agreement_legal.field_agreement__renewal_type_id msgid "Describes what happens after the contract expires." @@ -473,6 +530,13 @@ msgstr "" msgid "Display Name" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:21 +#, python-format +msgid "Domain" +msgstr "" + #. module: agreement_legal #: selection:agreement,state:0 msgid "Draft" @@ -506,6 +570,13 @@ msgstr "" msgid "Edit" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:28 +#, python-format +msgid "Edit Domain" +msgstr "" + #. module: agreement_legal #: model:ir.model.fields,field_description:agreement_legal.field_agreement__company_contact_email msgid "Email" @@ -531,12 +602,12 @@ msgid "Exp. Notice (Days)" msgstr "" #. module: agreement_legal -#: model:ir.model.fields,field_description:agreement_legal.field_agreement__field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_appendix__field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_clause__field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_recital__field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_section__field_id -msgid "Field" +#: model:ir.model.fields,field_description:agreement_legal.field_agreement__field_domain +#: model:ir.model.fields,field_description:agreement_legal.field_agreement_appendix__field_domain +#: model:ir.model.fields,field_description:agreement_legal.field_agreement_clause__field_domain +#: model:ir.model.fields,field_description:agreement_legal.field_agreement_recital__field_domain +#: model:ir.model.fields,field_description:agreement_legal.field_agreement_section__field_domain +msgid "Field Expression" msgstr "" #. module: agreement_legal @@ -630,6 +701,20 @@ msgstr "" msgid "Increase types describe any increases that may happen during the contract." msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:26 +#, python-format +msgid "Invalid domain" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:162 +#, python-format +msgid "Invalid field chain" +msgstr "" + #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.res_config_settings_view_form msgid "Inventory" @@ -807,6 +892,27 @@ msgstr "" msgid "Master Data" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:55 +#, python-format +msgid "Match" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:62 +#, python-format +msgid "Match records with" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:60 +#, python-format +msgid "Match records with the following rule:" +msgstr "" + #. module: agreement_legal #: model:ir.model.fields,field_description:agreement_legal.field_agreement_appendix__name #: model:ir.model.fields,field_description:agreement_legal.field_agreement_clause__name @@ -824,8 +930,8 @@ msgstr "" #. module: agreement_legal #: code:addons/agreement_legal/models/agreement.py:84 -#: code:addons/agreement_legal/models/agreement.py:384 -#: code:addons/agreement_legal/models/agreement.py:387 +#: code:addons/agreement_legal/models/agreement.py:364 +#: code:addons/agreement_legal/models/agreement.py:367 #, python-format msgid "New" msgstr "" @@ -963,11 +1069,25 @@ msgstr "" msgid "Placeholder Expression" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:42 +#, python-format +msgid "Please navigate below and select field:" +msgstr "" + #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_form_view msgid "Preview" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:167 +#, python-format +msgid "Previous" +msgstr "" + #. module: agreement_legal #: model:ir.model.fields,field_description:agreement_legal.field_agreement__previous_version_agreements_ids msgid "Previous Versions" @@ -1054,6 +1174,13 @@ msgstr "" msgid "Reference" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:119 +#, python-format +msgid "Remove tag" +msgstr "" + #. module: agreement_legal #: model:ir.model.fields,field_description:agreement_legal.field_agreement__renewal_type_id msgid "Renewal Type" @@ -1114,6 +1241,20 @@ msgstr "" msgid "Revisions" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:37 +#, python-format +msgid "SMatch" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:44 +#, python-format +msgid "SSMatch records with" +msgstr "" + #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.res_config_settings_view_form msgid "Sale Subscriptions" @@ -1144,29 +1285,15 @@ msgid "Sections" msgstr "" #. module: agreement_legal -#: model:ir.model.fields,help:agreement_legal.field_agreement__field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_appendix__field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_clause__field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_recital__field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_section__field_id -msgid "Select target field from the related document model. If it is a\n" -" relationship field you will be able to select a target field at the\n" -" destination of the relationship." +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:30 +#, python-format +msgid "Select a model to add a filter." msgstr "" #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_form_view -msgid "Select the agreement field" -msgstr "" - -#. module: agreement_legal -#: model_terms:ir.ui.view,arch_db:agreement_legal.agreement_appendix_form -msgid "Select the appendix field" -msgstr "" - -#. module: agreement_legal -#: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_clause_form_view -msgid "Select the clause field" +msgid "Select the agreement field using the popup" msgstr "" #. module: agreement_legal @@ -1174,23 +1301,12 @@ msgstr "" msgid "Select the current stage of the agreement." msgstr "" -#. module: agreement_legal -#: model_terms:ir.ui.view,arch_db:agreement_legal.agreement_recital_form -msgid "Select the recital field" -msgstr "" - -#. module: agreement_legal -#: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_section_form_view -msgid "Select the section field" -msgstr "" - #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.agreement_appendix_form #: model_terms:ir.ui.view,arch_db:agreement_legal.agreement_recital_form #: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_clause_form_view -#: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_form_view #: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_section_form_view -msgid "Select the sub-field" +msgid "Select the field using the popup" msgstr "" #. module: agreement_legal @@ -1314,24 +1430,6 @@ msgstr "" msgid "Sub-Types" msgstr "" -#. module: agreement_legal -#: model:ir.model.fields,field_description:agreement_legal.field_agreement__sub_model_object_field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_appendix__sub_model_object_field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_clause__sub_model_object_field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_recital__sub_model_object_field_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_section__sub_model_object_field_id -msgid "Sub-field" -msgstr "" - -#. module: agreement_legal -#: model:ir.model.fields,field_description:agreement_legal.field_agreement__sub_object_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_appendix__sub_object_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_clause__sub_object_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_recital__sub_object_id -#: model:ir.model.fields,field_description:agreement_legal.field_agreement_section__sub_object_id -msgid "Sub-model" -msgstr "" - #. module: agreement_legal #: model:ir.model.fields,field_description:agreement_legal.field_agreement_type__agreement_subtypes_ids msgid "Subtypes" @@ -1511,24 +1609,10 @@ msgid "Version:" msgstr "" #. module: agreement_legal -#: model:ir.model.fields,help:agreement_legal.field_agreement__sub_model_object_field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_appendix__sub_model_object_field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_clause__sub_model_object_field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_recital__sub_model_object_field_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_section__sub_model_object_field_id -msgid "When a relationship field is selected as first field, this\n" -" field lets you select the target field within the destination document\n" -" model (sub-model)." -msgstr "" - -#. module: agreement_legal -#: model:ir.model.fields,help:agreement_legal.field_agreement__sub_object_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_appendix__sub_object_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_clause__sub_object_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_recital__sub_object_id -#: model:ir.model.fields,help:agreement_legal.field_agreement_section__sub_object_id -msgid "When a relationship field is selected as first field, this\n" -" field shows the document model the relationship goes to." +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:26 +#, python-format +msgid "Warning" msgstr "" #. module: agreement_legal @@ -1541,6 +1625,14 @@ msgstr "" msgid "When the agreement starts." msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:37 +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:55 +#, python-format +msgid "all records" +msgstr "" + #. module: agreement_legal #: model:ir.model.fields,help:agreement_legal.field_agreement_appendix__dynamic_content #: model:ir.model.fields,help:agreement_legal.field_agreement_clause__dynamic_content @@ -1549,16 +1641,59 @@ msgstr "" msgid "compute dynamic Content" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:151 +#, python-format +msgid "is" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:153 +#, python-format +msgid "not" +msgstr "" + #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.view_project_agreement_kanban msgid "oe_kanban_text_red" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:46 +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:64 +#, python-format +msgid "of the following rules:" +msgstr "" + #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.partner_agreement_form_view msgid "on" msgstr "" +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:144 +#, python-format +msgid "or" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:24 +#, python-format +msgid "record(s)" +msgstr "" + +#. module: agreement_legal +#. openerp-web +#: code:addons/agreement_legal/static/src/xml/domain_widget_view.xml:153 +#, python-format +msgid "set" +msgstr "" + #. module: agreement_legal #: model_terms:ir.ui.view,arch_db:agreement_legal.view_project_agreement_kanban msgid "user & picture" diff --git a/agreement_legal/models/agreement.py b/agreement_legal/models/agreement.py index 656832542..fb5f12052 100644 --- a/agreement_legal/models/agreement.py +++ b/agreement_legal/models/agreement.py @@ -246,23 +246,10 @@ class Agreement(models.Model): signed_contract_filename = fields.Char(string="Filename") signed_contract = fields.Binary( string="Signed Document", track_visibility="always") - field_id = fields.Many2one( - "ir.model.fields", - string="Field", - help="""Select target field from the related document model. If it is a - relationship field you will be able to select a target field at the - destination of the relationship.""") - sub_object_id = fields.Many2one( - "ir.model", - string="Sub-model", - help="""When a relationship field is selected as first field, this - field shows the document model the relationship goes to.""") - sub_model_object_field_id = fields.Many2one( - "ir.model.fields", - string="Sub-field", - help="""When a relationship field is selected as first field, this - field lets you select the target field within the destination document - model (sub-model).""") + + # Dynamic field editor + field_domain = fields.Char(string='Field Expression', + default='[["active", "=", True]]') default_value = fields.Char( string="Default Value", help="Optional value to use if the target field is empty.") @@ -271,6 +258,17 @@ class Agreement(models.Model): help="""Final placeholder expression, to be copy-pasted in the desired template field.""") + @api.onchange("field_domain", "default_value") + def onchange_copyvalue(self): + self.copyvalue = False + if self.field_domain: + string_list = self.field_domain.split(",") + if string_list: + field_domain = string_list[0][3:-1] + self.copyvalue = "${{object.{} or {}}}".format( + field_domain, + self.default_value or "''") + # compute the dynamic content for mako expression @api.multi def _compute_dynamic_description(self): @@ -308,24 +306,6 @@ class Agreement(models.Model): ) agreement.dynamic_special_terms = special_terms - @api.onchange("field_id", "sub_model_object_field_id", "default_value") - def onchange_copyvalue(self): - self.sub_object_id = False - self.copyvalue = False - self.sub_object_id = False - if self.field_id and not self.field_id.relation: - self.copyvalue = "${{object.{} or {}}}".format( - self.field_id.name, self.default_value or "''") - self.sub_model_object_field_id = False - if self.field_id and self.field_id.relation: - self.sub_object_id = self.env["ir.model"].search( - [("model", "=", self.field_id.relation)])[0] - if self.sub_model_object_field_id: - self.copyvalue = "${{object.{}.{} or {}}}".format( - self.field_id.name, - self.sub_model_object_field_id.name, - self.default_value or "''") - # Used for Kanban grouped_by view @api.model def _read_group_stage_ids(self, stages, domain, order): diff --git a/agreement_legal/models/agreement_appendix.py b/agreement_legal/models/agreement_appendix.py index e81bd53cd..5e7fe410a 100644 --- a/agreement_legal/models/agreement_appendix.py +++ b/agreement_legal/models/agreement_appendix.py @@ -36,54 +36,26 @@ class AgreementAppendix(models.Model): ) # Dynamic field editor - field_id = fields.Many2one( - "ir.model.fields", - string="Field", - help="""Select target field from the related document model. If it is a - relationship field you will be able to select a target field at the - destination of the relationship.""", - ) - sub_object_id = fields.Many2one( - "ir.model", - string="Sub-model", - help="""When a relationship field is selected as first field, this - field shows the document model the relationship goes to.""", - ) - sub_model_object_field_id = fields.Many2one( - "ir.model.fields", - string="Sub-field", - help="""When a relationship field is selected as first field, this - field lets you select the target field within the destination document - model (sub-model).""", - ) + field_domain = fields.Char(string='Field Expression', + default='[["active", "=", True]]') default_value = fields.Char( string="Default Value", - help="Optional value to use if the target field is empty.", - ) + help="Optional value to use if the target field is empty.") copyvalue = fields.Char( string="Placeholder Expression", help="""Final placeholder expression, to be copy-pasted in the desired - template field.""", - ) + template field.""") - @api.onchange('field_id', 'sub_model_object_field_id', 'default_value') + @api.onchange("field_domain", "default_value") def onchange_copyvalue(self): - self.sub_object_id = False self.copyvalue = False - self.sub_object_id = False - if self.field_id and not self.field_id.relation: - self.copyvalue = "${object.%s or %s}" % \ - (self.field_id.name, - self.default_value or '\'\'') - self.sub_model_object_field_id = False - if self.field_id and self.field_id.relation: - self.sub_object_id = self.env['ir.model'].search( - [('model', '=', self.field_id.relation)])[0] - if self.sub_model_object_field_id: - self.copyvalue = "${object.%s.%s or %s}" %\ - (self.field_id.name, - self.sub_model_object_field_id.name, - self.default_value or '\'\'') + if self.field_domain: + string_list = self.field_domain.split(",") + if string_list: + field_domain = string_list[0][3:-1] + self.copyvalue = "${{object.{} or {}}}".format( + field_domain, + self.default_value or "''") # compute the dynamic content for mako expression @api.multi diff --git a/agreement_legal/models/agreement_clause.py b/agreement_legal/models/agreement_clause.py index e7ab066fa..02cbfc571 100644 --- a/agreement_legal/models/agreement_clause.py +++ b/agreement_legal/models/agreement_clause.py @@ -34,23 +34,8 @@ class AgreementClause(models.Model): "removing it.") # Dynamic field editor - field_id = fields.Many2one( - "ir.model.fields", - string="Field", - help="""Select target field from the related document model. If it is a - relationship field you will be able to select a target field at the - destination of the relationship.""") - sub_object_id = fields.Many2one( - "ir.model", - string="Sub-model", - help="""When a relationship field is selected as first field, this - field shows the document model the relationship goes to.""") - sub_model_object_field_id = fields.Many2one( - "ir.model.fields", - string="Sub-field", - help="""When a relationship field is selected as first field, this - field lets you select the target field within the destination document - model (sub-model).""") + field_domain = fields.Char(string='Field Expression', + default='[["active", "=", True]]') default_value = fields.Char( string="Default Value", help="Optional value to use if the target field is empty.") @@ -59,24 +44,16 @@ class AgreementClause(models.Model): help="""Final placeholder expression, to be copy-pasted in the desired template field.""") - @api.onchange('field_id', 'sub_model_object_field_id', 'default_value') + @api.onchange("field_domain", "default_value") def onchange_copyvalue(self): - self.sub_object_id = False self.copyvalue = False - self.sub_object_id = False - if self.field_id and not self.field_id.relation: - self.copyvalue = "${object.%s or %s}" % \ - (self.field_id.name, - self.default_value or '\'\'') - self.sub_model_object_field_id = False - if self.field_id and self.field_id.relation: - self.sub_object_id = self.env['ir.model'].search( - [('model', '=', self.field_id.relation)])[0] - if self.sub_model_object_field_id: - self.copyvalue = "${object.%s.%s or %s}" %\ - (self.field_id.name, - self.sub_model_object_field_id.name, - self.default_value or '\'\'') + if self.field_domain: + string_list = self.field_domain.split(",") + if string_list: + field_domain = string_list[0][3:-1] + self.copyvalue = "${{object.{} or {}}}".format( + field_domain, + self.default_value or "''") # compute the dynamic content for mako expression @api.multi diff --git a/agreement_legal/models/agreement_recital.py b/agreement_legal/models/agreement_recital.py index 15b045170..74a814ce0 100644 --- a/agreement_legal/models/agreement_recital.py +++ b/agreement_legal/models/agreement_recital.py @@ -12,76 +12,42 @@ class AgreementRecital(models.Model): name = fields.Char(string="Name", required=True) title = fields.Char( string="Title", - help="The title is displayed on the PDF." "The name is not.", - ) + help="The title is displayed on the PDF." "The name is not.") sequence = fields.Integer(string="Sequence", default=10) content = fields.Html(string="Content") dynamic_content = fields.Html( compute="_compute_dynamic_content", string="Dynamic Content", - help="compute dynamic Content", - ) + help="compute dynamic Content") agreement_id = fields.Many2one( - "agreement", string="Agreement", ondelete="cascade" - ) + "agreement", string="Agreement", ondelete="cascade") active = fields.Boolean( string="Active", default=True, help="If unchecked, it will allow you to hide this recital without " - "removing it.", - ) + "removing it.") # Dynamic field editor - field_id = fields.Many2one( - "ir.model.fields", - string="Field", - help="""Select target field from the related document model. If it is a - relationship field you will be able to select a target field at the - destination of the relationship.""", - ) - sub_object_id = fields.Many2one( - "ir.model", - string="Sub-model", - help="""When a relationship field is selected as first field, this - field shows the document model the relationship goes to.""", - ) - sub_model_object_field_id = fields.Many2one( - "ir.model.fields", - string="Sub-field", - help="""When a relationship field is selected as first field, this - field lets you select the target field within the destination document - model (sub-model).""", - ) + field_domain = fields.Char(string='Field Expression', + default='[["active", "=", True]]') default_value = fields.Char( string="Default Value", - help="Optional value to use if the target field is empty.", - ) + help="Optional value to use if the target field is empty.") copyvalue = fields.Char( string="Placeholder Expression", help="""Final placeholder expression, to be copy-pasted in the desired - template field.""", - ) + template field.""") - @api.onchange("field_id", "sub_model_object_field_id", "default_value") + @api.onchange("field_domain", "default_value") def onchange_copyvalue(self): - self.sub_object_id = False self.copyvalue = False - self.sub_object_id = False - if self.field_id and not self.field_id.relation: - self.copyvalue = "${{object.{} or {}}}".format( - self.field_id.name, self.default_value or "''" - ) - self.sub_model_object_field_id = False - if self.field_id and self.field_id.relation: - self.sub_object_id = self.env["ir.model"].search( - [("model", "=", self.field_id.relation)] - )[0] - if self.sub_model_object_field_id: - self.copyvalue = "${{object.{}.{} or {}}}".format( - self.field_id.name, - self.sub_model_object_field_id.name, - self.default_value or "''", - ) + if self.field_domain: + string_list = self.field_domain.split(",") + if string_list: + field_domain = string_list[0][3:-1] + self.copyvalue = "${{object.{} or {}}}".format( + field_domain, + self.default_value or "''") # compute the dynamic content for mako expression @api.multi @@ -91,9 +57,7 @@ class AgreementRecital(models.Model): lang = ( recital.agreement_id and recital.agreement_id.partner_id.lang - or "en_US" - ) + or "en_US") content = MailTemplates.with_context(lang=lang)._render_template( - recital.content, "agreement.recital", recital.id - ) + recital.content, "agreement.recital", recital.id) recital.dynamic_content = content diff --git a/agreement_legal/models/agreement_section.py b/agreement_legal/models/agreement_section.py index 2d9220dff..4ac9f639f 100644 --- a/agreement_legal/models/agreement_section.py +++ b/agreement_legal/models/agreement_section.py @@ -30,23 +30,8 @@ class AgreementSection(models.Model): "removing it.") # Dynamic field editor - field_id = fields.Many2one( - "ir.model.fields", - string="Field", - help="""Select target field from the related document model. If it is a - relationship field you will be able to select a target field at the - destination of the relationship.""") - sub_object_id = fields.Many2one( - "ir.model", - string="Sub-model", - help="""When a relationship field is selected as first field, this - field shows the document model the relationship goes to.""") - sub_model_object_field_id = fields.Many2one( - "ir.model.fields", - string="Sub-field", - help="""When a relationship field is selected as first field, this - field lets you select the target field within the destination document - model (sub-model).""") + field_domain = fields.Char(string='Field Expression', + default='[["active", "=", True]]') default_value = fields.Char( string="Default Value", help="Optional value to use if the target field is empty.") @@ -55,25 +40,16 @@ class AgreementSection(models.Model): help="""Final placeholder expression, to be copy-pasted in the desired template field.""") - @api.onchange("field_id", "sub_model_object_field_id", "default_value") + @api.onchange("field_domain", "default_value") def onchange_copyvalue(self): - self.sub_object_id = False self.copyvalue = False - self.sub_object_id = False - if self.field_id and not self.field_id.relation: - self.copyvalue = "${{object.{} or {}}}".format( - self.field_id.name, self.default_value or "''") - self.sub_model_object_field_id = False - if self.field_id and self.field_id.relation: - self.sub_object_id = self.env["ir.model"].search( - [("model", "=", self.field_id.relation)] - )[0] - if self.sub_model_object_field_id: - self.copyvalue = "${{object.{}.{} or {}}}".format( - self.field_id.name, - self.sub_model_object_field_id.name, - self.default_value or "''", - ) + if self.field_domain: + string_list = self.field_domain.split(",") + if string_list: + field_domain = string_list[0][3:-1] + self.copyvalue = "${{object.{} or {}}}".format( + field_domain, + self.default_value or "''") # compute the dynamic content for mako expression @api.multi diff --git a/agreement_legal/readme/USAGE.rst b/agreement_legal/readme/USAGE.rst index 7e8996481..4030c1581 100644 --- a/agreement_legal/readme/USAGE.rst +++ b/agreement_legal/readme/USAGE.rst @@ -5,3 +5,9 @@ To use this module: * Select a template * Follow the process to get the required approval * Send the invitation to the customer to review and sign the agreement + +* Define Field using widget domain but having partial_use option true: +* For Ex: +* diff --git a/agreement_legal/report/agreement.xml b/agreement_legal/report/agreement.xml index 6a621d0fb..5688ae3eb 100644 --- a/agreement_legal/report/agreement.xml +++ b/agreement_legal/report/agreement.xml @@ -93,7 +93,7 @@ - +

Special Terms

diff --git a/agreement_legal/static/description/index.html b/agreement_legal/static/description/index.html index f11b08812..9feda578a 100644 --- a/agreement_legal/static/description/index.html +++ b/agreement_legal/static/description/index.html @@ -410,6 +410,11 @@ customer signature.

  • Select a template
  • Follow the process to get the required approval
  • Send the invitation to the customer to review and sign the agreement
  • +
  • Define Field using widget domain but having partial_use option true:
  • +
  • For Ex:
  • +
  • <field name=”field_domain” widget=”domain” nolabel=”1”
  • +
  • options=”{‘model’: ‘agreement.recital’,
  • +
  • ‘partial_use’: True}”/>
  • diff --git a/agreement_legal/static/src/js/domain_widget_ext.js b/agreement_legal/static/src/js/domain_widget_ext.js new file mode 100644 index 000000000..11da12f66 --- /dev/null +++ b/agreement_legal/static/src/js/domain_widget_ext.js @@ -0,0 +1,77 @@ +odoo.define('agreement_legal.domain_widget_ext', function (require) { + 'use strict'; + + var basic_fields = require('web.basic_fields'); + var DomainSelector = require('web.DomainSelector'); + var session = require('web.session'); + var core = require('web.core'); + var qweb = core.qweb; + var _t = core._t; + + basic_fields.FieldDomain.include({ + /** + * Init + */ + init : function () { + this._super.apply(this, arguments); + // Add Additional options + this.partialUse = this.nodeOptions.partial_use || false; + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @private + * @override _render from AbstractField + * @returns {Deferred} + */ + _render: function () { + // If there is no model, only change the non-domain-selector content + if (!this._domainModel) { + this._replaceContent(); + return $.when(); + } + + // Convert char value to array value + var value = this.value || "[]"; + + // Create the domain selector or change the value of the current one... + var def; + if (!this.domainSelector) { + this.domainSelector = new DomainSelector(this, this._domainModel, value, { + readonly: this.mode === "readonly" || this.inDialog, + filters: this.fsFilters, + debugMode: session.debug, + partialUse: this.partialUse || false, + }); + def = this.domainSelector.prependTo(this.$el); + } else { + def = this.domainSelector.setDomain(value); + } + // ... then replace the other content (matched records, etc) + return def.then(this._replaceContent.bind(this)); + }, + /** + * Render the field DOM except for the domain selector part. The full field + * DOM is composed of a DIV which contains the domain selector widget, + * followed by other content. This other content is handled by this method. + * + * @private + */ + _replaceContent: function () { + if (this._$content) { + this._$content.remove(); + } + this._$content = $(qweb.render("FieldDomain.content", { + hasModel: !!this._domainModel, + isValid: !!this._isValidForModel, + nbRecords: this.record.specialData[this.name].nbRecords || 0, + inDialogEdit: this.inDialog && this.mode === "edit", + partialUse: this.partialUse || false, + })); + this._$content.appendTo(this.$el); + }, + }); +}); diff --git a/agreement_legal/static/src/xml/domain_widget_view.xml b/agreement_legal/static/src/xml/domain_widget_view.xml new file mode 100644 index 000000000..580d1a2ec --- /dev/null +++ b/agreement_legal/static/src/xml/domain_widget_view.xml @@ -0,0 +1,179 @@ + + + + +
    + +
    +
    + +
    + + + + Invalid domain + + +
    +
    Select a model to add a filter.
    +
    +
    + +
    + + + SMatch all records + + + +
    + Please navigate below and select field: + + SSMatch records with + + of the following rules: + +
    + +
    + + + + + Match all records + + + +
    + Match records with the following rule: + + Match records with + + of the following rules: + +
    + +
    + + + + +
    + + + + + + + + +
    + + +
    + + +
    + +
    +
    + + + + + +
    + + + +
    +
    + +
    +
    + + + +
    +
    +
    +
    +
    + + + + "" + + + + + "" + or + + + + + + + + is + not + set + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
      +
    + +
    +
    + \ No newline at end of file diff --git a/agreement_legal/views/agreement.xml b/agreement_legal/views/agreement.xml index 3a7e32048..727749952 100644 --- a/agreement_legal/views/agreement.xml +++ b/agreement_legal/views/agreement.xml @@ -1,6 +1,14 @@ +