agendas: remove code creating event recurrence on the fly (#62635)

This commit is contained in:
Valentin Deniaud 2022-03-17 12:10:09 +01:00
parent 11fa0802ec
commit d707c0569c
5 changed files with 12 additions and 95 deletions

View File

@ -591,22 +591,6 @@ def get_events_meta_detail(
}
def get_event_recurrence(agenda, event_identifier):
event_slug, datetime_str = event_identifier.split(':')
try:
start_datetime = make_aware(datetime.datetime.strptime(datetime_str, '%Y-%m-%d-%H%M'))
except ValueError:
raise APIErrorBadRequest(N_('bad datetime format: %s'), datetime_str)
try:
event = agenda.event_set.get(slug=event_slug)
except Event.DoesNotExist:
raise APIErrorBadRequest(N_('unknown recurring event slug: %s'), event_slug)
try:
return event.get_or_create_event_recurrence(start_datetime)
except ValueError:
raise APIErrorBadRequest(N_('invalid datetime for event %s'), event_identifier)
def get_events_from_slots(slots, request, agenda, payload):
user_external_id = payload.get('user_external_id') or None
exclude_user = payload.get('exclude_user')
@ -615,13 +599,6 @@ def get_events_from_slots(slots, request, agenda, payload):
book_future = book_events in ['all', 'future']
bypass_delays = payload.get('bypass_delays')
# convert event recurrence identifiers to real event slugs
for i, slot in enumerate(slots.copy()):
if ':' not in slot:
continue
event = get_event_recurrence(agenda, slot)
slots[i] = event.slug
try:
events = agenda.event_set.filter(id__in=[int(s) for s in slots]).order_by('start_datetime')
except ValueError:
@ -2476,8 +2453,6 @@ class EventAPI(APIView):
def get_object(self, agenda_identifier, event_identifier):
agenda = get_object_or_404(Agenda, slug=agenda_identifier, kind='events')
if ':' in event_identifier:
return get_event_recurrence(agenda, event_identifier)
try:
return agenda.event_set.get(slug=event_identifier)
except Event.DoesNotExist:
@ -2557,8 +2532,6 @@ class EventStatus(APIView):
agenda = Agenda.objects.get(pk=agenda_identifier, kind='events')
except (ValueError, Agenda.DoesNotExist):
raise Http404()
if ':' in event_identifier:
return get_event_recurrence(agenda, event_identifier)
try:
return agenda.event_set.get(slug=event_identifier)
except Event.DoesNotExist:
@ -2585,8 +2558,6 @@ class EventCheck(APIView):
def get_object(self, agenda_identifier, event_identifier):
agenda = get_object_or_404(Agenda, slug=agenda_identifier, kind='events')
if ':' in event_identifier:
return get_event_recurrence(agenda, event_identifier)
try:
return agenda.event_set.get(slug=event_identifier)
except Event.DoesNotExist:
@ -2610,9 +2581,6 @@ class EventBookings(APIView):
permission_classes = (permissions.IsAuthenticated,)
def get_object(self, agenda_identifier, event_identifier):
if ':' in event_identifier:
agenda = get_object_or_404(Agenda, slug=agenda_identifier, kind='events')
return get_event_recurrence(agenda, event_identifier)
return get_object_or_404(
Event, slug=event_identifier, agenda__slug=agenda_identifier, agenda__kind='events'
)

View File

@ -251,11 +251,6 @@ urlpatterns = [
views.event_cancellation_report_list,
name='chrono-manager-event-cancellation-report-list',
),
url(
r'^agendas/(?P<pk>\d+)/create_event_recurrence/(?P<event_identifier>[\w:-]+)/$',
views.event_create_recurrence,
name='chrono-manager-event-create-recurrence',
),
url(
r'^agendas/(?P<pk>\d+)/add-resource/$',
views.agenda_add_resource,

View File

@ -3135,24 +3135,6 @@ class EventCancellationReportListView(ViewableAgendaMixin, ListView):
event_cancellation_report_list = EventCancellationReportListView.as_view()
class EventCreateRecurrenceView(ViewableAgendaMixin, RedirectView):
def get_redirect_url(self, *args, **kwargs):
event_slug, datetime_str = kwargs['event_identifier'].split(':')
try:
start_datetime = make_aware(datetime.datetime.strptime(datetime_str, '%Y-%m-%d-%H%M'))
except ValueError:
raise Http404()
event = self.agenda.event_set.get(slug=event_slug)
try:
event_recurrence = event.get_or_create_event_recurrence(start_datetime)
except ValueError:
raise Http404()
return event_recurrence.get_absolute_view_url()
event_create_recurrence = EventCreateRecurrenceView.as_view()
class TimePeriodExceptionSourceToggleView(ManagedDeskSubobjectMixin, DetailView):
model = TimePeriodExceptionSource

View File

@ -104,19 +104,6 @@ def test_status_url(app, user):
app.get('/api/agenda/%s/status/%s/' % ('foobar', event.pk), status=404)
app.get('/api/agenda/%s/status/%s/' % ('foobar', event.slug), status=404)
# recurring event
start_datetime = localtime().replace(hour=12, minute=0)
event = Event.objects.create(
slug='recurrent',
start_datetime=start_datetime,
recurrence_days=[start_datetime.weekday()],
places=2,
agenda=agenda,
)
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=404)
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 'recurrent:2021-02-23-1200'), status=200)
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=200)
@pytest.mark.freeze_time('2021-02-23')
def test_event_checked(app, user):
@ -140,19 +127,6 @@ def test_event_checked(app, user):
event.refresh_from_db()
assert event.checked is True
# recurring event
start_datetime = localtime().replace(hour=12, minute=0)
event = Event.objects.create(
slug='recurrent',
start_datetime=start_datetime,
recurrence_days=[start_datetime.weekday()],
places=2,
agenda=agenda,
)
app.post('/api/agenda/%s/check/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=404)
app.post('/api/agenda/%s/check/%s/' % (agenda.slug, 'recurrent:2021-02-23-1200'), status=200)
app.post('/api/agenda/%s/check/%s/' % (agenda.slug, 'recurrent--2021-02-23-1200'), status=200)
# wrong kind
agenda.kind = 'meetings'
agenda.save()
@ -408,12 +382,6 @@ def test_update_event(app, user):
resp = app.patch(api_url, status=404)
assert resp.json['detail'] == 'Not found.'
# missing recurring event
api_url = '/api/agenda/%s/event/%s/' % (agenda.slug, 'nop:2021-11-15-1538')
resp = app.patch(api_url, status=400)
assert resp.json['err']
assert resp.json['err_desc'] == 'unknown recurring event slug: nop'
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10, waiting_list_places=5)
api_url = '/api/agenda/%s/event/%s/' % (agenda.slug, event.slug)
@ -467,7 +435,7 @@ def test_update_event(app, user):
recurrence_slug = event.recurrences.first().slug
assert recurrence_slug == 'foo-bar-event--2021-11-15-1538'
recurrence_url = '/api/agenda/%s/event/%s/' % (agenda.slug, 'foo-bar-event:2021-11-15-1538')
recurrence_url = '/api/agenda/%s/event/%s/' % (agenda.slug, 'foo-bar-event--2021-11-15-1538')
# update unprotected fields of one of the event recurrencies
params = {

View File

@ -2240,11 +2240,13 @@ def test_fillslot_past_events_recurring_event(app, user):
label='Recurring',
start_datetime=start_datetime,
recurrence_days=[start_datetime.weekday()],
recurrence_end_date=now() + datetime.timedelta(days=30),
places=5,
agenda=agenda,
)
event.create_all_recurrences()
event_slug = '%s:%s' % (
event_slug = '%s--%s' % (
event.slug,
(event.start_datetime - datetime.timedelta(days=7)).strftime('%Y-%m-%d-%H%M'),
) # too soon
@ -2252,9 +2254,9 @@ def test_fillslot_past_events_recurring_event(app, user):
'/api/agenda/%s/fillslot/%s/' % (agenda.slug, event_slug), params={'events': 'all'}, status=400
)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'invalid datetime for event %s' % event_slug
assert resp.json['err_desc'] == 'invalid slugs: %s' % event_slug
event_slug = '%s:%s' % (
event_slug = '%s--%s' % (
event.slug,
(event.start_datetime + datetime.timedelta(days=7)).strftime('%Y-%m-%d-%H%M'),
)
@ -2266,15 +2268,17 @@ def test_fillslot_past_events_recurring_event(app, user):
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'event %s is not bookable' % event_slug.replace(':', '--')
event_slug = '%s:%s' % (
event_slug = '%s--%s' % (
event.slug,
(event.start_datetime + datetime.timedelta(days=50 * 7)).strftime('%Y-%m-%d-%H%M'),
) # too late
resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.slug, event_slug), params={'events': 'all'})
resp = app.post(
'/api/agenda/%s/fillslot/%s/' % (agenda.slug, event_slug), params={'events': 'all'}, status=400
)
assert resp.json['err'] == 1
assert resp.json['err_desc'] == 'event %s is not bookable' % event_slug.replace(':', '--')
assert resp.json['err_desc'] == 'invalid slugs: %s' % event_slug
event_slug = '%s:%s' % (
event_slug = '%s--%s' % (
event.slug,
(event.start_datetime + datetime.timedelta(days=4 * 7)).strftime('%Y-%m-%d-%H%M'),
)