"""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 favorites.models import Favorites from location.serializers import AddressSimpleSerializer, AddressSerializer from main.models import MetaDataContent from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer from review import models as review_models from timetable.serialziers import ScheduleRUDSerializer from utils import exceptions as utils_exceptions from utils.serializers import TranslatedField, ProjectModelSerializer 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 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 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) priority = serializers.IntegerField(source='position.priority') class Meta: """Meta class.""" model = models.Employee fields = ('id', 'name', 'position_translated', 'awards', 'priority') class EstablishmentBaseSerializer(ProjectModelSerializer): """Base serializer for Establishment model.""" preview_image = serializers.URLField(source='preview_image_url') slug = serializers.SlugField(allow_blank=False, required=True, max_length=50) address = AddressSerializer() tags = MetaDataContentSerializer(many=True) class Meta: """Meta class.""" model = models.Establishment fields = [ 'id', 'name', 'name_translated', 'price_level', 'toque_number', 'public_mark', 'slug', 'preview_image', 'in_favorites', 'address', 'tags', ] class EstablishmentListSerializer(EstablishmentBaseSerializer): """Serializer for Establishment model.""" in_favorites = serializers.BooleanField(allow_null=True) class Meta(EstablishmentBaseSerializer.Meta): """Meta class.""" fields = EstablishmentBaseSerializer.Meta.fields + [ 'in_favorites', ] class EstablishmentAllListSerializer(EstablishmentListSerializer): """ Serailizer for api/*/establishments """ address = AddressSimpleSerializer() class Meta(EstablishmentListSerializer.Meta): pass class EstablishmentDetailSerializer(EstablishmentListSerializer): """Serializer for Establishment model.""" description_translated = TranslatedField() image = serializers.URLField(source='image_url') type = EstablishmentTypeSerializer(source='establishment_type', read_only=True) subtypes = EstablishmentSubTypeSerializer(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) vintage_year = serializers.ReadOnlyField() class Meta(EstablishmentListSerializer.Meta): """Meta class.""" fields = EstablishmentListSerializer.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', '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(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_slug = self.context.get('request').parser_context.get('kwargs').get('slug') establishment_qs = models.Establishment.objects.filter(slug=establishment_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 self.get_user().favorites.by_content_type(app_label='establishment', model='establishment')\ .by_object_id(object_id=establishment.id).exists(): raise utils_exceptions.FavoritesError() attrs['establishment'] = establishment 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) class EstablishmentTagListSerializer(serializers.ModelSerializer): """List establishment tag serializer.""" id = serializers.IntegerField(source='metadata.id') label_translated = serializers.CharField( source='metadata.label_translated', read_only=True, allow_null=True) class Meta: """Meta class.""" model = MetaDataContent fields = [ 'id', 'label_translated', ]