Skip to content

Commit 9ac9493

Browse files
committed
Refactor session edit page. Add button to cancel a session, which sets the status. Fixes ietf-tools#2296. Commit ready for merge.
- Legacy-Id: 13775
1 parent 7d244c9 commit 9ac9493

6 files changed

Lines changed: 150 additions & 73 deletions

File tree

ietf/secr/meetings/forms.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,3 +234,9 @@ def clean_file(self):
234234
if not re.match(r'bluesheets-\d+',file.name):
235235
raise forms.ValidationError('Incorrect filename format')
236236
return file
237+
238+
class SessionEditForm(forms.ModelForm):
239+
class Meta:
240+
model = Session
241+
fields = ['agenda_note']
242+

ietf/secr/meetings/tests.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from django.urls import reverse
1111

1212
from ietf.group.models import Group, GroupEvent
13-
from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment
13+
from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment, Session
1414
from ietf.meeting.test_data import make_meeting_test_data
1515
from ietf.person.models import Person
1616
from ietf.secr.meetings.forms import get_times
@@ -350,6 +350,23 @@ def test_meetings_schedule(self):
350350
response = self.client.get(url)
351351
self.assertEqual(response.status_code, 200)
352352

353+
def test_meetings_session_edit(self):
354+
meeting = make_meeting_test_data()
355+
session = Session.objects.filter(meeting=meeting,group__acronym='mars').first()
356+
url = reverse('ietf.secr.meetings.views.session_edit', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.agenda.name,'session_id':session.id})
357+
redirect_url = reverse('ietf.secr.meetings.views.select_group', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.agenda.name})
358+
self.client.login(username="secretary", password="secretary+password")
359+
response = self.client.get(url)
360+
self.assertEqual(response.status_code, 200)
361+
response = self.client.post(url, {'agenda_note':'TEST'})
362+
self.assertRedirects(response, redirect_url)
363+
session = Session.objects.get(id=session.id)
364+
self.assertEqual(session.agenda_note, 'TEST')
365+
response = self.client.post(url, {'agenda_note':'TEST','submit':'Cancel'})
366+
self.assertRedirects(response, redirect_url)
367+
session = Session.objects.get(id=session.id)
368+
self.assertEqual(session.status.slug, 'canceled')
369+
353370
# ----------------------
354371
# Unit Tests
355372
# -----------------------

ietf/secr/meetings/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@
2323
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', views.times_edit),
2424
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/unschedule/(?P<session_id>\d{1,6})/$', views.unschedule),
2525
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<acronym>[-a-z0-9]+)/schedule/$', views.schedule),
26+
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<session_id>\d{1,6})/edit/$', views.session_edit),
2627
url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', views.remove_session),
2728
]

ietf/secr/meetings/views.py

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55

66
from django.conf import settings
77
from django.contrib import messages
8-
from django.urls import reverse
98
from django.db.models import Max
109
from django.forms.formsets import formset_factory
1110
from django.forms.models import inlineformset_factory
12-
from django.http import HttpResponseRedirect, HttpResponse
11+
from django.http import HttpResponse
1312
from django.shortcuts import render, get_object_or_404, redirect
1413
from django.utils.functional import curry
1514

@@ -23,11 +22,9 @@
2322
from ietf.person.models import Person
2423
from ietf.secr.meetings.blue_sheets import create_blue_sheets
2524
from ietf.secr.meetings.forms import ( BaseMeetingRoomFormSet, MeetingModelForm, MeetingSelectForm,
26-
MeetingRoomForm, NewSessionForm, NonSessionForm, TimeSlotForm,
25+
MeetingRoomForm, NewSessionForm, NonSessionForm, TimeSlotForm, SessionEditForm,
2726
UploadBlueSheetForm, get_next_slot )
28-
from ietf.secr.proceedings.views import build_choices
2927
from ietf.secr.proceedings.utils import handle_upload_file
30-
from ietf.secr.sreq.forms import GroupSelectForm
3128
from ietf.secr.sreq.views import get_initial_session
3229
from ietf.secr.utils.meeting import get_session, get_timeslot
3330
from ietf.mailtrigger.utils import gather_address_lists
@@ -834,50 +831,54 @@ def select(request, meeting_id, schedule_name):
834831
'meeting': meeting,
835832
'schedule': schedule},
836833
)
837-
834+
838835
@role_required('Secretariat')
839836
def select_group(request, meeting_id, schedule_name):
840837
'''
841-
In this view the user can select the group to schedule. Only those groups that have
842-
submitted session requests appear in the dropdowns.
843-
844-
NOTE: BOF list includes Proposed Working Group type, per Wanda
838+
Select the scheduled session to edit.
845839
'''
846840
meeting = get_object_or_404(Meeting, number=meeting_id)
847841
schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
848-
849-
if request.method == 'POST':
850-
group = request.POST.get('group',None)
851-
if group:
852-
redirect_url = reverse('ietf.secr.meetings.views.schedule', kwargs={'meeting_id':meeting_id,'acronym':group,'schedule_name':schedule_name})
853-
else:
854-
redirect_url = reverse('ietf.secr.meetings.views.select_group',kwargs={'meeting_id':meeting_id,'schedule_name':schedule_name})
855-
messages.error(request, 'No group selected')
856-
857-
return HttpResponseRedirect(redirect_url)
842+
assignments = schedule.assignments.filter(timeslot__type='session').order_by('session__group__acronym')
858843

859-
# split groups into scheduled / unscheduled
860-
scheduled_groups, unscheduled_groups = sort_groups(meeting,schedule)
844+
return render(request, 'meetings/select_group.html', {
845+
'meeting': meeting,
846+
'schedule': schedule,
847+
'assignments': assignments},
848+
)
861849

862-
# prep group form
863-
wgs = filter(lambda a: a.type_id in ('wg','ag') and a.state_id=='active', unscheduled_groups)
864-
group_form = GroupSelectForm(choices=build_choices(wgs))
850+
@role_required('Secretariat')
851+
def session_edit(request, meeting_id, schedule_name, session_id):
852+
'''
853+
Edit session details, cancel session
854+
'''
855+
meeting = get_object_or_404(Meeting, number=meeting_id)
856+
schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
857+
session = get_object_or_404(Session, id=session_id)
858+
assignment = SchedTimeSessAssignment.objects.get(schedule=schedule,session=session)
865859

866-
# prep BOFs form
867-
bofs = filter(lambda a: a.type_id=='wg' and a.state_id in ('bof','proposed'), unscheduled_groups)
868-
bof_form = GroupSelectForm(choices=build_choices(bofs))
860+
if request.method == 'POST':
861+
form = SessionEditForm(request.POST, instance=session)
862+
if form.is_valid():
863+
button_text = request.POST.get('submit', '')
864+
if button_text == 'Cancel':
865+
session.status = SessionStatusName.objects.get(slug='canceled')
866+
session.save()
867+
messages.success(request, 'Session canceled')
868+
else:
869+
form.save()
870+
messages.success(request, 'Session saved')
871+
return redirect('ietf.secr.meetings.views.select_group', meeting_id=meeting_id,schedule_name=schedule_name)
869872

870-
# prep IRTF form
871-
irtfs = filter(lambda a: a.type_id=='rg' and a.state_id in ('active','proposed'), unscheduled_groups)
872-
irtf_form = GroupSelectForm(choices=build_choices(irtfs))
873+
else:
874+
form = SessionEditForm(instance=session)
873875

874-
return render(request, 'meetings/select_group.html', {
875-
'group_form': group_form,
876-
'bof_form': bof_form,
877-
'irtf_form': irtf_form,
878-
'scheduled_groups': scheduled_groups,
876+
return render(request, 'meetings/session_edit.html', {
879877
'meeting': meeting,
880-
'schedule': schedule},
878+
'schedule': schedule,
879+
'session': session,
880+
'timeslot': assignment.timeslot,
881+
'form': form},
881882
)
882883

883884
@role_required('Secretariat')

ietf/secr/templates/meetings/select_group.html

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,45 +17,13 @@
1717
{% block content %}
1818

1919
<div class="module">
20-
<h2>IETF {{ meeting.number }} - Schedule Sessions</h2>
21-
<p>The lists below contain those groups which have submitted a session request. Select a
22-
group to schedule sessions. (Proposed Working Groups are in the BOFs list).</p>
23-
<p>Select this link to <a href="https://datatracker.ietf.org/meeting/{{ meeting.number }}/agenda.html">View Agenda</a></p>
20+
<h2>IETF {{ meeting.number }} - Scheduled Sessions</h2>
2421

25-
<div class="inline-related">
26-
<form class="internal-form" action="" method="post">{% csrf_token %}
27-
<label for="id_group">Working Groups</label></th>
28-
{{ group_form.group }}
29-
<input type="submit" name="submit" value="Select" />
30-
</form>
31-
<form class="internal-form" action="" method="post">{% csrf_token %}
32-
<label for="id_group">BOFs</label>
33-
{{ bof_form.group }}
34-
<input type="submit" name="submit" value="Select" />
35-
</form>
36-
<form class="internal-form" action="" method="post">{% csrf_token %}
37-
<label for="id_group">IRTF</label>
38-
{{ irtf_form.group }}
39-
<input type="submit" name="submit" value="Select" />
40-
</form>
41-
42-
<div class="button-group">
43-
<ul>
44-
<li><button onclick="window.location='../'">Back</button></li>
45-
</ul>
46-
</div> <!-- button-group -->
47-
48-
</div><!-- inline-related-->
49-
50-
<div class="inline-related">
51-
<h2>Scheduled Sessions</h2>
5222
<ul id="id_scheduled_sessions">
53-
{% for group in scheduled_groups %}
54-
<li><a href="{% url "ietf.secr.meetings.views.schedule" meeting_id=meeting.number schedule_name=schedule.name acronym=group.acronym %}">{{ group.acronym }}</a></li>
23+
{% for assignment in assignments %}
24+
<li><a href="{% url "ietf.secr.meetings.views.session_edit" meeting_id=meeting.number schedule_name=schedule.name session_id=assignment.session.pk %}">{{ assignment.session.group.acronym }} - {{ assignment.timeslot.time|date:"D" }}</a></li>
5525
{% endfor %}
5626
</ul>
57-
</div><!-- inline-related-->
58-
5927

6028
</div> <!-- module -->
6129

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
{% extends "base_site.html" %}
2+
{% load staticfiles %}
3+
4+
{% block title %}Meetings{% endblock %}
5+
6+
{% block extrahead %}{{ block.super }}
7+
{% endblock %}
8+
9+
{% block breadcrumbs %}{{ block.super }}
10+
&raquo; <a href="{% url "ietf.secr.meetings.views.main" %}">Meetings</a>
11+
&raquo; <a href="{% url "ietf.secr.meetings.views.view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
12+
&raquo; <a href="{% url "ietf.secr.meetings.views.select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
13+
&raquo; <a href="{% url "ietf.secr.meetings.views.select_group" meeting_id=meeting.number schedule_name=schedule.name %}">Select</a>
14+
&raquo; {{ session.group.acronym }}
15+
{% endblock %}
16+
17+
{% block content %}
18+
19+
<div class="module">
20+
<h2>Edit Session</h2>
21+
22+
<form id="meetings-schedule-form" method="post" action="">{% csrf_token %}
23+
<div class="inline-related{% if forloop.last %} last-related{% endif %}">
24+
<table class="full-width amstable">
25+
<col width="200">
26+
<tr>
27+
<th>Day:</th>
28+
<td>{{ timeslot.time|date:"l" }}</td>
29+
</tr>
30+
<tr>
31+
<th>Time:</th>
32+
<td>{{ timeslot.time|time:"H:i" }}</td>
33+
</tr>
34+
<tr>
35+
<th>Room:</th>
36+
<td>{{ timeslot.location.name }}</td>
37+
</tr>
38+
<tr>
39+
<th>Status:</th>
40+
<td>{{ session.status }}</td>
41+
</tr>
42+
{{ form }}
43+
</table>
44+
</div> <!-- inline-related -->
45+
</div> <!-- inline-group -->
46+
47+
<div class="button-group">
48+
<ul>
49+
<li><button type="submit" name="submit" value="Save">Save</button></li>
50+
<li><button type="submit" name="submit" value="Cancel">Cancel Session</button></li>
51+
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.select_group" meeting_id=meeting.number schedule_name=schedule.name %}'">Back</button></li>
52+
</ul>
53+
</div> <!-- button-group -->
54+
55+
</form>
56+
57+
</div> <!-- module -->
58+
59+
{% endblock %}
60+
61+
{% block footer-extras %}
62+
{% include "includes/meetings_footer.html" %}
63+
{% endblock %}
64+
65+
66+
67+
68+
69+
70+
71+
72+
73+
74+
75+
76+
77+
78+
79+
80+
81+
82+
83+
84+

0 commit comments

Comments
 (0)