343 lines
10 KiB
Python
343 lines
10 KiB
Python
"""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 AddressBaseSerializer
|
|
from main.serializers import AwardSerializer, CurrencySerializer
|
|
from tag import models as tag_models
|
|
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 = TranslatedField()
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
|
|
model = models.EstablishmentType
|
|
fields = ('id', 'name', 'name_translated')
|
|
extra_kwargs = {
|
|
'name': {'write_only': True}
|
|
}
|
|
|
|
|
|
class EstablishmentSubTypeSerializer(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 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 EstablishmentCategoryTagListSerializer(serializers.ModelSerializer):
|
|
"""Serializer for establishment category tags."""
|
|
label_translated = TranslatedField()
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
model = tag_models.TagCategory
|
|
fields = [
|
|
'id',
|
|
'label_translated',
|
|
]
|
|
|
|
|
|
class EstablishmentTagListSerializer(serializers.ModelSerializer):
|
|
"""Serializer for establishment tags."""
|
|
label_translated = TranslatedField(source='tag.label_translated')
|
|
category = EstablishmentCategoryTagListSerializer(source='tag.category')
|
|
|
|
class Meta:
|
|
"""Meta class."""
|
|
model = tag_models.Tag
|
|
fields = [
|
|
'id',
|
|
'label_translated',
|
|
'category',
|
|
]
|
|
|
|
|
|
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 = AddressBaseSerializer()
|
|
in_favorites = serializers.BooleanField(allow_null=True)
|
|
tags = EstablishmentTagListSerializer(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 EstablishmentDetailSerializer(EstablishmentBaseSerializer):
|
|
"""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(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',
|
|
'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)
|