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

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,7 @@
import datetime import datetime
from datetime import date from datetime import date
from django.db.models import Max
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404 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): def session_view(request, sess_id):
session = get_object_or_404( session = get_object_or_404(
FilmSession.objects.all(), FilmSession.objects.all(),
id=sess_id, 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': if request.method == 'POST':
form = SeatSelectionForm(request.POST, auditorium=session.auditorium) form = SeatSelectionForm(request.POST, auditorium=session.auditorium)
@ -61,9 +63,9 @@ def session_view(request, sess_id):
context = { context = {
'session': session, 'session': session,
'seats': Row.objects.filter(auditorium_id=session.auditorium.id),
'height': height, 'height': height,
'form': form, 'form': form,
'width': width
} }
template = 'timetable/session.html' template = 'timetable/session.html'
return render(request, template, context) return render(request, template, context)