agendas: read_only property for exception & source (#50672)

This commit is contained in:
Lauréline Guérin 2021-01-29 10:46:10 +01:00
parent 72d0d0ea0e
commit 61c88e2246
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 41 additions and 3 deletions

View File

@ -550,7 +550,7 @@ class Agenda(models.Model):
).values('pk')
all_desks_exceptions = TimePeriodException.objects.filter(
Q(desk__in=self.prefetched_desks) | Q(unavailability_calendar__in=unavailability_calendar_ids)
).select_related('source')
)
for desk in self.prefetched_desks:
uc_ids = [uc.pk for uc in desk.unavailability_calendars.all()]
desk.prefetched_exceptions = [
@ -1687,7 +1687,11 @@ class TimePeriodException(models.Model):
@property
def read_only(self):
return self.source and self.source.settings_slug or self.unavailability_calendar_id
if self.source_id:
return True
if self.unavailability_calendar_id:
return True
return False
class Meta:
ordering = ['start_datetime']

View File

@ -2063,7 +2063,7 @@ class TimePeriodExceptionListView(ManagedDeskMixin, ListView):
def get_queryset(self):
return self.model.objects.filter(
Q(desk=self.desk) | Q(unavailability_calendar__desks=self.desk), end_datetime__gte=now()
).select_related('source')
)
def get_context_data(self, **kwargs):
context = super(TimePeriodExceptionListView, self).get_context_data(**kwargs)

View File

@ -872,6 +872,40 @@ def test_agenda_get_effective_time_periods(db):
assert common_timeperiod.end_time == datetime.time(18, 0)
def test_exception_read_only():
agenda = Agenda.objects.create(label='Agenda', kind='meetings')
desk = Desk.objects.create(agenda=agenda, label='Desk')
unavailability_calendar = UnavailabilityCalendar.objects.create(label='Calendar')
source1 = TimePeriodExceptionSource.objects.create(desk=desk, ics_url='http://example.com/sample.ics')
source2 = TimePeriodExceptionSource.objects.create(
desk=desk,
ics_filename='sample.ics',
ics_file=ContentFile(ICS_SAMPLE_WITH_DURATION, name='sample.ics'),
)
source3 = TimePeriodExceptionSource.objects.create(
desk=desk, settings_slug='slug', settings_label='Foo Bar', enabled=True
)
exception = TimePeriodException.objects.create(
desk=desk,
start_datetime=now() - datetime.timedelta(days=2),
end_datetime=now() - datetime.timedelta(days=1),
)
assert exception.read_only is False
for source in [source1, source2, source3]:
exception.source = source
exception.save()
assert exception.read_only is True
exception.source = None
exception.desk = None
exception.unavailability_calendar = unavailability_calendar
exception.save()
assert exception.read_only is True
def test_desk_exceptions_within_two_weeks():
def set_prefetched_exceptions(desk):
desk.prefetched_exceptions = TimePeriodException.objects.filter(