From 26d2bd2f36c074187fe21c85d72ccf31e8b3e33c Mon Sep 17 00:00:00 2001 From: Paul Eggleton Date: Wed, 14 Feb 2018 10:13:13 +1300 Subject: [PATCH] Support selecting more than one layer in other distro comparison search form Provide a lazy-loaded popup for selecting layers to include in the query instead of having it as a simple drop-down, so you can select more than one layer. Signed-off-by: Paul Eggleton --- layerindex/urls.py | 6 +- layerindex/views.py | 31 +++++-- templates/layerindex/classicrecipes.html | 102 +++++++++++++++++++++++ templates/layerindex/layerchecklist.html | 21 +++++ 4 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 templates/layerindex/layerchecklist.html diff --git a/layerindex/urls.py b/layerindex/urls.py index 37e7edd..bfa7628 100644 --- a/layerindex/urls.py +++ b/layerindex/urls.py @@ -8,7 +8,7 @@ from django.conf.urls import * from django.views.generic import TemplateView, DetailView, ListView, RedirectView from django.views.defaults import page_not_found from django.core.urlresolvers import reverse_lazy -from layerindex.views import LayerListView, LayerReviewListView, LayerReviewDetailView, RecipeSearchView, MachineSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, HistoryListView, EditProfileFormView, AdvancedRecipeSearchView, BulkChangeView, BulkChangeSearchView, bulk_change_edit_view, bulk_change_patch_view, BulkChangeDeleteView, RecipeDetailView, RedirectParamsView, ClassicRecipeSearchView, ClassicRecipeDetailView, ClassicRecipeStatsView, LayerUpdateDetailView, UpdateListView, UpdateDetailView, StatsView, publish_view +from layerindex.views import LayerListView, LayerReviewListView, LayerReviewDetailView, RecipeSearchView, MachineSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, HistoryListView, EditProfileFormView, AdvancedRecipeSearchView, BulkChangeView, BulkChangeSearchView, bulk_change_edit_view, bulk_change_patch_view, BulkChangeDeleteView, RecipeDetailView, RedirectParamsView, ClassicRecipeSearchView, ClassicRecipeDetailView, ClassicRecipeStatsView, LayerUpdateDetailView, UpdateListView, UpdateDetailView, StatsView, publish_view, LayerCheckListView from layerindex.models import LayerItem, Recipe, RecipeChangeset from rest_framework import routers from . import restviews @@ -150,5 +150,9 @@ urlpatterns = [ ClassicRecipeDetailView.as_view( template_name='layerindex/classicrecipedetail.html'), name='comparison_recipe'), + url(r'^ajax/layerchecklist/(?P[-\w]+)/$', + LayerCheckListView.as_view( + template_name='layerindex/layerchecklist.html'), + name='layer_checklist'), url(r'.*', page_not_found, kwargs={'exception': Exception("Page not Found")}) ] diff --git a/layerindex/views.py b/layerindex/views.py index 02f72ef..f2274f8 100644 --- a/layerindex/views.py +++ b/layerindex/views.py @@ -940,6 +940,13 @@ class ClassicRecipeReverseLinkWrapper(LinkWrapper): setattr(obj, 'cover_vercmp', vercmp) +class LayerCheckListView(ListView): + context_object_name = 'layerbranches' + + def get_queryset(self): + _check_url_branch(self.kwargs) + return LayerBranch.objects.filter(branch__name=self.kwargs['branch']).filter(layer__status__in=['P', 'X']).order_by('layer__name') + class ClassicRecipeSearchView(RecipeSearchView): def render_to_response(self, context, **kwargs): @@ -952,7 +959,11 @@ class ClassicRecipeSearchView(RecipeSearchView): cover_status = self.request.GET.get('cover_status', None) cover_verified = self.request.GET.get('cover_verified', None) category = self.request.GET.get('category', None) - oe_layer = self.request.GET.get('oe_layer', None) + selectedlayers_param = self.request.GET.get('selectedlayers', '') + if selectedlayers_param: + layer_ids = [int(i) for i in selectedlayers_param.split(',')] + else: + layer_ids = [] has_patches = self.request.GET.get('has_patches', '') needs_attention = self.request.GET.get('needs_attention', '') qreversed = self.request.GET.get('reversed', '') @@ -978,8 +989,8 @@ class ClassicRecipeSearchView(RecipeSearchView): else: init_qs = init_qs.filter(classic_category__icontains=category) filtered = True - if oe_layer: - init_qs = init_qs.filter(cover_layerbranch__layer=oe_layer) + if layer_ids: + init_qs = init_qs.filter(cover_layerbranch__layer__in=layer_ids) if has_patches.strip(): if has_patches == '1': init_qs = init_qs.filter(patch__isnull=False).distinct() @@ -1015,8 +1026,8 @@ class ClassicRecipeSearchView(RecipeSearchView): return Recipe.objects.none() if qreversed: init_rqs = Recipe.objects.filter(layerbranch__branch__name='master') - if oe_layer: - init_rqs = init_rqs.filter(layerbranch__layer=oe_layer) + if layer_ids: + init_rqs = init_rqs.filter(layerbranch__layer__id__in=layer_ids) all_values = [] if filtered: if isinstance(qs, list): @@ -1057,6 +1068,16 @@ class ClassicRecipeSearchView(RecipeSearchView): context['reversed'] = self.request.GET.get('reversed', False) context['search_form'] = search_form context['searched'] = searched + selectedlayers_param = self.request.GET.get('selectedlayers', '') + if selectedlayers_param: + all_layer_names = dict(LayerItem.objects.all().values_list('id', 'name')) + layer_ids = [int(i) for i in selectedlayers_param.split(',')] + layer_names = [all_layer_names[i] for i in layer_ids] + context['selectedlayers_display'] = ','.join(layer_names) + else: + layer_ids = [] + context['selectedlayers_display'] = ' (any)' + context['selectedlayers'] = layer_ids return context diff --git a/templates/layerindex/classicrecipes.html b/templates/layerindex/classicrecipes.html index 8f07704..c22bb19 100644 --- a/templates/layerindex/classicrecipes.html +++ b/templates/layerindex/classicrecipes.html @@ -45,12 +45,45 @@ {% for field in search_form.visible_fields %} + {% if field.name == 'oe_layer' %} + + {{ field.label }} + + +
+ + ... +
+ + + + + + {% else %} {{ field.label }} {{ field }} + {% endif %} {% endfor %} @@ -169,11 +202,80 @@ {% block scripts %} {% endblock %} diff --git a/templates/layerindex/layerchecklist.html b/templates/layerindex/layerchecklist.html new file mode 100644 index 0000000..4e6ddfd --- /dev/null +++ b/templates/layerindex/layerchecklist.html @@ -0,0 +1,21 @@ +{% comment %} + + layerindex-web - layer check list AJAX template + + Copyright (C) 2018 Intel Corporation + Licensed under the MIT license, see COPYING.MIT for details + +{% endcomment %} + +{% autoescape on %} + + {% for layerbranch in layerbranches %} + + + + + {% endfor %} +
+ +
+{% endautoescape %}