-
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 all 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 |
---|---|---|
@@ -0,0 +1,7 @@ | ||
from rest_framework.pagination import PageNumberPagination | ||
|
||
|
||
class OrderPagination(PageNumberPagination): | ||
page_size = 3 | ||
page_size_query_param = "page_size" | ||
max_page_size = 3 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,18 @@ | ||
from datetime import datetime | ||
from idlelib.query import Query | ||
|
||
from django.db.models import F, Count | ||
from rest_framework import viewsets | ||
|
||
from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession | ||
from cinema.models import ( | ||
Genre, | ||
Actor, | ||
CinemaHall, | ||
Movie, | ||
MovieSession, | ||
Order | ||
) | ||
from cinema.pagination import OrderPagination | ||
|
||
from cinema.serializers import ( | ||
GenreSerializer, | ||
|
@@ -12,6 +24,8 @@ | |
MovieDetailSerializer, | ||
MovieSessionDetailSerializer, | ||
MovieListSerializer, | ||
OrderSerializer, | ||
OrderListSerializer, | ||
) | ||
|
||
|
||
|
@@ -31,9 +45,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 | ||
|
@@ -48,6 +88,34 @@ class MovieSessionViewSet(viewsets.ModelViewSet): | |
queryset = MovieSession.objects.all() | ||
serializer_class = MovieSessionSerializer | ||
|
||
def get_queryset(self): | ||
queryset = self.queryset.select_related("movie", "cinema_hall") | ||
|
||
if self.action == "list": | ||
queryset = ( | ||
queryset | ||
.prefetch_related("tickets") | ||
.annotate( | ||
tickets_available=( | ||
F("cinema_hall__rows") | ||
* F("cinema_hall__seats_in_row") | ||
- Count("tickets") | ||
) | ||
) | ||
) | ||
|
||
date = self.request.query_params.get("date") | ||
movie_id_str = self.request.query_params.get("movie") | ||
|
||
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 +124,24 @@ def get_serializer_class(self): | |
return MovieSessionDetailSerializer | ||
|
||
return MovieSessionSerializer | ||
|
||
|
||
class OrderViewSet(viewsets.ModelViewSet): | ||
queryset = Order.objects.all() | ||
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. you can remove this since you always override queryset in method below, OR |
||
serializer_class = OrderSerializer | ||
pagination_class = OrderPagination | ||
|
||
def get_queryset(self): | ||
return Order.objects.prefetch_related( | ||
"tickets__movie_session__movie", | ||
"tickets__movie_session__cinema_hall" | ||
).filter(user=self.request.user) | ||
|
||
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.
what is this import for?