Replaced most of /idtracker/ (search, document page, ballot page, comment page) with directs to /doc/

- Legacy-Id: 2168
This commit is contained in:
Pasi Eronen 2010-03-21 14:43:04 +00:00
parent 8e4846b8bb
commit 814e31710e
10 changed files with 34 additions and 709 deletions

View file

@ -1,21 +0,0 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django import forms
from models import IESGLogin, IDStatus, Area, IDState, IDSubState
class IDSearch(forms.Form):
search_job_owner = forms.ChoiceField(choices=(), required=False)
search_group_acronym = forms.CharField(widget=forms.TextInput(attrs={'size': 7, 'maxlength': 10}), required=False)
search_status_id = forms.ModelChoiceField(IDStatus.objects.all(), empty_label="--All", required=False)
search_area_acronym = forms.ModelChoiceField(Area.active_areas(), empty_label="--All/Any", required=False)
search_cur_state = forms.ModelChoiceField(IDState.objects.all(), empty_label="--All/Any", required=False)
sub_state_id = forms.ChoiceField(choices=(), required=False)
search_filename = forms.CharField(widget=forms.TextInput(attrs={'size': 15, 'maxlength': 60}), required=False)
search_rfcnumber = forms.IntegerField(widget=forms.TextInput(attrs={'size': 5, 'maxlength': 60}), required=False)
def __init__(self, *args, **kwargs):
super(IDSearch, self).__init__(*args, **kwargs)
self.fields['search_job_owner'].choices = [('', '--All/Any')] + [(ad.id, "%s, %s" % (ad.last_name, ad.first_name)) for ad in IESGLogin.objects.filter(user_level=1).order_by('last_name')] + [('-99', '------------------')] + [(ad.id, "%s, %s" % (ad.last_name, ad.first_name)) for ad in IESGLogin.objects.filter(user_level=2).order_by('last_name')]
self.fields['sub_state_id'].choices = [('', '--All Substates'), ('0', 'None')] + [(state.sub_state_id, state.sub_state) for state in IDSubState.objects.all()]
# changes done by convert-096.py:changed newforms to forms

View file

@ -6,31 +6,22 @@
200 /idtracker/status/
200 /idtracker/status/last-call/
200 /idtracker/rfc3847/
301 /idtracker/rfc3847/
301 /idtracker/12689/
200 /idtracker/draft-ietf-isis-link-attr/
200 /idtracker/draft-ietf-isis-link-attr/comment/65232/
301 /idtracker/draft-ietf-isis-link-attr/
301 /idtracker/draft-ietf-isis-link-attr/comment/65232/
301 /idtracker/draft-eronen-tls-psk/ # no IESG information
200 /idtracker/comment/65232/
200 /idtracker/ballot/1760/
200 /idtracker/
301 /idtracker/comment/65232/
301 /idtracker/ballot/1760/
301 /idtracker/
200 /feed/comments/draft-ietf-isis-link-attr/
200 /feed/comments/rfc3373/
200 /idtracker/?search_group_acronym=&search_job_owner=0&search_rfcnumber=&search_status_id=&sub_state_id=6&search_cur_state=&search_button=SEARCH&search_filename=bgp-m&search_area_acronym=
200 /idtracker/?search_rfcnumber=1234
200 /idtracker/?search_job_owner=53&search_filename=nfs
200 /idtracker/?sub_state_id=5
200,heavy /idtracker/?sub_state_id=6
200 /idtracker/?search_area_acronym=1260
200 /idtracker/?search_group_acronym=tls
200 /idtracker/?search_group_acronym=%EF%BD%8C #non-ASCII
200 /idtracker/?search_filename=%EF%BD%8C #non-ASCII
200 /feed/last-call/
# An RFC with no matching value in InternetDrafts. This tests
# subtle cases of using the draft relation when it's not appropriate.
# See ticket #218.
200 /idtracker/rfc2444/
301 /idtracker/rfc2444/
200 /feed/comments/rfc2444/
# Test case for missing comment time (bug fixed in changeset 1733)

View file

@ -1,22 +1,9 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls.defaults import patterns
from ietf.idtracker.models import IDInternal, IDState, IDSubState, DocumentComment, BallotInfo
from ietf.idtracker.models import IDState, IDSubState
from ietf.idtracker import views
id_dict = {
'queryset': IDInternal.objects.all().filter(rfc_flag=0),
}
rfc_dict = {
'queryset': IDInternal.objects.all().filter(rfc_flag=1),
}
comment_dict = {
'queryset': DocumentComment.objects.all().filter(public_flag=1),
}
ballot_dict = {
'queryset': BallotInfo.objects.all()
}
from django.views.generic.simple import redirect_to
urlpatterns = patterns('django.views.generic.simple',
(r'^help/state/$', 'direct_to_template', { 'template': 'idtracker/states.html', 'extra_context': { 'states': IDState.objects.all(), 'substates': IDSubState.objects.all() } }),
@ -28,13 +15,13 @@ urlpatterns += patterns('',
(r'^status/last-call/$', views.last_call),
)
urlpatterns += patterns('',
(r'^rfc(?P<object_id>\d+)/$', views.view_rfc),
(r'^rfc0*(?P<rfc_number>\d+)/$', views.redirect_rfc),
(r'^(?P<object_id>\d+)/$', views.redirect_id),
(r'^(?P<slug>[^/]+)/$', views.view_id, dict(id_dict, slug_field='draft__filename')),
(r'^comment/(?P<object_id>\d+)/$', views.view_comment, comment_dict),
(r'^ballot/(?P<object_id>\d+)/$', views.view_ballot, ballot_dict),
(r'^(?P<slug>[^/]+)/comment/(?P<object_id>\d+)/$', views.comment, comment_dict),
(r'^(?P<filename>[^/]+)/$', views.redirect_filename),
(r'^comment/(?P<object_id>\d+)/$', views.redirect_comment),
(r'^ballot/(?P<object_id>\d+)/$', views.redirect_ballot),
(r'^([^/]+)/comment/(?P<object_id>\d+)/$', views.redirect_comment),
(r'^help/state/(?P<state>\d+)/$', views.state_desc),
(r'^help/substate/(?P<state>\d+)/$', views.state_desc, { 'is_substate': 1 }),
(r'^$', views.search),
(r'^$', redirect_to, { 'url': '/doc/'}),
)

View file

@ -2,137 +2,12 @@
# Create your views here.
from django.http import HttpResponsePermanentRedirect
from django import forms
from django.template import RequestContext
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, object_list
from ietf.idtracker.models import InternetDraft, IDInternal, IDState, IDSubState, Rfc, DocumentWrapper
from ietf.idtracker.forms import IDSearch
from ietf.utils import normalize_draftname
from ietf.idtracker.models import InternetDraft, IDInternal, IDState, IDSubState, BallotInfo, DocumentComment
import re
def search(request):
# for compatability with old tracker form, which has
# "all substates" = 6.
args = request.GET.copy()
if args.get('sub_state_id', '') == '6':
args['sub_state_id'] = ''
# "job_owner" of "0" means "All/Any"
if args.get('search_job_owner', '') == '0':
args['search_job_owner'] = ''
if args.has_key('search_filename'):
args['search_filename'] = normalize_draftname(args['search_filename'])
form = IDSearch(args)
# if there's a post, do the search and supply results to the template
searching = False
# filename, rfc_number, group searches are seperate because
# they can't be represented as simple searches in the data model.
qdict = {
'search_job_owner': 'job_owner',
'search_cur_state': 'cur_state',
'sub_state_id': 'cur_sub_state',
'search_area_acronym': 'area_acronym',
}
q_objs = []
for k in qdict.keys() + ['search_group_acronym', 'search_rfcnumber', 'search_filename', 'search_status_id']:
if args.has_key(k):
searching = True
if args[k] != '' and qdict.has_key(k):
q_objs.append(Q(**{qdict[k]: args[k]}))
if form.is_valid() == False:
searching = False
if searching:
# Non-ASCII group/filename doesn't match anything; this check
# is currently needed to avoid complaints from MySQL.
for k in ['search_group_acronym','search_filename']:
try:
tmp = str(args.get(k, ''))
except:
args[k] = '*NOSUCH*'
group = args.get('search_group_acronym', '')
if group != '':
rfclist = [rfc['rfc_number'] for rfc in Rfc.objects.all().filter(group_acronym=group).values('rfc_number')]
draftlist = [draft['id_document_tag'] for draft in InternetDraft.objects.all().filter(group__acronym=group).values('id_document_tag')]
if rfclist or draftlist:
q_objs.append(Q(draft__in=draftlist)&Q(rfc_flag=0)|Q(draft__in=rfclist)&Q(rfc_flag=1))
else:
q_objs.append(Q(draft__isnull=True)) # no matches
rfc_number = args.get('search_rfcnumber', '')
if rfc_number != '':
draftlist = [draft['id_document_tag'] for draft in InternetDraft.objects.all().filter(rfc_number=rfc_number).values('id_document_tag')]
q_objs.append(Q(draft__in=draftlist)&Q(rfc_flag=0)|Q(draft=rfc_number)&Q(rfc_flag=1))
filename = args.get('search_filename', '')
if filename != '':
q_objs.append(Q(draft__filename__icontains=filename,rfc_flag=0))
status = args.get('search_status_id', '')
if status != '':
q_objs.append(Q(draft__status=status,rfc_flag=0))
matches = IDInternal.objects.all().exclude(draft=999999).filter(*q_objs)
matches = matches.order_by('cur_state', 'cur_sub_state', 'ballot', '-primary_flag')
# sort by date in reverse
# first build docstate groups, within which we sort
# in each docstate group, we build ballot id groups, which we sort
m1 = [] # list of: docstate, list of: event date; ballot id; list of: ms for the ballot id
for m in matches:
if m1 and m1[-1][0] == m.docstate():
if m1[-1][1] and m1[-1][1][0][1] == m.ballot_id:
m1[-1][1][0][4].append(m)
else:
m1[-1][1].append((m.event_date, m.ballot_id, m.primary_flag, m.draft_id, [m]))
else:
m1.append((m.docstate(), [(m.event_date, m.ballot_id, m.primary_flag, m.draft_id, [m])]))
matches = []
for ms in m1: ms[1].sort(reverse=True)
for ms in m1:
for mt in ms[1]:
matches.extend(mt[4])
#
# Now search by I-D exists, if there could be any results.
# If searching by job owner, current state or substate, there
# can't be any "I-D exists" matches.
if not(args.get('search_job_owner', 0) or args.get('search_cur_state', 0) or args.get('sub_state_id', 0)):
if not(args.get('search_rfcnumber', 0)):
in_tracker=[i['draft'] for i in IDInternal.objects.filter(rfc_flag=0).values('draft')]
qdict = {
'search_area_acronym': 'group__ietfwg__areagroup__area',
'search_group_acronym': 'group__acronym',
'search_filename': 'filename__icontains',
#'search_status_id': 'status',
}
q_objs = [Q(**{qdict[k]: args[k]}) for k in qdict.keys() if args.get(k, '') != '']
idmatches = InternetDraft.objects.filter(*q_objs).exclude(id_document_tag__in=in_tracker).filter(status__status='Active').order_by('filename')
# resolve the queryset, append wrapper objects.
matches = list(matches) + [DocumentWrapper(id) for id in idmatches]
if not(args.get('search_filename', '') or args.get('search_status_id', 0)) and args.get('search_rfcnumber', 0):
# the existing area acronym support in this function
# in pidtracker.cgi is broken, since it compares an
# area acronym string in the database against an
# area acronym number in the form. We just ignore
# the area (resulting in a different search, but
# given that this search is only performed when there's
# an explicit rfc number, it seems more or less silly
# to filter it further anyway.)
in_tracker=[i['draft'] for i in IDInternal.objects.filter(rfc_flag=1).values('draft')]
qdict = {
'search_group_acronym': 'group_acronym',
'search_rfcnumber': 'rfc_number',
'search_status_id': 'status',
}
q_objs = [Q(**{qdict[k]: args[k]}) for k in qdict.keys() if args.get(k, '') != '']
rfcmatches = Rfc.objects.filter(*q_objs).exclude(rfc_number__in=in_tracker)
matches = list(matches) + [DocumentWrapper(rfc) for rfc in rfcmatches]
else:
matches = None
return render_to_response('idtracker/idtracker_search.html', {
'form': form,
'matches': matches,
'searching': searching,
'spacing': True
}, context_instance=RequestContext(request))
def state_desc(request, state, is_substate=0):
if int(state) == 100:
object = {
@ -151,15 +26,6 @@ IESG to do anything with the document.
return render_to_response('idtracker/state_desc.html', {'state': object},
context_instance=RequestContext(request))
def comment(request, slug, object_id, queryset):
rfcnum = re.match(r'^rfc(\d+)$', slug)
if rfcnum:
queryset = queryset.filter(document=rfcnum.groups()[0])
else:
draft = get_object_or_404(InternetDraft, filename=slug)
queryset = queryset.filter(document=draft.id_document_tag)
return object_detail(request, queryset=queryset, object_id=object_id)
def status(request):
queryset = IDInternal.objects.filter(primary_flag=1).exclude(cur_state__state__in=('RFC Ed Queue', 'RFC Published', 'AD is watching', 'Dead')).order_by('cur_state', 'status_date', 'ballot')
return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'IESG Status of Items'})
@ -173,36 +39,25 @@ def redirect_id(request, object_id):
doc = get_object_or_404(InternetDraft, id_document_tag=object_id)
return HttpResponsePermanentRedirect("/doc/"+doc.filename+"/")
# calling sequence similar to object_detail, but we have different
# 404 handling: if the draft exists, render a not-found template.
def view_id(request, queryset, slug, slug_field):
try:
object = IDInternal.objects.get(draft__filename=slug, rfc_flag=0)
except IDInternal.DoesNotExist:
draft = get_object_or_404(InternetDraft, filename=slug)
return HttpResponsePermanentRedirect("/doc/"+draft.filename+"/")
return render_to_response('idtracker/idinternal_detail.html', {'object': object, 'spacing': False}, context_instance=RequestContext(request))
def redirect_rfc(request, rfc_number):
return HttpResponsePermanentRedirect("/doc/rfc"+rfc_number+"/")
def view_rfc(request, object_id):
'''A replacement for the object_detail generic view for this
specific case to work around the following problem:
The object_detail generic view looks up the value of the
primary key in order to hand it to populate_xheaders.
In the IDInternal table, the primary key is a foreign key
to InternetDraft. object_detail assumes that the PK is not
an FK so doesn't do the foo_id trick, so the lookup is
attempted and an exception raised if there is no match.
This view gets the appropriate row from IDInternal and
calls the template with the necessary context.'''
object = get_object_or_404(IDInternal, pk=object_id, rfc_flag=1)
return render_to_response('idtracker/idinternal_detail.html', {'object': object, 'spacing': False}, context_instance=RequestContext(request))
def redirect_filename(request, filename):
return HttpResponsePermanentRedirect("/doc/"+filename+"/")
# Wrappers around object_detail to give permalink a handle.
# The named-URLs feature in django 0.97 will eliminate the
# need for these.
def view_comment(*args, **kwargs):
return object_detail(*args, **kwargs)
def redirect_ballot(request, object_id):
ballot = get_object_or_404(BallotInfo, pk=object_id)
id = ballot.drafts.filter(primary_flag=1)[0]
if id.rfc_flag:
return HttpResponsePermanentRedirect("/doc/rfc"+str(id.draft_id)+"/#ballot")
else:
return HttpResponsePermanentRedirect("/doc/"+id.draft.filename+"/#ballot")
def view_ballot(*args, **kwargs):
return object_detail(*args, **kwargs)
def redirect_comment(request, object_id):
comment = get_object_or_404(DocumentComment, pk=object_id)
id = comment.document
if id.rfc_flag:
return HttpResponsePermanentRedirect("/doc/rfc"+str(id.draft_id)+"/#history-"+str(object_id))
else:
return HttpResponsePermanentRedirect("/doc/"+id.draft.filename+"/#history-"+str(object_id))

View file

@ -1,53 +0,0 @@
{# Copyright The IETF Trust 2007, All Rights Reserved #}{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}-- Ballot for {{ object.drafts.all.0.document.filename }}{% endblock %}
{% block content %}
<pre>
To: Internet Engineering Steering Group &lt;iesg@ietf.org&gt;
From: IESG Secretary &lt;iesg-secretary@ietf.org&gt;
Reply-To: IESG Secretary &lt;iesg-secretary@ietf.org&gt;
Subject: Evaluation: {% for id in object.drafts.all %}{{ id.draft.filename }}-{{ id.draft.revision }}.txt to {{ id.draft.intended_status }}
{% endfor %}
--------
Evaluation for{% for id in object.drafts.all %} {{ id.draft.filename }}-{{ id.draft.revision }}.txt {% endfor %}can be found at
https://datatracker.ietf.org{% url ietf.idtracker.views.view_ballot object.ballot %} <!-- FIXME: hardcoded URL -->
{% if object.drafts.all.0.draft.lc_expiration_date %}
Last Call to expire on: {{ object.drafts.all.0.draft.lc_expiration_date|escape }}
{% endif %}
Please return the full line with your position.
Yes No-Objection Discuss Abstain
{% if not object.an_sent %}{% for curpos in object.active_positions %}{{ curpos.ad|ljust:"20" }} {{ curpos.pos.yes|bracket }} {{ curpos.pos.noobj|bracket }} {{ curpos.pos.discuss|bracket }} {{ curpos.pos.abstain_ind|bracket }}
{% endfor %}
{% endif %}{% for position in object.positions.all|dictsort:"ad.last_name" %}{% if object.an_sent or not position.ad.is_current_ad %}{{ position.ad|ljust:"20" }} {{ position.yes|bracket }} {{ position.noobj|bracket }} {{ position.discuss|bracket }} {{ position.abstain_ind|bracket }}
{% endif %}{% endfor %}
"Yes" or "No-Objection" positions from 2/3 of non-recused ADs,
with no "Discuss" positions, are needed for approval.
DISCUSSES AND COMMENTS:
======================
{% for position in object.positions.all|dictsort:"ad.last_name" %}{% ifequal position.discuss 1 %}{{ position.ad }}:{% for item in object.discusses.all %}{% ifequal position.ad item.ad %}
Discuss [{{ item.date }}]:
{{ item.text|fill:"80"|escape }}
{% endifequal %}{% endfor %}{% endifequal %}{% for item in object.comments.all %}{% ifequal position.ad item.ad %}{% ifnotequal position.discuss 1 %}{{ position.ad }}:
{% endifnotequal %}Comment [{{ item.date }}]:
{{ item.text|fill:"80"|escape }}
{% endifequal %}{% endfor %}{% endfor %}
^L
---- following is a DRAFT of message to be sent AFTER approval ---
{{ object.approval_text|escape|urlize }}
{{ object.ballot_writeup|escape|urlize }}
</pre>
{% endblock %}

View file

@ -1,42 +0,0 @@
{# Copyright The IETF Trust 2007, All Rights Reserved #}
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}
Comment on {{ object.document.document.filename }}
{% endblock %}
{% block content %}
<h1 class="first">Comment on {{ object.document.document.displayname_with_link|safe }}</h1>
<table class="top">
<tr><th>Date:</th><td>{{ object.date }}, {{ object.time }}</td></tr>
<tr><th>Document:</th>
<td>{{ object.document.document.displayname_with_link|safe }}</td>
</tr>
<tr><th>Version:</th><td>{{ object.version }}</td></tr>
<tr><th>Commented by:</th><td>{{ object.get_author }}</td></tr>
{% if object.origin_state %}
<tr><th>State before Comment:</th><td>{{ object.origin_state }}</td></tr>
{% endif %}
{% if object.result_state %}
<tr><th>State after Comment:</th><td>{{ object.result_state }}</td></tr>
{% endif %}
<tr><th>Comment:</th><td>
{% if object.ballot %}
<span class="{{ object.get_ballot_display }}">[IESG Evaluation {{ object.get_ballot_display|upper }}] </span>
{% endif %}
<pre>{{ object.comment_text|wrap_long_lines|safe }}</pre></td></tr>
</table>
<form action="."><p><input type="button" value="Back" onClick="history.go(-1)"/></p></form>
{% endblock %}

View file

@ -1,221 +0,0 @@
{# Copyright The IETF Trust 2007, All Rights Reserved #}{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}-- {{ object.document.filename }}{% endblock %}
{% block head %}
<link rel="alternate" type="application/atom+xml" href="/feed/comments/{{ object.document.filename }}/"/>
{% endblock %}
{% block content %}
<h1 class="first">Detailed Information</h1>
<h1>This page will be removed soon; go <a href="/doc/{{object.document.filename}}/">here</a> instead.</h1>
<!--
{% if object.ballot_others.count %}
<a href="#action">Action List</a>
{% endif %}
-->
<table class="top">
<tr>
<th>
{{ object.document.doctype }} Name:
</th>
<td>
{{ object.document.displayname_with_link|safe }}
{% ifequal object.document.doctype "Draft" %}
{% ifnotequal object.document.status.status "Active" %}
({{ object.document.status.status }})
{% endifnotequal %}
{% endifequal %}
{% if object.via_rfc_editor %}
(Independent submission via RFC Editor)
{% else %}
{% ifequal object.document.group_acronym "none" %}
(Individual submission)
{% else %}
(<a href="/idtracker/?search_group_acronym={{ object.document.group_acronym }}">{{ object.document.group_acronym|upper }}</a> WG submission)
{% endifequal %}
{% endif %}
{% ifequal object.document.status.status "Replaced" %}
Replaced by
{% if object.document.replaced_by.idinternal %}
<a href="{{ object.document.replaced_by.idinternal.get_absolute_url }}">
{% endif %}
{{ object.document.replaced_by.displayname_with_link|safe }}
{% if object.document.replaced_by.idinternal %}
</a>
{% endif %}
{% endifequal %}
{% if object.document.replaces_set.count %}
<br>Replaces
{% for replaces in object.document.replaces_set.all %}
{% if replaces.idinternal %}
<a href="{{ replaces.idinternal.get_absolute_url }}">
{% endif %}
{{ replaces.displayname_with_link|safe }}{% if replaces.idinternal %}</a>{% endif %}{% if not forloop.last %},{% endif %}
{% endfor %}
{% endif %}
</td>
</tr>
<tr>
<th>
Version:
</th>
<td>
{{ object.document.revision }}
</td>
</tr>
<tr>
<th>
Intended Status:
</th>
<td>
{{ object.document.intended_status }}
</td>
</tr>
<tr>
<th>
On Next Agenda?
</th>
<td>
{{ object.agenda|yesno:"Yes,No" }}
</td>
</tr>
<tr>
<th>
IESG Discussion:
</th>
<td>
{% if object.ballot.ballot_issued %}
<a href="{% url ietf.idtracker.views.view_ballot object.ballot_id %}">IESG evaluation record</a>
[<a href="/idtracker/help/evaluation/">What they mean</a>]
[<a href="/idtracker/help/ballot/">How they are recorded</a>]
{% else %}
No IESG evaluation record
{% endif %}
</td>
</tr>
<tr>
<th>
Current State:
</th>
<td>
<a title="{{ object.cur_state.description|escape|allononelinew }}" href="/idtracker/help/state/{{ object.cur_state_id }}/">
{{ object.cur_state }}</a>
{% if object.cur_sub_state %}
::
<a title="{{ object.cur_sub_state.description|escape|allononelinew }}" href="/idtracker/help/substate/{{ object.cur_sub_state_id }}/">
{{ object.cur_sub_state }}</a>
{% endif %}
{% if object.rfc_flag %}
{% else %}
{% ifequal object.cur_state.state "RFC Ed Queue" %}
<a href="http://www.rfc-editor.org/queue.html#{{ object.document.filename }}">
[RFC Editor State]</a>
{% endifequal %}
{% endif %}
<a href="/idtracker/help/state/">
[State explanations]</a>
</td>
</tr>
<tr>
<th>
Responsible AD:
</th>
<td>
{{ object.job_owner }}
</td>
</tr>
<tr>
<th>
Status Date:
</th>
<td>
{% firstof object.status_date "&nbsp;" %}
</td>
</tr>
<tr>
<th>
Note:
</th>
<td>
{# |unformat_textarea #}
{% firstof object.note "&nbsp;" %}
</td>
</tr>
<!--
<tr>
<td/>
<td>
<form action="{% url ietf.idtracker.views.search %}" method="GET">
<input type="submit" value=
"Main Menu">
</form>
</td>
</tr>
-->
</table>
{% if object.ballot_others.count %}
<h1>Ballot Set</h1>
{% regroup object.ballot_set by docstate as grouped %}
{% include "idtracker/search_result_table.html" %}
{% endif %}
<h1>Comment Log [<a href="/feed/comments/{{ object.document.filename }}/">atom feed</a>]</h1>
<table>
<tr>
<th>Version</th>
<th>Action</th>
<th>Who</th>
<th>Date</th>
</tr>
{% for comment in object.public_comments %}
<tr bgcolor="{% cycle #CFE1CC,#7DC189 %}">
<td>{{ comment.version }}</td>
<td>
{% if comment.ballot %}
<span class="{{ comment.get_ballot_display }}">[IESG Evaluation {{ comment.get_ballot_display|upper }}] </span>
{% endif %}
{{ comment.comment_text|removetags:"b br"|truncatewords_html:"20"|safe }}
[<a href="{{ comment.get_absolute_url }}">more</a>]
</td>
<td>{{ comment.get_fullname }}</td>
<td>{{ comment.date }}</td>
</tr>
{% endfor %}
</table>
<p><a href="{% url ietf.idtracker.views.search %}">Main Menu</a></p>
{% endblock %}

View file

@ -1,88 +0,0 @@
{# Copyright The IETF Trust 2007, All Rights Reserved #}
{% extends "base.html" %}
{% load ietf_filters %}
{% block title %}IETF I-D Tracker{% endblock %}
{% block content %}
<script type="text/javascript" language="javascript">
function clear_fields() {
document.search_form.search_job_owner.selectedIndex = 0;
document.search_form.search_status_id.selectedIndex = 0;
document.search_form.search_area_acronym.selectedIndex = 0;
document.search_form.search_cur_state.selectedIndex = 0;
document.search_form.sub_state_id.selectedIndex = 0;
document.search_form.search_group_acronym.value = "";
document.search_form.search_filename.value = "";
document.search_form.search_rfcnumber.value = "";
}
</script>
<h1 class="first">IETF I-D Tracker</h1>
<h1>This page will be removed soon; go <a href="/doc/">here</a> instead.</h1>
<form action="." method="get" name="search_form">
<table class="top">
<tr>
<th><label for="id_search_job_owner">Responsible AD:</label></th>
<td>{{ form.search_job_owner }} </td>
</tr>
<tr>
<th><label for="id_search_group_acronym">WG Acronym:</label></th>
<td>{{ form.search_group_acronym }} </td>
</tr>
<tr>
<th><label for="id_search_area_acronym">Area Acronym:</label></th>
<td>{{ form.search_area_acronym }} </td>
</tr>
<tr>
<th><label for="id_search_status_id">Status:</label></th>
<td>{{ form.search_status_id }} </td>
</tr>
<tr>
<th><a href="/idtracker/help/state/">Current State:</a></th>
<td>{{ form.search_cur_state }}{{ form.sub_state_id }} </td>
</tr>
<tr>
<th><label for="id_search_filename">Draft Name:</label></th>
<td>{{ form.search_filename }} </td>
</tr>
<tr>
<th><label for="id_search_rfcnumber">RFC Number:</label></th>
<td>{{ form.search_rfcnumber }} </td>
</tr>
<tr>
<td/>
<td class="buttons">
<input type="button" value="Reset Form" onClick="clear_fields()"/>
<input type="submit" value="Search I-Ds"/>
</td>
</tr>
</table>
</form>
{% if form.errors %}
<p class="error">
Please fix the following error{{ form.errors|pluralize }} and retry your search:
{{ form.errors }}
</p>
{% endif %}
{% if matches %}
{% regroup matches by docstate as grouped %}
{% include "idtracker/search_result_table.html" %}
{% else %}
{% if searching %}
<p class="error">No matches to your query.</p>
{% endif %}
{% endif %}
{% if matches or searching %}
<p><a href=".">Back</a></p>
{% endif %}
{% endblock %}

View file

@ -1,47 +0,0 @@
{# Copyright The IETF Trust 2007, All Rights Reserved #}
{% load ietf_filters %}
{# we can't do alternating row colors with CSS alone #}
<tr
bgcolor="{% cycle #F8D6F8,#E2AFE2 %}">
<td {% if not match.primary_flag %} class="nonprimary" {% endif %} >
<a href="{% url ietf.idtracker.views.view_id match.document.filename %}">
{{ match.document.displayname|safe }}
</a>
{% ifequal match.document.status.status "Replaced" %}
<p class="replace">Replaced by
<!-- {% if match.document.replaced_by.idinternal %}
<a href="{% url ietf.idtracker.views.search %}?search_filename={{ match.document.replaced_by.filename }}">
{% endif %}
--> {{ match.document.replaced_by.displayname_with_link|safe }}
<!-- {% if match.document.replaced_by.idinternal %}
</a>
{% endif %}
--> </p>
{% endifequal %}
{% if match.document.replaces_set.count %}
<p class="replace">Replaces
{% for replaces in match.document.replaces_set.all %}
<!-- {% if replaces.idinternal %}
<a href="{% url ietf.idtracker.views.search %}?search_filename={{ replaces.filename }}">
{% endif %}
--> {{ replaces.displayname_with_link|safe }}
<!-- {% if replaces.idinternal %}</a>{% endif %}{% if not forloop.last %}</p><p class="replace">{% endif %}
--> {% endfor %}</p>
{% endif %}
</td>
<td>
<a href="{{ match.document.doclink }}">{{ match.document.revision_display }}</a>
</td>
<td>{{ match.document.intended_status }}</td>
<td>{{ match.job_owner }}</td>
<td>{{ match.event_date }}</td>
</tr>

View file

@ -1,36 +0,0 @@
{# Copyright The IETF Trust 2007, All Rights Reserved #}
<table>
{% for group in grouped %}
{% load ietf_filters %}
<tr>
<th {% if spacing %} class="state" {% endif %} colspan="7">
State:
<a title="{{ group.list.0.cur_state.description|escape|allononelinew }}" href="/idtracker/help/state/{{ group.list.0.cur_state_id }}/">{{ group.list.0.cur_state }}</a>
{% if group.list.0.cur_sub_state %}
:: <a title="{{ group.list.0.cur_sub_state.description|escape|allononelinew }}" href="/idtracker/help/substate/{{ group.list.0.cur_sub_state_id }}/">
{{ group.list.0.cur_sub_state }}</a>
{% endif %}
</th>
</tr>
<tr>
<th>Document</th>
<th>Version</th>
<th>Intended Status</th>
<th>Responsible AD</th>
<th>Modified</th>
</tr>
{# Same sort algorithm as I-D tracker #}
{% regroup group.list by primary_flag as primaries %}
{% for pgroup in primaries %}
{% for match in pgroup.list %}
{% include "idtracker/search_result_row.html" %}
{% endfor %}
{% endfor %}
{% endfor %}
</table>