From f58ac2a1cc82ad11f60a264c2a4d0942bd140bff Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Tue, 28 Jan 2020 23:21:16 +0300 Subject: [PATCH] partners --- apps/partner/filters.py | 11 +++++++++++ apps/partner/models.py | 19 +++++++++++++++++++ apps/partner/serializers/back.py | 23 ++++++++++++++++++++--- apps/partner/urls/back.py | 4 ++++ apps/partner/views/back.py | 14 ++++++++++++-- 5 files changed, 66 insertions(+), 5 deletions(-) diff --git a/apps/partner/filters.py b/apps/partner/filters.py index e9b32f5f..1965fd03 100644 --- a/apps/partner/filters.py +++ b/apps/partner/filters.py @@ -2,6 +2,7 @@ from django_filters import rest_framework as filters from partner.models import Partner +from django.core.validators import EMPTY_VALUES class PartnerFilterSet(filters.FilterSet): @@ -13,6 +14,7 @@ class PartnerFilterSet(filters.FilterSet): choices=Partner.MODEL_TYPES, help_text=f'Allows to filter partner list by partner type. ' f'Enum: {dict(Partner.MODEL_TYPES)}') + ordering = filters.CharFilter(method='sort_partner') class Meta: """Meta class.""" @@ -20,4 +22,13 @@ class PartnerFilterSet(filters.FilterSet): fields = ( 'establishment', 'type', + 'ordering', ) + + @staticmethod + def sort_partner(queryset, name, value): + if value not in EMPTY_VALUES: + if 'date_bind' in value: + value = value.replace('date_bind', 'partnertoestablishment__partner_bind_date') + queryset = queryset.order_by(value) + return queryset \ No newline at end of file diff --git a/apps/partner/models.py b/apps/partner/models.py index dec6df48..5c9f8af2 100644 --- a/apps/partner/models.py +++ b/apps/partner/models.py @@ -6,6 +6,19 @@ from establishment.models import Establishment from utils.models import ImageMixin, ProjectBaseMixin +class PartnerQueryset(models.QuerySet): + + def with_base_related(self): + return self.prefetch_related('establishment__establishment_type', 'establishment__establishment_subtypes', + 'establishment__awards', 'establishment__schedule', 'establishment__phones', + 'establishment__gallery', 'establishment__menu_set', + 'establishment__menu_set__plates', 'establishment__menu_set__plates__currency', + 'establishment__currency', 'establishment__address__city', + 'establishment__address__city__region', + 'establishment__address__city__region__country', + 'establishment__address__city__country', 'country') + + class Partner(ProjectBaseMixin): """Partner model.""" @@ -29,6 +42,8 @@ class Partner(ProjectBaseMixin): price_per_month = models.DecimalField(_('price per month'), max_digits=10, decimal_places=2, blank=True, null=True) country = models.ForeignKey('location.Country', null=True, default=None, on_delete=models.SET_NULL) + objects = PartnerQueryset.as_manager() + class Meta: verbose_name = _('partner') verbose_name_plural = _('partners') @@ -36,6 +51,10 @@ class Partner(ProjectBaseMixin): def __str__(self): return f'{self.url}' + @property + def type_display(self): + return self.MODEL_TYPES[self.type][1] + class PartnerToEstablishment(models.Model): partner_bind_date = models.DateTimeField(default=timezone.now, editable=False, diff --git a/apps/partner/serializers/back.py b/apps/partner/serializers/back.py index e9e03fe0..ebbbd2ca 100644 --- a/apps/partner/serializers/back.py +++ b/apps/partner/serializers/back.py @@ -1,21 +1,38 @@ """Back account serializers""" from rest_framework import serializers from partner.models import Partner +from establishment.serializers import EstablishmentShortSerializer +from location.serializers import CountrySimpleSerializer +from location.models import Country class BackPartnerSerializer(serializers.ModelSerializer): + establishments = EstablishmentShortSerializer(many=True, read_only=True, source='establishment') + country = CountrySimpleSerializer(read_only=True) + type_display = serializers.CharField(read_only=True) + country_id = serializers.PrimaryKeyRelatedField( + queryset=Country.objects.all(), + required=False, + write_only=True, + source='country' + ) + class Meta: model = Partner fields = ( 'id', - 'old_id', 'name', 'url', 'image', - 'establishment', - 'establishment_id', 'type', + 'type_display', 'starting_date', 'expiry_date', 'price_per_month', + 'country', + 'country_id', + 'establishments', ) + extra_kwargs = { + 'type': {'write_only': True}, + } diff --git a/apps/partner/urls/back.py b/apps/partner/urls/back.py index 27de2731..82ab3a31 100644 --- a/apps/partner/urls/back.py +++ b/apps/partner/urls/back.py @@ -8,4 +8,8 @@ app_name = 'partner' urlpatterns = [ path('', views.PartnerLstView.as_view(), name='partner-list-create'), path('/', views.PartnerRUDView.as_view(), name='partner-rud'), + # path('bind///', views.BindPartnerToEstablishmentView.as_view(), + # name='bind-partner-to-establishment'), + # path('unbind///', views.BindPartnerToEstablishmentView.as_view(), + # name='unbind-partner-from-establishment'), ] diff --git a/apps/partner/views/back.py b/apps/partner/views/back.py index 7ea440f0..762d3ef4 100644 --- a/apps/partner/views/back.py +++ b/apps/partner/views/back.py @@ -10,16 +10,26 @@ class PartnerLstView(generics.ListCreateAPIView): """Partner list/create view. Allows to get partners for current country, or create a new one. """ - queryset = Partner.objects.all() + queryset = Partner.objects.with_base_related() serializer_class = serializers.BackPartnerSerializer pagination_class = None permission_classes = [permissions.IsAdminUser | IsEstablishmentManager] + # permission_classes = (permissions.AllowAny, ) filter_class = filters.PartnerFilterSet class PartnerRUDView(generics.RetrieveUpdateDestroyAPIView): """Partner RUD view.""" - queryset = Partner.objects.all() + queryset = Partner.objects.with_base_related() serializer_class = serializers.BackPartnerSerializer permission_classes = [permissions.IsAdminUser | IsEstablishmentManager] + # permission_classes = (permissions.AllowAny, ) lookup_field = 'id' + + +# class BindPartnerToEstablishmentView(generics.GenericAPIView): +# pass + + +# class UnbindPartnerFromEstablishmentView(generics.DestroyAPIView): +# pass