Projet

Général

Profil

0002-manager-open-the-correct-tab-after-redirect-65653.patch

Lauréline Guérin, 14 juin 2022 17:58

Télécharger (17,7 ko)

Voir les différences:

Subject: [PATCH 2/2] manager: open the correct tab after redirect (#65653)

 chrono/manager/static/js/chrono.manager.js    |  8 +++
 chrono/manager/views.py                       | 62 ++++++++++++++++---
 tests/manager/test_all.py                     |  2 +-
 tests/manager/test_meetings_agenda_options.py |  2 +-
 tests/manager/test_resource.py                |  4 +-
 tests/manager/test_timeperiod.py              |  2 +-
 tests/manager/test_unavailability_calendar.py |  6 +-
 7 files changed, 69 insertions(+), 17 deletions(-)
chrono/manager/static/js/chrono.manager.js
48 48
      total_form.val(form_num + 1);
49 49
    })
50 50
  }
51

  
52
  /* focus tab from #open:<tab slug> anchor, to point to open panel */
53
  if (document.location.hash && document.location.hash.indexOf('#open:') == 0) {
54
    const $tab_button = $('#tab-' + document.location.hash.substring(6) + '[role=tab]');
55
    if ($tab_button.length) {
56
      $('.pk-tabs')[0].tabs.selectTab($tab_button[0]);
57
    }
58
  }
51 59
});
chrono/manager/views.py
1154 1154

  
1155 1155

  
1156 1156
class ManagedAgendaMixin(ViewableAgendaMixin):
1157
    tab_anchor = None
1158

  
1157 1159
    def check_permissions(self, user):
1158 1160
        return self.agenda.can_be_managed(user)
1159 1161

  
......
1165 1167
        return kwargs
1166 1168

  
1167 1169
    def get_success_url(self):
1168
        return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
1170
        url = reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
1171
        if self.tab_anchor:
1172
            url += '#open:%s' % self.tab_anchor
1173
        return url
1169 1174

  
1170 1175

  
1171 1176
class AgendaEditView(ManagedAgendaMixin, UpdateView):
......
1186 1191
class AgendaBookingDelaysView(AgendaEditView):
1187 1192
    form_class = AgendaBookingDelaysForm
1188 1193
    title = _('Configure booking delays')
1194
    tab_anchor = 'delays'
1189 1195

  
1190 1196

  
1191 1197
agenda_booking_delays = AgendaBookingDelaysView.as_view()
......
1194 1200
class AgendaRolesView(AgendaEditView):
1195 1201
    form_class = AgendaRolesForm
1196 1202
    title = _('Configure roles')
1203
    tab_anchor = 'permissions'
1197 1204

  
1198 1205

  
1199 1206
agenda_roles = AgendaRolesView.as_view()
......
1202 1209
class AgendaDisplaySettingsView(AgendaEditView):
1203 1210
    form_class = AgendaDisplaySettingsForm
1204 1211
    title = _("Configure display options")
1212
    tab_anchor = 'display-options'
1205 1213

  
1206 1214
    def set_agenda(self, **kwargs):
1207 1215
        self.agenda = get_object_or_404(Agenda.objects.exclude(kind='virtual'), pk=kwargs.get('pk'))
......
1216 1224
class AgendaBookingCheckSettingsView(AgendaEditView):
1217 1225
    form_class = AgendaBookingCheckSettingsForm
1218 1226
    title = _("Configure booking check options")
1227
    tab_anchor = 'booking-check-options'
1219 1228

  
1220 1229
    def set_agenda(self, **kwargs):
1221 1230
        self.agenda = get_object_or_404(Agenda, pk=kwargs.get('pk'), kind='events')
......
1748 1757

  
1749 1758
class ManagedAgendaSubobjectMixin:
1750 1759
    agenda = None
1760
    tab_anchor = None
1751 1761

  
1752 1762
    def dispatch(self, request, *args, **kwargs):
1753 1763
        self.agenda = self.get_object().agenda
......
1761 1771
        return context
1762 1772

  
1763 1773
    def get_success_url(self):
1764
        return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
1774
        url = reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
1775
        if self.tab_anchor:
1776
            url += '#open:%s' % self.tab_anchor
1777
        return url
1765 1778

  
1766 1779

  
1767 1780
class ManagedDeskMixin:
1768 1781
    desk = None
1782
    tab_anchor = None
1769 1783

  
1770 1784
    def dispatch(self, request, *args, **kwargs):
1771 1785
        try:
......
1790 1804
        return context
1791 1805

  
1792 1806
    def get_success_url(self):
1793
        return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda.id})
1807
        url = reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda.id})
1808
        if self.tab_anchor:
1809
            url += '#open:%s' % self.tab_anchor
1810
        return url
1794 1811

  
1795 1812

  
1796 1813
class ManagedTimePeriodMixin:
1797 1814
    agenda = None
1815
    tab_anchor = None
1798 1816

  
1799 1817
    def dispatch(self, request, *args, **kwargs):
1800 1818
        self.time_period = self.get_object()
......
1812 1830
        return context
1813 1831

  
1814 1832
    def get_success_url(self):
1815
        return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
1833
        url = reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
1834
        if self.tab_anchor:
1835
            url += '#open:%s' % self.tab_anchor
1836
        return url
1816 1837

  
1817 1838

  
1818 1839
class ManagedTimePeriodExceptionMixin:
1819

  
1820 1840
    desk = None
1821 1841
    unavailability_calendar = None
1842
    tab_anchor = None
1822 1843

  
1823 1844
    def dispatch(self, request, *args, **kwargs):
1824 1845
        object_ = self.get_object()
......
1845 1866

  
1846 1867
    def get_success_url(self):
1847 1868
        if self.desk:
1848
            return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda.id})
1869
            url = reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda.id})
1849 1870
        elif self.unavailability_calendar:
1850
            return reverse(
1871
            url = reverse(
1851 1872
                'chrono-manager-unavailability-calendar-settings',
1852 1873
                kwargs={'pk': self.unavailability_calendar.pk},
1853 1874
            )
1875
        if self.tab_anchor:
1876
            url += '#open:%s' % self.tab_anchor
1877
        return url
1854 1878

  
1855 1879

  
1856 1880
class AgendaSettingsRedirectView(RedirectView):
......
2092 2116
    template_name = 'chrono/manager_agenda_notifications_form.html'
2093 2117
    model = AgendaNotificationsSettings
2094 2118
    form_class = AgendaNotificationsForm
2119
    tab_anchor = 'notifications'
2095 2120

  
2096 2121
    def get_object(self):
2097 2122
        try:
......
2114 2139
    title = _('Reminder Settings')
2115 2140
    model = AgendaReminderSettings
2116 2141
    form_class = AgendaReminderForm
2142
    tab_anchor = 'reminders'
2117 2143

  
2118 2144
    def get_object(self):
2119 2145
        try:
......
2548 2574
class AgendaAddResourceView(ManagedAgendaMixin, FormView):
2549 2575
    template_name = 'chrono/manager_agenda_resource_form.html'
2550 2576
    form_class = AgendaResourceForm
2577
    tab_anchor = 'resources'
2551 2578

  
2552 2579
    def set_agenda(self, **kwargs):
2553 2580
        self.agenda = get_object_or_404(Agenda, id=kwargs.get('pk'), kind='meetings')
......
2569 2596
    template_name = 'chrono/manager_confirm_delete.html'
2570 2597
    model = Resource
2571 2598
    pk_url_kwarg = 'resource_pk'
2599
    tab_anchor = 'resources'
2572 2600

  
2573 2601
    def set_agenda(self, **kwargs):
2574 2602
        self.agenda = get_object_or_404(Agenda, id=kwargs.get('pk'), kind='meetings')
......
2630 2658
                        break
2631 2659

  
2632 2660
        return HttpResponseRedirect(
2633
            reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda_id})
2661
            '%s#open:time-periods'
2662
            % reverse('chrono-manager-agenda-settings', kwargs={'pk': self.desk.agenda_id})
2634 2663
        )
2635 2664

  
2636 2665

  
......
2731 2760
class AgendaAddTimePeriodView(ManagedDeskMixin, FormView):
2732 2761
    template_name = 'chrono/manager_time_period_form.html'
2733 2762
    form_class = TimePeriodAddForm
2763
    tab_anchor = 'time-periods'
2734 2764

  
2735 2765
    def get_form_kwargs(self):
2736 2766
        return super(FormView, self).get_form_kwargs()
......
2750 2780
class VirtualAgendaAddTimePeriodView(ManagedAgendaMixin, FormView):
2751 2781
    template_name = 'chrono/manager_time_period_form.html'
2752 2782
    form_class = TimePeriodAddForm
2783
    tab_anchor = 'time-periods'
2753 2784

  
2754 2785
    def get_form_kwargs(self):
2755 2786
        return super(FormView, self).get_form_kwargs()
......
2766 2797
    template_name = 'chrono/manager_time_period_form.html'
2767 2798
    model = TimePeriod
2768 2799
    form_class = TimePeriodForm
2800
    tab_anchor = 'time-periods'
2769 2801

  
2770 2802

  
2771 2803
time_period_edit = TimePeriodEditView.as_view()
......
2774 2806
class TimePeriodDeleteView(ManagedTimePeriodMixin, DeleteView):
2775 2807
    template_name = 'chrono/manager_confirm_delete.html'
2776 2808
    model = TimePeriod
2809
    tab_anchor = 'time-periods'
2777 2810

  
2778 2811
    def delete(self, request, *args, **kwargs):
2779 2812
        time_period = self.get_object()
......
2803 2836
    model = Desk
2804 2837
    form_class = NewDeskForm
2805 2838
    agenda = None
2839
    tab_anchor = 'desks'
2806 2840

  
2807 2841
    def set_agenda(self, **kwargs):
2808 2842
        self.agenda = get_object_or_404(Agenda, pk=kwargs.get('pk'), kind='meetings')
......
2815 2849
    template_name = 'chrono/manager_desk_form.html'
2816 2850
    model = Desk
2817 2851
    form_class = DeskForm
2852
    tab_anchor = 'desks'
2818 2853

  
2819 2854
    def get_queryset(self):
2820 2855
        return super().get_queryset().filter(agenda__kind='meetings')
......
2826 2861
class DeskDeleteView(ManagedAgendaSubobjectMixin, DeleteView):
2827 2862
    template_name = 'chrono/manager_confirm_delete.html'
2828 2863
    model = Desk
2864
    tab_anchor = 'desks'
2829 2865

  
2830 2866
    def dispatch(self, request, *args, **kwargs):
2831 2867
        agenda = self.get_object().agenda
......
2895 2931
    template_name = 'chrono/manager_time_period_exception_form.html'
2896 2932
    model = TimePeriodException
2897 2933
    form_class = NewTimePeriodExceptionForm
2934
    tab_anchor = 'time-periods'
2898 2935

  
2899 2936
    def get_context_data(self, **kwargs):
2900 2937
        context = super().get_context_data(**kwargs)
......
2925 2962
    template_name = 'chrono/manager_time_period_exception_form.html'
2926 2963
    model = TimePeriodException
2927 2964
    form_class = TimePeriodExceptionForm
2965
    tab_anchor = 'time-periods'
2928 2966

  
2929 2967
    def form_valid(self, form):
2930 2968
        result = super().form_valid(form)
......
2972 3010
class TimePeriodExceptionDeleteView(ManagedTimePeriodExceptionMixin, DeleteView):
2973 3011
    template_name = 'chrono/manager_confirm_exception_delete.html'
2974 3012
    model = TimePeriodException
3013
    tab_anchor = 'time-periods'
2975 3014

  
2976 3015
    def get_success_url(self):
2977 3016
        if self.desk:
......
3018 3057
    model = Desk
3019 3058
    form_class = DeskExceptionsImportForm
3020 3059
    template_name = 'chrono/manager_import_exceptions.html'
3060
    tab_anchor = 'time-periods'
3021 3061

  
3022 3062
    def get_context_data(self, **kwargs):
3023 3063
        context = super().get_context_data(**kwargs)
......
3079 3119
class TimePeriodExceptionSourceDeleteView(ManagedTimePeriodExceptionMixin, DeleteView):
3080 3120
    template_name = 'chrono/manager_confirm_source_delete.html'
3081 3121
    model = TimePeriodExceptionSource
3122
    tab_anchor = 'time-periods'
3082 3123

  
3083 3124
    def delete(self, request, *args, **kwargs):
3084 3125
        source = self.get_object()
......
3106 3147
    model = TimePeriodExceptionSource
3107 3148
    form_class = TimePeriodExceptionSourceReplaceForm
3108 3149
    template_name = 'chrono/manager_replace_exceptions.html'
3150
    tab_anchor = 'time-periods'
3109 3151

  
3110 3152
    def get_queryset(self):
3111 3153
        queryset = super().get_queryset()
......
3136 3178

  
3137 3179
class TimePeriodExceptionSourceRefreshView(ManagedTimePeriodExceptionMixin, DetailView):
3138 3180
    model = TimePeriodExceptionSource
3181
    tab_anchor = 'time-periods'
3139 3182

  
3140 3183
    def get_queryset(self):
3141 3184
        queryset = super().get_queryset()
......
3404 3447

  
3405 3448
        messages.info(self.request, message % {'source': source, 'desk': source.desk})
3406 3449
        return HttpResponseRedirect(
3407
            reverse('chrono-manager-agenda-settings', kwargs={'pk': source.desk.agenda_id})
3450
            '%s#open:time-periods'
3451
            % reverse('chrono-manager-agenda-settings', kwargs={'pk': source.desk.agenda_id})
3408 3452
        )
3409 3453

  
3410 3454

  
tests/manager/test_all.py
2248 2248
    url = '/manage/timeperiods/%s/delete' % tp.pk
2249 2249
    resp = resp.click(href=url)
2250 2250
    resp = resp.form.submit()
2251
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
2251
    assert resp.location.endswith('/manage/agendas/%s/settings#open:time-periods' % agenda.id)
2252 2252
    assert TimePeriod.objects.count() == 0
2253 2253

  
2254 2254

  
tests/manager/test_meetings_agenda_options.py
378 378
    resp = resp.click('Desk A')
379 379
    resp = resp.click('Delete')
380 380
    resp = resp.form.submit()
381
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.pk)
381
    assert resp.location.endswith('/manage/agendas/%s/settings#open:desks' % agenda.pk)
382 382
    assert Desk.objects.count() == 1
383 383

  
384 384
    # only one desk
tests/manager/test_resource.py
572 572
    assert list(resp.context['form'].fields['resource'].queryset) == [resource]
573 573
    resp.form['resource'] = resource.pk
574 574
    resp = resp.form.submit()
575
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.pk)
575
    assert resp.location.endswith('/manage/agendas/%s/settings#open:resources' % agenda.pk)
576 576
    assert list(agenda.resources.all()) == [resource]
577 577
    resp = resp.follow()
578 578
    assert '/manage/resource/%s/' % resource.pk in resp.text
......
582 582

  
583 583
    resp = app.get('/manage/agendas/%s/resource/%s/delete/' % (agenda.pk, resource.pk))
584 584
    resp = resp.form.submit()
585
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.pk)
585
    assert resp.location.endswith('/manage/agendas/%s/settings#open:resources' % agenda.pk)
586 586
    assert list(agenda.resources.all()) == []
587 587
    resp = resp.follow()
588 588
    assert '/manage/resource/%s/' % resource.pk not in resp.text
tests/manager/test_timeperiod.py
211 211
    resp = resp.click('Wednesday', index=0)
212 212
    resp = resp.click('Delete')
213 213
    resp = resp.form.submit()
214
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
214
    assert resp.location.endswith('/manage/agendas/%s/settings#open:time-periods' % agenda.id)
215 215
    assert TimePeriod.objects.count() == 1
216 216

  
217 217

  
tests/manager/test_unavailability_calendar.py
216 216
    resp = resp.click(
217 217
        href='/manage/desk/%s/unavailability-calendar/%s/toggle/' % (desk.pk, unavailability_calendar.pk)
218 218
    )
219
    settings_url = '/manage/agendas/%s/settings' % agenda.pk
219
    settings_url = '/manage/agendas/%s/settings#open:time-periods' % agenda.pk
220 220
    assert resp.location.endswith(settings_url)
221 221
    # exception from calendar displayed on the settings page
222 222
    resp = app.get(settings_url)
......
233 233
    resp = resp.click(
234 234
        href='/manage/desk/%s/unavailability-calendar/%s/toggle/' % (desk.pk, unavailability_calendar.pk)
235 235
    )
236
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.pk)
236
    assert resp.location.endswith('/manage/agendas/%s/settings#open:time-periods' % agenda.pk)
237 237
    resp = app.get(exceptions_url)
238 238
    assert 'calendar' in resp.text
239 239
    assert 'enable' in resp.text
......
255 255
    resp = resp.click(
256 256
        href='/manage/desk/%s/unavailability-calendar/%s/toggle/' % (desk.pk, unavailability_calendar.pk)
257 257
    )
258
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.pk)
258
    assert resp.location.endswith('/manage/agendas/%s/settings#open:time-periods' % agenda.pk)
259 259
    resp = resp.follow()
260 260
    assert 'One or several bookings overlap with exceptions.' in resp.text
261 261

  
262
-