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
« 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.
3This plugin can currently only match LCSC barcodes to supplier parts.
4"""
6import re
8from django.utils.translation import gettext_lazy as _
10from plugin import InvenTreePlugin
11from plugin.mixins import SettingsMixin, SupplierBarcodeMixin
14class LCSCPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin):
15 """Plugin to integrate the LCSC API into InvenTree."""
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')
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 }
34 LCSC_BARCODE_REGEX = re.compile(r'^{((?:[^:,]+:[^:,]*,)*(?:[^:,]+:[^:,]*))}$')
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 }
44 def extract_barcode_fields(self, barcode_data: str) -> dict[str, str]:
45 """Get supplier_part and barcode_fields from LCSC QR-Code.
47 Example LCSC QR-Code: {pbn:PICK2009291337,on:SO2009291337,pc:C312270}
48 """
49 if not self.LCSC_BARCODE_REGEX.fullmatch(barcode_data):
50 return {}
52 # Extract fields
53 fields = SupplierBarcodeMixin.split_fields(
54 barcode_data, delimiter=',', header='{', trailer='}'
55 )
57 fields = dict(pair.split(':') for pair in fields)
59 barcode_fields = {}
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]
66 return barcode_fields