Coverage for src/backend/InvenTree/plugin/builtin/suppliers/lcsc.py: 52%

25 statements  

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

1"""The LCSCBarcodePlugin is meant to integrate the LCSC API into InvenTree. 

2 

3This plugin can currently only match LCSC barcodes to supplier parts. 

4""" 

5 

6import re 

7 

8from django.utils.translation import gettext_lazy as _ 

9 

10from plugin import InvenTreePlugin 

11from plugin.mixins import SettingsMixin, SupplierBarcodeMixin 

12 

13 

14class LCSCPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): 

15 """Plugin to integrate the LCSC API into InvenTree.""" 

16 

17 NAME = 'LCSCBarcodePlugin' 

18 SLUG = 'lcscplugin' 

19 TITLE = _('Supplier Integration - LCSC') 

20 DESCRIPTION = _('Provides support for scanning LCSC barcodes') 

21 VERSION = '1.0.1' 

22 AUTHOR = _('InvenTree contributors') 

23 

24 DEFAULT_SUPPLIER_NAME = 'LCSC' 

25 SETTINGS = { 

26 'SUPPLIER_ID': { 

27 'name': _('Supplier'), 

28 'description': _("The Supplier which acts as 'LCSC'"), 

29 'model': 'company.company', 

30 'model_filters': {'is_supplier': True}, 

31 } 

32 } 

33 

34 LCSC_BARCODE_REGEX = re.compile(r'^{((?:[^:,]+:[^:,]*,)*(?:[^:,]+:[^:,]*))}$') 

35 

36 # Custom field mapping for LCSC barcodes 

37 LCSC_FIELDS = { 

38 'pm': SupplierBarcodeMixin.MANUFACTURER_PART_NUMBER, 

39 'pc': SupplierBarcodeMixin.SUPPLIER_PART_NUMBER, 

40 'qty': SupplierBarcodeMixin.QUANTITY, 

41 'on': SupplierBarcodeMixin.SUPPLIER_ORDER_NUMBER, 

42 } 

43 

44 def extract_barcode_fields(self, barcode_data: str) -> dict[str, str]: 

45 """Get supplier_part and barcode_fields from LCSC QR-Code. 

46 

47 Example LCSC QR-Code: {pbn:PICK2009291337,on:SO2009291337,pc:C312270} 

48 """ 

49 if not self.LCSC_BARCODE_REGEX.fullmatch(barcode_data): 

50 return {} 

51 

52 # Extract fields 

53 fields = SupplierBarcodeMixin.split_fields( 

54 barcode_data, delimiter=',', header='{', trailer='}' 

55 ) 

56 

57 fields = dict(pair.split(':') for pair in fields) 

58 

59 barcode_fields = {} 

60 

61 # Map from LCSC field names to standard field names 

62 for key, field in self.LCSC_FIELDS.items(): 

63 if key in fields: 

64 barcode_fields[field] = fields[key] 

65 

66 return barcode_fields