From 36834835cd155cd80778df4442e7b67499ed5abb Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 20 Dec 2019 11:05:02 +0300 Subject: [PATCH] added filters to location views --- apps/location/filters.py | 31 +++++++++++++++++++++++++++++++ apps/location/models.py | 22 ++++++++++++++++++++++ apps/location/views/back.py | 7 ++----- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/apps/location/filters.py b/apps/location/filters.py index 5e95db44..c50b9964 100644 --- a/apps/location/filters.py +++ b/apps/location/filters.py @@ -22,3 +22,34 @@ class CityBackFilter(filters.FilterSet): if value not in EMPTY_VALUES: return queryset.search_by_name(value) return queryset + + +class RegionFilter(filters.FilterSet): + """Region filter set.""" + + country_id = filters.CharFilter() + sub_regions_by_region_id = filters.CharFilter(method='by_region') + without_parent_region = filters.BooleanFilter(method='by_parent_region') + + class Meta: + """Meta class.""" + model = models.Region + fields = ( + 'country_id', + 'sub_regions_by_region_id', + 'without_parent_region', + ) + + def by_region(self, queryset, name, value): + """Search regions by sub region id.""" + if value not in EMPTY_VALUES: + return queryset.sub_regions_by_region_id(value) + + def by_parent_region(self, queryset, name, value): + """ + Search if region instance has a parent region.. + If True then show only Regions + Otherwise show only Sub regions. + """ + if value not in EMPTY_VALUES: + return queryset.without_parent_region(value) diff --git a/apps/location/models.py b/apps/location/models.py index dc7834c9..be26e2c7 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -70,6 +70,26 @@ class Country(TranslatedFieldsMixin, SVGImageMixin, ProjectBaseMixin): return str_name +class RegionQuerySet(models.QuerySet): + """QuerySet for model Region.""" + + def without_parent_region(self, switcher: bool = True): + """Filter regions by parent region.""" + return self.filter(parent_region__isnull=switcher) + + def by_region_id(self, region_id): + """Filter regions by region id.""" + return self.filter(id=region_id) + + def by_sub_region_id(self, sub_region_id): + """Filter sub regions by sub region id.""" + return self.filter(parent_region_id=sub_region_id) + + def sub_regions_by_region_id(self, region_id): + """Filter regions by sub region id.""" + return self.filter(parent_region_id=region_id) + + class Region(models.Model): """Region model.""" @@ -82,6 +102,8 @@ class Region(models.Model): Country, verbose_name=_('country'), on_delete=models.CASCADE) old_id = models.IntegerField(null=True, blank=True, default=None) + objects = RegionQuerySet.as_manager() + class Meta: """Meta class.""" diff --git a/apps/location/views/back.py b/apps/location/views/back.py index 5dcb55bf..e306bc6e 100644 --- a/apps/location/views/back.py +++ b/apps/location/views/back.py @@ -1,5 +1,4 @@ """Location app views.""" -from django_filters.rest_framework import DjangoFilterBackend from rest_framework import generics from location import models, serializers @@ -9,6 +8,7 @@ from utils.views import CreateDestroyGalleryViewMixin from rest_framework.permissions import IsAuthenticatedOrReadOnly from django.shortcuts import get_object_or_404 from utils.serializers import ImageBaseSerializer +from location.filters import RegionFilter from location import filters @@ -109,11 +109,8 @@ class RegionListCreateView(common.RegionViewMixin, generics.ListCreateAPIView): pagination_class = None serializer_class = serializers.RegionSerializer permission_classes = [IsAuthenticatedOrReadOnly | IsCountryAdmin] - filter_backends = (DjangoFilterBackend,) ordering_fields = '__all__' - filterset_fields = ( - 'country', - ) + filter_class = RegionFilter class RegionRUDView(common.RegionViewMixin, generics.RetrieveUpdateDestroyAPIView):