mirror of
https://github.com/inventree/InvenTree.git
synced 2025-09-14 14:41:33 +00:00
Refactor barcode endoint
- Moved code into 'barcode' directory
This commit is contained in:
@@ -1,79 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import hashlib
|
||||
|
||||
from stock.serializers import StockItemSerializer, LocationSerializer
|
||||
from part.serializers import PartSerializer
|
||||
|
||||
import plugins.plugin as plugin
|
||||
|
||||
|
||||
class BarcodePlugin(plugin.InvenTreePlugin):
|
||||
"""
|
||||
The BarcodePlugin class is the base class for any barcode plugin.
|
||||
"""
|
||||
|
||||
def __init__(self, barcode_data):
|
||||
plugin.InvenTreePlugin.__init__(self)
|
||||
|
||||
self.data = barcode_data
|
||||
|
||||
def hash(self):
|
||||
"""
|
||||
Calculate a hash for the barcode data.
|
||||
This is supposed to uniquely identify the barcode contents,
|
||||
at least within the bardcode sub-type.
|
||||
|
||||
The default implementation simply returns an MD5 hash of the barcode data,
|
||||
encoded to a string.
|
||||
|
||||
This may be sufficient for most applications, but can obviously be overridden
|
||||
by a subclass.
|
||||
|
||||
"""
|
||||
|
||||
hash = hashlib.md5(str(self.data).encode())
|
||||
return str(hash.hexdigest())
|
||||
|
||||
def validate(self):
|
||||
"""
|
||||
Default implementation returns False
|
||||
"""
|
||||
return False
|
||||
|
||||
def decode(self):
|
||||
"""
|
||||
Decode the barcode, and craft a response
|
||||
"""
|
||||
|
||||
return None
|
||||
|
||||
def render_part(self, part):
|
||||
"""
|
||||
Render a Part object to JSON
|
||||
Use the existing serializer to do this.
|
||||
"""
|
||||
|
||||
serializer = PartSerializer(part)
|
||||
|
||||
return serializer.data
|
||||
|
||||
def render_stock_location(self, loc):
|
||||
"""
|
||||
Render a StockLocation object to JSON
|
||||
Use the existing serializer to do this.
|
||||
"""
|
||||
|
||||
serializer = LocationSerializer(loc)
|
||||
|
||||
return serializer.data
|
||||
|
||||
def render_stock_item(self, item):
|
||||
"""
|
||||
Render a StockItem object to JSON.
|
||||
Use the existing serializer to do this
|
||||
"""
|
||||
|
||||
serializer = StockItemSerializer(item, part_detail=True, location_detail=True, supplier_part_detail=True)
|
||||
|
||||
return serializer.data
|
@@ -1,8 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import barcode
|
||||
|
||||
|
||||
class DigikeyBarcodePlugin(barcode.BarcodePlugin):
|
||||
|
||||
PLUGIN_NAME = "DigikeyBarcodePlugin"
|
@@ -1,94 +0,0 @@
|
||||
"""
|
||||
The InvenTreeBarcodePlugin validates barcodes generated by InvenTree itself.
|
||||
It can be used as a template for developing third-party barcode plugins.
|
||||
|
||||
The data format is very simple, and maps directly to database objects,
|
||||
via the "id" parameter.
|
||||
|
||||
Parsing an InvenTree barcode simply involves validating that the
|
||||
references model objects actually exist in the database.
|
||||
"""
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
|
||||
from . import barcode
|
||||
|
||||
from stock.models import StockItem, StockLocation
|
||||
from part.models import Part
|
||||
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
|
||||
class InvenTreeBarcodePlugin(barcode.BarcodePlugin):
|
||||
|
||||
PLUGIN_NAME = "InvenTreeBarcodePlugin"
|
||||
|
||||
def validate(self):
|
||||
"""
|
||||
An "InvenTree" barcode must include the following tags:
|
||||
|
||||
{
|
||||
'tool': 'InvenTree',
|
||||
'version': <anything>
|
||||
}
|
||||
|
||||
"""
|
||||
|
||||
# The data must either be dict or be able to dictified
|
||||
if type(self.data) is dict:
|
||||
pass
|
||||
elif type(self.data) is str:
|
||||
try:
|
||||
self.data = json.loads(self.data)
|
||||
except json.JSONDecodeError:
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
|
||||
for key in ['tool', 'version']:
|
||||
if key not in self.data.keys():
|
||||
return False
|
||||
|
||||
if not self.data['tool'] == 'InvenTree':
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def decode(self):
|
||||
|
||||
response = {}
|
||||
|
||||
if 'part' in self.data.keys():
|
||||
id = self.data['part'].get('id', None)
|
||||
|
||||
try:
|
||||
part = Part.objects.get(id=id)
|
||||
response['part'] = self.render_part(part)
|
||||
except (ValueError, Part.DoesNotExist):
|
||||
response['error'] = _('Part does not exist')
|
||||
|
||||
elif 'stocklocation' in self.data.keys():
|
||||
id = self.data['stocklocation'].get('id', None)
|
||||
|
||||
try:
|
||||
loc = StockLocation.objects.get(id=id)
|
||||
response['stocklocation'] = self.render_stock_location(loc)
|
||||
except (ValueError, StockLocation.DoesNotExist):
|
||||
response['error'] = _('StockLocation does not exist')
|
||||
|
||||
elif 'stockitem' in self.data.keys():
|
||||
|
||||
id = self.data['stockitem'].get('id', None)
|
||||
|
||||
try:
|
||||
item = StockItem.objects.get(id=id)
|
||||
response['stockitem'] = self.render_stock_item(item)
|
||||
except (ValueError, StockItem.DoesNotExist):
|
||||
response['error'] = _('StockItem does not exist')
|
||||
|
||||
else:
|
||||
response['error'] = _('No matching data')
|
||||
|
||||
return response
|
@@ -4,10 +4,6 @@ import inspect
|
||||
import importlib
|
||||
import pkgutil
|
||||
|
||||
# Barcode plugins
|
||||
import plugins.barcode as barcode
|
||||
from plugins.barcode.barcode import BarcodePlugin
|
||||
|
||||
# Action plugins
|
||||
import plugins.action as action
|
||||
from plugins.action.action import ActionPlugin
|
||||
@@ -51,23 +47,6 @@ def get_plugins(pkg, baseclass):
|
||||
return plugins
|
||||
|
||||
|
||||
def load_barcode_plugins():
|
||||
"""
|
||||
Return a list of all registered barcode plugins
|
||||
"""
|
||||
|
||||
print("Loading barcode plugins")
|
||||
|
||||
plugins = get_plugins(barcode, BarcodePlugin)
|
||||
|
||||
if len(plugins) > 0:
|
||||
print("Discovered {n} barcode plugins:".format(n=len(plugins)))
|
||||
|
||||
for bp in plugins:
|
||||
print(" - {bp}".format(bp=bp.PLUGIN_NAME))
|
||||
|
||||
return plugins
|
||||
|
||||
|
||||
def load_action_plugins():
|
||||
"""
|
||||
|
Reference in New Issue
Block a user