added filters to location views

This commit is contained in:
Anatoly 2019-12-20 11:05:02 +03:00
parent 71fb3249b0
commit 36834835cd
3 changed files with 55 additions and 5 deletions

View File

@ -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)

View File

@ -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."""

View File

@ -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):