diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-02-26 20:14:22 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-04-24 19:38:57 +0200 |
commit | 5bd178db63db3ff05165fc131960f198b2fbbca3 (patch) | |
tree | c644209eb81804406bfc5f014713dc1f62bc5ad4 /ishtar_common | |
parent | bb1bb0cf461766997a1496547edbbdf04ade4bd6 (diff) | |
download | Ishtar-5bd178db63db3ff05165fc131960f198b2fbbca3.tar.bz2 Ishtar-5bd178db63db3ff05165fc131960f198b2fbbca3.zip |
QR code: QR code export, display on ODT and PDF
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/models.py | 3 | ||||
-rw-r--r-- | ishtar_common/static/media/style_basic.css | 14 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/blocks/window_nav.html | 9 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet.html | 31 | ||||
-rw-r--r-- | ishtar_common/urls.py | 2 | ||||
-rw-r--r-- | ishtar_common/views.py | 31 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 3 |
7 files changed, 70 insertions, 23 deletions
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}}"> <a class="dropdown-item" href='{% url show_url item.pk "odt" %}' title='{% trans "Export as OpenOffice.org file"%}'> - ODT <i class="fa fa-file-word-o" aria-hidden="true"></i> + <i class="fa fa-file-word-o" aria-hidden="true"></i> ODT </a> <a class="dropdown-item" href='{% url show_url item.pk "pdf" %}' title='{% trans "Export as PDF file"%}'> - PDF <i class="fa fa-file-pdf-o" aria-hidden="true"></i> + <i class="fa fa-file-pdf-o" aria-hidden="true"></i> PDF </a>{% for template_name, template_url in extra_templates %} <a class="dropdown-item" href='{{template_url}}'> - {{template_name}} <i class="fa fa-file-word-o" aria-hidden="true"></i> + <i class="fa fa-file-word-o" aria-hidden="true"></i> {{template_name}} </a>{% endfor %} + {% if item.HAS_QR_CODE %}<a class="dropdown-item" href='{% url "qrcode-item" item.APP item.MODEL item.pk %}' target="_blank"> + <i class="fa fa-qrcode" aria-hidden="true"></i> {% trans "QR Code" %} + </a>{% endif %} </div> </div> 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 @@ </head> <body> {% endblock %} - <div class="card sheet" id="{{window_id}}"> + + {% if output != "ODT" and output != "PDF" %} <div class="card-header" data-sheet-id="{{sheet_id}}" role="tab" id='head-{{window_id}}'> <div class="row"> <div class="col-9"> - {% if output != "ODT" and output != "PDF"%} <h5 class="mb-0"> <a class="card-label" data-toggle="collapse" href="#collapse-{{window_id}}" aria-expanded="true" aria-controls="collapse-{{window_id}}"> - {% else %} - <h2> - {% endif %} + {% else %} + {% if item.qrcode.name %} + <table class="window-table-head"> + <tr> + <td> <img class="qrcode" src="{{BASE_URL}}{{item.qrcode.url}}"> </td> + <td> + {% endif %} + <h2> + {% endif %} {% block head_title %}{% endblock %} - {% if output == "ODT" or output == "PDF"%} - </h2> - {% else %} + {% if output == "ODT" or output == "PDF" %} + </h2> + {% if item.qrcode.name %} + </td> + </tr> + </table> + {% endif %} + {% else %} </a> </h5> - {% endif %} </div> - {% if output != "ODT" and output != "PDF"%} <div class='col-2 text-center'> <a href='#' class='previous_page'> <span class="fa-stack"> @@ -53,8 +62,8 @@ </span> </a> </div> - {% endif %} </div> + {% endif %} {% block header_title %}{% endblock %} </div> 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<item_type>\w+)/(?P<pk>\d+)/', views.DisplayItemView.as_view(), name='display-item'), + url(r'qrcode/(?P<app>[-a-z]+)/(?P<model_name>[-a-z]+)/(?P<pk>\d+)/', + views.QRCodeView.as_view(), name='qrcode-item'), url(r'person_search/(?P<step>.+)?$', 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: |