207 lines
5.6 KiB
Python
207 lines
5.6 KiB
Python
from rest_framework import serializers
|
|
|
|
from establishment import models
|
|
from establishment.serializers import (
|
|
EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer,
|
|
ContactPhonesSerializer, SocialNetworkRelatedSerializers,
|
|
EstablishmentTypeBaseSerializer)
|
|
from location.serializers import AddressDetailSerializer
|
|
from main.models import Currency
|
|
from utils.decorators import with_base_attributes
|
|
from utils.serializers import TimeZoneChoiceField
|
|
from gallery.models import Image
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
class EstablishmentListCreateSerializer(EstablishmentBaseSerializer):
|
|
"""Establishment create serializer"""
|
|
|
|
type_id = serializers.PrimaryKeyRelatedField(
|
|
source='establishment_type',
|
|
queryset=models.EstablishmentType.objects.all(), write_only=True
|
|
)
|
|
phones = ContactPhonesSerializer(read_only=True, many=True, )
|
|
emails = ContactEmailsSerializer(read_only=True, many=True, )
|
|
socials = SocialNetworkRelatedSerializers(read_only=True, many=True, )
|
|
type = EstablishmentTypeBaseSerializer(source='establishment_type', read_only=True)
|
|
tz = TimeZoneChoiceField()
|
|
|
|
class Meta:
|
|
model = models.Establishment
|
|
fields = [
|
|
'id',
|
|
'name',
|
|
'transliterated_name',
|
|
'index_name',
|
|
'website',
|
|
'phones',
|
|
'emails',
|
|
'price_level',
|
|
'toque_number',
|
|
'type_id',
|
|
'type',
|
|
'socials',
|
|
'image_url',
|
|
'slug',
|
|
# TODO: check in admin filters
|
|
'is_publish',
|
|
'guestonline_id',
|
|
'lastable_id',
|
|
'tags',
|
|
'tz',
|
|
]
|
|
|
|
|
|
class EstablishmentRUDSerializer(EstablishmentBaseSerializer):
|
|
"""Establishment create serializer"""
|
|
|
|
type_id = serializers.PrimaryKeyRelatedField(
|
|
source='establishment_type',
|
|
queryset=models.EstablishmentType.objects.all(), write_only=True
|
|
)
|
|
address = AddressDetailSerializer()
|
|
phones = ContactPhonesSerializer(read_only=False, many=True, )
|
|
emails = ContactEmailsSerializer(read_only=False, many=True, )
|
|
socials = SocialNetworkRelatedSerializers(read_only=False, many=True, )
|
|
type = EstablishmentTypeBaseSerializer(source='establishment_type')
|
|
|
|
class Meta:
|
|
model = models.Establishment
|
|
fields = [
|
|
'id',
|
|
'name',
|
|
'website',
|
|
'phones',
|
|
'emails',
|
|
'price_level',
|
|
'toque_number',
|
|
'type_id',
|
|
'type',
|
|
'socials',
|
|
'image_url',
|
|
# TODO: check in admin filters
|
|
'is_publish',
|
|
'address',
|
|
'tags',
|
|
]
|
|
|
|
|
|
class SocialChoiceSerializers(serializers.ModelSerializer):
|
|
"""SocialChoice serializers."""
|
|
|
|
class Meta:
|
|
model = models.SocialChoice
|
|
fields = '__all__'
|
|
|
|
|
|
class SocialNetworkSerializers(serializers.ModelSerializer):
|
|
"""Social network serializers."""
|
|
|
|
class Meta:
|
|
model = models.SocialNetwork
|
|
fields = [
|
|
'id',
|
|
'establishment',
|
|
'network',
|
|
'url',
|
|
]
|
|
|
|
|
|
class PlatesSerializers(PlateSerializer):
|
|
"""Plates serializers."""
|
|
|
|
currency_id = serializers.PrimaryKeyRelatedField(
|
|
source='currency',
|
|
queryset=Currency.objects.all(), write_only=True
|
|
)
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
|
|
model = models.Plate
|
|
fields = PlateSerializer.Meta.fields + [
|
|
'name',
|
|
'currency_id',
|
|
'menu'
|
|
]
|
|
|
|
|
|
class ContactPhoneBackSerializers(PlateSerializer):
|
|
"""ContactPhone serializers."""
|
|
|
|
class Meta:
|
|
model = models.ContactPhone
|
|
fields = [
|
|
'id',
|
|
'establishment',
|
|
'phone'
|
|
]
|
|
|
|
|
|
class ContactEmailBackSerializers(PlateSerializer):
|
|
"""ContactEmail serializers."""
|
|
|
|
class Meta:
|
|
model = models.ContactEmail
|
|
fields = [
|
|
'id',
|
|
'establishment',
|
|
'email'
|
|
]
|
|
|
|
|
|
# TODO: test decorator
|
|
@with_base_attributes
|
|
class EmployeeBackSerializers(serializers.ModelSerializer):
|
|
"""Employee serializers."""
|
|
|
|
class Meta:
|
|
model = models.Employee
|
|
fields = [
|
|
'id',
|
|
'user',
|
|
'name'
|
|
]
|
|
|
|
|
|
class EstablishmentBackOfficeGallerySerializer(serializers.ModelSerializer):
|
|
"""Serializer class for model EstablishmentGallery."""
|
|
|
|
class Meta:
|
|
"""Meta class"""
|
|
|
|
model = models.EstablishmentGallery
|
|
fields = [
|
|
'id',
|
|
'is_main',
|
|
]
|
|
|
|
def get_request_kwargs(self):
|
|
"""Get url kwargs from request."""
|
|
return self.context.get('request').parser_context.get('kwargs')
|
|
|
|
def validate(self, attrs):
|
|
"""Override validate method."""
|
|
establishment_pk = self.get_request_kwargs().get('pk')
|
|
image_id = self.get_request_kwargs().get('image_id')
|
|
|
|
establishment_qs = models.Establishment.objects.filter(pk=establishment_pk)
|
|
image_qs = Image.objects.filter(id=image_id)
|
|
|
|
if not establishment_qs.exists():
|
|
raise serializers.ValidationError({'detail': _('Establishment not found')})
|
|
|
|
if not image_qs.exists():
|
|
raise serializers.ValidationError({'detail': _('Image not found')})
|
|
|
|
establishment = establishment_qs.first()
|
|
image = image_qs.first()
|
|
|
|
if image in establishment.gallery.all():
|
|
raise serializers.ValidationError({'detail': _('Image is already added.')})
|
|
|
|
attrs['establishment'] = establishment
|
|
attrs['image'] = image
|
|
|
|
return attrs
|