from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from establishment import models from establishment.serializers import ( EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer, ContactPhonesSerializer, SocialNetworkRelatedSerializers, EstablishmentTypeBaseSerializer, EstablishmentSubTypeBaseSerializer) # EstablishmentTypeTagCategoryBaseSerializer) from main.models import Currency from tag.serializers import TagBaseSerializer from utils.decorators import with_base_attributes from utils.serializers import TranslatedField 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, ) slug = serializers.SlugField(required=True, allow_blank=False, max_length=50) type = EstablishmentTypeBaseSerializer(source='establishment_type', read_only=True) class Meta: model = models.Establishment fields = [ 'id', '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', ] class EstablishmentRUDSerializer(EstablishmentBaseSerializer): """Establishment create serializer""" type_id = serializers.PrimaryKeyRelatedField( source='establishment_type', queryset=models.EstablishmentType.objects.all(), write_only=True ) 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' ] class SocialNetworkSerializers(serializers.ModelSerializer): """Social network serializers.""" class Meta: model = models.SocialNetwork fields = [ 'id', 'establishment', 'title', 'url', ] class PlatesSerializers(PlateSerializer): """Social network 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): """Social network serializers.""" class Meta: model = models.ContactPhone fields = [ 'id', 'establishment', 'phone' ] class ContactEmailBackSerializers(PlateSerializer): """Social network serializers.""" class Meta: model = models.ContactEmail fields = [ 'id', 'establishment', 'email' ] # TODO: test decorator @with_base_attributes class EmployeeBackSerializers(serializers.ModelSerializer): """Social network serializers.""" class Meta: model = models.Employee fields = [ 'id', 'user', 'name' ] # class EstablishmentTagCreateSerializer(serializers.ModelSerializer): # """Serializer for model EstablishmentTag.""" # class Meta: # model = models.EstablishmentTag # fields = [ # 'tag', # 'establishment' # ] # extra_kwargs = { # 'tag': {'write_only': True}, # 'establishment': {'write_only': True}, # } # # def validate(self, attrs): # """Validate method.""" # establishment = attrs.get('establishment') # tag = attrs.get('tag') # # # Check if tag is already added to establishment. # if establishment.tags.filter(tag=tag).exists(): # raise serializers.ValidationError(detail={'detail': _('Tag is already added.')}) # # # Сhecking tag availability for establishment type. # if not establishment.establishment_type.use_subtypes: # qs = establishment.establishment_type.tag_categories.filter(tag_category=tag.category) # else: # # Сhecking tag availability for establishment subtype. # qs = establishment.establishment_type.tag_categories.filter( # establishmentsubtype_set__tag_category=tag.category) # if not qs.exists(): # raise serializers.ValidationError( # detail={'detail': _('Tag is not available for this establishment type|subtype.')}) # return attrs # class EstablishmentSubTypeTagCategoryBaseSerializer(serializers.ModelSerializer): # """Serializer for intermediate model EstablishmentSubTypeTagCategories.""" # id = serializers.IntegerField(source='tag_category.id', read_only=True) # label_translated = TranslatedField(source='tag_category.label_translated') # tags = TagBaseSerializer(source='tag_category.tags', many=True, read_only=True) # # class Meta: # """Meta class.""" # model = models.EstablishmentSubTypeTagCategory # fields = [ # 'id', # 'label_translated', # 'tags', # 'establishment_subtype', # 'tag_category', # ] # extra_kwargs = { # 'establishment_subtype': {'write_only': True}, # 'tag_category': {'write_only': True}, # } # # def validate(self, attrs): # """Override validate method.""" # if models.EstablishmentTypeTagCategory.objects.filter( # establishment_type=attrs.get('establishment_type'), # tag_category=attrs.get('tag_category')).exists(): # raise serializers.ValidationError(detail={'detail': _('Objects is already attached.')}) # return attrs # # # class EstablishmentSubTypeSerializer(EstablishmentSubTypeBaseSerializer): # """Extended serializer for EstablishmentSubType model with tags.""" # tag_categories = EstablishmentSubTypeTagCategoryBaseSerializer(many=True, read_only=True) # # class Meta(EstablishmentSubTypeBaseSerializer.Meta): # """Meta class""" # fields = [ # 'id', # 'name_translated', # 'tag_categories' # ] # # # class EstablishmentTagsByType(EstablishmentTypeBaseSerializer): # """Tags by establishment type""" # tag_categories = EstablishmentTypeTagCategoryBaseSerializer(many=True) # subtypes = EstablishmentSubTypeSerializer(many=True, source='establishmentsubtype_set') # # class Meta(EstablishmentTypeBaseSerializer.Meta): # """Meta class.""" # fields = [ # 'id', # 'name_translated', # 'tag_categories', # 'subtypes', # ]