Files
enterprise-addons/sign/models/sign_completed_document.py
T

40 lines
2.0 KiB
Python

import base64
from odoo import fields, models
from odoo.tools.pdf.signature import PdfSigner
class SignCompletedDocument(models.Model):
_name = 'sign.completed.document'
_description = "Completed Document"
sign_request_id = fields.Many2one('sign.request', string="Sign Request", required=True, index=True, ondelete='restrict')
file = fields.Binary(readonly=True, string="Completed Document", attachment=True, copy=False)
document_id = fields.Many2one('sign.document', string="Document", required=True, index=True, ondelete='restrict')
def _generate_completed_document(self):
for record in self:
itemsByPage = record.document_id._get_sign_items_by_page()
item_ids = [id for items in itemsByPage.values() for id in items.ids]
values_dict = self.env['sign.request.item.value']._read_group(
[('sign_item_id', 'in', item_ids), ('sign_request_id', '=', record.sign_request_id.id)],
groupby=['sign_item_id'],
aggregates=['value:array_agg', 'frame_value:array_agg', 'frame_has_hash:array_agg']
)
signed_values = {
sign_item.id: {
'value': values[0],
'frame': frame_values[0],
'frame_has_hash': frame_has_hashes[0],
}
for sign_item, values, frame_values, frame_has_hashes in values_dict
}
final_log_hash = record.sign_request_id._get_final_signature_log_hash()
output = record.document_id.render_document_with_items(signed_values=signed_values, values_dict=values_dict, final_log_hash=final_log_hash)
signer = PdfSigner(output, record.sign_request_id.communication_company_id)
signed_output = signer.sign_pdf(True, record.sign_request_id._get_signing_field_name(), record.sign_request_id.create_uid.partner_id)
if signed_output:
output = signed_output
record.file = base64.b64encode(output.getvalue())
output.close()