156 lines
4.9 KiB
Python
156 lines
4.9 KiB
Python
from rest_framework import serializers
|
|
|
|
from apps.food.models import Menu, SingleFood, HappyHour, Allergene, FoodImage, HappyHourLocation
|
|
from apps.food.models import UserFoodRating, UserFoodImage
|
|
from django.contrib.auth.models import User
|
|
from rest_framework import serializers
|
|
from rest_framework import validators
|
|
|
|
|
|
class DefaultFoodImageSerializer(serializers.Serializer):
|
|
"""Your data serializer, define your fields here."""
|
|
|
|
def create(self, validated_data):
|
|
pass
|
|
|
|
def update(self, instance, validated_data):
|
|
pass
|
|
|
|
image = serializers.CharField()
|
|
|
|
|
|
class MenusLocationsSerializer(serializers.Serializer):
|
|
"""Your data serializer, define your fields here."""
|
|
|
|
def create(self, validated_data):
|
|
pass
|
|
|
|
def update(self, instance, validated_data):
|
|
pass
|
|
|
|
id = serializers.CharField()
|
|
short = serializers.CharField()
|
|
name = serializers.CharField()
|
|
|
|
|
|
class AllergensSerializer(serializers.HyperlinkedModelSerializer):
|
|
class Meta:
|
|
model = Allergene
|
|
fields = ('id', 'name')
|
|
|
|
|
|
class OverviewFoodImageSerializer(serializers.HyperlinkedModelSerializer):
|
|
class Meta:
|
|
model = FoodImage
|
|
fields = ('id', 'thumb')
|
|
|
|
|
|
class DetailedFoodImageSerializer(serializers.HyperlinkedModelSerializer):
|
|
class Meta:
|
|
model = FoodImage
|
|
fields = ('id', 'image', 'thumb')
|
|
|
|
|
|
class OverviewSingleFoodSerializer(serializers.HyperlinkedModelSerializer):
|
|
image = OverviewFoodImageSerializer(many=False, read_only=True)
|
|
|
|
class Meta:
|
|
model = SingleFood
|
|
fields = ('id', 'name', 'rating', 'price_student', 'image')
|
|
|
|
|
|
class MinimalSingleFoodSerializer(serializers.HyperlinkedModelSerializer):
|
|
class Meta:
|
|
model = SingleFood
|
|
fields = ('id', 'name')
|
|
|
|
|
|
class DetailedSingleFoosdSerializer(serializers.HyperlinkedModelSerializer):
|
|
allergens = AllergensSerializer(many=True, read_only=True)
|
|
image = DetailedFoodImageSerializer(many=False, read_only=True)
|
|
|
|
class Meta:
|
|
model = SingleFood
|
|
fields = ('id', 'name', 'rating', 'price_student', 'price_employee', 'price_guest', 'allergens', 'image')
|
|
|
|
|
|
class OverviewMenuSerializer(serializers.HyperlinkedModelSerializer):
|
|
date = serializers.DateField(format='iso-8601')
|
|
menu = OverviewSingleFoodSerializer(many=True, read_only=True)
|
|
location = serializers.ChoiceField(choices=Menu.LOCATION_CHOICES)
|
|
|
|
class Meta:
|
|
model = Menu
|
|
fields = ('id', 'date', 'location', 'menu')
|
|
|
|
|
|
class DetailMenuSerializer(serializers.HyperlinkedModelSerializer):
|
|
date = serializers.DateField(format='iso-8601')
|
|
menu = DetailedSingleFoosdSerializer(many=True, read_only=True)
|
|
location = serializers.ChoiceField(choices=Menu.LOCATION_CHOICES)
|
|
|
|
class Meta:
|
|
model = Menu
|
|
fields = ('id', 'date', 'location', 'menu')
|
|
|
|
|
|
# -------------------------- Happy Hour ------------------------------------
|
|
class HappyHourSerializer(serializers.HyperlinkedModelSerializer):
|
|
date = serializers.DateField(format='iso-8601')
|
|
starttime = serializers.TimeField()
|
|
endtime = serializers.TimeField()
|
|
|
|
class Meta:
|
|
model = HappyHour
|
|
fields = ('id', 'date', 'starttime', 'endtime', 'location', 'description')
|
|
|
|
|
|
class HappyHourLocationSerializer(serializers.HyperlinkedModelSerializer):
|
|
class Meta:
|
|
model = HappyHourLocation
|
|
fields = ('id', 'name')
|
|
|
|
|
|
# --------------------------- User --------------------------------------------
|
|
class UserFoodImageSerializer(serializers.HyperlinkedModelSerializer):
|
|
class Meta:
|
|
model = UserFoodImage
|
|
fields = ('id', 'image_image', 'image_thumb')
|
|
|
|
|
|
class UserFoodRatingSerializer(serializers.ModelSerializer):
|
|
# food = MinimalSingleFoodSerializer(many=False, read_only=False)
|
|
|
|
class Meta:
|
|
model = UserFoodRating
|
|
fields = ('id', 'rating')
|
|
|
|
def run_validators(self, value):
|
|
for validator in self.validators:
|
|
if isinstance(validator, validators.UniqueTogetherValidator):
|
|
self.validators.remove(validator)
|
|
super(UserFoodRatingSerializer, self).run_validators(value)
|
|
|
|
def create(self, validated_data):
|
|
# TODO: Custom exception handler
|
|
rating = validated_data.pop('rating')
|
|
if rating >= 1 or rating <= 5:
|
|
food_id = self.context.get('food_id')
|
|
# user = self.context['request'].user
|
|
user = User.objects.get(id=1)
|
|
food = SingleFood.objects.get(id=food_id)
|
|
user_rating, _ = UserFoodRating.objects.get_or_create(food=food, user=user)
|
|
user_rating.rating = rating
|
|
user_rating.save()
|
|
|
|
food_user_ratings = UserFoodRating.objects.all().filter(food=food)
|
|
sum = 0
|
|
for food_user_rating in food_user_ratings:
|
|
sum += food_user_rating.rating
|
|
|
|
food.rating = sum / food_user_ratings.count()
|
|
food.save()
|
|
return user_rating
|
|
else:
|
|
raise ValueError
|