поправил админку для кинозалов и переделал страницу выбора места
This commit is contained in:
parent
afbc89709a
commit
61263e05b1
@ -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;
|
||||||
|
|||||||
@ -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 %}
|
||||||
@ -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,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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():
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user