diff options
-rw-r--r-- | ishtar_common/forms_common.py | 41 | ||||
-rw-r--r-- | ishtar_common/static/js/ishtar.js | 17 | ||||
-rw-r--r-- | ishtar_common/templates/blocks/DataTables.html | 1 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/forms/qrcode_for_search.html | 78 | ||||
-rw-r--r-- | ishtar_common/templates/widgets/search_input.html | 11 | ||||
-rw-r--r-- | ishtar_common/urls.py | 2 | ||||
-rw-r--r-- | ishtar_common/views.py | 10 |
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">×</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' |