Projet

Général

Profil

0002-api-endpoint-to-check-an-event-53932.patch

Lauréline Guérin, 11 juin 2021 14:37

Télécharger (6,36 ko)

Voir les différences:

Subject: [PATCH 2/2] api: endpoint to check an event (#53932)

 chrono/api/urls.py      |  5 ++++
 chrono/api/views.py     | 35 ++++++++++++++++++++++++-
 tests/api/test_event.py | 57 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 96 insertions(+), 1 deletion(-)
chrono/api/urls.py
38 38
        views.slot_bookings,
39 39
        name='api-event-bookings',
40 40
    ),
41
    url(
42
        r'^agenda/(?P<agenda_identifier>[\w-]+)/check/(?P<event_identifier>[\w:-]+)/$',
43
        views.slot_check,
44
        name='api-event-check',
45
    ),
41 46
    url(
42 47
        r'^agenda/meetings/(?P<meeting_identifier>[\w-]+)/datetimes/$',
43 48
        views.meeting_datetimes,
chrono/api/views.py
451 451
            event.label,
452 452
            date_format(localtime(event.start_datetime), 'DATETIME_FORMAT'),
453 453
        )
454
    return {
454
    details = {
455 455
        'id': event.slug,
456 456
        'slug': event.slug,  # kept for compatibility
457 457
        'text': event_text,
......
479 479
                    kwargs={'agenda_identifier': agenda.slug, 'event_identifier': event.slug},
480 480
                )
481 481
            ),
482
            'check_url': request.build_absolute_uri(
483
                reverse(
484
                    'api-event-check',
485
                    kwargs={'agenda_identifier': agenda.slug, 'event_identifier': event.slug},
486
                )
487
            ),
482 488
        },
483 489
        'places': get_event_places(event),
484 490
    }
491
    return details
485 492

  
486 493

  
487 494
def get_events_meta_detail(request, events, agenda=None, min_places=1):
......
1965 1972
slot_status = SlotStatus.as_view()
1966 1973

  
1967 1974

  
1975
class SlotCheck(APIView):
1976
    permission_classes = (permissions.IsAuthenticated,)
1977

  
1978
    def get_object(self, agenda_identifier, event_identifier):
1979
        agenda = get_object_or_404(Agenda, slug=agenda_identifier, kind='events')
1980
        if ':' in event_identifier:
1981
            return get_event_recurrence(agenda, event_identifier)
1982
        try:
1983
            return agenda.event_set.get(slug=event_identifier)
1984
        except Event.DoesNotExist:
1985
            raise Http404()
1986

  
1987
    def post(self, request, agenda_identifier=None, event_identifier=None, format=None):
1988
        event = self.get_object(agenda_identifier, event_identifier)
1989
        if not event.checked:
1990
            event.checked = True
1991
            event.save(update_fields=['checked'])
1992
        response = {
1993
            'err': 0,
1994
        }
1995
        return Response(response)
1996

  
1997

  
1998
slot_check = SlotCheck.as_view()
1999

  
2000

  
1968 2001
class SlotBookings(APIView):
1969 2002
    permission_classes = (permissions.IsAuthenticated,)
1970 2003

  
tests/api/test_event.py
50 50
            'bookings_url': 'http://testserver/api/agenda/foo-bar/bookings/event-slug/',
51 51
            'fillslot_url': 'http://testserver/api/agenda/foo-bar/fillslot/event-slug/',
52 52
            'status_url': 'http://testserver/api/agenda/foo-bar/status/event-slug/',
53
            'check_url': 'http://testserver/api/agenda/foo-bar/check/event-slug/',
53 54
        },
54 55
        'places': {'available': 9, 'reserved': 1, 'total': 10, 'full': False, 'has_waiting_list': False},
55 56
    }
......
71 72
        app.get('/api/agenda/%s/status/%s/' % (agenda.slug, event.slug), status=404)
72 73

  
73 74

  
75
@pytest.mark.freeze_time('2021-02-23')
74 76
def test_status_url(app, user):
75 77
    agenda = Agenda.objects.create(label='Foo bar', kind='events', minimal_booking_delay=0)
76 78
    event = Event.objects.create(
......
98 100
    app.get('/api/agenda/%s/status/%s/' % (0, event.slug), status=404)
99 101
    app.get('/api/agenda/%s/status/%s/' % ('foobar', event.pk), status=404)
100 102
    app.get('/api/agenda/%s/status/%s/' % ('foobar', event.slug), status=404)
103

  
104
    # recurring event
105
    event = Event.objects.create(
106
        slug='recurrent',
107
        start_datetime=localtime().replace(hour=12, minute=0),
108
        repeat='weekly',
109
        places=2,
110
        agenda=agenda,
111
    )
112
    app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=404)
113
    app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 'recurrent:2021-02-23-1200'), status=200)
114
    app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=200)
115

  
116

  
117
@pytest.mark.freeze_time('2021-02-23')
118
def test_event_checked(app, user):
119
    agenda = Agenda.objects.create(label='Events', kind='events')
120
    event = Event.objects.create(
121
        label='xyz',
122
        start_datetime=now() - datetime.timedelta(days=1),
123
        places=10,
124
        agenda=agenda,
125
    )
126
    assert event.checked is False
127

  
128
    app.authorization = ('Basic', ('john.doe', 'password'))
129

  
130
    app.post('/api/agenda/%s/check/%s/' % (agenda.slug, event.slug))
131
    event.refresh_from_db()
132
    assert event.checked is True
133

  
134
    # already checked
135
    app.post('/api/agenda/%s/check/%s/' % (agenda.slug, event.slug))
136
    event.refresh_from_db()
137
    assert event.checked is True
138

  
139
    # recurring event
140
    event = Event.objects.create(
141
        slug='recurrent',
142
        start_datetime=localtime().replace(hour=12, minute=0),
143
        repeat='weekly',
144
        places=2,
145
        agenda=agenda,
146
    )
147
    app.post('/api/agenda/%s/check/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=404)
148
    app.post('/api/agenda/%s/check/%s/' % (agenda.slug, 'recurrent:2021-02-23-1200'), status=200)
149
    app.post('/api/agenda/%s/check/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=200)
150

  
151
    # wrong kind
152
    agenda.kind = 'meetings'
153
    agenda.save()
154
    app.post('/api/agenda/%s/check/%s/' % (agenda.slug, event.slug), status=404)
155
    agenda.kind = 'virtual'
156
    agenda.save()
157
    app.post('/api/agenda/%s/check/%s/' % (agenda.slug, event.slug), status=404)
101
-