Projet

Général

Profil

0004-manager-ensure-buttons-behave-properly.patch

Valentin Deniaud, 05 juin 2019 15:08

Télécharger (18 ko)

Voir les différences:

Subject: [PATCH 4/4] manager: ensure buttons behave properly

Show buttons regardless of session roles, which allows to send a
request for missing roles only when user triggers a specific
interaction.

We also conditionnaly add the popup rel attribute, in order to prevent
the redirect to idp being improperly displayed inside a popup.
 .../chrono/manager_agenda_settings.html       | 40 +++++++++----------
 .../templates/chrono/manager_desk_form.html   |  2 +-
 .../templates/chrono/manager_event_form.html  |  2 +-
 .../templates/chrono/manager_home.html        |  4 +-
 .../chrono/manager_meeting_type_form.html     |  2 +-
 .../manager_time_period_exception_form.html   |  2 +-
 .../manager_time_period_exception_list.html   |  2 +-
 .../chrono/manager_time_period_form.html      |  2 +-
 chrono/manager/utils.py                       |  1 +
 chrono/manager/views.py                       | 29 +++++++-------
 10 files changed, 44 insertions(+), 42 deletions(-)
chrono/manager/templates/chrono/manager_agenda_settings.html
12 12
</h2>
13 13
<span class="actions">
14 14
{% if user.is_staff %}
15
  <a rel="popup" href="{% url 'chrono-manager-agenda-delete' pk=object.id %}">{% trans 'Delete' %}</a>
15
<a rel="{{ rel }}" href="{% url 'chrono-manager-agenda-delete' pk=object.id %}">{% trans 'Delete' %}</a>
16 16
{% endif %}
17 17
{% if user_can_manage %}
18 18
  <a download href="{% url 'chrono-manager-agenda-export' pk=object.id %}">{% trans 'Export' %}</a>
19
  <a rel="popup" href="{% url 'chrono-manager-agenda-edit' pk=object.id %}">{% trans 'Options' %}</a>
19
  <a rel="{{ rel }}" href="{% url 'chrono-manager-agenda-edit' pk=object.id %}">{% trans 'Options' %}</a>
20 20
  {% if object.kind == "events" %}
21
    <a rel="popup" href="{% url 'chrono-manager-agenda-import-events' pk=object.id %}">{% trans 'Import Events' %}</a>
22
    <a rel="popup" href="{% url 'chrono-manager-agenda-add-event' pk=object.id %}">{% trans 'New Event' %}</a>
21
    <a rel="{{ rel }}" href="{% url 'chrono-manager-agenda-import-events' pk=object.id %}">{% trans 'Import Events' %}</a>
22
    <a rel="{{ rel }}" href="{% url 'chrono-manager-agenda-add-event' pk=object.id %}">{% trans 'New Event' %}</a>
23 23
  {% else %}
24
    <a rel="popup" href="{% url 'chrono-manager-agenda-add-meeting-type' pk=object.id %}">{% trans 'New Meeting Type' %}</a>
25
    <a rel="popup" href="{% url 'chrono-manager-agenda-add-desk' pk=object.id %}">{% trans 'New Desk' %}</a>
24
    <a rel="{{ rel }}" href="{% url 'chrono-manager-agenda-add-meeting-type' pk=object.id %}">{% trans 'New Meeting Type' %}</a>
25
    <a rel="{{ rel }}" href="{% url 'chrono-manager-agenda-add-desk' pk=object.id %}">{% trans 'New Desk' %}</a>
26 26
  {% endif %}
27 27
{% endif %}
28 28
</span>
......
45 45
        {% elif event.waiting_list_places %}
46 46
          data-total="{{event.waiting_list_places}}" data-booked="{{event.waiting_list}}"
47 47
        {% endif %}
48
        ><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-event-edit' pk=event.id %}{% else %}#{% endif %}">
48
        ><a rel="{{ rel }}" href="{% if user_can_manage %}{% url 'chrono-manager-event-edit' pk=event.id %}{% else %}#{% endif %}">
49 49
        {% if event.label %}{{event.label}} / {% endif %}
50 50
        {{ event.start_datetime }}
51 51
        {% if event.full %}/ <span class="full">{% trans "full" %}</span>{% endif %}
......
64 64
        ({% trans "out of bookable period" %})
65 65
        {% endif %}
66 66
            </a>
67
        {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-event-delete' pk=event.id %}">{% trans "remove" %}</a>{% endif %}
67
        {% if user_can_manage %}<a rel="{{ rel }}" class="delete" href="{% url 'chrono-manager-event-delete' pk=event.id %}">{% trans "remove" %}</a>{% endif %}
68 68
        <span class="occupation-bar"></span>
69 69
    </li>
70 70
    {% endfor %}
......
89 89
{% if object.meetingtype_set.count %}
90 90
  <ul class="objects-list single-links">
91 91
    {% for meeting_type in object.meetingtype_set.all %}
92
    <li><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-meeting-type-edit' pk=meeting_type.id %}{% else %}#{% endif %}">
92
    <li><a rel="{{ rel }}" href="{% if user_can_manage %}{% url 'chrono-manager-meeting-type-edit' pk=meeting_type.id %}{% else %}#{% endif %}">
93 93
        {{meeting_type.label}}
94 94
        <span class="duration">({{meeting_type.duration}} {% trans "minutes" %})</span>
95 95
        <span class="identifier">[{% trans "identifier:" %} {{meeting_type.slug}}]</span>
96 96
        </a>
97
        {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-meeting-type-delete' pk=meeting_type.id %}">{% trans "remove" %}</a>{% endif %}
97
        {% if user_can_manage %}<a rel="{{ rel }}" class="delete" href="{% url 'chrono-manager-meeting-type-delete' pk=meeting_type.id %}">{% trans "remove" %}</a>{% endif %}
98 98
    </li>
99 99
    {% endfor %}
100 100
  </ul>
......
119 119
            {% url 'chrono-manager-agenda-add-time-period' agenda_pk=object.pk pk=desk.pk as add_time_period_url %}
120 120
            <ul class="objects-list single-links">
121 121
                {% if forloop.counter != 1 or forloop.revcounter != 1 %}
122
                <li><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-desk-edit' pk=desk.id %}{% else %}#{% endif %}">
122
                <li><a rel="{{ rel }}" href="{% if user_can_manage %}{% url 'chrono-manager-desk-edit' pk=desk.id %}{% else %}#{% endif %}">
123 123
                    <strong>{{ desk.label }}</strong>
124 124
                    </a>
125
                   {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-desk-delete' pk=desk.id %}">{% trans "remove" %}</a>{% endif %}
125
                   {% if user_can_manage %}<a rel="{{ rel }}" class="delete" href="{% url 'chrono-manager-desk-delete' pk=desk.id %}">{% trans "remove" %}</a>{% endif %}
126 126
                </li>
127 127
                {% endif %}
128 128
                {% for time_period in desk.timeperiod_set.all %}
129
                <li><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-time-period-edit' pk=time_period.id %}{% else %}#{% endif %}">
129
                <li><a rel="{{ rel }}" href="{% if user_can_manage %}{% url 'chrono-manager-time-period-edit' pk=time_period.id %}{% else %}#{% endif %}">
130 130
                {{time_period.weekday_str}} / {{time_period.start_time}} → {{time_period.end_time}} </a>
131
                {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-time-period-delete' pk=time_period.id %}">{% trans "remove" %}</a>{% endif %}
131
                {% if user_can_manage %}<a rel="{{ rel }}" class="delete" href="{% url 'chrono-manager-time-period-delete' pk=time_period.id %}">{% trans "remove" %}</a>{% endif %}
132 132

  
133 133
                </li>
134 134
                {% endfor %}
135 135
                {% if user_can_manage %}
136
                <li><a class="add" rel="popup" href="{{add_time_period_url}}">{% trans 'Add a time period' %}</a></li>
136
                <li><a class="add" rel="{{ rel }}" href="{{add_time_period_url}}">{% trans 'Add a time period' %}</a></li>
137 137
                {% endif %}
138 138
                {% if desk.timeperiod_set.count %}
139 139
                {% url 'chrono-manager-agenda-add-time-period-exception' agenda_pk=object.pk pk=desk.pk as add_time_period_exception_url %}
140
                    <li><a href="#"><strong>{% trans 'Exceptions' %}</strong></a><a class="link-action-icon upload" rel="popup" href="{% url 'chrono-manager-desk-add-import-time-period-exceptions' pk=desk.pk %}" title="{% trans 'Import exceptions from .ics' %}">{% trans 'upload' %}</a></li>
140
                    <li><a href="#"><strong>{% trans 'Exceptions' %}</strong></a><a class="link-action-icon upload" rel="{{ rel }}" href="{% url 'chrono-manager-desk-add-import-time-period-exceptions' pk=desk.pk %}" title="{% trans 'Import exceptions from .ics' %}">{% trans 'upload' %}</a></li>
141 141
                    {% for exception in desk.get_exceptions_within_two_weeks %}
142
                         <li><a rel="popup"  href="{% if user_can_manage %}{% url 'chrono-manager-time-period-exception-edit' pk=exception.pk %}{% else %}#{% endif %}">
142
                         <li><a rel="{{ rel }}"  href="{% if user_can_manage %}{% url 'chrono-manager-time-period-exception-edit' pk=exception.pk %}{% else %}#{% endif %}">
143 143
                        {{ exception }}
144
                        {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-time-period-exception-delete' pk=exception.id %}">{% trans "remove" %}</a>{% endif %}
144
                        {% if user_can_manage %}<a rel="{{ rel }}" class="delete" href="{% url 'chrono-manager-time-period-exception-delete' pk=exception.id %}">{% trans "remove" %}</a>{% endif %}
145 145
                    {% endfor %}
146 146
                    {% if not desk.are_all_exceptions_displayed %}
147
                    <li><a class="timeperiod-exception-all" rel="popup" data-selector="div.timeperiod" href="{% url 'chrono-manager-time-period-exception-list' pk=desk.id %}">({% trans 'see all exceptions' %})</a></li>
147
                    <li><a class="timeperiod-exception-all" rel="{{ rel }}" data-selector="div.timeperiod" href="{% url 'chrono-manager-time-period-exception-list' pk=desk.id %}">({% trans 'see all exceptions' %})</a></li>
148 148
                    {% endif %}
149
                    <li><a class="add" rel="popup" href="{{add_time_period_exception_url}}">{% trans 'Add a time period exception' %}</a></li>
149
                    <li><a class="add" rel="{{ rel }}" href="{{add_time_period_exception_url}}">{% trans 'Add a time period exception' %}</a></li>
150 150
                {% endif %}
151 151
            </ul>
152 152
        </div>
chrono/manager/templates/chrono/manager_desk_form.html
19 19
{% if object.id %}
20 20
<h2>{% trans "Edit Desk" %}</h2>
21 21
<span class="actions">
22
<a rel="popup" href="{% url 'chrono-manager-desk-delete' pk=object.id %}">{% trans 'Delete' %}</a>
22
<a rel="{{ rel }}" href="{% url 'chrono-manager-desk-delete' pk=object.id %}">{% trans 'Delete' %}</a>
23 23
</span>
24 24
{% else %}
25 25
<h2>{% trans "New Desk" %}</h2>
chrono/manager/templates/chrono/manager_event_form.html
17 17
{% if object.id %}
18 18
<h2>{% trans "Edit Event" %}</h2>
19 19
<span class="actions">
20
<a rel="popup" href="{% url 'chrono-manager-event-delete' pk=object.id %}">{% trans 'Delete' %}</a>
20
<a rel="{{ rel }}" href="{% url 'chrono-manager-event-delete' pk=object.id %}">{% trans 'Delete' %}</a>
21 21
</span>
22 22
{% else %}
23 23
<h2>{% trans "New Event" %}</h2>
chrono/manager/templates/chrono/manager_home.html
5 5
<h2>{% trans 'Agendas' %}</h2>
6 6
{% if user.is_staff %}
7 7
<span class="actions">
8
<a rel="popup" href="{% url 'chrono-manager-agendas-import' %}">{% trans 'Import' %}</a>
9
<a rel="popup" href="{% url 'chrono-manager-agenda-add' %}">{% trans 'New' %}</a>
8
<a rel="{{ rel }}" href="{% url 'chrono-manager-agendas-import' %}">{% trans 'Import' %}</a>
9
<a rel="{{ rel }}" href="{% url 'chrono-manager-agenda-add' %}">{% trans 'New' %}</a>
10 10
</span>
11 11
{% endif %}
12 12
{% endblock %}
chrono/manager/templates/chrono/manager_meeting_type_form.html
17 17
{% if object.id %}
18 18
<h2>{% trans "Edit Meeting Type" %}</h2>
19 19
<span class="actions">
20
<a rel="popup" href="{% url 'chrono-manager-meeting-type-delete' pk=object.id %}">{% trans 'Delete' %}</a>
20
<a rel="{{ rel }}" href="{% url 'chrono-manager-meeting-type-delete' pk=object.id %}">{% trans 'Delete' %}</a>
21 21
</span>
22 22
{% else %}
23 23
<h2>{% trans "New Meeting Type" %}</h2>
chrono/manager/templates/chrono/manager_time_period_exception_form.html
19 19
{% if object.id %}
20 20
<h2>{% trans "Edit time period exception" %}</h2>
21 21
<span class="actions">
22
<a rel="popup" href="{% url 'chrono-manager-time-period-exception-delete' pk=object.id %}">{% trans 'Delete' %}</a>
22
<a rel="{{ rel }}" href="{% url 'chrono-manager-time-period-exception-delete' pk=object.id %}">{% trans 'Delete' %}</a>
23 23
</span>
24 24
{% else %}
25 25
<h2>{% trans "New time period exception" %}</h2>
chrono/manager/templates/chrono/manager_time_period_exception_list.html
22 22
    {% for exception in object_list %}
23 23
     <li>
24 24
         <a href="{% if user_can_manage %}{% url 'chrono-manager-time-period-exception-edit' pk=exception.id %}{% else %}#{% endif %}">{{ exception }}</a>
25
        {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-time-period-exception-delete' pk=exception.id %}">{% trans "remove" %}</a>{% endif %}
25
        {% if user_can_manage %}<a rel="{{ rel }}" class="delete" href="{% url 'chrono-manager-time-period-exception-delete' pk=exception.id %}">{% trans "remove" %}</a>{% endif %}
26 26
    </li>
27 27
    {% endfor %}
28 28
   </ul>
chrono/manager/templates/chrono/manager_time_period_form.html
19 19
{% if object.id %}
20 20
<h2>{% trans "Edit Time Period" %}</h2>
21 21
<span class="actions">
22
<a rel="popup" href="{% url 'chrono-manager-time-period-delete' pk=object.id %}">{% trans 'Delete' %}</a>
22
<a rel="{{ rel }}" href="{% url 'chrono-manager-time-period-delete' pk=object.id %}">{% trans 'Delete' %}</a>
23 23
</span>
24 24
{% else %}
25 25
<h2>{% trans "New Time Period" %}</h2>
chrono/manager/utils.py
17 17
from django.db import transaction
18 18

  
19 19
from chrono.agendas.models import Agenda, AgendaImportError
20
from chrono.exceptions import RolesNotInSession
20 21

  
21 22

  
22 23
def export_site():
chrono/manager/views.py
196 196
agenda_view = AgendaView.as_view()
197 197

  
198 198

  
199
class AgendaDateView(object):
199
class UserCanManageMixin(object):
200

  
201
    def get_context_data(self, **kwargs):
202
        context = super(UserCanManageMixin, self).get_context_data(**kwargs)
203
        try:
204
            context['user_can_manage'] = self.agenda.can_be_managed(self.request)
205
            context['rel'] = 'popup'
206
        except RolesNotInSession:
207
            context['user_can_manage'] = True
208
        return context
209

  
210

  
211
class AgendaDateView(UserCanManageMixin):
200 212
    model = Event
201 213
    month_format = '%m'
202 214
    date_field = 'start_datetime'
......
236 248
            context['hour_span'] = max(60 // self.agenda.get_base_meeting_duration(), 1)
237 249
        except ValueError:  # no meeting types defined
238 250
            context['hour_span'] = 1
239
        context['user_can_manage'] = self.agenda.can_be_managed(self.request.user)
240 251
        return context
241 252

  
242 253
    def get_queryset(self):
......
527 538
        return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda.id})
528 539

  
529 540

  
530
class AgendaSettings(ManagedAgendaMixin, DetailView):
541
class AgendaSettings(ManagedAgendaMixin, UserCanManageMixin, DetailView):
531 542
    template_name = 'chrono/manager_agenda_settings.html'
532 543
    model = Agenda
533 544

  
......
552 563
                raise PermissionDenied()
553 564
        return super(DetailView, self).dispatch(request, *args, **kwargs)
554 565

  
555
    def get_context_data(self, **kwargs):
556
        context = super(AgendaSettings, self).get_context_data(**kwargs)
557
        context['user_can_manage'] = self.get_object().can_be_managed(self.request.user)
558
        return context
559

  
560 566
agenda_settings = AgendaSettings.as_view()
561 567

  
562 568

  
......
751 757
time_period_exception_edit = TimePeriodExceptionEditView.as_view()
752 758

  
753 759

  
754
class TimePeriodExceptionListView(ManagedDeskMixin, ListView):
760
class TimePeriodExceptionListView(ManagedDeskMixin, UserCanManageMixin, ListView):
755 761
    template_name = 'chrono/manager_time_period_exception_list.html'
756 762
    model = TimePeriodException
757 763

  
758 764
    def get_queryset(self):
759 765
        return self.model.objects.filter(desk=self.desk)
760 766

  
761
    def get_context_data(self, **kwargs):
762
        context = super(TimePeriodExceptionListView, self).get_context_data(**kwargs)
763
        context['user_can_manage'] = self.desk.agenda.can_be_managed(self.request.user)
764
        return context
765

  
766 767

  
767 768
time_period_exception_list = TimePeriodExceptionListView.as_view()
768 769

  
769
-