From a63cc3073028122752c0316a8b6c97893d2c44ca Mon Sep 17 00:00:00 2001 From: Denis Dymerlii Date: Mon, 11 Dec 2023 19:15:14 +0200 Subject: [PATCH 1/6] Solution --- ...ovie_actors_alter_movie_genres_and_more.py | 76 +++++++++++++++++++ db/migrations/0003_order.py | 26 +++++++ ...et_ticket_unique_movie_session_row_seat.py | 28 +++++++ db/models.py | 69 +++++++++++++++++ services/movie.py | 6 ++ services/movie_session.py | 9 ++- services/order.py | 44 +++++++++++ services/user.py | 54 +++++++++++++ settings.py | 5 ++ 9 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 db/migrations/0002_user_alter_movie_actors_alter_movie_genres_and_more.py create mode 100644 db/migrations/0003_order.py create mode 100644 db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py create mode 100644 services/order.py create mode 100644 services/user.py diff --git a/db/migrations/0002_user_alter_movie_actors_alter_movie_genres_and_more.py b/db/migrations/0002_user_alter_movie_actors_alter_movie_genres_and_more.py new file mode 100644 index 000000000..99ab9d116 --- /dev/null +++ b/db/migrations/0002_user_alter_movie_actors_alter_movie_genres_and_more.py @@ -0,0 +1,76 @@ +# Generated by Django 4.0.2 on 2023-12-11 01:10 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ('db', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.AlterField( + model_name='movie', + name='actors', + field=models.ManyToManyField(related_name='movies', to='db.Actor'), + ), + migrations.AlterField( + model_name='movie', + name='genres', + field=models.ManyToManyField(related_name='movies', to='db.Genre'), + ), + migrations.AlterField( + model_name='moviesession', + name='cinema_hall', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movie_sessions', to='db.cinemahall'), + ), + migrations.AlterField( + model_name='moviesession', + name='movie', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movie_sessions', to='db.movie'), + ), + migrations.AddIndex( + model_name='movie', + index=models.Index(fields=['title'], name='db_movie_title_5d0841_idx'), + ), + migrations.AddField( + model_name='user', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), + ), + migrations.AddField( + model_name='user', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), + ] diff --git a/db/migrations/0003_order.py b/db/migrations/0003_order.py new file mode 100644 index 000000000..33c8cb7e2 --- /dev/null +++ b/db/migrations/0003_order.py @@ -0,0 +1,26 @@ +# Generated by Django 4.0.2 on 2023-12-11 01:15 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0002_user_alter_movie_actors_alter_movie_genres_and_more'), + ] + + operations = [ + 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, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['-created_at'], + }, + ), + ] diff --git a/db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py b/db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py new file mode 100644 index 000000000..3a3192af1 --- /dev/null +++ b/db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py @@ -0,0 +1,28 @@ +# Generated by Django 4.0.2 on 2023-12-11 01:17 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0003_order'), + ] + + operations = [ + 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')), + ], + ), + migrations.AddConstraint( + model_name='ticket', + constraint=models.UniqueConstraint(fields=('movie_session', 'row', 'seat'), name='unique_movie_session_row_seat'), + ), + ] diff --git a/db/models.py b/db/models.py index 2a3359a63..7fdeab532 100644 --- a/db/models.py +++ b/db/models.py @@ -1,5 +1,14 @@ +from django.contrib.auth.models import AbstractUser +from django.core.exceptions import ValidationError from django.db import models +from typing import Any +import settings + + +class User(AbstractUser): + pass + class Genre(models.Model): name = models.CharField(max_length=255, unique=True) @@ -22,6 +31,11 @@ class Movie(models.Model): actors = models.ManyToManyField(to=Actor, related_name="movies") genres = models.ManyToManyField(to=Genre, related_name="movies") + class Meta: + indexes = [ + models.Index(fields=["title"]) + ] + def __str__(self) -> str: return self.title @@ -50,3 +64,58 @@ class MovieSession(models.Model): def __str__(self) -> str: return f"{self.movie.title} {str(self.show_time)}" + + +class Order(models.Model): + created_at = models.DateTimeField(auto_now_add=True) + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE + ) + + class Meta: + ordering = ["-created_at"] + + def __str__(self) -> str: + return str(self.created_at) + + +class Ticket(models.Model): + movie_session = models.ForeignKey("MovieSession", on_delete=models.CASCADE) + order = models.ForeignKey("Order", on_delete=models.CASCADE) + row = models.IntegerField() + seat = models.IntegerField() + + class Meta: + constraints = [ + models.UniqueConstraint( + fields=["movie_session", "row", "seat"], + name="unique_movie_session_row_seat" + ) + ] + + def __str__(self) -> str: + return (f"{self.movie_session.movie.title} " + f"{self.movie_session.show_time} " + f"(row: {self.row}, seat: {self.seat})") + + def clean(self) -> None: + errors = {} + + if not (1 <= self.row <= self.movie_session.cinema_hall.rows): + errors["row"] = (f"row number must be " + f"in available range: (1, rows): " + f"(1, {self.movie_session.cinema_hall.rows})") + + if not (1 <= self.seat <= self.movie_session.cinema_hall.seats_in_row): + errors["seat"] = (f"seat number must be " + f"in available range: (1, seats_in_row): (1, " + f"{self.movie_session.cinema_hall.seats_in_row})" + ) + + if errors: + raise ValidationError(errors) + + def save(self, *args, **kwargs) -> Any: + self.full_clean() + return super(Ticket, self).save(*args, **kwargs) diff --git a/services/movie.py b/services/movie.py index 4d0f63237..f80a5b93f 100644 --- a/services/movie.py +++ b/services/movie.py @@ -1,3 +1,4 @@ +from django.db import transaction from django.db.models import QuerySet from db.models import Movie @@ -6,9 +7,13 @@ def get_movies( genres_ids: list[int] = None, actors_ids: list[int] = None, + title: str = None ) -> QuerySet: queryset = Movie.objects.all() + if title: + queryset = queryset.filter(title__icontains=title) + if genres_ids: queryset = queryset.filter(genres__id__in=genres_ids) @@ -22,6 +27,7 @@ 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, diff --git a/services/movie_session.py b/services/movie_session.py index f326a082e..dad42d119 100644 --- a/services/movie_session.py +++ b/services/movie_session.py @@ -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( @@ -42,3 +42,10 @@ 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: int +) -> list[dict]: + return list(Ticket.objects.filter( + movie_session_id=movie_session_id).values("row", "seat")) diff --git a/services/order.py b/services/order.py new file mode 100644 index 000000000..9f9cd3cfd --- /dev/null +++ b/services/order.py @@ -0,0 +1,44 @@ +from datetime import datetime + +from django.contrib.auth import get_user_model +from django.db import transaction +from django.db.models import QuerySet + +from db.models import Ticket, Order +from services.movie_session import get_movie_session_by_id, get_taken_seats + + +@transaction.atomic +def create_order( + tickets: list[dict], + username: str, + date: datetime = None +) -> None: + order = Order.objects.create( + user=get_user_model().objects.get(username=username) + ) + if date: + order.created_at = date + order.save() + + for ticket in tickets: + movie_session = ticket["movie_session"] + row_seat_data = dict(list(ticket.items())[:2]) + + if row_seat_data not in get_taken_seats(movie_session): + Ticket.objects.create( + movie_session=get_movie_session_by_id(movie_session), + order=order, + **row_seat_data + ) + + +def get_orders( + username: str = None +) -> QuerySet: + queryset = Order.objects.all() + + if username: + queryset = Order.objects.filter(user__username=username) + + return queryset diff --git a/services/user.py b/services/user.py new file mode 100644 index 000000000..c699d6429 --- /dev/null +++ b/services/user.py @@ -0,0 +1,54 @@ +from django.contrib.auth import get_user_model + + +def create_user( + username: str, + password: str, + email: str = None, + first_name: str = None, + last_name: str = None +) -> None: + user_data = { + "username": username, + "password": password, + "email": email, + "first_name": first_name, + "last_name": last_name, + } + + user_data = {key: value for key, value in user_data.items() + if value is not None} + + get_user_model().objects.create_user(**user_data) + + +def get_user(user_id: int) -> get_user_model(): + return get_user_model().objects.get(id=user_id) + + +def update_user( + user_id: int, + username: str = None, + password: str = None, + email: str = None, + first_name: str = None, + last_name: str = None +) -> None: + user = get_user(user_id) + + if username is not None: + user.username = username + + if password is not None: + user.set_password(password) + + if email is not None: + user.email = email + + if first_name is not None: + user.first_name = first_name + + if last_name is not None: + user.last_name = last_name + + user.save() diff --git a/settings.py b/settings.py index f25910b30..0f08f3f06 100644 --- a/settings.py +++ b/settings.py @@ -8,6 +8,7 @@ DEFAULT_AUTO_FIELD = "django.db.models.AutoField" + DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3", @@ -24,5 +25,9 @@ USE_TZ = False INSTALLED_APPS = [ + "django.contrib.auth", + "django.contrib.contenttypes", "db", ] + +AUTH_USER_MODEL = "db.User" From 79fdc825f2e37732359b3766bde7f01974e30b3c Mon Sep 17 00:00:00 2001 From: Denis Dymerlii Date: Mon, 11 Dec 2023 21:40:04 +0200 Subject: [PATCH 2/6] Made some edits to work --- db/models.py | 8 ++++++-- services/order.py | 23 ++++++++++++++--------- services/user.py | 10 +++++----- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/db/models.py b/db/models.py index 7fdeab532..959bb6820 100644 --- a/db/models.py +++ b/db/models.py @@ -70,7 +70,8 @@ class Order(models.Model): created_at = models.DateTimeField(auto_now_add=True) user = models.ForeignKey( settings.AUTH_USER_MODEL, - on_delete=models.CASCADE + on_delete=models.CASCADE, + related_name="orders" ) class Meta: @@ -82,7 +83,10 @@ def __str__(self) -> str: class Ticket(models.Model): movie_session = models.ForeignKey("MovieSession", on_delete=models.CASCADE) - order = models.ForeignKey("Order", on_delete=models.CASCADE) + order = models.ForeignKey( + "Order", + on_delete=models.CASCADE, + related_name="tickets") row = models.IntegerField() seat = models.IntegerField() diff --git a/services/order.py b/services/order.py index 9f9cd3cfd..1e56768b3 100644 --- a/services/order.py +++ b/services/order.py @@ -17,20 +17,25 @@ def create_order( order = Order.objects.create( user=get_user_model().objects.get(username=username) ) + if date: order.created_at = date order.save() for ticket in tickets: - movie_session = ticket["movie_session"] - row_seat_data = dict(list(ticket.items())[:2]) - - if row_seat_data not in get_taken_seats(movie_session): - Ticket.objects.create( - movie_session=get_movie_session_by_id(movie_session), - order=order, - **row_seat_data - ) + movie_session = ticket.get("movie_session") + row = ticket.get("row") + seat = ticket.get("seat") + + row_seat_data = { + "movie_session": get_movie_session_by_id(movie_session), + "order": order, + "row": row, + "seat": seat, + } + + if (row, seat) not in get_taken_seats(movie_session): + Ticket.objects.create(**row_seat_data) def get_orders( diff --git a/services/user.py b/services/user.py index c699d6429..c8c9c3ba0 100644 --- a/services/user.py +++ b/services/user.py @@ -36,19 +36,19 @@ def update_user( ) -> None: user = get_user(user_id) - if username is not None: + if username: user.username = username - if password is not None: + if password: user.set_password(password) - if email is not None: + if email: user.email = email - if first_name is not None: + if first_name: user.first_name = first_name - if last_name is not None: + if last_name: user.last_name = last_name user.save() From 54433cd0a978fcafef11d90373658105a1c69d57 Mon Sep 17 00:00:00 2001 From: Denis Dymerlii Date: Tue, 12 Dec 2023 12:46:22 +0200 Subject: [PATCH 3/6] Added migration and added changes --- ...005_alter_order_user_alter_ticket_order.py | 25 +++++++++++++++++++ db/models.py | 12 +++++---- services/movie_session.py | 3 ++- services/order.py | 2 +- 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 db/migrations/0005_alter_order_user_alter_ticket_order.py diff --git a/db/migrations/0005_alter_order_user_alter_ticket_order.py b/db/migrations/0005_alter_order_user_alter_ticket_order.py new file mode 100644 index 000000000..c1061c26f --- /dev/null +++ b/db/migrations/0005_alter_order_user_alter_ticket_order.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0.2 on 2023-12-12 12:44 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0004_ticket_ticket_unique_movie_session_row_seat'), + ] + + operations = [ + migrations.AlterField( + model_name='order', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='ticket', + name='order', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to='db.order'), + ), + ] diff --git a/db/models.py b/db/models.py index 959bb6820..2f15d4a30 100644 --- a/db/models.py +++ b/db/models.py @@ -86,7 +86,8 @@ class Ticket(models.Model): order = models.ForeignKey( "Order", on_delete=models.CASCADE, - related_name="tickets") + related_name="tickets" + ) row = models.IntegerField() seat = models.IntegerField() @@ -112,10 +113,11 @@ def clean(self) -> None: f"(1, {self.movie_session.cinema_hall.rows})") if not (1 <= self.seat <= self.movie_session.cinema_hall.seats_in_row): - errors["seat"] = (f"seat number must be " - f"in available range: (1, seats_in_row): (1, " - f"{self.movie_session.cinema_hall.seats_in_row})" - ) + errors["seat"] = ( + f"seat number must be " + f"in available range: (1, seats_in_row): (1, " + f"{self.movie_session.cinema_hall.seats_in_row})" + ) if errors: raise ValidationError(errors) diff --git a/services/movie_session.py b/services/movie_session.py index dad42d119..f94bf4d69 100644 --- a/services/movie_session.py +++ b/services/movie_session.py @@ -48,4 +48,5 @@ def get_taken_seats( movie_session_id: int ) -> list[dict]: return list(Ticket.objects.filter( - movie_session_id=movie_session_id).values("row", "seat")) + movie_session_id=movie_session_id + ).values("row", "seat")) diff --git a/services/order.py b/services/order.py index 1e56768b3..8b6d8f920 100644 --- a/services/order.py +++ b/services/order.py @@ -40,7 +40,7 @@ def create_order( def get_orders( username: str = None -) -> QuerySet: +) -> QuerySet[Order]: queryset = Order.objects.all() if username: From e1773813bd7338ea822233cb88d7ea01511a1fa6 Mon Sep 17 00:00:00 2001 From: Denis Dymerlii Date: Tue, 12 Dec 2023 12:47:02 +0200 Subject: [PATCH 4/6] Fixed flake8 --- db/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/models.py b/db/models.py index 2f15d4a30..a53cf1f8e 100644 --- a/db/models.py +++ b/db/models.py @@ -117,7 +117,7 @@ def clean(self) -> None: f"seat number must be " f"in available range: (1, seats_in_row): (1, " f"{self.movie_session.cinema_hall.seats_in_row})" - ) + ) if errors: raise ValidationError(errors) From 53c2d108c8fc5e456946164733ae93e54d7c22e0 Mon Sep 17 00:00:00 2001 From: Denis Dymerlii Date: Tue, 12 Dec 2023 14:27:40 +0200 Subject: [PATCH 5/6] Fixed imports, added 1 full migration --- ...der_ticket_alter_movie_actors_and_more.py} | 40 ++++++++++++++++++- db/migrations/0003_order.py | 26 ------------ ...et_ticket_unique_movie_session_row_seat.py | 28 ------------- ...005_alter_order_user_alter_ticket_order.py | 25 ------------ db/models.py | 3 +- 5 files changed, 41 insertions(+), 81 deletions(-) rename db/migrations/{0002_user_alter_movie_actors_alter_movie_genres_and_more.py => 0002_user_order_ticket_alter_movie_actors_and_more.py} (71%) delete mode 100644 db/migrations/0003_order.py delete mode 100644 db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py delete mode 100644 db/migrations/0005_alter_order_user_alter_ticket_order.py diff --git a/db/migrations/0002_user_alter_movie_actors_alter_movie_genres_and_more.py b/db/migrations/0002_user_order_ticket_alter_movie_actors_and_more.py similarity index 71% rename from db/migrations/0002_user_alter_movie_actors_alter_movie_genres_and_more.py rename to db/migrations/0002_user_order_ticket_alter_movie_actors_and_more.py index 99ab9d116..758b0a2ca 100644 --- a/db/migrations/0002_user_alter_movie_actors_alter_movie_genres_and_more.py +++ b/db/migrations/0002_user_order_ticket_alter_movie_actors_and_more.py @@ -1,5 +1,6 @@ -# Generated by Django 4.0.2 on 2023-12-11 01:10 +# Generated by Django 4.0.2 on 2023-12-12 14:25 +from django.conf import settings import django.contrib.auth.models import django.contrib.auth.validators from django.db import migrations, models @@ -39,6 +40,24 @@ class Migration(migrations.Migration): ('objects', django.contrib.auth.models.UserManager()), ], ), + 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)), + ], + options={ + 'ordering': ['-created_at'], + }, + ), + 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()), + ], + ), migrations.AlterField( model_name='movie', name='actors', @@ -63,6 +82,21 @@ class Migration(migrations.Migration): model_name='movie', index=models.Index(fields=['title'], name='db_movie_title_5d0841_idx'), ), + migrations.AddField( + model_name='ticket', + name='movie_session', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.moviesession'), + ), + migrations.AddField( + model_name='ticket', + name='order', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to='db.order'), + ), + migrations.AddField( + model_name='order', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL), + ), migrations.AddField( model_name='user', name='groups', @@ -73,4 +107,8 @@ class Migration(migrations.Migration): name='user_permissions', field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), ), + migrations.AddConstraint( + model_name='ticket', + constraint=models.UniqueConstraint(fields=('movie_session', 'row', 'seat'), name='unique_movie_session_row_seat'), + ), ] diff --git a/db/migrations/0003_order.py b/db/migrations/0003_order.py deleted file mode 100644 index 33c8cb7e2..000000000 --- a/db/migrations/0003_order.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.0.2 on 2023-12-11 01:15 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0002_user_alter_movie_actors_alter_movie_genres_and_more'), - ] - - operations = [ - 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, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'ordering': ['-created_at'], - }, - ), - ] diff --git a/db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py b/db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py deleted file mode 100644 index 3a3192af1..000000000 --- a/db/migrations/0004_ticket_ticket_unique_movie_session_row_seat.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 4.0.2 on 2023-12-11 01:17 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0003_order'), - ] - - operations = [ - 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')), - ], - ), - migrations.AddConstraint( - model_name='ticket', - constraint=models.UniqueConstraint(fields=('movie_session', 'row', 'seat'), name='unique_movie_session_row_seat'), - ), - ] diff --git a/db/migrations/0005_alter_order_user_alter_ticket_order.py b/db/migrations/0005_alter_order_user_alter_ticket_order.py deleted file mode 100644 index c1061c26f..000000000 --- a/db/migrations/0005_alter_order_user_alter_ticket_order.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.0.2 on 2023-12-12 12:44 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('db', '0004_ticket_ticket_unique_movie_session_row_seat'), - ] - - operations = [ - migrations.AlterField( - model_name='order', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='ticket', - name='order', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to='db.order'), - ), - ] diff --git a/db/models.py b/db/models.py index a53cf1f8e..424486e3f 100644 --- a/db/models.py +++ b/db/models.py @@ -1,8 +1,9 @@ +from typing import Any + from django.contrib.auth.models import AbstractUser from django.core.exceptions import ValidationError from django.db import models -from typing import Any import settings From 1783d445c6042bd931280828c9d1771d060c4c8c Mon Sep 17 00:00:00 2001 From: Denis Dymerlii Date: Tue, 12 Dec 2023 14:35:58 +0200 Subject: [PATCH 6/6] Fixed privious commit by adding ONLY one migration --- db/migrations/0001_initial.py | 70 ++++++++++- ...rder_ticket_alter_movie_actors_and_more.py | 114 ------------------ 2 files changed, 65 insertions(+), 119 deletions(-) delete mode 100644 db/migrations/0002_user_order_ticket_alter_movie_actors_and_more.py diff --git a/db/migrations/0001_initial.py b/db/migrations/0001_initial.py index 8578293c0..177f88615 100644 --- a/db/migrations/0001_initial.py +++ b/db/migrations/0001_initial.py @@ -1,7 +1,11 @@ -# Generated by Django 4.0.2 on 2022-06-15 12:37 +# Generated by Django 4.0.2 on 2023-12-12 14:34 +from django.conf import settings +import django.contrib.auth.models +import django.contrib.auth.validators from django.db import migrations, models import django.db.models.deletion +import django.utils.timezone class Migration(migrations.Migration): @@ -9,9 +13,36 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), ] operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), migrations.CreateModel( name='Actor', fields=[ @@ -42,8 +73,8 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(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( @@ -51,8 +82,37 @@ class Migration(migrations.Migration): 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)), ], + options={ + 'ordering': ['-created_at'], + }, + ), + 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, related_name='tickets', to='db.order')), + ], + ), + migrations.AddConstraint( + model_name='ticket', + constraint=models.UniqueConstraint(fields=('movie_session', 'row', 'seat'), name='unique_movie_session_row_seat'), + ), + migrations.AddIndex( + model_name='movie', + index=models.Index(fields=['title'], name='db_movie_title_5d0841_idx'), ), ] diff --git a/db/migrations/0002_user_order_ticket_alter_movie_actors_and_more.py b/db/migrations/0002_user_order_ticket_alter_movie_actors_and_more.py deleted file mode 100644 index 758b0a2ca..000000000 --- a/db/migrations/0002_user_order_ticket_alter_movie_actors_and_more.py +++ /dev/null @@ -1,114 +0,0 @@ -# Generated by Django 4.0.2 on 2023-12-12 14:25 - -from django.conf import settings -import django.contrib.auth.models -import django.contrib.auth.validators -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ('db', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='User', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), - ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), - ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), - ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), - ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), - ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), - ], - options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'abstract': False, - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - 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)), - ], - options={ - 'ordering': ['-created_at'], - }, - ), - 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()), - ], - ), - migrations.AlterField( - model_name='movie', - name='actors', - field=models.ManyToManyField(related_name='movies', to='db.Actor'), - ), - migrations.AlterField( - model_name='movie', - name='genres', - field=models.ManyToManyField(related_name='movies', to='db.Genre'), - ), - migrations.AlterField( - model_name='moviesession', - name='cinema_hall', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movie_sessions', to='db.cinemahall'), - ), - migrations.AlterField( - model_name='moviesession', - name='movie', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='movie_sessions', to='db.movie'), - ), - migrations.AddIndex( - model_name='movie', - index=models.Index(fields=['title'], name='db_movie_title_5d0841_idx'), - ), - migrations.AddField( - model_name='ticket', - name='movie_session', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='db.moviesession'), - ), - migrations.AddField( - model_name='ticket', - name='order', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to='db.order'), - ), - migrations.AddField( - model_name='order', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='user', - name='groups', - field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), - ), - migrations.AddField( - model_name='user', - name='user_permissions', - field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), - ), - migrations.AddConstraint( - model_name='ticket', - constraint=models.UniqueConstraint(fields=('movie_session', 'row', 'seat'), name='unique_movie_session_row_seat'), - ), - ]