-
Notifications
You must be signed in to change notification settings - Fork 637
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Resolve #669
base: master
Are you sure you want to change the base?
Resolve #669
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Generated by Django 4.1 on 2024-10-03 23:09 | ||
|
||
from django.db import migrations | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
("cinema", "0004_alter_genre_name"), | ||
] | ||
|
||
operations = [ | ||
migrations.AlterModelOptions( | ||
name="ticket", | ||
options={"ordering": ["row", "seat"]}, | ||
), | ||
] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Generated by Django 4.1 on 2024-10-04 10:46 | ||
|
||
from django.db import migrations | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
dependencies = [ | ||
("cinema", "0005_alter_ticket_options"), | ||
] | ||
|
||
operations = [ | ||
migrations.AlterModelOptions( | ||
name="ticket", | ||
options={}, | ||
), | ||
] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,17 @@ | ||
from rest_framework import viewsets | ||
|
||
from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession | ||
from datetime import datetime | ||
|
||
from django.db.models import F, Count | ||
from rest_framework import viewsets, mixins | ||
from rest_framework.pagination import PageNumberPagination | ||
|
||
from cinema.models import ( | ||
Genre, | ||
Actor, | ||
CinemaHall, | ||
Movie, | ||
MovieSession, | ||
Order | ||
) | ||
|
||
from cinema.serializers import ( | ||
GenreSerializer, | ||
|
@@ -12,6 +23,8 @@ | |
MovieDetailSerializer, | ||
MovieSessionDetailSerializer, | ||
MovieListSerializer, | ||
OrderSerializer, | ||
OrderListSerializer, | ||
) | ||
|
||
|
||
|
@@ -31,9 +44,35 @@ class CinemaHallViewSet(viewsets.ModelViewSet): | |
|
||
|
||
class MovieViewSet(viewsets.ModelViewSet): | ||
queryset = Movie.objects.all() | ||
queryset = Movie.objects.prefetch_related("genres", "actors") | ||
serializer_class = MovieSerializer | ||
|
||
@staticmethod | ||
def _params_to_ints(qs): | ||
"""Converts a list of string IDs to a list of integers""" | ||
return [int(str_id) for str_id in qs.split(",")] | ||
|
||
def get_queryset(self): | ||
"""Retrieve the movies with filters""" | ||
title = self.request.query_params.get("title") | ||
genres = self.request.query_params.get("genres") | ||
actors = self.request.query_params.get("actors") | ||
|
||
queryset = self.queryset | ||
|
||
if title: | ||
queryset = queryset.filter(title__icontains=title) | ||
|
||
if genres: | ||
genres_ids = self._params_to_ints(genres) | ||
queryset = queryset.filter(genres__id__in=genres_ids) | ||
|
||
if actors: | ||
actors_ids = self._params_to_ints(actors) | ||
queryset = queryset.filter(actors__id__in=actors_ids) | ||
|
||
return queryset.distinct() | ||
|
||
def get_serializer_class(self): | ||
if self.action == "list": | ||
return MovieListSerializer | ||
|
@@ -45,9 +84,27 @@ def get_serializer_class(self): | |
|
||
|
||
class MovieSessionViewSet(viewsets.ModelViewSet): | ||
queryset = MovieSession.objects.all() | ||
queryset = ( | ||
MovieSession.objects.all() | ||
.select_related("movie", "cinema_hall") | ||
) | ||
serializer_class = MovieSessionSerializer | ||
|
||
def get_queryset(self): | ||
date = self.request.query_params.get("date") | ||
movie_id_str = self.request.query_params.get("movie") | ||
|
||
queryset = self.queryset | ||
|
||
if date: | ||
date = datetime.strptime(date, "%Y-%m-%d").date() | ||
queryset = queryset.filter(show_time__date=date) | ||
|
||
Comment on lines
+110
to
+112
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In ma case such code works:
and you do not need one more raw There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In my case it unfortunately doesn't work |
||
if movie_id_str: | ||
queryset = queryset.filter(movie_id=int(movie_id_str)) | ||
|
||
return queryset | ||
|
||
def get_serializer_class(self): | ||
if self.action == "list": | ||
return MovieSessionListSerializer | ||
|
@@ -56,3 +113,30 @@ def get_serializer_class(self): | |
return MovieSessionDetailSerializer | ||
|
||
return MovieSessionSerializer | ||
|
||
|
||
class OrderPagination(PageNumberPagination): | ||
page_size = 3 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better to put pagination in separate file to structure code better |
||
page_size_query_param = "page_size" | ||
max_page_size = 3 | ||
|
||
|
||
class OrderViewSet(viewsets.ModelViewSet): | ||
queryset = Order.objects.prefetch_related( | ||
"tickets__movie_session__movie", | ||
"tickets__movie_session__cinema_hall" | ||
) | ||
serializer_class = OrderSerializer | ||
pagination_class = OrderPagination | ||
|
||
def get_queryset(self): | ||
return Order.objects.filter(user=self.request.user) | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. By doing this you are overriding queryset with prefetch above |
||
def get_serializer_class(self): | ||
if self.action == "list": | ||
return OrderListSerializer | ||
|
||
return OrderSerializer | ||
|
||
def perform_create(self, serializer): | ||
serializer.save(user=self.request.user) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is quiet inefficient because we will have to query database for tickets.count() on every entry in a list. Better to override queryset and use annotate()