diff --git a/__manifest__.py b/__manifest__.py
index de3da9c..225a926 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -23,10 +23,11 @@
],
'data': [
- # 'security/ir.model.access.csv',
+ 'security/ir.model.access.csv',
# 'views/templates.xml',
- 'views/res_partner.xml',
'views/res_partner_contract.xml',
+ 'views/res_partner.xml',
'views/contract_wizard.xml',
+ 'data/fields_default.xml',
],
}
diff --git a/data/fields_default.xml b/data/fields_default.xml
new file mode 100644
index 0000000..33cacb1
--- /dev/null
+++ b/data/fields_default.xml
@@ -0,0 +1,219 @@
+
+
+
+
+
+
+ Generate Context for Contract
+
+ code
+
+self = records
+
+# ctx keys must be decalared in this xml
+ctx = {
+ "contract_number":"--1",
+ "amount_whole":"",
+ "amount_fractional":"",
+
+ "seller_company_name":"Test Company Name",
+ "seller_business_address":"",
+ "seller_representer_name":"",
+ "seller_representer_name_parent":"",
+ "seller_representer_name_initials":"",
+ "seller_representer_function":"",
+ "seller_inn":"",
+ "seller_kpp":"",
+ "seller_bic":"",
+ "seller_ogrn":"",
+ "seller_bank":"",
+ "seller_bank_account":"",
+ "seller_phone":"",
+
+ "partner_company_name":"",
+ "partner_business_address":"",
+ "partner_representer_name":"",
+ "partner_representer_name_parent":"",
+ "partner_representer_name_initials":"",
+ "partner_representer_function":"",
+ "partner_inn":"",
+ "partner_kpp":"",
+ "partner_bic":"",
+ "partner_ogrn":"",
+ "partner_bank":"",
+ "partner_bank_account":"",
+ "partner_phone":"",
+}
+action = ctx
+
+
+
+
+
+
+
+ Contract Number
+ contract_number
+
+
+
+ Amount Whole Part
+ amount_whole
+
+
+
+ Amount Fractional Part
+ amount_fractional
+
+
+
+
+
+
+ Seller Company Name
+ seller_company_name
+
+
+
+ Seller Business Address
+ seller_business_address
+
+
+
+ Seller Representer Name
+ seller_representer_name
+
+
+
+
+ Seller Representer Parent Name
+ seller_representer_name_parent
+
+
+
+
+ Seller Representer Initials Name
+ seller_representer_name_initials
+
+
+
+
+ Seller Representer Function
+ seller_representer_function
+
+
+
+ Seller INN
+ seller_inn
+
+
+
+ Seller KPP
+ seller_kpp
+
+
+
+ Seller BIC
+ seller_bic
+
+
+
+ Seller OGRN
+ seller_ogrn
+
+
+
+ Seller Bank Name
+ seller_bank
+
+
+
+ Seller Bank Account
+ seller_bank_account
+
+
+
+ Seller Phone
+ seller_phone
+
+
+
+
+
+
+ Partner Company Name
+ partner_company_name
+
+
+
+ Partner Business Address
+ partner_business_address
+
+
+
+ Partner Representer Name
+ partner_representer_name
+
+
+
+
+ Partner Representer Parent Name
+ partner_representer_name_parent
+
+
+
+
+ Partner Representer Initials Name
+ partner_representer_name_initials
+
+
+
+
+ Partner Representer Function
+ partner_representer_function
+
+
+
+ Partner INN
+ partner_inn
+
+
+
+ Partner KPP
+ partner_kpp
+
+
+
+ Partner BIC
+ partner_bic
+
+
+
+ Partner OGRN
+ partner_ogrn
+
+
+
+ Partner Bank Name
+ partner_bank
+
+
+
+ Partner Bank Account
+ partner_bank_account
+
+
+
+ Partner Phone
+ partner_phone
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/models/__init__.py b/models/__init__.py
index 5f8738b..acb416b 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,6 +1,8 @@
from . import contract_wizard
from . import res_partner
from . import res_partner_contract
+from . import res_partner_contract_field
+from . import res_partner_contract_field_transient
from . import sale_order
# TODO: rename all fields ilike 'adress' -> 'address'
diff --git a/models/contract_wizard.py b/models/contract_wizard.py
index 9a84ac2..a63e428 100644
--- a/models/contract_wizard.py
+++ b/models/contract_wizard.py
@@ -4,6 +4,7 @@ import math
from datetime import datetime
from odoo import api, fields, models
+from odoo.exceptions import UserError
from pytils import numeral
from ..utils.docxtpl import get_document_from_values_stream
@@ -246,6 +247,12 @@ class ContractWizard(models.TransientModel):
default='company'
)
+ transient_field_ids = fields.One2many(
+ 'res.partner.contract.field.transient',
+ '_contract_wizard_id',
+ string="Contract Fields",
+ )
+
@api.depends('contract_id')
def _compute_context_name(self):
self._context_name = self.contract_id.name
@@ -500,11 +507,43 @@ class ContractWizard(models.TransientModel):
}
return context
+ @api.onchange('partner_id')
+ def _onchange_partner_id(self):
+ """Creates transient fields for generate contract template
+ Looks as a tree view of *_contract_field_transient model in xml
+ """
+ def get_contract_field(technical_name):
+ return self.env['res.partner.contract.field'].search([
+ ('technical_name', '=', technical_name),
+ ])
+
+ contract_context_values = self.env.ref(
+ 'client_contracts.action_get_context').run()
+
+ self.transient_field_ids = [ # one2many
+ (
+ 4,
+ self.env['res.partner.contract.field.transient'].create({
+ "contract_field_id": get_contract_field(field).id,
+ "value": value,
+ }).id,
+ 0,
+ ) for field, value in contract_context_values.items()
+ ]
+
def get_docx_contract(self):
template = self.template.attachment_id
+ if not template:
+ raise UserError("Template must be set up")
+
path_to_template = template._full_path(template.store_fname)
- fields = self._generate_context()
+ fields = {
+ transient_field.technical_name: transient_field.value
+ for transient_field
+ in self.transient_field_ids
+ if transient_field.technical_name
+ }
binary_data = get_document_from_values_stream(
path_to_template, fields).read()
diff --git a/models/res_partner_contract_field.py b/models/res_partner_contract_field.py
new file mode 100644
index 0000000..2185bd6
--- /dev/null
+++ b/models/res_partner_contract_field.py
@@ -0,0 +1,22 @@
+from odoo import fields, models
+
+
+class ContractField(models.Model):
+ _name = "res.partner.contract.field"
+ _description = "Contract Field"
+
+ description = fields.Char(
+ string="Description",
+ translate=True,
+ default="",
+ )
+ name = fields.Char(
+ string="Name",
+ required=True,
+ translate=True,
+ )
+ technical_name = fields.Char(
+ string="Technical Name",
+ help="Name uses in template",
+ required=True,
+ )
diff --git a/models/res_partner_contract_field_transient.py b/models/res_partner_contract_field_transient.py
new file mode 100644
index 0000000..dc638c2
--- /dev/null
+++ b/models/res_partner_contract_field_transient.py
@@ -0,0 +1,39 @@
+from odoo import api, fields, models
+
+
+class ContractFieldTransient(models.TransientModel):
+ _name = "res.partner.contract.field.transient"
+ _description = "Contract Field Transient"
+
+ _contract_wizard_id = fields.Many2one(
+ 'res.partner.contract.wizard',
+ string='Contract',
+ readonly=True,
+ )
+ contract_field_id = fields.Many2one(
+ "res.partner.contract.field",
+ string="Field",
+ )
+ technical_name = fields.Char(
+ string="Technical Name",
+ )
+ name = fields.Char(
+ string="Name",
+ )
+ description = fields.Char(
+ string="Description",
+ )
+ value = fields.Char(
+ string="Value",
+ default="",
+ )
+
+ @api.model
+ def create(self, values):
+ res = super().create(values)
+
+ res.technical_name = res.contract_field_id.technical_name
+ res.name = res.contract_field_id.name
+ res.description = res.contract_field_id.description
+
+ return res
diff --git a/views/contract_wizard.xml b/views/contract_wizard.xml
index 9426f13..032a171 100644
--- a/views/contract_wizard.xml
+++ b/views/contract_wizard.xml
@@ -70,44 +70,14 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+