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 | ||
---|---|---|
80 | 80 |
name='chrono-manager-time-period-exception-extract-list'), |
81 | 81 |
url(r'^time-period-exceptions/(?P<pk>\d+)/exception-list$', views.time_period_exception_list, |
82 | 82 |
name='chrono-manager-time-period-exception-list'), |
83 |
url(r'^time-period-exceptions-source/(?P<pk>\d+)/delete$', views.time_period_exception_source_delete, |
|
84 |
name='chrono-manager-time-period-exception-source-delete'), |
|
83 | 85 | |
84 | 86 |
url(r'^agendas/events.csv$', views.agenda_import_events_sample_csv, |
85 | 87 |
name='chrono-manager-sample-events-csv'), |
chrono/manager/views.py | ||
---|---|---|
33 | 33 |
MonthArchiveView) |
34 | 34 | |
35 | 35 |
from chrono.agendas.models import (Agenda, Event, MeetingType, TimePeriod, |
36 |
Booking, Desk, TimePeriodException, |
|
36 |
Booking, Desk, TimePeriodException, TimePeriodExceptionSource,
|
|
37 | 37 |
ICSError, AgendaImportError) |
38 | 38 | |
39 | 39 |
from .forms import (AgendaAddForm, AgendaEditForm, NewEventForm, EventForm, NewMeetingTypeForm, MeetingTypeForm, |
... | ... | |
828 | 828 |
messages.info(self.request, message) |
829 | 829 |
return super(DeskImportTimePeriodExceptionsView, self).form_valid(form) |
830 | 830 | |
831 | ||
831 | 832 |
desk_import_time_period_exceptions = DeskImportTimePeriodExceptionsView.as_view() |
832 | 833 | |
833 | 834 | |
835 |
class TimePeriodExceptionSourceDeleteView(ManagedDeskSubobjectMixin, DeleteView): |
|
836 |
template_name = 'chrono/manager_confirm_source_delete.html' |
|
837 |
model = TimePeriodExceptionSource |
|
838 | ||
839 |
def get_success_url(self): |
|
840 |
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda_id}) |
|
841 | ||
842 | ||
843 |
time_period_exception_source_delete = TimePeriodExceptionSourceDeleteView.as_view() |
|
844 | ||
845 | ||
834 | 846 |
def menu_json(request): |
835 | 847 |
label = _('Agendas') |
836 | 848 |
json_str = json.dumps([{'label': force_text(label), |
tests/test_manager.py | ||
---|---|---|
1398 | 1398 |
assert 'Failed to retrieve remote calendar (https://example.com/foo.ics, SSL error).' in resp.text |
1399 | 1399 | |
1400 | 1400 | |
1401 |
def test_meetings_agenda_delete_time_period_exception_source(app, admin_user): |
|
1402 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings') |
|
1403 |
desk = Desk.objects.create(agenda=agenda, label='Desk A') |
|
1404 |
MeetingType(agenda=agenda, label='Blah').save() |
|
1405 |
TimePeriod.objects.create(weekday=1, desk=desk, |
|
1406 |
start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)) |
|
1407 |
login(app) |
|
1408 |
# import a source |
|
1409 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1410 |
resp = resp.click('Settings') |
|
1411 |
resp = resp.click('upload') |
|
1412 |
ics_with_recurrent_exceptions = b"""BEGIN:VCALENDAR |
|
1413 |
VERSION:2.0 |
|
1414 |
PRODID:-//foo.bar//EN |
|
1415 |
BEGIN:VEVENT |
|
1416 |
DTSTART:20180101 |
|
1417 |
DTEND:20180101 |
|
1418 |
SUMMARY:New Year's Eve |
|
1419 |
RRULE:FREQ=YEARLY |
|
1420 |
END:VEVENT |
|
1421 |
END:VCALENDAR""" |
|
1422 |
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar') |
|
1423 |
resp = resp.form.submit(status=302).follow() |
|
1424 |
assert TimePeriodException.objects.filter(desk=desk).count() == 2 |
|
1425 |
source1 = TimePeriodExceptionSource.objects.latest('pk') |
|
1426 |
assert source1.timeperiodexception_set.count() == 2 |
|
1427 | ||
1428 |
# import another one |
|
1429 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1430 |
resp = resp.click('Settings') |
|
1431 |
resp = resp.click('upload') |
|
1432 |
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar') |
|
1433 |
resp = resp.form.submit(status=302).follow() |
|
1434 |
assert TimePeriodException.objects.filter(desk=desk).count() == 4 |
|
1435 |
source2 = TimePeriodExceptionSource.objects.latest('pk') |
|
1436 |
assert source2.timeperiodexception_set.count() == 2 |
|
1437 | ||
1438 |
# delete the second one |
|
1439 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1440 |
resp = resp.click('Settings') |
|
1441 |
resp = resp.click('upload') |
|
1442 |
resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source2.pk) |
|
1443 |
resp = resp.form.submit().follow() |
|
1444 |
assert TimePeriodException.objects.count() == 2 |
|
1445 |
assert source1.timeperiodexception_set.count() == 2 |
|
1446 |
assert TimePeriodExceptionSource.objects.filter(pk=source2.pk).exists() is False |
|
1447 | ||
1448 |
# delete the first one |
|
1449 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1450 |
resp = resp.click('Settings') |
|
1451 |
resp = resp.click('upload') |
|
1452 |
resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source1.pk) |
|
1453 |
resp = resp.form.submit().follow() |
|
1454 |
assert TimePeriodException.objects.count() == 0 |
|
1455 |
assert TimePeriodExceptionSource.objects.filter(pk=source1.pk).exists() is False |
|
1456 | ||
1457 | ||
1401 | 1458 |
def test_agenda_day_view(app, admin_user, manager_user, api_user): |
1402 | 1459 |
agenda = Agenda.objects.create(label='New Example', kind='meetings') |
1403 | 1460 |
desk = Desk.objects.create(agenda=agenda, label='New Desk') |
1404 |
- |