0003-agendas-add-external-flag-on-exception-18904.patch
chrono/agendas/migrations/0042_timeperiodexception_external.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 |
# Generated by Django 1.11.18 on 2020-04-02 13:24 |
|
3 |
from __future__ import unicode_literals |
|
4 | ||
5 |
from django.db import migrations, models |
|
6 | ||
7 | ||
8 |
class Migration(migrations.Migration): |
|
9 | ||
10 |
dependencies = [ |
|
11 |
('agendas', '0041_auto_20200330_1803'), |
|
12 |
] |
|
13 | ||
14 |
operations = [ |
|
15 |
migrations.AddField( |
|
16 |
model_name='timeperiodexception', |
|
17 |
name='external', |
|
18 |
field=models.BooleanField(default=False, verbose_name='Exception comes from external source'), |
|
19 |
), |
|
20 |
] |
chrono/agendas/models.py | ||
---|---|---|
974 | 974 |
label=_(label), |
975 | 975 |
start_datetime=start_datetime, |
976 | 976 |
end_datetime=end_datetime, |
977 |
external=True, |
|
977 | 978 |
) |
978 | 979 |
self.enabled = True |
979 | 980 |
self.save() |
... | ... | |
992 | 993 |
end_datetime = models.DateTimeField(_('Exception end time')) |
993 | 994 |
update_datetime = models.DateTimeField(auto_now=True) |
994 | 995 |
recurrence_id = models.PositiveIntegerField(_('Recurrence ID'), default=0) |
996 |
external = models.BooleanField(_('Exception comes from external source'), default=False) |
|
995 | 997 | |
996 | 998 |
class Meta: |
997 | 999 |
ordering = ['start_datetime'] |
chrono/manager/templates/chrono/manager_meetings_agenda_settings.html | ||
---|---|---|
73 | 73 |
{% url 'chrono-manager-agenda-add-time-period-exception' agenda_pk=object.pk pk=desk.pk as add_time_period_exception_url %} |
74 | 74 |
<li><a><strong>{% trans 'Exceptions' %}</strong></a><a class="link-action-icon settings" rel="popup" href="{% url 'chrono-manager-desk-add-import-time-period-exceptions' pk=desk.pk %}" title="{% trans 'Manage exception sources' %}">{% trans 'manage exceptions' %}</a></li> |
75 | 75 |
{% for exception in desk.get_exceptions_within_two_weeks %} |
76 |
<li><a rel="popup" href="{% url 'chrono-manager-time-period-exception-edit' pk=exception.pk %}">
|
|
76 |
<li><a rel="popup" {% if not exception.external %}href="{% url 'chrono-manager-time-period-exception-edit' pk=exception.pk %}"{% endif %}>
|
|
77 | 77 |
{{ exception }} |
78 |
{% if not exception.external %} |
|
78 | 79 |
<a rel="popup" class="delete" href="{% url 'chrono-manager-time-period-exception-delete' pk=exception.id %}">{% trans "remove" %}</a> |
80 |
{% endif %} |
|
79 | 81 |
{% endfor %} |
80 | 82 |
{% if not desk.are_all_exceptions_displayed %} |
81 | 83 |
<li><a class="timeperiod-exception-all desk-{{ desk.pk }}" rel="popup" data-selector="div.timeperiod" href="{% url 'chrono-manager-time-period-exception-extract-list' pk=desk.id %}">({% trans 'see all exceptions' %})</a></li> |
chrono/manager/templates/chrono/manager_time_period_exception_list.html | ||
---|---|---|
20 | 20 |
<ul class="objects-list single-links"> |
21 | 21 |
{% for exception in object_list %} |
22 | 22 |
<li> |
23 |
<a {% if user_can_manage %}href="{% url 'chrono-manager-time-period-exception-edit' pk=exception.id %}"{% endif %}>{{ exception }}</a> |
|
24 |
{% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-time-period-exception-delete' pk=exception.id %}{% if not page_obj %}?from_popup{% endif %}">{% trans "remove" %}</a>{% endif %} |
|
23 |
<a {% if user_can_manage and not exception.external %}href="{% url 'chrono-manager-time-period-exception-edit' pk=exception.id %}"{% endif %}>{{ exception }}</a>
|
|
24 |
{% if user_can_manage and not exception.external %}<a rel="popup" class="delete" href="{% url 'chrono-manager-time-period-exception-delete' pk=exception.id %}{% if not page_obj %}?from_popup{% endif %}">{% trans "remove" %}</a>{% endif %}
|
|
25 | 25 |
</li> |
26 | 26 |
{% endfor %} |
27 | 27 |
</ul> |
tests/test_manager.py | ||
---|---|---|
7 | 7 |
import re |
8 | 8 | |
9 | 9 |
from django.contrib.auth.models import User, Group |
10 |
from django.urls import reverse |
|
10 | 11 |
from django.utils.encoding import force_text |
11 | 12 |
from django.utils.timezone import make_aware, now, localtime |
12 | 13 |
from django.test import override_settings |
... | ... | |
1718 | 1719 |
assert app.get('/manage/time-period-exceptions-source/%s/toggle' % source.pk, status=404) |
1719 | 1720 | |
1720 | 1721 | |
1722 |
@override_settings( |
|
1723 |
EXCEPTIONS_SOURCES={'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},} |
|
1724 |
) |
|
1725 |
def test_meetings_agenda_time_period_exception_source_external(app, admin_user, freezer): |
|
1726 |
freezer.move_to('2020-01-01') |
|
1727 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings') |
|
1728 |
desk = Desk.objects.create(agenda=agenda, label='Desk A') |
|
1729 |
MeetingType(agenda=agenda, label='Blah').save() |
|
1730 |
TimePeriod.objects.create( |
|
1731 |
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0) |
|
1732 |
) |
|
1733 |
new_year = desk.timeperiodexception_set.filter(label='New year').first() |
|
1734 |
remove_url = reverse('chrono-manager-time-period-exception-delete', kwargs={'pk': new_year.pk}) |
|
1735 |
edit_url = reverse('chrono-manager-time-period-exception-edit', kwargs={'pk': new_year.pk}) |
|
1736 | ||
1737 |
login(app) |
|
1738 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1739 |
resp = resp.click('Settings') |
|
1740 |
assert 'New year' in resp.text |
|
1741 |
assert not remove_url in resp.text and not edit_url in resp.text |
|
1742 | ||
1743 |
resp = resp.click('see all') |
|
1744 |
assert 'New year' in resp.text |
|
1745 |
assert not remove_url in resp.text and not edit_url in resp.text |
|
1746 | ||
1747 | ||
1721 | 1748 |
def test_agenda_day_view(app, admin_user, manager_user, api_user): |
1722 | 1749 |
agenda = Agenda.objects.create(label='New Example', kind='meetings') |
1723 | 1750 |
desk = Desk.objects.create(agenda=agenda, label='New Desk') |
1724 |
- |