diff --git a/Pipfile b/Pipfile
index 3bfe5209..b724e67a 100644
--- a/Pipfile
+++ b/Pipfile
@@ -23,7 +23,7 @@ pyyaml = "*"
uritemplate = "*"
whitenoise = "*"
django-taggit = "*"
-qrcode = "*"
+django-qr-code = "*"
[dev-packages]
coveralls = "*"
diff --git a/babybuddy/settings/base.py b/babybuddy/settings/base.py
index c51fb1ce..27d813e8 100644
--- a/babybuddy/settings/base.py
+++ b/babybuddy/settings/base.py
@@ -36,6 +36,7 @@ INSTALLED_APPS = [
"imagekit",
"storages",
"import_export",
+ "qr_code",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
diff --git a/babybuddy/templates/babybuddy/login_qr_code.txt b/babybuddy/templates/babybuddy/login_qr_code.txt
new file mode 100644
index 00000000..9b4182c9
--- /dev/null
+++ b/babybuddy/templates/babybuddy/login_qr_code.txt
@@ -0,0 +1,4 @@
+{% load i18n widget_tweaks babybuddy_tags qr_code %}
+{% url 'babybuddy:root-router' as relative_root_url %}
+{% make_absolute_url relative_root_url as absolute_root_url %}
+BABYBUDDY-LOGIN:{"url":"{{ absolute_root_url }}","api_key":"{{ user.settings.api_key }}"}
\ No newline at end of file
diff --git a/babybuddy/templates/babybuddy/user_settings_form.html b/babybuddy/templates/babybuddy/user_settings_form.html
index 7ac8901b..d91091d0 100644
--- a/babybuddy/templates/babybuddy/user_settings_form.html
+++ b/babybuddy/templates/babybuddy/user_settings_form.html
@@ -1,5 +1,5 @@
{% extends 'babybuddy/page.html' %}
-{% load i18n widget_tweaks babybuddy_tags %}
+{% load i18n widget_tweaks babybuddy_tags qr_code %}
{% block title %}{% trans "User Settings" %}{% endblock %}
@@ -87,12 +87,9 @@
diff --git a/babybuddy/templatetags/babybuddy_tags.py b/babybuddy/templatetags/babybuddy_tags.py
index 5a840e75..4f8c8c3e 100644
--- a/babybuddy/templatetags/babybuddy_tags.py
+++ b/babybuddy/templatetags/babybuddy_tags.py
@@ -67,103 +67,3 @@ def make_absolute_url(context, url):
request = context["request"]
abs_url = request.build_absolute_uri(url)
return abs_url
-
-
-class QrCodeNode(template.Node):
- def __init__(self, nodelist, strip, border, box_size) -> None:
- super().__init__()
- self.__nodelist = nodelist
- self.__strip = strip
- self.__border = border
- self.__box_size = box_size
-
- def render(self, context):
- contents = ""
- for node in self.__nodelist:
- contents += node.render(context)
- if self.__strip:
- contents = contents.strip()
-
- import qrcode
-
- qr = qrcode.QRCode(border=self.__border, box_size=self.__box_size)
- qr.add_data(contents)
- qr.make(fit=True)
- image = qr.make_image()
-
- bytesio = io.BytesIO()
- image.save(bytesio, format="png")
- base64_data = base64.b64encode(bytesio.getbuffer()).decode()
- return f"data:image/png;base64,{base64_data}"
-
-
-@register.tag_function
-def qrcodepng(parser, token):
- """
- This template tag allows the generation of arbirary qr code pngs that
- can be displayed, for example, in html tags.
-
- The template tag can be used as follows:
-
-
-
- This will produce a qrcode that encodes the
- string "\n Hello World\n ". One can use the qrcode parameter
- ``stripwhitespace`` to strip the extra whitespace at the start and end of
- the string:
-
- {% qrcodepng stripwhitespace %}
-
- All supported arguments:
-
- - stripwhitespace: strip whitespace of the qrcode-contents
- - border=[int]: Border of the qrcode in pixels (default: 1)
- - box_size=[int]: Pixel size of the qr-code blocks (default: 5)
- """
-
- contents = token.split_contents()
- params = contents[1:]
-
- def get_parameter(name: str, value_type=None):
- search_for = name
- if value_type is not None:
- search_for += "="
-
- for p in params:
- if p.startswith(search_for):
- if value_type is None:
- if p != search_for:
- continue
- params.remove(p)
- return True
- else:
- str_value = p[len(search_for) :]
- try:
- result = value_type(str_value)
- except ValueError:
- raise template.TemplateSyntaxError(
- f"Invalid parameter '{p}' does "
- f"not have type '{value_type}'"
- )
- else:
- params.remove(p)
- return result
-
- if value_type is None:
- return False
- return None
-
- strip = get_parameter("stripwhitespace")
- border = get_parameter("border", int) or 1
- box_size = get_parameter("box_size", int) or 5
-
- if params:
- raise template.TemplateSyntaxError(
- f"Unkown arguments for qrcode template tag: {', '.join(params)}"
- )
-
- nodelist = parser.parse(("endqrcodepng",))
- parser.delete_first_token()
- return QrCodeNode(nodelist, strip, border, box_size)
diff --git a/babybuddy/views.py b/babybuddy/views.py
index c2ad4cda..24acf494 100644
--- a/babybuddy/views.py
+++ b/babybuddy/views.py
@@ -160,16 +160,21 @@ class UserSettings(LoginRequiredMixin, View):
form_user_class = forms.UserForm
form_settings_class = forms.UserSettingsForm
template_name = "babybuddy/user_settings_form.html"
+ qr_code_template = "babybuddy/login_qr_code.txt"
def get(self, request):
settings = request.user.settings
+ qr_code_response = render(request, self.qr_code_template)
+ qr_code_data = qr_code_response.content.decode().strip()
+
return render(
request,
self.template_name,
{
"form_user": self.form_user_class(instance=request.user),
"form_settings": self.form_settings_class(instance=settings),
+ "qr_code_data": qr_code_data,
},
)
diff --git a/requirements.txt b/requirements.txt
index 4ebffb44..5e387283 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -12,6 +12,7 @@ django-filter==22.1
django-imagekit==4.1.0
django-import-export==2.8.0
django-ipware==4.0.2
+django-qr-code==3.1.1
django-storages==1.12.3
django-taggit==3.0.0
django-widget-tweaks==1.4.12
@@ -31,7 +32,6 @@ python-dateutil==2.8.2
python-dotenv==0.20.0
pytz==2022.1
pyyaml==6.0
-qrcode==7.3.1
s3transfer==0.6.0
setuptools==63.1.0
six==1.16.0