Python · 3368 bytes Raw Blame History
1 from rest_framework import serializers
2 from .models import Restaurant, Rating
3
4
5 class RatingSerializer(serializers.ModelSerializer):
6 class Meta:
7 model = Rating
8 fields = ['id', 'rating', 'review', 'created_at']
9 read_only_fields = ['id', 'created_at']
10
11 def validate_review(self, value):
12 """Ensure review mentions toast"""
13 if value:
14 toast_keywords = [
15 'toast', 'bread', 'butter', 'jam', 'marmalade',
16 'french toast', 'avocado', 'sourdough', 'rye',
17 'whole wheat', 'brioche', 'challah'
18 ]
19 review_lower = value.lower()
20 if not any(keyword in review_lower for keyword in toast_keywords):
21 raise serializers.ValidationError(
22 'Reviews must be about toast! Please mention the toast in your review.'
23 )
24 return value
25
26
27 class RestaurantSerializer(serializers.ModelSerializer):
28 average_rating = serializers.FloatField(read_only=True)
29 total_ratings = serializers.IntegerField(read_only=True)
30
31 class Meta:
32 model = Restaurant
33 fields = [
34 'id', 'place_id', 'name', 'address',
35 'latitude', 'longitude', 'average_rating',
36 'total_ratings', 'created_at', 'has_toast'
37 ]
38 read_only_fields = ['id', 'average_rating', 'total_ratings', 'created_at']
39
40
41 class RestaurantDetailSerializer(RestaurantSerializer):
42 """Detailed view including recent ratings"""
43 recent_ratings = serializers.SerializerMethodField()
44
45 class Meta(RestaurantSerializer.Meta):
46 fields = RestaurantSerializer.Meta.fields + ['recent_ratings']
47
48 def get_recent_ratings(self, obj):
49 # Get last 5 ratings
50 recent = obj.ratings.all()[:5]
51 return RatingSerializer(recent, many=True).data
52
53
54 class CreateRatingSerializer(serializers.ModelSerializer):
55 """Serializer for creating a rating"""
56 class Meta:
57 model = Rating
58 fields = ['rating', 'review']
59
60 def validate_review(self, value):
61 """Ensure review mentions toast"""
62 if value:
63 toast_keywords = [
64 'toast', 'bread', 'butter', 'jam', 'marmalade',
65 'french toast', 'avocado', 'sourdough', 'rye',
66 'whole wheat', 'brioche', 'challah'
67 ]
68 review_lower = value.lower()
69 if not any(keyword in review_lower for keyword in toast_keywords):
70 raise serializers.ValidationError(
71 'Reviews must be about toast! Please mention the toast in your review.'
72 )
73 return value
74
75
76 class PlaceSearchSerializer(serializers.Serializer):
77 """Serializer for place search results"""
78 place_id = serializers.CharField()
79 name = serializers.CharField()
80 address = serializers.CharField()
81 latitude = serializers.FloatField()
82 longitude = serializers.FloatField()
83 category = serializers.CharField(required=False)
84 cuisine = serializers.CharField(required=False)
85 confidence = serializers.CharField(required=False)
86 distance = serializers.FloatField(required=False)
87 source = serializers.CharField(required=False)
88 restaurant_id = serializers.IntegerField(required=False)
89 has_toast = serializers.BooleanField(required=False, allow_null=True)