From bf46d26287fec4589407e46bcc76bd31bd80567d Mon Sep 17 00:00:00 2001 From: "alexandr.uritskiy" Date: Thu, 6 May 2021 18:53:42 +0500 Subject: [PATCH] looks like working --- __manifest__.py | 2 +- models/res_partner_contract.py | 11 +- models/res_partner_contract_annex.py | 27 ++- models/res_partner_contract_field.py | 5 +- security/ir.model.access.csv | 5 +- utils/contract_context_values.py | 312 -------------------------- utils/misc.py | 4 +- utils/num2words.py | 9 +- views/res_partner_contract.xml | 8 +- wizard/res_partner_contract_wizard.py | 67 +++++- 10 files changed, 103 insertions(+), 347 deletions(-) delete mode 100644 utils/contract_context_values.py diff --git a/__manifest__.py b/__manifest__.py index 9323ed5..4995f1a 100755 --- a/__manifest__.py +++ b/__manifest__.py @@ -11,7 +11,7 @@ "category": "Invoicing & Payments", "version": "14.0.1.0.0", "depends": ["base", "contacts", "hr", "l10n_ru", "sale", "sale_margin"], - "external_dependencies": {"python": ["docxtpl"]}, + "external_dependencies": {"python": ["docxtpl", "num2words"]}, "data": [ "data/assets_extension.xml", "data/fields_default.xml", diff --git a/models/res_partner_contract.py b/models/res_partner_contract.py index a158e3a..c6211d7 100755 --- a/models/res_partner_contract.py +++ b/models/res_partner_contract.py @@ -68,8 +68,8 @@ class PartnerContract(models.Model): # , IDocument, Extension): default=lambda self: self.date_conclusion, ) contract_annex_ids = fields.One2many( - "res.partner.contract.annex", - "contract_id", + comodel_name="res.partner.contract.annex", + inverse_name="contract_id", string="Annexes", help="Annexes to this contract", ) @@ -101,6 +101,7 @@ class PartnerContract(models.Model): # , IDocument, Extension): self.write({"state": "draft"}) def action_print_form(self): + self.ensure_one() view = self.env.ref( "{}.res_partner_wizard_print_document_view".format(MODULE_NAME) ) @@ -121,9 +122,11 @@ class PartnerContract(models.Model): # , IDocument, Extension): } def get_name_by_document_template(self, document_template_id): + self.ensure_one() return self.name def get_filename_by_document_template(self, document_template_id): + self.ensure_one() return _("{type} {number} from {date}").format( type=_( dict(document_template_id._fields["document_type"].selection).get( @@ -140,10 +143,12 @@ class PartnerContract(models.Model): # , IDocument, Extension): Returns: datetime.datetime -- date_conclusion_fix or date_conclusion or create_date """ + self.ensure_one() date = self.date_conclusion_fix or self.date_conclusion return date or self.create_date - def _(self, arg): + @staticmethod + def _(arg): """Uses in xml action (data/fields_default) Arguments: diff --git a/models/res_partner_contract_annex.py b/models/res_partner_contract_annex.py index cf3f4da..7ebb87d 100755 --- a/models/res_partner_contract_annex.py +++ b/models/res_partner_contract_annex.py @@ -8,6 +8,7 @@ from ..utils import MODULE_NAME # from ..utils.misc import Extension, IDocument _logger = logging.getLogger(__name__) + class ContractOrderAnnex(models.Model): # , IDocument, Extension): _name = "res.partner.contract.annex" _inherit = ["client_contracts.utils"] @@ -51,6 +52,7 @@ class ContractOrderAnnex(models.Model): # , IDocument, Extension): help="Contract Annexes counter", ) currency_id = fields.Many2one( + comodel_name="res.currency", string="Currency", default=lambda self: self.env.company.currency_id, ) @@ -140,16 +142,21 @@ class ContractOrderAnnex(models.Model): # , IDocument, Extension): order=order_number, ) - @api.model - def create(self, values): - _logger.debug("\n\n Values: %s\n\n", values) - record = super().create(values) - # Fill annex_id to domain it in future - record.order_id.contract_annex_id = record.id - # Counter - record.counter = record.contract_id.contract_annex_number - record.contract_id.contract_annex_number += 1 # TODO: should I use a sequence? - return record + def create(self, values_list): + _logger.debug("\n\n Values: %s\n\n", values_list) + if isinstance(values_list, dict): + values_list = [values_list] + _logger.debug("\n\n Values fixed: %s\n\n", values_list) + records = super(ContractOrderAnnex, self).create(values_list) + for record in records: + # Fill annex_id to domain it in future + # record.order_id.contract_annex_id = record.id + # Counter + record.counter = record.contract_id.contract_annex_number + record.contract_id.contract_annex_number += ( + 1 # TODO: should I use a sequence? + ) + return records def action_print_form(self): view = self.env.ref( diff --git a/models/res_partner_contract_field.py b/models/res_partner_contract_field.py index 127f0df..0d8f3e3 100755 --- a/models/res_partner_contract_field.py +++ b/models/res_partner_contract_field.py @@ -13,11 +13,12 @@ class ContractField(models.Model): ) technical_name = fields.Char( string="Technical Name", - help="Name uses in template", + help="Name for using in templates", required=True, ) description = fields.Char( string="Description", + help="Description for this field to be showed in fields list in print form creation wizard.", translate=True, default="", ) @@ -26,5 +27,7 @@ class ContractField(models.Model): ) visible = fields.Boolean( string="Visible", + help="To show this field in fields list in print form creation wizard\n" + "User can change showed field's values in wizard.", default=True, ) diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index ca472bb..9ff1cd8 100755 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,9 +1,12 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_contracts_contracts,access_contracts_contracts,model_res_partner_contract,base.group_user,1,1,1,1 + access_contracts_field,access_contracts_field,model_res_partner_contract_field,base.group_user,1,0,0,0 +access_contracts_field_manager,access_contracts_field,model_res_partner_contract_field,base.group_no_one,1,1,1,1 + access_contracts_field_transient,access_contracts_field_transient,model_res_partner_contract_field_transient,base.group_user,1,1,1,1 access_contracts_field_contract_annex,access_contracts_field_contract_annex,model_res_partner_contract_annex,base.group_user,1,1,1,1 access_contract_document_template,access_contract_document_template,model_res_partner_document_template,base.group_user,1,0,0,0 -access_contract_document_template_manager,access_contract_document_template,model_res_partner_document_template,hr.group_hr_manager,1,1,1,1 +access_contract_document_template_manager,access_contract_document_template,model_res_partner_document_template,base.group_no_one,1,1,1,1 access_contracts_wizard,access_contracts_wizard,model_res_partner_contract_wizard,base.group_user,1,1,1,1 diff --git a/utils/contract_context_values.py b/utils/contract_context_values.py deleted file mode 100644 index 8067ad7..0000000 --- a/utils/contract_context_values.py +++ /dev/null @@ -1,312 +0,0 @@ -# Aliases -self = record # res.partner.contract - -partner = self.partner_id # res.partner -seller = self.company_id - -# Functions -_ = self._ -get_date = self.get_date - -# Parse date -months = ["", - "января", "февраля", "марта", "апреля", - "мая", "июня", "июля", "августа", - "сентября", "октября", "ноября", "декабря", - ] -date = get_date() -dd = date.day -mm = date.month -yyyy = date.year -yy = yyyy % 100 -MM = months[mm] - -dd = dd if dd // 10 else '0{}'.format(dd) -mm = mm if mm // 10 else '0{}'.format(mm) - -# ctx keys must be decalared in this xml with id equal to "contract_field_{technical_name}" -ctx = { - "contract_number": self.name, - - "dd": dd, - "mm": mm, - "MM": MM, - "yy": yy, - "yyyy": yyyy, - - "seller_name": seller.name_write, - "seller_company_form": _(dict(seller._fields['company_form'].selection).get(seller.company_form)), - "seller_representer_name": seller.representative_id.name, - "seller_representer_name_parent": seller.representative_id.name_genitive, - "seller_representer_name_initials": seller.representative_id.name_initials, - "seller_representer_function": seller.representative_id.function, - "seller_representer_function_parent": seller.representative_id.function_genitive, - "seller_representer_document_parent": seller.representative_document, - "seller_inn": seller.vat, - "seller_kpp": seller.iec, - "seller_ogrn": seller.psrn, - "seller_business_address": seller.full_address, - "seller_phone": seller.phone, - "seller_whatsapp": seller.whatsapp, - "seller_telegram": seller.telegram, - "seller_email": seller.email, - - "partner_name": partner.name_write, - "partner_inn": partner.vat, - "partner_business_address": partner.full_address, - "partner_phone": partner.phone, - "partner_whatsapp": partner.whatsapp, - "partner_telegram": partner.telegram, - "partner_email": partner.email, -} - -seller_bank = seller.bank_ids and seller.bank_ids[0] -if seller_bank: - bank = seller_bank.bank_id - bank_name = bank and bank.name or "" - bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else "" - seller_bank_name = "{} {}".format(bank_name, bank_city).strip() - - ctx.update({ - "seller_bank": seller_bank_name, - "seller_rs": seller_bank.acc_number, - "seller_ks": bank.corr_account, - "seller_bic": bank.bic, - }) - -partner_bank = partner.bank_ids and partner.bank_ids[0] -if partner_bank: - bank = partner_bank.bank_id - bank_name = bank and bank.name or "" - bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else "" - partner_bank_name = "{} {}".format(bank_name, bank_city).strip() - - ctx.update({ - "partner_bank": partner_bank_name, - "partner_rs": partner_bank.acc_number, - "partner_ks": bank.corr_account, - "partner_bic": bank.bic, - }) - -# Person -if not partner.is_company: - ctx.update({ - "partner_representer_name": partner.name_write, - "partner_representer_name_initials": partner.name_initials, - "partner_representer_passport_number": partner.passport_number, - "partner_representer_passport_date": partner.passport_date, - "partner_representer_passport_department": partner.passport_department, - "partner_representer_passport_department_code": partner.passport_department_code, - }) - if not partner.name_write: - ctx.update({ - "partner_name": partner.name, - "partner_representer_name": partner.name, - }) -else: - # Company - ctx.update({ - "partner_company_form": _(dict(partner._fields['company_form'].selection).get(partner.company_form)), - "partner_representer_name": partner.representative_id.name, - "partner_representer_name_parent": partner.representative_id.name_genitive, - "partner_representer_name_initials": partner.representative_id.name_initials, - "partner_representer_function": partner.representative_id.function, - "partner_representer_function_parent": partner.representative_id.function_genitive, - "partner_representer_document_parent": partner.representative_document, - }) - - if partner.company_form == 'sp': - # Sole Proprietor - ctx.update({ - "partner_ip_number": partner.sp_register_number, - "partner_ip_date": partner.sp_register_date, - "partner_ogrnip": partner.psrn_sp, - "partner_representer_passport_number": partner.representative_id.passport_number, - "partner_representer_passport_date": partner.representative_id.passport_date, - "partner_representer_passport_department": partner.representative_id.passport_department, - "partner_representer_passport_department_code": partner.representative_id.passport_department_code, - }) - if partner.company_form == 'plc': - # Private Limited Company - ctx.update({ - "partner_kpp": partner.iec, - "partner_ogrn": partner.psrn, - }) - -action = ctx -< / field > -< / record > - -< !-- Action --> -< record -id = "action_get_annex_context" -model = "ir.actions.server" > -< field -name = "name" > Generate -Context -for Annex -< field -name = "model_id" -ref = "client_contracts.model_res_partner_contract_wizard" / > -< field -name = "binding_model_id" -ref = "client_contracts.model_res_partner_contract_wizard" / > -< field -name = "state" > code < / field > -< field -name = "code" > - -# Aliases -self = record # res.partner.contract.annex - -seller = self.company_id -partner = self.partner_id - -# Functions -_ = self.contract_id._ -get_date = self.contract_id.get_date - -# Parse date -months = ["", - "января", "февраля", "марта", "апреля", - "мая", "июня", "июля", "августа", - "сентября", "октября", "ноября", "декабря", - ] -date = get_date() -dd = date.day -mm = date.month -yyyy = date.year -yy = yyyy % 100 -MM = months[mm] - -dd = dd if dd // 10 else '0{}'.format(dd) -mm = mm if mm // 10 else '0{}'.format(mm) - -order_date = self.order_id.date_order - -# ctx keys must be decalared in this xml with id equal to "contract_field_{technical_name}" -ctx = { - "contract_number": self.contract_id.name, - - "annex_name": self.name, - "annex_number": self.counter, - - "order_name": self.order_id.name, - "order_date": "{} {} {}".format(order_date.day, months[order_date.month], order_date.year), - - "design_cost": self.to_fixed(self.design_cost), - "design_period": self.design_period, - "design_doc_cost": self.to_fixed(self.design_doc_cost), - "design_doc_period": self.design_doc_period, - "delivery_address": self.delivery_address, - "delivery_period": self.delivery_period, - "installation_address": self.installation_address, - "installation_cost": self.to_fixed(self.installation_cost), - "installation_period": self.installation_period, - "total_cost": self.to_fixed(self.total_cost), - - "payment_part_one": self.payment_part_one, - "payment_part_two": self.payment_part_two, - "payment_part_three": self.payment_part_three, - "delivery_period": self.delivery_period, - - "dd": dd, - "mm": mm, - "MM": MM, - "yy": yy, - "yyyy": yyyy, - - "seller_name": seller.name_write, - "seller_company_form": _(dict(seller._fields['company_form'].selection).get(seller.company_form)), - "seller_representer_name": seller.representative_id.name, - "seller_representer_name_parent": seller.representative_id.name_genitive, - "seller_representer_name_initials": seller.representative_id.name_initials, - "seller_representer_function": seller.representative_id.function, - "seller_representer_function_parent": seller.representative_id.function_genitive, - - "seller_inn": seller.vat, - "seller_kpp": seller.iec, - "seller_ogrn": seller.psrn, - "seller_business_address": seller.full_address, - "seller_phone": seller.phone, - "seller_email": seller.email, - - "partner_name": partner.name_write, - "partner_representer_name": partner.representative_id.name, - "partner_representer_name_initials": partner.representative_id.name_initials, - "partner_inn": partner.vat, - "partner_business_address": partner.full_address, - "partner_phone": partner.phone, - "partner_email": partner.email, -} - -seller_bank = seller.bank_ids and seller.bank_ids[0] -if seller_bank: - bank = seller_bank.bank_id - bank_name = bank and bank.name or "" - bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else "" - seller_bank_name = "{} {}".format(bank_name, bank_city).strip() - - ctx.update({ - "seller_bank": seller_bank_name, - "seller_rs": seller_bank.acc_number, - "seller_ks": bank.corr_account, - "seller_bic": bank.bic, - }) - -partner_bank = partner.bank_ids and partner.bank_ids[0] -if partner_bank: - bank = partner_bank.bank_id - bank_name = bank and bank.name or "" - bank_city = "г. {city}".format(city=bank.city) if bank and bank.city else "" - partner_bank_name = "{} {}".format(bank_name, bank_city).strip() - - ctx.update({ - "partner_bank": partner_bank_name, - "partner_rs": partner_bank.acc_number, - "partner_ks": bank.corr_account, - "partner_bic": bank.bic, - }) - -# Person -if not partner.is_company: - ctx.update({ - "partner_representer_name": partner.name_write, - "partner_representer_name_initials": partner.name_initials, - "partner_representer_passport_number": partner.passport_number, - "partner_representer_passport_date": partner.passport_date, - "partner_representer_passport_department": partner.passport_department, - }) - if not partner.name_write: - ctx.update({ - "partner_name": partner.name, - "partner_representer_name": partner.name, - }) -else: - # Company - ctx.update({ - "partner_company_form": _(dict(partner._fields['company_form'].selection).get(partner.company_form)), - "partner_representer_name_parent": partner.representative_id.name_genitive, - "partner_representer_document_parent": partner.representative_document, - "partner_representer_function": partner.representative_id.function, - "partner_representer_function_parent": partner.representative_id.function_genitive, - }) - - if partner.company_form == 'sp': - # Sole Proprietor - ctx.update({ - "partner_ip_number": partner.sp_register_number, - "partner_ip_date": partner.sp_register_date, - "partner_ogrnip": partner.psrn_sp, - "partner_representer_passport_number": partner.representative_id.passport_number, - "partner_representer_passport_date": partner.representative_id.passport_date, - "partner_representer_passport_department": partner.representative_id.passport_department, - }) - if partner.company_form == 'plc': - # Private Limited Company - ctx.update({ - "partner_kpp": partner.iec, - "partner_ogrn": partner.psrn, - }) - -action = ctx \ No newline at end of file diff --git a/utils/misc.py b/utils/misc.py index 65d4482..c2842e9 100755 --- a/utils/misc.py +++ b/utils/misc.py @@ -23,13 +23,13 @@ from odoo.tools.misc import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_ class Utils(models.AbstractModel): _name = "client_contracts.utils" - '''@staticmethod + """@staticmethod def parse_odoo_date(date: str): return dt.datetime.strptime(date, DEFAULT_SERVER_DATE_FORMAT) @staticmethod def parse_odoo_datetime(datetime: str): - return dt.datetime.strptime(datetime, DEFAULT_SERVER_DATETIME_FORMAT)''' + return dt.datetime.strptime(datetime, DEFAULT_SERVER_DATETIME_FORMAT)""" @staticmethod def to_fixed(number, digit=2): diff --git a/utils/num2words.py b/utils/num2words.py index bdafa58..54894a8 100755 --- a/utils/num2words.py +++ b/utils/num2words.py @@ -13,7 +13,7 @@ from num2words import CONVERTER_CLASSES, CONVERTES_TYPES # Jinja2 Global Method def num2words_(number, **kwargs): - if _performConvert(number): + if _perform_convert(number): if "lang" not in kwargs: kwargs["lang"] = "ru" if "to" not in kwargs or kwargs["to"] not in CONVERTES_TYPES: @@ -23,7 +23,7 @@ def num2words_(number, **kwargs): # Jinja2 Global Method def num2words_currency(number, **kwargs): - if _performConvert(number): + if _perform_convert(number): if "lang" not in kwargs: kwargs["lang"] = "ru" if "to" not in kwargs or kwargs["to"] not in CONVERTES_TYPES: @@ -34,7 +34,6 @@ def num2words_currency(number, **kwargs): total = result.split(",")[0] part_word = result.split()[-1] part_number = Decimal(str(number)) % 1 - return "{total}, {part_n} {part_w}".format( total=total.capitalize(), part_n="{:02d}".format(int(part_number * 100)), @@ -42,15 +41,13 @@ def num2words_currency(number, **kwargs): ) -def _performConvert(number): +def _perform_convert(number): if isinstance(number, int) or isinstance(number, float): return True - if isinstance(number, str): try: number = float(number) return True except ValueError: return False - return False diff --git a/views/res_partner_contract.xml b/views/res_partner_contract.xml index 4095bbb..3154570 100755 --- a/views/res_partner_contract.xml +++ b/views/res_partner_contract.xml @@ -41,8 +41,12 @@ - - + +