summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
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
commit5bd178db63db3ff05165fc131960f198b2fbbca3 (patch)
treec644209eb81804406bfc5f014713dc1f62bc5ad4 /ishtar_common
parentbb1bb0cf461766997a1496547edbbdf04ade4bd6 (diff)
downloadIshtar-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.py3
-rw-r--r--ishtar_common/static/media/style_basic.css14
-rw-r--r--ishtar_common/templates/ishtar/blocks/window_nav.html9
-rw-r--r--ishtar_common/templates/ishtar/sheet.html31
-rw-r--r--ishtar_common/urls.py2
-rw-r--r--ishtar_common/views.py31
-rw-r--r--ishtar_common/views_item.py3
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: