0003-agendas-delete-an-exception-source-29209.patch
chrono/manager/templates/chrono/manager_confirm_source_delete.html | ||
---|---|---|
1 |
{% extends "chrono/manager_home.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block appbar %} |
|
5 |
<h2>{{ object }}</h2> |
|
6 |
{% endblock %} |
|
7 | ||
8 |
{% block content %} |
|
9 |
<form method="post"> |
|
10 |
{% csrf_token %} |
|
11 |
<p> |
|
12 |
{% blocktrans %}Are you sure you want to delete this exception source?{% endblocktrans %} |
|
13 |
</p> |
|
14 |
<div class="buttons"> |
|
15 |
<button class="delete-button">{% trans 'Delete' %}</button> |
|
16 |
<a class="cancel" href="{% url 'chrono-manager-agenda-settings' object.desk.agenda_id %}">{% trans 'Cancel' %}</a> |
|
17 |
</div> |
|
18 |
</form> |
|
19 |
{% endblock %} |
chrono/manager/templates/chrono/manager_import_exceptions.html | ||
---|---|---|
35 | 35 |
{% if object.ics_filename %}{% trans "replace" %}{% else %}{% trans "refresh" %}{% endif %} |
36 | 36 |
</a> |
37 | 37 |
</td> |
38 |
<td><a rel="popup" href="">{% trans "remove" %}</a></td> |
|
38 |
<td><a rel="popup" href="{% url 'chrono-manager-time-period-exception-source-delete' object.pk %}">{% trans "remove" %}</a></td>
|
|
39 | 39 |
</tr> |
40 | 40 |
{% endfor %} |
41 | 41 |
</tbody> |
chrono/manager/urls.py | ||
---|---|---|
100 | 100 |
views.time_period_exception_list, |
101 | 101 |
name='chrono-manager-time-period-exception-list', |
102 | 102 |
), |
103 |
url( |
|
104 |
r'^time-period-exceptions-source/(?P<pk>\d+)/delete$', |
|
105 |
views.time_period_exception_source_delete, |
|
106 |
name='chrono-manager-time-period-exception-source-delete', |
|
107 |
), |
|
103 | 108 |
url( |
104 | 109 |
r'^agendas/events.csv$', |
105 | 110 |
views.agenda_import_events_sample_csv, |
chrono/manager/views.py | ||
---|---|---|
51 | 51 |
MeetingType, |
52 | 52 |
TimePeriod, |
53 | 53 |
TimePeriodException, |
54 |
TimePeriodExceptionSource, |
|
54 | 55 |
) |
55 | 56 | |
56 | 57 |
from .forms import ( |
... | ... | |
914 | 915 |
desk_import_time_period_exceptions = DeskImportTimePeriodExceptionsView.as_view() |
915 | 916 | |
916 | 917 | |
918 |
class TimePeriodExceptionSourceDeleteView(ManagedDeskSubobjectMixin, DeleteView): |
|
919 |
template_name = 'chrono/manager_confirm_source_delete.html' |
|
920 |
model = TimePeriodExceptionSource |
|
921 | ||
922 |
def get_success_url(self): |
|
923 |
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda_id}) |
|
924 | ||
925 | ||
926 |
time_period_exception_source_delete = TimePeriodExceptionSourceDeleteView.as_view() |
|
927 | ||
928 | ||
917 | 929 |
def menu_json(request): |
918 | 930 |
label = _('Agendas') |
919 | 931 |
json_str = json.dumps( |
tests/test_manager.py | ||
---|---|---|
1413 | 1413 |
assert 'Failed to retrieve remote calendar (https://example.com/foo.ics, SSL error).' in resp.text |
1414 | 1414 | |
1415 | 1415 | |
1416 |
def test_meetings_agenda_delete_time_period_exception_source(app, admin_user): |
|
1417 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings') |
|
1418 |
desk = Desk.objects.create(agenda=agenda, label='Desk A') |
|
1419 |
MeetingType(agenda=agenda, label='Blah').save() |
|
1420 |
TimePeriod.objects.create( |
|
1421 |
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0) |
|
1422 |
) |
|
1423 |
login(app) |
|
1424 |
# import a source |
|
1425 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1426 |
resp = resp.click('Settings') |
|
1427 |
resp = resp.click('upload') |
|
1428 |
ics_with_recurrent_exceptions = b"""BEGIN:VCALENDAR |
|
1429 |
VERSION:2.0 |
|
1430 |
PRODID:-//foo.bar//EN |
|
1431 |
BEGIN:VEVENT |
|
1432 |
DTSTART:20180101 |
|
1433 |
DTEND:20180101 |
|
1434 |
SUMMARY:New Year's Eve |
|
1435 |
RRULE:FREQ=YEARLY |
|
1436 |
END:VEVENT |
|
1437 |
END:VCALENDAR""" |
|
1438 |
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar') |
|
1439 |
resp = resp.form.submit(status=302).follow() |
|
1440 |
assert TimePeriodException.objects.filter(desk=desk).count() == 2 |
|
1441 |
source1 = TimePeriodExceptionSource.objects.latest('pk') |
|
1442 |
assert source1.timeperiodexception_set.count() == 2 |
|
1443 | ||
1444 |
# import another one |
|
1445 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1446 |
resp = resp.click('Settings') |
|
1447 |
resp = resp.click('upload') |
|
1448 |
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar') |
|
1449 |
resp = resp.form.submit(status=302).follow() |
|
1450 |
assert TimePeriodException.objects.filter(desk=desk).count() == 4 |
|
1451 |
source2 = TimePeriodExceptionSource.objects.latest('pk') |
|
1452 |
assert source2.timeperiodexception_set.count() == 2 |
|
1453 | ||
1454 |
# delete the second one |
|
1455 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1456 |
resp = resp.click('Settings') |
|
1457 |
resp = resp.click('upload') |
|
1458 |
resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source2.pk) |
|
1459 |
resp = resp.form.submit().follow() |
|
1460 |
assert TimePeriodException.objects.count() == 2 |
|
1461 |
assert source1.timeperiodexception_set.count() == 2 |
|
1462 |
assert TimePeriodExceptionSource.objects.filter(pk=source2.pk).exists() is False |
|
1463 | ||
1464 |
# delete the first one |
|
1465 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1466 |
resp = resp.click('Settings') |
|
1467 |
resp = resp.click('upload') |
|
1468 |
resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source1.pk) |
|
1469 |
resp = resp.form.submit().follow() |
|
1470 |
assert TimePeriodException.objects.count() == 0 |
|
1471 |
assert TimePeriodExceptionSource.objects.filter(pk=source1.pk).exists() is False |
|
1472 | ||
1473 | ||
1416 | 1474 |
def test_agenda_day_view(app, admin_user, manager_user, api_user): |
1417 | 1475 |
agenda = Agenda.objects.create(label='New Example', kind='meetings') |
1418 | 1476 |
desk = Desk.objects.create(agenda=agenda, label='New Desk') |
1419 |
- |