diff options
Diffstat (limited to 'ishtar_common')
| -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' | 
