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

1"""Helper functions for report generation.""" 

2 

3import base64 

4import io 

5import logging 

6 

7from django.utils.translation import gettext_lazy as _ 

8 

9from common.settings import get_global_setting 

10 

11logger = logging.getLogger('inventree') 

12 

13 

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 

18 

19 return list(getModelsWithMixin(InvenTreeReportMixin)) 

20 

21 

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 

26 

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 

30 

31 

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 ] 

38 

39 

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 ] 

48 

49 

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 } 

58 

59 

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] 

64 

65 # Default to A4 

66 logger.warning("Unknown page size code '%s' - defaulting to A4", page_code) 

67 return page_sizes()['A4'] 

68 

69 

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' 

77 

78 return page_size 

79 

80 

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. 

83 

84 Arguments: 

85 image: {Image} -- Image to encode 

86 img_format: {str} -- Image format (default = 'PNG') 

87 

88 Returns: 

89 str -- Base64 encoded image data e.g. 'data:image/png;base64,xxxxxxxxx' 

90 """ 

91 img_format = str(img_format).lower() 

92 

93 buffered = io.BytesIO() 

94 image.save(buffered, img_format) 

95 

96 img_str = base64.b64encode(buffered.getvalue()) 

97 

98 return f'data:image/{img_format};charset=utf-8;base64,' + img_str.decode()