From 6f0867e6cc7acf0f7ee98d3c714e071f37cdb431 Mon Sep 17 00:00:00 2001 From: Nicolas Joyard <joyard.nicolas@gmail.com> Date: Thu, 16 Jun 2016 08:40:48 +0200 Subject: [PATCH] Add group filtering with select2 ac --- memopol/filters.py | 23 +++++++++++++-- memopol/urls.py | 6 ++++ memopol/views/group_ac.py | 20 +++++++++++++ memopol/views/representative_list.py | 28 ------------------- .../representatives/representative_list.haml | 4 ++- 5 files changed, 50 insertions(+), 31 deletions(-) create mode 100644 memopol/views/group_ac.py diff --git a/memopol/filters.py b/memopol/filters.py index f8c08d21..453731b7 100644 --- a/memopol/filters.py +++ b/memopol/filters.py @@ -1,5 +1,10 @@ # coding: utf-8 +from dal.autocomplete import ModelSelect2 + +import datetime + +from django.db.models import Q from django.utils.text import slugify from django_filters import FilterSet, MethodFilter, ModelChoiceFilter @@ -8,11 +13,19 @@ from representatives.models import Chamber, Group, Representative def chamber_filter(qs, value): - return qs.filter(mandates__group__chamber=value) + today = datetime.date.today() + return qs.filter( + Q(mandates__end_date__gte=today) | Q(mandates__end_date__isnull=True), + mandates__group__chamber=value + ) def group_filter(qs, value): - return qs.filter(mandates__group=value) + today = datetime.date.today() + return qs.filter( + Q(mandates__end_date__gte=today) | Q(mandates__end_date__isnull=True), + mandates__group=value + ) class RepresentativeFilter(FilterSet): @@ -25,6 +38,12 @@ class RepresentativeFilter(FilterSet): country = ModelChoiceFilter(queryset=Group.objects.filter(kind='country'), action=group_filter) + group = ModelChoiceFilter(queryset=Group.objects.exclude( + kind__in=['chamber', 'country']), + action=group_filter, + widget=ModelSelect2(url='group-autocomplete'), + label='Party, committee or delegation') + class Meta: model = Representative fields = ['search', 'chamber', 'country'] diff --git a/memopol/urls.py b/memopol/urls.py index 5f6e885f..2cf2f678 100644 --- a/memopol/urls.py +++ b/memopol/urls.py @@ -6,6 +6,7 @@ from django.views import generic from views.dossier_ac import DossierAutocomplete, ProposalAutocomplete from views.dossier_detail import DossierDetail from views.dossier_list import DossierList +from views.group_ac import GroupAutocomplete from views.group_list import GroupList from views.representative_detail import RepresentativeDetail from views.representative_list import RepresentativeList @@ -58,6 +59,11 @@ urlpatterns = [ RedirectGroupList.as_view(), name='group-list-redirect' ), + url( + r'^legislature/autocomplete/group/$', + GroupAutocomplete.as_view(), + name='group-autocomplete', + ), url( r'^votes/dossier/$', DossierList.as_view(), diff --git a/memopol/views/group_ac.py b/memopol/views/group_ac.py new file mode 100644 index 00000000..9e231b21 --- /dev/null +++ b/memopol/views/group_ac.py @@ -0,0 +1,20 @@ +# coding: utf-8 + +from dal.autocomplete import Select2QuerySetView + +from django.db.models import Q + +from representatives.models import Group + + +class GroupAutocomplete(Select2QuerySetView): + def get_queryset(self): + qs = Group.objects.exclude(kind__in=['chamber', 'country']) + + if self.q: + qs = qs.filter( + Q(name__icontains=self.q) | + Q(abbreviation__icontains=self.q) + ) + + return qs diff --git a/memopol/views/representative_list.py b/memopol/views/representative_list.py index 82eda403..9f700efa 100644 --- a/memopol/views/representative_list.py +++ b/memopol/views/representative_list.py @@ -39,34 +39,6 @@ class RepresentativeList(CSVDownloadMixin, GridListMixin, PaginationMixin, self.current_filter = f return f.qs - def group_filter(self, qs): - group_kind = self.kwargs.get('group_kind', None) - chamber = self.kwargs.get('chamber', None) - group = self.kwargs.get('group', None) - today = datetime.date.today() - - if group_kind and group: - if group.isnumeric(): - group_qs = Group.objects.filter( - id=int(group) - ) - else: - group_qs = Group.objects.filter( - name=group, - kind=group_kind - ) - - if chamber: - group_qs = group_qs.filter(chamber__name=chamber) - - qs = qs.filter( - models.Q(mandates__end_date__gte=today) | - models.Q(mandates__end_date__isnull=True), - mandates__group__in=group_qs - ) - - return qs - def get_queryset(self): qs = super(RepresentativeList, self).get_queryset() if self.get_active_only(): diff --git a/templates/representatives/representative_list.haml b/templates/representatives/representative_list.haml index 39f1789a..62038840 100644 --- a/templates/representatives/representative_list.haml +++ b/templates/representatives/representative_list.haml @@ -8,7 +8,9 @@ - block search - %form{action:'', method:'get'} + {{ filter.form.media }} + + %form.filter-form{action:'', method:'get'} {{ filter.form.as_p }} %input{type:"submit", value:"Go"} -- GitLab