From 5bd178db63db3ff05165fc131960f198b2fbbca3 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 26 Feb 2019 20:14:22 +0100 Subject: QR code: QR code export, display on ODT and PDF --- ishtar_common/models.py | 3 ++- ishtar_common/static/media/style_basic.css | 14 ++++++---- .../templates/ishtar/blocks/window_nav.html | 9 ++++--- ishtar_common/templates/ishtar/sheet.html | 31 ++++++++++++++-------- ishtar_common/urls.py | 2 ++ ishtar_common/views.py | 31 +++++++++++++++++++--- ishtar_common/views_item.py | 3 +++ 7 files changed, 70 insertions(+), 23 deletions(-) (limited to 'ishtar_common') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 9b5185be4..247ab4f61 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1572,6 +1572,7 @@ class FixAssociated(object): class QRCodeItem(models.Model, ImageContainerModel): + HAS_QR_CODE = True qrcode = models.ImageField(upload_to=get_image_path, blank=True, null=True, max_length=255) @@ -1582,7 +1583,7 @@ class QRCodeItem(models.Model, ImageContainerModel): url = self.get_absolute_url() site = Site.objects.get_current() if request: - scheme = self.request.scheme + scheme = request.scheme else: if secure: scheme = "https" diff --git a/ishtar_common/static/media/style_basic.css b/ishtar_common/static/media/style_basic.css index bfd89dfca..051543ea9 100644 --- a/ishtar_common/static/media/style_basic.css +++ b/ishtar_common/static/media/style_basic.css @@ -54,10 +54,18 @@ td{ margin:0; padding:0; padding-top:4px; - text-align:right; + text-align: right; border:1px solid #EEE; border-top:none; font-size:0.9em; + background-color: #ddd; +} + +.window-table-head td{ + text-align: left; + border:0 solid transparent; + font-size: 1em; + background-color: transparent; } .link{ @@ -92,10 +100,6 @@ p{ margin:0.2em; } -td{ - background-color: #ddd; -} - #pdffooter, #pdfheader{ text-align:center; } diff --git a/ishtar_common/templates/ishtar/blocks/window_nav.html b/ishtar_common/templates/ishtar/blocks/window_nav.html index a53e62b0d..92fa15352 100644 --- a/ishtar_common/templates/ishtar/blocks/window_nav.html +++ b/ishtar_common/templates/ishtar/blocks/window_nav.html @@ -71,15 +71,18 @@ aria-labelledby="dropdown-sheet-export-{{window_id}}"> - ODT + ODT - PDF + PDF {% for template_name, template_url in extra_templates %} - {{template_name}} + {{template_name}} {% endfor %} + {% if item.HAS_QR_CODE %} + {% trans "QR Code" %} + {% endif %} diff --git a/ishtar_common/templates/ishtar/sheet.html b/ishtar_common/templates/ishtar/sheet.html index e937f1474..6b9c97948 100644 --- a/ishtar_common/templates/ishtar/sheet.html +++ b/ishtar_common/templates/ishtar/sheet.html @@ -8,28 +8,37 @@ {% endblock %} -
+ + {% if output != "ODT" and output != "PDF" %} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index aea419d08..957b1bfb3 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -40,6 +40,8 @@ urlpatterns = [ url(r'shortcut_menu/', views.shortcut_menu, name='shortcut-menu'), url(r'display/(?P\w+)/(?P\d+)/', views.DisplayItemView.as_view(), name='display-item'), + url(r'qrcode/(?P[-a-z]+)/(?P[-a-z]+)/(?P\d+)/', + views.QRCodeView.as_view(), name='qrcode-item'), url(r'person_search/(?P.+)?$', check_rights(['add_person'])( views.person_search_wizard), name='person_search'), diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 61bae69e2..5f5b0be42 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -19,12 +19,14 @@ import csv import datetime +import importlib import json import logging -import importlib +import os +import unicodecsv import unicodedata -import unicodecsv +from django.apps import apps from django.conf import settings from django.contrib.auth import logout from django.contrib.auth.decorators import login_required @@ -38,7 +40,7 @@ from django.http import HttpResponse, Http404, HttpResponseRedirect, \ from django.shortcuts import redirect, render from django.utils.decorators import method_decorator from django.utils.translation import ugettext, ugettext_lazy as _ -from django.views.generic import ListView, UpdateView, TemplateView +from django.views.generic import ListView, TemplateView, View from django.views.generic.edit import CreateView, DeleteView, FormView, \ UpdateView from extra_views import ModelFormSetView @@ -1010,6 +1012,29 @@ class DisplayItemView(IshtarMixin, LoginRequiredMixin, TemplateView): return data +class QRCodeView(IshtarMixin, LoginRequiredMixin, View): + def get(self, request, *args, **kwargs): + model_name = "".join( + [part.capitalize() for part in kwargs.get('model_name').split('-')] + ) + app = kwargs.get('app').replace('-', "_") + try: + model = apps.get_model(app, model_name) + item = model.objects.get(pk=kwargs.get("pk")) + assert hasattr(item, 'qrcode') + except (LookupError, model.DoesNotExist, AssertionError): + raise Http404() + + if not item.qrcode or not item.qrcode.name: + item.generate_qrcode(request=self.request) + + if not item.qrcode or not item.qrcode.name: # generation has failed + raise Http404() + + with open(settings.MEDIA_ROOT + os.sep + item.qrcode.name, "rb") as f: + return HttpResponse(f.read(), content_type="image/png") + + class GlobalVarEdit(IshtarMixin, AdminLoginRequiredMixin, ModelFormSetView): template_name = 'ishtar/formset.html' model = models.GlobalVar diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index ffbbbb936..16128feba 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -218,6 +218,9 @@ def show_item(model, name, extra_dct=None, model_for_perms=None): item.history_date = historized[0].history_date if len(historized) > 1: dct['previous'] = historized[1].history_date + if doc_type in ("odt", "pdf") and hasattr(item, 'qrcode') \ + and (not item.qrcode or not item.qrcode.name): + item.generate_qrcode(request=request) dct['item'], dct['item_name'] = item, name # add context if extra_dct: -- cgit v1.2.3