Skip to content

Commit bd96d89

Browse files
committed
implement preapproved, add new SessionStatusName, add announce views
- Legacy-Id: 11126
1 parent be6e536 commit bd96d89

9 files changed

Lines changed: 183 additions & 9 deletions

File tree

ietf/meeting/forms.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,20 +191,24 @@ def __init__(self, *args, **kwargs):
191191
def _save_agenda(self, text):
192192
pass
193193

194-
def save(self, request, group, meeting):
194+
def save(self, request, group, meeting, is_approved):
195195
person = request.user.person
196196
agenda = self.cleaned_data.get('agenda')
197197
agenda_note = self.cleaned_data.get('agenda_note')
198198
date = self.cleaned_data.get('date')
199199
time = self.cleaned_data.get('time')
200200
duration = self.cleaned_data.get('duration')
201201
remote_instructions = self.cleaned_data.get('remote_instructions')
202-
time=datetime.datetime.combine(date, time)
202+
time = datetime.datetime.combine(date, time)
203+
if is_approved:
204+
status_id = 'scheda'
205+
else:
206+
status_id = 'apprw'
203207
session = Session.objects.create(meeting=meeting,
204208
group=group,
205209
requested_by=person,
206210
requested_duration=duration,
207-
status_id='apprw',
211+
status_id=status_id,
208212
type_id='session',
209213
remote_instructions=remote_instructions,
210214
agenda_note=agenda_note,)

ietf/meeting/tests_views.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.core.urlresolvers import reverse as urlreverse
77
from django.conf import settings
88
from django.contrib.auth.models import User
9+
from django.http import HttpRequest
910

1011
from pyquery import PyQuery
1112

@@ -14,6 +15,7 @@
1415
from ietf.meeting.helpers import can_approve_interim_request, can_view_interim_request
1516
from ietf.meeting.models import Session, TimeSlot, Meeting
1617
from ietf.meeting.test_data import make_meeting_test_data
18+
from ietf.name.models import SessionStatusName
1719
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent
1820

1921
class MeetingTests(TestCase):
@@ -339,13 +341,43 @@ def test_slot_to_the_right(self):
339341
# -------------------------------------------------
340342

341343
class InterimTests(TestCase):
344+
def test_interim_announce(self):
345+
make_meeting_test_data()
346+
url = urlreverse("ietf.meeting.views.interim_announce")
347+
meeting = Meeting.objects.filter(type='interim',session__group__acronym='mars').first()
348+
session = meeting.session_set.first()
349+
session.status = SessionStatusName.objects.get(slug='scheda')
350+
session.save()
351+
login_testing_unauthorized(self,"secretary",url)
352+
r = self.client.get(url)
353+
self.assertEqual(r.status_code, 200)
354+
self.assertTrue(meeting.number in r.content)
355+
356+
def test_interim_send_announcement(self):
357+
make_meeting_test_data()
358+
meeting = Meeting.objects.filter(type='interim',session__status='apprw',session__group__acronym='mars').first()
359+
url = urlreverse("ietf.meeting.views.interim_send_announcement", kwargs={'number':meeting.number})
360+
login_testing_unauthorized(self,"secretary",url)
361+
r = self.client.get(url)
362+
self.assertEqual(r.status_code, 200)
363+
364+
def test_interim_approve(self):
365+
make_meeting_test_data()
366+
meeting = Meeting.objects.filter(type='interim',session__status='apprw',session__group__acronym='mars').first()
367+
url = urlreverse('ietf.meeting.views.interim_request_details',kwargs={'number':meeting.number})
368+
login_testing_unauthorized(self,"secretary",url)
369+
r = self.client.post(url,{'approve':'approve'})
370+
self.assertRedirects(r,urlreverse('ietf.meeting.views.interim_send_announcement',kwargs={'number':meeting.number}))
371+
for session in meeting.session_set.all():
372+
self.assertEqual(session.status.slug,'scheda')
373+
342374
def test_upcoming(self):
343375
make_meeting_test_data()
344376
r = self.client.get("/meeting/upcoming/")
345377
self.assertEqual(r.status_code, 200)
346378
today = datetime.date.today()
347-
mars_interim = Meeting.objects.filter(date__gt=today,type='interim',number__contains='mars').first()
348-
ames_interim = Meeting.objects.filter(date__gt=today,type='interim',number__contains='ames').first()
379+
mars_interim = Meeting.objects.filter(date__gt=today,type='interim',session__group__acronym='mars',session__status='sched').first()
380+
ames_interim = Meeting.objects.filter(date__gt=today,type='interim',session__group__acronym='ames',session__status='canceled').first()
349381
self.assertTrue(mars_interim.number in r.content)
350382
self.assertTrue(ames_interim.number in r.content)
351383
# cancelled session

ietf/meeting/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@
6868
url(r'^(?P<num>\d+)/', include(type_ietf_only_patterns)),
6969
url(r'^upcoming/$', views.upcoming),
7070
url(r'^upcoming.ics/$', views.ical_upcoming),
71-
url(r'^interim/request/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_request_details),
71+
url(r'^interim/announce/$', views.interim_announce),
72+
url(r'^interim/announce/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_send_announcement),
7273
url(r'^interim/request/$', views.interim_request),
74+
url(r'^interim/request/(?P<number>[A-Za-z0-9._+-]+)/$', views.interim_request_details),
7375
url(r'^interim/pending/$', views.interim_pending),
7476
url(r'^$', views.current_materials),
7577
]

ietf/meeting/views.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,21 @@ def ajax_get_utc(request):
903903
context_data = {'timezone':timezone,'time':time,'utc':utc}
904904
return HttpResponse(json.dumps(context_data),content_type='application/json')
905905

906+
907+
@role_required('Secretariat',)
908+
def interim_announce(request):
909+
'''View which shows interim meeting requests awaiting announcement'''
910+
meetings = Meeting.objects.filter(type='interim',session__status='scheda')
911+
912+
return render(request, "meeting/interim_announce.html", {"meetings":meetings})
913+
914+
@role_required('Secretariat',)
915+
def interim_send_announcement(request,number):
916+
'''View for sending the announcement of a new interim meeting'''
917+
meeting = get_object_or_404(Meeting,number=number)
918+
919+
return render(request, "meeting/interim_send_announcement.html")
920+
906921
@role_required('Area Director','Secretariat','IRTF Chair','WG Chair','RG Chair')
907922
def interim_pending(request):
908923
'''View which shows interim meeting requests pending approval'''
@@ -926,6 +941,7 @@ def interim_request(request):
926941
#person = request.user.person
927942
if form.is_valid() and formset.is_valid():
928943
group = form.cleaned_data.get('group')
944+
is_approved = form.cleaned_data.get('approved', False)
929945
meeting_type = form.cleaned_data.get('meeting_type')
930946

931947
# pre create meeting
@@ -939,7 +955,7 @@ def interim_request(request):
939955
continue
940956
if meeting_type == 'series':
941957
meeting = create_interim_meeting_from_forms(form,f)
942-
f.save(request,group,meeting)
958+
f.save(request,group,meeting,is_approved)
943959
return redirect(upcoming)
944960
else:
945961
assert False, (form.errors, formset.errors)
@@ -957,6 +973,16 @@ def interim_request_details(request, number):
957973
can_edit = can_view_interim_request(meeting,request.user)
958974
can_approve = can_approve_interim_request(meeting,request.user)
959975

976+
if request.method == 'POST':
977+
if request.POST.get('approve'):
978+
meeting.session_set.update(status_id='scheda')
979+
if has_role(request.user, 'Secretariat'):
980+
return redirect(interim_send_announcement, number=number)
981+
if request.POST.get('disapprove'):
982+
pass
983+
if request.POST.get('cancel'):
984+
pass
985+
960986
return render(request, "meeting/interim_request_details.html",{
961987
"meeting":meeting,
962988
"sessions":sessions,
@@ -976,7 +1002,7 @@ def ical_upcoming(request):
9761002
def upcoming(request):
9771003
'''List of upcoming meetings'''
9781004
today = datetime.datetime.today()
979-
meetings = Meeting.objects.filter(date__gte=today).order_by('date')
1005+
meetings = Meeting.objects.filter(date__gte=today,session__status__in=('sched','canceled')).order_by('date')
9801006

9811007
# extract groups hierarchy
9821008
seen = set()

ietf/name/fixtures/names.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,6 +2022,16 @@
20222022
"model": "name.sessionstatusname",
20232023
"pk": "sched"
20242024
},
2025+
{
2026+
"fields": {
2027+
"order": 0,
2028+
"used": true,
2029+
"name": "Scheduled - Announcement to be sent",
2030+
"desc": ""
2031+
},
2032+
"model": "name.sessionstatusname",
2033+
"pk": "scheda"
2034+
},
20252035
{
20262036
"fields": {
20272037
"order": 0,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import migrations
5+
6+
def populate_names(apps, schema_editor):
7+
SessionStatusName = apps.get_model("name", "SessionStatusName")
8+
SessionStatusName.objects.create(slug="scheda",name="Scheduled - Announcement to be sent")
9+
10+
11+
class Migration(migrations.Migration):
12+
13+
dependencies = [
14+
('name', '0010_new_liaison_names'),
15+
]
16+
17+
operations = [
18+
migrations.RunPython(populate_names),
19+
]
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{% extends "base.html" %}
2+
{# Copyright The IETF Trust 2015, All Rights Reserved #}
3+
{% load origin %}
4+
{% load staticfiles bootstrap3 widget_tweaks %}
5+
6+
{% block title %}Announce Interim Meeting{% endblock %}
7+
8+
{% block pagehead %}
9+
<link rel="stylesheet" href="{% static 'select2/select2.css' %}">
10+
<link rel="stylesheet" href="{% static 'select2-bootstrap-css/select2-bootstrap.min.css' %}">
11+
{% endblock %}
12+
13+
{% block content %}
14+
{% origin %}
15+
<h1>Announce Interim Meeting</h1>
16+
17+
{% if meetings %}
18+
<table id="announce-interim-meetings-table" class="table table-condensed table-striped">
19+
<thead>
20+
<tr>
21+
<th>Date</th>
22+
<th>Group</th>
23+
<th>Name</th>
24+
</tr>
25+
</thead>
26+
<tbody>
27+
{% for meeting in meetings %}
28+
{% if meeting.type.slug == 'interim' %}
29+
<tr id="row-{{ forloop.counter }}-{{ meeting.session_set.all.0.group.acronym }}">
30+
{% else %}
31+
<tr id="row-{{ forloop.counter }}-ietf">
32+
{% endif %}
33+
<td>{{ meeting.date }}</td>
34+
{% if meeting.type.slug == 'interim' %}
35+
<td>{{ meeting.session_set.all.0.group.acronym }}</td>
36+
{% else %}
37+
<td>ietf</td>
38+
{% endif %}
39+
<td>
40+
<a href="{% url 'ietf.meeting.views.interim_send_announcement' number=meeting.number %}">{{ meeting.number }}</a>
41+
</td>
42+
</tr>
43+
{% endfor %}
44+
</tbody>
45+
</table>
46+
{% else %}
47+
<h3>No interim meetings waiting announcement</h3>
48+
{% endif %}
49+
50+
{% endblock %}
51+
52+
{% block js %}
53+
<script src="{% static 'select2/select2.min.js' %}"></script>
54+
<script src="{% static 'ietf/js/meeting-interim-request.js' %}"></script>
55+
{% endblock %}

ietf/templates/meeting/interim_request_details.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ <h1>Interim Meeting Request Details</h1>
1818
<dd>{{ sessions.0.group.acronym }}
1919
<dt>Requested By</dt>
2020
<dd>{{ sessions.0.requested_by }}
21+
<dt>Status</dt>
22+
<dd>{{ sessions.0.status }}</dd>
2123
<dt>City</dt>
2224
<dd>{{ meeting.city }}</dd>
2325
<dt>Country</dt>
@@ -44,7 +46,8 @@ <h1>Interim Meeting Request Details</h1>
4446
<a class="btn btn-default" href="">Edit</a>
4547
{% endif %}
4648
{% if can_approve %}
47-
<input class="btn btn-default" type="submit" value="Approve" name='approved' />
49+
<input class="btn btn-default" type="submit" value="Approve" name='approve' />
50+
<input class="btn btn-default" type="submit" value="Disapprove" name='disapprove' />
4851
{% endif %}
4952
{% if can_edit %}
5053
<input class="btn btn-default" type="submit" value="Cancel" name='cancel' />
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{% extends "base.html" %}
2+
{# Copyright The IETF Trust 2015, All Rights Reserved #}
3+
{% load origin %}
4+
{% load staticfiles bootstrap3 widget_tweaks %}
5+
6+
{% block title %}Announce Interim Meeting{% endblock %}
7+
8+
{% block pagehead %}
9+
<link rel="stylesheet" href="{% static 'select2/select2.css' %}">
10+
<link rel="stylesheet" href="{% static 'select2-bootstrap-css/select2-bootstrap.min.css' %}">
11+
{% endblock %}
12+
13+
{% block content %}
14+
{% origin %}
15+
<h1>Announce Interim Meeting</h1>
16+
17+
18+
{% endblock %}
19+
20+
{% block js %}
21+
<script src="{% static 'select2/select2.min.js' %}"></script>
22+
<script src="{% static 'ietf/js/meeting-interim-request.js' %}"></script>
23+
{% endblock %}

0 commit comments

Comments
 (0)