From 5f4d99a36a52ed1a148d1ecef4b5ab39b1639244 Mon Sep 17 00:00:00 2001
From: Bill Fenner <fenner@fenron.net>
Date: Wed, 30 May 2007 21:09:17 +0000
Subject: [PATCH] Implement status_of_items and last_call.

(Oddly, this status_of_items shows more than the cgi one; I can't
explain why.  Also, the cgi one showed the wrong intended status
for RFCs, and the wrong area for several documents.)
 - Legacy-Id: 186
---
 ietf/idtracker/models.py                      | 19 ++++-----
 ietf/idtracker/urls.py                        |  2 +
 ietf/idtracker/views.py                       |  9 ++++-
 ietf/templates/idtracker/document_entry.html  | 24 ++++++++++++
 ietf/templates/idtracker/status_of_items.html | 39 +++++++++++++++++++
 5 files changed, 83 insertions(+), 10 deletions(-)
 create mode 100644 ietf/templates/idtracker/document_entry.html
 create mode 100644 ietf/templates/idtracker/status_of_items.html

diff --git a/ietf/idtracker/models.py b/ietf/idtracker/models.py
index 3352de23d..4bccac7e0 100644
--- a/ietf/idtracker/models.py
+++ b/ietf/idtracker/models.py
@@ -111,7 +111,7 @@ class IDIntendedStatus(models.Model):
 
 class InternetDraft(models.Model):
     id_document_tag = models.AutoField(primary_key=True)
-    id_document_name = models.CharField(maxlength=255)
+    title = models.CharField(maxlength=255, db_column='id_document_name')
     id_document_key = models.CharField(maxlength=255, editable=False)
     group = models.ForeignKey(Acronym, db_column='group_acronym_id')
     filename = models.CharField(maxlength=255, unique=True)
@@ -143,7 +143,7 @@ class InternetDraft(models.Model):
     expired_tombstone = models.BooleanField()
     idinternal = FKAsOneToOne('idinternal', reverse=True, query=models.Q(rfc_flag = 0))
     def save(self):
-        self.id_document_key = self.id_document_name.upper()
+        self.id_document_key = self.title.upper()
         super(InternetDraft, self).save()
     def displayname(self):
 	return "%s-%s.txt" % ( self.filename, self.revision )
@@ -304,7 +304,7 @@ class RfcStatus(models.Model):
 
 class Rfc(models.Model):
     rfc_number = models.IntegerField(primary_key=True)
-    rfc_name = models.CharField(maxlength=200)
+    title = models.CharField(maxlength=200, db_column='rfc_name')
     rfc_name_key = models.CharField(maxlength=200, editable=False)
     group_acronym = models.CharField(blank=True, maxlength=8)
     area_acronym = models.CharField(blank=True, maxlength=8)
@@ -328,7 +328,7 @@ class Rfc(models.Model):
     def __str__(self):
 	return "RFC%04d" % ( self.rfc_number )        
     def save(self):
-	self.rfc_name_key = self.rfc_name.upper()
+	self.rfc_name_key = self.title.upper()
 	super(Rfc, self).save()
     def displayname(self):
 	return "rfc%d.txt" % ( self.rfc_number )
@@ -339,8 +339,8 @@ class Rfc(models.Model):
 	verbose_name = 'RFC'
 	verbose_name_plural = 'RFCs'
     class Admin:
-	search_fields = ['rfc_name', 'group', 'area']
-	list_display = ['rfc_number', 'rfc_name']
+	search_fields = ['title', 'group', 'area']
+	list_display = ['rfc_number', 'title']
 	pass
 
 class RfcAuthor(models.Model):
@@ -408,9 +408,8 @@ class IDInternal(models.Model):
     """
     draft = models.ForeignKey(InternetDraft, primary_key=True, unique=True, db_column='id_document_tag')
     rfc_flag = models.IntegerField(null=True)
-    #ballot_id = models.IntegerField()
     ballot = models.ForeignKey(BallotInfo, related_name='drafts', db_column="ballot_id")
-    primary_flag = models.IntegerField()
+    primary_flag = models.IntegerField(blank=True, null=True)
     group_flag = models.IntegerField(blank=True)
     token_name = models.CharField(blank=True, maxlength=25)
     token_email = models.CharField(blank=True, maxlength=255)
@@ -457,7 +456,9 @@ class IDInternal(models.Model):
     def comments(self):
 	return self.documentcomment_set.all().filter(rfc_flag=self.rfc_flag).order_by('-comment_date','-comment_time')
     def ballot_set(self):
-	return IDInternal.objects.filter(ballot=self.ballot)
+	return IDInternal.objects.filter(ballot=self.ballot_id)
+    def ballot_others(self):
+	return IDInternal.objects.filter(models.Q(primary_flag=0)|models.Q(primary_flag__isnull=True), ballot=self.ballot_id)
     class Meta:
         db_table = 'id_internal'
 	verbose_name = 'IDTracker Draft'
diff --git a/ietf/idtracker/urls.py b/ietf/idtracker/urls.py
index 1836ab11e..e3c15f0f4 100644
--- a/ietf/idtracker/urls.py
+++ b/ietf/idtracker/urls.py
@@ -23,6 +23,8 @@ urlpatterns = patterns('django.views.generic.simple',
 )
 urlpatterns += patterns('',
      (r'^send_email/$', views.send_email),
+     (r'^status/$', views.status),
+     (r'^last_call/$', views.last_call),
 )
 urlpatterns += patterns('django.views.generic.list_detail',
      (r'^rfc(?P<object_id>\d+)/$', 'object_detail', rfc_dict),
diff --git a/ietf/idtracker/views.py b/ietf/idtracker/views.py
index 7d6d6128d..8368172d1 100644
--- a/ietf/idtracker/views.py
+++ b/ietf/idtracker/views.py
@@ -4,7 +4,7 @@ from django import newforms as forms
 from django.template import RequestContext, Context, loader
 from django.shortcuts import get_object_or_404, render_to_response
 from django.db.models import Q
-from django.views.generic.list_detail import object_detail
+from django.views.generic.list_detail import object_detail, object_list
 from ietf.idtracker.models import InternetDraft, IDInternal, IDState, IDSubState
 from ietf.idtracker.forms import EmailFeedback
 from ietf.utils.mail import send_mail_text
@@ -135,3 +135,10 @@ def send_email(request):
     return render_to_response('idtracker/email_form.html', {'category': cat, 'form': form},
 	context_instance=RequestContext(request))
 
+def status(request):
+    queryset = IDInternal.objects.filter(primary_flag=1).exclude(cur_state__state__in=('AD is watching', 'Dead')).order_by('cur_state', 'status_date', 'ballot_id')
+    return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'IESG Status of Items'})
+
+def last_call(request):
+    queryset = IDInternal.objects.filter(primary_flag=1).filter(cur_state__state__in=('In Last Call', 'Waiting for Writeup', 'Waiting for AD Go-Ahead')).order_by('cur_state', 'status_date', 'ballot_id')
+    return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'Documents in Last Call'})
diff --git a/ietf/templates/idtracker/document_entry.html b/ietf/templates/idtracker/document_entry.html
new file mode 100644
index 000000000..73fdb9b3e
--- /dev/null
+++ b/ietf/templates/idtracker/document_entry.html
@@ -0,0 +1,24 @@
+{% load ietf_filters %}
+<tr>{% if doc.primary_flag %}
+  <td>{{ doc.area_acronym.area_acronym.acronym.upper }}</td>
+  <td nowrap>
+  {% ifequal doc.cur_state.state "In Last Call" %}
+    {% if doc.document.lc_expiration_date %}
+      {{ doc.document.lc_expiration_date }}
+    {% endif %}
+  {% else %}
+    {% if doc.status_date %}
+      {{ doc.status_date|date:"M j" }}
+    {% endif %}
+  {% endifequal %}</td>
+{% else %}
+  <td></td><td></td>
+{% endif %}
+<td>{{ doc.document.title }} ({{ doc.document.intended_status }})</td></tr>
+<tr><td></td><td></td><td><a href="{{ doc.document.doclink }}">{{ doc.document.displayname }}</a></td></tr>
+{% if doc.primary_flag %}
+<tr><td></td><td>Token:</td><td><a href="mailto:{{ doc.token_email|urlencode }}">{{ doc.token_name }}</a></td></tr>
+{% if doc.note %}
+<tr><td></td><td>Note:</td><td>{{ doc.note|urlize }}</td></tr>
+{% endif %}
+{% endif %}
diff --git a/ietf/templates/idtracker/status_of_items.html b/ietf/templates/idtracker/status_of_items.html
new file mode 100644
index 000000000..37c6109ff
--- /dev/null
+++ b/ietf/templates/idtracker/status_of_items.html
@@ -0,0 +1,39 @@
+{% extends "base.html" %}
+
+{% block title %}{{ title }}{% endblock %}
+
+{% block content %}
+<center><h1>{{ title }}</h1></center>
+<i>Generated {% now "M j, Y" %}<br>
+{# no hit counter #}
+</i>
+
+{% regroup object_list by cur_state_id as grouped %}
+{% for state in grouped %}
+<a name="grp{{ state.list.0.cur_state }}"><h2>{{ state.list.0.cur_state }}</h2></a>
+<table>
+<tr><th>Area</th><th>{% ifequal state.list.0.cur_state.state "In Last Call" %}Expires at{% else %}Date{% endifequal %}</th></tr>
+{% for doc in state.list %}
+{% include "idtracker/document_entry.html" %}
+{% if doc.ballot_others %}
+{% for doc in doc.ballot_others %}
+{% include "idtracker/document_entry.html" %}
+{% endfor %}
+{% endif %}
+{% endfor %}
+</table>
+{% endfor %}
+
+<HR>
+<b><A href="http://www.rfc-editor.org/queue.html">RFC Editor Queue</a></b>
+<p>
+
+
+<!-- begin new footer -->
+<HR>
+
+<i>This page produced by the <A HREF="mailto:iesg-secretary@ietf.org">IETF Secretariat</a> 
+for the <A HREF="mailto:iesg@ietf.org">IESG</A></i>
+<p>
+
+{% endblock %}