manager: select unavailability calendar containing holidays (#66326)
This commit is contained in:
parent
7448d6e886
commit
0c7ca56e59
|
@ -0,0 +1,26 @@
|
|||
# Generated by Django 2.2.26 on 2022-06-28 12:56
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('agendas', '0131_sharedcustodysettings'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='sharedcustodysettings',
|
||||
name='holidays_calendar',
|
||||
field=models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
related_name='+',
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
to='agendas.UnavailabilityCalendar',
|
||||
verbose_name='Holidays calendar',
|
||||
),
|
||||
),
|
||||
]
|
|
@ -3499,15 +3499,34 @@ class SharedCustodySettings(models.Model):
|
|||
verbose_name=_('Management role'),
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
holidays_calendar = models.ForeignKey(
|
||||
UnavailabilityCalendar,
|
||||
verbose_name=_('Holidays calendar'),
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='+',
|
||||
on_delete=models.SET_NULL,
|
||||
)
|
||||
|
||||
def export_json(self):
|
||||
return {'management_role': self.management_role.name if self.management_role else None}
|
||||
return {
|
||||
'management_role': self.management_role.name if self.management_role else None,
|
||||
'holidays_calendar': self.holidays_calendar.slug if self.holidays_calendar else None,
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def import_json(cls, data):
|
||||
if data.get('management_role'):
|
||||
data['management_role'] = Group.objects.get(name=data['management_role'])
|
||||
|
||||
if data.get('holidays_calendar'):
|
||||
try:
|
||||
data['holidays_calendar'] = UnavailabilityCalendar.objects.get(slug=data['holidays_calendar'])
|
||||
except UnavailabilityCalendar.DoesNotExist:
|
||||
raise AgendaImportError(
|
||||
_('The unavailability calendar "%s" does not exist.') % data['holidays_calendar']
|
||||
)
|
||||
|
||||
cls.objects.update_or_create(defaults=data)
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -1498,8 +1498,9 @@ class SharedCustodyHolidayRuleForm(forms.ModelForm):
|
|||
self.fields['guardian'].queryset = Person.objects.filter(
|
||||
pk__in=[self.instance.agenda.first_guardian_id, self.instance.agenda.second_guardian_id]
|
||||
)
|
||||
settings = SharedCustodySettings.get_singleton()
|
||||
self.fields['holiday'].queryset = TimePeriodExceptionGroup.objects.filter(
|
||||
unavailability_calendar__slug='chrono-holidays',
|
||||
unavailability_calendar=settings.holidays_calendar_id,
|
||||
exceptions__isnull=False,
|
||||
).distinct()
|
||||
|
||||
|
|
|
@ -77,12 +77,12 @@ def import_site(data, if_empty=False, clean=False, overwrite=False):
|
|||
|
||||
if clean:
|
||||
Agenda.objects.all().delete()
|
||||
SharedCustodySettings.objects.all().delete()
|
||||
UnavailabilityCalendar.objects.all().delete()
|
||||
CheckTypeGroup.objects.all().delete()
|
||||
EventsType.objects.all().delete()
|
||||
Resource.objects.all().delete()
|
||||
Category.objects.all().delete()
|
||||
SharedCustodySettings.objects.all().delete()
|
||||
|
||||
results = {
|
||||
key: collections.defaultdict(list)
|
||||
|
|
|
@ -3772,7 +3772,7 @@ class SharedCustodyAgendaSettings(SharedCustodyAgendaMixin, DetailView):
|
|||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['has_holidays'] = UnavailabilityCalendar.objects.filter(slug='chrono-holidays').exists()
|
||||
context['has_holidays'] = bool(SharedCustodySettings.get_singleton().holidays_calendar_id)
|
||||
context['exceptional_periods'] = SharedCustodyPeriod.objects.filter(holiday_rule__isnull=True)
|
||||
return context
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import pytest
|
||||
from django.core.files.base import ContentFile
|
||||
|
||||
from chrono.agendas.models import Person, SharedCustodyAgenda, UnavailabilityCalendar
|
||||
from chrono.agendas.models import Person, SharedCustodyAgenda, SharedCustodySettings, UnavailabilityCalendar
|
||||
|
||||
pytestmark = pytest.mark.django_db
|
||||
|
||||
|
@ -75,7 +75,8 @@ def test_add_shared_custody_agenda_with_rules(app, user, settings):
|
|||
app.authorization = ('Basic', ('john.doe', 'password'))
|
||||
|
||||
# configure holidays
|
||||
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar', slug='chrono-holidays')
|
||||
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')
|
||||
SharedCustodySettings.objects.create(holidays_calendar=unavailability_calendar)
|
||||
source = unavailability_calendar.timeperiodexceptionsource_set.create(
|
||||
ics_filename='holidays.ics', ics_file=ContentFile(ICS_HOLIDAYS, name='holidays.ics')
|
||||
)
|
||||
|
|
|
@ -11,6 +11,7 @@ from chrono.agendas.models import (
|
|||
SharedCustodyHolidayRule,
|
||||
SharedCustodyPeriod,
|
||||
SharedCustodyRule,
|
||||
SharedCustodySettings,
|
||||
TimePeriodExceptionGroup,
|
||||
UnavailabilityCalendar,
|
||||
)
|
||||
|
@ -188,7 +189,8 @@ def test_shared_custody_agenda_month_view_queries(app, admin_user):
|
|||
)
|
||||
|
||||
# configure holidays
|
||||
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar', slug='chrono-holidays')
|
||||
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')
|
||||
SharedCustodySettings.objects.create(holidays_calendar=unavailability_calendar)
|
||||
source = unavailability_calendar.timeperiodexceptionsource_set.create(
|
||||
ics_filename='holidays.ics', ics_file=ContentFile(ICS_HOLIDAYS, name='holidays.ics')
|
||||
)
|
||||
|
@ -217,7 +219,8 @@ def test_shared_custody_agenda_holiday_rules(app, admin_user):
|
|||
assert 'Custody rules during holidays' not in resp.text
|
||||
|
||||
# configure holidays
|
||||
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar', slug='chrono-holidays')
|
||||
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')
|
||||
SharedCustodySettings.objects.create(holidays_calendar=unavailability_calendar)
|
||||
source = unavailability_calendar.timeperiodexceptionsource_set.create(
|
||||
ics_filename='holidays.ics', ics_file=ContentFile(ICS_HOLIDAYS, name='holidays.ics')
|
||||
)
|
||||
|
|
|
@ -1235,22 +1235,30 @@ def test_import_export_agenda_update(app):
|
|||
|
||||
def test_import_export_shared_custody_settings(app):
|
||||
group = Group.objects.create(name='test')
|
||||
SharedCustodySettings.objects.create(management_role=group)
|
||||
calendar = UnavailabilityCalendar.objects.create(label='Calendar')
|
||||
SharedCustodySettings.objects.create(management_role=group, holidays_calendar=calendar)
|
||||
|
||||
output = get_output_of_command('export_site')
|
||||
import_site(data={}, clean=True)
|
||||
assert SharedCustodySettings.get_singleton().management_role is None
|
||||
Group.objects.all().delete()
|
||||
payload = json.loads(output)
|
||||
del payload['unavailability_calendars']
|
||||
|
||||
with pytest.raises(AgendaImportError) as excinfo:
|
||||
import_site(json.loads(output))
|
||||
import_site(payload)
|
||||
assert '%s' % excinfo.value == 'Missing roles: "test"'
|
||||
|
||||
group = Group.objects.create(name='test')
|
||||
with pytest.raises(AgendaImportError) as excinfo:
|
||||
import_site(payload)
|
||||
assert '%s' % excinfo.value == 'The unavailability calendar "calendar" does not exist.'
|
||||
|
||||
import_site(json.loads(output))
|
||||
|
||||
settings = SharedCustodySettings.get_singleton()
|
||||
assert settings.management_role == group
|
||||
assert settings.holidays_calendar.slug == calendar.slug
|
||||
|
||||
group2 = Group.objects.create(name='test2')
|
||||
settings.management_role = group2
|
||||
|
|
Loading…
Reference in New Issue