0002-api-endpoint-to-check-an-event-53932.patch
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 |
- |