From 0c7343b5a386adf34bcf9fe15ac54fe9e3b6fdf4 Mon Sep 17 00:00:00 2001 From: andrei Date: Sat, 20 Apr 2024 17:46:00 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D1=82=D1=8C=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=B8=D1=85=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../films/migrations/0005_film_age_limit.py | 30 ++++++++ CineSync/films/models.py | 13 ++++ CineSync/static/css/base.css | 8 ++ CineSync/static/css/home/homepage.css | 8 ++ CineSync/static/css/timetable/session.css | 73 ++++++++++++------- CineSync/static/js/timetable/session.js | 10 +++ .../templates/tickets/ticket_details.html | 0 CineSync/templates/timetable/session.html | 49 +++++++------ ...alter_ticket_options_alter_ticket_table.py | 21 ++++++ CineSync/timetable/forms.py | 12 +++ CineSync/timetable/views.py | 10 ++- 11 files changed, 181 insertions(+), 53 deletions(-) create mode 100644 CineSync/films/migrations/0005_film_age_limit.py create mode 100644 CineSync/static/js/timetable/session.js create mode 100644 CineSync/templates/tickets/ticket_details.html create mode 100644 CineSync/tickets/migrations/0005_alter_ticket_options_alter_ticket_table.py create mode 100644 CineSync/timetable/forms.py diff --git a/CineSync/films/migrations/0005_film_age_limit.py b/CineSync/films/migrations/0005_film_age_limit.py new file mode 100644 index 0000000..ca3ee0b --- /dev/null +++ b/CineSync/films/migrations/0005_film_age_limit.py @@ -0,0 +1,30 @@ +# Generated by Django 4.2 on 2024-04-20 12:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("films", "0004_film_image"), + ] + + operations = [ + migrations.AddField( + model_name="film", + name="age_limit", + field=models.CharField( + choices=[ + ["0+", "0+"], + ["6+", "0+"], + ["12+", "12+"], + ["16+", "16+"], + ["18+", "18+"], + ], + default="12+", + help_text="Возрастное ограничение", + max_length=3, + ), + preserve_default=False, + ), + ] diff --git a/CineSync/films/models.py b/CineSync/films/models.py index bbfc5d5..437beba 100644 --- a/CineSync/films/models.py +++ b/CineSync/films/models.py @@ -117,6 +117,19 @@ class Film(Model): help_text='Жанры фильма', ) + age_limit = CharField( + help_text='Возрастное ограничение', + max_length=3, + null=False, + choices=( + ['0+', '0+'], + ['6+', '0+'], + ['12+', '12+'], + ['16+', '16+'], + ['18+', '18+'], + ), + ) + def get_image_300x300(self): return sorl.thumbnail.get_thumbnail( self.image, diff --git a/CineSync/static/css/base.css b/CineSync/static/css/base.css index 450190c..f93fb7e 100644 --- a/CineSync/static/css/base.css +++ b/CineSync/static/css/base.css @@ -3,4 +3,12 @@ } body { background-color: #0d1d3a; +} +html::-webkit-scrollbar { + width: 0.8vw; +} +html::-webkit-scrollbar-thumb { + background-color: #eaeaea; + border-radius: 5vw; + border: 4px solid #0d1d3a; } \ No newline at end of file diff --git a/CineSync/static/css/home/homepage.css b/CineSync/static/css/home/homepage.css index 38e3870..216fc4d 100644 --- a/CineSync/static/css/home/homepage.css +++ b/CineSync/static/css/home/homepage.css @@ -17,4 +17,12 @@ height: 35vw !important; width: 25vw !important; border-radius: 3vw; +} +.film_card_column::-webkit-scrollbar { + height: 7px; +} +.film_card_column::-webkit-scrollbar-thumb { + background-color: #0d1d3a; + border-radius: 5vw; + border: 1px solid #ffffff; } \ No newline at end of file diff --git a/CineSync/static/css/timetable/session.css b/CineSync/static/css/timetable/session.css index 61c107c..8fa4d9b 100644 --- a/CineSync/static/css/timetable/session.css +++ b/CineSync/static/css/timetable/session.css @@ -1,35 +1,30 @@ .seats_card { + margin-left: 27%; + margin-right: 27%; + margin-top: 2vw; + margin-bottom: 5vw; background-color: #eaeaea; border-radius: 3vw; display: flex; - flex-direction: row; + flex-direction: column; flex-wrap: nowrap; align-items: center; justify-content: center; - - width: 50%; - margin: 0 auto; - margin-top: 2vw; - + width: 46%; overflow-x: auto; overflow-y: auto; } -.card_body { - width: 80%; +.seat_checkbox { + display: none; } -.line { - width: 30%; - height: 0.5vw; - background-color: black; - position: absolute; - top: 70%; - border-radius: 3vw; - margin-left: 5%; - margin-top: 8vw; +.seat_checkbox:checked + .seat_number { + color: #ffffff; } -h6 { - text-align: center; - margin-top: 0.4vw; +.selected { + background-color: #0d1d3a; +} +.selected:hover { + background-color: #0d1d3a; } .seat_number { width: 1vw; @@ -54,29 +49,35 @@ h6 { border-radius: 3vw; } .film_info_block { - margin-right: 25%; - margin-left: 25%; - width: 50%; + margin-top: 5vw; + margin-right: 27%; + margin-left: 27%; + width: 46%; display: flex; flex-direction: row; flex-wrap: nowrap; align-items: flex-end; + height: 20vw; + overflow-y: auto; } .film_info_text_block { height: 20vw; display: flex; flex-direction: column; flex-wrap: nowrap; - justify-content: space-evenly; - margin: 2vw; + justify-content: flex-start; + align-items: flex-start; + margin-left: 1vw; } -.film_info_text { +.film_info_text, .film_info_description { color: #eaeaea; } +.film_info_description { + max-height: 9.9vw; + overflow-y: auto; +} .cell { background-color: transparent !important; -} -.cell { height: 4vw; width: 3.5vw; } @@ -84,4 +85,20 @@ h6 { display: flex; align-items: center; justify-content: center; + width: 3vw; +} +.seats_card::-webkit-scrollbar { + height: 7px; +} +.seats_card::-webkit-scrollbar-thumb { + background-color: #0d1d3a; + border-radius: 5vw; + border: 1px solid #eaeaea; +} +.film_info_description::-webkit-scrollbar { + width: 5px; +} +.film_info_description::-webkit-scrollbar-thumb { + background-color: #eaeaea; + border-radius: 5vw; } \ No newline at end of file diff --git a/CineSync/static/js/timetable/session.js b/CineSync/static/js/timetable/session.js new file mode 100644 index 0000000..fa52d9d --- /dev/null +++ b/CineSync/static/js/timetable/session.js @@ -0,0 +1,10 @@ + document.querySelectorAll('.seat_checkbox').forEach(function(checkbox) { + checkbox.addEventListener('change', function() { + var filmSession = checkbox.closest('.film_session'); + if (checkbox.checked) { + filmSession.classList.add('selected'); // Добавляем класс, если чекбокс выбран + } else { + filmSession.classList.remove('selected'); // Удаляем класс, если чекбокс не выбран + } + }); +}); \ No newline at end of file diff --git a/CineSync/templates/tickets/ticket_details.html b/CineSync/templates/tickets/ticket_details.html new file mode 100644 index 0000000..e69de29 diff --git a/CineSync/templates/timetable/session.html b/CineSync/templates/timetable/session.html index f2b996c..effbd9f 100644 --- a/CineSync/templates/timetable/session.html +++ b/CineSync/templates/timetable/session.html @@ -14,30 +14,35 @@

{{ session.film.name }}

{{ session.auditorium.number }}

{{ session.start_datetime }}

- - -
-
- - - {% for row in session.auditorium.row_count|get_range %} - - - {% for seat in seats %} - - {% endfor %} - +

{{ session.film.description }}

+
+ {% for genre in session.film.genres.all %} +
{{genre.name}}
{% endfor %} -
-
{{ row }} - - {{ seat.row_number }} - -
-
-
- +
+ + + {% for row in session.auditorium.row_count|get_range %} + + + {% for seat in seats %} + + {% endfor %} + + {% endfor %} + +
Ряд {{ row }} + +
+
+ +
+
+ {% endblock %} \ No newline at end of file diff --git a/CineSync/tickets/migrations/0005_alter_ticket_options_alter_ticket_table.py b/CineSync/tickets/migrations/0005_alter_ticket_options_alter_ticket_table.py new file mode 100644 index 0000000..cd2675b --- /dev/null +++ b/CineSync/tickets/migrations/0005_alter_ticket_options_alter_ticket_table.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2 on 2024-04-20 12:53 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("tickets", "0004_rename_user_ticket_profile"), + ] + + operations = [ + migrations.AlterModelOptions( + name="ticket", + options={"verbose_name": "Билет", "verbose_name_plural": "Билеты"}, + ), + migrations.AlterModelTable( + name="ticket", + table="tickets_ticket", + ), + ] diff --git a/CineSync/timetable/forms.py b/CineSync/timetable/forms.py new file mode 100644 index 0000000..2e49454 --- /dev/null +++ b/CineSync/timetable/forms.py @@ -0,0 +1,12 @@ +from django import forms + +from timetable.models import Auditorium, Row + + +class SeatSelectionForm(forms.Form): + def __init__(self, auditorium: Auditorium): + super().__init__() + self.selected_seats = forms.MultipleChoiceField( + widget=forms.CheckboxSelectMultiple, + choices=[(str(seat.id), seat.row_number) for seat in auditorium.rows.all()], + ) diff --git a/CineSync/timetable/views.py b/CineSync/timetable/views.py index 9d4b80c..4de3d5c 100644 --- a/CineSync/timetable/views.py +++ b/CineSync/timetable/views.py @@ -3,9 +3,9 @@ from datetime import date from django.http import HttpResponse from django.shortcuts import render, get_object_or_404 -from timetable.models import FilmSession, Row -from timetable.models import FilmSession +from timetable.models import FilmSession, Row +from timetable.forms import SeatSelectionForm def timetable_view(request): @@ -45,7 +45,11 @@ def session_view(request, sess_id): FilmSession.objects.all(), id=sess_id, ) - height = session.auditorium.row_count * 6 + height = round(session.auditorium.row_count * 4 + 7) + + if request.method == 'POST': + print(request.data) + context = { 'session': session, 'seats': Row.objects.filter(auditorium_id=session.auditorium.id),