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 %}