"""Establishment serializers.""" from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers from comment import models as comment_models from comment.serializers import common as comment_serializers from establishment import models from location.serializers import AddressBaseSerializer from main.serializers import AwardSerializer, CurrencySerializer from review import models as review_models from tag.serializers import TagBaseSerializer from timetable.serialziers import ScheduleRUDSerializer from utils import exceptions as utils_exceptions from utils.serializers import (ProjectModelSerializer, TranslatedField, FavoritesCreateSerializer) class ContactPhonesSerializer(serializers.ModelSerializer): """Contact phone serializer""" class Meta: model = models.ContactPhone fields = [ 'phone' ] class ContactEmailsSerializer(serializers.ModelSerializer): """Contact email serializer""" class Meta: model = models.ContactEmail fields = [ 'email' ] class SocialNetworkRelatedSerializers(serializers.ModelSerializer): """Social network serializers.""" class Meta: model = models.SocialNetwork fields = [ 'id', 'title', 'url', ] class PlateSerializer(ProjectModelSerializer): name_translated = TranslatedField() currency = CurrencySerializer(read_only=True) class Meta: model = models.Plate fields = [ 'name_translated', 'currency', 'price', 'is_signature_plate', ] class MenuSerializers(ProjectModelSerializer): plates = PlateSerializer(read_only=True, many=True, source='plate_set') category_translated = serializers.CharField(read_only=True) class Meta: model = models.Menu fields = [ 'id', 'category', 'category_translated', 'plates', 'establishment' ] class MenuRUDSerializers(ProjectModelSerializer): plates = PlateSerializer(read_only=True, many=True, source='plate_set') class Meta: model = models.Menu fields = [ 'id', 'category', 'plates', 'establishment' ] class ReviewSerializer(serializers.ModelSerializer): """Serializer for model Review.""" text_translated = serializers.CharField(read_only=True) class Meta: """Meta class.""" model = review_models.Review fields = ( 'text_translated', ) class EstablishmentTypeBaseSerializer(serializers.ModelSerializer): """Serializer for EstablishmentType model.""" name_translated = TranslatedField() class Meta: """Meta class.""" model = models.EstablishmentType fields = [ 'id', 'name', 'name_translated', 'use_subtypes' ] extra_kwargs = { 'name': {'write_only': True}, 'use_subtypes': {'write_only': True}, } class EstablishmentTypeGeoSerializer(EstablishmentTypeBaseSerializer): """Serializer for EstablishmentType model w/ index_name.""" class Meta(EstablishmentTypeBaseSerializer.Meta): fields = EstablishmentTypeBaseSerializer.Meta.fields + [ 'index_name' ] extra_kwargs = { **EstablishmentTypeBaseSerializer.Meta.extra_kwargs, 'index_name': {'read_only': True}, } class EstablishmentSubTypeBaseSerializer(serializers.ModelSerializer): """Serializer for EstablishmentSubType models.""" name_translated = TranslatedField() class Meta: """Meta class.""" model = models.EstablishmentSubType fields = [ 'id', 'name', 'name_translated', 'establishment_type' ] extra_kwargs = { 'name': {'write_only': True}, 'establishment_type': {'write_only': True} } class EstablishmentSubTypeGeoSerializer(EstablishmentSubTypeBaseSerializer): """Serializer for EstablishmentSuType model w/ index_name.""" class Meta(EstablishmentSubTypeBaseSerializer.Meta): fields = EstablishmentSubTypeBaseSerializer.Meta.fields + [ 'index_name' ] extra_kwargs = { **EstablishmentSubTypeBaseSerializer.Meta.extra_kwargs, 'index_name': {'read_only': True}, } class EstablishmentEmployeeSerializer(serializers.ModelSerializer): """Serializer for actual employees.""" id = serializers.IntegerField(source='employee.id') name = serializers.CharField(source='employee.name') position_translated = serializers.CharField(source='position.name_translated') awards = AwardSerializer(source='employee.awards', many=True) priority = serializers.IntegerField(source='position.priority') position_index_name = serializers.CharField(source='position.index_name') class Meta: """Meta class.""" model = models.Employee fields = ('id', 'name', 'position_translated', 'awards', 'priority', 'position_index_name') class EstablishmentBaseSerializer(ProjectModelSerializer): """Base serializer for Establishment model.""" preview_image = serializers.URLField(source='preview_image_url') address = AddressBaseSerializer() in_favorites = serializers.BooleanField(allow_null=True) tags = TagBaseSerializer(read_only=True, many=True) currency = CurrencySerializer() class Meta: """Meta class.""" model = models.Establishment fields = [ 'id', 'name', 'transliterated_name', 'index_name', 'price_level', 'toque_number', 'public_mark', 'slug', 'preview_image', 'in_favorites', 'address', 'tags', 'currency' ] class EstablishmentGeoSerializer(EstablishmentBaseSerializer): """Serializer for Geo view.""" type = EstablishmentTypeGeoSerializer(source='establishment_type', read_only=True) subtypes = EstablishmentSubTypeGeoSerializer(many=True, source='establishment_subtypes') class Meta(EstablishmentBaseSerializer.Meta): """Meta class.""" fields = EstablishmentBaseSerializer.Meta.fields + [ 'type', 'subtypes', ] class RangePriceSerializer(serializers.Serializer): max = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True, default=0) min = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True, default=0) class EstablishmentDetailSerializer(EstablishmentBaseSerializer): """Serializer for Establishment model.""" description_translated = TranslatedField() image = serializers.URLField(source='image_url') type = EstablishmentTypeBaseSerializer(source='establishment_type', read_only=True) subtypes = EstablishmentSubTypeBaseSerializer(many=True, source='establishment_subtypes') awards = AwardSerializer(many=True) schedule = ScheduleRUDSerializer(many=True, allow_null=True) phones = ContactPhonesSerializer(read_only=True, many=True) emails = ContactEmailsSerializer(read_only=True, many=True) review = ReviewSerializer(source='last_published_review', allow_null=True) employees = EstablishmentEmployeeSerializer(source='actual_establishment_employees', many=True) menu = MenuSerializers(source='menu_set', many=True, read_only=True) best_price_menu = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True) best_price_carte = serializers.DecimalField(max_digits=14, decimal_places=2, read_only=True) range_price_menu = RangePriceSerializer(read_only=True) range_price_carte = RangePriceSerializer(read_only=True) vintage_year = serializers.ReadOnlyField() class Meta(EstablishmentBaseSerializer.Meta): """Meta class.""" fields = EstablishmentBaseSerializer.Meta.fields + [ 'description_translated', 'image', 'subtypes', 'type', 'awards', 'schedule', 'website', 'facebook', 'twitter', 'lafourchette', 'booking', 'phones', 'emails', 'review', 'employees', 'menu', 'best_price_menu', 'best_price_carte', 'range_price_menu', 'range_price_carte', 'transportation', 'vintage_year', ] class EstablishmentCommentCreateSerializer(comment_serializers.CommentSerializer): """Create comment serializer""" mark = serializers.IntegerField() class Meta: """Serializer for model Comment""" model = comment_models.Comment fields = [ 'id', 'created', 'text', 'mark', 'nickname', 'profile_pic', ] def validate(self, attrs): """Override validate method""" # Check establishment object establishment_slug = self.context.get('request').parser_context.get('kwargs').get('slug') establishment_qs = models.Establishment.objects.filter(slug=establishment_slug) if not establishment_qs.exists(): raise serializers.ValidationError({'detail': _('Establishment not found.')}) attrs['establishment'] = establishment_qs.first() return attrs def create(self, validated_data, *args, **kwargs): """Override create method""" validated_data.update({ 'user': self.context.get('request').user, 'content_object': validated_data.pop('establishment') }) return super().create(validated_data) class EstablishmentCommentRUDSerializer(comment_serializers.CommentSerializer): """Retrieve/Update/Destroy comment serializer.""" class Meta: """Meta class.""" model = comment_models.Comment fields = [ 'id', 'created', 'text', 'mark', 'nickname', 'profile_pic', ] class EstablishmentFavoritesCreateSerializer(FavoritesCreateSerializer): """Serializer to favorite object w/ model Establishment.""" def validate(self, attrs): """Overridden validate method""" # Check establishment object establishment_qs = models.Establishment.objects.filter(slug=self.slug) # Check establishment obj by slug from lookup_kwarg if not establishment_qs.exists(): raise serializers.ValidationError({'detail': _('Object not found.')}) else: establishment = establishment_qs.first() # Check existence in favorites if establishment.favorites.filter(user=self.user).exists(): raise utils_exceptions.FavoritesError() attrs['establishment'] = establishment return attrs def create(self, validated_data, *args, **kwargs): """Overridden create method""" validated_data.update({ 'user': self.user, 'content_object': validated_data.pop('establishment') }) return super().create(validated_data)