This commit is contained in:
Kuroshini 2020-01-28 23:21:16 +03:00
parent 8806bc4e33
commit f58ac2a1cc
5 changed files with 66 additions and 5 deletions

View File

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

View File

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

View File

@ -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},
}

View File

@ -8,4 +8,8 @@ app_name = 'partner'
urlpatterns = [
path('', views.PartnerLstView.as_view(), name='partner-list-create'),
path('<int:id>/', views.PartnerRUDView.as_view(), name='partner-rud'),
# path('bind/<int:partner_id>/<int:establishment_id>/', views.BindPartnerToEstablishmentView.as_view(),
# name='bind-partner-to-establishment'),
# path('unbind/<int:partner_id>/<int:establishment_id>/', views.BindPartnerToEstablishmentView.as_view(),
# name='unbind-partner-from-establishment'),
]

View File

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