You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

214 lines
6.6 KiB
Python

8 months ago
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
# see http://doc.qt.io/archives/qt-4.8/qprinter.html#PaperSize-enum
PAPER_SIZES = [
{
'description': 'A0 5 841 x 1189 mm',
'key': 'A0',
'height': 1189.0,
'width': 841.0,
}, {
'key': 'A1',
'description': 'A1 6 594 x 841 mm',
'height': 841.0,
'width': 594.0,
}, {
'key': 'A2',
'description': 'A2 7 420 x 594 mm',
'height': 594.0,
'width': 420.0,
}, {
'key': 'A3',
'description': 'A3 8 297 x 420 mm',
'height': 420.0,
'width': 297.0,
}, {
'key': 'A4',
'description': 'A4 0 210 x 297 mm, 8.26 x 11.69 inches',
'height': 297.0,
'width': 210.0,
}, {
'key': 'A5',
'description': 'A5 9 148 x 210 mm',
'height': 210.0,
'width': 148.0,
}, {
'key': 'A6',
'description': 'A6 10 105 x 148 mm',
'height': 148.0,
'width': 105.0,
}, {
'key': 'A7',
'description': 'A7 11 74 x 105 mm',
'height': 105.0,
'width': 74.0,
}, {
'key': 'A8',
'description': 'A8 12 52 x 74 mm',
'height': 74.0,
'width': 52.0,
}, {
'key': 'A9',
'description': 'A9 13 37 x 52 mm',
'height': 52.0,
'width': 37.0,
}, {
'key': 'B0',
'description': 'B0 14 1000 x 1414 mm',
'height': 1414.0,
'width': 1000.0,
}, {
'key': 'B1',
'description': 'B1 15 707 x 1000 mm',
'height': 1000.0,
'width': 707.0,
}, {
'key': 'B2',
'description': 'B2 17 500 x 707 mm',
'height': 707.0,
'width': 500.0,
}, {
'key': 'B3',
'description': 'B3 18 353 x 500 mm',
'height': 500.0,
'width': 353.0,
}, {
'key': 'B4',
'description': 'B4 19 250 x 353 mm',
'height': 353.0,
'width': 250.0,
}, {
'key': 'B5',
'description': 'B5 1 176 x 250 mm, 6.93 x 9.84 inches',
'height': 250.0,
'width': 176.0,
}, {
'key': 'B6',
'description': 'B6 20 125 x 176 mm',
'height': 176.0,
'width': 125.0,
}, {
'key': 'B7',
'description': 'B7 21 88 x 125 mm',
'height': 125.0,
'width': 88.0,
}, {
'key': 'B8',
'description': 'B8 22 62 x 88 mm',
'height': 88.0,
'width': 62.0,
}, {
'key': 'B9',
'description': 'B9 23 33 x 62 mm',
'height': 62.0,
'width': 33.0,
}, {
'key': 'B10',
'description': 'B10 16 31 x 44 mm',
'height': 44.0,
'width': 31.0,
}, {
'key': 'C5E',
'description': 'C5E 24 163 x 229 mm',
'height': 229.0,
'width': 163.0,
}, {
'key': 'Comm10E',
'description': 'Comm10E 25 105 x 241 mm, U.S. Common 10 Envelope',
'height': 241.0,
'width': 105.0,
}, {
'key': 'DLE',
'description': 'DLE 26 110 x 220 mm',
'height': 220.0,
'width': 110.0,
}, {
'key': 'Executive',
'description': 'Executive 4 7.5 x 10 inches, 190.5 x 254 mm',
'height': 254.0,
'width': 190.5,
}, {
'key': 'Folio',
'description': 'Folio 27 210 x 330 mm',
'height': 330.0,
'width': 210.0,
}, {
'key': 'Ledger',
'description': 'Ledger 28 431.8 x 279.4 mm',
'height': 279.4,
'width': 431.8,
}, {
'key': 'Legal',
'description': 'Legal 3 8.5 x 14 inches, 215.9 x 355.6 mm',
'height': 355.6,
'width': 215.9,
}, {
'key': 'Letter',
'description': 'Letter 2 8.5 x 11 inches, 215.9 x 279.4 mm',
'height': 279.4,
'width': 215.9,
}, {
'key': 'Tabloid',
'description': 'Tabloid 29 279.4 x 431.8 mm',
'height': 431.8,
'width': 279.4,
}, {
'key': 'custom',
'description': 'Custom',
},
]
class report_paperformat(models.Model):
_name = "report.paperformat"
_description = "Paper Format Config"
name = fields.Char('Name', required=True)
default = fields.Boolean('Default paper format ?')
format = fields.Selection([(ps['key'], ps['description']) for ps in PAPER_SIZES], 'Paper size', default='A4', help="Select Proper Paper size")
margin_top = fields.Float('Top Margin (mm)', default=40)
margin_bottom = fields.Float('Bottom Margin (mm)', default=20)
margin_left = fields.Float('Left Margin (mm)', default=7)
margin_right = fields.Float('Right Margin (mm)', default=7)
page_height = fields.Integer('Page height (mm)', default=False)
page_width = fields.Integer('Page width (mm)', default=False)
orientation = fields.Selection([
('Landscape', 'Landscape'),
('Portrait', 'Portrait')
], 'Orientation', default='Landscape')
header_line = fields.Boolean('Display a header line', default=False)
header_spacing = fields.Integer('Header spacing', default=35)
disable_shrinking = fields.Boolean('Disable smart shrinking')
dpi = fields.Integer('Output DPI', required=True, default=90)
report_ids = fields.One2many('ir.actions.report', 'paperformat_id', 'Associated reports', help="Explicitly associated reports")
print_page_width = fields.Float('Print page width (mm)', compute='_compute_print_page_size')
print_page_height = fields.Float('Print page height (mm)', compute='_compute_print_page_size')
@api.constrains('format')
def _check_format_or_page(self):
if self.filtered(lambda x: x.format != 'custom' and (x.page_width or x.page_height)):
raise ValidationError(_('You can select either a format or a specific page width/height, but not both.'))
def _compute_print_page_size(self):
for record in self:
width = height = 0.0
if record.format:
if record.format == 'custom':
width = record.page_width
height = record.page_height
else:
paper_size = next(ps for ps in PAPER_SIZES if ps['key'] == record.format)
width = paper_size['width']
height = paper_size['height']
if record.orientation == 'Landscape':
# swap sizes
width, height = height, width
record.print_page_width = width
record.print_page_height = height