implement preapproved, add new SessionStatusName, add announce views

- Legacy-Id: 11126
This commit is contained in:
Ryan Cross 2016-04-22 16:48:20 +00:00
parent be6e536769
commit bd96d89c85
9 changed files with 183 additions and 9 deletions

View file

@ -191,7 +191,7 @@ class InterimSessionForm(forms.Form):
def _save_agenda(self, text):
pass
def save(self, request, group, meeting):
def save(self, request, group, meeting, is_approved):
person = request.user.person
agenda = self.cleaned_data.get('agenda')
agenda_note = self.cleaned_data.get('agenda_note')
@ -199,12 +199,16 @@ class InterimSessionForm(forms.Form):
time = self.cleaned_data.get('time')
duration = self.cleaned_data.get('duration')
remote_instructions = self.cleaned_data.get('remote_instructions')
time=datetime.datetime.combine(date, time)
time = datetime.datetime.combine(date, time)
if is_approved:
status_id = 'scheda'
else:
status_id = 'apprw'
session = Session.objects.create(meeting=meeting,
group=group,
requested_by=person,
requested_duration=duration,
status_id='apprw',
status_id=status_id,
type_id='session',
remote_instructions=remote_instructions,
agenda_note=agenda_note,)

View file

@ -6,6 +6,7 @@ import urlparse
from django.core.urlresolvers import reverse as urlreverse
from django.conf import settings
from django.contrib.auth.models import User
from django.http import HttpRequest
from pyquery import PyQuery
@ -14,6 +15,7 @@ from ietf.group.models import Group
from ietf.meeting.helpers import can_approve_interim_request, can_view_interim_request
from ietf.meeting.models import Session, TimeSlot, Meeting
from ietf.meeting.test_data import make_meeting_test_data
from ietf.name.models import SessionStatusName
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent
class MeetingTests(TestCase):
@ -339,13 +341,43 @@ class EditTests(TestCase):
# -------------------------------------------------
class InterimTests(TestCase):
def test_interim_announce(self):
make_meeting_test_data()
url = urlreverse("ietf.meeting.views.interim_announce")
meeting = Meeting.objects.filter(type='interim',session__group__acronym='mars').first()
session = meeting.session_set.first()
session.status = SessionStatusName.objects.get(slug='scheda')
session.save()
login_testing_unauthorized(self,"secretary",url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(meeting.number in r.content)
def test_interim_send_announcement(self):
make_meeting_test_data()
meeting = Meeting.objects.filter(type='interim',session__status='apprw',session__group__acronym='mars').first()
url = urlreverse("ietf.meeting.views.interim_send_announcement", kwargs={'number':meeting.number})
login_testing_unauthorized(self,"secretary",url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
def test_interim_approve(self):
make_meeting_test_data()
meeting = Meeting.objects.filter(type='interim',session__status='apprw',session__group__acronym='mars').first()
url = urlreverse('ietf.meeting.views.interim_request_details',kwargs={'number':meeting.number})
login_testing_unauthorized(self,"secretary",url)
r = self.client.post(url,{'approve':'approve'})
self.assertRedirects(r,urlreverse('ietf.meeting.views.interim_send_announcement',kwargs={'number':meeting.number}))
for session in meeting.session_set.all():
self.assertEqual(session.status.slug,'scheda')
def test_upcoming(self):
make_meeting_test_data()
r = self.client.get("/meeting/upcoming/")
self.assertEqual(r.status_code, 200)
today = datetime.date.today()
mars_interim = Meeting.objects.filter(date__gt=today,type='interim',number__contains='mars').first()
ames_interim = Meeting.objects.filter(date__gt=today,type='interim',number__contains='ames').first()
mars_interim = Meeting.objects.filter(date__gt=today,type='interim',session__group__acronym='mars',session__status='sched').first()
ames_interim = Meeting.objects.filter(date__gt=today,type='interim',session__group__acronym='ames',session__status='canceled').first()
self.assertTrue(mars_interim.number in r.content)
self.assertTrue(ames_interim.number in r.content)
# cancelled session

View file

@ -68,8 +68,10 @@ urlpatterns = [
url(r'^(?P<num>\d+)/', include(type_ietf_only_patterns)),
url(r'^upcoming/$', views.upcoming),
url(r'^upcoming.ics/$', views.ical_upcoming),
url(r'^interim/request/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_request_details),
url(r'^interim/announce/$', views.interim_announce),
url(r'^interim/announce/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_send_announcement),
url(r'^interim/request/$', views.interim_request),
url(r'^interim/request/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_request_details),
url(r'^interim/pending/$', views.interim_pending),
url(r'^$', views.current_materials),
]

View file

@ -903,6 +903,21 @@ def ajax_get_utc(request):
context_data = {'timezone':timezone,'time':time,'utc':utc}
return HttpResponse(json.dumps(context_data),content_type='application/json')
@role_required('Secretariat',)
def interim_announce(request):
'''View which shows interim meeting requests awaiting announcement'''
meetings = Meeting.objects.filter(type='interim',session__status='scheda')
return render(request, "meeting/interim_announce.html", {"meetings":meetings})
@role_required('Secretariat',)
def interim_send_announcement(request,number):
'''View for sending the announcement of a new interim meeting'''
meeting = get_object_or_404(Meeting,number=number)
return render(request, "meeting/interim_send_announcement.html")
@role_required('Area Director','Secretariat','IRTF Chair','WG Chair','RG Chair')
def interim_pending(request):
'''View which shows interim meeting requests pending approval'''
@ -926,6 +941,7 @@ def interim_request(request):
#person = request.user.person
if form.is_valid() and formset.is_valid():
group = form.cleaned_data.get('group')
is_approved = form.cleaned_data.get('approved', False)
meeting_type = form.cleaned_data.get('meeting_type')
# pre create meeting
@ -939,7 +955,7 @@ def interim_request(request):
continue
if meeting_type == 'series':
meeting = create_interim_meeting_from_forms(form,f)
f.save(request,group,meeting)
f.save(request,group,meeting,is_approved)
return redirect(upcoming)
else:
assert False, (form.errors, formset.errors)
@ -957,6 +973,16 @@ def interim_request_details(request, number):
can_edit = can_view_interim_request(meeting,request.user)
can_approve = can_approve_interim_request(meeting,request.user)
if request.method == 'POST':
if request.POST.get('approve'):
meeting.session_set.update(status_id='scheda')
if has_role(request.user, 'Secretariat'):
return redirect(interim_send_announcement, number=number)
if request.POST.get('disapprove'):
pass
if request.POST.get('cancel'):
pass
return render(request, "meeting/interim_request_details.html",{
"meeting":meeting,
"sessions":sessions,
@ -976,7 +1002,7 @@ def ical_upcoming(request):
def upcoming(request):
'''List of upcoming meetings'''
today = datetime.datetime.today()
meetings = Meeting.objects.filter(date__gte=today).order_by('date')
meetings = Meeting.objects.filter(date__gte=today,session__status__in=('sched','canceled')).order_by('date')
# extract groups hierarchy
seen = set()

View file

@ -2022,6 +2022,16 @@
"model": "name.sessionstatusname",
"pk": "sched"
},
{
"fields": {
"order": 0,
"used": true,
"name": "Scheduled - Announcement to be sent",
"desc": ""
},
"model": "name.sessionstatusname",
"pk": "scheda"
},
{
"fields": {
"order": 0,

View file

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations
def populate_names(apps, schema_editor):
SessionStatusName = apps.get_model("name", "SessionStatusName")
SessionStatusName.objects.create(slug="scheda",name="Scheduled - Announcement to be sent")
class Migration(migrations.Migration):
dependencies = [
('name', '0010_new_liaison_names'),
]
operations = [
migrations.RunPython(populate_names),
]

View file

@ -0,0 +1,55 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load staticfiles bootstrap3 widget_tweaks %}
{% block title %}Announce Interim Meeting{% endblock %}
{% block pagehead %}
<link rel="stylesheet" href="{% static 'select2/select2.css' %}">
<link rel="stylesheet" href="{% static 'select2-bootstrap-css/select2-bootstrap.min.css' %}">
{% endblock %}
{% block content %}
{% origin %}
<h1>Announce Interim Meeting</h1>
{% if meetings %}
<table id="announce-interim-meetings-table" class="table table-condensed table-striped">
<thead>
<tr>
<th>Date</th>
<th>Group</th>
<th>Name</th>
</tr>
</thead>
<tbody>
{% for meeting in meetings %}
{% if meeting.type.slug == 'interim' %}
<tr id="row-{{ forloop.counter }}-{{ meeting.session_set.all.0.group.acronym }}">
{% else %}
<tr id="row-{{ forloop.counter }}-ietf">
{% endif %}
<td>{{ meeting.date }}</td>
{% if meeting.type.slug == 'interim' %}
<td>{{ meeting.session_set.all.0.group.acronym }}</td>
{% else %}
<td>ietf</td>
{% endif %}
<td>
<a href="{% url 'ietf.meeting.views.interim_send_announcement' number=meeting.number %}">{{ meeting.number }}</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<h3>No interim meetings waiting announcement</h3>
{% endif %}
{% endblock %}
{% block js %}
<script src="{% static 'select2/select2.min.js' %}"></script>
<script src="{% static 'ietf/js/meeting-interim-request.js' %}"></script>
{% endblock %}

View file

@ -18,6 +18,8 @@
<dd>{{ sessions.0.group.acronym }}
<dt>Requested By</dt>
<dd>{{ sessions.0.requested_by }}
<dt>Status</dt>
<dd>{{ sessions.0.status }}</dd>
<dt>City</dt>
<dd>{{ meeting.city }}</dd>
<dt>Country</dt>
@ -44,7 +46,8 @@
<a class="btn btn-default" href="">Edit</a>
{% endif %}
{% if can_approve %}
<input class="btn btn-default" type="submit" value="Approve" name='approved' />
<input class="btn btn-default" type="submit" value="Approve" name='approve' />
<input class="btn btn-default" type="submit" value="Disapprove" name='disapprove' />
{% endif %}
{% if can_edit %}
<input class="btn btn-default" type="submit" value="Cancel" name='cancel' />

View file

@ -0,0 +1,23 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load staticfiles bootstrap3 widget_tweaks %}
{% block title %}Announce Interim Meeting{% endblock %}
{% block pagehead %}
<link rel="stylesheet" href="{% static 'select2/select2.css' %}">
<link rel="stylesheet" href="{% static 'select2-bootstrap-css/select2-bootstrap.min.css' %}">
{% endblock %}
{% block content %}
{% origin %}
<h1>Announce Interim Meeting</h1>
{% endblock %}
{% block js %}
<script src="{% static 'select2/select2.min.js' %}"></script>
<script src="{% static 'ietf/js/meeting-interim-request.js' %}"></script>
{% endblock %}