Projet

Général

Profil

0001-manager-select-unavailability-calendar-containing-ho.patch

Valentin Deniaud, 29 juin 2022 12:10

Télécharger (9,76 ko)

Voir les différences:

Subject: [PATCH 1/2] manager: select unavailability calendar containing
 holidays (#66326)

 ...sharedcustodysettings_holidays_calendar.py | 26 +++++++++++++++++++
 chrono/agendas/models.py                      | 21 ++++++++++++++-
 chrono/manager/forms.py                       |  3 ++-
 chrono/manager/utils.py                       |  2 +-
 chrono/manager/views.py                       |  2 +-
 tests/api/test_shared_custody.py              |  5 ++--
 tests/manager/test_shared_custody_agenda.py   |  7 +++--
 tests/test_import_export.py                   | 12 +++++++--
 8 files changed, 68 insertions(+), 10 deletions(-)
 create mode 100644 chrono/agendas/migrations/0132_sharedcustodysettings_holidays_calendar.py
chrono/agendas/migrations/0132_sharedcustodysettings_holidays_calendar.py
1
# Generated by Django 2.2.26 on 2022-06-28 12:56
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', '0131_sharedcustodysettings'),
11
    ]
12

  
13
    operations = [
14
        migrations.AddField(
15
            model_name='sharedcustodysettings',
16
            name='holidays_calendar',
17
            field=models.ForeignKey(
18
                blank=True,
19
                null=True,
20
                related_name='+',
21
                on_delete=django.db.models.deletion.SET_NULL,
22
                to='agendas.UnavailabilityCalendar',
23
                verbose_name='Holidays calendar',
24
            ),
25
        ),
26
    ]
chrono/agendas/models.py
3499 3499
        verbose_name=_('Management role'),
3500 3500
        on_delete=models.SET_NULL,
3501 3501
    )
3502
    holidays_calendar = models.ForeignKey(
3503
        UnavailabilityCalendar,
3504
        verbose_name=_('Holidays calendar'),
3505
        null=True,
3506
        blank=True,
3507
        related_name='+',
3508
        on_delete=models.SET_NULL,
3509
    )
3502 3510

  
3503 3511
    def export_json(self):
3504
        return {'management_role': self.management_role.name if self.management_role else None}
3512
        return {
3513
            'management_role': self.management_role.name if self.management_role else None,
3514
            'holidays_calendar': self.holidays_calendar.slug if self.holidays_calendar else None,
3515
        }
3505 3516

  
3506 3517
    @classmethod
3507 3518
    def import_json(cls, data):
3508 3519
        if data.get('management_role'):
3509 3520
            data['management_role'] = Group.objects.get(name=data['management_role'])
3510 3521

  
3522
        if data.get('holidays_calendar'):
3523
            try:
3524
                data['holidays_calendar'] = UnavailabilityCalendar.objects.get(slug=data['holidays_calendar'])
3525
            except UnavailabilityCalendar.DoesNotExist:
3526
                raise AgendaImportError(
3527
                    _('The unavailability calendar "%s" does not exist.') % data['holidays_calendar']
3528
                )
3529

  
3511 3530
        cls.objects.update_or_create(defaults=data)
3512 3531

  
3513 3532
    @classmethod
chrono/manager/forms.py
1498 1498
        self.fields['guardian'].queryset = Person.objects.filter(
1499 1499
            pk__in=[self.instance.agenda.first_guardian_id, self.instance.agenda.second_guardian_id]
1500 1500
        )
1501
        settings = SharedCustodySettings.get_singleton()
1501 1502
        self.fields['holiday'].queryset = TimePeriodExceptionGroup.objects.filter(
1502
            unavailability_calendar__slug='chrono-holidays',
1503
            unavailability_calendar=settings.holidays_calendar_id,
1503 1504
            exceptions__isnull=False,
1504 1505
        ).distinct()
1505 1506

  
chrono/manager/utils.py
77 77

  
78 78
    if clean:
79 79
        Agenda.objects.all().delete()
80
        SharedCustodySettings.objects.all().delete()
80 81
        UnavailabilityCalendar.objects.all().delete()
81 82
        CheckTypeGroup.objects.all().delete()
82 83
        EventsType.objects.all().delete()
83 84
        Resource.objects.all().delete()
84 85
        Category.objects.all().delete()
85
        SharedCustodySettings.objects.all().delete()
86 86

  
87 87
    results = {
88 88
        key: collections.defaultdict(list)
chrono/manager/views.py
3772 3772

  
3773 3773
    def get_context_data(self, **kwargs):
3774 3774
        context = super().get_context_data(**kwargs)
3775
        context['has_holidays'] = UnavailabilityCalendar.objects.filter(slug='chrono-holidays').exists()
3775
        context['has_holidays'] = bool(SharedCustodySettings.get_singleton().holidays_calendar_id)
3776 3776
        context['exceptional_periods'] = SharedCustodyPeriod.objects.filter(holiday_rule__isnull=True)
3777 3777
        return context
3778 3778

  
tests/api/test_shared_custody.py
1 1
import pytest
2 2
from django.core.files.base import ContentFile
3 3

  
4
from chrono.agendas.models import Person, SharedCustodyAgenda, UnavailabilityCalendar
4
from chrono.agendas.models import Person, SharedCustodyAgenda, SharedCustodySettings, UnavailabilityCalendar
5 5

  
6 6
pytestmark = pytest.mark.django_db
7 7

  
......
74 74
    app.authorization = ('Basic', ('john.doe', 'password'))
75 75

  
76 76
    # configure holidays
77
    unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar', slug='chrono-holidays')
77
    unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')
78
    SharedCustodySettings.objects.create(holidays_calendar=unavailability_calendar)
78 79
    source = unavailability_calendar.timeperiodexceptionsource_set.create(
79 80
        ics_filename='holidays.ics', ics_file=ContentFile(ICS_HOLIDAYS, name='holidays.ics')
80 81
    )
tests/manager/test_shared_custody_agenda.py
11 11
    SharedCustodyHolidayRule,
12 12
    SharedCustodyPeriod,
13 13
    SharedCustodyRule,
14
    SharedCustodySettings,
14 15
    TimePeriodExceptionGroup,
15 16
    UnavailabilityCalendar,
16 17
)
......
188 189
        )
189 190

  
190 191
    # configure holidays
191
    unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar', slug='chrono-holidays')
192
    unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')
193
    SharedCustodySettings.objects.create(holidays_calendar=unavailability_calendar)
192 194
    source = unavailability_calendar.timeperiodexceptionsource_set.create(
193 195
        ics_filename='holidays.ics', ics_file=ContentFile(ICS_HOLIDAYS, name='holidays.ics')
194 196
    )
......
217 219
    assert 'Custody rules during holidays' not in resp.text
218 220

  
219 221
    # configure holidays
220
    unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar', slug='chrono-holidays')
222
    unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')
223
    SharedCustodySettings.objects.create(holidays_calendar=unavailability_calendar)
221 224
    source = unavailability_calendar.timeperiodexceptionsource_set.create(
222 225
        ics_filename='holidays.ics', ics_file=ContentFile(ICS_HOLIDAYS, name='holidays.ics')
223 226
    )
tests/test_import_export.py
1235 1235

  
1236 1236
def test_import_export_shared_custody_settings(app):
1237 1237
    group = Group.objects.create(name='test')
1238
    SharedCustodySettings.objects.create(management_role=group)
1238
    calendar = UnavailabilityCalendar.objects.create(label='Calendar')
1239
    SharedCustodySettings.objects.create(management_role=group, holidays_calendar=calendar)
1239 1240

  
1240 1241
    output = get_output_of_command('export_site')
1241 1242
    import_site(data={}, clean=True)
1242 1243
    assert SharedCustodySettings.get_singleton().management_role is None
1243 1244
    Group.objects.all().delete()
1245
    payload = json.loads(output)
1246
    del payload['unavailability_calendars']
1244 1247

  
1245 1248
    with pytest.raises(AgendaImportError) as excinfo:
1246
        import_site(json.loads(output))
1249
        import_site(payload)
1247 1250
    assert '%s' % excinfo.value == 'Missing roles: "test"'
1248 1251

  
1249 1252
    group = Group.objects.create(name='test')
1253
    with pytest.raises(AgendaImportError) as excinfo:
1254
        import_site(payload)
1255
    assert '%s' % excinfo.value == 'The unavailability calendar "calendar" does not exist.'
1256

  
1250 1257
    import_site(json.loads(output))
1251 1258

  
1252 1259
    settings = SharedCustodySettings.get_singleton()
1253 1260
    assert settings.management_role == group
1261
    assert settings.holidays_calendar.slug == calendar.slug
1254 1262

  
1255 1263
    group2 = Group.objects.create(name='test2')
1256 1264
    settings.management_role = group2
1257
-