agendas: prevent cascade deletion of custody holiday rules (#66326)

This commit is contained in:
Valentin Deniaud 2022-06-29 11:38:33 +02:00
parent 0c7ca56e59
commit efed292e54
4 changed files with 40 additions and 1 deletions

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.26 on 2022-06-28 14:00
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agendas', '0132_sharedcustodysettings_holidays_calendar'),
]
operations = [
migrations.AlterField(
model_name='sharedcustodyholidayrule',
name='holiday',
field=models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT,
to='agendas.TimePeriodExceptionGroup',
verbose_name='Holiday',
),
),
]

View File

@ -3369,7 +3369,7 @@ class SharedCustodyHolidayRule(models.Model):
]
agenda = models.ForeignKey(SharedCustodyAgenda, on_delete=models.CASCADE, related_name='holiday_rules')
holiday = models.ForeignKey(TimePeriodExceptionGroup, verbose_name=_('Holiday'), on_delete=models.CASCADE)
holiday = models.ForeignKey(TimePeriodExceptionGroup, verbose_name=_('Holiday'), on_delete=models.PROTECT)
years = models.CharField(_('Years'), choices=YEAR_CHOICES, blank=True, max_length=16)
periodicity = models.CharField(_('Periodicity'), choices=PERIODICITY_CHOICES, blank=True, max_length=32)
guardian = models.ForeignKey(Person, verbose_name=_('Guardian'), on_delete=models.CASCADE)

View File

@ -31,6 +31,7 @@ from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.db import IntegrityError, transaction
from django.db.models import BooleanField, Count, Max, Min, Q, Value
from django.db.models.deletion import ProtectedError
from django.http import Http404, HttpResponse, HttpResponseForbidden, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.template.defaultfilters import title
@ -3561,6 +3562,15 @@ class UnavailabilityCalendarDeleteView(DeleteView):
def get_success_url(self):
return reverse('chrono-manager-unavailability-calendar-list')
def delete(self, request, *args, **kwargs):
try:
return super().delete(request, *args, **kwargs)
except ProtectedError:
messages.warning(
request, _('This calendar cannot be deleted because it is used by shared custody agendas.')
)
return HttpResponseRedirect(self.get_object().get_absolute_url())
unavailability_calendar_delete = UnavailabilityCalendarDeleteView.as_view()

View File

@ -290,6 +290,12 @@ def test_shared_custody_agenda_holiday_rules(app, admin_user):
resp = app.get('/manage/shared-custody/%s/2022/12/' % agenda.pk)
assert 'John Doe (Vacances de Noël)' in resp.text
# calendar cannot be deleted
resp = app.get('/manage/unavailability-calendar/%s/settings' % unavailability_calendar.pk)
resp = resp.click('Delete')
resp = resp.form.submit().follow()
assert 'This calendar cannot be deleted because it is used by shared custody agendas.' in resp.text
def test_shared_custody_settings_feature_flag(app, admin_user, settings):
settings.SHARED_CUSTODY_ENABLED = False