188 lines
3.8 KiB
Python
188 lines
3.8 KiB
Python
# This file is part of barcodenumber. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
'''
|
|
Check and decode the barcodes
|
|
'''
|
|
from stdnum import ean, isbn
|
|
import re
|
|
from . import gs1datamatrix
|
|
|
|
__version__ = '0.5.0'
|
|
|
|
|
|
def barcodes():
|
|
'''
|
|
Return the list of barcodes that have check function
|
|
'''
|
|
res = [x.replace('check_code_', '').upper() for x in globals()
|
|
if x.startswith('check_code_')]
|
|
res.sort()
|
|
return res
|
|
|
|
|
|
def is_pair(x):
|
|
return not x % 2
|
|
|
|
|
|
def check_code_code39(number):
|
|
'''
|
|
Check code39 code.
|
|
'''
|
|
matches = re.findall(r"[A-Z\d*\s\-\$%\./\+]", number)
|
|
return len(number) == len(matches)
|
|
|
|
|
|
def check_code_ean(number):
|
|
'''
|
|
Check ean code.
|
|
'''
|
|
return ean.is_valid(number) and len(number) == 12
|
|
|
|
|
|
def check_code_ean13(number):
|
|
'''
|
|
Check ean13 code.
|
|
'''
|
|
return ean.is_valid(number) and len(number) == 13
|
|
|
|
|
|
def check_code_ean8(number):
|
|
'''
|
|
Check ean8 code.
|
|
'''
|
|
return ean.is_valid(number) and len(number) == 8
|
|
|
|
|
|
def check_code_gs1(number):
|
|
'''
|
|
Check gs1 code.
|
|
'''
|
|
return True
|
|
|
|
|
|
def check_code_gtin(number):
|
|
'''
|
|
Check gtin code.
|
|
'''
|
|
return ean.is_valid(number) and len(number) == 13
|
|
|
|
|
|
def check_code_gtin14(number):
|
|
'''
|
|
Check gtin14 code.
|
|
'''
|
|
return ean.is_valid(number) and len(number) == 14
|
|
|
|
|
|
def check_code_isbn(number):
|
|
'''
|
|
Check isbn code.
|
|
'''
|
|
return isbn.is_valid(number)
|
|
|
|
|
|
def check_code_isbn10(number):
|
|
'''
|
|
Check isbn10 code.
|
|
'''
|
|
return isbn.isbn_type(number) == 'ISBN10'
|
|
|
|
|
|
def check_code_isbn13(number):
|
|
'''
|
|
Check isbn13 code.
|
|
'''
|
|
return isbn.isbn_type(number) == 'ISBN13'
|
|
|
|
|
|
def check_code_issn(number):
|
|
'''
|
|
Check issn code.
|
|
'''
|
|
return True
|
|
|
|
|
|
def check_code_jan(number):
|
|
'''
|
|
Check jan code.
|
|
'''
|
|
return True
|
|
|
|
|
|
def check_code_pzn(number):
|
|
'''
|
|
Check pzn code.
|
|
'''
|
|
return True
|
|
|
|
|
|
def check_code_upc(number):
|
|
'''
|
|
Check upc code.
|
|
'''
|
|
return ean.is_valid(number) and len(number) == 12
|
|
|
|
|
|
def check_code_upca(number):
|
|
'''
|
|
Check upca code.
|
|
'''
|
|
return True
|
|
|
|
|
|
def check_code_gs1_datamatrix(number):
|
|
'''
|
|
Check GS1 datamatrix
|
|
'''
|
|
gtin = gs1datamatrix.ProductCode.extract(number)
|
|
# GTIN14 will never start with a zero.
|
|
gtin_is_valid = ((check_code_gtin14(gtin)
|
|
or check_code_gtin(gtin.lstrip('0'))) if gtin else False)
|
|
return True if gtin_is_valid else False
|
|
|
|
|
|
def check_code(code, number):
|
|
'''
|
|
Check barcode
|
|
'''
|
|
try:
|
|
checker = globals()['check_code_%s' % code.lower()]
|
|
except KeyError:
|
|
return False
|
|
return checker(number)
|
|
|
|
|
|
def decode_code_gs1_datamatrix(number):
|
|
result = {}
|
|
gtin = gs1datamatrix.ProductCode.extract(number)
|
|
if gtin:
|
|
result['product_code'] = gtin
|
|
_, unparsed_code = number.split(gtin, 1)
|
|
expiration_date = gs1datamatrix.ExpirationDate.extract(
|
|
unparsed_code)
|
|
result['expiration_date'] = expiration_date
|
|
_, unparsed_code = unparsed_code.split(expiration_date, 1)
|
|
lot = gs1datamatrix.Lot.extract(unparsed_code)
|
|
result['lot'] = lot
|
|
_, unparsed_code = unparsed_code.split(lot, 1)
|
|
# remove separators from variable elements
|
|
unparsed_code = unparsed_code.replace(
|
|
gs1datamatrix.SEPARATOR, '', 1).replace(
|
|
gs1datamatrix.HUMAN_SEPARATOR, '', 1)
|
|
serial_number = gs1datamatrix.SerialNumber.extract(unparsed_code)
|
|
result['serial_number'] = serial_number
|
|
|
|
return result
|
|
|
|
|
|
def decode_code(code, number):
|
|
'''
|
|
Decode Barcode
|
|
'''
|
|
if not check_code(code, number):
|
|
return {}
|
|
try:
|
|
decoder = globals()['decode_code_%s' % code.lower()]
|
|
except KeyError:
|
|
return False
|
|
return decoder(number)
|