mirror of
https://github.com/inventree/InvenTree.git
synced 2025-05-10 17:28:50 +00:00
* 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
74 lines
1.8 KiB
Python
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()
|