diff --git a/chrono/agendas/migrations/0068_remove_timeperiodexception_external.py b/chrono/agendas/migrations/0068_remove_timeperiodexception_external.py
new file mode 100644
index 00000000..344bf1fe
--- /dev/null
+++ b/chrono/agendas/migrations/0068_remove_timeperiodexception_external.py
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2020-10-27 09:32
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('agendas', '0067_auto_20201021_1746'),
+ ]
+
+ operations = [
+ migrations.RemoveField(model_name='timeperiodexception', name='external',),
+ ]
diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py
index ee9b9d0c..a6394aad 100644
--- a/chrono/agendas/models.py
+++ b/chrono/agendas/models.py
@@ -1479,7 +1479,6 @@ class TimePeriodExceptionSource(models.Model):
label=label,
start_datetime=start_datetime,
end_datetime=end_datetime,
- external=True,
)
self.enabled = True
self.save()
@@ -1553,7 +1552,10 @@ class TimePeriodException(models.Model):
end_datetime = models.DateTimeField(_('Exception end time'))
update_datetime = models.DateTimeField(auto_now=True)
recurrence_id = models.PositiveIntegerField(_('Recurrence ID'), default=0)
- external = models.BooleanField(_('Exception comes from external source'), default=False)
+
+ @property
+ def from_settings(self):
+ return self.source and self.source.settings_slug
class Meta:
ordering = ['start_datetime']
@@ -1583,7 +1585,7 @@ class TimePeriodException(models.Model):
)
if self.label:
- label = _(self.label) if self.external else self.label
+ label = _(self.label) if self.from_settings else self.label
exc_repr = u'%s (%s)' % (label, exc_repr)
return exc_repr
diff --git a/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html b/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html
index d61fab30..25cf8a7b 100644
--- a/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html
+++ b/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html
@@ -73,9 +73,9 @@
{% url 'chrono-manager-agenda-add-time-period-exception' agenda_pk=object.pk pk=desk.pk as add_time_period_exception_url %}
{% trans 'Exceptions' %}{% trans 'manage exceptions' %}
{% for exception in desk.get_exceptions_within_two_weeks %}
-
+
{{ exception }}
- {% if not exception.external %}
+ {% if not exception.from_settings%}
{% trans "remove" %}
{% endif %}
{% endfor %}
diff --git a/chrono/manager/templates/chrono/manager_time_period_exception_list.html b/chrono/manager/templates/chrono/manager_time_period_exception_list.html
index c10ffb77..d6fca2e9 100644
--- a/chrono/manager/templates/chrono/manager_time_period_exception_list.html
+++ b/chrono/manager/templates/chrono/manager_time_period_exception_list.html
@@ -20,8 +20,8 @@
diff --git a/chrono/manager/views.py b/chrono/manager/views.py
index 84c00502..e5870813 100644
--- a/chrono/manager/views.py
+++ b/chrono/manager/views.py
@@ -1937,7 +1937,7 @@ class TimePeriodExceptionListView(ManagedDeskMixin, ListView):
paginate_by = 20
def get_queryset(self):
- return self.model.objects.filter(desk=self.desk, end_datetime__gte=now())
+ return self.model.objects.filter(desk=self.desk, end_datetime__gte=now()).select_related('source')
def get_context_data(self, **kwargs):
context = super(TimePeriodExceptionListView, self).get_context_data(**kwargs)
@@ -1976,7 +1976,7 @@ class TimePeriodExceptionDeleteView(ManagedTimePeriodExceptionMixin, DeleteView)
return success_url
def get_queryset(self):
- return super().get_queryset().filter(external=False)
+ return super().get_queryset().filter(source__settings_slug__isnull=True)
time_period_exception_delete = TimePeriodExceptionDeleteView.as_view()
diff --git a/tests/test_manager.py b/tests/test_manager.py
index 390e2238..9a5b9294 100644
--- a/tests/test_manager.py
+++ b/tests/test_manager.py
@@ -2257,6 +2257,9 @@ def test_meetings_agenda_delete_time_period_exception(app, admin_user):
assert resp.request.url.endswith('/manage/time-period-exceptions/%d/exception-list' % desk.pk)
+@override_settings(
+ EXCEPTIONS_SOURCES={'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},}
+)
def test_exception_list(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
desk = Desk.objects.create(agenda=agenda, label='Desk A')
@@ -2299,6 +2302,15 @@ def test_exception_list(app, admin_user):
assert '/manage/time-period-exceptions/%d/edit' % current_exception.pk in resp.text
assert '/manage/time-period-exceptions/%d/edit' % future_exception.pk in resp.text
+ with CaptureQueriesContext(connection) as ctx:
+ app.get("/manage/time-period-exceptions/%d/exception-list" % desk.pk)
+ assert len(ctx.captured_queries) == 6
+
+ desk.import_timeperiod_exceptions_from_settings(enable=True)
+ with CaptureQueriesContext(connection) as ctx:
+ app.get("/manage/time-period-exceptions/%d/exception-list" % desk.pk)
+ assert len(ctx.captured_queries) == 6
+
def test_agenda_import_time_period_exception_from_ics(app, admin_user):
agenda = Agenda.objects.create(label='Example', kind='meetings')