Move NomCom announcements view to nomcom/, move message view to

message/, add tests, add redirects, fix a couple of small bugs in the
announcements view
 - Legacy-Id: 6769
This commit is contained in:
Ole Laursen 2013-11-28 17:55:10 +00:00
parent 78d9bfff24
commit d0f2859631
14 changed files with 125 additions and 102 deletions

View file

@ -1 +0,0 @@
from django.db import models

View file

@ -1,10 +0,0 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls.defaults import patterns
from django.conf import settings
urlpatterns = patterns('',
(r'^nomcom/$', 'ietf.announcements.views.nomcom'),
(r'^nomcom/(?P<object_id>\d+)/$', 'ietf.announcements.views.message_detail'),
)

View file

@ -1,59 +0,0 @@
# Copyright The IETF Trust 2007, All Rights Reserved
import re
from django.views.generic.simple import direct_to_template
from django.shortcuts import get_object_or_404
from django.conf import settings
from django.db.models import Q
from ietf.idtracker.models import ChairsHistory
from ietf.idtracker.models import Role
from ietf.group.models import Group, GroupEvent
from ietf.message.models import Message
def nomcom(request):
address_re = re.compile("<.*>")
nomcoms = list(Group.objects.filter(acronym__startswith="nomcom").exclude(name="nomcom"))
regimes = []
for n in nomcoms:
e = GroupEvent.objects.filter(group=n, type="changed_state", changestategroupevent__state="active").order_by('time')[:1]
n.start_year = e[0].time.year if e else 0
if n.start_year <= 2003:
continue
e = GroupEvent.objects.filter(group=n, type="changed_state", changestategroupevent__state="conclude").order_by('time')[:1]
n.end_year = e[0].time.year if e else ""
r = n.role_set.select_related().filter(name="chair")
chair = None
if r:
chair = r[0]
announcements = Message.objects.filter(related_groups=n).order_by('-time')
for a in announcements:
a.to_name = address_re.sub("", a.to)
regimes.append(dict(chair=chair,
announcements=announcements,
group=n))
regimes.sort(key=lambda x: x["group"].start_year, reverse=True)
return direct_to_template(request,
"announcements/nomcomREDESIGN.html",
{ 'curr_chair' : regimes[0]["chair"],
'regimes' : regimes })
def message_detail(request, object_id):
# restrict to nomcom announcements for the time being
nomcoms = Group.objects.filter(acronym__startswith="nomcom").exclude(acronym="nomcom")
m = get_object_or_404(Message, id=object_id,
related_groups__in=nomcoms)
return direct_to_template(request,
"announcements/message_detail.html",
dict(message=m))

15
ietf/message/views.py Normal file
View file

@ -0,0 +1,15 @@
from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from ietf.group.models import Group
from ietf.message.models import Message
def message(request, message_id, group_type):
possible_messages = Message.objects.filter(related_groups__type=group_type)
message = get_object_or_404(possible_messages, id=message_id)
return render_to_response("message/message.html",
dict(message=message),
context_instance=RequestContext(request))

View file

@ -0,0 +1,7 @@
from django.conf.urls.defaults import patterns
from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^nomcom/$', 'django.views.generic.simple.redirect_to', { 'url': "/nomcom/ann/", 'permanent': True }),
(r'^nomcom/(?P<message_id>\d+)/$', 'django.views.generic.simple.redirect_to', { 'url': "/nomcom/ann/%(message_id)s/", 'permanent': True }),
)

View file

@ -6,7 +6,7 @@ from django.core.files import File
from django.conf import settings
from ietf.utils.pipe import pipe
from ietf.group.models import Group, Role
from ietf.group.models import Group, Role, ChangeStateGroupEvent
from ietf.person.models import Email, Person
from ietf.name.models import RoleName
from ietf.nomcom.models import NomCom, Position, Nominee
@ -101,6 +101,7 @@ def nomcom_test_data():
state_id='active',
type_id='nomcom',
acronym='nomcom%s' % NOMCOM_YEAR)
nomcom, created = NomCom.objects.get_or_create(group=group)
cert_file, privatekey_file = generate_cert()
@ -159,3 +160,9 @@ def nomcom_test_data():
description=description,
is_open=True,
incumbent=email)
ChangeStateGroupEvent.objects.get_or_create(group=group,
type="changed_state",
state_id="active",
time=group.time,
by=Person.objects.all()[0])

View file

@ -8,13 +8,15 @@ from django.db import IntegrityError
from django.core.urlresolvers import reverse
from django.core.files import File
from django.contrib.formtools.preview import security_hash
from django.contrib.auth.models import User
from ietf.utils.test_utils import login_testing_unauthorized
from ietf.utils.mail import outbox
from ietf.person.models import Email, Person
from django.contrib.auth.models import User
from ietf.group.models import Group
from ietf.message.models import Message
from ietf.nomcom.test_data import nomcom_test_data, generate_cert, check_comments, \
COMMUNITY_USER, CHAIR_USER, \
@ -365,6 +367,25 @@ class NomcomViewsTest(TestCase):
"""Verify home view"""
self.check_url_status(self.index_url, 200)
def test_announcements_view(self):
nomcom = Group.objects.get(acronym="nomcom%s" % self.year, type="nomcom")
msg = Message.objects.create(
by=Person.objects.all()[0],
subject="This is a test",
to="test@example.com",
frm="nomcomchair@example.com",
body="Hello World!",
content_type="",
)
msg.related_groups.add(nomcom)
r = self.client.get(reverse('ietf.nomcom.views.announcements'))
self.assertEqual(r.status_code, 200)
self.assertTrue(("Messages from %s" % nomcom.time.year) in r.content)
self.assertTrue(nomcom.role_set.filter(name="chair")[0].person.email_address() in r.content)
self.assertTrue(msg.subject in r.content)
def test_requirements_view(self):
"""Verify requirements view"""
self.check_url_status(self.requirements_url, 200)

View file

@ -6,6 +6,7 @@ from ietf.nomcom.forms import EditChairForm, EditChairFormPreview, \
urlpatterns = patterns('ietf.nomcom.views',
url(r'^$', 'index'),
url(r'^ann/$', 'announcements'),
url(r'^(?P<year>\d{4})/private/$', 'private_index', name='nomcom_private_index'),
url(r'^(?P<year>\d{4})/private/key/$', 'private_key', name='nomcom_private_key'),
url(r'^(?P<year>\d{4})/private/nominate/$', 'private_nominate', name='nomcom_private_nominate'),
@ -42,3 +43,7 @@ urlpatterns = patterns('ietf.nomcom.views',
url(r'^ajax/position-text/(?P<position_id>\d+)/$', 'ajax_position_text', name='nomcom_ajax_position_text'),
)
urlpatterns += patterns('',
url(r'^ann/(?P<message_id>\d+)/$', 'ietf.message.views.message', {'group_type': "nomcom" }, "nomcom_announcement"),
)

View file

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
import datetime
import datetime, re
from django.views.generic.create_update import delete_object
from django.conf import settings
@ -20,7 +20,8 @@ from django.forms.models import modelformset_factory, inlineformset_factory
from ietf.dbtemplate.models import DBTemplate
from ietf.dbtemplate.views import template_edit
from ietf.name.models import NomineePositionState, FeedbackType
from ietf.group.models import Group
from ietf.group.models import Group, GroupEvent
from ietf.message.models import Message
from ietf.nomcom.decorators import nomcom_private_key_required
from ietf.nomcom.forms import (NominateForm, FeedbackForm, QuestionnaireForm,
@ -53,7 +54,7 @@ def index(request):
else:
nomcom.url = None
if year >= 2002:
nomcom.ann_url = "/ann/nomcom/#%4d" % year
nomcom.ann_url = "/nomcom/ann/#%4d" % year
else:
nomcom.ann_url = None
return render_to_response('nomcom/index.html',
@ -70,6 +71,41 @@ def year_index(request, year):
'selected': 'index',
'template': template}, RequestContext(request))
def announcements(request):
address_re = re.compile("<.*>")
nomcoms = Group.objects.filter(type="nomcom")
regimes = []
for n in nomcoms:
e = GroupEvent.objects.filter(group=n, type="changed_state", changestategroupevent__state="active").order_by('time')[:1]
n.start_year = e[0].time.year if e else 0
e = GroupEvent.objects.filter(group=n, type="changed_state", changestategroupevent__state="conclude").order_by('time')[:1]
n.end_year = e[0].time.year if e else n.start_year + 1
r = n.role_set.select_related().filter(name="chair")
chair = None
if r:
chair = r[0]
announcements = Message.objects.filter(related_groups=n).order_by('-time')
for a in announcements:
a.to_name = address_re.sub("", a.to)
if not announcements:
continue
regimes.append(dict(chair=chair,
announcements=announcements,
group=n))
regimes.sort(key=lambda x: x["group"].start_year, reverse=True)
return render_to_response("nomcom/announcements.html",
{ 'curr_chair' : regimes[0]["chair"] if regimes else None,
'regimes' : regimes },
context_instance=RequestContext(request))
@role_required("Nomcom")
def private_key(request, year):

View file

@ -166,7 +166,6 @@ INSTALLED_APPS = (
'ietf.group',
'ietf.doc',
'ietf.message',
'ietf.announcements',
'ietf.idindex',
'ietf.idtracker',
'ietf.ietfauth',

View file

@ -1,18 +0,0 @@
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}Announcement: {{ message.time|date:"F j, Y" }} -- {{ message.subject|escape }}{% endblock %}
{% block content %}
<h1>NomCom Message</h1>
<p>
From: {{ message.frm|escape }}<br/>
To: {{ message.to|escape }}<br/>
Date: {{ message.time|date:"F j, Y" }}<br/>
Subject: {{ message.subject|escape }}
</p>
<hr width="400" align="left" />
<pre>
{{ message.body|escape }}
</pre>
{% endblock %}

View file

@ -0,0 +1,20 @@
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}Announcement: {{ message.time|date:"F j, Y" }} - {{ message.subject }}{% endblock %}
{% block content %}
<h1>Announcement: {{ message.time|date:"F j, Y" }} - {{ message.subject }}</h1>
<p>
From: {{ message.frm }}<br/>
To: {{ message.to }}<br/>
Date: {{ message.time|date:"F j, Y" }}<br/>
Subject: {{ message.subject }}
</p>
<hr width="400" align="left" />
<pre>
{{ message.body }}
</pre>
{% endblock %}

View file

@ -8,8 +8,9 @@
<h3>Current Committee Chair: <a href="mailto:{{ curr_chair.email.address }}">{{ curr_chair.person.plain_name }}</a></h3>
{% for regime in regimes %}
<hr>
<h1 id="{{regime.group.start_year}}">Messages from {{ regime.group.start_year }} - {{ regime.group.end_year }}</h1>
<hr style="margin: 1em 0; color: #ddd">
<h1 id="{{ regime.group.start_year }}">Messages from {{ regime.group.start_year }} - {{ regime.group.end_year }}</h1>
{# use person email address here rather than the generic nomcom-chair@ietf.org #}
<h4>Committee Chair: <a href="mailto:{{ regime.chair.person.email_address }}">{{ regime.chair.person.plain_name }}</a></h4>
@ -19,17 +20,17 @@
<th width="60%">Subject</th>
<th width="30%">Sent To</th>
</tr>
{% for ann in regime.announcements %}
{% for m in regime.announcements %}
<tr>
<td>{{ ann.time|date:"Y-M-d" }}</td>
<td style="max-width:50%"><a href="/ann/nomcom/{{ ann.id }}/">{{ ann.subject|escape }}</a></td>
<td>{{ ann.to_name }}</td>
<td>{{ m.time|date:"Y-M-d" }}</td>
<td style="max-width:50%"><a href="{% url nomcom_announcement message_id=m.id %}">{{ m.subject|escape }}</a></td>
<td>{{ m.to_name }}</td>
<tr>
{% endfor %}
</table>
{% endfor %}
<hr>
<hr style="margin: 2em 0; color: #ddd">
{# somebody ought to import these announcements in the DB instead of this mess #}

View file

@ -50,7 +50,7 @@ urlpatterns = patterns('',
(r'^accounts/', include('ietf.ietfauth.urls')),
(r'^admin/', include(admin.site.urls)),
(r'^admin/doc/', include('django.contrib.admindocs.urls')),
(r'^ann/', include('ietf.announcements.urls')),
(r'^ann/', include('ietf.nomcom.redirect_ann_urls')),
(r'^community/', include('ietf.community.urls')),
(r'^cookies/', include('ietf.cookies.urls')),
(r'^doc/', include('ietf.doc.urls')),