From c9acdbc4d52da2f7baf9d1faf464458bab6b17e3 Mon Sep 17 00:00:00 2001 From: newtratip Date: Fri, 16 Jul 2021 18:26:02 +0700 Subject: [PATCH] [14.0][ENH] agreement_legal --- agreement_legal/__init__.py | 1 + agreement_legal/__manifest__.py | 6 +- agreement_legal/data/agreement_stage.xml | 7 + agreement_legal/data/module_category.xml | 8 - agreement_legal/models/__init__.py | 3 - agreement_legal/models/agreement.py | 186 ++++++++--- agreement_legal/models/agreement_appendix.py | 5 +- agreement_legal/models/agreement_clause.py | 8 +- .../models/agreement_increasetype.py | 24 -- agreement_legal/models/agreement_recital.py | 7 +- .../models/agreement_renewaltype.py | 21 -- agreement_legal/models/agreement_section.py | 5 +- agreement_legal/models/agreement_stage.py | 9 +- agreement_legal/models/agreement_status.py | 12 - agreement_legal/models/agreement_subtype.py | 3 +- agreement_legal/models/agreement_type.py | 2 +- agreement_legal/models/product_template.py | 10 - agreement_legal/readme/CONTRIBUTORS.rst | 1 + agreement_legal/report/agreement.xml | 4 + agreement_legal/security/ir.model.access.csv | 15 +- agreement_legal/security/res_groups.xml | 2 - agreement_legal/static/src/js/agreement.js | 40 +++ .../static/src/js/domain_widget_ext.js | 85 ----- agreement_legal/static/src/xml/agreement.xml | 22 ++ .../static/src/xml/domain_widget_view.xml | 298 ------------------ agreement_legal/tests/__init__.py | 1 + agreement_legal/tests/test_agreement.py | 18 +- .../tests/test_agreement_appendix.py | 2 +- .../tests/test_agreement_clause.py | 2 +- .../tests/test_agreement_recital.py | 2 +- .../tests/test_agreement_section.py | 2 +- .../tests/test_create_agreement_wizard.py | 80 +++++ agreement_legal/views/agreement.xml | 71 +++-- agreement_legal/views/agreement_appendix.xml | 33 +- agreement_legal/views/agreement_clause.xml | 41 ++- .../views/agreement_increasetype.xml | 44 --- agreement_legal/views/agreement_recital.xml | 33 +- .../views/agreement_renewaltype.xml | 40 --- agreement_legal/views/agreement_section.xml | 33 +- agreement_legal/views/agreement_stages.xml | 41 ++- agreement_legal/views/agreement_subtype.xml | 43 ++- agreement_legal/views/agreement_type.xml | 2 +- agreement_legal/views/assets.xml | 14 + agreement_legal/views/menu.xml | 20 +- agreement_legal/wizards/__init__.py | 3 + .../wizards/create_agreement_wizard.py | 31 ++ .../wizards/create_agreement_wizard.xml | 34 ++ 47 files changed, 694 insertions(+), 680 deletions(-) delete mode 100644 agreement_legal/data/module_category.xml delete mode 100644 agreement_legal/models/agreement_increasetype.py delete mode 100644 agreement_legal/models/agreement_renewaltype.py delete mode 100644 agreement_legal/models/agreement_status.py delete mode 100644 agreement_legal/models/product_template.py create mode 100644 agreement_legal/static/src/js/agreement.js delete mode 100644 agreement_legal/static/src/js/domain_widget_ext.js create mode 100644 agreement_legal/static/src/xml/agreement.xml delete mode 100644 agreement_legal/static/src/xml/domain_widget_view.xml create mode 100644 agreement_legal/tests/test_create_agreement_wizard.py delete mode 100644 agreement_legal/views/agreement_increasetype.xml delete mode 100644 agreement_legal/views/agreement_renewaltype.xml create mode 100644 agreement_legal/views/assets.xml create mode 100644 agreement_legal/wizards/__init__.py create mode 100644 agreement_legal/wizards/create_agreement_wizard.py create mode 100644 agreement_legal/wizards/create_agreement_wizard.xml diff --git a/agreement_legal/__init__.py b/agreement_legal/__init__.py index 073035d16..c1cfe3914 100644 --- a/agreement_legal/__init__.py +++ b/agreement_legal/__init__.py @@ -2,3 +2,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from . import models +from . import wizards diff --git a/agreement_legal/__manifest__.py b/agreement_legal/__manifest__.py index 808328fff..63667b4a9 100644 --- a/agreement_legal/__manifest__.py +++ b/agreement_legal/__manifest__.py @@ -15,7 +15,6 @@ "depends": ["contacts", "agreement", "product"], "data": [ "data/ir_sequence.xml", - "data/module_category.xml", "data/agreement_stage.xml", "data/agreement_type.xml", "security/res_groups.xml", @@ -29,13 +28,14 @@ "views/agreement_stages.xml", "views/agreement_type.xml", "views/agreement_subtype.xml", - "views/agreement_renewaltype.xml", - "views/agreement_increasetype.xml", "views/res_partner.xml", "views/agreement.xml", "views/menu.xml", + "views/assets.xml", + "wizards/create_agreement_wizard.xml", ], "demo": ["demo/demo.xml"], + "qweb": ["static/src/xml/agreement.xml"], "application": True, "development_status": "Beta", "maintainers": ["max3903", "ygol"], diff --git a/agreement_legal/data/agreement_stage.xml b/agreement_legal/data/agreement_stage.xml index 0f930eab7..f3d9ca0de 100644 --- a/agreement_legal/data/agreement_stage.xml +++ b/agreement_legal/data/agreement_stage.xml @@ -48,6 +48,13 @@ agreement + + Terminated + 90 + True + agreement + + Cancelled 100 diff --git a/agreement_legal/data/module_category.xml b/agreement_legal/data/module_category.xml deleted file mode 100644 index da4af85af..000000000 --- a/agreement_legal/data/module_category.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - Agreement - 80 - - - diff --git a/agreement_legal/models/__init__.py b/agreement_legal/models/__init__.py index c24e38c08..238f84cbe 100644 --- a/agreement_legal/models/__init__.py +++ b/agreement_legal/models/__init__.py @@ -12,7 +12,4 @@ from . import ( agreement_type, agreement_subtype, res_partner, - product_template, - agreement_renewaltype, - agreement_increasetype, ) diff --git a/agreement_legal/models/agreement.py b/agreement_legal/models/agreement.py index d0450bcd9..b2c99129a 100644 --- a/agreement_legal/models/agreement.py +++ b/agreement_legal/models/agreement.py @@ -1,6 +1,11 @@ # Copyright (C) 2018 - TODAY, Pavlov Media # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import ast +import json as simplejson + +from lxml import etree + from odoo import _, api, fields, models @@ -52,12 +57,6 @@ class Agreement(models.Model): tracking=True, help="Date the contract was signed by the Partner.", ) - term = fields.Integer( - string="Term (Months)", - tracking=True, - help="Number of months this agreement/contract is in effect with the " - "partner.", - ) expiration_notice = fields.Integer( string="Exp. Notice (Days)", tracking=True, @@ -87,12 +86,6 @@ class Agreement(models.Model): copy=False, help="ID used for internal contract tracking.", ) - increase_type_id = fields.Many2one( - "agreement.increasetype", - string="Increase Type", - tracking=True, - help="The amount that certain rates may increase.", - ) termination_requested = fields.Date( string="Termination Requested Date", tracking=True, @@ -107,7 +100,6 @@ class Agreement(models.Model): reviewed_user_id = fields.Many2one("res.users", string="Reviewed By", tracking=True) approved_date = fields.Date(string="Approved Date", tracking=True) approved_user_id = fields.Many2one("res.users", string="Approved By", tracking=True) - currency_id = fields.Many2one("res.currency", string="Currency") partner_id = fields.Many2one( "res.partner", string="Partner", @@ -192,7 +184,6 @@ class Agreement(models.Model): help="Select the sub-type of this agreement. Sub-Types are related to " "agreement types.", ) - product_ids = fields.Many2many("product.template", string="Products & Services") assigned_user_id = fields.Many2one( "res.users", string="Assigned To", @@ -219,12 +210,6 @@ class Agreement(models.Model): "agreement is an amendment to another agreement. This list will " "only show other agreements related to the same account.", ) - renewal_type_id = fields.Many2one( - "agreement.renewaltype", - string="Renewal Type", - tracking=True, - help="Describes what happens after the contract expires.", - ) recital_ids = fields.One2many( "agreement.recital", "agreement_id", string="Recitals", copy=True ) @@ -241,6 +226,7 @@ class Agreement(models.Model): string="Previous Versions", copy=False, domain=[("active", "=", False)], + context={"active_test": False}, ) child_agreements_ids = fields.One2many( "agreement", @@ -294,19 +280,37 @@ class Agreement(models.Model): help="""Final placeholder expression, to be copy-pasted in the desired template field.""", ) + created_by = fields.Many2one( + "res.users", + string="Created By", + copy=False, + default=lambda self: self.env.user, + help="User which create the agreement.", + ) + date_created = fields.Datetime( + string="Created On", + copy=False, + default=lambda self: fields.Datetime.now(), + help="Date which create the agreement.", + ) + template_id = fields.Many2one( + "agreement", + string="Template", + domain=[("is_template", "=", True)], + ) + readonly = fields.Boolean( + related="stage_id.readonly", + ) - # compute the dynamic content for mako expression + # compute the dynamic content for jinja expression def _compute_dynamic_description(self): MailTemplates = self.env["mail.template"] for agreement in self: lang = agreement.partner_id.lang or "en_US" description = MailTemplates.with_context(lang=lang)._render_template( agreement.description, "agreement", [agreement.id] - ) - des = "" - for i in description: - des += description[i] - agreement.dynamic_description = des + )[agreement.id] + agreement.dynamic_description = description def _compute_dynamic_parties(self): MailTemplates = self.env["mail.template"] @@ -314,7 +318,7 @@ class Agreement(models.Model): lang = agreement.partner_id.lang or "en_US" parties = MailTemplates.with_context(lang=lang)._render_template( agreement.parties, "agreement", [agreement.id] - ) + )[agreement.id] agreement.dynamic_parties = parties def _compute_dynamic_special_terms(self): @@ -323,14 +327,13 @@ class Agreement(models.Model): lang = agreement.partner_id.lang or "en_US" special_terms = MailTemplates.with_context(lang=lang)._render_template( agreement.special_terms, "agreement", [agreement.id] - ) + )[agreement.id] 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 "''" @@ -360,29 +363,55 @@ class Agreement(models.Model): string="Stage", group_expand="_read_group_stage_ids", help="Select the current stage of the agreement.", + default=lambda self: self._get_default_stage_id(), tracking=True, index=True, + copy=False, ) + @api.model + def _get_default_stage_id(self): + try: + stage_id = self.env.ref("agreement_legal.agreement_stage_new").id + except ValueError: + stage_id = False + return stage_id + + def _get_old_version_default_vals(self): + self.ensure_one() + default_vals = { + "name": "{} - OLD VERSION".format(self.name), + "active": False, + "parent_agreement_id": self.id, + "version": self.version, + "revision": self.revision, + "created_by": self.created_by.id, + "date_created": self.date_created, + "code": "{}-V{}".format(self.code, str(self.version)), + "stage_id": self.stage_id.id, + } + return default_vals + # Create New Version Button def create_new_version(self): for rec in self: if not rec.state == "draft": # Make sure status is draft rec.state = "draft" - default_vals = { - "name": "{} - OLD VERSION".format(rec.name), - "active": False, - "parent_agreement_id": rec.id, - "version": rec.version, - "code": rec.code + "-V" + str(rec.version), - } # Make a current copy and mark it as old - rec.copy(default=default_vals) - # Increment the Version - rec.version = rec.version + 1 + rec.copy(default=rec._get_old_version_default_vals()) + # Update version, created by and created on + rec.update( + { + "version": rec.version + 1, + "created_by": self.env.user.id, + "date_created": fields.Datetime.now(), + } + ) + # Reset revision to 0 since it's a new version + rec.revision = 0 - def create_new_agreement(self): + def _get_new_agreement_default_vals(self): self.ensure_one() default_vals = { "name": "New", @@ -390,10 +419,13 @@ class Agreement(models.Model): "version": 1, "revision": 0, "state": "draft", - "stage_id": self.env.ref("agreement_legal.agreement_stage_new").id, + "is_template": False, } - res = self.copy(default=default_vals) - res.sections_ids.mapped("clauses_ids").write({"agreement_id": res.id}) + return default_vals + + def create_new_agreement(self): + self.ensure_one() + res = self.copy(default=self._get_new_agreement_default_vals()) return { "res_model": "agreement", "type": "ir.actions.act_window", @@ -407,10 +439,72 @@ class Agreement(models.Model): if vals.get("code", _("New")) == _("New"): vals["code"] = self.env["ir.sequence"].next_by_code("agreement") or _("New") if not vals.get("stage_id"): - vals["stage_id"] = self.env.ref("agreement_legal.agreement_stage_new").id + vals["stage_id"] = self._get_default_stage_id() return super().create(vals) # Increments the revision on each save action def write(self, vals): - vals["revision"] = self.revision + 1 - return super().write(vals) + res = True + for rec in self: + has_revision = False + if "revision" not in vals: + vals["revision"] = rec.revision + 1 + has_revision = True + res = super(Agreement, rec).write(vals) + if has_revision: + vals.pop("revision") + return res + + def copy(self, default=None): + """Assign a value for code is New""" + default = dict(default or {}) + if not default.get("code", False): + default.setdefault("code", _("New")) + res = super().copy(default) + res.sections_ids.mapped("clauses_ids").write({"agreement_id": res.id}) + return res + + def _exclude_readonly_field(self): + return ["stage_id"] + + @api.model + def fields_view_get( + self, view_id=None, view_type=False, toolbar=False, submenu=False + ): + res = super().fields_view_get( + view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu + ) + # Readonly fields + doc = etree.XML(res["arch"]) + if view_type == "form": + for node in doc.xpath("//field"): + if node.attrib.get("name") in self._exclude_readonly_field(): + continue + attrs = ast.literal_eval(node.attrib.get("attrs", "{}")) + if attrs: + if attrs.get("readonly"): + attrs["readonly"] = ["|", ("readonly", "=", True)] + attrs[ + "readonly" + ] + else: + attrs["readonly"] = [("readonly", "=", True)] + else: + attrs["readonly"] = [("readonly", "=", True)] + node.set("attrs", simplejson.dumps(attrs)) + modifiers = ast.literal_eval( + node.attrib.get("modifiers", "{}") + .replace("true", "True") + .replace("false", "False") + ) + readonly = modifiers.get("readonly") + invisible = modifiers.get("invisible") + required = modifiers.get("required") + if isinstance(readonly, bool) and readonly: + attrs["readonly"] = readonly + if isinstance(invisible, bool) and invisible: + attrs["invisible"] = invisible + if isinstance(required, bool) and required: + attrs["required"] = required + node.set("modifiers", simplejson.dumps(attrs)) + res["arch"] = etree.tostring(doc) + return res diff --git a/agreement_legal/models/agreement_appendix.py b/agreement_legal/models/agreement_appendix.py index 1376cbaf4..77b651569 100644 --- a/agreement_legal/models/agreement_appendix.py +++ b/agreement_legal/models/agreement_appendix.py @@ -65,7 +65,6 @@ class AgreementAppendix(models.Model): 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, @@ -83,7 +82,7 @@ class AgreementAppendix(models.Model): self.default_value or "''", ) - # compute the dynamic content for mako expression + # compute the dynamic content for jinja expression def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for appendix in self: @@ -94,5 +93,5 @@ class AgreementAppendix(models.Model): ) content = MailTemplates.with_context(lang=lang)._render_template( appendix.content, "agreement.appendix", [appendix.id] - ) + )[appendix.id] appendix.dynamic_content = content diff --git a/agreement_legal/models/agreement_clause.py b/agreement_legal/models/agreement_clause.py index ecae7af24..c399cb404 100644 --- a/agreement_legal/models/agreement_clause.py +++ b/agreement_legal/models/agreement_clause.py @@ -15,6 +15,9 @@ class AgreementClause(models.Model): ) sequence = fields.Integer(string="Sequence") agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade") + temp_agreement_id = fields.Many2one( + "agreement", string="Temp Agreement", help="This field help to filter section." + ) section_id = fields.Many2one( "agreement.section", string="Section", ondelete="cascade" ) @@ -66,7 +69,6 @@ class AgreementClause(models.Model): 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, @@ -84,7 +86,7 @@ class AgreementClause(models.Model): self.default_value or "''", ) - # compute the dynamic content for mako expression + # compute the dynamic content for jinja expression def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for clause in self: @@ -93,5 +95,5 @@ class AgreementClause(models.Model): ) content = MailTemplates.with_context(lang=lang)._render_template( clause.content, "agreement.clause", [clause.id] - ) + )[clause.id] clause.dynamic_content = content diff --git a/agreement_legal/models/agreement_increasetype.py b/agreement_legal/models/agreement_increasetype.py deleted file mode 100644 index e3fc62f3f..000000000 --- a/agreement_legal/models/agreement_increasetype.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (C) 2018 - TODAY, Pavlov Media -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import fields, models - - -# Main Agreement Increase Type Records Model -class AgreementIncreaseType(models.Model): - _name = "agreement.increasetype" - _description = "Agreement Increase Type" - - # General - name = fields.Char( - string="Title", - required=True, - help="Increase types describe any increases that may happen during " - "the contract.", - ) - description = fields.Text( - string="Description", required=True, help="Description of the renewal type." - ) - increase_percent = fields.Integer( - string="Increase Percentage", help="Percentage that the amount will increase." - ) diff --git a/agreement_legal/models/agreement_recital.py b/agreement_legal/models/agreement_recital.py index 7fec94a4d..f86b6fd75 100644 --- a/agreement_legal/models/agreement_recital.py +++ b/agreement_legal/models/agreement_recital.py @@ -12,7 +12,7 @@ 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") @@ -64,7 +64,6 @@ class AgreementRecital(models.Model): 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 "''" @@ -81,7 +80,7 @@ class AgreementRecital(models.Model): self.default_value or "''", ) - # compute the dynamic content for mako expression + # compute the dynamic content for jinja expression def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for recital in self: @@ -90,5 +89,5 @@ class AgreementRecital(models.Model): ) content = MailTemplates.with_context(lang=lang)._render_template( recital.content, "agreement.recital", [recital.id] - ) + )[recital.id] recital.dynamic_content = content diff --git a/agreement_legal/models/agreement_renewaltype.py b/agreement_legal/models/agreement_renewaltype.py deleted file mode 100644 index fd8694e3c..000000000 --- a/agreement_legal/models/agreement_renewaltype.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (C) 2018 - TODAY, Pavlov Media -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import fields, models - - -# Main Agreement Section Records Model -class AgreementRenewalType(models.Model): - _name = "agreement.renewaltype" - _description = "Agreement Renewal Type" - - # General - name = fields.Char( - string="Title", - required=True, - help="Renewal types describe what happens after the " - "agreement/contract expires.", - ) - description = fields.Text( - string="Description", required=True, help="Description of the renewal type." - ) diff --git a/agreement_legal/models/agreement_section.py b/agreement_legal/models/agreement_section.py index b4c275111..a192e3519 100644 --- a/agreement_legal/models/agreement_section.py +++ b/agreement_legal/models/agreement_section.py @@ -66,7 +66,6 @@ class AgreementSection(models.Model): 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 "''" @@ -83,7 +82,7 @@ class AgreementSection(models.Model): self.default_value or "''", ) - # compute the dynamic content for mako expression + # compute the dynamic content for jinja expression def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for section in self: @@ -92,5 +91,5 @@ class AgreementSection(models.Model): ) content = MailTemplates.with_context(lang=lang)._render_template( section.content, "agreement.section", [section.id] - ) + )[section.id] section.dynamic_content = content diff --git a/agreement_legal/models/agreement_stage.py b/agreement_legal/models/agreement_stage.py index 874c2d0b4..b13d62652 100644 --- a/agreement_legal/models/agreement_stage.py +++ b/agreement_legal/models/agreement_stage.py @@ -4,7 +4,7 @@ from odoo import fields, models -# Main Agreement Section Records Model +# Main Stage on the Agreement class AgreementStage(models.Model): _name = "agreement.stage" _description = "Agreement Stages" @@ -12,7 +12,6 @@ class AgreementStage(models.Model): # General name = fields.Char(string="Stage Name", required=True) - description = fields.Text(string="Description", required=False) sequence = fields.Integer(string="Sequence", default="1", required=False) fold = fields.Boolean( string="Is Folded", @@ -22,3 +21,9 @@ class AgreementStage(models.Model): stage_type = fields.Selection( [("agreement", "Agreement")], string="Type", required=True ) + active = fields.Boolean(string="Active", default=True) + readonly = fields.Boolean( + string="Readonly", + default=False, + help="The agreement can not edit if set Readonly = True.", + ) diff --git a/agreement_legal/models/agreement_status.py b/agreement_legal/models/agreement_status.py deleted file mode 100644 index 8d9ef3a2d..000000000 --- a/agreement_legal/models/agreement_status.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (C) 2018 - TODAY, Pavlov Media -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import fields, models - - -# Main Agreement Status Records Model -class AgreementStatus(models.Model): - _name = "agreement.type" - - # General - name = fields.Char(string="Title", required=True) diff --git a/agreement_legal/models/agreement_subtype.py b/agreement_legal/models/agreement_subtype.py index 056c061f1..0187c5f0c 100644 --- a/agreement_legal/models/agreement_subtype.py +++ b/agreement_legal/models/agreement_subtype.py @@ -8,5 +8,6 @@ class AgreementSubtype(models.Model): _name = "agreement.subtype" _description = "Agreement Subtypes" - name = fields.Char(string="Name", required=True) + name = fields.Char(string="Sub-Type Name", required=True) agreement_type_id = fields.Many2one("agreement.type", string="Agreement Type") + active = fields.Boolean(string="Active", default=True) diff --git a/agreement_legal/models/agreement_type.py b/agreement_legal/models/agreement_type.py index 20df56b73..b1add48e5 100644 --- a/agreement_legal/models/agreement_type.py +++ b/agreement_legal/models/agreement_type.py @@ -9,5 +9,5 @@ class AgreementType(models.Model): _description = "Agreement Types" agreement_subtypes_ids = fields.One2many( - "agreement.subtype", "agreement_type_id", string="Subtypes" + "agreement.subtype", "agreement_type_id", string="Sub-Types" ) diff --git a/agreement_legal/models/product_template.py b/agreement_legal/models/product_template.py deleted file mode 100644 index 9cf9e2e34..000000000 --- a/agreement_legal/models/product_template.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (C) 2018 - TODAY, Pavlov Media -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -from odoo import fields, models - - -class Product(models.Model): - _inherit = "product.template" - - agreements_ids = fields.Many2many("agreement", string="Agreements") diff --git a/agreement_legal/readme/CONTRIBUTORS.rst b/agreement_legal/readme/CONTRIBUTORS.rst index a0afb1231..1e7ffdd32 100644 --- a/agreement_legal/readme/CONTRIBUTORS.rst +++ b/agreement_legal/readme/CONTRIBUTORS.rst @@ -4,3 +4,4 @@ * Maxime Chambreuil * Sandip Mangukiya * Yves Goldberg +* Tharathip Chaweewongphan diff --git a/agreement_legal/report/agreement.xml b/agreement_legal/report/agreement.xml index a2b9b5337..965b8d82c 100644 --- a/agreement_legal/report/agreement.xml +++ b/agreement_legal/report/agreement.xml @@ -3,17 +3,21 @@ Agreement agreement + qweb-pdf agreement_legal.report_agreement_document agreement_legal.report_agreement_document + list,form Agreement Preview agreement + qweb-html agreement_legal.report_agreement_document agreement_legal.report_agreement_document + list,form