Projet

Général

Profil

0001-api-display-roles-on-agenda-details-57103.patch

Nicolas Roche, 28 septembre 2021 18:48

Télécharger (11,8 ko)

Voir les différences:

Subject: [PATCH 1/3] api: display roles on agenda details (#57103)

 chrono/api/views.py   | 12 +++++++++++-
 tests/api/test_all.py | 40 +++++++++++++++++++++++++++++++++-------
 2 files changed, 44 insertions(+), 8 deletions(-)
chrono/api/views.py
341 341
                        full=booked,
342 342
                        booked_for_external_user=booked_for_external_user,
343 343
                    )
344 344
                    if unique and not booked:
345 345
                        break
346 346

  
347 347

  
348 348
def get_agenda_detail(request, agenda, check_events=False):
349
    if agenda.edit_role:
350
        edit_role = agenda.edit_role.name
351
    else:
352
        edit_role = None
353
    if agenda.view_role:
354
        view_role = agenda.view_role.name
355
    else:
356
        view_role = None
349 357
    agenda_detail = {
350 358
        'id': agenda.slug,
351 359
        'slug': agenda.slug,  # kept for compatibility
352 360
        'text': agenda.label,
353 361
        'kind': agenda.kind,
354 362
        'minimal_booking_delay': agenda.minimal_booking_delay,
355 363
        'maximal_booking_delay': agenda.maximal_booking_delay,
364
        'edit_role': edit_role,
365
        'view_role': view_role,
356 366
    }
357 367

  
358 368
    if agenda.kind == 'meetings':
359 369
        agenda_detail['resources'] = [
360 370
            {'id': r.slug, 'text': r.label, 'description': r.description} for r in agenda.resources.all()
361 371
        ]
362 372
    if agenda.kind == 'events':
363 373
        agenda_detail['api'] = {
......
709 719
        for agenda in agendas_queryset:
710 720
            if with_open_events and not any(
711 721
                not e.full for e in agenda.get_open_events(prefetched_queryset=True)
712 722
            ):
713 723
                # exclude agendas without open events
714 724
                continue
715 725
            agendas.append(get_agenda_detail(request, agenda))
716 726

  
717
        return Response({'data': agendas})
727
        return Response({'err': 0, 'data': agendas})
718 728

  
719 729

  
720 730
agendas = Agendas.as_view()
721 731

  
722 732

  
723 733
class AgendaDetail(APIView):
724 734
    """
725 735
    Retrieve an agenda instance.
tests/api/test_all.py
17 17
    TimePeriodException,
18 18
    VirtualMember,
19 19
)
20 20

  
21 21
pytestmark = pytest.mark.django_db
22 22

  
23 23

  
24 24
def test_agendas_api(app):
25
    edit_group = Group.objects.create(name='Edit')
26
    view_group = Group.objects.create(name='View')
25 27
    category_a = Category.objects.create(label='Category A')
26 28
    category_b = Category.objects.create(label='Category B')
27 29
    group = AbsenceReasonGroup.objects.create(label='Foo')
28 30
    reason = AbsenceReason.objects.create(group=group, label='Foo bar')
29 31
    reason2 = AbsenceReason.objects.create(group=group, label='Foo bar baz')
30
    event_agenda = Agenda.objects.create(label='Foo bar', category=category_a, absence_reasons_group=group)
32
    event_agenda = Agenda.objects.create(
33
        label='Foo bar', category=category_a, absence_reasons_group=group, edit_role=edit_group
34
    )
31 35
    Desk.objects.create(agenda=event_agenda, slug='_exceptions_holder')
32 36
    event_agenda2 = Agenda.objects.create(label='Foo bar 2', category=category_a)
33 37
    Desk.objects.create(agenda=event_agenda2, slug='_exceptions_holder')
34 38
    event_agenda3 = Agenda.objects.create(label='Foo bar 3', absence_reasons_group=group)
35 39
    Desk.objects.create(agenda=event_agenda3, slug='_exceptions_holder')
36
    meetings_agenda1 = Agenda.objects.create(label='Foo bar Meeting', kind='meetings', category=category_b)
40
    meetings_agenda1 = Agenda.objects.create(
41
        label='Foo bar Meeting', kind='meetings', category=category_b, view_role=view_group
42
    )
37 43
    Agenda.objects.create(label='Foo bar Meeting 2', kind='meetings')
38 44
    resource1 = Resource.objects.create(label='Resource 1', description='Foo bar Resource 1')
39 45
    resource2 = Resource.objects.create(label='Resource 2', description='Foo bar Resource 2')
40 46
    Resource.objects.create(label='Resource 3')
41 47
    meetings_agenda1.resources.add(resource1, resource2)
42 48
    Agenda.objects.create(
43
        label='Virtual Agenda', kind='virtual', minimal_booking_delay=1, maximal_booking_delay=56
49
        label='Virtual Agenda',
50
        kind='virtual',
51
        minimal_booking_delay=1,
52
        maximal_booking_delay=56,
53
        edit_role=edit_group,
54
        view_role=view_group,
44 55
    )
45 56
    resp = app.get('/api/agenda/')
46 57
    assert resp.json == {
58
        'err': 0,
47 59
        'data': [
48 60
            {
49 61
                'text': 'Foo bar',
50 62
                'id': 'foo-bar',
51 63
                'slug': 'foo-bar',
52 64
                'kind': 'events',
53 65
                'minimal_booking_delay': 1,
54 66
                'maximal_booking_delay': 56,
67
                'edit_role': 'Edit',
68
                'view_role': None,
55 69
                'absence_reasons': [
56 70
                    {'id': reason.slug, 'slug': reason.slug, 'text': reason.label, 'label': reason.label},
57 71
                    {'id': reason2.slug, 'slug': reason2.slug, 'text': reason2.label, 'label': reason2.label},
58 72
                ],
59 73
                'api': {
60 74
                    'datetimes_url': 'http://testserver/api/agenda/foo-bar/datetimes/',
61 75
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar/fillslots/',
62 76
                },
63 77
            },
64 78
            {
65 79
                'text': 'Foo bar 2',
66 80
                'id': 'foo-bar-2',
67 81
                'kind': 'events',
68 82
                'slug': 'foo-bar-2',
69 83
                'minimal_booking_delay': 1,
70 84
                'maximal_booking_delay': 56,
85
                'edit_role': None,
86
                'view_role': None,
71 87
                'api': {
72 88
                    'datetimes_url': 'http://testserver/api/agenda/foo-bar-2/datetimes/',
73 89
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar-2/fillslots/',
74 90
                },
75 91
            },
76 92
            {
77 93
                'text': 'Foo bar 3',
78 94
                'id': 'foo-bar-3',
79 95
                'kind': 'events',
80 96
                'slug': 'foo-bar-3',
81 97
                'minimal_booking_delay': 1,
82 98
                'maximal_booking_delay': 56,
99
                'edit_role': None,
100
                'view_role': None,
83 101
                'absence_reasons': [
84 102
                    {'id': reason.slug, 'slug': reason.slug, 'text': reason.label, 'label': reason.label},
85 103
                    {'id': reason2.slug, 'slug': reason2.slug, 'text': reason2.label, 'label': reason2.label},
86 104
                ],
87 105
                'api': {
88 106
                    'datetimes_url': 'http://testserver/api/agenda/foo-bar-3/datetimes/',
89 107
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar-3/fillslots/',
90 108
                },
91 109
            },
92 110
            {
93 111
                'text': 'Foo bar Meeting',
94 112
                'id': 'foo-bar-meeting',
95 113
                'slug': 'foo-bar-meeting',
96 114
                'minimal_booking_delay': 1,
97 115
                'maximal_booking_delay': 56,
116
                'edit_role': None,
117
                'view_role': 'View',
98 118
                'kind': 'meetings',
99 119
                'resources': [
100 120
                    {'id': 'resource-1', 'text': 'Resource 1', 'description': 'Foo bar Resource 1'},
101 121
                    {'id': 'resource-2', 'text': 'Resource 2', 'description': 'Foo bar Resource 2'},
102 122
                ],
103 123
                'api': {
104 124
                    'meetings_url': 'http://testserver/api/agenda/foo-bar-meeting/meetings/',
105 125
                    'desks_url': 'http://testserver/api/agenda/foo-bar-meeting/desks/',
......
108 128
                },
109 129
            },
110 130
            {
111 131
                'text': 'Foo bar Meeting 2',
112 132
                'id': 'foo-bar-meeting-2',
113 133
                'slug': 'foo-bar-meeting-2',
114 134
                'minimal_booking_delay': 1,
115 135
                'maximal_booking_delay': 56,
136
                'edit_role': None,
137
                'view_role': None,
116 138
                'kind': 'meetings',
117 139
                'resources': [],
118 140
                'api': {
119 141
                    'meetings_url': 'http://testserver/api/agenda/foo-bar-meeting-2/meetings/',
120 142
                    'desks_url': 'http://testserver/api/agenda/foo-bar-meeting-2/desks/',
121 143
                    'resources_url': 'http://testserver/api/agenda/foo-bar-meeting-2/resources/',
122 144
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar-meeting-2/fillslots/',
123 145
                },
124 146
            },
125 147
            {
126 148
                'text': 'Virtual Agenda',
127 149
                'id': 'virtual-agenda',
128 150
                'slug': 'virtual-agenda',
129 151
                'minimal_booking_delay': 1,
130 152
                'maximal_booking_delay': 56,
153
                'edit_role': 'Edit',
154
                'view_role': 'View',
131 155
                'kind': 'virtual',
132 156
                'api': {
133 157
                    'meetings_url': 'http://testserver/api/agenda/virtual-agenda/meetings/',
134 158
                    'desks_url': 'http://testserver/api/agenda/virtual-agenda/desks/',
135 159
                    'fillslots_url': 'http://testserver/api/agenda/virtual-agenda/fillslots/',
136 160
                },
137 161
            },
138
        ]
162
        ],
139 163
    }
140 164

  
141 165
    resp = app.get('/api/agenda/', params={'q': 'foo'})
142 166
    assert len(resp.json['data']) == 5
143 167
    resp = app.get('/api/agenda/', params={'q': 'MEET'})
144 168
    assert len(resp.json['data']) == 2
145 169
    resp = app.get('/api/agenda/', params={'q': ''})
146 170
    assert len(resp.json['data']) == 0
147 171

  
148 172
    with CaptureQueriesContext(connection) as ctx:
149 173
        resp = app.get('/api/agenda/')
150
        assert len(ctx.captured_queries) == 4
174
        assert len(ctx.captured_queries) == 8
151 175
    with CaptureQueriesContext(connection) as ctx:
152 176
        resp = app.get('/api/agenda/', params={'q': 'MEET'})
153
        assert len(ctx.captured_queries) == 2
177
        assert len(ctx.captured_queries) == 3
154 178

  
155 179
    resp = app.get('/api/agenda/', params={'with_open_events': '1'})
156 180
    assert len(resp.json['data']) == 0
157 181

  
158 182
    resp = app.get('/api/agenda/', params={'category': ''})
159 183
    assert len(resp.json['data']) == 6
160 184
    resp = app.get('/api/agenda/', params={'category': '__none__'})
161 185
    assert len(resp.json['data']) == 3
......
252 276
        TimePeriodException.objects.create(
253 277
            desk=event_agenda.desk_set.get(),
254 278
            start_datetime=now(),
255 279
            end_datetime=now() + datetime.timedelta(hours=1),
256 280
        )
257 281

  
258 282
    with CaptureQueriesContext(connection) as ctx:
259 283
        resp = app.get('/api/agenda/', params={'with_open_events': '1'})
260
        assert len(ctx.captured_queries) == 8
284
        assert len(ctx.captured_queries) == 9
261 285

  
262 286

  
263 287
def test_agendas_meetingtypes_api(app, some_data, meetings_agenda):
264 288
    resp = app.get('/api/agenda/%s/meetings/' % meetings_agenda.slug)
265 289
    expected_resp = {
266 290
        'data': [
267 291
            {
268 292
                'text': 'Blah',
......
470 494
    resp = app.get('/api/agenda/%s/' % virtual_meetings_agenda.slug)
471 495
    assert resp.json == {
472 496
        'data': {
473 497
            'text': 'Virtual Agenda',
474 498
            'id': 'virtual-agenda',
475 499
            'slug': 'virtual-agenda',
476 500
            'minimal_booking_delay': None,
477 501
            'maximal_booking_delay': None,
502
            'edit_role': None,
503
            'view_role': None,
478 504
            'kind': 'virtual',
479 505
            'api': {
480 506
                'meetings_url': 'http://testserver/api/agenda/%s/meetings/' % virtual_meetings_agenda.slug,
481 507
                'desks_url': 'http://testserver/api/agenda/%s/desks/' % virtual_meetings_agenda.slug,
482 508
                'fillslots_url': 'http://testserver/api/agenda/%s/fillslots/' % virtual_meetings_agenda.slug,
483 509
            },
484 510
        },
485 511
    }
486
-