Projet

Général

Profil

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

Valentin Deniaud, 28 octobre 2020 17:04

Télécharger (13,4 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 | 16 ++++-----
 .../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, 126 insertions(+), 51 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(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
-