diff --git a/InvenTree/InvenTree/settings.py b/InvenTree/InvenTree/settings.py index 7e3ed2c7a6..0ab85a16cf 100644 --- a/InvenTree/InvenTree/settings.py +++ b/InvenTree/InvenTree/settings.py @@ -204,7 +204,6 @@ INSTALLED_APPS = [ 'crispy_forms', # Improved form rendering 'import_export', # Import / export tables to file 'django_cleanup.apps.CleanupConfig', # Automatically delete orphaned MEDIA files - 'qr_code', # Generate QR codes 'mptt', # Modified Preorder Tree Traversal 'markdownx', # Markdown editing 'markdownify', # Markdown template rendering @@ -407,8 +406,6 @@ CACHES = { } } -QR_CODE_CACHE_ALIAS = 'qr-code' - # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index 1df5e83d5d..9f7be3fce1 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -9,7 +9,6 @@ from django.conf.urls import url, include from django.urls import path from django.contrib import admin from django.contrib.auth import views as auth_views -from qr_code import urls as qr_code_urls from company.urls import company_urls from company.urls import supplier_part_urls @@ -141,8 +140,6 @@ urlpatterns = [ url(r'^admin/shell/', include('django_admin_shell.urls')), url(r'^admin/', admin.site.urls, name='inventree-admin'), - url(r'^qr_code/', include(qr_code_urls, namespace='qr_code')), - url(r'^index/', IndexView.as_view(), name='index'), url(r'^search/', SearchView.as_view(), name='search'), url(r'^stats/', DatabaseStatsView.as_view(), name='stats'), diff --git a/InvenTree/report/templatetags/barcode.py b/InvenTree/report/templatetags/barcode.py new file mode 100644 index 0000000000..18afdea81e --- /dev/null +++ b/InvenTree/report/templatetags/barcode.py @@ -0,0 +1,64 @@ +""" +Template tags for rendering various barcodes +""" + +import os +import base64 + +from io import BytesIO + + +from django import template + +import qrcode +import barcode + +register = template.Library() + + +def image_data(img, fmt='PNG'): + """ + Convert an image into HTML renderable data + + Returns a string ``data:image/FMT;base64,xxxxxxxxx`` which can be rendered to an tag + """ + + buffered = BytesIO() + img.save(buffered, format=fmt) + + img_str = base64.b64encode(buffered.getvalue()) + + return f"data:image/{fmt.lower()};charset=utf-8;base64," + img_str.decode() + + +@register.simple_tag() +def qr_code(data, **kwargs): + """ + Return a byte-encoded QR code image + + Optional kwargs + --------------- + + fill_color: Fill color (default = black) + back_color: Background color (default = white) + """ + + # Construct "default" values + params = dict( + box_size=20, + border=1, + ) + + fill_color = kwargs.pop('fill_color', 'black') + back_color = kwargs.pop('back_color', 'white') + + params.update(**kwargs) + + qr = qrcode.QRCode(**params) + + qr.add_data(data, optimize=20) + qr.make(fit=True) + + qri = qr.make_image(fill_color=fill_color, back_color=back_color) + + return image_data(qri) \ No newline at end of file diff --git a/InvenTree/templates/qr_code.html b/InvenTree/templates/qr_code.html index 8bb288f797..c6c2f44b87 100644 --- a/InvenTree/templates/qr_code.html +++ b/InvenTree/templates/qr_code.html @@ -1,12 +1,14 @@ -{% load qr_code %} +{% load barcode %} +{% load i18n %}
{% if qr_data %}
- QR Code +
{% else %} - Error:
- {{ error_msg }} +
+ {% trans "QR data not provided" %} +
{% endif %}
\ No newline at end of file