Projet

Général

Profil

0002-agendas-prevent-cascade-deletion-of-custody-holiday-.patch

Valentin Deniaud, 29 juin 2022 12:10

Télécharger (4,47 ko)

Voir les différences:

Subject: [PATCH 2/2] agendas: prevent cascade deletion of custody holiday
 rules (#66326)

 .../migrations/0133_auto_20220628_1600.py     | 23 +++++++++++++++++++
 chrono/agendas/models.py                      |  2 +-
 chrono/manager/views.py                       | 10 ++++++++
 tests/manager/test_shared_custody_agenda.py   |  6 +++++
 4 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 chrono/agendas/migrations/0133_auto_20220628_1600.py
chrono/agendas/migrations/0133_auto_20220628_1600.py
1
# Generated by Django 2.2.26 on 2022-06-28 14:00
2

  
3
import django.db.models.deletion
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('agendas', '0132_sharedcustodysettings_holidays_calendar'),
11
    ]
12

  
13
    operations = [
14
        migrations.AlterField(
15
            model_name='sharedcustodyholidayrule',
16
            name='holiday',
17
            field=models.ForeignKey(
18
                on_delete=django.db.models.deletion.PROTECT,
19
                to='agendas.TimePeriodExceptionGroup',
20
                verbose_name='Holiday',
21
            ),
22
        ),
23
    ]
chrono/agendas/models.py
3369 3369
    ]
3370 3370

  
3371 3371
    agenda = models.ForeignKey(SharedCustodyAgenda, on_delete=models.CASCADE, related_name='holiday_rules')
3372
    holiday = models.ForeignKey(TimePeriodExceptionGroup, verbose_name=_('Holiday'), on_delete=models.CASCADE)
3372
    holiday = models.ForeignKey(TimePeriodExceptionGroup, verbose_name=_('Holiday'), on_delete=models.PROTECT)
3373 3373
    years = models.CharField(_('Years'), choices=YEAR_CHOICES, blank=True, max_length=16)
3374 3374
    periodicity = models.CharField(_('Periodicity'), choices=PERIODICITY_CHOICES, blank=True, max_length=32)
3375 3375
    guardian = models.ForeignKey(Person, verbose_name=_('Guardian'), on_delete=models.CASCADE)
chrono/manager/views.py
31 31
from django.core.exceptions import PermissionDenied
32 32
from django.db import IntegrityError, transaction
33 33
from django.db.models import BooleanField, Count, Max, Min, Q, Value
34
from django.db.models.deletion import ProtectedError
34 35
from django.http import Http404, HttpResponse, HttpResponseForbidden, HttpResponseRedirect
35 36
from django.shortcuts import get_object_or_404, redirect, render
36 37
from django.template.defaultfilters import title
......
3561 3562
    def get_success_url(self):
3562 3563
        return reverse('chrono-manager-unavailability-calendar-list')
3563 3564

  
3565
    def delete(self, request, *args, **kwargs):
3566
        try:
3567
            return super().delete(request, *args, **kwargs)
3568
        except ProtectedError:
3569
            messages.warning(
3570
                request, _('This calendar cannot be deleted because it is used by shared custody agendas.')
3571
            )
3572
            return HttpResponseRedirect(self.get_object().get_absolute_url())
3573

  
3564 3574

  
3565 3575
unavailability_calendar_delete = UnavailabilityCalendarDeleteView.as_view()
3566 3576

  
tests/manager/test_shared_custody_agenda.py
290 290
    resp = app.get('/manage/shared-custody/%s/2022/12/' % agenda.pk)
291 291
    assert 'John Doe (Vacances de Noël)' in resp.text
292 292

  
293
    # calendar cannot be deleted
294
    resp = app.get('/manage/unavailability-calendar/%s/settings' % unavailability_calendar.pk)
295
    resp = resp.click('Delete')
296
    resp = resp.form.submit().follow()
297
    assert 'This calendar cannot be deleted because it is used by shared custody agendas.' in resp.text
298

  
293 299

  
294 300
def test_shared_custody_settings_feature_flag(app, admin_user, settings):
295 301
    settings.SHARED_CUSTODY_ENABLED = False
296
-