0001-manager-select-unavailability-calendar-containing-ho.patch
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 |
- |