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, |
... | ... | |
825 | 825 |
messages.info(self.request, message) |
826 | 826 |
return super(DeskImportTimePeriodExceptionsView, self).form_valid(form) |
827 | 827 | |
828 | ||
828 | 829 |
desk_import_time_period_exceptions = DeskImportTimePeriodExceptionsView.as_view() |
829 | 830 | |
830 | 831 | |
832 |
class TimePeriodExceptionSourceDeleteView(ManagedDeskSubobjectMixin, DeleteView): |
|
833 |
template_name = 'chrono/manager_confirm_source_delete.html' |
|
834 |
model = TimePeriodExceptionSource |
|
835 | ||
836 |
def get_success_url(self): |
|
837 |
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda_id}) |
|
838 | ||
839 | ||
840 |
time_period_exception_source_delete = TimePeriodExceptionSourceDeleteView.as_view() |
|
841 | ||
842 | ||
831 | 843 |
def menu_json(request): |
832 | 844 |
label = _('Agendas') |
833 | 845 |
json_str = json.dumps([{'label': force_text(label), |
tests/test_manager.py | ||
---|---|---|
1412 | 1412 |
assert 'Failed to retrieve remote calendar (https://example.com/foo.ics, SSL error).' in resp.text |
1413 | 1413 | |
1414 | 1414 | |
1415 |
def test_meetings_agenda_delete_time_period_exception_source(app, admin_user): |
|
1416 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings') |
|
1417 |
desk = Desk.objects.create(agenda=agenda, label='Desk A') |
|
1418 |
MeetingType(agenda=agenda, label='Blah').save() |
|
1419 |
TimePeriod.objects.create( |
|
1420 |
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0) |
|
1421 |
) |
|
1422 |
login(app) |
|
1423 |
# import a source |
|
1424 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1425 |
resp = resp.click('Settings') |
|
1426 |
resp = resp.click('upload') |
|
1427 |
ics_with_recurrent_exceptions = b"""BEGIN:VCALENDAR |
|
1428 |
VERSION:2.0 |
|
1429 |
PRODID:-//foo.bar//EN |
|
1430 |
BEGIN:VEVENT |
|
1431 |
DTSTART:20180101 |
|
1432 |
DTEND:20180101 |
|
1433 |
SUMMARY:New Year's Eve |
|
1434 |
RRULE:FREQ=YEARLY |
|
1435 |
END:VEVENT |
|
1436 |
END:VCALENDAR""" |
|
1437 |
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar') |
|
1438 |
resp = resp.form.submit(status=302).follow() |
|
1439 |
assert TimePeriodException.objects.filter(desk=desk).count() == 2 |
|
1440 |
source1 = TimePeriodExceptionSource.objects.latest('pk') |
|
1441 |
assert source1.timeperiodexception_set.count() == 2 |
|
1442 | ||
1443 |
# import another one |
|
1444 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1445 |
resp = resp.click('Settings') |
|
1446 |
resp = resp.click('upload') |
|
1447 |
resp.form['ics_file'] = Upload('exceptions.ics', ics_with_recurrent_exceptions, 'text/calendar') |
|
1448 |
resp = resp.form.submit(status=302).follow() |
|
1449 |
assert TimePeriodException.objects.filter(desk=desk).count() == 4 |
|
1450 |
source2 = TimePeriodExceptionSource.objects.latest('pk') |
|
1451 |
assert source2.timeperiodexception_set.count() == 2 |
|
1452 | ||
1453 |
# delete the second one |
|
1454 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1455 |
resp = resp.click('Settings') |
|
1456 |
resp = resp.click('upload') |
|
1457 |
resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source2.pk) |
|
1458 |
resp = resp.form.submit().follow() |
|
1459 |
assert TimePeriodException.objects.count() == 2 |
|
1460 |
assert source1.timeperiodexception_set.count() == 2 |
|
1461 |
assert TimePeriodExceptionSource.objects.filter(pk=source2.pk).exists() is False |
|
1462 | ||
1463 |
# delete the first one |
|
1464 |
resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() |
|
1465 |
resp = resp.click('Settings') |
|
1466 |
resp = resp.click('upload') |
|
1467 |
resp = resp.click(href='/manage/time-period-exceptions-source/%d/delete' % source1.pk) |
|
1468 |
resp = resp.form.submit().follow() |
|
1469 |
assert TimePeriodException.objects.count() == 0 |
|
1470 |
assert TimePeriodExceptionSource.objects.filter(pk=source1.pk).exists() is False |
|
1471 | ||
1472 | ||
1415 | 1473 |
def test_agenda_day_view(app, admin_user, manager_user, api_user): |
1416 | 1474 |
agenda = Agenda.objects.create(label='New Example', kind='meetings') |
1417 | 1475 |
desk = Desk.objects.create(agenda=agenda, label='New Desk') |
1418 |
- |