Projet

Général

Profil

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

Nicolas Roche, 05 octobre 2021 18:35

Télécharger (11,7 ko)

Voir les différences:

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

 chrono/api/views.py   |  4 +++-
 tests/api/test_all.py | 41 ++++++++++++++++++++++++++++++++++-------
 2 files changed, 37 insertions(+), 8 deletions(-)
chrono/api/views.py
348 348
def get_agenda_detail(request, agenda, check_events=False):
349 349
    agenda_detail = {
350 350
        'id': agenda.slug,
351 351
        'slug': agenda.slug,  # kept for compatibility
352 352
        'text': agenda.label,
353 353
        'kind': agenda.kind,
354 354
        'minimal_booking_delay': agenda.minimal_booking_delay,
355 355
        'maximal_booking_delay': agenda.maximal_booking_delay,
356
        'edit_role': agenda.edit_role.name if agenda.edit_role else None,
357
        'view_role': agenda.view_role.name if agenda.view_role else None,
356 358
    }
357 359

  
358 360
    if agenda.kind == 'meetings':
359 361
        agenda_detail['resources'] = [
360 362
            {'id': r.slug, 'text': r.label, 'description': r.description} for r in agenda.resources.all()
361 363
        ]
362 364
    if agenda.kind == 'events':
363 365
        agenda_detail['api'] = {
......
718 720
        for agenda in agendas_queryset:
719 721
            if with_open_events and not any(
720 722
                not e.full for e in agenda.get_open_events(prefetched_queryset=True)
721 723
            ):
722 724
                # exclude agendas without open events
723 725
                continue
724 726
            agendas.append(get_agenda_detail(request, agenda))
725 727

  
726
        return Response({'data': agendas})
728
        return Response({'err': 0, 'data': agendas})
727 729

  
728 730

  
729 731
agendas = Agendas.as_view()
730 732

  
731 733

  
732 734
class AgendaDetail(APIView):
733 735
    """
734 736
    Retrieve an agenda instance.
tests/api/test_all.py
1 1
import datetime
2 2

  
3 3
import pytest
4
from django.contrib.auth.models import Group
4 5
from django.db import connection
5 6
from django.test.utils import CaptureQueriesContext
6 7
from django.utils.timezone import localtime, now
7 8

  
8 9
from chrono.agendas.models import (
9 10
    AbsenceReason,
10 11
    AbsenceReasonGroup,
11 12
    Agenda,
......
17 18
    TimePeriodException,
18 19
    VirtualMember,
19 20
)
20 21

  
21 22
pytestmark = pytest.mark.django_db
22 23

  
23 24

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

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

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

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

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

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

  
262 287

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