Skip to content
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

eeettt5 #530

Open
wants to merge 18 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .run/pytest in test_main.py.run.xml

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this file, and folder

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

???

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="pytest in test_main.py" type="tests" factoryName="py.test" editBeforeRun="true" focusToolWindowBeforeRun="true" singleton="false" nameIsGenerated="true" show_console_on_std_err="true" show_console_on_std_out="true">
<output_file is_save="true" />
<module name="py-tickets-and-orders" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="_new_keywords" value="&quot;&quot;" />
<option name="_new_parameters" value="&quot;&quot;" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;&quot;" />
<option name="_new_targetType" value="&quot;CUSTOM&quot;" />
<method v="2" />
</configuration>
</component>
42 changes: 36 additions & 6 deletions db/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Generated by Django 4.0.2 on 2022-06-15 12:37
# Generated by Django 4.0.2 on 2023-10-28 23:51

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion

Expand All @@ -9,6 +10,7 @@ class Migration(migrations.Migration):
initial = True

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
Expand Down Expand Up @@ -40,19 +42,47 @@ class Migration(migrations.Migration):
name='Movie',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('title', models.CharField(db_index=True, max_length=255)),
('description', models.TextField()),
('actors', models.ManyToManyField(to='db.Actor')),
('genres', models.ManyToManyField(to='db.Genre')),
('actors', models.ManyToManyField(related_name='movies', to='db.Actor')),
('genres', models.ManyToManyField(related_name='movies', to='db.Genre')),
],
),
migrations.CreateModel(
name='MovieSession',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('show_time', models.DateTimeField()),
('cinema_hall', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.cinemahall')),
('movie', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.movie')),
('cinema_hall', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movie_sessions', to='db.cinemahall')),
('movie', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movie_sessions', to='db.movie')),
],
),
migrations.CreateModel(
name='Order',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('row', models.IntegerField()),
('seat', models.IntegerField()),
('movie_session', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.moviesession')),
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_orders', to='db.order')),
],
),
migrations.CreateModel(
name='Ticket',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('row', models.IntegerField()),
('seat', models.IntegerField()),
('movie_session', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.moviesession')),
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.order')),
],
),
]
21 changes: 21 additions & 0 deletions db/migrations/0002_use654567.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.0.2 on 2023-10-29 08:19

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('db', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='Use654567',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('row', models.IntegerField()),
('seat', models.IntegerField()),
],
),
]
16 changes: 16 additions & 0 deletions db/migrations/0003_delete_use654567.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Generated by Django 4.0.2 on 2023-10-29 08:20

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('db', '0002_use654567'),
]

operations = [
migrations.DeleteModel(
name='Use654567',
),
]
18 changes: 18 additions & 0 deletions db/migrations/0004_alter_order_created_at.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.0.2 on 2023-10-29 16:37

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('db', '0003_delete_use654567'),
]

operations = [
migrations.AlterField(
model_name='order',
name='created_at',
field=models.DateTimeField(),
),
]
18 changes: 18 additions & 0 deletions db/migrations/0005_alter_order_created_at.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.0.2 on 2023-10-29 16:38

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('db', '0004_alter_order_created_at'),
]

operations = [
migrations.AlterField(
model_name='order',
name='created_at',
field=models.DateTimeField(auto_now_add=True),
),
]
17 changes: 17 additions & 0 deletions db/migrations/0006_ticket_unique_order_row_seat_order_session.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.0.2 on 2023-10-29 18:35

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('db', '0005_alter_order_created_at'),
]

operations = [
migrations.AddConstraint(
model_name='ticket',
constraint=models.UniqueConstraint(fields=('row', 'seat', 'movie_session'), name='unique_order_row_seat_order_session'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 4.0.2 on 2023-11-07 15:14

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('db', '0006_ticket_unique_order_row_seat_order_session'),
]

operations = [
migrations.AlterModelOptions(
name='order',
options={'ordering': ['-created_at']},
),
migrations.AddField(
model_name='moviesession',
name='row',
field=models.IntegerField(null=True),
),
migrations.AddField(
model_name='moviesession',
name='seat',
field=models.IntegerField(null=True),
),
]
61 changes: 59 additions & 2 deletions db/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError


class Genre(models.Model):
Expand All @@ -17,7 +20,7 @@ def __str__(self) -> str:


class Movie(models.Model):
title = models.CharField(max_length=255)
title = models.CharField(max_length=255, db_index=True)
description = models.TextField()
actors = models.ManyToManyField(to=Actor, related_name="movies")
genres = models.ManyToManyField(to=Genre, related_name="movies")
Expand All @@ -40,6 +43,8 @@ def __str__(self) -> str:


class MovieSession(models.Model):
row = models.IntegerField(null=True)
seat = models.IntegerField(null=True)
show_time = models.DateTimeField()
cinema_hall = models.ForeignKey(
to=CinemaHall, on_delete=models.CASCADE, related_name="movie_sessions"
Expand All @@ -49,4 +54,56 @@ class MovieSession(models.Model):
)

def __str__(self) -> str:
return f"{self.movie.title} {str(self.show_time)}"
return f"{self.movie.title} {str(self.show_time)} {self.cinema_hall.rows} {self.cinema_hall.seats_in_row}"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return f"{self.movie.title} {str(self.show_time)} {self.cinema_hall.rows} {self.cinema_hall.seats_in_row}"
return f"{self.movie.title} {self.show_time} {self.cinema_hall.rows} {self.cinema_hall.seats_in_row}"



class Order(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='orders')

class Meta:
ordering = ["-created_at"]

def __str__(self) -> str:
return str(self.created_at)

class Ticket(models.Model):
movie_session = models.ForeignKey(to=MovieSession, on_delete=models.CASCADE)
order = models.ForeignKey(Order, on_delete=models.CASCADE)
row = models.IntegerField()
seat = models.IntegerField()

def clean(self):
max_row = self.movie_session.cinema_hall.rows # Отримати максимальне значення row
max_seat = self.movie_session.cinema_hall.seats_in_row # Отримати максимальне значення seat

if self.row > max_row:
raise ValidationError({'row': f'row number must be in available range: (1, rows): (1, {max_row})'})

if self.seat > max_seat:
raise ValidationError({'seat': f'seat number must be in available range: (1, seats_in_row): (1, {max_seat})'})

def save(self, *args, **kwargs):
self.full_clean()
super().save(*args, **kwargs)

class Meta:
constraints = [
models.UniqueConstraint(
fields=["row", "seat", "movie_session"],
name="unique_order_row_seat_order_session"
)
]

def __str__(self) -> str:
return f"Matrix 2019-08-19 20:30:00 (row: {self.row}, seat: {self.seat})"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why matrix and date hardcoded?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not fixed



class User(models.Model):
movie_session = models.ForeignKey(to=MovieSession, on_delete=models.CASCADE)
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='user_orders')
row = models.IntegerField()
seat = models.IntegerField()

def __str__(self) -> str:
return f"Ticket: {self.order}, (row: {self.row}, seat: {self.seat})"
8 changes: 7 additions & 1 deletion services/movie.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from django.db.models import QuerySet

from django.db import transaction
from db.models import Movie


def get_movies(
genres_ids: list[int] = None,
actors_ids: list[int] = None,
title=None,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add type annotations

) -> QuerySet:
queryset = Movie.objects.all()

Expand All @@ -15,13 +16,18 @@ def get_movies(
if actors_ids:
queryset = queryset.filter(actors__id__in=actors_ids)

if title:
# фільтрувати фільми за назвою, якщо аргумент `title` переданий
return Movie.objects.filter(title__icontains=title)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why you do return this? And do not use already filtered queryset


return queryset


def get_movie_by_id(movie_id: int) -> Movie:
return Movie.objects.get(id=movie_id)


@transaction.atomic
def create_movie(
movie_title: str,
movie_description: str,
Expand Down
10 changes: 9 additions & 1 deletion services/movie_session.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.db.models import QuerySet

from db.models import MovieSession
from db.models import MovieSession, Ticket


def create_movie_session(
Expand Down Expand Up @@ -42,3 +42,11 @@ def update_movie_session(

def delete_movie_session_by_id(session_id: int) -> None:
MovieSession.objects.get(id=session_id).delete()


def get_taken_seats(movie_session_id):
taken_seats = []
tickets = Ticket.objects.filter(movie_session_id=movie_session_id)
for ticket in tickets:
taken_seats.append({"row": ticket.row, "seat": ticket.seat})
return taken_seats

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add empty line

37 changes: 37 additions & 0 deletions services/order.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import distutils
from datetime import date
from db.models import Order
from django.db import transaction
from typing import List
from db.models import MovieSession, User, Ticket
from django.contrib.auth.models import User


@transaction.atomic
def create_order(tickets: List[dict], username, date=None):
user, created = User.objects.get_or_create(username=username)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you create user? Use just get

order, created = Order.objects.get_or_create(user=user)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
order, created = Order.objects.get_or_create(user=user)
order = Order.objects.create(user)

One use can have many orders

if date is not None:
order.created_at = date
order.save()
for ticket_data in tickets:
row = ticket_data.get("row")
seat = ticket_data.get("seat")
movie_session = MovieSession.objects.get(pk=1)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you use pk=1? Also .get redundant here

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not fixed why pk=1???

ticket, created = Ticket.objects.get_or_create(row=row, seat=seat, movie_session=movie_session, order=order)
ticket.order = order
ticket.save()
# if date is not None:
# Order.objects.update_or_create(user=username, created_at=date)
# Ticket.objects.update_or_create(row=row, seat=seat, movie_session=movie_session)
# else:
# Order.objects.update_or_create(user=username)
# Ticket.objects.update_or_create(row=row, seat=seat, movie_session=movie_session)
#return


def get_orders(username=None):
if username is not None:
return Order.objects.filter(user__username=username).order_by("created_at")
elif username is None:
return Order.objects.all().order_by("-created_at")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use just one if here

Loading
Loading