Projet

Général

Profil

0004-manager-add-direct-links-from-event-view-to-event-op.patch

Frédéric Péters, 23 décembre 2019 11:37

Télécharger (9,25 ko)

Voir les différences:

Subject: [PATCH 4/4] manager: add direct links from event view to event
 options/delete (#20279)

 .../chrono/manager_confirm_event_delete.html  | 24 +++++++++++++++++++
 .../chrono/manager_event_detail.html          |  5 ++++
 .../templates/chrono/manager_event_form.html  |  5 ++--
 .../manager_events_agenda_settings.html       |  4 ++--
 chrono/manager/views.py                       | 17 ++++++++++++-
 tests/test_manager.py                         | 22 +++++++++++++++--
 6 files changed, 70 insertions(+), 7 deletions(-)
 create mode 100644 chrono/manager/templates/chrono/manager_confirm_event_delete.html
chrono/manager/templates/chrono/manager_confirm_event_delete.html
1
{% extends "chrono/manager_home.html" %}
2
{% load i18n %}
3

  
4
{% block appbar %}
5
<h2>{{ view.model.get_verbose_name }}</h2>
6
{% endblock %}
7

  
8
{% block content %}
9
<form method="post">
10
  {% csrf_token %}
11
  <input type="hidden" name="next" value="{% firstof request.POST.next request.GET.next %}">
12
  <p>
13
  {% if cannot_delete %}
14
  {% blocktrans %}This cannot be removed as there are bookings.{% endblocktrans %}
15
  {% else %}
16
  {% blocktrans %}Are you sure you want to delete this event?{% endblocktrans %}
17
  {% endif %}
18
  </p>
19
  <div class="buttons">
20
    <button class="delete-button" {% if cannot_delete %}disabled="disabled"{% endif %}>{% trans 'Delete' %}</button>
21
    <a class="cancel" href="{{ view.get_success_url }}">{% trans 'Cancel' %}</a>
22
  </div>
23
</form>
24
{% endblock %}
chrono/manager/templates/chrono/manager_event_detail.html
15 15
{% if object.label %}<h2>{{ object.label }} — {{object.start_datetime|date:"DATETIME_FORMAT"}}</h2>
16 16
{% else %}<h2>{{ object.start_datetime|date:"DATETIME_FORMAT"}}</h2>
17 17
{% endif %}
18
<span class="actions">
19
{% if user_can_manage %}
20
<a href="{% url 'chrono-manager-event-edit' pk=agenda.id event_pk=object.id %}">{% trans "Options" %}</a>
21
{% endif %}
22
</span>
18 23
{% endblock %}
19 24

  
20 25
{% block content %}
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.agenda.id event_pk=object.id %}">{% trans 'Delete' %}</a>
20
<a rel="popup" href="{% url 'chrono-manager-event-delete' pk=object.agenda.id event_pk=object.id %}?next={{view.request.GET.next}}">{% trans 'Delete' %}</a>
21 21
</span>
22 22
{% else %}
23 23
<h2>{% trans "New Event" %}</h2>
......
28 28

  
29 29
<form method="post" enctype="multipart/form-data">
30 30
  {% csrf_token %}
31
  <input type="hidden" name="next" value="{% firstof request.POST.next request.GET.next %}">
31 32
  {{ form.as_p }}
32 33
  <div class="buttons">
33 34
    <button class="submit-button">{% trans "Save" %}</button>
34
    <a class="cancel" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Cancel' %}</a>
35
    <a class="cancel" href="{{ view.get_success_url }}">{% trans 'Cancel' %}</a>
35 36
  </div>
36 37
</form>
37 38
{% endblock %}
chrono/manager/templates/chrono/manager_events_agenda_settings.html
22 22
        {% elif event.waiting_list_places %}
23 23
          data-total="{{event.waiting_list_places}}" data-booked="{{event.waiting_list}}"
24 24
        {% endif %}
25
        ><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-event-edit' pk=agenda.id event_pk=event.id %}{% else %}#{% endif %}">
25
        ><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-event-edit' pk=agenda.id event_pk=event.id %}?next=settings{% else %}#{% endif %}">
26 26
        {% if event.label %}{{event.label}} / {% endif %}
27 27
        {{ event.start_datetime }}
28 28
        {% if event.full %}/ <span class="full">{% trans "full" %}</span>{% endif %}
......
41 41
        ({% trans "out of bookable period" %})
42 42
        {% endif %}
43 43
            </a>
44
        {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-event-delete' pk=agenda.id event_pk=event.id %}">{% trans "remove" %}</a>{% endif %}
44
        {% if user_can_manage %}<a rel="popup" class="delete" href="{% url 'chrono-manager-event-delete' pk=agenda.id event_pk=event.id %}?next=settings">{% trans "remove" %}</a>{% endif %}
45 45
        <span class="occupation-bar"></span>
46 46
    </li>
47 47
    {% endfor %}
chrono/manager/views.py
690 690

  
691 691
    def get_context_data(self, **kwargs):
692 692
        context = super(EventDetailView, self).get_context_data(**kwargs)
693
        context['user_can_manage'] = self.agenda.can_be_managed(self.request.user)
693 694
        event = self.get_object()
694 695
        context['booked'] = event.booking_set.filter(
695 696
            cancellation_datetime__isnull=True, in_waiting_list=False
......
709 710
    form_class = EventForm
710 711
    pk_url_kwarg = 'event_pk'
711 712

  
713
    def get_success_url(self):
714
        if self.request.GET.get('next') == 'settings' or self.request.POST.get('next') == 'settings':
715
            return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
716
        return reverse('chrono-manager-event-view', kwargs={'pk': self.agenda.id, 'event_pk': self.object.id})
717

  
712 718

  
713 719
event_edit = EventEditView.as_view()
714 720

  
715 721

  
716 722
class EventDeleteView(ManagedAgendaMixin, DeleteView):
717
    template_name = 'chrono/manager_confirm_delete.html'
723
    template_name = 'chrono/manager_confirm_event_delete.html'
718 724
    model = Event
719 725
    pk_url_kwarg = 'event_pk'
720 726

  
......
733 739
            raise PermissionDenied()
734 740
        return super(EventDeleteView, self).delete(request, *args, **kwargs)
735 741

  
742
    def get_success_url(self):
743
        if self.request.GET.get('next') == 'settings' or self.request.POST.get('next') == 'settings':
744
            return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
745
        day = self.object.start_datetime
746
        return reverse(
747
            'chrono-manager-agenda-month-view',
748
            kwargs={'pk': self.agenda.id, 'year': day.year, 'month': day.month},
749
        )
750

  
736 751

  
737 752
event_delete = EventDeleteView.as_view()
738 753

  
tests/test_manager.py
519 519
    resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
520 520
    resp = resp.click(href='/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id))
521 521
    resp = resp.click('Delete')
522
    assert 'Are you sure you want to delete this?' in resp.text
522
    assert 'Are you sure you want to delete this event?' in resp.text
523 523

  
524 524
    booking = Booking(event=event)
525 525
    booking.save()
......
533 533
    resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
534 534
    resp = resp.click(href='/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id))
535 535
    resp = resp.click('Delete')
536
    assert 'Are you sure you want to delete this?' in resp.text
536
    assert 'Are you sure you want to delete this event?' in resp.text
537 537

  
538 538
    # suddenly the booking is no longer cancelled, but the admin clicks on the
539 539
    # delete button.
......
1883 1883
    assert 'overbooked' in resp.text
1884 1884

  
1885 1885

  
1886
def test_agenda_view_edit_event(app, manager_user):
1887
    test_agenda_view_event(app, manager_user)
1888
    agenda = Agenda.objects.first()
1889
    resp = app.get('/manage/agendas/%s/2019/12/' % agenda.id, status=200)
1890
    resp = resp.click('xyz')
1891
    assert 'Options' not in resp.text
1892

  
1893
    agenda.edit_role = manager_user.groups.all()[0]
1894
    agenda.save()
1895
    event_url = resp.request.url
1896
    resp = app.get(event_url)
1897
    assert 'Options' in resp.text
1898
    resp = resp.click('Options')
1899
    resp.form['start_datetime'] = agenda.event_set.first().start_datetime.strftime('%Y-%m-%d %H:%M')
1900
    resp = resp.form.submit(status=302).follow()
1901
    assert event_url == resp.request.url
1902

  
1903

  
1886 1904
def test_import_agenda_as_manager(app, manager_user):
1887 1905
    # open /manage/ access to manager_user, and check agenda import is not
1888 1906
    # allowed.
1889
-