поправил админку для кинозалов и переделал страницу выбора места

This commit is contained in:
Андрей Дувакин 2024-04-20 21:49:15 +05:00
parent afbc89709a
commit 61263e05b1
6 changed files with 55 additions and 50 deletions

View File

@ -6,19 +6,21 @@
background-color: #eaeaea;
border-radius: 3vw;
display: flex;
width: 46%;
max-height: 50vw;
overflow-x: scroll;
overflow-y: scroll;
flex-direction: column;
flex-wrap: nowrap;
align-items: center;
justify-content: center;
width: 46%;
overflow-x: auto;
overflow-y: auto;
}
.table_card {
margin: 3vw;
}
.seat_checkbox {
display: none;
}
.seat_checkbox:checked + .seat_number {
color: #ffffff;
color: #eaeaea;
}
.selected {
background-color: #0d1d3a;
@ -79,7 +81,8 @@
.cell {
background-color: transparent !important;
height: 4vw;
width: 3.5vw;
min-width: 3.5vw;
}
.row_number_cell {
display: flex;
@ -89,6 +92,7 @@
}
.seats_card::-webkit-scrollbar {
height: 7px;
width: 7px;
}
.seats_card::-webkit-scrollbar-thumb {
background-color: #0d1d3a;

View File

@ -22,29 +22,27 @@
</div>
</div>
</div>
<div class="seats_card" style="height: {{ height }}vw;">
<form method="post">
{% csrf_token %}
<table>
<tbody>
{% for row in session.auditorium.rows.all %}
<tr>
<td class="row_number_cell cell">Ряд {{ row.row_number }}</td>
{% for seat in seats %}
<td class="cell">
<label class="film_session">
<input type="checkbox" name="selected_seats"
value="[{{ seat.row_number }}, {{ row.row_number }}]" class="seat_checkbox">
<span class="seat_number">{{ seat.row_number }}</span>
</label>
</td>
{% endfor %}
</tr>
<form class="seats_card" method="post" style="height: {{ height }}vw;">
{% csrf_token %}
<table class="table_card">
<tbody>
{% for row in session.auditorium.rows.all %}
<tr>
<td class="row_number_cell cell">Ряд {{ forloop.counter }}</td>
{% for _ in row.column_count|get_range %}
<td class="cell">
<label class="film_session">
<input type="checkbox" name="selected_seats"
value="[{{ forloop.counter }}, {{ row.row_number }}]" class="seat_checkbox">
<span class="seat_number">{{ forloop.counter }}</span>
</label>
</td>
{% endfor %}
</tbody>
</table>
<button type="submit" class="btn btn-primary buy_btn">Купить билет</button>
</form>
</div>
</tr>
{% endfor %}
</tbody>
</table>
</form>
<button type="submit" class="btn btn-primary buy_btn">Купить билет</button>
<script src="{% static 'js/timetable/session.js' %}"></script>
{% endblock %}

View File

@ -3,17 +3,17 @@ from django.contrib import admin
from timetable.models import Auditorium, Row, FilmSession
class RowAdminInline(admin.StackedInline):
model = Row
@admin.register(Auditorium)
class AuditoriumAdmin(admin.ModelAdmin):
list_display = [
Auditorium.number.field.name,
]
@admin.register(Row)
class RowAdmin(admin.ModelAdmin):
list_display = [
Row.row_number.field.name,
inlines = [
RowAdminInline,
]

View File

@ -1,3 +1,4 @@
import pprint
from json import loads
from django import forms
@ -13,9 +14,9 @@ class SeatSelectionForm(forms.Form):
def __init__(self, *args, auditorium: Auditorium, **kwargs):
super().__init__(*args, **kwargs)
choices = []
for row in auditorium.rows.all():
for seat in range(1, auditorium.row_count + 1):
choices.append((f'[{seat}, {row.row_number}]', f'[{seat}, {row.row_number}]'))
for i, row in enumerate(auditorium.rows.all(), start=1):
for seat in range(1, row.column_count + 1):
choices.append((f'[{seat}, {str(i)}]', f'[{seat}, {str(i)}]'))
self.fields['selected_seats'].choices = choices
for field in self.visible_fields():

View File

@ -39,12 +39,12 @@ class Auditorium(Model):
verbose_name='Номер кинозала',
)
row_count = IntegerField(
verbose_name='Количество рядов кресел в зале',
validators=[
MinValueValidator(1),
],
)
# row_count = IntegerField(
# verbose_name='Количество рядов кресел в зале',
# validators=[
# MinValueValidator(1),
# ],
# )
def __str__(self):
return self.number

View File

@ -1,6 +1,7 @@
import datetime
from datetime import date
from django.db.models import Max
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404
@ -41,15 +42,16 @@ def timetable_view(request):
)
from django.shortcuts import redirect
def session_view(request, sess_id):
session = get_object_or_404(
FilmSession.objects.all(),
id=sess_id,
)
height = round(session.auditorium.row_count * 4 + 7)
height = round(session.auditorium.rows.count() * 4 + 7)
row_with_most_seats = Row.objects.filter(auditorium=session.auditorium).only('column_count').annotate(
max_seats=Max('column_count')
).order_by('-max_seats').first()
width = round(row_with_most_seats.column_count * 4 + 3)
if request.method == 'POST':
form = SeatSelectionForm(request.POST, auditorium=session.auditorium)
@ -61,9 +63,9 @@ def session_view(request, sess_id):
context = {
'session': session,
'seats': Row.objects.filter(auditorium_id=session.auditorium.id),
'height': height,
'form': form,
'width': width
}
template = 'timetable/session.html'
return render(request, template, context)