diff --git a/agreement_legal/__manifest__.py b/agreement_legal/__manifest__.py index 58494a765..796d63147 100644 --- a/agreement_legal/__manifest__.py +++ b/agreement_legal/__manifest__.py @@ -11,7 +11,7 @@ "website": "https://github.com/OCA/contract", "category": "Partner", "license": "AGPL-3", - "version": "12.0.2.0.1", + "version": "13.0.1.0.0", "depends": ["contacts", "agreement", "product"], "data": [ "data/ir_sequence.xml", diff --git a/agreement_legal/migrations/12.0.2.0.0/post-migration.py b/agreement_legal/migrations/12.0.2.0.0/post-migration.py deleted file mode 100644 index 68df838bf..000000000 --- a/agreement_legal/migrations/12.0.2.0.0/post-migration.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (C) 2020 Serpent Consulting Services -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - - -def migrate(env, version): - if not version: - return - - env.execute( - "UPDATE agreement_stage SET stage_type = 'agreement' " - "WHERE stage_type IS NULL;" - ) diff --git a/agreement_legal/models/agreement.py b/agreement_legal/models/agreement.py index 63812f7b8..28febf41c 100644 --- a/agreement_legal/models/agreement.py +++ b/agreement_legal/models/agreement.py @@ -23,9 +23,7 @@ class Agreement(models.Model): help="The revision will increase with every save event.", ) description = fields.Text( - string="Description", - track_visibility="onchange", - help="Description of the agreement", + string="Description", tracking=True, help="Description of the agreement", ) dynamic_description = fields.Text( compute="_compute_dynamic_description", @@ -33,12 +31,10 @@ class Agreement(models.Model): help="Compute dynamic description", ) start_date = fields.Date( - string="Start Date", - track_visibility="onchange", - help="When the agreement starts.", + string="Start Date", tracking=True, help="When the agreement starts.", ) end_date = fields.Date( - string="End Date", track_visibility="onchange", help="When the agreement ends." + string="End Date", tracking=True, help="When the agreement ends." ) color = fields.Integer(string="Color") active = fields.Boolean( @@ -49,33 +45,33 @@ class Agreement(models.Model): ) company_signed_date = fields.Date( string="Signed on", - track_visibility="onchange", + tracking=True, help="Date the contract was signed by Company.", ) partner_signed_date = fields.Date( string="Signed on (Partner)", - track_visibility="onchange", + tracking=True, help="Date the contract was signed by the Partner.", ) term = fields.Integer( string="Term (Months)", - track_visibility="onchange", + tracking=True, help="Number of months this agreement/contract is in effect with the " "partner.", ) expiration_notice = fields.Integer( string="Exp. Notice (Days)", - track_visibility="onchange", + tracking=True, help="Number of Days before expiration to be notified.", ) change_notice = fields.Integer( string="Change Notice (Days)", - track_visibility="onchange", + tracking=True, help="Number of Days to be notified before changes.", ) special_terms = fields.Text( string="Special Terms", - track_visibility="onchange", + tracking=True, help="Any terms that you have agreed to and want to track on the " "agreement/contract.", ) @@ -88,44 +84,44 @@ class Agreement(models.Model): string="Reference", required=True, default=lambda self: _("New"), - track_visibility="onchange", + tracking=True, copy=False, help="ID used for internal contract tracking.", ) increase_type_id = fields.Many2one( - "agreement.increasetype", + comodel_name="agreement.increasetype", string="Increase Type", - track_visibility="onchange", + tracking=True, help="The amount that certain rates may increase.", ) termination_requested = fields.Date( string="Termination Requested Date", - track_visibility="onchange", + tracking=True, help="Date that a request for termination was received.", ) termination_date = fields.Date( string="Termination Date", - track_visibility="onchange", + tracking=True, help="Date that the contract was terminated.", ) - reviewed_date = fields.Date(string="Reviewed Date", track_visibility="onchange") + reviewed_date = fields.Date(string="Reviewed Date", tracking=True) reviewed_user_id = fields.Many2one( - "res.users", string="Reviewed By", track_visibility="onchange" + comodel_name="res.users", string="Reviewed By", tracking=True ) - approved_date = fields.Date(string="Approved Date", track_visibility="onchange") + approved_date = fields.Date(string="Approved Date", tracking=True) approved_user_id = fields.Many2one( - "res.users", string="Approved By", track_visibility="onchange" + comodel_name="res.users", string="Approved By", tracking=True ) - currency_id = fields.Many2one("res.currency", string="Currency") + currency_id = fields.Many2one(comodel_name="res.currency", string="Currency") partner_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="Partner", required=False, copy=True, help="The customer or vendor this agreement is related to.", ) partner_contact_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="Partner Contact", copy=True, help="The primary partner contact (If Applicable).", @@ -137,7 +133,7 @@ class Agreement(models.Model): related="partner_contact_id.email", string="Partner Email" ) company_contact_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="Company Contact", copy=True, help="The primary contact in the company.", @@ -182,7 +178,7 @@ class Agreement(models.Model): parties = fields.Html( string="Parties", - track_visibility="onchange", + tracking=True, default=_get_default_parties, help="Parties of the agreement", ) @@ -191,87 +187,103 @@ class Agreement(models.Model): string="Dynamic Parties", help="Compute dynamic parties", ) - agreement_type_id = fields.Many2one(track_visibility="onchange",) + agreement_type_id = fields.Many2one(tracking=True) agreement_subtype_id = fields.Many2one( - "agreement.subtype", + comodel_name="agreement.subtype", string="Agreement Sub-type", - track_visibility="onchange", + tracking=True, help="Select the sub-type of this agreement. Sub-Types are related to " "agreement types.", ) - product_ids = fields.Many2many("product.template", string="Products & Services") + product_ids = fields.Many2many( + comodel_name="product.template", string="Products & Services" + ) assigned_user_id = fields.Many2one( - "res.users", + comodel_name="res.users", string="Assigned To", - track_visibility="onchange", + tracking=True, help="Select the user who manages this agreement.", ) company_signed_user_id = fields.Many2one( - "res.users", + comodel_name="res.users", string="Signed By", - track_visibility="onchange", + tracking=True, help="The user at our company who authorized/signed the agreement or " "contract.", ) partner_signed_user_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="Signed By (Partner)", - track_visibility="onchange", + tracking=True, help="Contact on the account that signed the agreement/contract.", ) parent_agreement_id = fields.Many2one( - "agreement", + comodel_name="agreement", string="Parent Agreement", help="Link this agreement to a parent agreement. For example if this " "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", + comodel_name="agreement.renewaltype", string="Renewal Type", - track_visibility="onchange", + tracking=True, help="Describes what happens after the contract expires.", ) recital_ids = fields.One2many( - "agreement.recital", "agreement_id", string="Recitals", copy=True + comodel_name="agreement.recital", + inverse_name="agreement_id", + string="Recitals", + copy=True, ) sections_ids = fields.One2many( - "agreement.section", "agreement_id", string="Sections", copy=True + comodel_name="agreement.section", + inverse_name="agreement_id", + string="Sections", + copy=True, + ) + clauses_ids = fields.One2many( + comodel_name="agreement.clause", inverse_name="agreement_id", string="Clauses" ) - clauses_ids = fields.One2many("agreement.clause", "agreement_id", string="Clauses") appendix_ids = fields.One2many( - "agreement.appendix", "agreement_id", string="Appendices", copy=True + comodel_name="agreement.appendix", + inverse_name="agreement_id", + string="Appendices", + copy=True, ) previous_version_agreements_ids = fields.One2many( - "agreement", - "parent_agreement_id", + comodel_name="agreement", + inverse_name="parent_agreement_id", string="Previous Versions", copy=False, domain=[("active", "=", False)], ) child_agreements_ids = fields.One2many( - "agreement", - "parent_agreement_id", + comodel_name="agreement", + inverse_name="parent_agreement_id", string="Child Agreements", copy=False, domain=[("active", "=", True)], ) line_ids = fields.One2many( - "agreement.line", "agreement_id", string="Products/Services", copy=False + comodel_name="agreement.line", + inverse_name="agreement_id", + string="Products/Services", + copy=False, ) state = fields.Selection( [("draft", "Draft"), ("active", "Active"), ("inactive", "Inactive")], default="draft", - track_visibility="always", + tracking=True, ) notification_address_id = fields.Many2one( - "res.partner", + comodel_name="res.partner", string="Notification Address", help="The address to send notificaitons to, if different from " "customer address.(Address Type = Other)", ) signed_contract_filename = fields.Char(string="Filename") - signed_contract = fields.Binary(string="Signed Document", track_visibility="always") + signed_contract = fields.Binary(string="Signed Document", tracking=True) # Dynamic field editor field_domain = fields.Char( @@ -299,7 +311,6 @@ class Agreement(models.Model): ) # compute the dynamic content for mako expression - @api.multi def _compute_dynamic_description(self): MailTemplates = self.env["mail.template"] for agreement in self: @@ -309,7 +320,6 @@ class Agreement(models.Model): ) agreement.dynamic_description = description - @api.multi def _compute_dynamic_parties(self): MailTemplates = self.env["mail.template"] for agreement in self: @@ -319,7 +329,6 @@ class Agreement(models.Model): ) agreement.dynamic_parties = parties - @api.multi def _compute_dynamic_special_terms(self): MailTemplates = self.env["mail.template"] for agreement in self: @@ -338,16 +347,15 @@ class Agreement(models.Model): return stage_ids stage_id = fields.Many2one( - "agreement.stage", + comodel_name="agreement.stage", string="Stage", group_expand="_read_group_stage_ids", help="Select the current stage of the agreement.", - track_visibility="onchange", + tracking=True, index=True, ) # Create New Version Button - @api.multi def create_new_version(self, vals): for rec in self: if not rec.state == "draft": @@ -394,7 +402,6 @@ class Agreement(models.Model): return super(Agreement, self).create(vals) # Increments the revision on each save action - @api.multi def write(self, vals): res = True for rec in self: diff --git a/agreement_legal/models/agreement_appendix.py b/agreement_legal/models/agreement_appendix.py index 362552ebc..bada56426 100644 --- a/agreement_legal/models/agreement_appendix.py +++ b/agreement_legal/models/agreement_appendix.py @@ -22,7 +22,9 @@ class AgreementAppendix(models.Model): string="Dynamic Content", help="compute dynamic Content", ) - agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade") + agreement_id = fields.Many2one( + comodel_name="agreement", string="Agreement", ondelete="cascade" + ) active = fields.Boolean( string="Active", default=True, @@ -56,7 +58,6 @@ class AgreementAppendix(models.Model): ) # compute the dynamic content for mako expression - @api.multi def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for appendix in self: diff --git a/agreement_legal/models/agreement_clause.py b/agreement_legal/models/agreement_clause.py index 7374aaf2c..8b9af23ae 100644 --- a/agreement_legal/models/agreement_clause.py +++ b/agreement_legal/models/agreement_clause.py @@ -14,9 +14,11 @@ class AgreementClause(models.Model): string="Title", help="The title is displayed on the PDF." "The name is not." ) sequence = fields.Integer(string="Sequence") - agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade") + agreement_id = fields.Many2one( + comodel_name="agreement", string="Agreement", ondelete="cascade" + ) section_id = fields.Many2one( - "agreement.section", string="Section", ondelete="cascade" + comodel_name="agreement.section", string="Section", ondelete="cascade" ) content = fields.Html(string="Clause Content") dynamic_content = fields.Html( @@ -57,7 +59,6 @@ class AgreementClause(models.Model): ) # compute the dynamic content for mako expression - @api.multi def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for clause in self: diff --git a/agreement_legal/models/agreement_line.py b/agreement_legal/models/agreement_line.py index 99e62b516..99f414222 100644 --- a/agreement_legal/models/agreement_line.py +++ b/agreement_legal/models/agreement_line.py @@ -8,11 +8,15 @@ class AgreementLine(models.Model): _name = "agreement.line" _description = "Agreement Lines" - product_id = fields.Many2one("product.product", string="Product") + product_id = fields.Many2one(comodel_name="product.product", string="Product") name = fields.Char(string="Description", required=True) - agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade") + agreement_id = fields.Many2one( + comodel_name="agreement", string="Agreement", ondelete="cascade" + ) qty = fields.Float(string="Quantity") - uom_id = fields.Many2one("uom.uom", string="Unit of Measure", required=True) + uom_id = fields.Many2one( + comodel_name="uom.uom", string="Unit of Measure", required=True + ) @api.onchange("product_id") def _onchange_product_id(self): diff --git a/agreement_legal/models/agreement_recital.py b/agreement_legal/models/agreement_recital.py index 757323a9e..e0c1859be 100644 --- a/agreement_legal/models/agreement_recital.py +++ b/agreement_legal/models/agreement_recital.py @@ -20,7 +20,9 @@ class AgreementRecital(models.Model): string="Dynamic Content", help="compute dynamic Content", ) - agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade") + agreement_id = fields.Many2one( + comodel_name="agreement", string="Agreement", ondelete="cascade" + ) active = fields.Boolean( string="Active", default=True, @@ -54,7 +56,6 @@ class AgreementRecital(models.Model): ) # compute the dynamic content for mako expression - @api.multi def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for recital in self: diff --git a/agreement_legal/models/agreement_section.py b/agreement_legal/models/agreement_section.py index 07f19e342..2372cf01b 100644 --- a/agreement_legal/models/agreement_section.py +++ b/agreement_legal/models/agreement_section.py @@ -14,9 +14,14 @@ class AgreementSection(models.Model): string="Title", help="The title is displayed on the PDF. The name is not." ) sequence = fields.Integer(string="Sequence") - agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade") + agreement_id = fields.Many2one( + comodel_name="agreement", string="Agreement", ondelete="cascade" + ) clauses_ids = fields.One2many( - "agreement.clause", "section_id", string="Clauses", copy=True + comodel_name="agreement.clause", + inverse_name="section_id", + string="Clauses", + copy=True, ) content = fields.Html(string="Section Content") dynamic_content = fields.Html( @@ -57,7 +62,6 @@ class AgreementSection(models.Model): ) # compute the dynamic content for mako expression - @api.multi def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for section in self: diff --git a/agreement_legal/models/agreement_subtype.py b/agreement_legal/models/agreement_subtype.py index 056c061f1..2add7dcd9 100644 --- a/agreement_legal/models/agreement_subtype.py +++ b/agreement_legal/models/agreement_subtype.py @@ -9,4 +9,6 @@ class AgreementSubtype(models.Model): _description = "Agreement Subtypes" name = fields.Char(string="Name", required=True) - agreement_type_id = fields.Many2one("agreement.type", string="Agreement Type") + agreement_type_id = fields.Many2one( + comodel_name="agreement.type", string="Agreement Type" + ) diff --git a/agreement_legal/models/agreement_type.py b/agreement_legal/models/agreement_type.py index 20df56b73..c5bef2b10 100644 --- a/agreement_legal/models/agreement_type.py +++ b/agreement_legal/models/agreement_type.py @@ -9,5 +9,7 @@ class AgreementType(models.Model): _description = "Agreement Types" agreement_subtypes_ids = fields.One2many( - "agreement.subtype", "agreement_type_id", string="Subtypes" + comodel_name="agreement.subtype", + inverse_name="agreement_type_id", + string="Subtypes", ) diff --git a/agreement_legal/models/product_template.py b/agreement_legal/models/product_template.py index 9cf9e2e34..ed9949223 100644 --- a/agreement_legal/models/product_template.py +++ b/agreement_legal/models/product_template.py @@ -7,4 +7,4 @@ from odoo import fields, models class Product(models.Model): _inherit = "product.template" - agreements_ids = fields.Many2many("agreement", string="Agreements") + agreements_ids = fields.Many2many(comodel_name="agreement", string="Agreements") diff --git a/agreement_legal/models/res_partner.py b/agreement_legal/models/res_partner.py index 896c7b0ad..464cf9007 100644 --- a/agreement_legal/models/res_partner.py +++ b/agreement_legal/models/res_partner.py @@ -7,4 +7,6 @@ from odoo import fields, models class Partner(models.Model): _inherit = "res.partner" - agreement_ids = fields.One2many("agreement", "partner_id", string="Agreements") + agreement_ids = fields.One2many( + comodel_name="agreement", inverse_name="partner_id", string="Agreements" + ) diff --git a/agreement_legal/readme/CONTRIBUTORS.rst b/agreement_legal/readme/CONTRIBUTORS.rst index a0afb1231..2528a4f35 100644 --- a/agreement_legal/readme/CONTRIBUTORS.rst +++ b/agreement_legal/readme/CONTRIBUTORS.rst @@ -4,3 +4,7 @@ * Maxime Chambreuil * Sandip Mangukiya * Yves Goldberg + +* `Tecnativa `_: + + * Víctor Martínez diff --git a/agreement_legal/static/src/js/domain_widget_ext.js b/agreement_legal/static/src/js/domain_widget_ext.js index 1b1faf838..9ea1af83a 100644 --- a/agreement_legal/static/src/js/domain_widget_ext.js +++ b/agreement_legal/static/src/js/domain_widget_ext.js @@ -1,12 +1,11 @@ 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; + const basic_fields = require("web.basic_fields"); + const DomainSelector = require("web.DomainSelector"); + const session = require("web.session"); + const core = require("web.core"); + const qweb = core.qweb; basic_fields.FieldDomain.include({ /** @@ -27,6 +26,7 @@ odoo.define("agreement_legal.domain_widget_ext", function(require) { * @override _render from AbstractField * @returns {Deferred} */ + /* eslint-disable no-unused-vars */ _render: function() { // If there is no model, only change the non-domain-selector content if (!this._domainModel) { @@ -35,11 +35,11 @@ odoo.define("agreement_legal.domain_widget_ext", function(require) { } // Convert char value to array value - var value = this.value || "[]"; + const value = this.value || "[]"; // Create the domain selector or change the value of the current // one... - var def; + /* eslint-disable no-negated-condition */ if (!this.domainSelector) { this.domainSelector = new DomainSelector( this, @@ -52,11 +52,12 @@ odoo.define("agreement_legal.domain_widget_ext", function(require) { partialUse: this.partialUse || false, } ); - def = this.domainSelector.prependTo(this.$el); + const def = this.domainSelector.prependTo(this.$el); } else { - def = this.domainSelector.setDomain(value); + const def = this.domainSelector.setDomain(value); } // ... then replace the other content (matched records, etc) + // eslint-disable-next-line no-undef return def.then(this._replaceContent.bind(this)); }, /** diff --git a/agreement_legal/views/agreement.xml b/agreement_legal/views/agreement.xml index 457c07ba3..403ccfe27 100644 --- a/agreement_legal/views/agreement.xml +++ b/agreement_legal/views/agreement.xml @@ -530,7 +530,6 @@ Agreements agreement - form graph,pivot