Projet

Général

Profil

0001-manager-move-roles-and-booking-delays-to-own-form-46.patch

Valentin Deniaud, 23 novembre 2020 10:44

Télécharger (14 ko)

Voir les différences:

Subject: [PATCH] manager: move roles and booking delays to own form (#46774)

 chrono/manager/forms.py                       | 33 ++++++++++++++-----
 .../chrono/manager_agenda_add_form.html       | 18 ++++++++++
 .../templates/chrono/manager_agenda_form.html | 21 ++++--------
 .../chrono/manager_agenda_reminder_form.html  | 22 -------------
 .../chrono/manager_agenda_settings.html       | 13 +++++---
 .../manager_events_agenda_settings.html       |  5 +--
 chrono/manager/urls.py                        |  6 ++++
 chrono/manager/views.py                       | 31 ++++++++++++++---
 tests/test_manager.py                         | 33 +++++++++++++++++--
 9 files changed, 124 insertions(+), 58 deletions(-)
 create mode 100644 chrono/manager/templates/chrono/manager_agenda_add_form.html
 delete mode 100644 chrono/manager/templates/chrono/manager_agenda_reminder_form.html
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(forms.ModelForm):
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 4
{% block breadcrumb %}
5 5
{{ block.super }}
6
{% if object.pk %}
7
  <a href="{% url 'chrono-manager-agenda-view' object.pk %}">{{ object }}</a>
8
  <a href="{% url 'chrono-manager-agenda-settings' object.pk %}">{% trans 'Settings' %}</a>
9
  <a href="{% url 'chrono-manager-agenda-edit' object.pk %}">{% trans 'Edit Agenda' %}</a>
10
{% else %}
11
  <a href="{% url 'chrono-manager-agenda-add' %}">{% trans 'New Agenda' %}</a>
12
{% endif %}
6
<a href="{% url 'chrono-manager-agenda-view' object.pk %}">{{ object }}</a>
7
<a href="{% url 'chrono-manager-agenda-settings' object.pk %}">{% trans 'Settings' %}</a>
8
<a href="{% url 'chrono-manager-agenda-edit' object.pk %}">{{ title }}</a>
13 9
{% endblock %}
14 10

  
15 11
{% block appbar %}
16
{% if object.id %}
17
<h2>{% trans "Edit Agenda" %}</h2>
18
{% else %}
19
<h2>{% trans "New Agenda" %}</h2>
20
{% endif %}
12
<h2>{{ title }}</h2>
21 13
{% endblock %}
22 14

  
23 15
{% block content %}
24

  
25 16
<form method="post" enctype="multipart/form-data">
26 17
  {% csrf_token %}
27 18
  {{ form.as_p }}
28 19
  <div class="buttons">
29 20
    <button class="submit-button">{% trans "Save" %}</button>
30
    <a class="cancel" href="{% url 'chrono-manager-homepage' %}">{% trans 'Cancel' %}</a>
21
    <a class="cancel" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Cancel' %}</a>
31 22
  </div>
32 23
</form>
33 24
{% 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
105 105
    ),
106 106
    url(r'^agendas/(?P<pk>\d+)/settings$', views.agenda_settings, name='chrono-manager-agenda-settings'),
107 107
    url(r'^agendas/(?P<pk>\d+)/edit$', views.agenda_edit, name='chrono-manager-agenda-edit'),
108
    url(
109
        r'^agendas/(?P<pk>\d+)/booking-delays$',
110
        views.agenda_booking_delays,
111
        name='chrono-manager-agenda-booking-delays',
112
    ),
113
    url(r'^agendas/(?P<pk>\d+)/roles$', views.agenda_roles, name='chrono-manager-agenda-roles'),
108 114
    url(r'^agendas/(?P<pk>\d+)/delete$', views.agenda_delete, name='chrono-manager-agenda-delete'),
109 115
    url(r'^agendas/(?P<pk>\d+)/export$', views.agenda_export, name='chrono-manager-agenda-export'),
110 116
    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,
......
591 593

  
592 594

  
593 595
class AgendaAddView(CreateView):
594
    template_name = 'chrono/manager_agenda_form.html'
596
    template_name = 'chrono/manager_agenda_add_form.html'
595 597
    model = Agenda
596 598
    form_class = AgendaAddForm
597 599

  
......
724 726

  
725 727
class AgendaEditView(ManagedAgendaMixin, UpdateView):
726 728
    template_name = 'chrono/manager_agenda_form.html'
729
    title = _('Edit Agenda')
727 730
    model = Agenda
728 731
    form_class = AgendaEditForm
729 732

  
730
    def get_success_url(self):
731
        return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.object.id})
733
    def get_context_data(self, **kwargs):
734
        context = super().get_context_data(**kwargs)
735
        context['title'] = self.title
736
        return context
732 737

  
733 738

  
734 739
agenda_edit = AgendaEditView.as_view()
735 740

  
736 741

  
742
class AgendaBookingDelaysView(AgendaEditView):
743
    form_class = AgendaBookingDelaysForm
744
    title = _('Configure booking delays')
745

  
746

  
747
agenda_booking_delays = AgendaBookingDelaysView.as_view()
748

  
749

  
750
class AgendaRolesView(AgendaEditView):
751
    form_class = AgendaRolesForm
752
    title = _('Configure roles')
753

  
754

  
755
agenda_roles = AgendaRolesView.as_view()
756

  
757

  
737 758
class AgendaDeleteView(DeleteView):
738 759
    template_name = 'chrono/manager_confirm_delete.html'
739 760
    model = Agenda
......
1522 1543
agenda_notifications_settings = AgendaNotificationsSettingsView.as_view()
1523 1544

  
1524 1545

  
1525
class AgendaReminderSettingsView(ManagedAgendaMixin, UpdateView):
1526
    template_name = 'chrono/manager_agenda_reminder_form.html'
1546
class AgendaReminderSettingsView(AgendaEditView):
1547
    title = _('Reminder Settings')
1527 1548
    model = AgendaReminderSettings
1528 1549
    form_class = AgendaReminderForm
1529 1550

  
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()
......
5214 5214
    site_json = json.loads(resp.text)
5215 5215
    assert 'agendas' not in site_json
5216 5216
    assert 'unavailability_calendars' in site_json
5217

  
5218

  
5219
def test_manager_agenda_roles(app, admin_user, manager_user):
5220
    agenda = Agenda.objects.create(label='Events', kind='events')
5221

  
5222
    login(app)
5223
    resp = app.get('/manage/agendas/%s/settings' % agenda.id)
5224
    resp = resp.click('Configure', href='roles')
5225

  
5226
    role = manager_user.groups.all()[0]
5227
    resp.form['edit_role'] = manager_user.groups.all()[0].pk
5228
    resp = resp.form.submit().follow()
5229

  
5230
    assert 'Edit Role: Managers' in resp.text
5231

  
5232

  
5233
def test_manager_agenda_booking_delays(app, admin_user):
5234
    agenda = Agenda.objects.create(label='Events', kind='events')
5235

  
5236
    login(app)
5237
    resp = app.get('/manage/agendas/%s/settings' % agenda.id)
5238
    resp = resp.click('Configure', href='delays')
5239

  
5240
    resp.form['maximal_booking_delay'] = 42
5241
    resp = resp.form.submit().follow()
5242

  
5243
    assert '42 days' in resp.text
5244
    agenda.refresh_from_db()
5245
    assert agenda.maximal_booking_delay == 42
5217
-