Compare commits
1 Commits
21ff47b82d
...
4b2d519e9a
Author | SHA1 | Date |
---|---|---|
Valentin Deniaud | 4b2d519e9a |
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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
|
||||
)
|
||||
)
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue