Projet

Général

Profil

0005-api-add-resources-list-on-agenda-details-38942.patch

Lauréline Guérin, 29 mai 2020 17:10

Télécharger (7,79 ko)

Voir les différences:

Subject: [PATCH 5/8] api: add resources list on agenda details (#38942)

 chrono/api/views.py |  6 +++-
 tests/test_api.py   | 74 ++++++++++++++++++++++++++++++++-------------
 2 files changed, 58 insertions(+), 22 deletions(-)
chrono/api/views.py
233 233
        'maximal_booking_delay': agenda.maximal_booking_delay,
234 234
    }
235 235

  
236
    if agenda.kind == 'meetings':
237
        agenda_detail['resources'] = [
238
            {'id': r.slug, 'text': r.label, 'description': r.description} for r in agenda.resources.all()
239
        ]
236 240
    if agenda.kind == 'events':
237 241
        agenda_detail['api'] = {
238 242
            'datetimes_url': request.build_absolute_uri(
......
279 283
    permission_classes = ()
280 284

  
281 285
    def get(self, request, format=None):
282
        agendas_queryset = Agenda.objects.all().order_by('label')
286
        agendas_queryset = Agenda.objects.all().prefetch_related('resources').order_by('label')
283 287
        if 'q' in request.GET:
284 288
            if not request.GET['q']:
285 289
                return Response({'data': []})
tests/test_api.py
14 14

  
15 15
from chrono.agendas.models import (
16 16
    Agenda,
17
    Event,
18 17
    Booking,
18
    Desk,
19
    Event,
19 20
    MeetingType,
21
    Resource,
20 22
    TimePeriod,
21
    Desk,
22 23
    TimePeriodException,
23 24
    VirtualMember,
24 25
)
......
127 128
    return agenda
128 129

  
129 130

  
130
def test_agendas_api(app, some_data, meetings_agenda):
131
    agenda1 = Agenda.objects.filter(label=u'Foo bar')[0]
132
    agenda2 = Agenda.objects.filter(label=u'Foo bar 2')[0]
133
    virtual_agenda = Agenda.objects.create(
131
def test_agendas_api(app):
132
    Agenda.objects.create(label='Foo bar')
133
    Agenda.objects.create(label='Foo bar 2')
134
    meetings_agenda1 = Agenda.objects.create(label='Foo bar Meeting', kind='meetings')
135
    Agenda.objects.create(label='Foo bar Meeting 2', kind='meetings')
136
    resource1 = Resource.objects.create(label='Resource 1', description='Foo bar Resource 1')
137
    resource2 = Resource.objects.create(label='Resource 2', description='Foo bar Resource 2')
138
    Resource.objects.create(label='Resource 3')
139
    meetings_agenda1.resources.add(resource1, resource2)
140
    Agenda.objects.create(
134 141
        label='Virtual Agenda', kind='virtual', minimal_booking_delay=1, maximal_booking_delay=56
135 142
    )
136 143
    resp = app.get('/api/agenda/')
......
138 145
        'data': [
139 146
            {
140 147
                'text': 'Foo bar',
141
                'id': u'foo-bar',
148
                'id': 'foo-bar',
142 149
                'slug': 'foo-bar',
143 150
                'kind': 'events',
144 151
                'minimal_booking_delay': 1,
145 152
                'maximal_booking_delay': 56,
146 153
                'api': {
147
                    'datetimes_url': 'http://testserver/api/agenda/%s/datetimes/' % agenda1.slug,
148
                    'fillslots_url': 'http://testserver/api/agenda/%s/fillslots/' % agenda1.slug,
154
                    'datetimes_url': 'http://testserver/api/agenda/foo-bar/datetimes/',
155
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar/fillslots/',
149 156
                },
150 157
            },
151 158
            {
152 159
                'text': 'Foo bar 2',
153
                'id': u'foo-bar-2',
160
                'id': 'foo-bar-2',
154 161
                'kind': 'events',
155 162
                'slug': 'foo-bar-2',
156 163
                'minimal_booking_delay': 1,
157 164
                'maximal_booking_delay': 56,
158 165
                'api': {
159
                    'datetimes_url': 'http://testserver/api/agenda/%s/datetimes/' % agenda2.slug,
160
                    'fillslots_url': 'http://testserver/api/agenda/%s/fillslots/' % agenda2.slug,
166
                    'datetimes_url': 'http://testserver/api/agenda/foo-bar-2/datetimes/',
167
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar-2/fillslots/',
161 168
                },
162 169
            },
163 170
            {
164 171
                'text': 'Foo bar Meeting',
165
                'id': u'foo-bar-meeting',
172
                'id': 'foo-bar-meeting',
166 173
                'slug': 'foo-bar-meeting',
167 174
                'minimal_booking_delay': 1,
168 175
                'maximal_booking_delay': 56,
169 176
                'kind': 'meetings',
177
                'resources': [
178
                    {'id': 'resource-1', 'text': 'Resource 1', 'description': 'Foo bar Resource 1'},
179
                    {'id': 'resource-2', 'text': 'Resource 2', 'description': 'Foo bar Resource 2'},
180
                ],
170 181
                'api': {
171
                    'meetings_url': 'http://testserver/api/agenda/%s/meetings/' % meetings_agenda.slug,
172
                    'desks_url': 'http://testserver/api/agenda/%s/desks/' % meetings_agenda.slug,
173
                    'fillslots_url': 'http://testserver/api/agenda/%s/fillslots/' % meetings_agenda.slug,
182
                    'meetings_url': 'http://testserver/api/agenda/foo-bar-meeting/meetings/',
183
                    'desks_url': 'http://testserver/api/agenda/foo-bar-meeting/desks/',
184
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar-meeting/fillslots/',
185
                },
186
            },
187
            {
188
                'text': 'Foo bar Meeting 2',
189
                'id': 'foo-bar-meeting-2',
190
                'slug': 'foo-bar-meeting-2',
191
                'minimal_booking_delay': 1,
192
                'maximal_booking_delay': 56,
193
                'kind': 'meetings',
194
                'resources': [],
195
                'api': {
196
                    'meetings_url': 'http://testserver/api/agenda/foo-bar-meeting-2/meetings/',
197
                    'desks_url': 'http://testserver/api/agenda/foo-bar-meeting-2/desks/',
198
                    'fillslots_url': 'http://testserver/api/agenda/foo-bar-meeting-2/fillslots/',
174 199
                },
175 200
            },
176 201
            {
......
181 206
                'maximal_booking_delay': 56,
182 207
                'kind': 'virtual',
183 208
                'api': {
184
                    'meetings_url': 'http://testserver/api/agenda/%s/meetings/' % virtual_agenda.slug,
185
                    'desks_url': 'http://testserver/api/agenda/%s/desks/' % virtual_agenda.slug,
186
                    'fillslots_url': 'http://testserver/api/agenda/%s/fillslots/' % virtual_agenda.slug,
209
                    'meetings_url': 'http://testserver/api/agenda/virtual-agenda/meetings/',
210
                    'desks_url': 'http://testserver/api/agenda/virtual-agenda/desks/',
211
                    'fillslots_url': 'http://testserver/api/agenda/virtual-agenda/fillslots/',
187 212
                },
188 213
            },
189 214
        ]
190 215
    }
191 216

  
192 217
    resp = app.get('/api/agenda/', params={'q': 'foo'})
193
    assert len(resp.json['data']) == 3
218
    assert len(resp.json['data']) == 4
194 219
    resp = app.get('/api/agenda/', params={'q': 'MEET'})
195
    assert len(resp.json['data']) == 1
220
    assert len(resp.json['data']) == 2
196 221
    resp = app.get('/api/agenda/', params={'q': ''})
197 222
    assert len(resp.json['data']) == 0
198 223

  
224
    with CaptureQueriesContext(connection) as ctx:
225
        resp = app.get('/api/agenda/')
226
        assert len(ctx.captured_queries) == 3
227
    with CaptureQueriesContext(connection) as ctx:
228
        resp = app.get('/api/agenda/', params={'q': 'MEET'})
229
        assert len(ctx.captured_queries) == 2
230

  
199 231

  
200 232
def test_agendas_meetingtypes_api(app, some_data, meetings_agenda):
201 233
    resp = app.get('/api/agenda/%s/meetings/' % meetings_agenda.slug)
202
-