0001-manager-move-roles-and-booking-delays-to-own-form-46.patch
chrono/manager/forms.py | ||
---|---|---|
66 | 66 |
) |
67 | 67 | |
68 | 68 | |
69 |
class AgendaEditForm(AgendaAddForm):
|
|
69 |
class AgendaEditForm(forms.ModelForm):
|
|
70 | 70 |
class Meta: |
71 | 71 |
model = Agenda |
72 | 72 |
fields = [ |
73 | 73 |
'label', |
74 | 74 |
'slug', |
75 | 75 |
'category', |
76 |
'edit_role', |
|
77 |
'view_role', |
|
78 |
'minimal_booking_delay', |
|
79 |
'maximal_booking_delay', |
|
80 | 76 |
'anonymize_delay', |
81 | 77 |
'default_view', |
82 | 78 |
'booking_form_url', |
... | ... | |
84 | 80 | |
85 | 81 |
def __init__(self, *args, **kwargs): |
86 | 82 |
super(AgendaEditForm, self).__init__(*args, **kwargs) |
87 |
if kwargs['instance'].kind != 'virtual': |
|
88 |
self.fields['minimal_booking_delay'].required = True |
|
89 |
self.fields['maximal_booking_delay'].required = True |
|
90 | 83 |
if kwargs['instance'].kind != 'events': |
91 | 84 |
del self.fields['default_view'] |
92 | 85 |
del self.fields['booking_form_url'] |
93 | 86 | |
94 | 87 | |
88 |
class AgendaBookingDelaysForm(AgendaAddForm): |
|
89 |
class Meta: |
|
90 |
model = Agenda |
|
91 |
fields = [ |
|
92 |
'minimal_booking_delay', |
|
93 |
'maximal_booking_delay', |
|
94 |
] |
|
95 | ||
96 |
def __init__(self, *args, **kwargs): |
|
97 |
super(AgendaBookingDelaysForm, self).__init__(*args, **kwargs) |
|
98 |
if kwargs['instance'].kind != 'virtual': |
|
99 |
self.fields['minimal_booking_delay'].required = True |
|
100 |
self.fields['maximal_booking_delay'].required = True |
|
101 | ||
102 | ||
103 |
class AgendaRolesForm(AgendaAddForm): |
|
104 |
class Meta: |
|
105 |
model = Agenda |
|
106 |
fields = [ |
|
107 |
'edit_role', |
|
108 |
'view_role', |
|
109 |
] |
|
110 | ||
111 | ||
95 | 112 |
class UnavailabilityCalendarAddForm(forms.ModelForm): |
96 | 113 |
class Meta: |
97 | 114 |
model = UnavailabilityCalendar |
chrono/manager/templates/chrono/manager_agenda_add_form.html | ||
---|---|---|
1 |
{% extends "chrono/manager_home.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block appbar %} |
|
5 |
<h2>{% trans "New Agenda" %}</h2> |
|
6 |
{% endblock %} |
|
7 | ||
8 |
{% block content %} |
|
9 | ||
10 |
<form method="post" enctype="multipart/form-data"> |
|
11 |
{% csrf_token %} |
|
12 |
{{ form.as_p }} |
|
13 |
<div class="buttons"> |
|
14 |
<button class="submit-button">{% trans "Save" %}</button> |
|
15 |
<a class="cancel" href="{% url 'chrono-manager-homepage' %}">{% trans 'Cancel' %}</a> |
|
16 |
</div> |
|
17 |
</form> |
|
18 |
{% endblock %} |
chrono/manager/templates/chrono/manager_agenda_form.html | ||
---|---|---|
1 |
{% extends "chrono/manager_home.html" %}
|
|
1 |
{% extends "chrono/manager_agenda_view.html" %}
|
|
2 | 2 |
{% load i18n %} |
3 | 3 | |
4 |
{% block breadcrumb %} |
|
5 |
{{ block.super }} |
|
6 |
<a href="">{{ title }}</a> |
|
7 |
{% endblock %} |
|
8 | ||
4 | 9 |
{% block appbar %} |
5 |
{% if object.id %} |
|
6 |
<h2>{% trans "Edit Agenda" %}</h2> |
|
7 |
{% else %} |
|
8 |
<h2>{% trans "New Agenda" %}</h2> |
|
9 |
{% endif %} |
|
10 |
<h2>{{ title }}</h2> |
|
10 | 11 |
{% endblock %} |
11 | 12 | |
12 | 13 |
{% block content %} |
13 | ||
14 | 14 |
<form method="post" enctype="multipart/form-data"> |
15 | 15 |
{% csrf_token %} |
16 | 16 |
{{ form.as_p }} |
17 | 17 |
<div class="buttons"> |
18 | 18 |
<button class="submit-button">{% trans "Save" %}</button> |
19 |
<a class="cancel" href="{% url 'chrono-manager-homepage' %}">{% trans 'Cancel' %}</a>
|
|
19 |
<a class="cancel" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Cancel' %}</a>
|
|
20 | 20 |
</div> |
21 | 21 |
</form> |
22 | 22 |
{% endblock %} |
chrono/manager/templates/chrono/manager_agenda_reminder_form.html | ||
---|---|---|
1 |
{% extends "chrono/manager_agenda_view.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block breadcrumb %} |
|
5 |
{{ block.super }} |
|
6 |
<a href="">{% trans "Reminder settings" %}</a> |
|
7 |
{% endblock %} |
|
8 | ||
9 |
{% block appbar %} |
|
10 |
<h2>{% trans "Reminder settings" %}</h2> |
|
11 |
{% endblock %} |
|
12 | ||
13 |
{% block content %} |
|
14 |
<form method="post" enctype="multipart/form-data"> |
|
15 |
{% csrf_token %} |
|
16 |
{{ form.as_p }} |
|
17 |
<div class="buttons"> |
|
18 |
<button class="submit-button">{% trans "Save" %}</button> |
|
19 |
<a class="cancel" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Cancel' %}</a> |
|
20 |
</div> |
|
21 |
</form> |
|
22 |
{% endblock %} |
chrono/manager/templates/chrono/manager_agenda_settings.html | ||
---|---|---|
39 | 39 | |
40 | 40 |
{% block agenda-reminder %} |
41 | 41 |
<div class="section"> |
42 |
<h3>{% trans "Booking reminders" %}</h3> |
|
42 |
<h3>{% trans "Booking reminders" %} |
|
43 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-reminder-settings' pk=object.id %}">{% trans "Configure" %}</a> |
|
44 |
</h3> |
|
43 | 45 |
<div> |
44 | 46 |
<p> |
45 | 47 |
{% if not agenda.reminder_settings or not agenda.reminder_settings.days %} |
... | ... | |
56 | 58 |
<a rel="popup" data-selector="#message-preview" href="{% url 'chrono-manager-agenda-reminder-preview' pk=object.id type='sms' %}">{% trans "Preview SMS" %}</a> |
57 | 59 |
{% endif %} |
58 | 60 |
</p> |
59 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-reminder-settings' pk=object.id %}">{% trans "Configure" %}</a> |
|
60 | 61 |
</div> |
61 | 62 |
</div> |
62 | 63 |
{% endblock %} |
63 | 64 | |
64 | 65 |
{% block agenda-permissions %} |
65 | 66 |
<div class="section"> |
66 |
<h3>{% trans "Permissions" %}</h3> |
|
67 |
<h3>{% trans "Permissions" %} |
|
68 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-roles' pk=object.id %}">{% trans 'Configure' %}</a> |
|
69 |
</h3> |
|
67 | 70 |
<div> |
68 | 71 |
<ul> |
69 | 72 |
<li>{% trans "Edit Role:" %} {% if agenda.edit_role %}{{ agenda.edit_role }}{% else %}<i>{% trans "undefined" %}</i>{% endif %}</li> |
... | ... | |
75 | 78 | |
76 | 79 |
{% block agenda-booking-delays %} |
77 | 80 |
<div class="section"> |
78 |
<h3>{% trans "Booking Delays" %}</h3> |
|
81 |
<h3>{% trans "Booking Delays" %} |
|
82 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-booking-delays' pk=object.id %}">{% trans 'Configure' %}</a> |
|
83 |
</h3> |
|
79 | 84 |
<div> |
80 | 85 |
<ul> |
81 | 86 |
<li>{% trans "Minimal booking delay:" %} |
chrono/manager/templates/chrono/manager_events_agenda_settings.html | ||
---|---|---|
31 | 31 |
</div> |
32 | 32 | |
33 | 33 |
<div class="section"> |
34 |
<h3>{% trans "Notifications" %}</h3> |
|
34 |
<h3>{% trans "Notifications" %} |
|
35 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-notifications-settings' pk=object.id %}">{% trans 'Configure' %}</a> |
|
36 |
</h3> |
|
35 | 37 |
<div> |
36 | 38 |
<ul> |
37 | 39 |
{% for notification_type in object.notifications_settings.get_notification_types %} |
... | ... | |
44 | 46 |
{% trans "Notifications are disabled for this agenda." %} |
45 | 47 |
{% endfor %} |
46 | 48 |
</ul> |
47 |
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-notifications-settings' pk=object.id %}">{% trans 'Configure' %}</a> |
|
48 | 49 |
</div> |
49 | 50 |
</div> |
50 | 51 |
chrono/manager/urls.py | ||
---|---|---|
99 | 99 |
), |
100 | 100 |
url(r'^agendas/(?P<pk>\d+)/settings$', views.agenda_settings, name='chrono-manager-agenda-settings'), |
101 | 101 |
url(r'^agendas/(?P<pk>\d+)/edit$', views.agenda_edit, name='chrono-manager-agenda-edit'), |
102 |
url( |
|
103 |
r'^agendas/(?P<pk>\d+)/booking-delays$', |
|
104 |
views.agenda_booking_delays, |
|
105 |
name='chrono-manager-agenda-booking-delays', |
|
106 |
), |
|
107 |
url(r'^agendas/(?P<pk>\d+)/roles$', views.agenda_roles, name='chrono-manager-agenda-roles'), |
|
102 | 108 |
url(r'^agendas/(?P<pk>\d+)/delete$', views.agenda_delete, name='chrono-manager-agenda-delete'), |
103 | 109 |
url(r'^agendas/(?P<pk>\d+)/export$', views.agenda_export, name='chrono-manager-agenda-export'), |
104 | 110 |
url(r'^agendas/(?P<pk>\d+)/add-event$', views.agenda_add_event, name='chrono-manager-agenda-add-event'), |
chrono/manager/views.py | ||
---|---|---|
72 | 72 |
from .forms import ( |
73 | 73 |
AgendaAddForm, |
74 | 74 |
AgendaEditForm, |
75 |
AgendaBookingDelaysForm, |
|
76 |
AgendaRolesForm, |
|
75 | 77 |
NewEventForm, |
76 | 78 |
EventForm, |
77 | 79 |
NewMeetingTypeForm, |
... | ... | |
568 | 570 | |
569 | 571 | |
570 | 572 |
class AgendaAddView(CreateView): |
571 |
template_name = 'chrono/manager_agenda_form.html' |
|
573 |
template_name = 'chrono/manager_agenda_add_form.html'
|
|
572 | 574 |
model = Agenda |
573 | 575 |
form_class = AgendaAddForm |
574 | 576 | |
... | ... | |
680 | 682 | |
681 | 683 |
class AgendaEditView(ManagedAgendaMixin, UpdateView): |
682 | 684 |
template_name = 'chrono/manager_agenda_form.html' |
685 |
title = _('Edit Agenda') |
|
683 | 686 |
model = Agenda |
684 | 687 |
form_class = AgendaEditForm |
685 | 688 | |
686 |
def get_success_url(self): |
|
687 |
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.object.id}) |
|
689 |
def get_context_data(self, **kwargs): |
|
690 |
context = super().get_context_data(**kwargs) |
|
691 |
context['title'] = self.title |
|
692 |
return context |
|
688 | 693 | |
689 | 694 | |
690 | 695 |
agenda_edit = AgendaEditView.as_view() |
691 | 696 | |
692 | 697 | |
698 |
class AgendaBookingDelaysView(AgendaEditView): |
|
699 |
form_class = AgendaBookingDelaysForm |
|
700 |
title = _('Configure booking delays') |
|
701 | ||
702 | ||
703 |
agenda_booking_delays = AgendaBookingDelaysView.as_view() |
|
704 | ||
705 | ||
706 |
class AgendaRolesView(AgendaEditView): |
|
707 |
form_class = AgendaRolesForm |
|
708 |
title = _('Configure roles') |
|
709 | ||
710 | ||
711 |
agenda_roles = AgendaRolesView.as_view() |
|
712 | ||
713 | ||
693 | 714 |
class AgendaDeleteView(DeleteView): |
694 | 715 |
template_name = 'chrono/manager_confirm_delete.html' |
695 | 716 |
model = Agenda |
... | ... | |
1476 | 1497 |
agenda_notifications_settings = AgendaNotificationsSettingsView.as_view() |
1477 | 1498 | |
1478 | 1499 | |
1479 |
class AgendaReminderSettingsView(ManagedAgendaMixin, UpdateView):
|
|
1480 |
template_name = 'chrono/manager_agenda_reminder_form.html'
|
|
1500 |
class AgendaReminderSettingsView(AgendaEditView):
|
|
1501 |
title = _('Reminder Settings')
|
|
1481 | 1502 |
model = AgendaReminderSettings |
1482 | 1503 |
form_class = AgendaReminderForm |
1483 | 1504 |
tests/test_manager.py | ||
---|---|---|
948 | 948 |
agenda = Agenda.objects.create(label=u'Foo bar') |
949 | 949 |
assert agenda.minimal_booking_delay == 1 |
950 | 950 |
app = login(app) |
951 |
url = '/manage/agendas/%s/edit' % agenda.pk
|
|
951 |
url = '/manage/agendas/%s/booking-delays' % agenda.pk
|
|
952 | 952 |
resp = app.get(url) |
953 | 953 |
resp.form['minimal_booking_delay'] = None |
954 | 954 |
resp = resp.form.submit() |
... | ... | |
960 | 960 |
agenda = Agenda.objects.create(label=u'Foo bar', kind='virtual', maximal_booking_delay=2) |
961 | 961 |
assert agenda.maximal_booking_delay == 2 |
962 | 962 |
app = login(app) |
963 |
url = '/manage/agendas/%s/edit' % agenda.pk
|
|
963 |
url = '/manage/agendas/%s/booking-delays' % agenda.pk
|
|
964 | 964 |
resp = app.get(url) |
965 | 965 |
resp.form['maximal_booking_delay'] = None |
966 | 966 |
resp = resp.form.submit() |
... | ... | |
4920 | 4920 |
unavailability_calendar.edit_role = group |
4921 | 4921 |
unavailability_calendar.save() |
4922 | 4922 |
app.get(url) |
4923 | ||
4924 | ||
4925 |
def test_manager_agenda_roles(app, admin_user, manager_user): |
|
4926 |
agenda = Agenda.objects.create(label='Events', kind='events') |
|
4927 | ||
4928 |
login(app) |
|
4929 |
resp = app.get('/manage/agendas/%s/settings' % agenda.id) |
|
4930 |
resp = resp.click('Configure', href='roles') |
|
4931 | ||
4932 |
role = manager_user.groups.all()[0] |
|
4933 |
resp.form['edit_role'] = manager_user.groups.all()[0].pk |
|
4934 |
resp = resp.form.submit().follow() |
|
4935 | ||
4936 |
assert 'Edit Role: Managers' in resp.text |
|
4937 | ||
4938 | ||
4939 |
def test_manager_agenda_booking_delays(app, admin_user): |
|
4940 |
agenda = Agenda.objects.create(label='Events', kind='events') |
|
4941 | ||
4942 |
login(app) |
|
4943 |
resp = app.get('/manage/agendas/%s/settings' % agenda.id) |
|
4944 |
resp = resp.click('Configure', href='delays') |
|
4945 | ||
4946 |
resp.form['maximal_booking_delay'] = 42 |
|
4947 |
resp = resp.form.submit().follow() |
|
4948 | ||
4949 |
assert '42 days' in resp.text |
|
4950 |
agenda.refresh_from_db() |
|
4951 |
assert agenda.maximal_booking_delay == 42 |
|
4923 |
- |