Projet

Général

Profil

0001-api-add-agenda-detail-api-17188.patch

Josué Kouka, 26 juin 2017 17:23

Télécharger (4,22 ko)

Voir les différences:

Subject: [PATCH] api: add agenda detail api (#17188)

 chrono/api/urls.py  |  1 +
 chrono/api/views.py | 57 ++++++++++++++++++++++++++++++++---------------------
 tests/test_api.py   | 11 +++++++++++
 3 files changed, 46 insertions(+), 23 deletions(-)
chrono/api/urls.py
20 20

  
21 21
urlpatterns = [
22 22
    url(r'agenda/$', views.agendas),
23
    url(r'agenda/(?P<agenda_identifier>[\w-]+)/$', views.agenda),
23 24

  
24 25
    url(r'agenda/(?P<agenda_identifier>[\w-]+)/datetimes/$', views.datetimes, name='api-agenda-datetimes'),
25 26
    url(r'agenda/(?P<agenda_identifier>[\w-]+)/fillslot/(?P<event_pk>[\w:-]+)/$',
chrono/api/views.py
29 29
from ..agendas.models import Agenda, Event, Booking, MeetingType, TimePeriod
30 30

  
31 31

  
32
def get_agenda_data(request, agenda):
33
    agenda_data = {
34
        'id': agenda.id,
35
        'slug': agenda.slug,
36
        'text': agenda.label,
37
        'kind': agenda.kind,
38
    }
39

  
40
    if agenda.kind == 'events':
41
        agenda_data['api'] = {
42
            'datetimes_url': request.build_absolute_uri(
43
                reverse('api-agenda-datetimes',
44
                        kwargs={'agenda_identifier': agenda.slug}))
45
        }
46
    elif agenda.kind == 'meetings':
47
        agenda_data['api'] = {
48
            'meetings_url': request.build_absolute_uri(
49
                reverse('api-agenda-meetings',
50
                        kwargs={'agenda_identifier': agenda.slug}))
51
        }
52
    return agenda_data
53

  
32 54
class Agendas(GenericAPIView):
33 55
    permission_classes = ()
34 56

  
35 57
    def get(self, request, format=None):
36
        agendas = []
37
        for agenda in Agenda.objects.all().order_by('label'):
38
            agenda_data = {
39
                'id': agenda.id,
40
                'slug': agenda.slug,
41
                'text': agenda.label,
42
                'kind': agenda.kind,
43
            }
44

  
45
            if agenda.kind == 'events':
46
                agenda_data['api'] = {
47
                    'datetimes_url': request.build_absolute_uri(
48
                        reverse('api-agenda-datetimes',
49
                            kwargs={'agenda_identifier': agenda.slug}))
50
                }
51
            elif agenda.kind == 'meetings':
52
                agenda_data['api'] = {
53
                    'meetings_url': request.build_absolute_uri(
54
                        reverse('api-agenda-meetings',
55
                            kwargs={'agenda_identifier': agenda.slug}))
56
                }
57
            agendas.append(agenda_data)
58

  
58
        agendas = [get_agenda_data(request, agenda) for agenda in Agenda.objects.all().order_by('label')]
59 59
        return Response({'data': agendas})
60 60

  
61 61
agendas = Agendas.as_view()
62 62

  
63
class AgendaDetail(GenericAPIView):
64
    """View returning detail of a single agenda
65
    """
66
    permission_classes = ()
67

  
68
    def get(self, request, agenda_identifier):
69
        agenda = get_object_or_404(Agenda, slug=agenda_identifier)
70
        return Response({
71
            'data': get_agenda_data(request, agenda)})
72

  
73
agenda = AgendaDetail.as_view()
63 74

  
64 75
class Datetimes(GenericAPIView):
65 76
    permission_classes = ()
tests/test_api.py
588 588
    resp = app.post(resp3.json['api']['accept_url'])
589 589
    assert event.booked_places == 7
590 590
    assert event.waiting_list == 0
591

  
592
def test_agenda_api(app, some_data):
593
    app.get('/api/agenda/whatever/', status=404)
594
    agenda = Agenda.objects.get(slug='foo-bar')
595
    resp = app.get('/api/agenda/%s/' % agenda.slug)
596
    data = resp.json['data']
597
    assert data['id'] == 1
598
    assert data['slug'] == 'foo-bar'
599
    assert data['text'] == 'Foo bar'
600
    assert data['kind'] == 'events'
601
    assert data['api']['datetimes_url'] == 'http://testserver/api/agenda/foo-bar/datetimes/'
591
-