Give secretariat the ability to cancel non-working group sessions. Fixes #2537. Commit ready for merge.

- Legacy-Id: 15328
This commit is contained in:
Ryan Cross 2018-07-14 16:14:35 +00:00
parent c7a9c2f121
commit ec279682d2
6 changed files with 68 additions and 2 deletions

View file

@ -335,6 +335,19 @@ class SecrMeetingTestCase(TestCase):
self.assertRedirects(response, target)
self.assertFalse(meeting.agenda.assignments.filter(timeslot=slot))
def test_meetings_non_session_cancel(self):
meeting = make_meeting_test_data()
slot = meeting.agenda.assignments.filter(timeslot__type='reg').first().timeslot
url = reverse('ietf.secr.meetings.views.non_session_cancel', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.agenda.name,'slot_id':slot.id})
redirect_url = reverse('ietf.secr.meetings.views.non_session', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.agenda.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
response = self.client.post(url, {'post':'yes'})
self.assertRedirects(response, redirect_url)
session = slot.sessionassignments.filter(schedule=meeting.agenda).first().session
self.assertEqual(session.status_id, 'canceled')
def test_meetings_select_group(self):
make_meeting_test_data()
url = reverse('ietf.secr.meetings.views.select_group',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})

View file

@ -14,6 +14,7 @@ urlpatterns = [
url(r'^(?P<meeting_id>\d{1,6})/notifications/$', views.notifications),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/$', views.select),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/$', views.non_session),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/cancel/(?P<slot_id>\d{1,6})/$', views.non_session_cancel),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/edit/(?P<slot_id>\d{1,6})/$', views.non_session_edit),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/delete/(?P<slot_id>\d{1,6})/$', views.non_session_delete),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/rooms/$', views.rooms),

View file

@ -491,6 +491,25 @@ def non_session(request, meeting_id, schedule_name):
'schedule': schedule},
)
@role_required('Secretariat')
def non_session_cancel(request, meeting_id, schedule_name, slot_id):
'''
This function cancels the non-session TimeSlot. Check for uploaded
material first. SchedTimeSessAssignment objects get canceled as well.
'''
slot = get_object_or_404(TimeSlot, id=slot_id)
meeting = get_object_or_404(Meeting, number=meeting_id)
schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
if request.method == 'POST' and request.POST['post'] == 'yes':
assignments = slot.sessionassignments.filter(schedule=schedule)
Session.objects.filter(pk__in=[x.session.pk for x in assignments]).update(status_id='canceled')
messages.success(request, 'The session was canceled successfully')
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return render(request, 'confirm_cancel.html', {'object': slot})
@role_required('Secretariat')
def non_session_delete(request, meeting_id, schedule_name, slot_id):
'''

View file

@ -490,6 +490,11 @@ tr.break td {
border-top: 2px solid black;
}
tr.canceled {
background-color: #e12817;
color: white;
}
#id_schedule_selector {
display: inline;
}

View file

@ -0,0 +1,26 @@
{% extends "base_site.html" %}
{% load staticfiles %}
{% block title %}Confirm Cancel{% endblock %}
{% block content %}
<div class="module draft-container">
<h2>Confirm Cancel</h2>
<h3>Are you sure?</h3>
<p>You are about to cancel: {{ object }}</p>
{% if extra %}<p>{{ extra }}</p>{% endif %}
<form action="" method="post">{% csrf_token %}
<div>
<p>
<input type="hidden" name="post" value="yes">
<input type="submit" value="Yes, I'm sure">
<a href="#" onclick="history.go(-1);return false;" class="button cancel-link">Take me back</a>
</p>
</div>
</form>
</div> <!-- module -->
{% endblock %}

View file

@ -6,7 +6,7 @@
<h2>TimeSlots</h2>
{% if slots %}
<table class="full-width">
<table id="nonsessions" class="full-width">
<thead>
<tr>
<th>Day</th>
@ -19,11 +19,12 @@
<th>Type</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{% for item in slots %}
<tr class="{% cycle row1 row2 %}{% ifchanged item.type %} break{% endifchanged %}">
<tr class="{% cycle row1 row2 %}{% ifchanged item.type %} break{% endifchanged %}{% if item.session.status.slug == "canceled" %} canceled{% endif %}">
<td>{{ item.time|date:"D" }}</td>
<td>{{ item.time|date:"H:i" }}-{{ item.end_time|date:"H:i" }}</td>
<td>{{ item.name }}</td>
@ -33,6 +34,7 @@
<td>{{ item.show_location }}</td>
<td>{{ item.type }}</td>
<td><a href="{% url "ietf.secr.meetings.views.non_session_edit" meeting_id=meeting.number schedule_name=schedule.name slot_id=item.id %}">Edit</a></td>
<td><a href="{% url "ietf.secr.meetings.views.non_session_cancel" meeting_id=meeting.number schedule_name=schedule.name slot_id=item.id %}">Cancel</a></td>
<td><a href="{% url "ietf.secr.meetings.views.non_session_delete" meeting_id=meeting.number schedule_name=schedule.name slot_id=item.id %}">Delete</a></td>
</tr>
{% endfor %}