diff --git a/agreement_legal/__init__.py b/agreement_legal/__init__.py index c8c5c214f..e6104d924 100644 --- a/agreement_legal/__init__.py +++ b/agreement_legal/__init__.py @@ -7,6 +7,8 @@ from . import models def post_init_agreement_legal(cr, registry): env = api.Environment(cr, SUPERUSER_ID, dict()) - cr.execute('UPDATE agreement SET stage_id = %s WHERE stage_id IS NULL;', - (env.ref('agreement_legal.agreement_stage_new').id,)) + cr.execute( + "UPDATE agreement SET stage_id = %s WHERE stage_id IS NULL;", + (env.ref("agreement_legal.agreement_stage_new").id,), + ) return True diff --git a/agreement_legal/__manifest__.py b/agreement_legal/__manifest__.py index 687318cae..58494a765 100644 --- a/agreement_legal/__manifest__.py +++ b/agreement_legal/__manifest__.py @@ -35,17 +35,10 @@ "views/agreement.xml", "views/menu.xml", ], - "demo": [ - "demo/demo.xml" - ], - 'qweb': [ - "static/src/xml/domain_widget_view.xml" - ], + "demo": ["demo/demo.xml"], + "qweb": ["static/src/xml/domain_widget_view.xml"], "post_init_hook": "post_init_agreement_legal", "application": True, "development_status": "Beta", - "maintainers": [ - "max3903", - "ygol" - ], + "maintainers": ["max3903", "ygol"], } diff --git a/agreement_legal/data/agreement_stage.xml b/agreement_legal/data/agreement_stage.xml index 66e399efb..f59013acd 100644 --- a/agreement_legal/data/agreement_stage.xml +++ b/agreement_legal/data/agreement_stage.xml @@ -1,54 +1,45 @@ - + - New 10 agreement - Draft 20 agreement - Reviewed 30 agreement - Negotiation 40 agreement - Out for Customer Signature 50 agreement - Waiting Internal Signature 60 agreement - Active 70 agreement - Expired 80 agreement - Cancelled 100 diff --git a/agreement_legal/data/agreement_type.xml b/agreement_legal/data/agreement_type.xml index 4cdf67618..b0a85e21a 100644 --- a/agreement_legal/data/agreement_type.xml +++ b/agreement_legal/data/agreement_type.xml @@ -1,16 +1,12 @@ - + - Agreement - Contract - Letter of Intent - diff --git a/agreement_legal/data/ir_sequence.xml b/agreement_legal/data/ir_sequence.xml index d2104c559..17eb8f1a1 100644 --- a/agreement_legal/data/ir_sequence.xml +++ b/agreement_legal/data/ir_sequence.xml @@ -1,13 +1,11 @@ - + - Agreements agreement AG 3 - + - diff --git a/agreement_legal/data/module_category.xml b/agreement_legal/data/module_category.xml index d3c2ee7a7..13b4ccf0b 100644 --- a/agreement_legal/data/module_category.xml +++ b/agreement_legal/data/module_category.xml @@ -1,9 +1,7 @@ - + - Agreement 80 - diff --git a/agreement_legal/demo/demo.xml b/agreement_legal/demo/demo.xml index 9edf7dd3b..cab092f59 100644 --- a/agreement_legal/demo/demo.xml +++ b/agreement_legal/demo/demo.xml @@ -1,40 +1,34 @@ - + - - Hardware IT (C2C-IT0042) - + - Fiber access office Lausanne (C2C-IT0043) - + - Vétérinaire (AGR-VETO001) - + - - Wazo IPBX deployment and maintenance (AGR-TEL001) - + Wazo IPBX deployment and maintenance (AGR-TEL001) + - SIP Phones supply (BUY-VOIP012) - + - True SIP-ISDN gateways (BUY-VOIP013) - + - 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 index 57c5df8c6..68df838bf 100644 --- a/agreement_legal/migrations/12.0.2.0.0/post-migration.py +++ b/agreement_legal/migrations/12.0.2.0.0/post-migration.py @@ -6,5 +6,7 @@ def migrate(env, version): if not version: return - env.execute("UPDATE agreement_stage SET stage_type = 'agreement' " - "WHERE stage_type IS NULL;") + 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 43ac34839..63812f7b8 100644 --- a/agreement_legal/models/agreement.py +++ b/agreement_legal/models/agreement.py @@ -14,122 +14,146 @@ class Agreement(models.Model): default=1, copy=False, help="The versions are used to keep track of document history and " - "previous versions can be referenced.") + "previous versions can be referenced.", + ) revision = fields.Integer( string="Revision", default=0, copy=False, - help="The revision will increase with every save event.") + help="The revision will increase with every save event.", + ) description = fields.Text( string="Description", track_visibility="onchange", - help="Description of the agreement") + help="Description of the agreement", + ) dynamic_description = fields.Text( compute="_compute_dynamic_description", string="Dynamic Description", - help="Compute dynamic description") + help="Compute dynamic description", + ) start_date = fields.Date( string="Start Date", track_visibility="onchange", - help="When the agreement starts.") + help="When the agreement starts.", + ) end_date = fields.Date( - string="End Date", - track_visibility="onchange", - help="When the agreement ends.") + string="End Date", track_visibility="onchange", help="When the agreement ends." + ) color = fields.Integer(string="Color") active = fields.Boolean( string="Active", default=True, help="If unchecked, it will allow you to hide the agreement without " - "removing it.") + "removing it.", + ) company_signed_date = fields.Date( string="Signed on", track_visibility="onchange", - help="Date the contract was signed by Company.") + help="Date the contract was signed by Company.", + ) partner_signed_date = fields.Date( string="Signed on (Partner)", track_visibility="onchange", - help="Date the contract was signed by the Partner.") + help="Date the contract was signed by the Partner.", + ) term = fields.Integer( string="Term (Months)", track_visibility="onchange", help="Number of months this agreement/contract is in effect with the " - "partner.") + "partner.", + ) expiration_notice = fields.Integer( string="Exp. Notice (Days)", track_visibility="onchange", - help="Number of Days before expiration to be notified.") + help="Number of Days before expiration to be notified.", + ) change_notice = fields.Integer( string="Change Notice (Days)", track_visibility="onchange", - help="Number of Days to be notified before changes.") + help="Number of Days to be notified before changes.", + ) special_terms = fields.Text( string="Special Terms", track_visibility="onchange", help="Any terms that you have agreed to and want to track on the " - "agreement/contract.") + "agreement/contract.", + ) dynamic_special_terms = fields.Text( compute="_compute_dynamic_special_terms", string="Dynamic Special Terms", - help="Compute dynamic special terms") + help="Compute dynamic special terms", + ) code = fields.Char( string="Reference", required=True, default=lambda self: _("New"), track_visibility="onchange", copy=False, - help="ID used for internal contract tracking.") + help="ID used for internal contract tracking.", + ) increase_type_id = fields.Many2one( "agreement.increasetype", string="Increase Type", track_visibility="onchange", - help="The amount that certain rates may increase.") + help="The amount that certain rates may increase.", + ) termination_requested = fields.Date( string="Termination Requested Date", track_visibility="onchange", - help="Date that a request for termination was received.") + help="Date that a request for termination was received.", + ) termination_date = fields.Date( string="Termination Date", track_visibility="onchange", - help="Date that the contract was terminated.") - reviewed_date = fields.Date( - string="Reviewed Date", track_visibility="onchange") + help="Date that the contract was terminated.", + ) + reviewed_date = fields.Date(string="Reviewed Date", track_visibility="onchange") reviewed_user_id = fields.Many2one( - "res.users", string="Reviewed By", track_visibility="onchange") - approved_date = fields.Date( - string="Approved Date", track_visibility="onchange") + "res.users", string="Reviewed By", track_visibility="onchange" + ) + approved_date = fields.Date(string="Approved Date", track_visibility="onchange") approved_user_id = fields.Many2one( - "res.users", string="Approved By", track_visibility="onchange") + "res.users", string="Approved By", track_visibility="onchange" + ) currency_id = fields.Many2one("res.currency", string="Currency") partner_id = fields.Many2one( "res.partner", string="Partner", required=False, copy=True, - help="The customer or vendor this agreement is related to.") + help="The customer or vendor this agreement is related to.", + ) partner_contact_id = fields.Many2one( "res.partner", string="Partner Contact", copy=True, - help="The primary partner contact (If Applicable).") + help="The primary partner contact (If Applicable).", + ) partner_contact_phone = fields.Char( - related="partner_contact_id.phone", string="Partner Phone") + related="partner_contact_id.phone", string="Partner Phone" + ) partner_contact_email = fields.Char( - related="partner_contact_id.email", string="Partner Email") + related="partner_contact_id.email", string="Partner Email" + ) company_contact_id = fields.Many2one( "res.partner", string="Company Contact", copy=True, - help="The primary contact in the company.") + help="The primary contact in the company.", + ) company_contact_phone = fields.Char( - related="company_contact_id.phone", string="Phone") + related="company_contact_id.phone", string="Phone" + ) company_contact_email = fields.Char( - related="company_contact_id.email", string="Email") + related="company_contact_id.email", string="Email" + ) use_parties_content = fields.Boolean( - string="Use parties content", - help="Use custom content for parties") + string="Use parties content", help="Use custom content for parties" + ) company_partner_id = fields.Many2one( - related="company_id.partner_id", string="Company's Partner") + related="company_id.partner_id", string="Company's Partner" + ) def _get_default_parties(self): deftext = """ @@ -160,97 +184,108 @@ class Agreement(models.Model): string="Parties", track_visibility="onchange", default=_get_default_parties, - help="Parties of the agreement") + help="Parties of the agreement", + ) dynamic_parties = fields.Html( compute="_compute_dynamic_parties", string="Dynamic Parties", - help="Compute dynamic parties") - agreement_type_id = fields.Many2one( - track_visibility="onchange", + help="Compute dynamic parties", ) + agreement_type_id = fields.Many2one(track_visibility="onchange",) agreement_subtype_id = fields.Many2one( "agreement.subtype", string="Agreement Sub-type", track_visibility="onchange", help="Select the sub-type of this agreement. Sub-Types are related to " - "agreement types.") - product_ids = fields.Many2many( - "product.template", string="Products & Services") + "agreement types.", + ) + product_ids = fields.Many2many("product.template", string="Products & Services") assigned_user_id = fields.Many2one( "res.users", string="Assigned To", track_visibility="onchange", - help="Select the user who manages this agreement.") + help="Select the user who manages this agreement.", + ) company_signed_user_id = fields.Many2one( "res.users", string="Signed By", track_visibility="onchange", help="The user at our company who authorized/signed the agreement or " - "contract.") + "contract.", + ) partner_signed_user_id = fields.Many2one( "res.partner", string="Signed By (Partner)", track_visibility="onchange", - help="Contact on the account that signed the agreement/contract.") + help="Contact on the account that signed the agreement/contract.", + ) parent_agreement_id = fields.Many2one( "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.") + "only show other agreements related to the same account.", + ) renewal_type_id = fields.Many2one( "agreement.renewaltype", string="Renewal Type", track_visibility="onchange", - help="Describes what happens after the contract expires.") + help="Describes what happens after the contract expires.", + ) recital_ids = fields.One2many( - "agreement.recital", "agreement_id", string="Recitals", copy=True) + "agreement.recital", "agreement_id", string="Recitals", copy=True + ) sections_ids = fields.One2many( - "agreement.section", "agreement_id", string="Sections", copy=True) - clauses_ids = fields.One2many( - "agreement.clause", "agreement_id", string="Clauses") + "agreement.section", "agreement_id", string="Sections", copy=True + ) + clauses_ids = fields.One2many("agreement.clause", "agreement_id", string="Clauses") appendix_ids = fields.One2many( - "agreement.appendix", "agreement_id", string="Appendices", copy=True) + "agreement.appendix", "agreement_id", string="Appendices", copy=True + ) previous_version_agreements_ids = fields.One2many( "agreement", "parent_agreement_id", string="Previous Versions", copy=False, - domain=[("active", "=", False)]) + domain=[("active", "=", False)], + ) child_agreements_ids = fields.One2many( "agreement", "parent_agreement_id", string="Child Agreements", copy=False, - domain=[("active", "=", True)]) + domain=[("active", "=", True)], + ) line_ids = fields.One2many( - "agreement.line", - "agreement_id", - string="Products/Services", - copy=False) + "agreement.line", "agreement_id", string="Products/Services", copy=False + ) state = fields.Selection( [("draft", "Draft"), ("active", "Active"), ("inactive", "Inactive")], default="draft", - track_visibility="always") + track_visibility="always", + ) notification_address_id = fields.Many2one( "res.partner", string="Notification Address", help="The address to send notificaitons to, if different from " - "customer address.(Address Type = Other)") + "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", track_visibility="always") # Dynamic field editor - field_domain = fields.Char(string='Field Expression', - default='[["active", "=", True]]') + 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_domain", "default_value") def onchange_copyvalue(self): @@ -260,8 +295,8 @@ class Agreement(models.Model): if string_list: field_domain = string_list[0][3:-1] self.copyvalue = "${{object.{} or {}}}".format( - field_domain, - self.default_value or "''") + field_domain, self.default_value or "''" + ) # compute the dynamic content for mako expression @api.multi @@ -269,9 +304,7 @@ class Agreement(models.Model): 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( + description = MailTemplates.with_context(lang=lang)._render_template( agreement.description, "agreement", agreement.id ) agreement.dynamic_description = description @@ -281,9 +314,7 @@ class Agreement(models.Model): MailTemplates = self.env["mail.template"] for agreement in self: lang = agreement.partner_id.lang or "en_US" - parties = MailTemplates.with_context( - lang=lang - )._render_template( + parties = MailTemplates.with_context(lang=lang)._render_template( agreement.parties, "agreement", agreement.id ) agreement.dynamic_parties = parties @@ -293,9 +324,7 @@ class Agreement(models.Model): MailTemplates = self.env["mail.template"] for agreement in self: lang = agreement.partner_id.lang or "en_US" - special_terms = MailTemplates.with_context( - lang=lang - )._render_template( + special_terms = MailTemplates.with_context(lang=lang)._render_template( agreement.special_terms, "agreement", agreement.id ) agreement.dynamic_special_terms = special_terms @@ -304,7 +333,8 @@ class Agreement(models.Model): @api.model def _read_group_stage_ids(self, stages, domain, order): stage_ids = self.env["agreement.stage"].search( - [('stage_type', '=', 'agreement')]) + [("stage_type", "=", "agreement")] + ) return stage_ids stage_id = fields.Many2one( @@ -313,7 +343,8 @@ class Agreement(models.Model): group_expand="_read_group_stage_ids", help="Select the current stage of the agreement.", track_visibility="onchange", - index=True) + index=True, + ) # Create New Version Button @api.multi @@ -345,7 +376,7 @@ class Agreement(models.Model): "stage_id": self.env.ref("agreement_legal.agreement_stage_new").id, } res = self.copy(default=default_vals) - res.sections_ids.mapped('clauses_ids').write({'agreement_id': res.id}) + res.sections_ids.mapped("clauses_ids").write({"agreement_id": res.id}) return { "res_model": "agreement", "type": "ir.actions.act_window", @@ -357,12 +388,9 @@ class Agreement(models.Model): @api.model def create(self, vals): 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["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 return super(Agreement, self).create(vals) # Increments the revision on each save action diff --git a/agreement_legal/models/agreement_appendix.py b/agreement_legal/models/agreement_appendix.py index 5e7fe410a..362552ebc 100644 --- a/agreement_legal/models/agreement_appendix.py +++ b/agreement_legal/models/agreement_appendix.py @@ -15,19 +15,14 @@ class AgreementAppendix(models.Model): required=True, help="The title is displayed on the PDF." "The name is not.", ) - sequence = fields.Integer( - string="Sequence", - default=10) + 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", ) - agreement_id = fields.Many2one( - "agreement", - string="Agreement", - ondelete="cascade") + agreement_id = fields.Many2one("agreement", string="Agreement", ondelete="cascade") active = fields.Boolean( string="Active", default=True, @@ -36,15 +31,18 @@ class AgreementAppendix(models.Model): ) # Dynamic field editor - field_domain = fields.Char(string='Field Expression', - default='[["active", "=", True]]') + 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_domain", "default_value") def onchange_copyvalue(self): @@ -54,8 +52,8 @@ class AgreementAppendix(models.Model): if string_list: field_domain = string_list[0][3:-1] self.copyvalue = "${{object.{} or {}}}".format( - field_domain, - self.default_value or "''") + 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 02cbfc571..7374aaf2c 100644 --- a/agreement_legal/models/agreement_clause.py +++ b/agreement_legal/models/agreement_clause.py @@ -11,38 +11,39 @@ class AgreementClause(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.") + 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("agreement", string="Agreement", ondelete="cascade") section_id = fields.Many2one( - "agreement.section", - string="Section", - ondelete="cascade") + "agreement.section", string="Section", ondelete="cascade" + ) content = fields.Html(string="Clause Content") dynamic_content = fields.Html( compute="_compute_dynamic_content", string="Dynamic Content", - help="compute dynamic Content") + help="compute dynamic Content", + ) active = fields.Boolean( string="Active", default=True, help="If unchecked, it will allow you to hide the agreement without " - "removing it.") + "removing it.", + ) # Dynamic field editor - field_domain = fields.Char(string='Field Expression', - default='[["active", "=", True]]') + 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_domain", "default_value") def onchange_copyvalue(self): @@ -52,8 +53,8 @@ class AgreementClause(models.Model): if string_list: field_domain = string_list[0][3:-1] self.copyvalue = "${{object.{} or {}}}".format( - field_domain, - self.default_value or "''") + field_domain, self.default_value or "''" + ) # compute the dynamic content for mako expression @api.multi @@ -61,9 +62,7 @@ class AgreementClause(models.Model): MailTemplates = self.env["mail.template"] for clause in self: lang = ( - clause.agreement_id - and clause.agreement_id.partner_id.lang - or "en_US" + clause.agreement_id and clause.agreement_id.partner_id.lang or "en_US" ) content = MailTemplates.with_context(lang=lang)._render_template( clause.content, "agreement.clause", clause.id diff --git a/agreement_legal/models/agreement_increasetype.py b/agreement_legal/models/agreement_increasetype.py index 094168c15..e3fc62f3f 100644 --- a/agreement_legal/models/agreement_increasetype.py +++ b/agreement_legal/models/agreement_increasetype.py @@ -17,11 +17,8 @@ class AgreementIncreaseType(models.Model): "the contract.", ) description = fields.Text( - string="Description", - required=True, - help="Description of the renewal type." + string="Description", required=True, help="Description of the renewal type." ) increase_percent = fields.Integer( - string="Increase Percentage", - help="Percentage that the amount will increase." + string="Increase Percentage", help="Percentage that the amount will increase." ) diff --git a/agreement_legal/models/agreement_line.py b/agreement_legal/models/agreement_line.py index 3960681f3..99e62b516 100644 --- a/agreement_legal/models/agreement_line.py +++ b/agreement_legal/models/agreement_line.py @@ -8,21 +8,11 @@ class AgreementLine(models.Model): _name = "agreement.line" _description = "Agreement Lines" - product_id = fields.Many2one( - "product.product", - string="Product") - name = fields.Char( - string="Description", - required=True) - agreement_id = fields.Many2one( - "agreement", - string="Agreement", - ondelete="cascade") + product_id = fields.Many2one("product.product", string="Product") + name = fields.Char(string="Description", required=True) + agreement_id = fields.Many2one("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("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 74a814ce0..757323a9e 100644 --- a/agreement_legal/models/agreement_recital.py +++ b/agreement_legal/models/agreement_recital.py @@ -11,32 +11,36 @@ 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.") + string="Title", 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") - agreement_id = fields.Many2one( - "agreement", string="Agreement", ondelete="cascade") + help="compute dynamic Content", + ) + agreement_id = fields.Many2one("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_domain = fields.Char(string='Field Expression', - default='[["active", "=", True]]') + 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_domain", "default_value") def onchange_copyvalue(self): @@ -46,8 +50,8 @@ class AgreementRecital(models.Model): if string_list: field_domain = string_list[0][3:-1] self.copyvalue = "${{object.{} or {}}}".format( - field_domain, - self.default_value or "''") + field_domain, self.default_value or "''" + ) # compute the dynamic content for mako expression @api.multi @@ -55,9 +59,9 @@ class AgreementRecital(models.Model): MailTemplates = self.env["mail.template"] for recital in self: lang = ( - recital.agreement_id - and recital.agreement_id.partner_id.lang - or "en_US") + recital.agreement_id and recital.agreement_id.partner_id.lang 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_renewaltype.py b/agreement_legal/models/agreement_renewaltype.py index ee03893c8..fd8694e3c 100644 --- a/agreement_legal/models/agreement_renewaltype.py +++ b/agreement_legal/models/agreement_renewaltype.py @@ -17,7 +17,5 @@ class AgreementRenewalType(models.Model): "agreement/contract expires.", ) description = fields.Text( - string="Description", - required=True, - help="Description of the renewal type." + 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 4ac9f639f..07f19e342 100644 --- a/agreement_legal/models/agreement_section.py +++ b/agreement_legal/models/agreement_section.py @@ -11,34 +11,39 @@ class AgreementSection(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.") + 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("agreement", string="Agreement", ondelete="cascade") clauses_ids = fields.One2many( - "agreement.clause", "section_id", string="Clauses", copy=True) + "agreement.clause", "section_id", string="Clauses", copy=True + ) content = fields.Html(string="Section Content") dynamic_content = fields.Html( compute="_compute_dynamic_content", string="Dynamic Content", - help="compute dynamic Content") + help="compute dynamic Content", + ) active = fields.Boolean( string="Active", default=True, help="If unchecked, it will allow you to hide the agreement without " - "removing it.") + "removing it.", + ) # Dynamic field editor - field_domain = fields.Char(string='Field Expression', - default='[["active", "=", True]]') + 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_domain", "default_value") def onchange_copyvalue(self): @@ -48,16 +53,18 @@ class AgreementSection(models.Model): if string_list: field_domain = string_list[0][3:-1] self.copyvalue = "${{object.{} or {}}}".format( - field_domain, - self.default_value or "''") + field_domain, self.default_value or "''" + ) # compute the dynamic content for mako expression @api.multi def _compute_dynamic_content(self): MailTemplates = self.env["mail.template"] for section in self: - lang = (section.agreement_id and - section.agreement_id.partner_id.lang or "en_US") + lang = ( + section.agreement_id and section.agreement_id.partner_id.lang or "en_US" + ) content = MailTemplates.with_context(lang=lang)._render_template( - section.content, "agreement.section", section.id) + section.content, "agreement.section", section.id + ) section.dynamic_content = content diff --git a/agreement_legal/models/agreement_stage.py b/agreement_legal/models/agreement_stage.py index 2c42106f2..874c2d0b4 100644 --- a/agreement_legal/models/agreement_stage.py +++ b/agreement_legal/models/agreement_stage.py @@ -11,21 +11,14 @@ class AgreementStage(models.Model): _order = "sequence" # 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) + 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", required=False, help="This stage is folded in the kanban view by default.", ) stage_type = fields.Selection( - [('agreement', 'Agreement')], - string='Type', required=True) + [("agreement", "Agreement")], string="Type", required=True + ) diff --git a/agreement_legal/models/agreement_subtype.py b/agreement_legal/models/agreement_subtype.py index 961be0883..056c061f1 100644 --- a/agreement_legal/models/agreement_subtype.py +++ b/agreement_legal/models/agreement_subtype.py @@ -9,6 +9,4 @@ 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("agreement.type", string="Agreement Type") diff --git a/agreement_legal/models/agreement_type.py b/agreement_legal/models/agreement_type.py index 13fc862a2..20df56b73 100644 --- a/agreement_legal/models/agreement_type.py +++ b/agreement_legal/models/agreement_type.py @@ -9,7 +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="Subtypes" ) diff --git a/agreement_legal/models/product_template.py b/agreement_legal/models/product_template.py index 3c3b6e9ee..9cf9e2e34 100644 --- a/agreement_legal/models/product_template.py +++ b/agreement_legal/models/product_template.py @@ -7,6 +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("agreement", string="Agreements") diff --git a/agreement_legal/models/res_config_settings.py b/agreement_legal/models/res_config_settings.py index 63b9205b3..63de86be9 100644 --- a/agreement_legal/models/res_config_settings.py +++ b/agreement_legal/models/res_config_settings.py @@ -19,8 +19,7 @@ class ResConfigSettings(models.TransientModel): module_agreement_repair = fields.Boolean( string="Link your repair orders to an agreement." ) - module_agreement_rma = fields.Boolean( - string="Link your RMAs to an agreement.") + module_agreement_rma = fields.Boolean(string="Link your RMAs to an agreement.") module_agreement_sale = fields.Boolean( string="Create an agreement when the sale order is confirmed." ) diff --git a/agreement_legal/models/res_partner.py b/agreement_legal/models/res_partner.py index 66f42bce7..896c7b0ad 100644 --- a/agreement_legal/models/res_partner.py +++ b/agreement_legal/models/res_partner.py @@ -7,7 +7,4 @@ 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("agreement", "partner_id", string="Agreements") diff --git a/agreement_legal/report/agreement.xml b/agreement_legal/report/agreement.xml index 5688ae3eb..d9a62f6fd 100644 --- a/agreement_legal/report/agreement.xml +++ b/agreement_legal/report/agreement.xml @@ -1,54 +1,61 @@ - + - - + id="partner_agreement_contract_document" + model="agreement" + string="Contract Document" + name="agreement_legal.report_agreement_document" + file="agreement_legal.report_agreement_document" + report_type="qweb-pdf" + /> - + id="partner_agreement_contract_document_preview" + model="agreement" + string="Contract Document Preview" + name="agreement_legal.report_agreement_document" + file="agreement_legal.report_agreement_document" + report_type="qweb-html" + /> - diff --git a/agreement_legal/security/res_groups.xml b/agreement_legal/security/res_groups.xml index 83003e648..49bdfc0b2 100644 --- a/agreement_legal/security/res_groups.xml +++ b/agreement_legal/security/res_groups.xml @@ -1,30 +1,32 @@ - + - Agreement - 17 - - + Agreement + 17 + Read-Only Users - - + + - User - - + + - Manager - - - + + + - diff --git a/agreement_legal/static/src/js/domain_widget_ext.js b/agreement_legal/static/src/js/domain_widget_ext.js index adfedb431..1b1faf838 100644 --- a/agreement_legal/static/src/js/domain_widget_ext.js +++ b/agreement_legal/static/src/js/domain_widget_ext.js @@ -1,10 +1,10 @@ -odoo.define('agreement_legal.domain_widget_ext', function (require) { - 'use strict'; +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 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; @@ -12,22 +12,22 @@ odoo.define('agreement_legal.domain_widget_ext', function (require) { /** * Init */ - init : function () { + 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 () { + _render: function() { // If there is no model, only change the non-domain-selector content if (!this._domainModel) { this._replaceContent(); @@ -42,12 +42,16 @@ odoo.define('agreement_legal.domain_widget_ext', function (require) { var def; if (!this.domainSelector) { this.domainSelector = new DomainSelector( - this, this._domainModel, value, { + 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); @@ -63,17 +67,19 @@ odoo.define('agreement_legal.domain_widget_ext', function (require) { * * @private */ - _replaceContent: function () { + _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 = $( + qweb.render("FieldDomain.content", { + hasModel: Boolean(this._domainModel), + isValid: Boolean(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 index 426942532..f37a663ba 100644 --- a/agreement_legal/static/src/xml/domain_widget_view.xml +++ b/agreement_legal/static/src/xml/domain_widget_view.xml @@ -1,4 +1,4 @@ - + @@ -18,114 +18,205 @@
- - - - Invalid domain - - + Invalid domain +
Select a model to add a filter.
- -
+
SMatch all records - +
- Please navigate below and select field: + 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 the following rule: Match records with - + of the following rules:
- -
+
- -
-