docx_report_generation/wizard/res_partner_contract_wizard.py

140 lines
4.4 KiB
Python
Raw Normal View History

2018-11-08 17:16:01 +05:00
# -*- coding: utf-8 -*-
2019-12-04 16:48:47 +05:00
import base64
2019-12-12 17:23:54 +05:00
import logging
2018-11-08 17:16:01 +05:00
import math
2019-11-13 15:30:14 +05:00
from odoo import api, fields, models
from odoo.exceptions import UserError
2018-11-08 17:16:01 +05:00
2019-12-04 16:48:47 +05:00
from ..utils.docxtpl import get_document_from_values_stream
2018-11-08 17:16:01 +05:00
2019-12-12 17:23:54 +05:00
_logger = logging.getLogger(__name__)
2018-11-08 17:16:01 +05:00
class ContractWizard(models.TransientModel):
2019-12-17 09:53:47 +05:00
_name = "res.partner.contract.wizard"
2018-11-08 17:16:01 +05:00
def _get_default_template(self):
2019-12-17 13:26:35 +05:00
_template = self.env["res.partner.template.print.contract"].search(
2019-12-17 09:53:47 +05:00
[("is_default", "=", True)]
)
2018-11-08 17:16:01 +05:00
if _template:
return _template[0].id
return False
2018-11-08 17:16:01 +05:00
def _get_default_partner(self):
2019-12-17 09:53:47 +05:00
current_id = self.env.context.get("active_ids")
return self.env["res.partner.contract"].browse([current_id[0]]).partner_id.id
2018-11-08 17:16:01 +05:00
2019-11-12 16:16:14 +05:00
company_id = fields.Many2one(
2019-12-17 09:53:47 +05:00
"res.partner",
string="Company",
default=lambda self: self.env.user.company_id.partner_id,
2019-11-12 16:16:14 +05:00
)
contract_id = fields.Many2one(
2019-12-17 09:53:47 +05:00
"res.partner.contract",
string="Contract",
default=lambda self: self.env.context.get("active_id"),
2019-11-12 16:16:14 +05:00
)
2019-12-17 09:53:47 +05:00
delivery_terms = fields.Integer(string="Delivery terms", default=10)
2019-11-12 16:16:14 +05:00
partner_id = fields.Many2one(
2019-12-17 09:53:47 +05:00
"res.partner", string="Partner", default=_get_default_partner
2019-11-12 16:16:14 +05:00
)
2019-12-17 09:53:47 +05:00
payment_terms = fields.Integer(string="Payment term", default=45)
2019-12-17 13:26:35 +05:00
print_template_contract = fields.Many2one(
"res.partner.template.print.contract",
2019-12-17 09:53:47 +05:00
string="Template",
help="Template for contract",
default=_get_default_template,
2019-11-12 16:16:14 +05:00
)
type = fields.Selection(
2019-12-17 09:53:47 +05:00
selection=[("person", "With person"), ("company", "With company")],
string="Type of contract",
default="company",
2019-11-12 16:16:14 +05:00
)
2018-11-08 17:16:01 +05:00
transient_field_ids = fields.One2many(
2019-12-17 09:53:47 +05:00
"res.partner.contract.field.transient",
"_contract_wizard_id",
string="Contract Fields",
)
2019-12-17 09:53:47 +05:00
@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
"""
2019-12-17 09:53:47 +05:00
def get_contract_field(technical_name):
2019-12-17 09:53:47 +05:00
return self.env["res.partner.contract.field"].search(
[("technical_name", "=", technical_name),]
)
2019-12-17 09:53:47 +05:00
self.contract_id = self.env.context.get("active_id")
2019-12-11 16:17:14 +05:00
2019-12-17 09:53:47 +05:00
contract_context_values = (
self.env.ref("client_contracts.action_get_context")
.with_context({"onchange_self": self})
.run()
)
self.transient_field_ids = [ # one2many
(
4,
2019-12-17 09:53:47 +05:00
self.env["res.partner.contract.field.transient"]
.create(
{"contract_field_id": get_contract_field(field).id, "value": value,}
)
.id,
0,
2019-12-17 09:53:47 +05:00
)
for field, value in sorted(contract_context_values.items())
]
@api.multi
2018-11-08 17:16:01 +05:00
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 = {
transient_field.technical_name: transient_field.value
2019-12-17 09:53:47 +05:00
for transient_field in self.transient_field_ids
if transient_field.technical_name and transient_field.value
}
2019-12-04 16:54:42 +05:00
2019-12-17 09:53:47 +05:00
binary_data = get_document_from_values_stream(path_to_template, fields).read()
2019-12-04 16:48:47 +05:00
encoded_data = base64.b64encode(binary_data)
attachment_name = "Contract-{number}.{ext}".format(
2019-12-17 09:53:47 +05:00
number=self.contract_id.name, ext="docx"
)
document_as_attachment = self.env["ir.attachment"].create(
{
"name": attachment_name,
"datas_fname": attachment_name,
"type": "binary",
"datas": encoded_data,
}
)
# Send message with attachment to a mail.thread of the company
2019-12-17 09:53:47 +05:00
self.env["mail.message"].create(
{
"model": "res.partner.contract",
"res_id": self.contract_id.id,
"message_type": "comment",
"attachment_ids": [(4, document_as_attachment.id, False)],
}
)
return document_as_attachment
2019-11-12 16:16:14 +05:00
def modf(self, arg):
"""Math.modf function for using in XML ir.action.server code
Uses in data/fields_default.xml
"""
return math.modf(arg)