Coverage for src/backend/InvenTree/report/helpers.py: 67%
40 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 17:47 +0000
1"""Helper functions for report generation."""
3import base64
4import io
5import logging
7from django.utils.translation import gettext_lazy as _
9from common.settings import get_global_setting
11logger = logging.getLogger('inventree')
14def report_model_types():
15 """Return a list of database models for which reports can be generated."""
16 from InvenTree.helpers_model import getModelsWithMixin
17 from report.mixins import InvenTreeReportMixin
19 return list(getModelsWithMixin(InvenTreeReportMixin))
22def report_model_from_name(model_name: str):
23 """Returns the internal model class from the provided name."""
24 if not model_name:
25 return None
27 for model in report_model_types(): 27 ↛ exitline 27 didn't return from function 'report_model_from_name' because the loop on line 27 didn't complete
28 if model.__name__.lower() == model_name:
29 return model
32def report_model_options():
33 """Return a list of options for models which support report printing."""
34 return [
35 (model.__name__.lower(), model._meta.verbose_name)
36 for model in report_model_types()
37 ]
40def report_page_size_options():
41 """Returns a list of page size options for PDF reports."""
42 return [
43 ('A4', _('A4')),
44 ('A3', _('A3')),
45 ('Legal', _('Legal')),
46 ('Letter', _('Letter')),
47 ]
50def page_sizes():
51 """Returns a dict of page sizes for PDF reports."""
52 return {
53 'A4': (210, 297),
54 'A3': (297, 420),
55 'Legal': (215.9, 355.6),
56 'Letter': (215.9, 279.4),
57 }
60def page_size(page_code):
61 """Return the page size associated with a particular page code."""
62 if page_code in page_sizes():
63 return page_sizes()[page_code]
65 # Default to A4
66 logger.warning("Unknown page size code '%s' - defaulting to A4", page_code)
67 return page_sizes()['A4']
70def report_page_size_default():
71 """Returns the default page size for PDF reports."""
72 try:
73 page_size = get_global_setting('REPORT_DEFAULT_PAGE_SIZE', 'A4', create=False)
74 except Exception as exc:
75 logger.exception('Error getting default page size: %s', exc)
76 page_size = 'A4'
78 return page_size
81def encode_image_base64(image, img_format: str = 'PNG') -> str:
82 """Return a base-64 encoded image which can be rendered in an <img> tag.
84 Arguments:
85 image: {Image} -- Image to encode
86 img_format: {str} -- Image format (default = 'PNG')
88 Returns:
89 str -- Base64 encoded image data e.g. 'data:image/png;base64,xxxxxxxxx'
90 """
91 img_format = str(img_format).lower()
93 buffered = io.BytesIO()
94 image.save(buffered, img_format)
96 img_str = base64.b64encode(buffered.getvalue())
98 return f'data:image/{img_format};charset=utf-8;base64,' + img_str.decode()