"""Establishment serializers.""" 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 favorites.models import Favorites 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 comment_serializers.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 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_id = self.context.get('request').parser_context.get('kwargs').get('pk') establishment_qs = models.Establishment.objects.filter(id=establishment_id) if not establishment_qs.exists(): return serializers.ValidationError() 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(serializers.ModelSerializer): """Create comment serializer""" class Meta: """Serializer for model Comment""" model = Favorites fields = [ 'id', 'created', ] def get_user(self): """Get user from request""" return self.context.get('request').user def validate(self, attrs): """Override validate method""" # Check establishment object establishment_id = self.context.get('request').parser_context.get('kwargs').get('pk') establishment_qs = models.Establishment.objects.filter(id=establishment_id) # Check establishment obj by pk from lookup_kwarg if not establishment_qs.exists(): return serializers.ValidationError() # Check existence in favorites if self.get_user().favorites.by_content_type(app_label='establishment', model='establishment', object_id=establishment_id).exists(): raise serializers.ValidationError() attrs['establishment'] = establishment_qs.first() return attrs def create(self, validated_data, *args, **kwargs): """Override create method""" validated_data.update({ 'user': self.get_user(), 'content_object': validated_data.pop('establishment') }) return super().create(validated_data)