diff options
Diffstat (limited to 'ishtar_common')
| -rw-r--r-- | ishtar_common/static/js/ishtar.js | 27 | ||||
| -rw-r--r-- | ishtar_common/templates/ishtar/forms/success.html | 3 | ||||
| -rw-r--r-- | ishtar_common/templates/widgets/search_input.html | 7 | ||||
| -rw-r--r-- | ishtar_common/urls.py | 5 | ||||
| -rw-r--r-- | ishtar_common/views.py | 46 | 
5 files changed, 79 insertions, 9 deletions
| diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js index 81d080801..6e48bf5cf 100644 --- a/ishtar_common/static/js/ishtar.js +++ b/ishtar_common/static/js/ishtar.js @@ -283,6 +283,33 @@ $(document).on("click", '#to_top_arrow', function(){    $("html, body").animate({ scrollTop: 0}, 1000);  }); +var bookmark_url = ""; + +var load_bookmark_list = function(){ +    if (!bookmark_url) return; +    $.get(bookmark_url, function(data) { +        var bookmark_list = ""; +        for (idx in data['bookmarks']){ +            var bookmark = data['bookmarks'][idx]; +            bookmark_list += '<span class="dropdown-item input-link" ' + +                'data-query="' + bookmark['query'].replace(/"/g, "''") + +                '" href="#">' + bookmark['label'] + '</span>'; +        } +        $('#bookmark-list').html(bookmark_list); +        if (bookmark_list === ""){ +            $('#bookmark-list').addClass('disabled'); +        } else { +            $('#bookmark-list').removeClass('disabled'); +        } +        $("#bookmark-list span").click(function(){ +            $("#id_search_vector").val( +                $(this).attr('data-query').replace(/''/g, '"')); +            enable_save(); +        }); +    }, 'json'); +} + +  var autorefresh = false;  var autorefresh_message_start = "";  var autorefresh_message_end = ""; diff --git a/ishtar_common/templates/ishtar/forms/success.html b/ishtar_common/templates/ishtar/forms/success.html index 125ba62e7..77fa260d1 100644 --- a/ishtar_common/templates/ishtar/forms/success.html +++ b/ishtar_common/templates/ishtar/forms/success.html @@ -3,6 +3,9 @@  $(document).ready(function(){      $("#form-result-div").parent().modal("hide"); +    {% if context == 'bookmark' %} +    load_bookmark_list(); +    {% endif %}  });  </script> diff --git a/ishtar_common/templates/widgets/search_input.html b/ishtar_common/templates/widgets/search_input.html index 7f5526b18..842b2bcfb 100644 --- a/ishtar_common/templates/widgets/search_input.html +++ b/ishtar_common/templates/widgets/search_input.html @@ -27,16 +27,20 @@             href="{% url 'save-search-query' app_name model %}">              <i class="fa fa-star-o" aria-hidden="true"></i>          </a> -        <span class="input-group-text input-link disabled" +        <span class="input-group-text input-link dropdown-toggle" +              data-toggle="dropdown"                title="{% trans 'Bookmarks' %}"                id="load-bookmark">              <i class="fa fa-bookmark" aria-hidden="true"></i>          </span> +        <div class="dropdown-menu" id="bookmark-list"> +        </div>      </span>  </div>  <script type="text/javascript"> +var bookmark_url = "{% url 'bookmark-list' app_name model %}";  $(document).ready(function(){      $(".search-widget input").keypress(function(e) { @@ -54,5 +58,6 @@ $(document).ready(function(){          enable_save();      });      enable_save(); +    load_bookmark_list();  });  </script> diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 6b778ae45..44ebd0f93 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -127,7 +127,10 @@ urlpatterns = [      url(r'^save-search/(?P<app_label>[a-z-]+)/(?P<model>[a-z-]+)/$',          views.SearchQueryEdit.as_view(),          name='save-search-query'), -    url(r'^success/$', +    url(r'^bookmarks/(?P<app_label>[a-z-]+)/(?P<model>[a-z-]+)/$', +        views.BookmarkList.as_view(), +        name='bookmark-list'), +    url(r'^success(?:/(?P<context>[a-z-]+))?/$',          TemplateView.as_view(template_name="ishtar/forms/success.html"),          name='success'),  ] diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 586e1f0a1..1f8b46fd6 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -33,7 +33,7 @@ from django.core.urlresolvers import reverse, NoReverseMatch  from django.db.models import Q  from django.forms.models import modelformset_factory  from django.http import HttpResponse, Http404, HttpResponseRedirect, \ -    HttpResponseBadRequest +    HttpResponseBadRequest, JsonResponse  from django.shortcuts import redirect, render  from django.utils.decorators import method_decorator  from django.utils.translation import ugettext, ugettext_lazy as _ @@ -839,6 +839,20 @@ class IshtarMixin(object):          return context +class JSONResponseMixin: +    """ +    Render a JSON response. +    """ +    def render_to_response(self, context, **response_kwargs): +        return JsonResponse( +            self.get_data(context), +            **response_kwargs +        ) + +    def get_data(self, context): +        return context + +  class LoginRequiredMixin(object):      @method_decorator(login_required)      def dispatch(self, request, *args, **kwargs): @@ -1662,10 +1676,10 @@ document_deletion_wizard = wizards.DocumentDeletionWizard.as_view(      url_name='document_deletion',) -class SearchQueryEdit(LoginRequiredMixin, FormView): -    template_name = 'ishtar/forms/search_query.html' -    form_class = forms.SearchQueryForm - +class SearchQueryMixin(object): +    """ +    Manage content type and profile init +    """      def dispatch(self, request, *args, **kwargs):          if not request.user.pk:              raise Http404() @@ -1684,7 +1698,12 @@ class SearchQueryEdit(LoginRequiredMixin, FormView):              )          except ContentType.DoesNotExist:              raise Http404() -        return super(SearchQueryEdit, self).dispatch(request, *args, **kwargs) +        return super(SearchQueryMixin, self).dispatch(request, *args, **kwargs) + + +class SearchQueryEdit(SearchQueryMixin, LoginRequiredMixin, FormView): +    template_name = 'ishtar/forms/search_query.html' +    form_class = forms.SearchQueryForm      def get_form_kwargs(self):          kwargs = super(SearchQueryEdit, self).get_form_kwargs() @@ -1703,4 +1722,17 @@ class SearchQueryEdit(LoginRequiredMixin, FormView):          return HttpResponseRedirect(self.get_success_url())      def get_success_url(self): -        return reverse('success') +        return reverse('success', args=['bookmark']) + + +class BookmarkList(SearchQueryMixin, JSONResponseMixin, LoginRequiredMixin, +                   TemplateView): +    def get_data(self, context): +        q = models.SearchQuery.objects.filter( +            content_type=self.content_type, +            profile=self.profile +        ) +        return { +            'bookmarks': [ +                {'label': sq.label, 'query': sq.query} for sq in q.all()] +        } | 
