manager: add direct links from event view to event options/delete (#20279)

This commit is contained in:
Frédéric Péters 2019-12-23 10:23:42 +01:00
parent 07e8f284ed
commit 6907bb1d3b
6 changed files with 70 additions and 7 deletions

View File

@ -0,0 +1,24 @@
{% extends "chrono/manager_home.html" %}
{% load i18n %}
{% block appbar %}
<h2>{{ view.model.get_verbose_name }}</h2>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
<input type="hidden" name="next" value="{% firstof request.POST.next request.GET.next %}">
<p>
{% if cannot_delete %}
{% blocktrans %}This cannot be removed as there are bookings.{% endblocktrans %}
{% else %}
{% blocktrans %}Are you sure you want to delete this event?{% endblocktrans %}
{% endif %}
</p>
<div class="buttons">
<button class="delete-button" {% if cannot_delete %}disabled="disabled"{% endif %}>{% trans 'Delete' %}</button>
<a class="cancel" href="{{ view.get_success_url }}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -15,6 +15,11 @@
{% if object.label %}<h2>{{ object.label }} — {{object.start_datetime|date:"DATETIME_FORMAT"}}</h2>
{% else %}<h2>{{ object.start_datetime|date:"DATETIME_FORMAT"}}</h2>
{% endif %}
<span class="actions">
{% if user_can_manage %}
<a href="{% url 'chrono-manager-event-edit' pk=agenda.id event_pk=object.id %}">{% trans "Options" %}</a>
{% endif %}
</span>
{% endblock %}
{% block content %}

View File

@ -17,7 +17,7 @@
{% if object.id %}
<h2>{% trans "Edit Event" %}</h2>
<span class="actions">
<a rel="popup" href="{% url 'chrono-manager-event-delete' pk=object.agenda.id event_pk=object.id %}">{% trans 'Delete' %}</a>
<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>
</span>
{% else %}
<h2>{% trans "New Event" %}</h2>
@ -28,10 +28,11 @@
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="hidden" name="next" value="{% firstof request.POST.next request.GET.next %}">
{{ form.as_p }}
<div class="buttons">
<button class="submit-button">{% trans "Save" %}</button>
<a class="cancel" href="{% url 'chrono-manager-agenda-settings' pk=agenda.id %}">{% trans 'Cancel' %}</a>
<a class="cancel" href="{{ view.get_success_url }}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -22,7 +22,7 @@
{% elif event.waiting_list_places %}
data-total="{{event.waiting_list_places}}" data-booked="{{event.waiting_list}}"
{% endif %}
><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-event-edit' pk=agenda.id event_pk=event.id %}{% else %}#{% endif %}">
><a rel="popup" href="{% if user_can_manage %}{% url 'chrono-manager-event-edit' pk=agenda.id event_pk=event.id %}?next=settings{% else %}#{% endif %}">
{% if event.label %}{{event.label}} / {% endif %}
{{ event.start_datetime }}
{% if event.full %}/ <span class="full">{% trans "full" %}</span>{% endif %}
@ -41,7 +41,7 @@
({% trans "out of bookable period" %})
{% endif %}
</a>
{% 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 %}
{% 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 %}
<span class="occupation-bar"></span>
</li>
{% endfor %}

View File

@ -700,6 +700,7 @@ class EventDetailView(ViewableAgendaMixin, DetailView):
def get_context_data(self, **kwargs):
context = super(EventDetailView, self).get_context_data(**kwargs)
context['user_can_manage'] = self.agenda.can_be_managed(self.request.user)
event = self.get_object()
context['booked'] = event.booking_set.filter(
cancellation_datetime__isnull=True, in_waiting_list=False
@ -719,12 +720,17 @@ class EventEditView(ManagedAgendaMixin, UpdateView):
form_class = EventForm
pk_url_kwarg = 'event_pk'
def get_success_url(self):
if self.request.GET.get('next') == 'settings' or self.request.POST.get('next') == 'settings':
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
return reverse('chrono-manager-event-view', kwargs={'pk': self.agenda.id, 'event_pk': self.object.id})
event_edit = EventEditView.as_view()
class EventDeleteView(ManagedAgendaMixin, DeleteView):
template_name = 'chrono/manager_confirm_delete.html'
template_name = 'chrono/manager_confirm_event_delete.html'
model = Event
pk_url_kwarg = 'event_pk'
@ -743,6 +749,15 @@ class EventDeleteView(ManagedAgendaMixin, DeleteView):
raise PermissionDenied()
return super(EventDeleteView, self).delete(request, *args, **kwargs)
def get_success_url(self):
if self.request.GET.get('next') == 'settings' or self.request.POST.get('next') == 'settings':
return reverse('chrono-manager-agenda-settings', kwargs={'pk': self.agenda.id})
day = self.object.start_datetime
return reverse(
'chrono-manager-agenda-month-view',
kwargs={'pk': self.agenda.id, 'year': day.year, 'month': day.month},
)
event_delete = EventDeleteView.as_view()

View File

@ -519,7 +519,7 @@ def test_delete_busy_event(app, admin_user):
resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
resp = resp.click(href='/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id))
resp = resp.click('Delete')
assert 'Are you sure you want to delete this?' in resp.text
assert 'Are you sure you want to delete this event?' in resp.text
booking = Booking(event=event)
booking.save()
@ -533,7 +533,7 @@ def test_delete_busy_event(app, admin_user):
resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
resp = resp.click(href='/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id))
resp = resp.click('Delete')
assert 'Are you sure you want to delete this?' in resp.text
assert 'Are you sure you want to delete this event?' in resp.text
# suddenly the booking is no longer cancelled, but the admin clicks on the
# delete button.
@ -1933,6 +1933,24 @@ def test_agenda_view_event(app, manager_user):
assert 'overbooked' in resp.text
def test_agenda_view_edit_event(app, manager_user):
test_agenda_view_event(app, manager_user)
agenda = Agenda.objects.first()
resp = app.get('/manage/agendas/%s/2019/12/' % agenda.id, status=200)
resp = resp.click('xyz')
assert 'Options' not in resp.text
agenda.edit_role = manager_user.groups.all()[0]
agenda.save()
event_url = resp.request.url
resp = app.get(event_url)
assert 'Options' in resp.text
resp = resp.click('Options')
resp.form['start_datetime'] = agenda.event_set.first().start_datetime.strftime('%Y-%m-%d %H:%M')
resp = resp.form.submit(status=302).follow()
assert event_url == resp.request.url
def test_import_agenda_as_manager(app, manager_user):
# open /manage/ access to manager_user, and check agenda import is not
# allowed.