agendas: stop creating exceptions holder desk in the 'save' method (#55279)

This commit is contained in:
Emmanuel Cazenave 2021-06-30 15:50:00 +02:00
parent 3365a3f372
commit 886f316e5c
9 changed files with 98 additions and 15 deletions

View File

@ -256,7 +256,6 @@ class Agenda(models.Model):
return self.label
def save(self, *args, **kwargs):
created = bool(not self.pk)
if not self.slug:
self.slug = generate_slug(self)
if self.kind != 'virtual':
@ -270,9 +269,6 @@ class Agenda(models.Model):
else:
self.default_view = 'day'
super(Agenda, self).save(*args, **kwargs)
if created and self.kind == 'events':
desk = Desk.objects.create(agenda=self, slug='_exceptions_holder')
desk.import_timeperiod_exceptions_from_settings()
@property
def base_slug(self):
@ -2309,7 +2305,9 @@ class TimePeriodExceptionSource(models.Model):
@classmethod
def import_json(cls, data):
data = clean_import_data(cls, data)
source, _ = cls.objects.update_or_create(**data)
desk = data.pop('desk')
settings_slug = data.pop('settings_slug')
source, _ = cls.objects.update_or_create(desk=desk, settings_slug=settings_slug, defaults=data)
if source.enabled:
source.enable()

View File

@ -754,6 +754,13 @@ class AgendaAddView(CreateView):
def get_success_url(self):
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.object.id})
def form_valid(self, form):
result = super().form_valid(form)
if self.object.kind == 'events':
desk = Desk.objects.create(agenda=self.object, slug='_exceptions_holder')
desk.import_timeperiod_exceptions_from_settings()
return result
agenda_add = AgendaAddView.as_view()
@ -1585,7 +1592,9 @@ class AgendaSettings(ManagedAgendaMixin, DetailView):
context['has_recurring_events'] = self.agenda.event_set.filter(
recurrence_days__isnull=False
).exists()
desk = Desk.objects.get(agenda=self.agenda, slug='_exceptions_holder')
desk, created = Desk.objects.get_or_create(agenda=self.agenda, slug='_exceptions_holder')
if created:
desk.import_timeperiod_exceptions_from_settings()
context['exceptions'] = TimePeriodException.objects.filter(
Q(desk=desk) | Q(unavailability_calendar__desks=desk),
end_datetime__gt=now(),

View File

@ -30,8 +30,11 @@ def test_agendas_api(app):
reason = AbsenceReason.objects.create(group=group, label='Foo bar')
reason2 = AbsenceReason.objects.create(group=group, label='Foo bar baz')
event_agenda = Agenda.objects.create(label='Foo bar', category=category_a, absence_reasons_group=group)
Agenda.objects.create(label='Foo bar 2', category=category_a)
Agenda.objects.create(label='Foo bar 3', absence_reasons_group=group)
Desk.objects.create(agenda=event_agenda, slug='_exceptions_holder')
event_agenda2 = Agenda.objects.create(label='Foo bar 2', category=category_a)
Desk.objects.create(agenda=event_agenda2, slug='_exceptions_holder')
event_agenda3 = Agenda.objects.create(label='Foo bar 3', absence_reasons_group=group)
Desk.objects.create(agenda=event_agenda3, slug='_exceptions_holder')
meetings_agenda1 = Agenda.objects.create(label='Foo bar Meeting', kind='meetings', category=category_b)
Agenda.objects.create(label='Foo bar Meeting 2', kind='meetings')
resource1 = Resource.objects.create(label='Resource 1', description='Foo bar Resource 1')
@ -231,6 +234,7 @@ def test_agendas_api(app):
for i in range(10):
event_agenda = Agenda.objects.create(label='Foo bar', category=category_a)
Desk.objects.create(agenda=event_agenda, slug='_exceptions_holder')
event = Event.objects.create(
start_datetime=now(), places=10, agenda=event_agenda, recurrence_days=[now().weekday()]
)

View File

@ -7,7 +7,7 @@ import pytest
from django.test import override_settings
from django.utils.timezone import localtime, make_aware, now
from chrono.agendas.models import Agenda, Booking, Event, TimePeriodException
from chrono.agendas.models import Agenda, Booking, Desk, Event, TimePeriodException
pytestmark = pytest.mark.django_db
@ -707,6 +707,7 @@ def test_recurring_events_api_exceptions(app, user, freezer):
agenda = Agenda.objects.create(
label='Foo bar', kind='events', minimal_booking_delay=1, maximal_booking_delay=30
)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
Event.objects.create(
slug='abc',
start_datetime=localtime(),

View File

@ -5,7 +5,7 @@ from __future__ import unicode_literals
import pytest
from django.contrib.auth.models import Group, User
from chrono.agendas.models import AbsenceReason, AbsenceReasonGroup, Agenda
from chrono.agendas.models import AbsenceReason, AbsenceReasonGroup, Agenda, Desk
from .test_all import login
@ -209,6 +209,7 @@ def test_meetings_agenda_group(app, admin_user):
def test_agenda_group(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)

View File

@ -457,6 +457,7 @@ def test_add_agenda_and_set_role(app, admin_user, manager_user):
def test_options_agenda(app, admin_user):
agenda_events = Agenda.objects.create(label=u'Foo bar', kind='events')
Desk.objects.create(agenda=agenda_events, slug='_exceptions_holder')
agenda_meetings = Agenda.objects.create(label=u'Foo bar', kind='meetings')
agenda_virtual = Agenda.objects.create(label=u'Foo bar', kind='virtual')
@ -581,7 +582,7 @@ def test_options_agenda_booking_check_options(app, admin_user):
def test_options_agenda_event_display_template(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
resp = app.get('/manage/agendas/%s/edit' % agenda.pk)
valid_template = '{{ event.label|default:event.slug }} - {{ event.remaining_places|add:"5" }} / {{ event.start_datetime|date }} - {{ event.agenda.name }}'
@ -607,6 +608,7 @@ def test_options_agenda_as_manager(app, manager_user):
agenda = Agenda(label=u'Foo bar')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app, username='manager', password='manager')
resp = app.get('/manage/', status=200)
resp = resp.click('Foo bar').follow().follow()
@ -771,6 +773,7 @@ def test_agenda_options_desk_simple_management(available_mock, app, admin_user):
def test_delete_agenda(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
resp = app.get('/manage/', status=200)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
@ -784,6 +787,7 @@ def test_delete_agenda(app, admin_user):
def test_delete_busy_agenda(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event(start_datetime=now() + datetime.timedelta(days=10), places=10, agenda=agenda)
event.save()
@ -815,6 +819,7 @@ def test_delete_agenda_as_manager(app, manager_user):
agenda = Agenda(label=u'Foo bar')
agenda.edit_role = manager_user.groups.all()[0]
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app, username='manager', password='manager')
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
assert 'Options' in resp.text
@ -2746,6 +2751,7 @@ def test_agenda_events_day_view_midnight(app, admin_user):
@freezegun.freeze_time('2020-10-01')
def test_agenda_events_month_view(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
today = datetime.date.today()
login(app)
@ -3426,6 +3432,7 @@ def test_import_agenda_as_manager(app, manager_user):
def test_import_agenda(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
with freezegun.freeze_time('2020-06-15'):
@ -4267,6 +4274,7 @@ def test_booking_cancellation_meetings_agenda(app, admin_user, manager_user, man
def test_agenda_notifications(app, admin_user, managers_group):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
@ -4315,6 +4323,7 @@ def test_agenda_notifications(app, admin_user, managers_group):
def test_agenda_notifications_no_old_events(app, admin_user, mailoutbox):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10, label='Old event')
event.cancelled = True
event.save()
@ -4339,6 +4348,7 @@ def test_agenda_notifications_no_old_events(app, admin_user, mailoutbox):
def test_manager_reminders(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
@ -4377,6 +4387,7 @@ def test_manager_reminders(app, admin_user):
def test_manager_reminders_preview(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
AgendaReminderSettings.objects.create(
agenda=agenda,
days=1,
@ -4428,6 +4439,7 @@ def test_export_site(app, admin_user):
assert site_json == {'unavailability_calendars': [], 'agendas': []}
agenda = Agenda.objects.create(label=u'Foo Bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar 1')
resp = app.get('/manage/agendas/export/')
resp = resp.form.submit()
@ -4447,6 +4459,7 @@ def test_export_site(app, admin_user):
def test_manager_agenda_roles(app, admin_user, manager_user):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
@ -4461,6 +4474,7 @@ def test_manager_agenda_roles(app, admin_user, manager_user):
def test_manager_agenda_booking_delays(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
@ -4607,6 +4621,7 @@ def test_recurring_events_manage_exceptions(settings, app, admin_user, freezer):
def test_recurring_events_exceptions_report(settings, app, admin_user, freezer):
freezer.move_to('2021-07-01 12:10')
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
start_datetime=now(),
places=10,

View File

@ -15,7 +15,7 @@ from django.test.utils import CaptureQueriesContext
from django.utils.timezone import localtime, make_aware, now
from webtest import Upload
from chrono.agendas.models import AbsenceReason, AbsenceReasonGroup, Agenda, Booking, Event
from chrono.agendas.models import AbsenceReason, AbsenceReasonGroup, Agenda, Booking, Desk, Event
from .test_all import login
@ -46,6 +46,7 @@ def test_add_event(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.maximal_booking_delay = 0
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
assert "This agenda doesn't have any event yet." in resp.text
@ -96,6 +97,7 @@ def test_add_event_as_manager(app, manager_user):
agenda = Agenda(label=u'Foo bar')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app, username='manager', password='manager')
resp = app.get('/manage/agendas/%s/' % agenda.id, status=302)
app.get('/manage/agendas/%s/add-event' % agenda.id, status=403)
@ -186,6 +188,7 @@ def test_edit_event_as_manager(app, manager_user):
agenda = Agenda(label=u'Foo bar')
agenda.view_role = manager_user.groups.all()[0]
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)),
places=20,
@ -219,6 +222,7 @@ def test_edit_recurring_event(settings, app, admin_user, freezer):
agenda = Agenda.objects.create(
label='Foo bar', kind='events', minimal_booking_delay=15, maximal_booking_delay=30
)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(start_datetime=now(), places=10, agenda=agenda)
app = login(app)
@ -376,6 +380,7 @@ def test_booked_places(app, admin_user):
def test_event_classes(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=10, agenda=agenda)
event.save()
for i in range(2):
@ -402,6 +407,7 @@ def test_event_classes(app, admin_user):
def test_delete_event(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=10, agenda=agenda)
event.save()
@ -417,6 +423,7 @@ def test_delete_event(app, admin_user):
def test_delete_busy_event(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event(start_datetime=now() + datetime.timedelta(days=10), places=10, agenda=agenda)
event.save()
@ -449,6 +456,7 @@ def test_delete_busy_event(app, admin_user):
def test_delete_recurring_event(app, admin_user, freezer):
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, places=10, agenda=agenda, recurrence_days=[start_datetime.weekday()]
@ -487,6 +495,7 @@ def test_delete_event_as_manager(app, manager_user):
agenda = Agenda(label=u'Foo bar')
agenda.edit_role = manager_user.groups.all()[0]
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=10, agenda=agenda)
event.save()
@ -552,6 +561,7 @@ def test_export_events_wrong_kind(app, admin_user):
def test_import_events(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
@ -774,6 +784,7 @@ def test_import_events(app, admin_user):
def test_import_events_existing_event(app, admin_user, freezer):
agenda = Agenda.objects.create(label=u'Foo bar')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200)
@ -1074,7 +1085,9 @@ def test_booking_cancellation_events_agenda(app, admin_user):
def test_event_check(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
agenda2 = Agenda.objects.create(label='Events', kind='events')
Desk.objects.create(agenda=agenda2, slug='_exceptions_holder')
event = Event.objects.create(
label='xyz',
start_datetime=now() + datetime.timedelta(days=1),
@ -1188,6 +1201,7 @@ def test_event_check(app, admin_user):
def test_event_checked(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events', booking_check_filters='foo,bar')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
label='xyz',
start_datetime=now() - datetime.timedelta(days=1),

View File

@ -2050,7 +2050,8 @@ def test_recurring_events_sort(freezer):
def test_recurring_events_exceptions(freezer):
freezer.move_to('2021-05-01 12:00')
agenda = Agenda.objects.create(label='Agenda', kind='events')
desk = Desk.objects.get(slug='_exceptions_holder', agenda=agenda)
desk = Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
desk.import_timeperiod_exceptions_from_settings()
event = Event.objects.create(
agenda=agenda,
@ -2123,7 +2124,7 @@ def test_recurring_events_exceptions(freezer):
def test_recurring_events_exceptions_update_recurrences(freezer):
freezer.move_to('2021-05-01 12:00')
agenda = Agenda.objects.create(label='Agenda', kind='events')
desk = Desk.objects.get(slug='_exceptions_holder', agenda=agenda)
desk = Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
daily_event = Event.objects.create(
agenda=agenda,

View File

@ -58,7 +58,7 @@ def test_import_export(app):
agenda_meetings = Agenda.objects.create(label='Meetings Agenda', kind='meetings')
MeetingType.objects.create(agenda=agenda_meetings, label='Meeting Type', duration=30)
desk = Desk.objects.create(agenda=agenda_meetings, label='Desk')
exceptions_desk = Desk.objects.get(agenda=agenda_events, slug='_exceptions_holder')
exceptions_desk = Desk.objects.create(agenda=agenda_events, slug='_exceptions_holder')
tpx_start = make_aware(datetime.datetime(2017, 5, 22, 8, 0))
tpx_end = make_aware(datetime.datetime(2017, 5, 22, 12, 30))
@ -151,6 +151,7 @@ def test_import_export_events_agenda_options(app):
default_view='open_events',
booking_form_url='{{ eservices_url }}backoffice/submission/inscription-aux-activites/',
)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
output = get_output_of_command('export_site')
assert len(json.loads(output)['agendas']) == 1
@ -169,6 +170,7 @@ def test_import_export_events_agenda_options(app):
def test_import_export_event_details(app):
agenda = Agenda.objects.create(label='Foo Bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
Event.objects.create(
slug='event',
agenda=agenda,
@ -181,6 +183,7 @@ def test_import_export_event_details(app):
)
# check event (agenda, slug) unicity
agenda2 = Agenda.objects.create(label='Foo Bar 2', kind='events')
Desk.objects.create(agenda=agenda2, slug='_exceptions_holder')
Event.objects.create(
slug='event',
agenda=agenda2,
@ -211,6 +214,7 @@ def test_import_export_event_details(app):
def test_import_export_recurring_event(app, freezer):
freezer.move_to('2021-01-12 12:10')
agenda = Agenda.objects.create(label='Foo Bar', kind='events')
desk = Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
agenda=agenda,
start_datetime=now(),
@ -364,6 +368,7 @@ def test_import_export_resources(app):
def test_import_export_categorys(app):
category = Category.objects.create(label='foo')
agenda = Agenda.objects.create(label='Foo Bar', category=category)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
output = get_output_of_command('export_site')
import_site(data={}, clean=True)
@ -388,6 +393,7 @@ def test_import_export_categorys(app):
def test_import_export_absence_reasons(app):
group = AbsenceReasonGroup.objects.create(label='foo')
agenda = Agenda.objects.create(label='Foo Bar', kind='events', absence_reasons_group=group)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
output = get_output_of_command('export_site')
import_site(data={}, clean=True)
@ -536,6 +542,7 @@ def test_import_export_desk_missing_fields(app):
def test_import_export_unknown_fields(app):
events_agenda = Agenda.objects.create(label='Events Agenda', kind='events')
Desk.objects.create(agenda=events_agenda, slug='_exceptions_holder')
Event.objects.create(agenda=events_agenda, start_datetime=now(), places=10)
meetings_agenda = Agenda.objects.create(label='Meetings Agenda', kind='meetings')
MeetingType.objects.create(agenda=meetings_agenda, label='Meeting Type', duration=30)
@ -580,6 +587,7 @@ def test_import_export_unknown_fields(app):
def test_import_export_slug_fields(app):
agenda_events = Agenda.objects.create(label='Events Agenda', kind='events')
Desk.objects.create(agenda=agenda_events, slug='_exceptions_holder')
Event.objects.create(agenda=agenda_events, start_datetime=now(), places=10)
agenda_meetings = Agenda.objects.create(label='Meetings Agenda', kind='meetings')
MeetingType.objects.create(agenda=agenda_meetings, label='Meeting Type', duration=30)
@ -621,6 +629,7 @@ def test_import_export_slug_fields(app):
def test_import_export_notification_settings():
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
AgendaNotificationsSettings.objects.create(
agenda=agenda,
almost_full_event=AgendaNotificationsSettings.EDIT_ROLE,
@ -650,6 +659,7 @@ def test_import_export_notification_settings():
def test_import_export_reminder_settings():
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
AgendaReminderSettings.objects.create(
agenda=agenda,
days=2,
@ -711,6 +721,36 @@ def test_import_export_time_period_exception_source():
assert not desk.timeperiodexception_set.exists()
@override_settings(
EXCEPTIONS_SOURCES={
'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},
}
)
def test_import_export_time_period_exception_source_enabled():
agenda = Agenda.objects.create(label='Foo bar', kind='events')
desk = Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
desk.import_timeperiod_exceptions_from_settings()
source = desk.timeperiodexceptionsource_set.first()
assert not source.enabled
assert source.settings_slug == 'holidays'
source.enabled = True
source.save()
output = get_output_of_command('export_site')
payload = json.loads(output)
agenda.delete()
assert not TimePeriodExceptionSource.objects.exists()
import_site(payload)
agenda = Agenda.objects.get(label='Foo bar')
assert agenda.desk_set.count() == 1
desk = agenda.desk_set.first()
assert desk.timeperiodexceptionsource_set.count() == 1
source = desk.timeperiodexceptionsource_set.first()
assert source.enabled
assert source.settings_slug == 'holidays'
def test_import_export_do_not_duplicate_timeperiod_and_exceptions():
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
desk = Desk.objects.create(slug='test', agenda=agenda)