summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-15 13:19:49 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-15 13:19:49 +0200
commit45a774990b8d89ae2fb1139691ad70257cf93d02 (patch)
treefba888f7518b7581c80dc826abde5d2bb0d9b4d7
parentdf43f19a2f61bffe4fc89baef578dd7ecb0005cc (diff)
downloadIshtar-45a774990b8d89ae2fb1139691ad70257cf93d02.tar.bz2
Ishtar-45a774990b8d89ae2fb1139691ad70257cf93d02.zip
QR Code for searches
-rw-r--r--ishtar_common/forms_common.py41
-rw-r--r--ishtar_common/static/js/ishtar.js17
-rw-r--r--ishtar_common/templates/blocks/DataTables.html1
-rw-r--r--ishtar_common/templates/ishtar/forms/qrcode_for_search.html78
-rw-r--r--ishtar_common/templates/widgets/search_input.html11
-rw-r--r--ishtar_common/urls.py2
-rw-r--r--ishtar_common/views.py10
7 files changed, 153 insertions, 7 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index 67e29289a..48d0fdc7b 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -17,12 +17,13 @@
# See the file COPYING for details.
-"""
-Administrative forms definitions: manage accounts and persons
-"""
-
+import datetime
+import os
+import pyqrcode
import requests
+import shutil
import tempfile
+from urllib.parse import urlparse, quote
from django import forms
from django.conf import settings
@@ -34,6 +35,7 @@ from django.core.exceptions import ObjectDoesNotExist
from django.core.files import File
from django.forms.formsets import formset_factory
from django.forms.models import BaseModelFormSet, BaseFormSet
+from django.shortcuts import reverse
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _, pgettext
@@ -1601,3 +1603,34 @@ class SearchQueryForm(forms.Form):
sq.query = data['query']
sq.save()
return sq
+
+
+class QRSearchForm(forms.Form):
+ query = forms.CharField(max_length=None, label=_(u"Query"), initial='*')
+ current_url = forms.CharField(max_length=None, label="",
+ widget=forms.HiddenInput())
+
+ def save(self):
+ data = self.cleaned_data
+ url = data["current_url"]
+ parsed_url = urlparse(url)
+ base_url = "{}://{}".format(parsed_url.scheme, parsed_url.netloc)
+ url = base_url + parsed_url.path
+ url += "?stored_search=" + quote(data["query"])
+ tiny_url = models.TinyUrl.objects.create(link=url)
+
+ short_url = base_url + reverse('tiny-redirect',
+ args=[tiny_url.get_short_id()])
+ qr = pyqrcode.create(short_url, version=settings.ISHTAR_QRCODE_VERSION)
+ tmpdir = tempfile.mkdtemp("-qrcode")
+ date = datetime.datetime.today().isoformat().replace(
+ ":", "-").replace(".", "")
+ base_filename = '{}-qrcode.png'.format(date)
+ filename = os.path.join(tmpdir, base_filename)
+ qr.png(filename, scale=settings.ISHTAR_QRCODE_SCALE)
+
+ dest_dir = os.path.join(settings.MEDIA_ROOT, "tmp")
+ if not os.path.exists(dest_dir):
+ os.makedirs(dest_dir)
+ shutil.move(filename, dest_dir)
+ return os.path.join(settings.MEDIA_URL, "tmp", base_filename)
diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js
index 2c2a72e17..7d93c6e45 100644
--- a/ishtar_common/static/js/ishtar.js
+++ b/ishtar_common/static/js/ishtar.js
@@ -39,6 +39,13 @@ if (typeof String.prototype.format !== 'function') {
};
}
+$.urlParam = function(name){
+ var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
+ if (results==null) {
+ return null;
+ }
+ return decodeURI(results[1]) || 0;
+}
function manage_async_link(event){
event.preventDefault();
@@ -794,9 +801,11 @@ var enable_save = function(){
if ($(".search-widget input").val()){
$("#save-search-button").removeClass('disabled');
$("#clear-search-button").removeClass('disabled');
+ $("#generate-qrcode").removeClass('disabled');
} else {
$("#save-search-button").addClass('disabled');
$("#clear-search-button").addClass('disabled');
+ $("#generate-qrcode").addClass('disabled');
}
}
@@ -824,6 +833,13 @@ function _clear_search_criteria_fields(query){
filter_search_fields();
}
+var get_search_parameters_from_url = function(){
+ var stored_search = $.urlParam('stored_search');
+ if(!stored_search) return;
+ $("#id_search_vector").val(stored_search);
+ enable_save();
+};
+
function update_search_field(){
var query = $("#id_search_vector").val();
if (!query){
@@ -1180,7 +1196,6 @@ var render_gallery = function(data_table, table_name, nb_select, gallery_id){
var page_current = data_table['page'];
var recordsTotal = data_table['recordsTotal'];
html += "<span class='ishtar-gallery-info'>";
- console.log(data_table);
var page_min = ((page_current - 1) * nb_select + 1);
if (page_min > recordsTotal) page_min = recordsTotal;
html += info_show_msg + " " + page_min + " ";
diff --git a/ishtar_common/templates/blocks/DataTables.html b/ishtar_common/templates/blocks/DataTables.html
index 6b24049a4..54ae5a630 100644
--- a/ishtar_common/templates/blocks/DataTables.html
+++ b/ishtar_common/templates/blocks/DataTables.html
@@ -271,6 +271,7 @@ jQuery(document).ready(function(){
return true;
});
{% endif %}
+ get_search_parameters_from_url();
datatable_submit_search(true);
});
diff --git a/ishtar_common/templates/ishtar/forms/qrcode_for_search.html b/ishtar_common/templates/ishtar/forms/qrcode_for_search.html
new file mode 100644
index 000000000..255fd57ff
--- /dev/null
+++ b/ishtar_common/templates/ishtar/forms/qrcode_for_search.html
@@ -0,0 +1,78 @@
+{% load i18n inline_formset table_form %}
+<div class="modal-dialog modal-sm" id="save-qrcode-div">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5>{% trans "QR Code for this search" %}</h5>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ </div>
+ <div class="alert alert-info">
+ <p>{% trans "Print the generated QR Code to make it available with a simple scan." %}</p>
+ </div>
+ <form enctype="multipart/form-data"
+ action="{% url 'search-qrcode' %}" method="post" id="save-qrcode-form">
+ <div class="modal-body form-row-modal">
+ {% csrf_token %}
+ <div class='form'>
+ {% bs_form form%}
+ </div>
+ {% if qr_code %}
+ <div class='text-center'>
+ <a href="{{qr_code}}" target="_blank">
+ <img src="{{qr_code}}" class="img-thumbnail">
+ </a>
+ </div>
+ {% endif %}
+ </div>
+ <div class="modal-footer">
+ <div class="col-sm">
+ {% if not qr_code %}
+ <button type="button" id="search-qrcode-submit"
+ name='validate'
+ value="validate" class="btn btn-success">
+ {% trans "Generate" %}
+ </button>
+ {% endif %}
+ <button type="button" data-dismiss="modal"
+ aria-label="Close" class="btn btn-secondary">
+ {% trans "Close" %}
+ </button>
+ </div>
+ </div>
+ </form>
+ </div>
+</div>
+
+<script type='text/javascript'>
+
+var submit_gqr_form = function(){
+ $.ajax({
+ type: "POST",
+ url: "{% url 'search-qrcode' %}",
+ data: $("#save-qrcode-form").serialize(),
+ success: function(data){
+ $("#save-qrcode-div").parent().html(data);
+ },
+ dataType: 'html'
+ });
+ return false;
+}
+
+$(document).ready(function(){
+ $("#id_query").prop("readonly", true);
+ var q_value = $("#id_search_vector").val();
+ if (!q_value) q_value = '*';
+ $("#id_query").val(q_value);
+ $("#id_current_url").val(window.location.href);
+ $("#search-qrcode-submit").click(submit_gqr_form);
+ $("#save-qrcode-form").submit(function(e){
+ e.preventDefault();
+ submit_gqr_form();
+ return false;
+ });
+});
+
+</script>
+
+
diff --git a/ishtar_common/templates/widgets/search_input.html b/ishtar_common/templates/widgets/search_input.html
index 0083db54b..114fea5a1 100644
--- a/ishtar_common/templates/widgets/search_input.html
+++ b/ishtar_common/templates/widgets/search_input.html
@@ -39,8 +39,15 @@
id="load-bookmark">
<i class="fa fa-bookmark" aria-hidden="true"></i>
</span>
- <div class="dropdown-menu" id="bookmark-list">
- </div>
+ <div class="dropdown-menu" id="bookmark-list"></div>
+ <a class="input-group-text input-link async-link disabled"
+ id="generate-qrcode"
+ data-target="#modal-dynamic-form"
+ data-modal-open="#modal-dynamic-form"
+ title="{% trans 'Generate a QR Code' %}"
+ href="{% url 'search-qrcode' %}">
+ <i class="fa fa-qrcode" aria-hidden="true"></i>
+ </a>
</span>
</div>
diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py
index 664a6b391..534e618f7 100644
--- a/ishtar_common/urls.py
+++ b/ishtar_common/urls.py
@@ -42,6 +42,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/search/',
+ views.QRCodeForSearchView.as_view(), name='search-qrcode'),
url(r'qrcode/(?P<app>[-a-z]+)/(?P<model_name>[-a-z]+)/(?P<pk>\d+)/',
views.QRCodeView.as_view(), name='qrcode-item'),
url(r'^generate-labels/(?P<template_slug>[-a-z0-9]+)/',
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index f1f7f2a82..33446ec8b 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -2107,6 +2107,16 @@ class BookmarkList(SearchQueryMixin, JSONResponseMixin, LoginRequiredMixin,
}
+class QRCodeForSearchView(LoginRequiredMixin, FormView):
+ template_name = 'ishtar/forms/qrcode_for_search.html'
+ form_class = forms.QRSearchForm
+
+ def form_valid(self, form):
+ context_data = self.get_context_data()
+ context_data["qr_code"] = form.save()
+ return self.render_to_response(context_data)
+
+
class SearchQueryDelete(LoginRequiredMixin, DeleteView):
model = models.SearchQuery
template_name = 'ishtar/forms/bookmark_delete.html'