From c3697aa77597dac26429cacd8476e30f8eb0465a Mon Sep 17 00:00:00 2001 From: git_admin Date: Fri, 1 May 2026 14:25:21 +0000 Subject: [PATCH] Tower: upload base_accounting_kit 19.0.2.3.1 (via marketplace) --- .../models/multiple_invoice_layout.py | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 addons/base_accounting_kit/models/multiple_invoice_layout.py diff --git a/addons/base_accounting_kit/models/multiple_invoice_layout.py b/addons/base_accounting_kit/models/multiple_invoice_layout.py new file mode 100644 index 0000000..d089ff8 --- /dev/null +++ b/addons/base_accounting_kit/models/multiple_invoice_layout.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2025-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models +from odoo.tools.misc import file_path + +try: + import sass as libsass +except ImportError: + libsass = None + + +class MultipleInvoiceLayout(models.TransientModel): + """ + Customise the invoice copy document layout and display a live preview + """ + _name = 'multiple.invoice.layout' + _description = 'Multiple Invoice Document Layout' + + def _get_default_journal(self): + """The default function to return the journal for the invoice""" + return self.env['account.journal'].search( + [('id', '=', self.env.context.get('active_id'))]).id + + company_id = fields.Many2one( + 'res.company', default=lambda self: self.env.company, required=True) + layout = fields.Char(related="company_id.external_report_layout_id.key") + journal_id = fields.Many2one('account.journal', string='Journal', + required=True, default=_get_default_journal) + multiple_invoice_type = fields.Selection( + related='journal_id.multiple_invoice_type', readonly=False, + required=True) + text_position = fields.Selection(related='journal_id.text_position', + readonly=False, required=True, + default='header') + body_text_position = fields.Selection( + related='journal_id.body_text_position', + readonly=False) + text_align = fields.Selection( + related='journal_id.text_align', + readonly=False) + preview = fields.Html(compute='_compute_preview', + sanitize=False, + sanitize_tags=False, + sanitize_attributes=False, + sanitize_style=False, + sanitize_form=False, + strip_style=False, + strip_classes=False) + + @api.depends('multiple_invoice_type', 'text_position', 'body_text_position', + 'text_align') + def _compute_preview(self): + """ compute a qweb based preview to display on the wizard """ + + styles = self._get_asset_style() + + for wizard in self: + if wizard.company_id: + preview_css = self._get_css_for_preview(styles, wizard.id) + layout = self._get_layout_for_preview() + ir_ui_view = wizard.env['ir.ui.view'] + wizard.preview = ir_ui_view._render_template( + 'base_accounting_kit.multiple_invoice_wizard_preview', + {'company': wizard.company_id, 'preview_css': preview_css, + 'layout': layout, + 'mi_type': self.multiple_invoice_type, + 'txt_position': self.text_position, + 'body_txt_position': self.body_text_position, + 'txt_align': self.text_align, + 'mi': self.env.ref( + 'base_accounting_kit.multiple_invoice_sample_name') + }) + else: + wizard.preview = False + + def _get_asset_style(self): + """Used to set the asset style""" + company_styles = self.env['ir.qweb']._render( + 'web.styles_company_report', { + 'company_ids': self.company_id, + }, raise_if_not_found=False) + return company_styles + + @api.model + def _get_css_for_preview(self, scss, new_id): + """ + Compile the scss into css. + """ + css_code = self._compile_scss(scss) + return css_code + + @api.model + def _compile_scss(self, scss_source): + """ + This code will compile valid scss into css. + Parameters are the same from odoo/addons/base/models/assetsbundle.py + Simply copied and adapted slightly + """ + + # No scss ? still valid, returns empty css + if not scss_source.strip(): + return "" + + precision = 8 + output_style = 'expanded' + bootstrap_path = file_path('web', 'static', 'lib', 'bootstrap', + 'scss') + try: + return libsass.compile( + string=scss_source, + include_paths=[ + bootstrap_path, + ], + output_style=output_style, + precision=precision, + ) + except libsass.CompileError as e: + raise libsass.CompileError(e.args[0]) + + def _get_layout_for_preview(self): + """Returns the layout Preview for the accounting module""" + if self.layout == 'web.external_layout_boxed': + new_layout = 'base_accounting_kit.boxed' + + elif self.layout == 'web.external_layout_bold': + new_layout = 'base_accounting_kit.bold' + + elif self.layout == 'web.external_layout_striped': + new_layout = 'base_accounting_kit.striped' + + else: + new_layout = 'base_accounting_kit.standard' + + return new_layout + + def document_layout_save(self): + """meant to be overridden document_layout_save""" + return self.env.context.get('report_action') or { + 'type': 'ir.actions.act_window_close'}