manager: extra_data selection for timesheet (#61070)

This commit is contained in:
Lauréline Guérin 2022-02-17 15:22:43 +01:00
parent 0154debfb2
commit 1f255d7ab9
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 85 additions and 0 deletions

View File

@ -370,12 +370,20 @@ class EventsTimesheetForm(forms.Form):
label=_('End date'),
widget=forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
)
extra_data = forms.CharField(
label=_('Extra datas'),
max_length=250,
required=False,
help_text=_('Comma separated list of keys defined in extra_data.'),
)
def __init__(self, *args, **kwargs):
self.agenda = kwargs.pop('agenda')
super().__init__(*args, **kwargs)
def get_slots(self):
extra_data = self.cleaned_data['extra_data'].split(',')
extra_data = [d.strip() for d in extra_data if d.strip()]
min_start = make_aware(
datetime.datetime.combine(self.cleaned_data['date_start'], datetime.time(0, 0))
)
@ -420,6 +428,7 @@ class EventsTimesheetForm(forms.Form):
'user_id': subscription.user_external_id,
'user_first_name': subscription.user_first_name,
'user_last_name': subscription.user_last_name,
'extra_data': {k: (subscription.extra_data or {}).get(k) or '' for k in extra_data},
'events': copy.deepcopy(event_slots),
}
@ -444,6 +453,7 @@ class EventsTimesheetForm(forms.Form):
'user_id': user_id,
'user_first_name': booking.user_first_name,
'user_last_name': booking.user_last_name,
'extra_data': {k: (booking.extra_data or {}).get(k) or '' for k in extra_data},
'events': copy.deepcopy(event_slots),
}
if booking.cancellation_datetime is not None:
@ -463,6 +473,7 @@ class EventsTimesheetForm(forms.Form):
'dates': dates,
'events': events,
'users': users,
'extra_data': extra_data,
}
def clean(self):

View File

@ -27,6 +27,7 @@
<tr>
<th>{% trans "First name" %}</th>
<th>{% trans "Last name" %}</th>
{% for k in slots.extra_data %}<th>{{ k }}</th>{% endfor %}
{% if events_num > 1 %}<th>{% trans "Activity" %}</th>{% endif %}
{% for date in slots.dates %}<th class="date">{{ date|date:"D d/m" }}</th>{% endfor %}
</tr>
@ -37,6 +38,7 @@
{% if forloop.first %}
<td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.user_first_name }}</td>
<td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.user_last_name }}</td>
{% for k in slots.extra_data %}<td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.extra_data|get:k }}</td>{% endfor %}
{% endif %}
{% if events_num > 1 %}<td>{{ event.event }}</td>{% endif %}
{% for date in slots.dates %}

View File

@ -2123,6 +2123,7 @@ def test_events_timesheet_slots(app, admin_user):
'user_id': 'user:1',
'user_first_name': 'Subscription',
'user_last_name': '42',
'extra_data': {},
'events': [
{
'event': event2,
@ -2147,6 +2148,7 @@ def test_events_timesheet_slots(app, admin_user):
],
},
]
assert slots['extra_data'] == []
@pytest.mark.freeze_time('2022-02-15')
@ -2493,3 +2495,73 @@ def test_events_timesheet_booked(app, admin_user):
'dates': {datetime.date(2022, 2, 15): False},
},
]
def test_events_timesheet_extra_data(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
event = Event.objects.create(
start_datetime=make_aware(datetime.datetime(2022, 2, 15, 17, 0)), places=10, agenda=agenda
)
Booking.objects.create(
event=event,
user_first_name='User',
user_last_name='42',
user_external_id='user:1',
extra_data={'foo': 'bar', 'baz': 'blah'},
)
login(app)
resp = app.get('/manage/agendas/%s/events/timesheet' % agenda.pk)
resp.form['date_start'] = '2022-02-01'
resp.form['date_end'] = '2022-02-28'
resp.form['extra_data'] = ' foo '
resp = resp.form.submit()
slots = resp.context['form'].get_slots()
assert len(slots['users']) == 1
assert slots['extra_data'] == ['foo']
assert slots['users'][0]['extra_data']['foo'] == 'bar'
resp.form['extra_data'] = ' foo ,baz,,'
resp = resp.form.submit()
slots = resp.context['form'].get_slots()
assert len(slots['users']) == 1
assert slots['extra_data'] == ['foo', 'baz']
assert slots['users'][0]['extra_data']['foo'] == 'bar'
assert slots['users'][0]['extra_data']['baz'] == 'blah'
resp.form['extra_data'] = 'unknown'
resp = resp.form.submit()
slots = resp.context['form'].get_slots()
assert len(slots['users']) == 1
assert slots['extra_data'] == ['unknown']
assert slots['users'][0]['extra_data']['unknown'] == ''
Subscription.objects.create(
agenda=agenda,
user_external_id='user:1',
user_first_name='Subscription',
user_last_name='41',
date_start=datetime.date(2022, 2, 1),
date_end=datetime.date(2022, 3, 1),
extra_data={'foo': 'baz'},
)
resp.form['extra_data'] = ' foo '
resp = resp.form.submit()
slots = resp.context['form'].get_slots()
assert len(slots['users']) == 1
assert slots['extra_data'] == ['foo']
assert slots['users'][0]['extra_data']['foo'] == 'baz'
resp.form['extra_data'] = ' foo ,baz,,'
resp = resp.form.submit()
slots = resp.context['form'].get_slots()
assert len(slots['users']) == 1
assert slots['extra_data'] == ['foo', 'baz']
assert slots['users'][0]['extra_data']['foo'] == 'baz'
assert slots['users'][0]['extra_data']['baz'] == ''