api: take snapshots (#87498)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Lauréline Guérin 2024-02-27 11:43:26 +01:00
parent 176d23aa4b
commit 03f9172c98
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 25 additions and 2 deletions

View File

@ -571,6 +571,7 @@ class Agendas(APIView):
if agenda.kind == 'events':
desk = Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
desk.import_timeperiod_exceptions_from_settings()
agenda.take_snapshot(request=self.request, comment=pgettext('snapshot', 'created'))
return Response({'err': 0, 'data': [get_agenda_detail(request, agenda)]})
@ -595,6 +596,7 @@ class AgendaAPI(APIView):
if has_bookings:
raise APIError(_('This cannot be removed as there are bookings for a future date.'))
agenda.take_snapshot(request=self.request, deletion=True)
agenda.delete()
return Response({'err': 0})
@ -608,7 +610,8 @@ class AgendaAPI(APIView):
if 'kind' in serializer.validated_data and serializer.validated_data['kind'] != agenda.kind:
raise APIErrorBadRequest(N_('it is not possible to change kind value'))
serializer.save()
agenda = serializer.save()
agenda.take_snapshot(request=self.request)
return self.get(request, agenda_identifier)
@ -3201,6 +3204,7 @@ class EventsAPI(APIView):
event = serializer.save()
if event.recurrence_days:
event.create_all_recurrences()
agenda.take_snapshot(request=self.request, comment=_('added event (%s)') % event)
return Response({'err': 0, 'data': get_event_detail(request, event)})
@ -3259,6 +3263,7 @@ class EventAPI(APIView):
changed_data, payload, protected_fields, protected_fields + ['recurrence_end_date']
):
event = serializer.save()
event.agenda.take_snapshot(request=self.request, comment=_('changed event (%s)') % event)
return Response({'err': 0, 'data': get_event_detail(request, event)})
def delete(self, request, agenda_identifier, event_identifier):
@ -3274,6 +3279,7 @@ class EventAPI(APIView):
raise APIError(_('This cannot be removed as there are bookings for a future date.'))
event.delete()
event.agenda.take_snapshot(request=self.request, comment=_('removed event (%s)') % event)
return Response({'err': 0})

View File

@ -15,6 +15,7 @@ from chrono.agendas.models import (
Resource,
TimePeriodException,
)
from chrono.apps.snapshot.models import AgendaSnapshot
from chrono.utils.timezone import localtime, now
pytestmark = pytest.mark.django_db
@ -449,6 +450,7 @@ def test_agenda_api_delete(app, user):
resp = app.delete('/api/agenda/%s/' % agenda.slug)
assert resp.json['err'] == 0
assert not Agenda.objects.exists()
assert AgendaSnapshot.objects.count() == 1
def test_agenda_api_delete_busy(app, user):
@ -562,6 +564,7 @@ def test_add_agenda(app, user, settings):
agenda = Agenda.objects.get(slug='my-agenda')
assert agenda.kind == 'events'
assert agenda.partial_bookings is False
assert AgendaSnapshot.objects.count() == 1
settings.WORKING_DAY_CALENDAR = 'workalendar.europe.France'
edit_group = Group.objects.create(name='Edit')
@ -672,6 +675,7 @@ def test_add_agenda_partial_bookings(app, user, settings):
def test_patch_agenda(app, user):
Category.objects.create(label='Category A')
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app.authorization = ('Basic', ('john.doe', 'password'))
@ -680,6 +684,7 @@ def test_patch_agenda(app, user):
assert resp.json['data']['text'] == 'Foo bar'
assert resp.json['data']['kind'] == 'events'
assert resp.json['data']['category'] is None
assert AgendaSnapshot.objects.count() == 1
resp = app.patch_json('/api/agenda/%s/' % agenda.slug, params={'label': 'Test', 'kind': 'events'})
assert resp.json['data']['id'] == 'foo-bar'

View File

@ -5,7 +5,8 @@ import pytest
from django.db import connection
from django.test.utils import CaptureQueriesContext
from chrono.agendas.models import Agenda, Booking, BookingCheck, Event, EventsType, Subscription
from chrono.agendas.models import Agenda, Booking, BookingCheck, Desk, Event, EventsType, Subscription
from chrono.apps.snapshot.models import AgendaSnapshot
from chrono.utils.timezone import localtime, make_aware, now
pytestmark = pytest.mark.django_db
@ -248,6 +249,7 @@ def test_string_or_list_serialiser(app, user, days_in, days_out, err_msg):
agenda = Agenda(label='Foo bar')
agenda.maximal_booking_delay = 0
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
api_url = '/api/agenda/%s/event/' % (agenda.slug)
params = {
@ -292,6 +294,7 @@ def test_add_event(app, user):
assert resp.json['detail'] == 'Not found.'
agenda = Agenda.objects.create(label='Foo bar', maximal_booking_delay=0)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
api_url = '/api/agenda/%s/event/' % (agenda.slug)
# missing fields
@ -330,6 +333,7 @@ def test_add_event(app, user):
assert event.places == 10
assert event.publication_datetime is None
assert event.custom_fields == {}
assert AgendaSnapshot.objects.count() == 1
# add an event without custom fields
events_type = EventsType.objects.create(
@ -505,6 +509,7 @@ def test_add_event(app, user):
@pytest.mark.freeze_time('2023-03-09')
def test_add_event_end_datetime(app, user):
agenda = Agenda.objects.create(label='Foo bar', maximal_booking_delay=0)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
api_url = '/api/agenda/%s/event/' % (agenda.slug)
app.authorization = ('Basic', ('john.doe', 'password'))
@ -552,6 +557,7 @@ def test_update_event(app, user):
],
)
agenda = Agenda.objects.create(label='Foo bar', events_type=events_type)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
# missing event
api_url = '/api/agenda/%s/event/%s/' % (agenda.slug, 'nop')
@ -601,6 +607,7 @@ def test_update_event(app, user):
'textarea': '',
'bool': None,
}
assert AgendaSnapshot.objects.count() == 1
# update event as a recurring event
params = {
@ -774,6 +781,7 @@ def test_update_event(app, user):
def test_event_read_only_fields(app, user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
agenda2 = Agenda.objects.create(label='Foo bar 2', kind='events')
event = Event.objects.create(
slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
@ -812,6 +820,7 @@ def test_event_read_only_fields(app, user):
@pytest.mark.freeze_time('2021-11-01 10:00')
def test_delete_event(app, user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
)
@ -824,11 +833,13 @@ def test_delete_event(app, user):
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 0
assert not Event.objects.exists()
assert AgendaSnapshot.objects.count() == 1
@pytest.mark.freeze_time('2021-11-01 10:00')
def test_delete_event_forbidden(app, user, freezer):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
)
@ -862,6 +873,7 @@ def test_delete_event_forbidden(app, user, freezer):
@pytest.mark.freeze_time('2021-11-01 10:00')
def test_delete_recurring_event_forbidden(app, user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
start_datetime = now() + datetime.timedelta(days=10)
event = Event.objects.create(
start_datetime=start_datetime,