manager: move roles and booking delays to own form (#46774)

This commit is contained in:
Valentin Deniaud 2020-10-20 17:29:51 +02:00
parent 81cb0ee0ea
commit 54e4572011
9 changed files with 124 additions and 58 deletions

View File

@ -66,17 +66,13 @@ class AgendaAddForm(forms.ModelForm):
)
class AgendaEditForm(AgendaAddForm):
class AgendaEditForm(forms.ModelForm):
class Meta:
model = Agenda
fields = [
'label',
'slug',
'category',
'edit_role',
'view_role',
'minimal_booking_delay',
'maximal_booking_delay',
'anonymize_delay',
'default_view',
'booking_form_url',
@ -84,14 +80,35 @@ class AgendaEditForm(AgendaAddForm):
def __init__(self, *args, **kwargs):
super(AgendaEditForm, self).__init__(*args, **kwargs)
if kwargs['instance'].kind != 'virtual':
self.fields['minimal_booking_delay'].required = True
self.fields['maximal_booking_delay'].required = True
if kwargs['instance'].kind != 'events':
del self.fields['default_view']
del self.fields['booking_form_url']
class AgendaBookingDelaysForm(forms.ModelForm):
class Meta:
model = Agenda
fields = [
'minimal_booking_delay',
'maximal_booking_delay',
]
def __init__(self, *args, **kwargs):
super(AgendaBookingDelaysForm, self).__init__(*args, **kwargs)
if kwargs['instance'].kind != 'virtual':
self.fields['minimal_booking_delay'].required = True
self.fields['maximal_booking_delay'].required = True
class AgendaRolesForm(AgendaAddForm):
class Meta:
model = Agenda
fields = [
'edit_role',
'view_role',
]
class UnavailabilityCalendarAddForm(forms.ModelForm):
class Meta:
model = UnavailabilityCalendar

View File

@ -0,0 +1,18 @@
{% extends "chrono/manager_home.html" %}
{% load i18n %}
{% block appbar %}
<h2>{% trans "New Agenda" %}</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button class="submit-button">{% trans "Save" %}</button>
<a class="cancel" href="{% url 'chrono-manager-homepage' %}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -1,33 +1,24 @@
{% extends "chrono/manager_home.html" %}
{% extends "chrono/manager_agenda_view.html" %}
{% load i18n %}
{% block breadcrumb %}
{{ block.super }}
{% if object.pk %}
<a href="{% url 'chrono-manager-agenda-view' object.pk %}">{{ object }}</a>
<a href="{% url 'chrono-manager-agenda-settings' object.pk %}">{% trans 'Settings' %}</a>
<a href="{% url 'chrono-manager-agenda-edit' object.pk %}">{% trans 'Edit Agenda' %}</a>
{% else %}
<a href="{% url 'chrono-manager-agenda-add' %}">{% trans 'New Agenda' %}</a>
{% endif %}
<a href="{% url 'chrono-manager-agenda-view' object.pk %}">{{ object }}</a>
<a href="{% url 'chrono-manager-agenda-settings' object.pk %}">{% trans 'Settings' %}</a>
<a href="{% url 'chrono-manager-agenda-edit' object.pk %}">{{ title }}</a>
{% endblock %}
{% block appbar %}
{% if object.id %}
<h2>{% trans "Edit Agenda" %}</h2>
{% else %}
<h2>{% trans "New Agenda" %}</h2>
{% endif %}
<h2>{{ title }}</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button class="submit-button">{% trans "Save" %}</button>
<a class="cancel" href="{% url 'chrono-manager-homepage' %}">{% trans 'Cancel' %}</a>
<a class="cancel" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -1,22 +0,0 @@
{% extends "chrono/manager_agenda_view.html" %}
{% load i18n %}
{% block breadcrumb %}
{{ block.super }}
<a href="">{% trans "Reminder settings" %}</a>
{% endblock %}
{% block appbar %}
<h2>{% trans "Reminder settings" %}</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button class="submit-button">{% trans "Save" %}</button>
<a class="cancel" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -39,7 +39,9 @@
{% block agenda-reminder %}
<div class="section">
<h3>{% trans "Booking reminders" %}</h3>
<h3>{% trans "Booking reminders" %}
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-reminder-settings' pk=object.id %}">{% trans "Configure" %}</a>
</h3>
<div>
<p>
{% if not agenda.reminder_settings or not agenda.reminder_settings.days %}
@ -56,14 +58,15 @@
<a rel="popup" data-selector="#message-preview" href="{% url 'chrono-manager-agenda-reminder-preview' pk=object.id type='sms' %}">{% trans "Preview SMS" %}</a>
{% endif %}
</p>
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-reminder-settings' pk=object.id %}">{% trans "Configure" %}</a>
</div>
</div>
{% endblock %}
{% block agenda-permissions %}
<div class="section">
<h3>{% trans "Permissions" %}</h3>
<h3>{% trans "Permissions" %}
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-roles' pk=object.id %}">{% trans 'Configure' %}</a>
</h3>
<div>
<ul>
<li>{% trans "Edit Role:" %} {% if agenda.edit_role %}{{ agenda.edit_role }}{% else %}<i>{% trans "undefined" %}</i>{% endif %}</li>
@ -75,7 +78,9 @@
{% block agenda-booking-delays %}
<div class="section">
<h3>{% trans "Booking Delays" %}</h3>
<h3>{% trans "Booking Delays" %}
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-booking-delays' pk=object.id %}">{% trans 'Configure' %}</a>
</h3>
<div>
<ul>
<li>{% trans "Minimal booking delay:" %}

View File

@ -31,7 +31,9 @@
</div>
<div class="section">
<h3>{% trans "Notifications" %}</h3>
<h3>{% trans "Notifications" %}
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-notifications-settings' pk=object.id %}">{% trans 'Configure' %}</a>
</h3>
<div>
<ul>
{% for notification_type in object.notifications_settings.get_notification_types %}
@ -44,7 +46,6 @@
{% trans "Notifications are disabled for this agenda." %}
{% endfor %}
</ul>
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-notifications-settings' pk=object.id %}">{% trans 'Configure' %}</a>
</div>
</div>

View File

@ -105,6 +105,12 @@ urlpatterns = [
),
url(r'^agendas/(?P<pk>\d+)/settings$', views.agenda_settings, name='chrono-manager-agenda-settings'),
url(r'^agendas/(?P<pk>\d+)/edit$', views.agenda_edit, name='chrono-manager-agenda-edit'),
url(
r'^agendas/(?P<pk>\d+)/booking-delays$',
views.agenda_booking_delays,
name='chrono-manager-agenda-booking-delays',
),
url(r'^agendas/(?P<pk>\d+)/roles$', views.agenda_roles, name='chrono-manager-agenda-roles'),
url(r'^agendas/(?P<pk>\d+)/delete$', views.agenda_delete, name='chrono-manager-agenda-delete'),
url(r'^agendas/(?P<pk>\d+)/export$', views.agenda_export, name='chrono-manager-agenda-export'),
url(r'^agendas/(?P<pk>\d+)/add-event$', views.agenda_add_event, name='chrono-manager-agenda-add-event'),

View File

@ -72,6 +72,8 @@ from chrono.agendas.models import (
from .forms import (
AgendaAddForm,
AgendaEditForm,
AgendaBookingDelaysForm,
AgendaRolesForm,
NewEventForm,
EventForm,
NewMeetingTypeForm,
@ -591,7 +593,7 @@ category_delete = CategoryDeleteView.as_view()
class AgendaAddView(CreateView):
template_name = 'chrono/manager_agenda_form.html'
template_name = 'chrono/manager_agenda_add_form.html'
model = Agenda
form_class = AgendaAddForm
@ -724,16 +726,35 @@ class ManagedAgendaMixin(ViewableAgendaMixin):
class AgendaEditView(ManagedAgendaMixin, UpdateView):
template_name = 'chrono/manager_agenda_form.html'
title = _('Edit Agenda')
model = Agenda
form_class = AgendaEditForm
def get_success_url(self):
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.object.id})
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = self.title
return context
agenda_edit = AgendaEditView.as_view()
class AgendaBookingDelaysView(AgendaEditView):
form_class = AgendaBookingDelaysForm
title = _('Configure booking delays')
agenda_booking_delays = AgendaBookingDelaysView.as_view()
class AgendaRolesView(AgendaEditView):
form_class = AgendaRolesForm
title = _('Configure roles')
agenda_roles = AgendaRolesView.as_view()
class AgendaDeleteView(DeleteView):
template_name = 'chrono/manager_confirm_delete.html'
model = Agenda
@ -1522,8 +1543,8 @@ class AgendaNotificationsSettingsView(ManagedAgendaMixin, UpdateView):
agenda_notifications_settings = AgendaNotificationsSettingsView.as_view()
class AgendaReminderSettingsView(ManagedAgendaMixin, UpdateView):
template_name = 'chrono/manager_agenda_reminder_form.html'
class AgendaReminderSettingsView(AgendaEditView):
title = _('Reminder Settings')
model = AgendaReminderSettings
form_class = AgendaReminderForm

View File

@ -948,7 +948,7 @@ def test_options_agenda_cant_unset_delays(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar')
assert agenda.minimal_booking_delay == 1
app = login(app)
url = '/manage/agendas/%s/edit' % agenda.pk
url = '/manage/agendas/%s/booking-delays' % agenda.pk
resp = app.get(url)
resp.form['minimal_booking_delay'] = None
resp = resp.form.submit()
@ -960,7 +960,7 @@ def test_options_virtuale_agenda_can_unset_delays(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar', kind='virtual', maximal_booking_delay=2)
assert agenda.maximal_booking_delay == 2
app = login(app)
url = '/manage/agendas/%s/edit' % agenda.pk
url = '/manage/agendas/%s/booking-delays' % agenda.pk
resp = app.get(url)
resp.form['maximal_booking_delay'] = None
resp = resp.form.submit()
@ -5215,3 +5215,32 @@ def test_export_site(app, admin_user):
site_json = json.loads(resp.text)
assert 'agendas' not in site_json
assert 'unavailability_calendars' in site_json
def test_manager_agenda_roles(app, admin_user, manager_user):
agenda = Agenda.objects.create(label='Events', kind='events')
login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
resp = resp.click('Configure', href='roles')
role = manager_user.groups.all()[0]
resp.form['edit_role'] = manager_user.groups.all()[0].pk
resp = resp.form.submit().follow()
assert 'Edit Role: Managers' in resp.text
def test_manager_agenda_booking_delays(app, admin_user):
agenda = Agenda.objects.create(label='Events', kind='events')
login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
resp = resp.click('Configure', href='delays')
resp.form['maximal_booking_delay'] = 42
resp = resp.form.submit().follow()
assert '42 days' in resp.text
agenda.refresh_from_db()
assert agenda.maximal_booking_delay == 42