0001-api-add-agenda-deletion-59127.patch
chrono/api/urls.py | ||
---|---|---|
28 | 28 |
views.agendas_events_fillslots, |
29 | 29 |
name='api-agendas-events-fillslots', |
30 | 30 |
), |
31 |
url(r'^agenda/(?P<agenda_identifier>[\w-]+)/$', views.agenda_detail),
|
|
31 |
url(r'^agenda/(?P<agenda_identifier>[\w-]+)/$', views.agenda), |
|
32 | 32 |
url(r'^agenda/(?P<agenda_identifier>[\w-]+)/datetimes/$', views.datetimes, name='api-agenda-datetimes'), |
33 | 33 |
url( |
34 | 34 |
r'^agenda/(?P<agenda_identifier>[\w-]+)/fillslot/(?P<event_identifier>[\w:-]+)/$', |
chrono/api/views.py | ||
---|---|---|
757 | 757 |
agendas = Agendas.as_view() |
758 | 758 | |
759 | 759 | |
760 |
class AgendaDetail(APIView): |
|
761 |
""" |
|
762 |
Retrieve an agenda instance. |
|
763 |
""" |
|
764 | ||
765 |
permission_classes = () |
|
760 |
class AgendaAPI(APIView): |
|
761 |
permission_classes = (permissions.IsAuthenticatedOrReadOnly,) |
|
766 | 762 | |
767 | 763 |
def get(self, request, agenda_identifier): |
768 | 764 |
agenda = get_object_or_404(Agenda, slug=agenda_identifier) |
769 | 765 |
return Response({'data': get_agenda_detail(request, agenda, check_events=True)}) |
770 | 766 | |
767 |
def delete(self, request, agenda_identifier): |
|
768 |
agenda = get_object_or_404(Agenda, slug=agenda_identifier) |
|
769 | ||
770 |
has_bookings = Booking.objects.filter( |
|
771 |
event__agenda=agenda, event__start_datetime__gt=now(), cancellation_datetime__isnull=True |
|
772 |
).exists() |
|
773 | ||
774 |
if has_bookings: |
|
775 |
raise APIError(_('This cannot be removed as there are bookings for a future date.')) |
|
776 | ||
777 |
agenda.delete() |
|
778 |
return Response({'err': 0}) |
|
779 | ||
771 | 780 | |
772 |
agenda_detail = AgendaDetail.as_view()
|
|
781 |
agenda = AgendaAPI.as_view()
|
|
773 | 782 | |
774 | 783 | |
775 | 784 |
class Datetimes(APIView): |
tests/api/test_all.py | ||
---|---|---|
10 | 10 |
AbsenceReason, |
11 | 11 |
AbsenceReasonGroup, |
12 | 12 |
Agenda, |
13 |
Booking, |
|
13 | 14 |
Category, |
14 | 15 |
Desk, |
15 | 16 |
Event, |
... | ... | |
525 | 526 |
} |
526 | 527 | |
527 | 528 | |
529 |
def test_agenda_api_delete(app, user): |
|
530 |
agenda = Agenda.objects.create(label='Foo bar', kind='events') |
|
531 | ||
532 |
# unauthenticated |
|
533 |
resp = app.delete('/api/agenda/%s/' % agenda.slug, status=401) |
|
534 |
assert Agenda.objects.count() == 1 |
|
535 | ||
536 |
app.authorization = ('Basic', ('john.doe', 'password')) |
|
537 |
resp = app.delete('/api/agenda/%s/' % agenda.slug) |
|
538 |
assert resp.json['err'] == 0 |
|
539 |
assert not Agenda.objects.exists() |
|
540 | ||
541 | ||
542 |
def test_agenda_api_delete_busy(app, user): |
|
543 |
agenda = Agenda.objects.create(label='Foo bar', kind='events') |
|
544 |
Desk.objects.create(agenda=agenda, slug='_exceptions_holder') |
|
545 |
event = Event.objects.create(start_datetime=now() + datetime.timedelta(days=10), places=10, agenda=agenda) |
|
546 |
booking = Booking.objects.create(event=event) |
|
547 | ||
548 |
app.authorization = ('Basic', ('john.doe', 'password')) |
|
549 |
resp = app.delete('/api/agenda/%s/' % agenda.slug) |
|
550 |
assert resp.json['err'] == 1 |
|
551 |
assert 'This cannot be removed' in resp.json['err_desc'] |
|
552 | ||
553 |
booking.cancellation_datetime = now() |
|
554 |
booking.save() |
|
555 |
resp = app.delete('/api/agenda/%s/' % agenda.slug) |
|
556 |
assert resp.json['err'] == 0 |
|
557 |
assert not Agenda.objects.exists() |
|
558 | ||
559 | ||
528 | 560 |
def test_virtual_agendas_meetingtypes_api(app): |
529 | 561 |
virt_agenda = Agenda.objects.create(label='Virtual agenda', kind='virtual') |
530 | 562 | |
531 |
- |