[ADD] contract_field model, contract_field_transient_model, default_fields, transient field view inside a contract wizard, generate contract using transient fields, usererror when has no template

This commit is contained in:
Stepan Savelyev 2019-12-10 16:27:36 +05:00
parent e313d822ab
commit 0dce76ae93
7 changed files with 333 additions and 41 deletions

View File

@ -23,10 +23,11 @@
], ],
'data': [ 'data': [
# 'security/ir.model.access.csv', 'security/ir.model.access.csv',
# 'views/templates.xml', # 'views/templates.xml',
'views/res_partner.xml',
'views/res_partner_contract.xml', 'views/res_partner_contract.xml',
'views/res_partner.xml',
'views/contract_wizard.xml', 'views/contract_wizard.xml',
'data/fields_default.xml',
], ],
} }

219
data/fields_default.xml Normal file
View File

@ -0,0 +1,219 @@
<?xml version='1.0' encoding='utf-8'?>
<odoo>
<data>
<!-- Action -->
<record id="action_get_context" model="ir.actions.server">
<field name="name">Generate Context for Contract</field>
<field name="model_id" ref="client_contracts.model_res_partner_contract_wizard"/>
<field name="state">code</field>
<field name="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
</field>
</record>
<!-- Common fields -->
<record id="contract_field_contract_number" model="res.partner.contract.field">
<field name="name">Contract Number</field>
<field name="technical_name">contract_number</field>
</record>
<record id="contract_field_amount_whole" model="res.partner.contract.field">
<field name="name">Amount Whole Part</field>
<field name="technical_name">amount_whole</field>
</record>
<record id="contract_field_amount_fractional" model="res.partner.contract.field">
<field name="name">Amount Fractional Part</field>
<field name="technical_name">amount_fractional</field>
</record>
<!-- Seller -->
<record id="contract_field_seller_company_name" model="res.partner.contract.field">
<field name="name">Seller Company Name</field>
<field name="technical_name">seller_company_name</field>
</record>
<record id="contract_field_seller_business_address" model="res.partner.contract.field">
<field name="name">Seller Business Address</field>
<field name="technical_name">seller_business_address</field>
</record>
<record id="contract_field_seller_representer_name" model="res.partner.contract.field">
<field name="name">Seller Representer Name</field>
<field name="technical_name">seller_representer_name</field>
<field name="description"></field>
</record>
<record id="contract_field_seller_representer_name_parent" model="res.partner.contract.field">
<field name="name">Seller Representer Parent Name</field>
<field name="technical_name">seller_representer_name_parent</field>
<field name="description"></field>
</record>
<record id="contract_field_seller_representer_name_initials" model="res.partner.contract.field">
<field name="name">Seller Representer Initials Name</field>
<field name="technical_name">seller_representer_name_initials</field>
<field name="description"></field>
</record>
<record id="contract_field_seller_representer_function" model="res.partner.contract.field">
<field name="name">Seller Representer Function</field>
<field name="technical_name">seller_representer_function</field>
</record>
<record id="contract_field_seller_inn" model="res.partner.contract.field">
<field name="name">Seller INN</field>
<field name="technical_name">seller_inn</field>
</record>
<record id="contract_field_seller_kpp" model="res.partner.contract.field">
<field name="name">Seller KPP</field>
<field name="technical_name">seller_kpp</field>
</record>
<record id="contract_field_seller_bic" model="res.partner.contract.field">
<field name="name">Seller BIC</field>
<field name="technical_name">seller_bic</field>
</record>
<record id="contract_field_seller_ogrn" model="res.partner.contract.field">
<field name="name">Seller OGRN</field>
<field name="technical_name">seller_ogrn</field>
</record>
<record id="contract_field_seller_bank" model="res.partner.contract.field">
<field name="name">Seller Bank Name</field>
<field name="technical_name">seller_bank</field>
</record>
<record id="contract_field_seller_bank_account" model="res.partner.contract.field">
<field name="name">Seller Bank Account</field>
<field name="technical_name">seller_bank_account</field>
</record>
<record id="contract_field_seller_phone" model="res.partner.contract.field">
<field name="name">Seller Phone</field>
<field name="technical_name">seller_phone</field>
</record>
<!-- Partner -->
<record id="contract_field_partner_company_name" model="res.partner.contract.field">
<field name="name">Partner Company Name</field>
<field name="technical_name">partner_company_name</field>
</record>
<record id="contract_field_partner_business_address" model="res.partner.contract.field">
<field name="name">Partner Business Address</field>
<field name="technical_name">partner_business_address</field>
</record>
<record id="contract_field_partner_representer_name" model="res.partner.contract.field">
<field name="name">Partner Representer Name</field>
<field name="technical_name">partner_representer_name</field>
<field name="description"></field>
</record>
<record id="contract_field_partner_representer_name_parent" model="res.partner.contract.field">
<field name="name">Partner Representer Parent Name</field>
<field name="technical_name">partner_representer_name_parent</field>
<field name="description"></field>
</record>
<record id="contract_field_partner_representer_name_initials" model="res.partner.contract.field">
<field name="name">Partner Representer Initials Name</field>
<field name="technical_name">partner_representer_name_initials</field>
<field name="description"></field>
</record>
<record id="contract_field_partner_representer_function" model="res.partner.contract.field">
<field name="name">Partner Representer Function</field>
<field name="technical_name">partner_representer_function</field>
</record>
<record id="contract_field_partner_inn" model="res.partner.contract.field">
<field name="name">Partner INN</field>
<field name="technical_name">partner_inn</field>
</record>
<record id="contract_field_partner_kpp" model="res.partner.contract.field">
<field name="name">Partner KPP</field>
<field name="technical_name">partner_kpp</field>
</record>
<record id="contract_field_partner_bic" model="res.partner.contract.field">
<field name="name">Partner BIC</field>
<field name="technical_name">partner_bic</field>
</record>
<record id="contract_field_partner_ogrn" model="res.partner.contract.field">
<field name="name">Partner OGRN</field>
<field name="technical_name">partner_ogrn</field>
</record>
<record id="contract_field_partner_bank" model="res.partner.contract.field">
<field name="name">Partner Bank Name</field>
<field name="technical_name">partner_bank</field>
</record>
<record id="contract_field_partner_bank_account" model="res.partner.contract.field">
<field name="name">Partner Bank Account</field>
<field name="technical_name">partner_bank_account</field>
</record>
<record id="contract_field_partner_phone" model="res.partner.contract.field">
<field name="name">Partner Phone</field>
<field name="technical_name">partner_phone</field>
</record>
<!-- <record id="" model="res.partner.contract.field">
<field name="name"></field>
<field name="technical_name"></field>
</record> -->
</data>
</odoo>

View File

@ -1,6 +1,8 @@
from . import contract_wizard from . import contract_wizard
from . import res_partner from . import res_partner
from . import res_partner_contract from . import res_partner_contract
from . import res_partner_contract_field
from . import res_partner_contract_field_transient
from . import sale_order from . import sale_order
# TODO: rename all fields ilike 'adress' -> 'address' # TODO: rename all fields ilike 'adress' -> 'address'

View File

@ -4,6 +4,7 @@ import math
from datetime import datetime from datetime import datetime
from odoo import api, fields, models from odoo import api, fields, models
from odoo.exceptions import UserError
from pytils import numeral from pytils import numeral
from ..utils.docxtpl import get_document_from_values_stream from ..utils.docxtpl import get_document_from_values_stream
@ -246,6 +247,12 @@ class ContractWizard(models.TransientModel):
default='company' default='company'
) )
transient_field_ids = fields.One2many(
'res.partner.contract.field.transient',
'_contract_wizard_id',
string="Contract Fields",
)
@api.depends('contract_id') @api.depends('contract_id')
def _compute_context_name(self): def _compute_context_name(self):
self._context_name = self.contract_id.name self._context_name = self.contract_id.name
@ -500,11 +507,43 @@ class ContractWizard(models.TransientModel):
} }
return context 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): def get_docx_contract(self):
template = self.template.attachment_id template = self.template.attachment_id
if not template:
raise UserError("Template must be set up")
path_to_template = template._full_path(template.store_fname) 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( binary_data = get_document_from_values_stream(
path_to_template, fields).read() path_to_template, fields).read()

View File

@ -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,
)

View File

@ -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

View File

@ -70,44 +70,14 @@
</tree> </tree>
</field> </field>
<group string="Contract values"> <group string="Contract values">
<group string="Contract"> <field name="transient_field_ids">
<field name="_context_name"/> <tree>
<field name="_context_date"/> <field name="technical_name"/>
<field name="_context_summ_rub"/> <field name="name"/>
<field name="_context_summ_rub_word"/> <field name="value"/>
<field name="_context_summ_kop"/> <field name="description"/>
<field name="_context_summ_word"/> </tree>
<field name="_context_delivery_term"/> </field>
<field name="_context_delivery_term_word"/>
<field name="_context_payment_term"/>
<field name="_context_payment_term_word"/>
</group>
<group string="Company values">
<field name="_context_seller_contract_name"/>
<field name="_context_seller_adress"/>
<field name="_context_seller_representer_contract_job_name"/>
<field name="_context_seller_representer_contract_name"/>
<field name="_context_seller_inn"/>
<field name="_context_seller_kpp"/>
<field name="_context_seller_rs"/>
<field name="_context_seller_bik"/>
<field name="_context_seller_bank"/>
<field name="_context_seller_phone"/>
<field name="_context_seller_representer_job_name"/>
<field name="_context_seller_representer_name"/>
</group>
<group string="Partner values">
<field name="_context_partner_contract_name"/>
<field name="_context_partner_adress"/>
<field name="_context_partner_representer_contract_name"/>
<field name="_context_partner_inn"/>
<field name="_context_partner_kpp"/>
<field name="_context_partner_rs"/>
<field name="_context_partner_bik"/>
<field name="_context_partner_bank"/>
<field name="_context_partner_phone"/>
<field name="_context_partner_representer_name"/>
</group>
</group> </group>
</group> </group>
<button string="Form DOCX from template" type="object" name="get_docx_contract" /> <button string="Form DOCX from template" type="object" name="get_docx_contract" />