Coverage for src/backend/InvenTree/plugin/base/barcodes/helper.py: 80%

31 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 17:47 +0000

1"""Helper functions for barcode generation.""" 

2 

3from typing import cast 

4 

5import structlog 

6 

7import InvenTree.helpers_model 

8from InvenTree.models import InvenTreeBarcodeMixin 

9 

10logger = structlog.get_logger('inventree') 

11 

12 

13def cache(func): 

14 """Cache the result of a function, but do not cache falsy results.""" 

15 cache = {} 

16 

17 def wrapper(): 

18 """Wrapper function for caching.""" 

19 if 'default' not in cache: 

20 res = func() 

21 

22 if res: 

23 cache['default'] = res 

24 

25 return res 

26 

27 return cache['default'] 

28 

29 return wrapper 

30 

31 

32def generate_barcode(model_instance: InvenTreeBarcodeMixin): 

33 """Generate a barcode for a given model instance.""" 

34 from common.settings import get_global_setting 

35 from plugin import registry 

36 from plugin.mixins import BarcodeMixin 

37 

38 # Find the selected barcode generation plugin 

39 slug = get_global_setting('BARCODE_GENERATION_PLUGIN', create=False) 

40 

41 plugin = cast(BarcodeMixin, registry.get_plugin(slug)) 

42 

43 return plugin.generate(model_instance) 

44 

45 

46@cache 

47def get_supported_barcode_models() -> list[type[InvenTreeBarcodeMixin]]: 

48 """Returns a list of database models which support barcode functionality.""" 

49 return InvenTree.helpers_model.getModelsWithMixin(InvenTreeBarcodeMixin) 

50 

51 

52@cache 

53def get_supported_barcode_models_map(): 

54 """Return a mapping of barcode model types to the model class.""" 

55 return { 

56 model.barcode_model_type(): model for model in get_supported_barcode_models() 

57 } 

58 

59 

60@cache 

61def get_supported_barcode_model_codes_map(): 

62 """Return a mapping of barcode model type codes to the model class.""" 

63 return { 

64 model.barcode_model_type_code(): model 

65 for model in get_supported_barcode_models() 

66 }