Projet

Général

Profil

0001-manager-timesheet-activity-display-configuration-666.patch

Lauréline Guérin, 28 juin 2022 15:05

Télécharger (24,3 ko)

Voir les différences:

Subject: [PATCH] manager: timesheet & activity display configuration (#66681)

 chrono/manager/forms.py                       |  25 +-
 chrono/manager/static/css/style.scss          |   4 +
 chrono/manager/static/css/timesheet.scss      |   4 +
 .../manager_events_timesheet_fragment.html    |  51 ++-
 tests/manager/test_event_timesheet.py         | 300 ++++++++++--------
 5 files changed, 234 insertions(+), 150 deletions(-)
chrono/manager/forms.py
562 562
        initial='lastname,firstname',
563 563
    )
564 564
    date_display = forms.ChoiceField(
565
        label=_('Display'),
565
        label=_('Date display'),
566 566
        choices=[
567 567
            ('all', _('All on the same page')),
568 568
            ('month', _('1 month per page')),
......
575 575
        label=_('Number of dates per page'),
576 576
        required=False,
577 577
    )
578
    activity_display = forms.ChoiceField(
579
        label=_('Activity display'),
580
        choices=[
581
            ('row', _('In line')),
582
            ('col', _('In column')),
583
        ],
584
        initial='row',
585
    )
578 586
    orientation = forms.ChoiceField(
579 587
        label=_('PDF orientation'),
580 588
        choices=[
......
591 599
        if self.event is not None:
592 600
            del self.fields['date_start']
593 601
            del self.fields['date_end']
602
            del self.fields['date_display']
603
            del self.fields['custom_nb_dates_per_page']
604
            del self.fields['activity_display']
594 605

  
595 606
    def get_slots(self):
596 607
        extra_data = self.cleaned_data['extra_data'].split(',')
......
623 634
                .select_related('primary_event')
624 635
                .order_by('start_datetime', 'label')
625 636
            )
626
        dates = set()
637
        dates = defaultdict(list)
627 638
        events = []
628 639
        dates_per_event_id = defaultdict(list)
629 640
        for event in all_events:
630 641
            date = localtime(event.start_datetime).date()
631
            dates.add(date)
632 642
            real_event = event.primary_event or event
643
            dates[date].append(real_event)
633 644
            if real_event not in events:
634 645
                events.append(real_event)
635 646
            dates_per_event_id[real_event.pk].append(date)
636
        dates = sorted(dates)
647
        dates = sorted(dates.items(), key=lambda a: a[0])
637 648

  
638
        date_display = self.cleaned_data['date_display']
649
        date_display = self.cleaned_data.get('date_display') or 'all'
639 650
        if date_display in ['month', 'week']:
640 651
            grouper = defaultdict(list)
641
            for date in dates:
652
            for date, event in dates:
642 653
                if date_display == 'month':
643 654
                    attr = date.month
644 655
                else:
645 656
                    attr = date.isocalendar().week
646
                grouper[(date.year, attr)].append(date)
657
                grouper[(date.year, attr)].append((date, event))
647 658
            dates = [grouper[g] for g in sorted(grouper.keys())]
648 659
        elif date_display == 'custom':
649 660
            n = self.cleaned_data['custom_nb_dates_per_page']
chrono/manager/static/css/style.scss
505 505
			width: 20px;
506 506
			text-align: center;
507 507
		}
508
		&.date-event {
509
			width: 60px;
510
			text-align: center;
511
		}
508 512
	}
509 513
	td {
510 514
		padding: 0.5em 0.5ex;
chrono/manager/static/css/timesheet.scss
25 25
			width: 30px;
26 26
			text-align: center;
27 27
		}
28
		&.date-event {
29
			width: 60px;
30
			text-align: center;
31
		}
28 32
	}
29 33
	td {
30 34
		border: 0.5px solid black;
chrono/manager/templates/chrono/manager_events_timesheet_fragment.html
11 11
      <th>{% trans "First name" %}</th>
12 12
      <th>{% trans "Last name" %}</th>
13 13
      {% for k in slots.extra_data %}<th>{{ k }}</th>{% endfor %}
14
      {% if events_num > 1 %}<th>{% trans "Activity" %}</th>{% endif %}
15
      {% for date in dates %}<th class="date">{{ date|date:"D d/m" }}</th>{% endfor %}
14
      {% if events_num > 1 and form.cleaned_data.activity_display != 'col' %}<th class="activity">{% trans "Activity" %}</th>{% endif %}
15
      {% for date, events in dates %}
16
        {% if form.cleaned_data.activity_display == 'col' %}
17
          {% for event in events %}
18
          <th class="date-event" data-id="{{ date|date:"d-m" }}:{{ event.slug }}">{% blocktrans with date=date|date:"d/m" %}{{ event }} of {{ date }}{% endblocktrans %}</th>
19
          {% endfor %}
20
        {% else %}
21
          <th class="date" data-id="{{ date|date:"d-m" }}">{{ date|date:"D d/m" }}</th>
22
        {% endif %}
23
      {% endfor %}
16 24
    </tr>
17 25
  </thead>
18 26
  <tbody>
19
    {% for user in grouper.users %}{% for event in user.events %}
20
    <tr>
21
      {% if forloop.first %}
22
      <td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.user_first_name }}</td>
23
      <td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.user_last_name }}</td>
24
      {% for k in slots.extra_data %}<td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.extra_data|get:k }}</td>{% endfor %}
25
      {% endif %}
26
      {% if events_num > 1 %}<td>{{ event.event }}</td>{% endif %}
27
      {% for date in dates %}
28
      {% with booked=event.dates|get:date %}<td class="date">{% if booked is True %}☐{% elif booked is None %}-{% endif %}</td>{% endwith %}
27
    {% if form.cleaned_data.activity_display == 'col' %}
28
      {% for user in grouper.users %}
29
      <tr>
30
        <td>{{ user.user_first_name }}</td>
31
        <td>{{ user.user_last_name }}</td>
32
        {% for k in slots.extra_data %}<td>{{ user.extra_data|get:k }}</td>{% endfor %}
33
        {% for date, events in dates %}
34
          {% for event in events %}
35
          {% for item in user.events %}{% if item.event == event %}{% with booked=item.dates|get:date %}<td class="date" data-id="{{ date|date:"d-m" }}:{{ item.event.slug }}:{{ user.user_id }}">{% if booked is True %}☐{% elif booked is None %}-{% endif %}</td>{% endwith %}{% endif %}{% endfor %}
36
          {% endfor %}
37
        {% endfor %}
38
      </tr>
29 39
      {% endfor %}
30
    </tr>
31
    {% endfor %}{% endfor %}
40
    {% else %}
41
      {% for user in grouper.users %}{% for item in user.events %}
42
      <tr>
43
        {% if forloop.first %}
44
        <td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.user_first_name }}</td>
45
        <td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.user_last_name }}</td>
46
        {% for k in slots.extra_data %}<td {% if events_num > 1 %}rowspan="{{ events_num }}"{% endif %}>{{ user.extra_data|get:k }}</td>{% endfor %}
47
        {% endif %}
48
        {% if events_num > 1 %}<td class="activity">{{ item.event }}</td>{% endif %}
49
        {% for date, events in dates %}
50
        {% with booked=item.dates|get:date %}<td class="date" data-id="{{ date|date:"d-m" }}:{{ item.event.slug }}:{{ user.user_id }}">{% if booked is True %}☐{% elif booked is None %}-{% endif %}</td>{% endwith %}
51
        {% endfor %}
52
      </tr>
53
      {% endfor %}{% endfor %}
54
    {% endif %}
32 55
  </tbody>
33 56
</table>
34 57
{% if form.cleaned_data.with_page_break %}{% if not forloop.last or not forloop.parentloop.last %}<div class="page_break"></div>{% endif %}{% endif %}
tests/manager/test_event_timesheet.py
1 1
import datetime
2
import itertools
2 3

  
3 4
import pytest
4 5
from django.db import connection
......
99 100
        assert len(ctx.captured_queries) == 7
100 101

  
101 102
    slots = resp.context['form'].get_slots()
102
    assert slots['dates'] == [
103
        [
104
            datetime.date(2022, 2, 1),
105
            datetime.date(2022, 2, 2),
106
            datetime.date(2022, 2, 7),
107
            datetime.date(2022, 2, 8),
108
            datetime.date(2022, 2, 9),
109
            datetime.date(2022, 2, 14),
110
            datetime.date(2022, 2, 15),
111
            datetime.date(2022, 2, 16),
112
            datetime.date(2022, 2, 21),
113
            datetime.date(2022, 2, 22),
114
            datetime.date(2022, 2, 23),
115
            datetime.date(2022, 2, 28),
116
        ]
103
    assert len(slots['dates']) == 1
104
    assert [d[0] for d in slots['dates'][0]] == [
105
        datetime.date(2022, 2, 1),
106
        datetime.date(2022, 2, 2),
107
        datetime.date(2022, 2, 7),
108
        datetime.date(2022, 2, 8),
109
        datetime.date(2022, 2, 9),
110
        datetime.date(2022, 2, 14),
111
        datetime.date(2022, 2, 15),
112
        datetime.date(2022, 2, 16),
113
        datetime.date(2022, 2, 21),
114
        datetime.date(2022, 2, 22),
115
        datetime.date(2022, 2, 23),
116
        datetime.date(2022, 2, 28),
117 117
    ]
118 118
    assert slots['events'] == [
119 119
        event2,
......
131 131
            'events': [
132 132
                {
133 133
                    'event': event2,
134
                    'dates': {date: False for date in slots['dates'][0] if date == datetime.date(2022, 2, 1)},
134
                    'dates': {
135
                        date: False for date, events in slots['dates'][0] if date == datetime.date(2022, 2, 1)
136
                    },
135 137
                },
136 138
                {
137 139
                    'event': recurring_event1,
138
                    'dates': {date: False for date in slots['dates'][0] if date.weekday() in [0, 1]},
140
                    'dates': {date: False for date, events in slots['dates'][0] if date.weekday() in [0, 1]},
139 141
                },
140 142
                {
141 143
                    'event': recurring_event2,
142
                    'dates': {date: False for date in slots['dates'][0] if date.weekday() in [1, 2]},
144
                    'dates': {date: False for date, events in slots['dates'][0] if date.weekday() in [1, 2]},
143 145
                },
144 146
                {
145 147
                    'event': event3,
146 148
                    'dates': {
147
                        date: False for date in slots['dates'][0] if date == datetime.date(2022, 2, 15)
149
                        date: False
150
                        for date, events in slots['dates'][0]
151
                        if date == datetime.date(2022, 2, 15)
148 152
                    },
149 153
                },
150 154
                {
151 155
                    'event': event4,
152 156
                    'dates': {
153
                        date: False for date in slots['dates'][0] if date == datetime.date(2022, 2, 28)
157
                        date: False
158
                        for date, events in slots['dates'][0]
159
                        if date == datetime.date(2022, 2, 28)
154 160
                    },
155 161
                },
156 162
            ],
......
202 208
    resp = resp.form.submit()
203 209

  
204 210
    slots = resp.context['form'].get_slots()
205
    assert slots['dates'] == [
206
        [
207
            datetime.date(2022, 2, 1),
208
            datetime.date(2022, 2, 15),
209
            datetime.date(2022, 2, 28),
210
        ]
211
    assert len(slots['dates']) == 1
212
    assert [d[0] for d in slots['dates'][0]] == [
213
        datetime.date(2022, 2, 1),
214
        datetime.date(2022, 2, 15),
215
        datetime.date(2022, 2, 28),
211 216
    ]
212 217

  
213 218
    assert slots['events'] == [
......
507 512
        },
508 513
    ]
509 514

  
515
    # activity_display: row
516
    assert len(resp.pyquery.find('th.activity')) == 1
517
    assert resp.pyquery.find('th.activity')[0].text == 'Activity'
518
    assert len(resp.pyquery.find('th.date')) == 1
519
    assert len(resp.pyquery.find('th.date-event')) == 0
520
    assert resp.pyquery.find('th.date[data-id="15-02"]')[0].text == 'Tue 15/02'
521
    assert len(resp.pyquery.find('td.activity')) == 5
522
    assert resp.pyquery.find('td.activity')[0].text == 'event 1'
523
    assert resp.pyquery.find('td.activity')[1].text == 'event 2'
524
    assert resp.pyquery.find('td.activity')[2].text == 'event 3'
525
    assert resp.pyquery.find('td.activity')[3].text == 'recurring 1'
526
    assert resp.pyquery.find('td.activity')[4].text == 'recurring 2'
527
    assert len(resp.pyquery.find('td.date')) == 5
528
    assert resp.pyquery.find('td.date[data-id="15-02:event-1:user:1"]')[0].text == '☐'
529
    assert resp.pyquery.find('td.date[data-id="15-02:event-2:user:1"]')[0].text is None
530
    assert resp.pyquery.find('td.date[data-id="15-02:event-3:user:1"]')[0].text is None
531
    assert resp.pyquery.find('td.date[data-id="15-02:recurring-1:user:1"]')[0].text == '☐'
532
    assert resp.pyquery.find('td.date[data-id="15-02:recurring-2:user:1"]')[0].text is None
533

  
534
    # activity_display: col
535
    resp.form['activity_display'] = 'col'
536
    resp = resp.form.submit()
537
    new_slots = resp.context['form'].get_slots()
538
    assert new_slots == slots
539
    assert len(resp.pyquery.find('th.activity')) == 0
540
    assert len(resp.pyquery.find('th.date')) == 0
541
    assert len(resp.pyquery.find('th.date-event')) == 5
542
    assert resp.pyquery.find('th.date-event[data-id="15-02:event-1"]')[0].text == 'event 1 of 15/02'
543
    assert resp.pyquery.find('th.date-event[data-id="15-02:event-2"]')[0].text == 'event 2 of 15/02'
544
    assert resp.pyquery.find('th.date-event[data-id="15-02:event-3"]')[0].text == 'event 3 of 15/02'
545
    assert resp.pyquery.find('th.date-event[data-id="15-02:recurring-1"]')[0].text == 'recurring 1 of 15/02'
546
    assert resp.pyquery.find('th.date-event[data-id="15-02:recurring-2"]')[0].text == 'recurring 2 of 15/02'
547
    assert len(resp.pyquery.find('td.date')) == 5
548
    assert resp.pyquery.find('td.date[data-id="15-02:event-1:user:1"]')[0].text == '☐'
549
    assert resp.pyquery.find('td.date[data-id="15-02:event-2:user:1"]')[0].text is None
550
    assert resp.pyquery.find('td.date[data-id="15-02:event-3:user:1"]')[0].text is None
551
    assert resp.pyquery.find('td.date[data-id="15-02:recurring-1:user:1"]')[0].text == '☐'
552
    assert resp.pyquery.find('td.date[data-id="15-02:recurring-2:user:1"]')[0].text is None
553

  
510 554

  
511 555
def test_events_timesheet_extra_data(app, admin_user):
512 556
    agenda = Agenda.objects.create(label='Events', kind='events')
......
732 776
    resp = resp.form.submit()
733 777
    slots = resp.context['form'].get_slots()
734 778

  
735
    assert slots['dates'] == [
736
        [
737
            datetime.date(2022, 1, 3),
738
            datetime.date(2022, 1, 10),
739
            datetime.date(2022, 1, 17),
740
            datetime.date(2022, 1, 24),
741
            datetime.date(2022, 1, 31),
742
            datetime.date(2022, 2, 7),
743
            datetime.date(2022, 2, 14),
744
            datetime.date(2022, 2, 21),
745
            datetime.date(2022, 2, 28),
746
            datetime.date(2022, 3, 7),
747
            datetime.date(2022, 3, 14),
748
            datetime.date(2022, 3, 21),
749
            datetime.date(2022, 3, 28),
750
        ]
779
    assert len(slots['dates']) == 1
780
    assert [d[0] for d in slots['dates'][0]] == [
781
        datetime.date(2022, 1, 3),
782
        datetime.date(2022, 1, 10),
783
        datetime.date(2022, 1, 17),
784
        datetime.date(2022, 1, 24),
785
        datetime.date(2022, 1, 31),
786
        datetime.date(2022, 2, 7),
787
        datetime.date(2022, 2, 14),
788
        datetime.date(2022, 2, 21),
789
        datetime.date(2022, 2, 28),
790
        datetime.date(2022, 3, 7),
791
        datetime.date(2022, 3, 14),
792
        datetime.date(2022, 3, 21),
793
        datetime.date(2022, 3, 28),
751 794
    ]
752 795

  
753 796
    resp.form['date_display'] = 'month'
754 797
    resp = resp.form.submit()
755 798
    slots = resp.context['form'].get_slots()
756 799

  
757
    assert slots['dates'] == [
758
        [
759
            datetime.date(2022, 1, 3),
760
            datetime.date(2022, 1, 10),
761
            datetime.date(2022, 1, 17),
762
            datetime.date(2022, 1, 24),
763
            datetime.date(2022, 1, 31),
764
        ],
765
        [
766
            datetime.date(2022, 2, 7),
767
            datetime.date(2022, 2, 14),
768
            datetime.date(2022, 2, 21),
769
            datetime.date(2022, 2, 28),
770
        ],
771
        [
772
            datetime.date(2022, 3, 7),
773
            datetime.date(2022, 3, 14),
774
            datetime.date(2022, 3, 21),
775
            datetime.date(2022, 3, 28),
776
        ],
800
    assert len(slots['dates']) == 3
801
    assert [d[0] for d in slots['dates'][0]] == [
802
        datetime.date(2022, 1, 3),
803
        datetime.date(2022, 1, 10),
804
        datetime.date(2022, 1, 17),
805
        datetime.date(2022, 1, 24),
806
        datetime.date(2022, 1, 31),
807
    ]
808
    assert [d[0] for d in slots['dates'][1]] == [
809
        datetime.date(2022, 2, 7),
810
        datetime.date(2022, 2, 14),
811
        datetime.date(2022, 2, 21),
812
        datetime.date(2022, 2, 28),
813
    ]
814
    assert [d[0] for d in slots['dates'][2]] == [
815
        datetime.date(2022, 3, 7),
816
        datetime.date(2022, 3, 14),
817
        datetime.date(2022, 3, 21),
818
        datetime.date(2022, 3, 28),
777 819
    ]
778 820

  
779 821
    resp.form['date_display'] = 'week'
......
781 823
    slots = resp.context['form'].get_slots()
782 824
    assert resp.text.count('<div class="page_break">') == 12
783 825

  
784
    assert slots['dates'] == [
785
        [datetime.date(2022, 1, 3)],
786
        [datetime.date(2022, 1, 10)],
787
        [datetime.date(2022, 1, 17)],
788
        [datetime.date(2022, 1, 24)],
789
        [datetime.date(2022, 1, 31)],
790
        [datetime.date(2022, 2, 7)],
791
        [datetime.date(2022, 2, 14)],
792
        [datetime.date(2022, 2, 21)],
793
        [datetime.date(2022, 2, 28)],
794
        [datetime.date(2022, 3, 7)],
795
        [datetime.date(2022, 3, 14)],
796
        [datetime.date(2022, 3, 21)],
797
        [datetime.date(2022, 3, 28)],
826
    assert len(slots['dates']) == 13
827
    assert [d[0] for d in itertools.chain(*slots['dates'])] == [
828
        datetime.date(2022, 1, 3),
829
        datetime.date(2022, 1, 10),
830
        datetime.date(2022, 1, 17),
831
        datetime.date(2022, 1, 24),
832
        datetime.date(2022, 1, 31),
833
        datetime.date(2022, 2, 7),
834
        datetime.date(2022, 2, 14),
835
        datetime.date(2022, 2, 21),
836
        datetime.date(2022, 2, 28),
837
        datetime.date(2022, 3, 7),
838
        datetime.date(2022, 3, 14),
839
        datetime.date(2022, 3, 21),
840
        datetime.date(2022, 3, 28),
798 841
    ]
799 842

  
800 843
    resp.form['date_display'] = 'custom'
......
805 848
    resp = resp.form.submit()
806 849
    slots = resp.context['form'].get_slots()
807 850

  
808
    assert slots['dates'] == [
809
        [
810
            datetime.date(2022, 1, 3),
811
            datetime.date(2022, 1, 10),
812
            datetime.date(2022, 1, 17),
813
            datetime.date(2022, 1, 24),
814
            datetime.date(2022, 1, 31),
815
            datetime.date(2022, 2, 7),
816
            datetime.date(2022, 2, 14),
817
            datetime.date(2022, 2, 21),
818
            datetime.date(2022, 2, 28),
819
            datetime.date(2022, 3, 7),
820
        ],
821
        [
822
            datetime.date(2022, 3, 14),
823
            datetime.date(2022, 3, 21),
824
            datetime.date(2022, 3, 28),
825
        ],
851
    assert len(slots['dates']) == 2
852
    assert [d[0] for d in slots['dates'][0]] == [
853
        datetime.date(2022, 1, 3),
854
        datetime.date(2022, 1, 10),
855
        datetime.date(2022, 1, 17),
856
        datetime.date(2022, 1, 24),
857
        datetime.date(2022, 1, 31),
858
        datetime.date(2022, 2, 7),
859
        datetime.date(2022, 2, 14),
860
        datetime.date(2022, 2, 21),
861
        datetime.date(2022, 2, 28),
862
        datetime.date(2022, 3, 7),
863
    ]
864
    assert [d[0] for d in slots['dates'][1]] == [
865
        datetime.date(2022, 3, 14),
866
        datetime.date(2022, 3, 21),
867
        datetime.date(2022, 3, 28),
826 868
    ]
827 869

  
828 870
    resp.form['custom_nb_dates_per_page'] = 3
829 871
    resp = resp.form.submit()
830 872
    slots = resp.context['form'].get_slots()
831 873

  
832
    assert slots['dates'] == [
833
        [
834
            datetime.date(2022, 1, 3),
835
            datetime.date(2022, 1, 10),
836
            datetime.date(2022, 1, 17),
837
        ],
838
        [
839
            datetime.date(2022, 1, 24),
840
            datetime.date(2022, 1, 31),
841
            datetime.date(2022, 2, 7),
842
        ],
843
        [
844
            datetime.date(2022, 2, 14),
845
            datetime.date(2022, 2, 21),
846
            datetime.date(2022, 2, 28),
847
        ],
848
        [
849
            datetime.date(2022, 3, 7),
850
            datetime.date(2022, 3, 14),
851
            datetime.date(2022, 3, 21),
852
        ],
853
        [
854
            datetime.date(2022, 3, 28),
855
        ],
874
    assert len(slots['dates']) == 5
875
    assert [d[0] for d in slots['dates'][0]] == [
876
        datetime.date(2022, 1, 3),
877
        datetime.date(2022, 1, 10),
878
        datetime.date(2022, 1, 17),
879
    ]
880
    assert [d[0] for d in slots['dates'][1]] == [
881
        datetime.date(2022, 1, 24),
882
        datetime.date(2022, 1, 31),
883
        datetime.date(2022, 2, 7),
884
    ]
885
    assert [d[0] for d in slots['dates'][2]] == [
886
        datetime.date(2022, 2, 14),
887
        datetime.date(2022, 2, 21),
888
        datetime.date(2022, 2, 28),
889
    ]
890
    assert [d[0] for d in slots['dates'][3]] == [
891
        datetime.date(2022, 3, 7),
892
        datetime.date(2022, 3, 14),
893
        datetime.date(2022, 3, 21),
894
    ]
895
    assert [d[0] for d in slots['dates'][4]] == [
896
        datetime.date(2022, 3, 28),
856 897
    ]
857 898

  
858 899
    Subscription.objects.create(
......
881 922

  
882 923
    login(app)
883 924
    resp = app.get(
884
        '/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&sort=lastname,firstname&date_display=all&orientation=portrait'
885
        % agenda.pk
925
        '/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&sort=lastname,firstname'
926
        '&date_display=all&activity_display=row&orientation=portrait' % agenda.pk
886 927
    )
887 928
    assert resp.headers['Content-Type'] == 'application/pdf'
888 929
    assert (
......
892 933

  
893 934
    # form invalid
894 935
    resp = app.get(
895
        '/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&sort=lastname,firstname&date_display=all'
936
        '/manage/agendas/%s/events/timesheet?pdf=&date_start=2022-02-01&date_end=2022-02-28&sort=lastname,firstname&date_display=all&activity_display=row'
896 937
        % agenda.pk
897 938
    )
898 939
    assert resp.context['form'].errors['orientation'] == ['This field is required.']
......
946 987
    resp = app.get('/manage/agendas/%s/events/%s/timesheet' % (agenda.pk, event.pk))
947 988
    assert 'date_start' not in resp.context['form'].fields
948 989
    assert 'date_end' not in resp.context['form'].fields
990
    assert 'date_display' not in resp.context['form'].fields
991
    assert 'custom_nb_dates_per_page' not in resp.context['form'].fields
992
    assert 'activity_display' not in resp.context['form'].fields
949 993
    assert resp.context['form'].errors == {}
950 994

  
951 995

  
......
970 1014
        assert len(ctx.captured_queries) == 7
971 1015

  
972 1016
    slots = resp.context['form'].get_slots()
973
    assert slots['dates'] == [
974
        [
975
            datetime.date(2022, 2, 15),
976
        ]
1017
    assert len(slots['dates']) == 1
1018
    assert [d[0] for d in slots['dates'][0]] == [
1019
        datetime.date(2022, 2, 15),
977 1020
    ]
978 1021
    assert slots['events'] == [event]
979 1022
    assert slots['users'][0]['users'] == [
......
1027 1070
    resp = resp.form.submit()
1028 1071

  
1029 1072
    slots = resp.context['form'].get_slots()
1030
    assert slots['dates'] == [
1031
        [
1032
            datetime.date(2022, 2, 15),
1033
        ]
1073
    assert len(slots['dates']) == 1
1074
    assert [d[0] for d in slots['dates'][0]] == [
1075
        datetime.date(2022, 2, 15),
1034 1076
    ]
1035 1077

  
1036 1078
    assert slots['events'] == [
1037
-