Skip to content

Commit

Permalink
solution
Browse files Browse the repository at this point in the history
  • Loading branch information
VolodymyrSemchysyn committed Dec 11, 2024
1 parent 1f225be commit 7f236d7
Show file tree
Hide file tree
Showing 6 changed files with 174 additions and 11 deletions.
14 changes: 8 additions & 6 deletions cinema/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ class Actor(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)

@property
def full_name(self):
return f"{self.first_name} {self.last_name}"

def __str__(self):
return self.first_name + " " + self.last_name

Expand Down Expand Up @@ -85,16 +89,14 @@ def clean(self):
(self.row, "row", "count_rows"),
(self.seat, "seat", "count_seats_in_row"),
]:
count_attrs = getattr(
self.movie_session.cinema_hall, cinema_hall_attr_name
)
count_attrs = getattr(self.movie_session.cinema_hall, cinema_hall_attr_name)
if not (1 <= ticket_attr_value <= count_attrs):
raise ValidationError(
{
ticket_attr_name: f"{ticket_attr_name} number "
f"must be in available range: "
f"(1, {cinema_hall_attr_name}): "
f"(1, {count_attrs})"
f"must be in available range: "
f"(1, {cinema_hall_attr_name}): "
f"(1, {count_attrs})"
}
)

Expand Down
81 changes: 80 additions & 1 deletion cinema/serializers.py
Original file line number Diff line number Diff line change
@@ -1 +1,80 @@
# write serializers here
from rest_framework import serializers
from cinema.models import CinemaHall, Genre, Actor, Movie, MovieSession


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


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


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.SlugRelatedField(
many=True,
read_only=True,
slug_field="name"
)
actors = serializers.SlugRelatedField(
many=True,
read_only=True,
slug_field="full_name"
)


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


class MovieSessionSerializer(serializers.ModelSerializer):
movie = serializers.PrimaryKeyRelatedField(queryset=Movie.objects.all())
cinema_hall = serializers.PrimaryKeyRelatedField(queryset=CinemaHall.objects.all())
class Meta:
model = MovieSession
fields = ("show_time", "movie", "cinema_hall")


class MovieSessionListSerializer(MovieSessionSerializer):
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 MovieSessionDetailSerializer(MovieSessionSerializer):
movie = MovieListSerializer(many=False, read_only=True)
cinema_hall = CinemaHallSerializer(many=False, read_only=True)
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 (
CinemaHallViewSet,
GenreViewSet,
ActorViewSet,
MovieViewSet,
MovieSessionViewSet
)

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

urlpatterns = [
path("", include(router.urls))
]

app_name = "cinema"
61 changes: 60 additions & 1 deletion cinema/views.py
Original file line number Diff line number Diff line change
@@ -1 +1,60 @@
# write views here
from rest_framework import viewsets
from cinema.models import CinemaHall, Genre, Actor, Movie, MovieSession
from cinema.serializers import (
CinemaHallSerializer, GenreSerializer,
ActorSerializer, MovieSerializer,
MovieSessionSerializer, MovieListSerializer,
MovieDetailSerializer, MovieSessionListSerializer,
MovieSessionDetailSerializer
)


class CinemaHallViewSet(viewsets.ModelViewSet):
queryset = CinemaHall.objects.all()
serializer_class = 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()
serializer_class = MovieSerializer

def get_queryset(self):
queryset = self.queryset
if self.action in ("list", "retrieve"):
return queryset.prefetch_related("genres", "actors")
return queryset

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


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

def get_queryset(self):
queryset = self.queryset
if self.action == "list":
return queryset.select_related("movie", "cinema_hall")
return queryset

def get_serializer_class(self):
if self.action == "list":
return MovieSessionListSerializer
if self.action == "retrieve":
return MovieSessionDetailSerializer
return MovieSessionSerializer
2 changes: 1 addition & 1 deletion cinema_service/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@

USE_I18N = True

USE_TZ = True
USE_TZ = False


# Static files (CSS, JavaScript, Images)
Expand Down
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("api/cinema/", include("cinema.urls", namespace="cinema")),
]

0 comments on commit 7f236d7

Please sign in to comment.