movie-night-api/movie_manager/serializers.py

81 lines
2.2 KiB
Python

from django.utils import timezone
from gunicorn.config import User
from rest_framework import serializers
from movie_manager.models import Movie, MovieList, Schedule, Showing
class MovieSerializer(serializers.ModelSerializer):
has_been_scheduled = serializers.SerializerMethodField()
class Meta:
model = Movie
fields = [
"id",
"title",
"imdb_id",
"year",
"director",
"actors",
"plot",
"genre",
"mpaa_rating",
"critic_scores",
"poster",
"added_by_id",
"has_been_scheduled",
]
def get_has_been_scheduled(self, obj):
return Showing.objects.filter(movie_id=obj.id).exists()
class MovieListSerializer(serializers.ModelSerializer):
movie_count = serializers.SerializerMethodField()
movies = MovieSerializer(read_only=True, many=True)
serializer_class = MovieSerializer
def get_queryset(self):
return MovieList.objects.prefetch_related(
"movies",
"movies__showing_set"
)
class Meta:
model = MovieList
fields = ["id", "name", "owner", "public", "movies", "movie_count"]
def get_movie_count(self, obj):
return obj.movies.count()
class UserSerializer(serializers.Serializer):
class Meta:
model = User
fields = ["id", "username"]
class ShowingSerializer(serializers.ModelSerializer):
movie = MovieSerializer(read_only=True)
class Meta:
model = Showing
fields = ["id", "public", "showtime", "movie", "owner"]
def to_internal_value(self, data):
validated_data = super().to_internal_value(data)
if "showtime" in validated_data and timezone.is_naive(
validated_data["showtime"]
):
validated_data["showtime"] = timezone.make_aware(validated_data["showtime"])
return validated_data
class ScheduleSerializer(serializers.ModelSerializer):
name = serializers.CharField(read_only=True)
showings = ShowingSerializer(source="showing_set", read_only=True, many=True)
class Meta:
model = Schedule
fields = ["name", "owner", "public", "slug", "showings"]