diff --git a/db/migrations/0002_cinemahall_movie_moviesession.py b/db/migrations/0002_cinemahall_movie_moviesession.py new file mode 100644 index 000000000..ba912eac4 --- /dev/null +++ b/db/migrations/0002_cinemahall_movie_moviesession.py @@ -0,0 +1,42 @@ +# Generated by Django 4.0.2 on 2025-01-11 15:20 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='CinemaHall', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('rows', models.PositiveIntegerField()), + ('seats_in_row', models.PositiveIntegerField()), + ], + ), + migrations.CreateModel( + name='Movie', + fields=[ + ('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')), + ], + ), + migrations.CreateModel( + name='MovieSession', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('show_time', models.DateTimeField(auto_now_add=True)), + ('cinema_hall', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='db.cinemahall')), + ('movie', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='db.movie')), + ], + ), + ] diff --git a/db/migrations/0003_alter_cinemahall_rows_alter_cinemahall_seats_in_row_and_more.py b/db/migrations/0003_alter_cinemahall_rows_alter_cinemahall_seats_in_row_and_more.py new file mode 100644 index 000000000..7501e839d --- /dev/null +++ b/db/migrations/0003_alter_cinemahall_rows_alter_cinemahall_seats_in_row_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.0.2 on 2025-01-11 15:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0002_cinemahall_movie_moviesession'), + ] + + operations = [ + migrations.AlterField( + model_name='cinemahall', + name='rows', + field=models.IntegerField(), + ), + migrations.AlterField( + model_name='cinemahall', + name='seats_in_row', + field=models.IntegerField(), + ), + migrations.AlterField( + model_name='moviesession', + name='show_time', + field=models.DateTimeField(), + ), + ] diff --git a/db/migrations/0004_alter_moviesession_cinema_hall_and_more.py b/db/migrations/0004_alter_moviesession_cinema_hall_and_more.py new file mode 100644 index 000000000..f2b14d167 --- /dev/null +++ b/db/migrations/0004_alter_moviesession_cinema_hall_and_more.py @@ -0,0 +1,24 @@ +# Generated by Django 4.0.2 on 2025-01-11 15:30 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0003_alter_cinemahall_rows_alter_cinemahall_seats_in_row_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='moviesession', + name='cinema_hall', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cinema_halls', 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'), + ), + ] diff --git a/db/migrations/0005_alter_cinemahall_rows_alter_cinemahall_seats_in_row_and_more.py b/db/migrations/0005_alter_cinemahall_rows_alter_cinemahall_seats_in_row_and_more.py new file mode 100644 index 000000000..180864347 --- /dev/null +++ b/db/migrations/0005_alter_cinemahall_rows_alter_cinemahall_seats_in_row_and_more.py @@ -0,0 +1,34 @@ +# Generated by Django 4.0.2 on 2025-01-11 19:49 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('db', '0004_alter_moviesession_cinema_hall_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='cinemahall', + name='rows', + field=models.PositiveIntegerField(), + ), + migrations.AlterField( + model_name='cinemahall', + name='seats_in_row', + field=models.PositiveIntegerField(), + ), + 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, to='db.movie'), + ), + ] diff --git a/db/models.py b/db/models.py index 238106ac7..333b5e20f 100644 --- a/db/models.py +++ b/db/models.py @@ -14,3 +14,42 @@ class Actor(models.Model): def __str__(self) -> str: return f"{self.first_name} {self.last_name}" + + +class Movie(models.Model): + title = models.CharField(max_length=255) + description = models.TextField() + actors = models.ManyToManyField(Actor) + genres = models.ManyToManyField(Genre) + + def __str__(self) -> str: + return self.title + + +class CinemaHall(models.Model): + name = models.CharField(max_length=255) + rows = models.PositiveIntegerField() + seats_in_row = models.PositiveIntegerField() + + def __str__(self) -> str: + return self.name + + @property + def capacity(self) -> int: + return self.rows * self.seats_in_row + + +class MovieSession(models.Model): + show_time = models.DateTimeField() + cinema_hall = models.ForeignKey( + CinemaHall, + on_delete=models.CASCADE, + related_name="movie_sessions", + ) + movie = models.ForeignKey( + Movie, + on_delete=models.CASCADE, + ) + + def __str__(self) -> str: + return f"{self.movie.title} {self.show_time}" diff --git a/services/__init__.py b/services/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/services/cinema_hall.py b/services/cinema_hall.py new file mode 100644 index 000000000..dec95fab1 --- /dev/null +++ b/services/cinema_hall.py @@ -0,0 +1,20 @@ +from django.db.models import QuerySet + +from db.models import CinemaHall + + +def get_cinema_halls() -> QuerySet: + return CinemaHall.objects.all() + + +def create_cinema_hall( + hall_name: str, + hall_rows: int, + hall_seats_in_row: int +) -> CinemaHall: + + return CinemaHall.objects.create( + name=hall_name, + rows=hall_rows, + seats_in_row=hall_seats_in_row + ) diff --git a/services/movie.py b/services/movie.py new file mode 100644 index 000000000..5f6db4a2a --- /dev/null +++ b/services/movie.py @@ -0,0 +1,39 @@ +from django.db.models import QuerySet + +from db.models import Movie + + +def get_movies( + genres_ids: list[int] = None, + actors_ids: list[int] = None +) -> QuerySet: + + if genres_ids and actors_ids: + return Movie.objects.filter(genres__id__in=genres_ids, + actors__id__in=actors_ids) + if genres_ids: + return Movie.objects.filter(genres__id__in=genres_ids) + if actors_ids: + return Movie.objects.filter(actors__id__in=actors_ids) + return Movie.objects.all() + + +def get_movie_by_id(movie_id: int) -> Movie: + return Movie.objects.get(id=movie_id) + + +def create_movie( + movie_title: str, + movie_description: str, + genres_ids: list[int] = None, + actors_ids: list[int] = None +) -> Movie: + new_movie = Movie.objects.create( + title=movie_title, + description=movie_description + ) + if genres_ids: + new_movie.genres.set(genres_ids) + if actors_ids: + new_movie.actors.set(actors_ids) + return new_movie diff --git a/services/movie_session.py b/services/movie_session.py new file mode 100644 index 000000000..79f9ed4d9 --- /dev/null +++ b/services/movie_session.py @@ -0,0 +1,48 @@ +from django.db.models import QuerySet +from datetime import datetime +from db.models import Movie, CinemaHall, MovieSession + + +def create_movie_session( + movie_show_time: datetime, + movie_id: int, cinema_hall_id: int +) -> MovieSession: + + return MovieSession.objects.create( + show_time=movie_show_time, + cinema_hall_id=cinema_hall_id, + movie_id=movie_id + ) + + +def get_movies_sessions(session_date: str = None) -> QuerySet: + if session_date: + return MovieSession.objects.filter(show_time__date=session_date) + return MovieSession.objects.all() + + +def get_movie_session_by_id(movie_session_id: int) -> MovieSession: + return MovieSession.objects.get(id=movie_session_id) + + +def update_movie_session( + session_id: int, + show_time: datetime = None, + movie_id: int = None, + cinema_hall_id: int = None +) -> MovieSession: + session_to_update = MovieSession.objects.get(id=session_id) + if show_time: + session_to_update.show_time = show_time + if movie_id: + session_to_update.movie = Movie.objects.get(id=movie_id) + if cinema_hall_id: + session_to_update.cinema_hall = CinemaHall.objects.get( + id=cinema_hall_id + ) + session_to_update.save() + return session_to_update + + +def delete_movie_session_by_id(session_id: int) -> None: + MovieSession.objects.filter(id=session_id).delete() diff --git a/settings.py b/settings.py index 1e5382807..3fdfabd28 100644 --- a/settings.py +++ b/settings.py @@ -21,6 +21,6 @@ USE_I18N = True -USE_TZ = False +USE_TZ = True INSTALLED_APPS = ("db",)