Push even more barcode decoding to the individual plugin

- DigiKey barcode is NOT json formatted, for example...
This commit is contained in:
Oliver Walters 2020-04-14 23:33:03 +10:00
parent e56c018a4a
commit 7faa0d199d
2 changed files with 32 additions and 38 deletions

View File

@ -5,8 +5,6 @@ Main JSON interface views
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
import json
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.http import JsonResponse from django.http import JsonResponse
@ -61,49 +59,32 @@ class BarcodeScanView(APIView):
print("Barcode data:") print("Barcode data:")
print(barcode_data) print(barcode_data)
valid_data = False
if barcode_data is None: if barcode_data is None:
response['error'] = _('No barcode data provided') response['error'] = _('No barcode data provided')
elif type(barcode_data) is dict: # Look for a barcode plugin that knows how to handle the data
valid_data = True for plugin_class in barcode_plugins:
elif type(barcode_data) is str: # Instantiate the plugin with the provided plugin data
# Attempt to decode the barcode into a JSON object plugin = plugin_class(barcode_data)
try:
barcode_data = json.loads(barcode_data)
valid_data = True
except json.JSONDecodeError:
response['error'] = _('Barcode is not a JSON object')
else: if plugin.validate():
response['error'] = _('Barcode data is unknown format')
if valid_data: # Plugin should return a dict response
# Look for a barcode plugin that knows how to handle the data response = plugin.decode()
for plugin_class in barcode_plugins:
# Instantiate the plugin with the provided plugin data if type(response) is dict:
plugin = plugin_class(barcode_data) if 'success' not in response.keys() and 'error' not in response.keys():
response['success'] = _('Barcode successfully decoded')
else:
response = {
'error': _('Barcode plugin returned incorrect response')
}
if plugin.validate(): response['plugin'] = plugin.get_name()
response['hash'] = plugin.hash()
# Plugin should return a dict response break
response = plugin.decode()
if type(response) is dict:
if 'success' not in response.keys() and 'error' not in response.keys():
response['success'] = _('Barcode successfully decoded')
else:
response = {
'error': _('Barcode plugin returned incorrect response')
}
response['plugin'] = plugin.get_name()
response['hash'] = plugin.hash()
break
if 'error' not in response and 'success' not in response: if 'error' not in response and 'success' not in response:
response = { response = {

View File

@ -11,6 +11,8 @@ references model objects actually exist in the database.
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json
from . import barcode from . import barcode
from stock.models import StockItem, StockLocation from stock.models import StockItem, StockLocation
@ -34,6 +36,17 @@ class InvenTreeBarcodePlugin(barcode.BarcodePlugin):
""" """
# 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']: for key in ['tool', 'version']:
if key not in self.data.keys(): if key not in self.data.keys():
return False return False