manager: extra_data selection for timesheet (#61070)
This commit is contained in:
parent
0154debfb2
commit
1f255d7ab9
|
@ -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):
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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'] == ''
|
||||
|
|
Loading…
Reference in New Issue