2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-05-10 17:28:50 +00:00
Oliver 2fcd6ae0b9
Report image rendering fix (#5907)
* Allow different image variations to be rendered in when using a part image in a report

* Use preview image in default test report

* Fix api_version

- Missed in https://github.com/inventree/InvenTree/pull/5906

* Update docstring

* Add similar functionality for company_image tag

* Update report documentation

* base-64 encode images for rendering in reports

- Allows image manipulation operations to be performed on the images
- Avoids any file pathing issues

* Update docs

* Fix unit tests

* More unit test fixes

* More unit test

* Handle missing file

* Instrument unit test

- Trying to determine what is going on here

* Fix for image resize

* Translate error messages

* Update default report templates

- Specify image size
2023-11-14 12:08:18 +11:00

74 lines
1.8 KiB
Python

"""Helper functions for report generation."""
import base64
import io
import logging
from django.utils.translation import gettext_lazy as _
logger = logging.getLogger('inventree')
def report_page_size_options():
"""Returns a list of page size options for PDF reports."""
return [
('A4', _('A4')),
('A3', _('A3')),
('Legal', _('Legal')),
('Letter', _('Letter')),
]
def page_sizes():
"""Returns a dict of page sizes for PDF reports."""
return {
'A4': (210, 297),
'A3': (297, 420),
'Legal': (215.9, 355.6),
'Letter': (215.9, 279.4),
}
def page_size(page_code):
"""Return the page size associated with a particular page code"""
if page_code in page_sizes():
return page_sizes()[page_code]
# Default to A4
logger.warning("Unknown page size code '%s' - defaulting to A4", page_code)
return page_sizes()['A4']
def report_page_size_default():
"""Returns the default page size for PDF reports."""
from common.models import InvenTreeSetting
try:
page_size = InvenTreeSetting.get_setting('REPORT_DEFAULT_PAGE_SIZE', 'A4')
except Exception as exc:
logger.exception("Error getting default page size: %s", str(exc))
page_size = 'A4'
return page_size
def encode_image_base64(image, format: str = 'PNG'):
"""Return a base-64 encoded image which can be rendered in an <img> tag
Arguments:
image {Image} -- Image object
format {str} -- Image format (e.g. 'PNG')
Returns:
str -- Base64 encoded image data e.g. 'data:image/png;base64,xxxxxxxxx'
"""
fmt = format.lower()
buffered = io.BytesIO()
image.save(buffered, fmt)
img_str = base64.b64encode(buffered.getvalue())
return f"data:image/{fmt};charset=utf-8;base64," + img_str.decode()