manager: hide empty check type field for partial bookings (#80048)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2023-07-27 15:13:29 +02:00
parent a70045ea5b
commit c1dd25d2c7
2 changed files with 44 additions and 21 deletions

View File

@ -604,23 +604,32 @@ class PartialBookingCheckForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.check_types = get_agenda_check_types(self.instance.event.agenda)
self.fields['presence_check_type'].choices = [(None, '---------')] + [
(ct.slug, ct.label) for ct in self.check_types if ct.kind == 'presence'
]
self.fields['presence_check_type'].initial = self.instance.user_check_type_slug
self.fields['absence_check_type'].choices = [(None, '---------')] + [
(ct.slug, ct.label) for ct in self.check_types if ct.kind == 'absence'
]
self.fields['absence_check_type'].initial = self.instance.user_check_type_slug
absence_check_types = [(ct.slug, ct.label) for ct in self.check_types if ct.kind == 'absence']
presence_check_types = [(ct.slug, ct.label) for ct in self.check_types if ct.kind == 'presence']
if presence_check_types:
self.fields['presence_check_type'].choices = [(None, '---------')] + presence_check_types
self.fields['presence_check_type'].initial = self.instance.user_check_type_slug
else:
del self.fields['presence_check_type']
if absence_check_types:
self.fields['absence_check_type'].choices = [(None, '---------')] + absence_check_types
self.fields['absence_check_type'].initial = self.instance.user_check_type_slug
else:
del self.fields['absence_check_type']
def clean(self):
if 'user_was_present' in self.cleaned_data:
if self.cleaned_data['user_was_present'] is not None:
kind = 'presence' if self.cleaned_data['user_was_present'] else 'absence'
self.check_type_slug = self.cleaned_data[f'{kind}_check_type']
self.check_type_label = dict(self.fields[f'{kind}_check_type'].choices).get(self.check_type_slug)
if f'{kind}_check_type' in self.cleaned_data:
self.check_type_slug = self.cleaned_data[f'{kind}_check_type']
self.check_type_label = dict(self.fields[f'{kind}_check_type'].choices).get(
self.check_type_slug
)
def save(self):
if 'user_was_present' in self.cleaned_data:
if hasattr(self, 'check_type_slug'):
self.instance.user_check_type_slug = self.check_type_slug
self.instance.user_check_type_label = self.check_type_label
return super().save()

View File

@ -153,11 +153,7 @@ def test_manager_partial_bookings_day_view_24_hours(app, admin_user, freezer):
@mock.patch('chrono.manager.forms.get_agenda_check_types')
def test_manager_partial_bookings_check(check_types, app, admin_user):
check_types.return_value = [
CheckType(slug='foo-reason', label='Foo reason', kind='absence'),
CheckType(slug='bar-reason', label='Bar reason', kind='presence'),
CheckType(slug='baz-reason', label='Baz reason', kind='presence'),
]
check_types.return_value = []
agenda = Agenda.objects.create(label='Foo bar', kind='events', partial_bookings=True)
start_datetime = make_aware(datetime.datetime(2023, 5, 2, 8, 0))
event = Event.objects.create(
@ -181,6 +177,28 @@ def test_manager_partial_bookings_check(check_types, app, admin_user):
assert resp.pyquery('.registrant--bar time')[1].text == '13:30'
assert resp.pyquery('.registrant--bar')[0].attrib['style'] == 'left: 30.77%; width: 19.23%;'
resp = resp.click('Jane Doe')
assert 'presence_check_type' not in resp.form.fields
assert 'absence_check_type' not in resp.form.fields
resp.form['user_check_start_time'] = '11:01'
resp.form['user_check_end_time'] = '13:15'
resp.form['user_was_present'] = 'True'
resp = resp.form.submit().follow()
assert len(resp.pyquery('.registrant--bar')) == 2
assert len(resp.pyquery('.registrant--bar.booking')) == 1
assert len(resp.pyquery('.registrant--bar.check.present')) == 1
assert resp.pyquery('.registrant--bar.check time')[0].text == '11:01'
assert resp.pyquery('.registrant--bar.check time')[1].text == '13:15'
assert resp.pyquery('.registrant--bar.check')[0].attrib['style'] == 'left: 30.9%; width: 17.18%;'
assert resp.pyquery('.registrant--bar span').text() == ''
check_types.return_value = [
CheckType(slug='foo-reason', label='Foo reason', kind='absence'),
CheckType(slug='bar-reason', label='Bar reason', kind='presence'),
CheckType(slug='baz-reason', label='Baz reason', kind='presence'),
]
resp = resp.click('Jane Doe')
assert resp.form['presence_check_type'].options == [
('', True, '---------'),
@ -191,10 +209,6 @@ def test_manager_partial_bookings_check(check_types, app, admin_user):
('', True, '---------'),
('foo-reason', False, 'Foo reason'),
]
resp.form['user_check_start_time'] = '11:01'
resp.form['user_check_end_time'] = '13:15'
resp.form['user_was_present'] = 'True'
resp.form['presence_check_type'] = 'bar-reason'
resp = resp.form.submit().follow()