Skip to content

Commit

Permalink
'Solution'
Browse files Browse the repository at this point in the history
  • Loading branch information
Sonemon committed Dec 2, 2024
1 parent 1f225be commit 7adf616
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 5 deletions.
6 changes: 5 additions & 1 deletion cinema/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,13 @@ class Actor(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)

def __str__(self):
@property
def full_name(self) -> str:
return self.first_name + " " + self.last_name

def __str__(self):
return self.full_name


class Movie(models.Model):
title = models.CharField(max_length=255)
Expand Down
87 changes: 86 additions & 1 deletion cinema/serializers.py
Original file line number Diff line number Diff line change
@@ -1 +1,86 @@
# write serializers here
from rest_framework import serializers

from cinema.models import Genre, CinemaHall, Actor, Movie, MovieSession


class GenreSerializer(serializers.ModelSerializer):
class Meta:
model = Genre
fields = ("id", "name")


class CinemaHallSerializer(serializers.ModelSerializer):
class Meta:
model = CinemaHall
fields = ("id", "name", "rows", "seats_in_row", "capacity")


class ActorSerializer(serializers.ModelSerializer):
class Meta:
model = Actor
fields = ("id", "first_name", "last_name", "full_name")


class MovieSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
fields = (
"id",
"title",
"description",
"duration",
"genres",
"actors"
)


class MovieListSerializer(MovieSerializer):
genres = serializers.StringRelatedField(many=True, read_only=True)
actors = serializers.StringRelatedField(many=True, read_only=True)


class MovieRetrieveSerializer(MovieSerializer):
genres = GenreSerializer(many=True, read_only=True)
actors = ActorSerializer(many=True, read_only=True)


class MovieSessionSerializer(serializers.ModelSerializer):
class Meta:
model = MovieSession
fields = "__all__"


class MovieSessionListSerializer(serializers.ModelSerializer):
movie_title = serializers.CharField(source="movie.title", read_only=True)
cinema_hall_name = serializers.CharField(
source="cinema_hall.name",
read_only=True
)
cinema_hall_capacity = serializers.IntegerField(
source="cinema_hall.capacity",
read_only=True
)

class Meta:
model = MovieSession
fields = (
"id",
"show_time",
"movie_title",
"cinema_hall_name",
"cinema_hall_capacity"
)


class MovieSessionRetrieveSerializer(MovieSessionSerializer):
movie = MovieListSerializer()
cinema_hall = CinemaHallSerializer()

class Meta:
model = MovieSession
fields = (
"id",
"show_time",
"movie",
"cinema_hall"
)
24 changes: 23 additions & 1 deletion cinema/urls.py
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
# write urls here
from django.urls import path, include
from rest_framework import routers

from cinema.views import (
GenreViewSet,
ActorViewSet,
MovieViewSet,
MovieSessionViewSet,
CinemaHallViewSet,
)

app_name = "cinema"

router = routers.DefaultRouter()
router.register("genres", GenreViewSet)
router.register("actors", ActorViewSet)
router.register("movies", MovieViewSet)
router.register("movie_sessions", MovieSessionViewSet)
router.register("cinema_halls", CinemaHallViewSet)

urlpatterns = [
path("api/cinema/", include(router.urls)),
]
57 changes: 56 additions & 1 deletion cinema/views.py
Original file line number Diff line number Diff line change
@@ -1 +1,56 @@
# write views here
from rest_framework import viewsets
from cinema.models import (
Genre,
Actor,
Movie,
MovieSession,
CinemaHall,
)
from cinema.serializers import (
GenreSerializer,
ActorSerializer,
MovieSerializer,
MovieListSerializer,
MovieRetrieveSerializer,
MovieSessionSerializer,
MovieSessionListSerializer,
MovieSessionRetrieveSerializer,
CinemaHallSerializer,
)


class GenreViewSet(viewsets.ModelViewSet):
queryset = Genre.objects.all()
serializer_class = GenreSerializer


class ActorViewSet(viewsets.ModelViewSet):
queryset = Actor.objects.all()
serializer_class = ActorSerializer


class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()

def get_serializer_class(self):
if self.action == "list":
return MovieListSerializer
elif self.action == "retrieve":
return MovieRetrieveSerializer
return MovieSerializer


class MovieSessionViewSet(viewsets.ModelViewSet):
queryset = MovieSession.objects.all()

def get_serializer_class(self):
if self.action == "list":
return MovieSessionListSerializer
elif self.action == "retrieve":
return MovieSessionRetrieveSerializer
return MovieSessionSerializer


class CinemaHallViewSet(viewsets.ModelViewSet):
queryset = CinemaHall.objects.all()
serializer_class = CinemaHallSerializer
3 changes: 2 additions & 1 deletion cinema_service/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib import admin
from django.urls import path
from django.urls import path, include

urlpatterns = [
path("admin/", admin.site.urls),
path("", include("cinema.urls", namespace="cinema")),
]

0 comments on commit 7adf616

Please sign in to comment.