From 45a774990b8d89ae2fb1139691ad70257cf93d02 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Sun, 15 Sep 2019 13:19:49 +0200 Subject: QR Code for searches --- ishtar_common/forms_common.py | 41 ++++++++++-- ishtar_common/static/js/ishtar.js | 17 ++++- ishtar_common/templates/blocks/DataTables.html | 1 + .../templates/ishtar/forms/qrcode_for_search.html | 78 ++++++++++++++++++++++ ishtar_common/templates/widgets/search_input.html | 11 ++- ishtar_common/urls.py | 2 + ishtar_common/views.py | 10 +++ 7 files changed, 153 insertions(+), 7 deletions(-) create mode 100644 ishtar_common/templates/ishtar/forms/qrcode_for_search.html (limited to 'ishtar_common') 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 += ""; - 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 %} + + + + + 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"> - + + + + 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\w+)/(?P\d+)/', views.DisplayItemView.as_view(), name='display-item'), + url(r'qrcode/search/', + views.QRCodeForSearchView.as_view(), name='search-qrcode'), url(r'qrcode/(?P[-a-z]+)/(?P[-a-z]+)/(?P\d+)/', views.QRCodeView.as_view(), name='qrcode-item'), url(r'^generate-labels/(?P[-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' -- cgit v1.2.3