"""Establishment serializers.""" from rest_framework import serializers from comment.serializers.common import CommentSerializer from establishment import models from location.serializers import AddressSerializer from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer from review import models as review_models from timetable.models import Timetable 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 PlateSerializer(serializers.ModelSerializer): name_translated = serializers.CharField(allow_null=True) currency = CurrencySerializer(read_only=True) class Meta: model = models.Plate fields = [ 'name_translated', 'currency', 'price', 'is_signature_plate', ] class MenuSerializers(serializers.ModelSerializer): 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_translated', 'plates' ] class EstablishmentTypeSerializer(serializers.ModelSerializer): """Serializer for EstablishmentType model.""" name_translated = serializers.CharField(allow_null=True) class Meta: """Meta class.""" model = models.EstablishmentType fields = ('id', 'name_translated') class EstablishmentSubTypeSerializer(serializers.ModelSerializer): """Serializer for EstablishmentSubType models.""" name_translated = serializers.CharField(allow_null=True) class Meta: """Meta class.""" model = models.EstablishmentSubType fields = ('id', 'name_translated') class EstablishmentScheduleSerializer(serializers.ModelSerializer): """Serializer for Establishment model.""" weekday = serializers.CharField(source='get_weekday_display') class Meta: """Meta class.""" model = Timetable fields = ( 'weekday', 'lunch_start', 'lunch_end', 'dinner_start', 'dinner_end', ) 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 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) class Meta: """Meta class.""" model = models.Employee fields = ('id', 'name', 'position_translated', 'awards') class EstablishmentListSerializer(serializers.ModelSerializer): """Serializer for Establishment model.""" name_translated = serializers.CharField(allow_null=True) type = EstablishmentTypeSerializer(source='establishment_type') subtypes = EstablishmentSubTypeSerializer(many=True) address = AddressSerializer() tags = MetaDataContentSerializer(many=True) preview_image = serializers.SerializerMethodField() class Meta: """Meta class.""" model = models.Establishment fields = ( 'id', 'name_translated', 'price_level', 'toque_number', 'public_mark', 'type', 'subtypes', 'preview_image', 'address', 'tags', ) def get_preview_image(self, obj): """Get preview image""" return obj.get_full_image_url(request=self.context.get('request'), thumbnail_key='establishment_preview') class EstablishmentDetailSerializer(EstablishmentListSerializer): """Serializer for Establishment model.""" description_translated = serializers.CharField(allow_null=True) awards = AwardSerializer(many=True) schedule = EstablishmentScheduleSerializer(source='schedule.schedule', many=True, allow_null=True) phones = ContactPhonesSerializer(read_only=True, many=True, ) emails = ContactEmailsSerializer(read_only=True, many=True, ) review = serializers.SerializerMethodField() comments = serializers.SerializerMethodField() employees = EstablishmentEmployeeSerializer(source='actual_establishment_employees', many=True) menu = MenuSerializers(source='menu_set', many=True, read_only=True) preview_image = serializers.SerializerMethodField() 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) class Meta: """Meta class.""" model = models.Establishment fields = EstablishmentListSerializer.Meta.fields + ( 'description_translated', 'price_level', 'image', 'awards', 'schedule', 'website', 'facebook', 'twitter', 'lafourchette', 'booking', 'phones', 'emails', 'review', 'comments', 'employees', 'menu', 'best_price_menu', 'best_price_carte' ) def get_comments(self, obj): """Serializer method for comment field""" request = self.context.get('request') return CommentSerializer(obj.comments.annotate_is_mine_status(user=request.user), context={'request': self.context.get('request')}, many=True).data def get_review(self, obj): """Serializer method for getting last published review""" return ReviewSerializer(obj.reviews.by_status(status=review_models.Review.READY) .order_by('-published_at').first()).data