From c568da89f5c22ead74fd0a623d26213cd3dcea6c Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 2 Apr 2020 16:09:28 +0200 Subject: [PATCH 3/4] agendas: add external flag on exception (#18904) --- .../0058_timeperiodexception_external.py | 20 +++++++++++++ chrono/agendas/models.py | 2 ++ .../manager_meetings_agenda_settings.html | 4 ++- .../manager_time_period_exception_list.html | 4 +-- chrono/manager/views.py | 3 ++ tests/test_manager.py | 29 +++++++++++++++++++ 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 chrono/agendas/migrations/0058_timeperiodexception_external.py diff --git a/chrono/agendas/migrations/0058_timeperiodexception_external.py b/chrono/agendas/migrations/0058_timeperiodexception_external.py new file mode 100644 index 0000000..fb6beed --- /dev/null +++ b/chrono/agendas/migrations/0058_timeperiodexception_external.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-08-31 14:36 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('agendas', '0057_auto_20200831_1634'), + ] + + operations = [ + migrations.AddField( + model_name='timeperiodexception', + name='external', + field=models.BooleanField(default=False, verbose_name='Exception comes from external source'), + ), + ] diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 90d8587..5665ade 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -1413,6 +1413,7 @@ class TimePeriodExceptionSource(models.Model): label=_(label), start_datetime=start_datetime, end_datetime=end_datetime, + external=True, ) self.enabled = True self.save() @@ -1431,6 +1432,7 @@ 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) class Meta: ordering = ['start_datetime'] diff --git a/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html b/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html index da0d9ab..d61fab3 100644 --- a/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html +++ b/chrono/manager/templates/chrono/manager_meetings_agenda_settings.html @@ -73,9 +73,11 @@ {% 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 %} {% trans "remove" %} + {% endif %} {% endfor %} {% if not desk.are_all_exceptions_displayed %}
  • ({% trans 'see all exceptions' %})
  • 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 b267d90..c10ffb7 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 bd7270a..db417f5 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -1720,6 +1720,9 @@ class TimePeriodExceptionDeleteView(ManagedDeskSubobjectMixin, DeleteView): success_url = '{}?display_exceptions={}'.format(success_url, self.desk.pk) return success_url + def get_queryset(self): + return super().get_queryset().filter(external=False) + time_period_exception_delete = TimePeriodExceptionDeleteView.as_view() diff --git a/tests/test_manager.py b/tests/test_manager.py index b705b57..e08af8e 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -13,6 +13,7 @@ from django.core.management import call_command from django.db import connection from django.test import override_settings from django.test.utils import CaptureQueriesContext +from django.urls import reverse from django.utils.encoding import force_text from django.utils.timezone import make_aware, now, localtime @@ -2505,6 +2506,34 @@ def test_meetings_agenda_time_period_exception_source_try_disable_ics(app, admin assert app.get('/manage/time-period-exceptions-source/%s/toggle' % source.pk, status=404) +@override_settings( + EXCEPTIONS_SOURCES={'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},} +) +def test_meetings_agenda_time_period_exception_source_external(app, admin_user, freezer): + freezer.move_to('2020-01-01') + agenda = Agenda.objects.create(label='Foo bar', kind='meetings') + desk = Desk.objects.create(agenda=agenda, label='Desk A') + MeetingType(agenda=agenda, label='Blah').save() + TimePeriod.objects.create( + weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0) + ) + new_year = desk.timeperiodexception_set.filter(label='New year').first() + remove_url = reverse('chrono-manager-time-period-exception-delete', kwargs={'pk': new_year.pk}) + edit_url = reverse('chrono-manager-time-period-exception-edit', kwargs={'pk': new_year.pk}) + + login(app) + resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() + resp = resp.click('Settings') + assert 'New year' in resp.text + assert not remove_url in resp.text and not edit_url in resp.text + + resp = resp.click('see all') + assert 'New year' in resp.text + assert not remove_url in resp.text and not edit_url in resp.text + + app.get(remove_url, status=404) + + def test_agenda_day_view(app, admin_user, manager_user, api_user): agenda = Agenda.objects.create(label='New Example', kind='meetings') desk = Desk.objects.create(agenda=agenda, label='New Desk') -- 2.20.1