[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': [
# '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',
],
}

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

View File

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

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>
</field>
<group string="Contract values">
<group string="Contract">
<field name="_context_name"/>
<field name="_context_date"/>
<field name="_context_summ_rub"/>
<field name="_context_summ_rub_word"/>
<field name="_context_summ_kop"/>
<field name="_context_summ_word"/>
<field name="_context_delivery_term"/>
<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>
<field name="transient_field_ids">
<tree>
<field name="technical_name"/>
<field name="name"/>
<field name="value"/>
<field name="description"/>
</tree>
</field>
</group>
</group>
<button string="Form DOCX from template" type="object" name="get_docx_contract" />