manager: timesheet & check page ordering (#62043)

This commit is contained in:
Lauréline Guérin 2022-02-22 16:01:10 +01:00
parent 0625b88536
commit 86f7cda771
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 134 additions and 9 deletions

View File

@ -342,6 +342,23 @@ class BookingCheckFilterSet(django_filters.FilterSet):
widget=forms.RadioSelect,
)
self.filters['sort'] = django_filters.ChoiceFilter(
label=_('Sort by'),
choices=[
('lastname,firstname', _('Last name, first name')),
('firstname,lastname', _('First name, last name')),
],
empty_label=None,
required=True,
initial='lastname,firstname',
widget=forms.RadioSelect,
method='do_nothing',
)
self.filters['sort'].parent = self
def do_nothing(self, queryset, name, value):
return queryset
class SubscriptionCheckFilterSet(BookingCheckFilterSet):
class Meta:
@ -382,6 +399,14 @@ class EventsTimesheetForm(forms.Form):
required=False,
help_text=_('Key defined in extra_data.'),
)
sort = forms.ChoiceField(
label=_('Sort by'),
choices=[
('lastname,firstname', _('Last name, first name')),
('firstname,lastname', _('First name, last name')),
],
initial='lastname,firstname',
)
with_page_break = forms.BooleanField(
label=_('Add a page break before earh grouper'),
required=False,
@ -519,6 +544,11 @@ class EventsTimesheetForm(forms.Form):
event['dates'][date] = True
break
if self.cleaned_data['sort'] == 'lastname,firstname':
sort_fields = ['user_last_name', 'user_first_name']
else:
sort_fields = ['user_first_name', 'user_last_name']
if group_by:
groupers = defaultdict(list)
for user in users.values():
@ -526,7 +556,7 @@ class EventsTimesheetForm(forms.Form):
users = [
{
'grouper': g,
'users': sorted(u, key=itemgetter('user_last_name', 'user_first_name', 'user_id')),
'users': sorted(u, key=itemgetter(*sort_fields, 'user_id')),
}
for g, u in groupers.items()
]
@ -537,9 +567,7 @@ class EventsTimesheetForm(forms.Form):
users = [
{
'grouper': '',
'users': sorted(
users.values(), key=itemgetter('user_last_name', 'user_first_name', 'user_id')
),
'users': sorted(users.values(), key=itemgetter(*sort_fields, 'user_id')),
}
]

View File

@ -2154,10 +2154,10 @@ class EventCheckView(ViewableAgendaMixin, DetailView):
filters = self.get_filters(booked_queryset=booked_qs, subscription_queryset=subscription_qs)
# and filter booked and subscriptions
booked_filterset = BookingCheckFilterSet(
self.request.GET, queryset=booked_qs, agenda=self.agenda, filters=filters
data=self.request.GET or None, queryset=booked_qs, agenda=self.agenda, filters=filters
)
subscription_filterset = SubscriptionCheckFilterSet(
self.request.GET, queryset=subscription_qs, agenda=self.agenda, filters=filters
data=self.request.GET or None, queryset=subscription_qs, agenda=self.agenda, filters=filters
)
# build results from mixed booked and subscriptions
@ -2175,7 +2175,14 @@ class EventCheckView(ViewableAgendaMixin, DetailView):
subscription.kind = 'subscription'
results.append(subscription)
# sort results
results = sorted(results, key=attrgetter('user_last_name', 'user_first_name'))
if (
booked_filterset.form.is_valid()
and booked_filterset.form.cleaned_data.get('sort') == 'firstname,lastname'
):
sort_fields = ['user_first_name', 'user_last_name']
else:
sort_fields = ['user_last_name', 'user_first_name']
results = sorted(results, key=attrgetter(*sort_fields, 'user_external_id'))
# set context
context['booked_without_status'] = booked_without_status

View File

@ -1702,6 +1702,44 @@ def test_event_check_filters(app, admin_user):
assert 'Subscription foo-none bar-val2' not in resp
def test_event_check_ordering(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='BB',
user_last_name='XX',
user_external_id='user:1',
)
Booking.objects.create(
event=event,
user_first_name='AA',
user_last_name='YY',
user_external_id='user:2',
cancellation_datetime=now(),
)
Subscription.objects.create(
agenda=agenda,
user_first_name='CC',
user_last_name='WW',
user_external_id='user:3',
date_start=datetime.date(2022, 2, 1),
date_end=datetime.date(2022, 3, 1),
)
login(app)
resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk))
assert resp.text.index('CC WW') < resp.text.index('BB XX') < resp.text.index('AA YY')
resp = app.get('/manage/agendas/%s/events/%s/check?sort=lastname,firstname' % (agenda.pk, event.pk))
assert resp.text.index('CC WW') < resp.text.index('BB XX') < resp.text.index('AA YY')
resp = app.get('/manage/agendas/%s/events/%s/check?sort=firstname,lastname' % (agenda.pk, event.pk))
assert resp.text.index('AA YY') < resp.text.index('BB XX') < resp.text.index('CC WW')
def test_event_check_booking(app, admin_user):
group = AbsenceReasonGroup.objects.create(label='Foo bar')
agenda = Agenda.objects.create(label='Events', kind='events')
@ -2643,6 +2681,58 @@ def test_events_timesheet_extra_data(app, admin_user):
assert len(slots['users'][0]['users']) == 3
def test_events_timesheet_ordering(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='BB',
user_last_name='XX',
user_external_id='user:1',
)
Booking.objects.create(
event=event,
user_first_name='AA',
user_last_name='YY',
user_external_id='user:2',
cancellation_datetime=now(),
)
Subscription.objects.create(
agenda=agenda,
user_first_name='CC',
user_last_name='WW',
user_external_id='user:3',
date_start=datetime.date(2022, 2, 1),
date_end=datetime.date(2022, 3, 1),
)
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 = resp.form.submit()
slots = resp.context['form'].get_slots()
assert slots['users'][0]['users'][0]['user_id'] == 'user:3'
assert slots['users'][0]['users'][1]['user_id'] == 'user:1'
assert slots['users'][0]['users'][2]['user_id'] == 'user:2'
resp.form['sort'] = 'lastname,firstname'
resp = resp.form.submit()
slots = resp.context['form'].get_slots()
assert slots['users'][0]['users'][0]['user_id'] == 'user:3'
assert slots['users'][0]['users'][1]['user_id'] == 'user:1'
assert slots['users'][0]['users'][2]['user_id'] == 'user:2'
resp.form['sort'] = 'firstname,lastname'
resp = resp.form.submit()
slots = resp.context['form'].get_slots()
assert slots['users'][0]['users'][0]['user_id'] == 'user:2'
assert slots['users'][0]['users'][1]['user_id'] == 'user:1'
assert slots['users'][0]['users'][2]['user_id'] == 'user:3'
@pytest.mark.freeze_time('2022-04-01')
def test_events_timesheet_date_display(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
@ -2799,7 +2889,7 @@ def test_events_timesheet_pdf(app, admin_user):
login(app)
resp = app.get(
'/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&date_display=all&orientation=portrait'
'/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&sort=lastname,firstname&date_display=all&orientation=portrait'
% agenda.pk
)
assert resp.headers['Content-Type'] == 'application/pdf'
@ -2810,7 +2900,7 @@ def test_events_timesheet_pdf(app, admin_user):
# form invalid
resp = app.get(
'/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&date_display=all'
'/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&sort=lastname,firstname&date_display=all'
% agenda.pk
)
assert resp.context['form'].errors['orientation'] == ['This field is required.']