Compare commits

..

1 Commits

Author SHA1 Message Date
Valentin Deniaud 4b2d519e9a manager: regroup partial booking check operations in one form (#82231)
gitea/chrono/pipeline/head This commit looks good Details
2023-11-14 12:09:07 +01:00
4 changed files with 71 additions and 48 deletions

View File

@ -612,7 +612,6 @@ class PartialBookingCheckForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
agenda = kwargs.pop('agenda')
hide_buttons = kwargs.pop('hide_buttons')
super().__init__(*args, **kwargs)
self.check_types = get_agenda_check_types(agenda)
absence_check_types = [(ct.slug, ct.label) for ct in self.check_types if ct.kind == 'absence']
@ -630,11 +629,9 @@ class PartialBookingCheckForm(forms.ModelForm):
else:
del self.fields['absence_check_type']
if hide_buttons:
if not self.instance.booking.start_time:
self.fields['start_time'].widget = widgets.TimeWidget(step=60)
self.fields['end_time'].widget = widgets.TimeWidget(step=60)
if not self.instance.booking.start_time:
self.fields['presence'].widget.choices = ((None, _('Not checked')), (True, _('Present')))
self.fields.pop('absence_check_type', None)

View File

@ -25,7 +25,7 @@
id="tab-{{ booking.pk }}"
tabindex="{{ forloop.first|yesno:"0,-1" }}"
>
{{ booking.start_time }} - {{ booking.end_time }}
{{ booking.start_time|time:"H:i" }} - {{ booking.end_time|time:"H:i" }}
</button>
{% endfor %}
</div>
@ -39,34 +39,35 @@
{% csrf_token %}
{% for booking in view.bookings %}
{% if multiple_bookings %}
<div id="panel-{{ booking.pk }}"
role="tabpanel" tabindex="0" {% if not forloop.first %}hidden{% endif %}
data-tab-slug="{{ booking.pk }}"
aria-labelledby="tab-{{ booking.pk }}">
{% endif %}
<div
class="booking-check-form"
class="booking-check-forms"
data-fill-start_time="{{ booking.start_time|time:"H:i" }}"
data-fill-end_time="{{ booking.end_time|time:"H:i" }}"
{% if multiple_bookings %}
id="panel-{{ booking.pk }}"
role="tabpanel" tabindex="0" {% if not forloop.first %}hidden{% endif %}
data-tab-slug="{{ booking.pk }}"
aria-labelledby="tab-{{ booking.pk }}"
{% endif %}
>
{{ booking.check_forms.0|with_template }}
<div class="booking-check-form">
{{ booking.check_forms.0|with_template }}
</div>
{% if forms|length > 1 %}
<fieldset
class="gadjo-foldable {% if not forms.1.instance.pk and not forms.1.errors %}gadjo-folded{% endif %}"
>
<legend class="gadjo-foldable-widget">{% trans "Second booking check" %}</legend>
<div class="booking-check-form gadjo-folding">
{{ booking.check_forms.1|with_template }}
</div>
</fieldset>
{% endif %}
</div>
{% if forms|length > 1 %}
<fieldset
class="gadjo-foldable {% if not forms.1.instance.pk and not forms.1.errors %}gadjo-folded{% endif %}"
>
<legend class="gadjo-foldable-widget">{% trans "Second booking check" %}</legend>
<div class="booking-check-form gadjo-folding">
{{ booking.check_forms.1|with_template }}
</div>
</fieldset>
{% endif %}
{% if multiple_bookings %}</div>{% endif %}
{% endfor %}
<div class="buttons">
@ -102,7 +103,7 @@
$('.time-widget-button').on('click', function() {
var widget_name = $(this).data('related-widget');
var widget_id = widget_name.split('-').at(-1);
var value = $(this).parents('.booking-check-form').data('fill-' + widget_id);
var value = $(this).parents('.booking-check-forms').data('fill-' + widget_id);
$('[name="' + widget_name + '"]').val(value);
});
});

View File

@ -30,7 +30,7 @@ from django.conf import settings
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.db import IntegrityError, transaction
from django.db.models import BooleanField, Count, Max, Min, Prefetch, Q, Value
from django.db.models import BooleanField, Count, Max, Min, Q, Value
from django.db.models.deletion import ProtectedError
from django.http import Http404, HttpResponse, HttpResponseForbidden, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
@ -4591,8 +4591,6 @@ class PartialBookingCheckView(ViewableAgendaMixin, TemplateView):
forms = []
for i, booking in enumerate(self.bookings):
is_dummy_booking = bool(not booking.start_time)
checks = booking.user_checks.all()
first_check = checks[0] if len(checks) > 0 else BookingCheck(booking=booking)
second_check = checks[1] if len(checks) > 1 else BookingCheck(booking=booking)
@ -4606,18 +4604,15 @@ class PartialBookingCheckView(ViewableAgendaMixin, TemplateView):
instance=first_check,
prefix=self.get_prefix(booking),
initial=first_check_initial,
hide_buttons=is_dummy_booking,
**kwargs,
),
]
if not is_dummy_booking:
# do not show second form if checking subscription
if booking.start_time:
booking.check_forms.append(
PartialBookingCheckForm(
instance=second_check,
prefix=self.get_prefix(booking, second_check=True),
hide_buttons=True,
**kwargs,
instance=second_check, prefix=self.get_prefix(booking, second_check=True), **kwargs
)
)

View File

@ -280,10 +280,21 @@ def test_manager_partial_bookings_day_view_multiple_bookings(app, admin_user, fr
# check first booking
resp = resp.click('Check')
prefix = 'booking-%s-' % first_booking.pk
resp.form[prefix + 'start_time'] = '09:30'
resp.form[prefix + 'end_time'] = '12:00'
resp.form[prefix + 'presence'] = 'True'
assert len(resp.pyquery('.pk-tabs')) == 1
assert resp.pyquery('#tab-%s' % first_booking.pk).text() == '09:00 - 12:00'
assert resp.pyquery('#tab-%s' % second_booking.pk).text() == '15:00 - 18:00'
first_prefix = 'booking-%s-' % first_booking.pk
second_prefix = 'booking-%s-' % second_booking.pk
# first booking inital check value is "Present", second booking is "Not checked"
assert resp.form[first_prefix + 'presence'].value == 'True'
assert resp.form[second_prefix + 'presence'].value == ''
resp.form[first_prefix + 'start_time'] = '09:30'
resp.form[first_prefix + 'end_time'] = '12:00'
resp.form[first_prefix + 'presence'] = 'True'
resp = resp.form.submit().follow()
assert len(resp.pyquery('.partial-booking--registrant')) == 1
@ -295,10 +306,9 @@ def test_manager_partial_bookings_day_view_multiple_bookings(app, admin_user, fr
# check second booking
resp = resp.click('Check')
prefix = 'booking-%s-' % second_booking.pk
resp.form[prefix + 'start_time'] = '15:00'
resp.form[prefix + 'end_time'] = '17:00'
resp.form[prefix + 'presence'] = 'True'
resp.form[second_prefix + 'start_time'] = '15:00'
resp.form[second_prefix + 'end_time'] = '17:00'
resp.form[second_prefix + 'presence'] = 'True'
resp = resp.form.submit().follow()
assert len(resp.pyquery('.partial-booking--registrant')) == 1
@ -341,8 +351,9 @@ def test_manager_partial_bookings_check(check_types, app, admin_user):
assert 'presence_check_type' not in resp.form.fields
assert 'absence_check_type' not in resp.form.fields
assert resp.pyquery('.booking-check-form').attr('data-fill-start_time') == '11:00'
assert resp.pyquery('.booking-check-form').attr('data-fill-end_time') == '13:30'
assert len(resp.pyquery('.pk-tabs')) == 0
assert resp.pyquery('.booking-check-forms').attr('data-fill-start_time') == '11:00'
assert resp.pyquery('.booking-check-forms').attr('data-fill-end_time') == '13:30'
assert resp.pyquery('.time-widget-button')[0].text == 'Fill with booking start time'
assert resp.pyquery('.time-widget-button')[1].text == 'Fill with booking end time'
@ -484,6 +495,11 @@ def test_manager_partial_bookings_multiple_checks(app, admin_user):
resp = app.get('/manage/agendas/%s/day/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
resp = resp.click('Check')
# main check inital value is "Present", second check is "Not checked"
assert resp.form['presence'].value == 'True'
assert resp.form['check-2-presence'].value == ''
resp.form['start_time'] = '09:30'
resp.form['end_time'] = '12:00'
resp.form['presence'] = 'True'
@ -496,6 +512,7 @@ def test_manager_partial_bookings_multiple_checks(app, admin_user):
assert resp.pyquery('.registrant--bar.check')[0].findall('time')[1].text == '12:00'
resp = resp.click('Check')
assert 'gadjo-folded' in resp.text
resp.form['check-2-start_time'] = '12:30'
resp.form['check-2-end_time'] = '17:30'
@ -509,6 +526,8 @@ def test_manager_partial_bookings_multiple_checks(app, admin_user):
assert resp.pyquery('.registrant--bar.check')[1].findall('time')[1].text == '17:30'
resp = resp.click('Check')
assert 'gadjo-folded' not in resp.text
resp.form['check-2-start_time'] = '11:30'
resp.form['check-2-end_time'] = ''
resp = resp.form.submit()
@ -528,6 +547,16 @@ def test_manager_partial_bookings_multiple_checks(app, admin_user):
assert resp.pyquery('.registrant--bar.check')[0].findall('time')[0].text == '09:30'
assert resp.pyquery('.registrant--bar.check')[0].findall('time')[1].text == '12:00'
resp = resp.click('Check')
assert 'gadjo-folded' in resp.text
resp.form['check-2-presence'] = 'False'
resp.form['check-2-start_time'] = '11:30'
resp.form['check-2-end_time'] = '11:29'
resp = resp.form.submit()
assert 'Arrival must be before departure.' in resp.text
assert 'gadjo-folded' not in resp.text
def test_manager_partial_bookings_incomplete_check(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='events', partial_bookings=True)
@ -606,6 +635,7 @@ def test_manager_partial_bookings_check_subscription(check_types, app, admin_use
('', False, None),
('True', True, None),
] # no 'False' option
assert 'check-2-presence' not in resp.form.fields
resp.form['start_time'] = '10:00'
resp.form['end_time'] = '16:00'