implement preapproved, add new SessionStatusName, add announce views
- Legacy-Id: 11126
This commit is contained in:
parent
be6e536769
commit
bd96d89c85
|
@ -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,)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
]
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
|
|
19
ietf/name/migrations/0011_add_session_status.py
Normal file
19
ietf/name/migrations/0011_add_session_status.py
Normal 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),
|
||||
]
|
55
ietf/templates/meeting/interim_announce.html
Normal file
55
ietf/templates/meeting/interim_announce.html
Normal 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 %}
|
|
@ -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' />
|
||||
|
|
23
ietf/templates/meeting/interim_send_announcement.html
Normal file
23
ietf/templates/meeting/interim_send_announcement.html
Normal 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 %}
|
Loading…
Reference in a new issue