manager: timesheet & check page ordering (#62043)
This commit is contained in:
parent
0625b88536
commit
86f7cda771
|
@ -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')),
|
||||
}
|
||||
]
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.']
|
||||
|
|
Loading…
Reference in New Issue