From be4f987d354e8e89393a1681c117ecb5f9240898 Mon Sep 17 00:00:00 2001 From: Paul Konstantin Gerke Date: Tue, 30 Aug 2022 21:26:45 +0200 Subject: [PATCH] Remove qrcode library and replace with django-qre-code Required some rework to make qr-codes work via a template machanism. I think that the new solution is working neatly as well. --- Pipfile | 2 +- babybuddy/settings/base.py | 1 + .../templates/babybuddy/login_qr_code.txt | 4 + .../babybuddy/user_settings_form.html | 11 +- babybuddy/templatetags/babybuddy_tags.py | 100 ------------------ babybuddy/views.py | 5 + requirements.txt | 2 +- 7 files changed, 16 insertions(+), 109 deletions(-) create mode 100644 babybuddy/templates/babybuddy/login_qr_code.txt 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 @@
- {% url 'babybuddy:root-router' as relative_root_url %} - {% make_absolute_url relative_root_url as absolute_root_url %} - - +
+ {% qr_from_text qr_code_data size="s" %} +
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