Refactor session edit page. Add button to cancel a session, which sets the status. Fixes #2296. Commit ready for merge.
- Legacy-Id: 13775
This commit is contained in:
parent
7d244c9a38
commit
9ac9493a70
|
@ -234,3 +234,9 @@ class UploadBlueSheetForm(forms.Form):
|
|||
if not re.match(r'bluesheets-\d+',file.name):
|
||||
raise forms.ValidationError('Incorrect filename format')
|
||||
return file
|
||||
|
||||
class SessionEditForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Session
|
||||
fields = ['agenda_note']
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ from django.conf import settings
|
|||
from django.urls import reverse
|
||||
|
||||
from ietf.group.models import Group, GroupEvent
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment, Session
|
||||
from ietf.meeting.test_data import make_meeting_test_data
|
||||
from ietf.person.models import Person
|
||||
from ietf.secr.meetings.forms import get_times
|
||||
|
@ -350,6 +350,23 @@ class SecrMeetingTestCase(TestCase):
|
|||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_meetings_session_edit(self):
|
||||
meeting = make_meeting_test_data()
|
||||
session = Session.objects.filter(meeting=meeting,group__acronym='mars').first()
|
||||
url = reverse('ietf.secr.meetings.views.session_edit', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.agenda.name,'session_id':session.id})
|
||||
redirect_url = reverse('ietf.secr.meetings.views.select_group', 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, {'agenda_note':'TEST'})
|
||||
self.assertRedirects(response, redirect_url)
|
||||
session = Session.objects.get(id=session.id)
|
||||
self.assertEqual(session.agenda_note, 'TEST')
|
||||
response = self.client.post(url, {'agenda_note':'TEST','submit':'Cancel'})
|
||||
self.assertRedirects(response, redirect_url)
|
||||
session = Session.objects.get(id=session.id)
|
||||
self.assertEqual(session.status.slug, 'canceled')
|
||||
|
||||
# ----------------------
|
||||
# Unit Tests
|
||||
# -----------------------
|
||||
|
|
|
@ -23,5 +23,6 @@ urlpatterns = [
|
|||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', views.times_edit),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/unschedule/(?P<session_id>\d{1,6})/$', views.unschedule),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<acronym>[-a-z0-9]+)/schedule/$', views.schedule),
|
||||
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),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', views.remove_session),
|
||||
]
|
||||
|
|
|
@ -5,11 +5,10 @@ import time
|
|||
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.urls import reverse
|
||||
from django.db.models import Max
|
||||
from django.forms.formsets import formset_factory
|
||||
from django.forms.models import inlineformset_factory
|
||||
from django.http import HttpResponseRedirect, HttpResponse
|
||||
from django.http import HttpResponse
|
||||
from django.shortcuts import render, get_object_or_404, redirect
|
||||
from django.utils.functional import curry
|
||||
|
||||
|
@ -23,11 +22,9 @@ from ietf.group.models import Group, GroupEvent
|
|||
from ietf.person.models import Person
|
||||
from ietf.secr.meetings.blue_sheets import create_blue_sheets
|
||||
from ietf.secr.meetings.forms import ( BaseMeetingRoomFormSet, MeetingModelForm, MeetingSelectForm,
|
||||
MeetingRoomForm, NewSessionForm, NonSessionForm, TimeSlotForm,
|
||||
MeetingRoomForm, NewSessionForm, NonSessionForm, TimeSlotForm, SessionEditForm,
|
||||
UploadBlueSheetForm, get_next_slot )
|
||||
from ietf.secr.proceedings.views import build_choices
|
||||
from ietf.secr.proceedings.utils import handle_upload_file
|
||||
from ietf.secr.sreq.forms import GroupSelectForm
|
||||
from ietf.secr.sreq.views import get_initial_session
|
||||
from ietf.secr.utils.meeting import get_session, get_timeslot
|
||||
from ietf.mailtrigger.utils import gather_address_lists
|
||||
|
@ -834,50 +831,54 @@ def select(request, meeting_id, schedule_name):
|
|||
'meeting': meeting,
|
||||
'schedule': schedule},
|
||||
)
|
||||
|
||||
|
||||
@role_required('Secretariat')
|
||||
def select_group(request, meeting_id, schedule_name):
|
||||
'''
|
||||
In this view the user can select the group to schedule. Only those groups that have
|
||||
submitted session requests appear in the dropdowns.
|
||||
|
||||
NOTE: BOF list includes Proposed Working Group type, per Wanda
|
||||
Select the scheduled session to edit.
|
||||
'''
|
||||
meeting = get_object_or_404(Meeting, number=meeting_id)
|
||||
schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
|
||||
|
||||
if request.method == 'POST':
|
||||
group = request.POST.get('group',None)
|
||||
if group:
|
||||
redirect_url = reverse('ietf.secr.meetings.views.schedule', kwargs={'meeting_id':meeting_id,'acronym':group,'schedule_name':schedule_name})
|
||||
else:
|
||||
redirect_url = reverse('ietf.secr.meetings.views.select_group',kwargs={'meeting_id':meeting_id,'schedule_name':schedule_name})
|
||||
messages.error(request, 'No group selected')
|
||||
|
||||
return HttpResponseRedirect(redirect_url)
|
||||
|
||||
# split groups into scheduled / unscheduled
|
||||
scheduled_groups, unscheduled_groups = sort_groups(meeting,schedule)
|
||||
|
||||
# prep group form
|
||||
wgs = filter(lambda a: a.type_id in ('wg','ag') and a.state_id=='active', unscheduled_groups)
|
||||
group_form = GroupSelectForm(choices=build_choices(wgs))
|
||||
|
||||
# prep BOFs form
|
||||
bofs = filter(lambda a: a.type_id=='wg' and a.state_id in ('bof','proposed'), unscheduled_groups)
|
||||
bof_form = GroupSelectForm(choices=build_choices(bofs))
|
||||
|
||||
# prep IRTF form
|
||||
irtfs = filter(lambda a: a.type_id=='rg' and a.state_id in ('active','proposed'), unscheduled_groups)
|
||||
irtf_form = GroupSelectForm(choices=build_choices(irtfs))
|
||||
assignments = schedule.assignments.filter(timeslot__type='session').order_by('session__group__acronym')
|
||||
|
||||
return render(request, 'meetings/select_group.html', {
|
||||
'group_form': group_form,
|
||||
'bof_form': bof_form,
|
||||
'irtf_form': irtf_form,
|
||||
'scheduled_groups': scheduled_groups,
|
||||
'meeting': meeting,
|
||||
'schedule': schedule},
|
||||
'schedule': schedule,
|
||||
'assignments': assignments},
|
||||
)
|
||||
|
||||
@role_required('Secretariat')
|
||||
def session_edit(request, meeting_id, schedule_name, session_id):
|
||||
'''
|
||||
Edit session details, cancel session
|
||||
'''
|
||||
meeting = get_object_or_404(Meeting, number=meeting_id)
|
||||
schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
|
||||
session = get_object_or_404(Session, id=session_id)
|
||||
assignment = SchedTimeSessAssignment.objects.get(schedule=schedule,session=session)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = SessionEditForm(request.POST, instance=session)
|
||||
if form.is_valid():
|
||||
button_text = request.POST.get('submit', '')
|
||||
if button_text == 'Cancel':
|
||||
session.status = SessionStatusName.objects.get(slug='canceled')
|
||||
session.save()
|
||||
messages.success(request, 'Session canceled')
|
||||
else:
|
||||
form.save()
|
||||
messages.success(request, 'Session saved')
|
||||
return redirect('ietf.secr.meetings.views.select_group', meeting_id=meeting_id,schedule_name=schedule_name)
|
||||
|
||||
else:
|
||||
form = SessionEditForm(instance=session)
|
||||
|
||||
return render(request, 'meetings/session_edit.html', {
|
||||
'meeting': meeting,
|
||||
'schedule': schedule,
|
||||
'session': session,
|
||||
'timeslot': assignment.timeslot,
|
||||
'form': form},
|
||||
)
|
||||
|
||||
@role_required('Secretariat')
|
||||
|
|
|
@ -17,45 +17,13 @@
|
|||
{% block content %}
|
||||
|
||||
<div class="module">
|
||||
<h2>IETF {{ meeting.number }} - Schedule Sessions</h2>
|
||||
<p>The lists below contain those groups which have submitted a session request. Select a
|
||||
group to schedule sessions. (Proposed Working Groups are in the BOFs list).</p>
|
||||
<p>Select this link to <a href="https://datatracker.ietf.org/meeting/{{ meeting.number }}/agenda.html">View Agenda</a></p>
|
||||
<h2>IETF {{ meeting.number }} - Scheduled Sessions</h2>
|
||||
|
||||
<div class="inline-related">
|
||||
<form class="internal-form" action="" method="post">{% csrf_token %}
|
||||
<label for="id_group">Working Groups</label></th>
|
||||
{{ group_form.group }}
|
||||
<input type="submit" name="submit" value="Select" />
|
||||
</form>
|
||||
<form class="internal-form" action="" method="post">{% csrf_token %}
|
||||
<label for="id_group">BOFs</label>
|
||||
{{ bof_form.group }}
|
||||
<input type="submit" name="submit" value="Select" />
|
||||
</form>
|
||||
<form class="internal-form" action="" method="post">{% csrf_token %}
|
||||
<label for="id_group">IRTF</label>
|
||||
{{ irtf_form.group }}
|
||||
<input type="submit" name="submit" value="Select" />
|
||||
</form>
|
||||
|
||||
<div class="button-group">
|
||||
<ul>
|
||||
<li><button onclick="window.location='../'">Back</button></li>
|
||||
</ul>
|
||||
</div> <!-- button-group -->
|
||||
|
||||
</div><!-- inline-related-->
|
||||
|
||||
<div class="inline-related">
|
||||
<h2>Scheduled Sessions</h2>
|
||||
<ul id="id_scheduled_sessions">
|
||||
{% for group in scheduled_groups %}
|
||||
<li><a href="{% url "ietf.secr.meetings.views.schedule" meeting_id=meeting.number schedule_name=schedule.name acronym=group.acronym %}">{{ group.acronym }}</a></li>
|
||||
{% for assignment in assignments %}
|
||||
<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>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div><!-- inline-related-->
|
||||
|
||||
|
||||
</div> <!-- module -->
|
||||
|
||||
|
|
84
ietf/secr/templates/meetings/session_edit.html
Normal file
84
ietf/secr/templates/meetings/session_edit.html
Normal file
|
@ -0,0 +1,84 @@
|
|||
{% extends "base_site.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block title %}Meetings{% endblock %}
|
||||
|
||||
{% block extrahead %}{{ block.super }}
|
||||
{% endblock %}
|
||||
|
||||
{% block breadcrumbs %}{{ block.super }}
|
||||
» <a href="{% url "ietf.secr.meetings.views.main" %}">Meetings</a>
|
||||
» <a href="{% url "ietf.secr.meetings.views.view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
|
||||
» <a href="{% url "ietf.secr.meetings.views.select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
|
||||
» <a href="{% url "ietf.secr.meetings.views.select_group" meeting_id=meeting.number schedule_name=schedule.name %}">Select</a>
|
||||
» {{ session.group.acronym }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="module">
|
||||
<h2>Edit Session</h2>
|
||||
|
||||
<form id="meetings-schedule-form" method="post" action="">{% csrf_token %}
|
||||
<div class="inline-related{% if forloop.last %} last-related{% endif %}">
|
||||
<table class="full-width amstable">
|
||||
<col width="200">
|
||||
<tr>
|
||||
<th>Day:</th>
|
||||
<td>{{ timeslot.time|date:"l" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Time:</th>
|
||||
<td>{{ timeslot.time|time:"H:i" }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Room:</th>
|
||||
<td>{{ timeslot.location.name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Status:</th>
|
||||
<td>{{ session.status }}</td>
|
||||
</tr>
|
||||
{{ form }}
|
||||
</table>
|
||||
</div> <!-- inline-related -->
|
||||
</div> <!-- inline-group -->
|
||||
|
||||
<div class="button-group">
|
||||
<ul>
|
||||
<li><button type="submit" name="submit" value="Save">Save</button></li>
|
||||
<li><button type="submit" name="submit" value="Cancel">Cancel Session</button></li>
|
||||
<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>
|
||||
</ul>
|
||||
</div> <!-- button-group -->
|
||||
|
||||
</form>
|
||||
|
||||
</div> <!-- module -->
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block footer-extras %}
|
||||
{% include "includes/meetings_footer.html" %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in a new issue