docx_report_generation/wizard/res_partner_contract_wizard.py

185 lines
5.9 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
2019-12-25 18:11:48 +05:00
from odoo import _, api, fields, models
2018-11-08 17:16:01 +05:00
2019-12-28 15:09:32 +05:00
from ..utils import MODULE_NAME
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_partner(self):
2019-12-25 16:33:30 +05:00
current_id = self.env.context.get("active_id")
return self.env["res.partner.contract"].browse(current_id).partner_id.id
2018-11-08 17:16:01 +05:00
2020-01-13 18:57:36 +05:00
def _get_default_document_template(self):
return self.env["res.partner.document.template"].search([], limit=1)
target = fields.Reference(
selection=[
("res.partner.contract", "Contract"),
("res.partner.contract.annex", "Contract Annex"),
],
string="Target",
2019-11-12 16:16:14 +05:00
)
company_id = fields.Many2one("res.partner", string="Company")
partner_id = fields.Many2one("res.partner", string="Partner")
document_template = fields.Many2one(
2020-01-13 18:57:36 +05:00
"res.partner.document.template",
string="Document Template",
default=_get_default_document_template,
required=True,
2019-11-12 16:16:14 +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",
)
@api.onchange("document_template")
2020-01-13 18:02:42 +05:00
def _onchange_document_template(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),]
)
# A model is the wizard called from
active_model = self.env.context.get("active_model")
# A record is the model called from (manually set with context)
target_id = self.env.context.get("self_id")
# Reference to this record
self.target = "{model},{record_id}".format(
model=active_model, record_id=int(target_id)
)
2019-12-11 16:17:14 +05:00
# Check for model and get this meta fields
company_id = (
self.target.company_id
if hasattr(self.target, "company_id")
else self.target.contract_id.company_id
)
partner_id = (
self.target.partner_id
if hasattr(self.target, "partner_id")
else self.target.contract_id.partner_id
)
2019-12-20 17:19:37 +05:00
self.company_id = company_id
self.partner_id = partner_id
model_to_action = {
2019-12-30 16:02:07 +05:00
"res.partner.contract": "{}.action_get_contract_context".format(
MODULE_NAME
),
"res.partner.contract.annex": "{}.action_get_annex_context".format(
MODULE_NAME
),
}
action = model_to_action[active_model]
# Get dictionary for `transient_fields_ids` with editable fields
# With data from Odoo database
2019-12-17 09:53:47 +05:00
contract_context_values = (
self.env.ref(action).with_context({"onchange_self": self.target}).run()
2019-12-17 09:53:47 +05:00
)
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
)
2019-12-30 16:02:07 +05:00
for field, value in sorted(
contract_context_values.items(),
key=lambda tpl: self.env.ref(
"{}.contract_field_{}".format(MODULE_NAME, tpl[0])
).sequence,
)
]
2019-12-27 18:07:20 +05:00
# Set up template domain
template_type = {
"res.partner.contract": "contract",
"res.partner.contract.annex": "annex",
}.get(active_model, False)
2019-12-28 10:56:43 +05:00
company_type = (
self.partner_id.company_form if self.partner_id.is_company else "person"
)
2019-12-27 18:07:20 +05:00
return {
2019-12-28 10:56:43 +05:00
"domain": {
"document_template": [
("template_type", "=", template_type),
("company_type", "=", company_type),
],
2019-12-27 18:07:20 +05:00
}
}
@api.multi
2018-11-08 17:16:01 +05:00
def get_docx_contract(self):
2020-01-13 17:37:35 +05:00
template = self.document_template.attachment_id
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 = "{name}-{number}.{ext}".format(
number=self.target.name,
ext="docx",
name=(
2019-12-25 16:36:45 +05:00
_("Contract")
if self.target._name == "res.partner.contract"
else (
2019-12-25 16:36:45 +05:00
_("Annex")
if self.target._name == "res.partner.contract.annex"
2019-12-25 16:36:45 +05:00
else ("Unknown")
)
),
2019-12-17 09:53:47 +05:00
)
2019-12-17 09:53:47 +05:00
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
res_id = self.target.id
if hasattr(self.target, "contract_id"):
res_id = self.target.contract_id.id
2019-12-17 09:53:47 +05:00
self.env["mail.message"].create(
{
"model": "res.partner.contract",
"res_id": res_id,
2019-12-17 09:53:47 +05:00
"message_type": "comment",
"attachment_ids": [(4, document_as_attachment.id, False)],
}
)
return document_as_attachment