Merged in code from Pasi for new ID/RFC search and per-document pages (under /doc/), and IESG 'discuss report'.

- Legacy-Id: 1450
This commit is contained in:
Henrik Levkowetz 2009-04-26 14:02:30 +00:00
parent 65b4f738ae
commit aa54250805
35 changed files with 2731 additions and 5 deletions

View file

@ -1,3 +1,20 @@
ietfdb (2.24)
* Merged in code from Pasi for new ID/RFC search and per-document pages,
and IESG "discuss report".
* Added missing images for liaison_manager.cgi to static/images/.
* More sensible error message if settings_local.py is not found.
* Fix feed problem for non-ascii names. From Pasi Eronen.
* ** NOTE: This release uses the Django cache framework, and requires
that the cache directory in settings.py (/a/www/ietf-datatracker/cache/)
exists.
* Fix problem with area model in admin interface
ietfdb (2.23)
* Fixed a wrong link in the html agenda (from Henrik)

519
ietf/idrfc/idrfc_wrapper.py Normal file
View file

@ -0,0 +1,519 @@
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from ietf.idtracker.models import InternetDraft, Rfc, IDInternal, BallotInfo, IESGDiscuss, IESGComment, Position, IESGLogin
from ietf.idrfc.models import RfcIndex, RfcEditorQueue, DraftVersions
import re
from datetime import date, timedelta
from django.utils import simplejson
import types
BALLOT_ACTIVE_STATES = ['In Last Call',
'Waiting for Writeup',
'Waiting for AD Go-Ahead',
'IESG Evaluation',
'IESG Evaluation - Defer']
# A wrapper to make writing templates less painful
# Can represent either an Internet Draft, RFC, or combine both
class IdRfcWrapper:
# avoid using these in templates
draft = None
idinternal = None
rfc = None
rfcIndex = None
# Active, RFC, Expired, Replaced, etc.
document_status = None
draft_name = None
draft_revision = None
title = None
rfc_number = None
revision_date = None
tracker_id = None
rfc_maturity_level = None
iesg_main_state = None
iesg_state = None
iesg_sub_state = None
iesg_state_date = None
# must give either draft or rfcIndex!
def __init__(self, draft=None, rfc=None, rfcIndex=None, findRfc=False):
if isinstance(draft, IDInternal):
self.idinternal = draft
self.draft = self.idinternal.draft
elif draft:
self.draft = draft
if draft.idinternal:
self.idinternal = draft.idinternal
if findRfc:
if self.draft and self.draft.rfc_number:
try:
r = Rfc.objects.get(rfc_number=self.draft.rfc_number)
ri = RfcIndex.objects.get(rfc_number=self.draft.rfc_number)
self.rfc = r
self.rfcIndex = ri
except Rfc.DoesNotExist:
pass
except RfcIndex.DoesNotExist:
pass
elif rfcIndex:
try:
r = Rfc.objects.get(rfc_number=rfcIndex.rfc_number)
self.rfc = r
except Rfc.DoesNotExist:
pass
if rfcIndex:
self.rfcIndex = rfcIndex
if rfc:
self.rfc = rfc
self.init_basic_data()
def __str__(self):
return "IdRfcWrapper:"+self.debug_data()
def init_basic_data(self):
d = self.draft
i = self.idinternal
r = self.rfcIndex
if r:
self.document_status = "RFC"
else:
self.document_status = str(d.status)
if d:
self.draft_name = d.filename
self.draft_revision = d.revision
self.title = d.title
self.revision_date = d.revision_date
self.tracker_id = d.id_document_tag
if d.rfc_number:
self.rfc_number = d.rfc_number
if i:
self.iesg_main_state = str(i.cur_state)
if i.cur_sub_state_id > 0:
self.iesg_sub_state = str(i.cur_sub_state)
self.iesg_state = self.iesg_main_state + "::" + self.iesg_sub_state
else:
self.iesg_sub_state = None
self.iesg_state = self.iesg_main_state
self.iesg_state_date = i.event_date
if r:
self.title = r.title
self.revision_date = r.rfc_published_date
self.rfc_number = r.rfc_number
if not d:
self.draft_name = r.draft
self.rfc_maturity_level = r.current_status
# Handle incorrect database entries
if self.is_rfc() and not self.rfc_number:
self.document_status = "Expired"
# Handle missing data
if self.is_rfc() and not self.rfc_maturity_level:
self.rfc_maturity_level = "Unknown?"
def is_rfc(self):
return (self.document_status == "RFC")
def in_iesg_tracker(self):
return (self.idinternal != None)
def ad_name(self):
if self.idinternal:
name = self.idinternal.token_name
# Some old documents have token name as "Surname, Firstname";
# newer ones have "Firstname Surname"
m = re.match(r'^(\w+), (\w+)$', name)
if m:
return m.group(2)+" "+m.group(1)
else:
return name
else:
return None
def draft_name_and_revision(self):
if self.draft_name and self.draft_revision:
return self.draft_name+"-"+self.draft_revision
else:
return None
def rfc_editor_state(self):
try:
if self.draft:
qs = self.draft.rfc_editor_queue_state
return qs.state
except RfcEditorQueue.DoesNotExist:
pass
return None
def has_rfc_errata(self):
return self.rfcIndex and (self.rfcIndex.has_errata > 0)
def last_call_ends(self):
if self.iesg_main_state == "In Last Call":
return self.draft.lc_expiration_date
else:
return None
def iesg_note(self):
if self.idinternal and self.idinternal.note:
n = self.idinternal.note
# Hide unnecessary note of form "RFC 1234"
if re.match("^RFC\s*\d+$", n):
return None
return n
else:
return None
def iesg_ballot_approval_text(self):
if self.has_iesg_ballot():
return self.idinternal.ballot.approval_text
else:
return None
def iesg_ballot_writeup(self):
if self.has_iesg_ballot():
return self.idinternal.ballot.ballot_writeup
else:
return None
# TODO: Returning integers here isn't nice
# 0=Unknown, 1=IETF, 2=IAB, 3=IRTF, 4=Independent
def stream_id(self):
if self.draft_name:
if self.draft_name.startswith("draft-iab-"):
return 2
elif self.draft_name.startswith("draft-irtf-"):
return 3
elif self.idinternal:
if self.idinternal.via_rfc_editor > 0:
return 4
else:
return 1
g = self.group_acronym()
if g:
return 1
return 0
# Ballot exists (may be old or active one)
def has_iesg_ballot(self):
try:
if self.idinternal and self.idinternal.ballot.ballot_issued:
return True
except BallotInfo.DoesNotExist:
pass
return False
# Ballot exists and balloting is ongoing
def has_active_iesg_ballot(self):
return self.idinternal and (self.iesg_main_state in BALLOT_ACTIVE_STATES) and self.has_iesg_ballot() and self.document_status == "Active"
def iesg_ballot_id(self):
if self.has_iesg_ballot():
return self.idinternal.ballot_id
else:
return None
# Don't call unless has_iesg_ballot() returns True
def iesg_ballot_positions(self):
return create_ballot_object(self.idinternal, self.has_active_iesg_ballot())
def group_acronym(self):
if self.draft and self.draft.group_id != 0 and self.draft.group != None and str(self.draft.group) != "none":
return str(self.draft.group)
else:
if self.rfc and self.rfc.group_acronym and (self.rfc.group_acronym != 'none'):
return str(self.rfc.group_acronym)
return None
def view_sort_group(self):
if self.is_rfc():
return 'RFC'
elif self.document_status == "Active":
return 'Active Internet-Draft'
else:
return 'Old Internet-Draft'
def view_sort_key(self):
if self.is_rfc():
x = self.rfc_number
y = self.debug_data()
if self.draft:
z = str(self.draft.status)
return "2%04d" % self.rfc_number
elif self.document_status == "Active":
return "1"+self.draft_name
else:
return "3"+self.draft_name
def friendly_state(self):
if self.is_rfc():
return "RFC - "+self.rfc_maturity_level
elif self.document_status == "Active":
if self.iesg_main_state and self.iesg_main_state != "Dead":
return self.iesg_main_state
else:
return "I-D Exists"
else:
return self.document_status
def draft_replaced_by(self):
try:
if self.draft and self.draft.replaced_by:
return [self.draft.replaced_by.filename]
except InternetDraft.DoesNotExist:
pass
return None
def draft_replaces(self):
if not self.draft:
return None
r = [str(r.filename) for r in self.draft.replaces_set.all()]
if len(r) > 0:
return r
else:
return None
# TODO: return just a text string for now
def rfc_obsoleted_by(self):
if (not self.rfcIndex) or (not self.rfcIndex.obsoleted_by):
return None
else:
return self.rfcIndex.obsoleted_by
def rfc_updated_by(self):
if (not self.rfcIndex) or (not self.rfcIndex.updated_by):
return None
else:
return self.rfcIndex.updated_by
def is_active_draft(self):
return self.document_status == "Active"
def file_types(self):
if self.draft:
return self.draft.file_type.split(",")
else:
# Not really correct, but the database doesn't
# have this data for RFCs yet
return [".txt"]
def abstract(self):
if self.draft:
return self.draft.abstract
else:
return None
def debug_data(self):
s = ""
if self.draft:
s = s + "draft("+self.draft.filename+","+str(self.draft.id_document_tag)+","+str(self.draft.rfc_number)+")"
if self.idinternal:
s = s + ",idinternal()"
if self.rfc:
s = s + ",rfc("+str(self.rfc.rfc_number)+")"
if self.rfcIndex:
s = s + ",rfcIndex("+str(self.rfcIndex.rfc_number)+")"
return s
def to_json(self):
result = {}
for k in ['document_status', 'draft_name', 'draft_revision', 'title', 'rfc_number', 'revision_date', 'tracker_id', 'rfc_maturity_level', 'iesg_main_state', 'iesg_state', 'iesg_sub_state', 'iesg_state_date', 'is_rfc', 'in_iesg_tracker', 'ad_name', 'draft_name_and_revision','rfc_editor_state','has_rfc_errata','last_call_ends','iesg_note','iesg_ballot_approval_text', 'iesg_ballot_writeup', 'stream_id','has_iesg_ballot','has_active_iesg_ballot','iesg_ballot_id','group_acronym','friendly_state','file_types','debug_data','draft_replaced_by','draft_replaces']:
if hasattr(self, k):
v = getattr(self, k)
if callable(v):
v = v()
if v == None:
pass
elif isinstance(v, (types.StringType, types.IntType, types.BooleanType, types.LongType, types.ListType)):
result[k] = v
elif isinstance(v, date):
result[k] = str(v)
else:
result[k] = 'Unknown type '+str(type(v))
return simplejson.dumps(result, indent=2)
# def create_document_object(draft=None, rfc=None, rfcIndex=None, base=None):
# if draft:
# o['fileTypes'] = draft.file_type.split(",")
# if draft.intended_status and str(draft.intended_status) != "None":
# o['intendedStatus'] = str(draft.intended_status)
# else:
# o['intendedStatus'] = None
#
# if idinternal:
# o['stateChangeNoticeTo'] = idinternal.state_change_notice_to
# if idinternal.returning_item > 0:
# o['telechatReturningItem'] = True
# if idinternal.telechat_date:
# o['telechatDate'] = str(idinternal.telechat_date)
# o['onTelechatAgenda'] = (idinternal.agenda > 0)
#
# if rfc:
# o['intendedStatus'] = None
# if rfcIndex:
# o['rfcUpdates'] = rfcIndex.updates
# o['rfcObsoletes'] = rfcIndex.obsoletes
# o['rfcAlso'] = rfcIndex.also
# for k in ['rfcUpdates','rfcUpdatedBy','rfcObsoletes','rfcObsoletedBy','rfcAlso']:
# if o[k]:
# o[k] = o[k].replace(",", ", ")
# o[k] = re.sub("([A-Z])([0-9])", "\\1 \\2", o[k])
# return o
class BallotWrapper:
idinternal = None
ballot = None
ballot_active = False
_positions = None
position_values = ["Discuss", "Yes", "No Objection", "Abstain", "Recuse", "No Record"]
def __init__(self, idinternal, ballot_active):
self.idinternal = idinternal
self.ballot = idinternal.ballot
self.ballot_active = ballot_active
def _init(self):
try:
ads = set()
except NameError:
# for Python 2.3
from sets import Set as set
ads = set()
positions = []
for p in self.ballot.positions.all():
po = create_position_object(self.ballot, p)
#if not self.ballot_active:
# if 'is_old_ad' in po:
# del po['is_old_ad']
ads.add(str(p.ad))
positions.append(po)
if self.ballot_active:
for ad in IESGLogin.active_iesg():
if str(ad) not in ads:
positions.append({"ad_name":str(ad), "position":"No Record"})
self._positions = positions
def position_list(self):
if not self._positions:
self._init()
return self._positions
def get(self, v):
return [p for p in self.position_list() if p['position']==v]
def get_discuss(self):
return self.get("Discuss")
def get_yes(self):
return self.get("Yes")
def get_no_objection(self):
return self.get("No Objection")
def get_abstain(self):
return self.get("Abstain")
def get_recuse(self):
return self.get("Recuse")
def get_no_record(self):
return self.get("No Record")
def get_texts(self):
return [p for p in self.position_list() if ('has_text' in p) and p['has_text']]
def position_to_string(position):
positions = {"yes":"Yes",
"noobj":"No Objection",
"discuss":"Discuss",
"abstain":"Abstain",
"recuse":"Recuse"}
if not position:
return "No Record"
p = None
for k,v in positions.iteritems():
if position.__dict__[k] > 0:
p = v
if not p:
p = "No Record"
return p
def create_position_object(ballot, position):
positions = {"yes":"Yes",
"noobj":"No Objection",
"discuss":"Discuss",
"abstain":"Abstain",
"recuse":"Recuse"}
p = None
for k,v in positions.iteritems():
if position.__dict__[k] > 0:
p = v
if not p:
p = "No Record"
r = {"ad_name":str(position.ad), "position":p}
if not position.ad.is_current_ad():
r['is_old_ad'] = True
was = [v for k,v in positions.iteritems() if position.__dict__[k] < 0]
if len(was) > 0:
r['old_positions'] = was
try:
comment = ballot.comments.get(ad=position.ad)
if comment and comment.text:
r['has_text'] = True
r['comment_text'] = comment.text
r['comment_date'] = comment.date
r['comment_revision'] = str(comment.revision)
except IESGComment.DoesNotExist:
pass
if p == "Discuss":
try:
discuss = ballot.discusses.get(ad=position.ad)
if discuss.text:
r['discuss_text'] = discuss.text
else:
r['discuss_text'] = '(empty)'
r['discuss_revision'] = str(discuss.revision)
r['discuss_date'] = discuss.date
except IESGDiscuss.DoesNotExist:
# this should never happen, but unfortunately it does
# fill in something to keep other parts of the code happy
r['discuss_text'] = "(error: discuss text not found)"
r['discuss_revision'] = "00"
r['discuss_date'] = date(2000, 1,1)
r['has_text'] = True
return r

69
ietf/idrfc/markup_txt.py Normal file
View file

@ -0,0 +1,69 @@
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.utils.html import escape
import string
import re
def markup(content):
# normalize line endings to LF only
content = content.replace("\r\n", "\n")
content = content.replace("\r", "\n")
# at this point, "content" is normal string
# fix most common non-ASCII characters
t1 = string.maketrans("\x91\x92\x93\x94\x95\x96\x97\xc6\xe8\xe9", "\'\'\"\"o--\'ee")
# map everything except printable ASCII, TAB, LF, FF to "?"
t2 = string.maketrans('','')
t3 = "?"*9 + "\t\n?\f" + "?"*19 + t2[32:127] + "?"*129
t4 = t1.translate(t3)
content = content.translate(t4)
# remove leading white space
content = content.lstrip()
# remove runs of blank lines
content = re.sub("\n\n\n+", "\n\n", content)
# expand tabs + escape
content = escape(content.expandtabs())
content = re.sub("\n(.+\[Page \d+\])\n\f\n(.+)\n", """\n<span class="m_ftr">\g<1></span>\n<span class="m_hdr">\g<2></span>\n""", content)
content = re.sub("\n(.+\[Page \d+\])\n\s*$", """\n<span class="m_ftr">\g<1></span>\n""", content)
# TODO: remove remaining FFs (to be valid XHTML)
content = re.sub("\n\n([0-9]+\\.|[A-Z]\\.[0-9]|Appendix|Status of|Abstract|Table of|Full Copyright|Copyright|Intellectual Property|Acknowled|Author|Index)(.*)(?=\n\n)", """\n\n<span class="m_h">\g<1>\g<2></span>""", content)
n = content.find("\n", 5000)
content1 = "<pre>"+content[:n+1]+"</pre>\n"
content2 = "<pre>"+content[n+1:]+"</pre>\n"
return (content1, content2)

View file

@ -68,7 +68,7 @@ def parse(response):
if event == pulldom.START_ELEMENT and node.tagName == "entry":
events.expandNode(node)
node.normalize()
draft_name = getChildText(node, "draft")
draft_name = getChildText(node, "draft").strip()
if re.search("-\d\d\.txt$", draft_name):
draft_name = draft_name[0:-7]
date_received = getChildText(node, "date-received")

View file

@ -0,0 +1 @@
#

View file

@ -0,0 +1,110 @@
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django import template
from ietf.idtracker.models import BallotInfo
from ietf.idrfc.idrfc_wrapper import position_to_string
register = template.Library()
def render_ballot_icon(context, doc):
if not doc.has_active_iesg_ballot():
return ""
ballot = BallotInfo.objects.get(ballot=doc.iesg_ballot_id())
if 'adId' in context:
adId = context['adId']
else:
adId = None
red = 0
green = 0
gray = 0
blank = 0
my = None
for p in ballot.active_positions():
if not p['pos']:
blank = blank + 1
elif (p['pos'].yes > 0) or (p['pos'].noobj > 0):
green = green + 1
elif (p['pos'].discuss > 0):
red = red + 1
else:
gray = gray + 1
if adId and (p['ad'].id == adId):
my = position_to_string(p['pos'])
return render_ballot_icon2(doc.draft_name, doc.tracker_id, red,green,gray,blank,my)+"<!-- adId="+str(adId)+" my="+str(my)+"-->"
def render_ballot_icon2(draft_name, tracker_id, red,green,gray,blank,my):
res = '<span class="ballot_icon_wrapper"><table class="ballot_icon" title="IESG Evaluation Record (click to show more)" onclick="showBallot(\'' + draft_name + '\',' + str(tracker_id) + ')">'
for y in range(3):
res = res + "<tr>"
for x in range(5):
myMark = False
if red > 0:
c = "ballot_icon_red"
red = red - 1
myMark = (my == "Discuss")
elif green > 0:
c = "ballot_icon_green"
green = green - 1
myMark = (my == "Yes") or (my == "No Objection")
elif gray > 0:
c = "ballot_icon_gray"
gray = gray - 1
myMark = (my == "Abstain") or (my == "Recuse")
else:
c = ""
myMark = (y == 2) and (x == 4) and (my == "No Record")
if myMark:
res = res + '<td class="'+c+' ballot_icon_my" />'
my = None
else:
res = res + '<td class="'+c+'" />'
res = res + '</tr>'
res = res + '</table></span>'
return res
class BallotIconNode(template.Node):
def __init__(self, doc_var):
self.doc_var = doc_var
def render(self, context):
doc = template.resolve_variable(self.doc_var, context)
return render_ballot_icon(context, doc)
def do_ballot_icon(parser, token):
try:
tagName, docName = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError, "%r tag requires exactly two arguments" % token.contents.split()[0]
return BallotIconNode(docName)
register.tag('ballot_icon', do_ballot_icon)

View file

@ -0,0 +1,78 @@
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django import template
from django.core.cache import cache
from django.template import RequestContext, Context, loader
from ietf.idtracker.models import InternetDraft, IETFWG, Area
register = template.Library()
area_short_names = {
'ops':'Ops & Mgmt',
'rai':'Real-time Apps & Infra'
}
def get_wgs():
wgs = IETFWG.objects.filter(group_type__type='WG').filter(status__status='Active').select_related().order_by('acronym.acronym')
areas = []
for a in Area.objects.filter(status__status='Active').select_related().order_by('acronym.acronym'):
wglist = []
for w in wgs:
if w.area.area == a:
wglist.append(w)
if len(wglist) > 0:
if a.area_acronym.acronym in area_short_names:
area_name = area_short_names[a.area_acronym.acronym]
else:
area_name = a.area_acronym.name
if area_name.endswith(" Area"):
area_name = area_name[:-5]
areas.append({'areaAcronym':a.area_acronym.acronym, 'areaName':area_name, 'areaObj':a, 'wgs':wglist})
return areas
class WgMenuNode(template.Node):
def __init__(self):
pass
def render(self, context):
x = cache.get('idrfc_wgmenu')
if x:
return x
areas = get_wgs()
x = loader.render_to_string('idrfc/base_wgmenu.html', {'areas':areas})
cache.set('idrfc_wgmenu', x, 30*60)
return x
def do_wg_menu(parser, token):
return WgMenuNode()
register.tag('wg_menu', do_wg_menu)

View file

@ -31,8 +31,15 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.conf.urls.defaults import patterns
from ietf.idrfc import views
from ietf.idrfc import views_doc, views_search, views
urlpatterns = patterns('',
(r'^test.html$', views.test)
(r'^test/$', views.test),
(r'^/?$', views_search.search_main),
(r'^search/$', views_search.search_results),
(r'^(?P<name>[^/]+)/$', views_doc.document_main),
(r'^(?P<name>[^/]+)/_debug.data$', views_doc.document_debug),
(r'^(?P<name>[^/]+)/_comments.data$', views_doc.document_comments),
(r'^(?P<name>[^/]+)/_ballot.data$', views_doc.document_ballot),
(r'^(?P<name>[^/]+)/_versions.data$', views_doc.document_versions)
)

174
ietf/idrfc/views_doc.py Normal file
View file

@ -0,0 +1,174 @@
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import re
from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from ietf.idtracker.models import InternetDraft, IETFWG, Area, IDInternal
from ietf.idrfc.models import RfcIndex, RfcEditorQueue, DraftVersions
from ietf.idrfc.idrfc_wrapper import IdRfcWrapper, BallotWrapper
from ietf.idrfc import markup_txt
from ietf import settings
from django.template import RequestContext
from django.template.defaultfilters import truncatewords_html
from ietf.idtracker.templatetags.ietf_filters import format_textarea, fill
def document_debug(request, name):
r = re.compile("^rfc([0-9]+)$")
m = r.match(name)
if m:
rfc_number = int(m.group(1))
rfci = get_object_or_404(RfcIndex, rfc_number=rfc_number)
doc = IdRfcWrapper(rfcIndex=rfci, findRfc=True)
else:
id = get_object_or_404(InternetDraft, filename=name)
doc = IdRfcWrapper(draft=id, findRfc=True)
return HttpResponse(doc.to_json(), mimetype='text/plain')
def document_main_rfc(request, rfc_number):
rfci = get_object_or_404(RfcIndex, rfc_number=rfc_number)
doc = IdRfcWrapper(rfcIndex=rfci, findRfc=True)
info = {}
content1 = None
content2 = None
f = None
try:
try:
f = open(settings.RFC_PATH+"rfc"+str(rfc_number)+".txt")
content = f.read()
(content1, content2) = markup_txt.markup(content)
except IOError:
content1 = "Error - can't find"+"rfc"+str(rfc_number)+".txt"
content2 = ""
finally:
if f:
f.close()
return render_to_response('idrfc/doc_main_rfc.html',
{'content1':content1, 'content2':content2,
'doc':doc, 'info':info},
context_instance=RequestContext(request));
def document_main(request, name):
r = re.compile("^rfc([0-9]+)$")
m = r.match(name)
if m:
return document_main_rfc(request, int(m.group(1)))
id = get_object_or_404(InternetDraft, filename=name)
doc = IdRfcWrapper(draft=id, findRfc=True)
info = {}
stream_id = doc.stream_id()
if stream_id == 2:
stream = " (IAB document)"
elif stream_id == 3:
stream = " (IRTF document)"
elif stream_id == 4:
stream = " (Independent submission via RFC Editor)"
elif doc.group_acronym():
stream = " ("+doc.group_acronym().upper()+" WG document)"
else:
stream = " (Individual document)"
if id.status.status == "Active":
info['type'] = "Active Internet-Draft"+stream
else:
info['type'] = "Old Internet-Draft"+stream
info['has_pdf'] = (".pdf" in doc.file_types())
content1 = None
content2 = None
if doc.is_active_draft():
f = None
try:
try:
f = open(settings.INTERNET_DRAFT_PATH+name+"-"+id.revision+".txt")
content = f.read()
(content1, content2) = markup_txt.markup(content)
except IOError:
content1 = "Error - can't find "+name+"-"+id.revision+".txt"
content2 = ""
finally:
if f:
f.close()
return render_to_response('idrfc/doc_main_id.html',
{'content1':content1, 'content2':content2,
'doc':doc, 'info':info},
context_instance=RequestContext(request));
def document_comments(request, name):
id = get_object_or_404(IDInternal, draft__filename=name)
results = []
commentNumber = 0
for comment in id.public_comments():
info = {}
r = re.compile(r'^(.*) by (?:<b>)?([A-Z]\w+ [A-Z]\w+)(?:</b>)?$')
m = r.match(comment.comment_text)
if m:
info['text'] = m.group(1)
info['by'] = m.group(2)
else:
info['text'] = comment.comment_text
info['by'] = comment.get_username()
info['textSnippet'] = truncatewords_html(format_textarea(fill(info['text'], 80)), 25)
info['snipped'] = info['textSnippet'][-3:] == "..."
info['commentNumber'] = commentNumber
commentNumber = commentNumber + 1
results.append({'comment':comment, 'info':info})
return render_to_response('idrfc/doc_comments.html', {'comments':results}, context_instance=RequestContext(request))
def document_ballot(request, name):
id = get_object_or_404(IDInternal, draft__filename=name)
try:
if not id.ballot.ballot_issued:
raise Http404
except BallotInfo.DoesNotExist:
raise Http404
doc = IdRfcWrapper(draft=id)
ballot = BallotWrapper(id, doc.has_active_iesg_ballot())
return render_to_response('idrfc/doc_ballot.html', {'ballot':ballot, 'doc':doc}, context_instance=RequestContext(request))
def document_versions(request, name):
draft = get_object_or_404(InternetDraft, filename=name)
ov = []
ov.append({"draft_name":draft.filename, "revision":draft.revision, "revision_date":draft.revision_date})
for d in [draft]+list(draft.replaces_set.all()):
for v in DraftVersions.objects.filter(filename=d.filename).order_by('-revision'):
if (d.filename == draft.filename) and (draft.revision == v.revision):
continue
ov.append({"draft_name":d.filename, "revision":v.revision, "revision_date":v.revision_date})
return render_to_response('idrfc/doc_versions.html', {'versions':ov}, context_instance=RequestContext(request))

217
ietf/idrfc/views_search.py Normal file
View file

@ -0,0 +1,217 @@
# Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import re
from django import newforms as forms
from django.shortcuts import render_to_response
from django.db.models import Q
from django.template import RequestContext
from ietf.idtracker.models import IDState, IDStatus, IETFWG, IESGLogin, IDSubState, Area, InternetDraft, Rfc, IDInternal
from ietf.idrfc.models import RfcIndex
from ietf.idrfc.idrfc_wrapper import IdRfcWrapper
from ietf.idindex.models import orgs
from ietf.utils import normalize_draftname
class SearchForm(forms.Form):
name = forms.CharField(required=False)
author = forms.CharField(required=False)
rfcs = forms.BooleanField(required=False,initial=True)
activeDrafts = forms.BooleanField(required=False,initial=True)
oldDrafts = forms.BooleanField(required=False,initial=False)
group = forms.CharField(required=False)
area = forms.ModelChoiceField(Area.objects.filter(status=Area.ACTIVE), empty_label="any area", required=False)
ad = forms.ChoiceField(choices=(), required=False)
state = forms.ModelChoiceField(IDState.objects.all(), empty_label="any state", required=False)
subState = forms.ChoiceField(choices=(), required=False)
def clean_name(self):
value = self.clean_data.get('name','')
return normalize_draftname(value)
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
self.fields['ad'].choices = [('', 'any AD')] + [(ad.id, "%s %s" % (ad.first_name, ad.last_name)) for ad in IESGLogin.objects.filter(user_level=1).order_by('last_name')] + [('-99', '------------------')] + [(ad.id, "%s %s" % (ad.first_name, ad.last_name)) for ad in IESGLogin.objects.filter(user_level=2).order_by('last_name')]
self.fields['subState'].choices = [('', 'any substate'), ('0', 'no substate')] + [(state.sub_state_id, state.sub_state) for state in IDSubState.objects.all()]
def search_query(query):
drafts = query['activeDrafts'] or query['oldDrafts']
if (not drafts) and (not query['rfcs']):
return ([], {})
# Start by search InternetDrafts
idresults = []
rfcresults = []
MAX = 500
maxReached = False
prefix = ""
q_objs = []
if query['ad'] or query['state'] or query['subState']:
prefix = "draft__"
if query['ad']:
q_objs.append(Q(job_owner=query['ad']))
if query['state']:
q_objs.append(Q(cur_state=query['state']))
if query['subState']:
q_objs.append(Q(cur_sub_state=query['subState']))
if query['name']:
q_objs.append(Q(**{prefix+"filename__icontains":query['name']})|Q(**{prefix+"title__icontains":query['name']}))
if query['author']:
q_objs.append(Q(**{prefix+"authors__person__last_name__icontains":query['author']}))
if query['group']:
q_objs.append(Q(**{prefix+"group__acronym":query['group']}))
if query['area']:
q_objs.append(Q(**{prefix+"group__ietfwg__areagroup__area":query['area']}))
if (not query['rfcs']) and query['activeDrafts'] and (not query['oldDrafts']):
q_objs.append(Q(**{prefix+"status":1}))
elif query['rfcs'] and query['activeDrafts'] and (not query['oldDrafts']):
q_objs.append(Q(**{prefix+"status":1})|Q(**{prefix+"status":3}))
elif query['rfcs'] and (not drafts):
q_objs.append(Q(**{prefix+"status":3}))
if prefix:
q_objs.append(Q(rfc_flag=0))
matches = IDInternal.objects.filter(*q_objs)
else:
matches = InternetDraft.objects.filter(*q_objs)
if not query['activeDrafts']:
matches = matches.exclude(Q(**{prefix+"status":1}))
if not query['rfcs']:
matches = matches.exclude(Q(**{prefix+"status":3}))
if prefix:
matches = [id.draft for id in matches[:MAX]]
else:
matches = matches[:MAX]
if len(matches) == MAX:
maxReached = True
for id in matches:
if id.status.status == 'RFC':
rfcresults.append([id.rfc_number, id, None, None])
else:
idresults.append([id])
# Next, search RFCs
if query['rfcs'] and not (query['ad'] or query['state'] or query['subState'] or query['area']):
q_objs = []
searchRfcIndex = True
if query['name']:
r = re.compile("^\s*(?:RFC)?\s*(\d+)\s*$", re.IGNORECASE)
m = r.match(query['name'])
if m:
q_objs.append(Q(rfc_number__contains=m.group(1))|Q(title__icontains=query['name']))
else:
q_objs.append(Q(title__icontains=query['name']))
# We prefer searching RfcIndex, but it doesn't have group info
if query['group']:
searchRfcIndex = False
q_objs.append(Q(group_acronym=query['group']))
if query['area']:
# TODO: not implemented yet
pass
if query['author'] and searchRfcIndex:
q_objs.append(Q(authors__icontains=query['author']))
elif query['author']:
q_objs.append(Q(authors__person__last_name__icontains=query['author']))
if searchRfcIndex:
matches = RfcIndex.objects.filter(*q_objs)[:MAX]
else:
matches = Rfc.objects.filter(*q_objs)[:MAX]
if len(matches) == MAX:
maxReached = True
for rfc in matches:
found = False
for r2 in rfcresults:
if r2[0] == rfc.rfc_number:
if searchRfcIndex:
r2[3] = rfc
else:
r2[2] = rfc
found = True
if not found:
if searchRfcIndex:
rfcresults.append([rfc.rfc_number, None, None, rfc])
else:
rfcresults.append([rfc.rfc_number, None, rfc, None])
# Find missing InternetDraft objects
for r in rfcresults:
if not r[1]:
ids = InternetDraft.objects.filter(rfc_number=r[0])
if len(ids) >= 1:
r[1] = ids[0]
if not r[1] and r[3] and r[3].draft:
ids = InternetDraft.objects.filter(filename=r[3].draft)
if len(ids) >= 1:
r[1] = ids[0]
# Finally, find missing RFC objects
for r in rfcresults:
if not r[2]:
rfcs = Rfc.objects.filter(rfc_number=r[0])
if len(rfcs) >= 1:
r[2] = rfcs[0]
if not r[3]:
rfcs = RfcIndex.objects.filter(rfc_number=r[0])
if len(rfcs) >= 1:
r[3] = rfcs[0]
results = []
for res in idresults+rfcresults:
if len(res)==1:
doc = IdRfcWrapper(draft=res[0])
else:
doc = IdRfcWrapper(draft=res[1], rfc=res[2], rfcIndex=res[3])
results.append(doc)
results.sort(key=lambda obj: obj.view_sort_key())
meta = {}
if maxReached:
meta['max'] = MAX
return (results,meta)
def search_results(request):
form = SearchForm(request.REQUEST)
if not form.is_valid():
return HttpResponse("form not valid?", mimetype="text/plain")
x = form.clean_data
(results,meta) = search_query(form.clean_data)
if 'ajax' in request.REQUEST and request.REQUEST['ajax']:
return render_to_response('idrfc/search_results.html', {'docs':results, 'meta':meta}, context_instance=RequestContext(request))
else:
return render_to_response('idrfc/search_main.html', {'form':form, 'docs':results,'meta':meta}, context_instance=RequestContext(request))
def search_main(request):
form = SearchForm()
return render_to_response('idrfc/search_main.html', {'form':form}, context_instance=RequestContext(request))

View file

@ -226,6 +226,14 @@ def inpast(date):
return date < datetime.datetime.now()
return True
@register.filter(name='timesince_days')
def timesince_days(date):
"""Returns the number of days since 'date' (relative to now)"""
if date.__class__ is not datetime.datetime:
date = datetime.datetime(date.year, date.month, date.day)
delta = datetime.datetime.now() - date
return delta.days
@register.filter(name='truncatemore')
def truncatemore(text, arg):
"""Truncate the text if longer than 'words', and if truncated,
@ -278,6 +286,11 @@ def wrap_long_lines(text):
filled += [ line.rstrip() ]
return "\n".join(filled)
# based on http://www.djangosnippets.org/snippets/847/ by 'whiteinge'
@register.filter
def in_group(user, groups):
return user and user.is_authenticated() and bool(user.groups.filter(name__in=groups.split(',')).values('name'))
def _test():
import doctest
doctest.testmod()

View file

@ -66,6 +66,7 @@ urlpatterns += patterns('django.views.generic.list_detail',
urlpatterns += patterns('',
(r'^agenda/$', views.telechat_agenda),
(r'^agenda/documents.txt$', views.telechat_agenda_documents),
(r'^discusses/$', views.discusses),
(r'^ann/ind/$',views.inddocs),
(r'^ann/(?P<cat>[^/]+)/$',views.wgdocs),
)

View file

@ -34,12 +34,15 @@
# Create your views here.
#from django.views.generic.date_based import archive_index
from ietf.idtracker.models import IDInternal, InternetDraft,AreaGroup,IETFWG
from ietf.idtracker.models import IDInternal, InternetDraft,AreaGroup,IETFWG, Position
from django.views.generic.list_detail import object_list
from django.views.generic.simple import direct_to_template
from django.http import Http404, HttpResponse
from django.template import RequestContext, Context, loader
from django.shortcuts import render_to_response
from ietf.iesg.models import TelechatDates, TelechatAgendaItem, WGAction
from ietf.idrfc.idrfc_wrapper import IdRfcWrapper, BallotWrapper
import datetime
def date_threshold():
@ -169,3 +172,31 @@ def telechat_agenda_documents(request):
t = loader.get_template('iesg/agenda_documents.txt')
c = Context({'docs':docs})
return HttpResponse(t.render(c), mimetype='text/plain')
def discusses(request):
positions = Position.objects.filter(discuss=1)
res = []
try:
ids = set()
except NameError:
# for Python 2.3
from sets import Set as set
ids = set()
for p in positions:
try:
draft = p.ballot.drafts.filter(primary_flag=1)
if len(draft) > 0 and draft[0].draft.id_document_tag not in ids:
ids.add(draft[0].draft.id_document_tag)
doc = IdRfcWrapper(draft=draft[0])
if doc.has_active_iesg_ballot():
res.append({'doc':doc})
except IDInternal.DoesNotExist:
pass
# find discussing ads
for row in res:
ballot = BallotWrapper(row['doc'].idinternal, True)
row['discuss_positions'] = ballot.get_discuss()
return direct_to_template(request, 'iesg/discusses.html', {'docs':res})

View file

@ -6,7 +6,7 @@ try:
import settings # Assumed to be in the same directory.
except ImportError:
import sys
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
sys.stderr.write("Error: Cannot find 'settings.py' or 'settings_local.py'.\nUsually these are in the directory containing %r.\n" % __file__)
sys.exit(1)
if __name__ == "__main__":

View file

@ -166,6 +166,14 @@ IPR_DOCUMENT_PATH = '/a/www/ietf-ftp/ietf/IPR'
INTERNET_DRAFT_PATH = '/a/www/ietf-ftp/internet-drafts/'
RFC_PATH = '/a/www/ietf-ftp/rfc/'
# Override this in settings_local.py if needed
if SERVER_MODE == 'production':
CACHE_BACKEND= 'file://'+'/a/www/ietf-datatracker/cache/'
else:
# Default to no caching in development/test, so that every developer
# doesn't have to set CACHE_BACKEND in settings_local
CACHE_BACKEND = 'dummy:///'
IPR_EMAIL_TO = ['ietf-ipr@ietf.org', ]
# The number of days for which a password-request URL is valid

View file

@ -0,0 +1,111 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>{% block title %}No title{% endblock %}</title>
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/fonts/fonts-min.css"></link>
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/assets/skins/sam/skin.css"></link>
<link rel="stylesheet" type="text/css" href="/css/base2.css"></link>
<style type="text/css">
{% block morecss %}{% endblock %}
</style>
{% block pagehead %}{% endblock %}
<script type="text/javascript">
IETF_DOCS = {};
</script>
</head>
<body class="yui-skin-sam" {% block bodyAttrs %}{%endblock%}>
<div style="background-color:#313163;color:white;font-size:150%;">
<img src="/images/ietflogo-blue.png" width="60" style="vertical-align:middle;padding-left:8px;" alt=""/><span style="color:white; padding-left:15px;font-weight:bold;letter-spacing:0.1em;">datatracker.ietf.org</span>
</div>
<div id="ietf-login" style="position:absolute;top:8px;right:10px;">
{% if user.is_authenticated %}
{{ user }}&nbsp;|&nbsp;<a id="ietf-login-signout" href="{% url django.contrib.auth.views.logout %}">Sign out</a>
{% else %}
<a id="ietf-login-signin" href="{% url django.contrib.auth.views.login %}">Sign in</a>
{% endif %}
</div>
<table style="margin-left:8px;margin-top:8px;" width="98%;">
<tr valign="top">
<td style="width:160px;padding-right:8px;">
<div class="leftmenu" style="margin-top:4px;">
{% include "idrfc/base_leftmenu.html" %}
</div>
</td>
<td>
<div style="padding:0 8px 0 8px;">
{% block content %}
{% endblock %}
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/container/container-min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/menu/menu-min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/element/element-min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/button/button-min.js"></script>
<script type="text/javascript">
//<![CDATA[
YAHOO.util.Event.onContentReady("wgs", function () {
var oMenu = new YAHOO.widget.Menu("wgs", { position: "static", hidedelay: 750, lazyload: true });
oMenu.render();
});
YAHOO.util.Event.onContentReady("search_submit_button", function () {
var oButton = new YAHOO.widget.Button("search_submit_button", {});
});
</script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/connection/connection-min.js"></script>
<script type="text/javascript" src="/js/base.js"></script>
{% block scripts %}
{% endblock %}
{% block content_end %}
{% endblock %}
</div>
<div id="db-extras"></div>
</td></tr></table>
{% include "debug.html" %}
<!-- v{{version_num}}, {{ revision_date }} -->
</body>
</html>

View file

@ -0,0 +1,83 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% load wg_menu %}
{% load ietf_filters %}
<ul>
<li class="sect first">Working Groups by Area</li>
<li><div id="wgs" class="yuimenu"><div class="bd">
<ul class="first-of-type" style="padding:0;">
<!-- begin wg_menu -->
{% wg_menu %}
<!-- end wg_menu -->
</ul>
</div></div></li>
<li><a href="http://tools.ietf.org/wg/concluded">Concluded WGs</a></li>
<li class="sect">Internet Drafts&nbsp;&amp;&nbsp;RFCs</li>
<li><a href="/doc/">Search</a></li>
<li><form action="/doc/search/" method="get"><input type="text" style="margin-left:10px; width:100px; border:1px solid #89d;" name="name"/>
<input type="hidden" name="activeDrafts" value="on"/><input type="hidden" name="rfcs" value="on"/></form></li>
<li><a href="https://datatracker.ietf.org/idst/upload.cgi">Submit a draft</a></li>
{% if user|in_group:"IESG" %}
<li class="sect">IESG only</li>
<li><a href="/iesg/discusses/">Discusses</a></li>
</li>
{% endif %}
<li class="sect">Meetings</li>
<li><a href="/meeting/agenda/">Agenda</a></li>
<li><a href="/meeting/materials/">Materials</a></li>
<li><a href="http://tools.ietf.org/rooms">Room maps</a></li>
<li><a href="http://www.ietf.org/proceedings_directory.html">Past Proceedings</a></li>
<li><a href="http://www.ietf.org/meetings/0mtg-sites.txt">Upcoming Meetings</a></li>
<li class="sect">Other documents</li>
<li><a href="/ipr/">IPR Disclosures</a></li>
<li><a href="/liaison">Liaison Statements</a></li>
<li><a href="/iesg/telechat/">IESG Minutes</a></li>
<li class="sect">Related sites</li>
<li><a href="http://www.ietf.org/" >Main IETF site</a></li>
<li><a href="http://tools.ietf.org" > IETF tools site</a></li>
<li><a href="http://www.ietf.org/iesg.html" >IESG</a></li>
<li><a href="http://www.iab.org">IAB</a></li>
<li><a href="http://www.rfc-editor.org/">RFC Editor</a></li>
<li><a href="http://www.irtf.org/">IRTF</a></li>
<li><a href="http://iaoc.ietf.org">IASA</a></li>
<li><a href="http://www.iana.org/">IANA</a></li>
</ul>

View file

@ -0,0 +1,38 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% for area in areas %}
<li class="yuimenuitem"><a class="yuimenuitemlabel">{{area.areaName|escape }}</a><div id="wgs-{{area.areaAcronym}}" class="yuimenu"><div class="bd"><ul>{% for wg in area.wgs %}
<li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://tools.ietf.org/wg/{{wg.group_acronym}}/">{{wg.group_acronym}} &nbsp; &mdash; &nbsp; {{wg.group_acronym.name|escape}}</a></li>{% endfor %}
</ul></div></div></li>
{% endfor %}

View file

@ -0,0 +1,126 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% load ietf_filters %}
<table class="ballotTable">
<tr valign="top">
<td class="left">
<p><span style="border:1px solid black;position:relative;top:2px;background:#c00000; display: block; float:left;width: 10px; height:10px;font-size:1px;margin-right:4px;"></span><b>Discuss</b><br/>
{% if ballot.get_discuss %}
{% for p in ballot.get_discuss %}
{{p.ad_name}} {% if p.has_text %}*{% endif %}<br/>
{% endfor %}
{% else %}
<i>none</i>
{% endif %}
</p>
<p><span style="border:1px solid black;position:relative;top:2px;background:#80ff80; display: block; float:left;width: 10px; height:10px;font-size:1px;margin-right:4px;"></span><b>Yes</b><br/>
{% if ballot.get_yes %}
{% for p in ballot.get_yes %}
{% if p.is_old_ad %}[{%endif%}{{p.ad_name}}{% if p.is_old_ad %}]{%endif%} {% if p.has_text %}*{% endif %} <br/>
{% endfor %}
{% else %}
<i>none</i>
{% endif %}
</p>
<p><span style="border:1px solid black;position:relative;top:2px;background:#80ff80; display: block; float:left;width: 10px; height:10px;font-size:1px;margin-right:4px;"></span><b>No Objection</b><br/>
{% if ballot.get_no_objection %}
{% for p in ballot.get_no_objection %}
{% if p.is_old_ad %}[{%endif%}{{p.ad_name}}{% if p.is_old_ad %}]{%endif%} {% if p.has_text %}*{% endif %} <br/>
{% endfor %}
{% else %}
<i>none</i>
{% endif %}
</p>
<p><span style="border:1px solid black;position:relative;top:2px;background:#c0c0c0; display: block; float:left;width: 10px; height:10px;font-size:1px;margin-right:4px;"></span><b>Abstain</b><br/>
{% if ballot.get_abstain %}
{% for p in ballot.get_abstain %}
{% if p.is_old_ad %}[{%endif%}{{p.ad_name}}{% if p.is_old_ad %}]{%endif%} {% if p.has_text %}*{% endif %} <br/>
{% endfor %}
{% else %}
<i>none</i>
{% endif %}
</p>
<p><span style="border:1px solid black;position:relative;top:2px;background:#c0c0c0; display: block; float:left;width: 10px; height:10px;font-size:1px;margin-right:4px;"></span><b>Recuse</b><br/>
{% if ballot.get_recuse %}
{% for p in ballot.get_recuse %}
{% if p.is_old_ad %}[{%endif%}{{p.ad_name}}{% if p.is_old_ad %}]{%endif%} {% if p.has_text %}*{% endif %} <br/>
{% endfor %}
{% else %}
<i>none</i>
{% endif %}
</p>
<p><span style="border:1px solid black;position:relative;top:2px;background:white; display: block; float:left;width: 10px; height:10px;font-size:1px;margin-right:4px;"></span><b>No Record</b><br/>
{% if ballot.get_no_record %}
{% for p in ballot.get_no_record %}
{% if p.is_old_ad %}[{%endif%}{{p.ad_name}}{% if p.is_old_ad %}]{%endif%} {% if p.has_text %}*{% endif %} <br/>
{% endfor %}
{% else %}
<i>none</i>
{% endif %}
</p>
</td>
<td class="right">
<h2 style="margin-top:12px;">Discusses and other comments</h2>
{% for pos in ballot.get_texts %}
<h2 class="ballot_ad">{{pos.ad_name|escape}}</h2>
{% ifequal pos.position "Discuss" %}
<p><b>Discuss ({{pos.discuss_date}})</b></p>
<pre>{{pos.discuss_text|fill:"80"|escape }}</pre>
{% endifequal %}
{% if pos.comment_text %}
<p><b>Comment ({{pos.comment_date}})</b></p>
<pre>{{pos.comment_text|fill:"80"|escape }}</pre>
{% endif %}
{% endfor %}
</td>
</tr>
</table>

View file

@ -0,0 +1,62 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% load ietf_filters %}
<h2 style="margin-top:0;">Document history</h2>
<table class="ietfTable">
<tr><th class="comment_date">Date</th><th class="comment_version">Version</th><th class="comment_by">By</th><th class="comment_text">Text</th></tr>
{% for c in comments %}
<tr class="{% cycle oddrow,evenrow %}">
<td class="comment_date">{{ c.comment.date }}</td>
<td class="comment_version">{{ c.comment.version }}</td>
<td class="comment_by">{{ c.info.by|escape }}</td>
<td class="comment_text">{% if c.comment.ballot %}
[Ballot {{ c.comment.get_ballot_display }}]<br />
{% endif %}
{% if c.info.snipped %}
<div class="commentSnippet" id="commentS{{c.info.commentNumber}}">{{ c.info.textSnippet }}</div>
<span class="commentToggle" onClick="toggleComment({{c.info.commentNumber}})" id="commentT{{c.info.commentNumber}}">[show all]</span>
<div class="commentFull" id="commentF{{c.info.commentNumber}}" style="display:none;">
{{c.info.text|fill:"80"|format_textarea}}
</div>
{% else %}
{{ c.info.text|fill:"80"|format_textarea}}
{% endif %}
</td>
{% endfor %}
</table>

View file

@ -0,0 +1,277 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% extends "idrfc/base.html" %}
{% block title %}{{ doc.draft_name_and_revision }}{% endblock %}
{% block morecss %}
#metabox { width: 99%; border:1px solid #cccccc; background:#edf5ff;margin-top:8px; padding:4px; margin-bottom:1em; }
#metatable { border: 0; border-spacing: 0; }
#metatable tr { vertical-align:top ;}
#metatools { padding:4px; border: 1px solid #cccccc; }
#commentLog { margin-bottom: 1.5ex; }
.commentToggle { text-decoration: underline; color: blue; }
.comment_date { white-space: nowrap; }
div.diffTool { border: 1px solid #cccccc; background: #edf5ff; padding: 8px 4px; margin: 8px 0;}
.diffTool label { float:left; width:100px; }
table.ietfTable { border-collapse:collapse; border:1px solid #7f7f7f; }
.ietfTable tr.evenrow { background-color: #EDF5FF; }
.ietfTable tr.oddrow {background-color: white; }
.ietfTable td { border-right: 1px solid #cbcbcb; padding:3px 6px; }
.ietfTable th { color:white; background: #2647A0; text-align:left; padding:3px 6px; border-right: 1px solid #7f7f7f; }
.markup_draft pre {line-height: 1.2em; margin: 0; }
.m_hdr, .m_ftr { color: #808080; }
.m_ftr { border-bottom: 1px solid #a0a0a0; }
.m_h { font-family: arial; font-weight:bold;}
{% endblock %}
{% block pagehead %}
<script type="text/javascript">
//<![CDATA[
function toggleComment(n) {
var el = document.getElementById("commentF"+n);
var el2 = document.getElementById("commentS"+n);
var el3 = document.getElementById("commentT"+n);
if (el.style.display == 'none') {
el.style.display = 'block';
el2.style.display = 'none';
el3.innerHTML = ""; //[hide]";
} else {
el.style.display = 'none';
el2.style.display= 'block';
el3.innerHTML = "[show all]";
}
}
//]]>
</script>
{%endblock %}
{% block content %}
<h1 style="margin-top:0;">{{ doc.title|escape }}<br/>{{ doc.draft_name_and_revision }}</h1>
<div id="mytabs" class="yui-navset">
<ul class="yui-nav">
<li class="selected"><a href="#tab1"><em>Document</em></a></li>
<li><a href="#tab2"><em>Versions</em></a></li>
<li {% if not doc.has_iesg_ballot %} class="disabled" {%endif%}><a href="#tab3"><em>IESG Evaluation Record</em></a></li>
<li {% if not doc.has_iesg_ballot %} class="disabled" {%endif%}><a href="#tab4"><em>IESG Writeups</em></a></li>
<li {% if not doc.in_iesg_tracker %} class="disabled" {%endif%}><a href="#tab5"><em>IESG Comment Log</em></a></li>
</ul>
<div class="yui-content">
<div id="tab1">
<div id="metabox">
<table id="metatable">
<tr><td style="width:18ex;">Document type:</td><td>{{ info.type|escape }}</td></tr>
<tr><td>State:</td><td>
{{ doc.friendly_state|escape }}
{% if doc.last_call_ends %} (ends {{doc.last_call_ends}}){%endif%}
{% if doc.draft_replaced_by %} by {% for rep in doc.draft_replaced_by %}<a href="/doc/{{rep}}/">{{rep}}</a> {% endfor %} {%endif %}
{% if doc.rfc_editor_state %}<br />RFC Editor State: {{ doc.rfc_editor_state|escape }} {% endif %}
</td></tr>
<tr><td>Last updated:</td><td> {{ doc.revision_date|default:"(data missing)" }}</td></tr>
<tr><td>Responsible AD:</td><td>{{ doc.ad_name|default:"-"|escape }}</td></tr>
{% if doc.iesg_note %}<tr><td>IESG Note:</td><td>{{ doc.iesg_note|escape }}</td></tr>{% endif %}
{% if doc.is_active_draft %}
<tr><td>Other versions:</td><td>
<a href="http://www.ietf.org/internet-drafts/{{doc.draft_name_and_revision}}.txt" target="_blank">plain text</a>
{% for ext in doc.file_types %}
{% ifnotequal ext ".txt" %}
<a href="http://www.ietf.org/internet-drafts/{{doc.draft_name_and_revision}}{{ext}}" target="_blank">{{ext|cut:"."}}</a>
{% endifnotequal %}
{% endfor %}
{% if not info.has_pdf %}
<a href="http://tools.ietf.org/pdf/{{doc.draft_name_and_revision}}.pdf" target="_blank">pdf</a>
{% endif %}
</td></tr>
{% else %}
{% endif %}
{% comment %}
{% if doc.replaces %}<br />Replaces {% for rep in doc.replaces %}<a href="/doc/{{rep}}/">{{rep}}</a> {% endfor %}{% endif %}
{% endcomment %}
</table>
<div style="padding-top:6px;padding-bottom:6px;">
<span class="mybutton"><a href="mailto:{{doc.draft_name}}@tools.ietf.org?subject={{doc.draft_name}}%20" title="Send email to the document authors">Email authors</a></span> &nbsp;
<span class="mybutton"><a href="http://www.fenron.com/~fenner/ietf/deps/index.cgi?dep={{doc.draft_name}}" rel="nofollow" target="_blank">Dependencies to this draft</a></span> &nbsp;
<span class="mybutton"><a href="https://datatracker.ietf.org/ipr/search/?option=document_search&amp;id_document_tag={{doc.tracker_id}}" rel="nofollow" target="_blank">IPR Disclosures</a></span> &nbsp;
<span class="mybutton"><a href="http://tools.ietf.org/idnits?url=http://tools.ietf.org/id/{{doc.draft_name_and_revision}}.txt" rel="nofollow" target="_blank">Check nits</a></span> &nbsp;
{% if doc.in_iesg_tracker %}
<span class="mybutton"><a href="https://datatracker.ietf.org/cgi-bin/idtracker.cgi?command=view_id&amp;dTag={{doc.tracker_id}}" rel="nofollow" target="_blank">Edit state (IESG Tracker)</a></span>
{% else %}
<span class="mybutton"><a href="https://datatracker.ietf.org/cgi-bin/idtracker.cgi?command=add_id_confirm&amp;dTag={{doc.tracker_id}}&amp;rfc_flag=0&amp;ballot_id=0" rel="nofollow" target="_blank">Add to IESG Tracker</a></span>
{% endif %}
</div> <!-- tools div -->
</div>
</div> <!-- tab1 -->
<div id="tab2">
<div id="doc_versions" style="display:none;">
</div>
</div>
<div id="tab3">
<div id="doc_ballot" style="display:none;">
{% if doc.has_iesg_ballot %}
<div style="position:absolute;right:0px;">
<span id="doc_ballot_button" class="yui-button yui-link-button"><span class="first-child">
<a href="https://datatracker.ietf.org/cgi-bin/idtracker.cgi?command=open_ballot&amp;id_document_tag={{doc.tracker_id}}">Edit position</a>
</span></span>
</div>
{% endif %}
<div id="doc_ballot_content"></div>
</div>
</div>
<div id="tab4">
<div id="doc_writeup" style="display:none;">
{% if doc.has_iesg_ballot %}
<div style="position:absolute;right:0px;">
<span id="doc_writeup_edit_button" class="yui-button yui-link-button"><span class="first-child">
<a href="https://datatracker.ietf.org/cgi-bin/idtracker.cgi?command=ballot_writeup&amp;filename={{doc.draft_filename}}&amp;ballot_id={{doc.iesg_ballot_id}}">Edit writeups</a>
</span></span></div>
---- following is a DRAFT of message to be sent AFTER approval ---
<pre>
{{ doc.iesg_ballot_approval_text|escape|urlize }}
</pre>
<pre>
{{ doc.iesg_ballot_writeup|escape|urlize }}
</pre>
{% endif %}
</div>
</div>
<div id="tab5">
<div id="doc_comments" style="display:none;">
</div>
</div>
</div> <!-- yui-content -->
</div> <!-- mytabs -->
<div id="rfcText1">
{% if doc.is_active_draft %}
<div class="markup_draft">
{{ content1 }}
</div>
{% else %}
<p>This Internet-Draft is no longer active. Unofficial copies of old Internet-Drafts can be found here:<br/>
<a href="http://tools.ietf.org/id/{{doc.draft_name}}">http://tools.ietf.org/id/{{doc.draft_name}}</a>.</p>
<p style="max-width: 400px;"><b>Abstract:</b><br/> {{ doc.abstract|escape }}</p>
<p><b>Authors:</b><br/>
{% for author in doc.draft.authors.all %}
{% if author.email %}
<a href="mailto:{{ author.email }}">{{ author.person }} &lt;{{author.email}}&gt;</a>
{% else %}
{% if author.person %}
{{ author.person }}
{% else %}
Missing author info #{{ author.person_id }}
{% endif %}
{% endif %}<br />
{% endfor %}</p>
<p>(Note: The e-mail addresses provided for the authors of this Internet-Draft may no longer be valid)</p>
{% endif %}
</div> <!-- rfcText1 -->
{% endblock %}
{% block scripts %}
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/tabview/tabview-min.js"></script>
<script type="text/javascript">
//<![CDATA[
function loadX(element, url) {
var el = document.getElementById(element);
el.innerHTML = "Loading...";
YAHOO.util.Connect.asyncRequest('GET',
url,
{ success: function(o) { document.getElementById(element).innerHTML = o.responseText; },
failure: function(o) { document.getElementById(element).innerHTML = "Error: "+o.status+" "+o.statusText; },
argument: null
}, null);
}
var tabView = new YAHOO.widget.TabView('mytabs');
tabView.subscribe('activeIndexChange', function(e) {
if (e.newValue == 0) {
document.getElementById('rfcText1').style.display = 'block';
document.getElementById('rfcText2').style.display = 'block';
} else {
document.getElementById('rfcText1').style.display = 'none';
document.getElementById('rfcText2').style.display = 'none';
} });
document.getElementById('doc_versions').style.display = 'block';
loadX("doc_versions", '/doc/{{doc.draft_name}}/_versions.data');
{% if doc.has_iesg_ballot %}
document.getElementById('doc_ballot').style.display = 'block';
loadX("doc_ballot_content", '/doc/{{doc.draft_name}}/_ballot.data');
document.getElementById('doc_writeup').style.display = 'block';
{% endif %}
{% if doc.in_iesg_tracker %}
document.getElementById('doc_comments').style.display = 'block';
loadX("doc_comments", '/doc/{{doc.draft_name}}/_comments.data');
{% endif %}
//]]>
</script>
{% endblock %}
{% block content_end %}
<div id="rfcText2">
{% if doc.is_active_draft %}
<div class="markup_draft">
{{ content2 }}
</div>
{% endif %}
</div>
{% endblock %}

View file

@ -0,0 +1,167 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% extends "idrfc/base.html" %}
{% block title %}RFC {{ doc.rfc_number }}{% endblock %}
{% block morecss %}
#metabox { width: 99%; border:1px solid #cccccc; background:#edf5ff;margin-top:8px; padding:4px; margin-bottom:1em; }
#metatable { border: 0; border-spacing: 0; }
#metatable tr { vertical-align:top ;}
#metatools { padding:4px; border: 1px solid #cccccc; }
#commentLog { margin-bottom: 1.5ex; }
.commentToggle { text-decoration: underline; color: blue; }
.comment_date { white-space: nowrap; }
div.diffTool { border: 1px solid #cccccc; background: #edf5ff; padding: 8px 4px; margin: 8px 0;}
.diffTool label { float:left; width:100px; }
table.ietfTable { border-collapse:collapse; border:1px solid #7f7f7f; }
.ietfTable tr.evenrow { background-color: #EDF5FF; }
.ietfTable tr.oddrow {background-color: white; }
.ietfTable td { border-right: 1px solid #cbcbcb; padding:3px 6px; }
.ietfTable th { color:white; background: #2647A0; text-align:left; padding:3px 6px; border-right: 1px solid #7f7f7f; }
.markup_draft pre {line-height: 1.2em; margin: 0; }
.m_hdr, .m_ftr { color: #808080; }
.m_ftr { border-bottom: 1px solid #a0a0a0; }
.m_h { font-family: arial; font-weight:bold;}
{% endblock %}
{% block pagehead %}
<script type="text/javascript">
//<![CDATA[
function toggleComment(n) {
var el = document.getElementById("commentF"+n);
var el2 = document.getElementById("commentS"+n);
var el3 = document.getElementById("commentT"+n);
if (el.style.display == 'none') {
el.style.display = 'block';
el2.style.display = 'none';
el3.innerHTML = ""; //[hide]";
} else {
el.style.display = 'none';
el2.style.display= 'block';
el3.innerHTML = "[show all]";
}
}
//]]>
</script>
{%endblock %}
{% block content %}
<h1 style="margin-top:0;">{{ doc.title|escape }}<br/>RFC {{ doc.rfc_number }}</h1>
<div id="mytabs" class="yui-navset">
<ul class="yui-nav">
<li class="selected"><a href="#tab1"><em>Document</em></a></li>
<li><a href="#tab2"><em>Versions</em></a></li>
{%comment %}
<li {% if not doc.has_iesg_ballot %} class="disabled" {%endif%}><a href="#tab3"><em>IESG Evaluation Record</em></a></li>
<li {% if not doc.has_iesg_ballot %} class="disabled" {%endif%}><a href="#tab4"><em>IESG Writeups</em></a></li>
<li {% if not doc.in_iesg_tracker %} class="disabled" {%endif%}><a href="#tab5"><em>IESG Comment Log</em></a></li>
{% endcomment %}
</ul>
<div class="yui-content">
<div id="tab1">
<div id="metabox">
<table id="metatable">
<tr><td style="width:18ex;">Document type:</td><td>RFC - {{ doc.rfc_maturity_level }}</td></tr>
<tr><td>Published:</td><td> {{ doc.revision_date|default:"(data missing)" }}</td></tr>
</table>
</div>
</div> <!-- tab1 -->
<div id="tab2">
<div id="doc_versions" style="display:none;">
Foo
</div>
</div>
</div> <!-- yui-content -->
</div> <!-- mytabs -->
<div id="rfcText1">
<div class="markup_draft">
{{ content1 }}
</div>
</div>
{% endblock %}
{% block scripts %}
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/yui/2.7.0/build/tabview/tabview-min.js"></script>
<script type="text/javascript">
//<![CDATA[
function loadX(element, url) {
var el = document.getElementById(element);
el.innerHTML = "Loading...";
YAHOO.util.Connect.asyncRequest('GET',
url,
{ success: function(o) { document.getElementById(element).innerHTML = (o.responseText !== undefined) ? o.responseText : "?"; },
failure: function(o) { document.getElementById(element).innerHTML = "Error: "+o.status+" "+o.statusText; },
argument: null
}, null);
}
var tabView = new YAHOO.widget.TabView('mytabs');
tabView.subscribe('activeIndexChange', function(e) {
if (e.newValue == 0) {
document.getElementById('rfcText1').style.display = 'block';
document.getElementById('rfcText2').style.display = 'block';
} else {
document.getElementById('rfcText1').style.display = 'none';
document.getElementById('rfcText2').style.display = 'none';
} });
//document.getElementById('doc_versions').style.display = 'block';
//loadX("doc_versions", '/doc/{{doc.draft_name}}/_versions.data');
//]]>
</script>
{% endblock %}
{% block content_end %}
<div id="rfcText2">
<div class="markup_draft">
{{ content2 }}
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,69 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
<h2 style="margin-top:0;">Old versions and diffs</h2>
<div class="diffTool">
<form action="http://tools.ietf.org/rfcdiff" method="get" target="_blank">
<label>From:</label> <select name="url1">
{% for id in versions %}
<option value="{{id.draft_name}}-{{id.revision}}" {% ifequal forloop.counter 2 %} selected="selected" {% endifequal %}>{{id.draft_name}}-{{id.revision}} ({{id.revision_date}})</option>
{% endfor %}
</select><br/>
<label>To</label>
<select name="url2">
{% for id in versions %}
<option value="{{id.draft_name}}-{{id.revision}}" {% ifequal forloop.counter 1 %} selected="selected" {% endifequal %}>{{id.draft_name}}-{{id.revision}} ({{id.revision_date}})</option>
{% endfor %}
</select><br/>
<label>Format:</label>
<input name="difftype" value="--html" checked="checked" type="radio">Side-by-side
<input name="difftype" value="--abdiff" type="radio">Before-after
<input name="difftype" value="--chbars" type="radio">Change bars
<input name="difftype" value="--hwdiff" type="radio">Wdiff<br />
<input name="submit" value="Generate diff" type="submit" />
</form>
</div>
<table class="ietfTable">
<tr><th>Date</th><th>Document</th></tr>
{% for id in versions %}
<tr><td>{{id.revision_date}}</td><td><a href="http://tools.ietf.org/id/{{id.draft_name}}-{{id.revision}}.txt">{{id.draft_name}}-{{id.revision}}.txt</a></td></tr>
{% endfor %}
</table>

View file

@ -0,0 +1,132 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
<form name="search_form" id="search_form" action="/doc/search/" method="post" onsubmit="submitSearch();return false;">
<div class="search_field">
<label>Name/number/title:</label> {{ form.name }}
</div>
<div class="search_field">
<label>Types:</label>
<table id="search_types">
<tr><td>{{ form.rfcs }} RFCs</td></tr>
<tr><td>{{ form.activeDrafts }} Internet-Drafts (active)</td></tr>
<tr><td>{{ form.oldDrafts }} Internet-Drafts (expired/replaced/withdrawn)</td></tr>
</table>
</div>
<span onclick="toggleAdvanced();"><b><img src="/images/plus.png" alt="[+]" id="search_advanced-img" /> Advanced</b></span>
<div id="search_advanced" style="display:none;margin-top:1em;">
<div class="search_field">
<label>Author:</label> {{ form.author }}
</div>
<div class="search_field">
<label>WG/Area:</label> {{ form.group }}{{ form.area }}
</div>
<div class="search_field">
<label>Responsible AD:</label> {{ form.ad }}
</div>
<div class="search_field">
<label>IESG State:</label> {{ form.state }} :: {{ form.subState }}
</div>
{% comment %}
<div class="search_field" style="text-decoration:line-through;color:#808080;">
<label>Ballot position:</label> {{ form.positionAd }} has position {{ form.positionValue }}
</div>
{% endcomment %}
</div><!-- end of advanced -->
<div style="padding-top:0.5em;">
<input type="hidden" name="ajax" value="" />
<span id="search_submit_button" class="yui-button yui-submit-button">
<span class="first-child">
<button type="submit" id="search_submit">Search</button>
</span>
</span>
</div>
</form>
<script type="text/javascript">
//<![CDATA[
function searchResult(o) {
var el = document.getElementById("search_results");
el.innerHTML = (o.responseText !== undefined) ? o.responseText : "?";
}
function searchFailure(o) {
var el = document.getElementById("search_results");
el.innerHTML = "Error: "+o.status+" "+o.statusText;
}
function submitSearch() {
document.getElementById("search_results").innerHTML = "Searching...";
document.search_form.ajax.value = "1";
YAHOO.util.Connect.setForm("search_form");
YAHOO.util.Connect.asyncRequest('POST', '/doc/search/',
{ success: searchResult,
failure: searchFailure,
argument: null
}, null);
}
function togglePlusMinus(id) {
var el = document.getElementById(id);
var imgEl = document.getElementById(id+"-img");
if (el.style.display == 'none') {
el.style.display = 'block';
imgEl.src = "/images/minus.png";
} else {
el.style.display = 'none';
imgEl.src = "/images/plus.png";
}
}
function toggleAdvanced() {
togglePlusMinus("search_advanced");
var f = document.search_form;
f.author.value = "";
f.ad.selectedIndex = 0;
f.group.value = "";
f.area.selectedIndex = 0;
f.state.selectedIndex = 0;
f.subState.selectedIndex = 0;
}
//]]>
</script>

View file

@ -0,0 +1,54 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% extends "idrfc/base.html" %}
{% block title %}Internet-Drafts and RFCs
{% endblock %}
{% block content %}
<h1 style="margin-top:0;">Internet-Drafts and RFCs</h1>
<div id="search_form_box">
{% include "idrfc/search_form.html" %}
</div>
<div id="search_results" class="search_results">
{% if docs %}
{% include "idrfc/search_results.html" %}
{% endif %}
</div>
{% endblock %}

View file

@ -0,0 +1,57 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% load ietf_filters %}
{% load ballot_icon %}
<tr class="{% cycle oddrow,evenrow %}">
<td class="doc">
{% if doc.is_rfc %}<a href="/doc/rfc{{doc.rfc_number}}/">RFC {{doc.rfc_number}}</a>
{% if doc.draft_name %}<br />(<a href="/doc/{{doc.draft_name}}/">{{doc.draft_name}}</a>){%endif%}
{% else %}<a href="/doc/{{doc.draft_name}}/">{{doc.draft_name_and_revision}}</a>{% endif %}</td>
<td class="title">{{ doc.title|escape }}</td>
<td class="date">{{ doc.revision_date }}</td>
<td class="status">{{ doc.friendly_state|escape }}
{% if doc.is_rfc %}
{% if doc.has_rfc_errata %}<br /><a href="http://www.rfc-editor.org/errata_search.php?rfc={{doc.rfc_number}}" rel="nofollow" target="_blank">Errata</a>{% endif %}
{% else %}
{% if doc.draft_replaced_by %} by {% for rep in doc.draft_replaced_by %}<a href="/doc/{{rep}}/">{{rep}}</a> {% endfor %} {%endif %}
{% if doc.last_call_ends %} (ends {{doc.last_call_ends}}){%endif%}
{% if doc.rfc_editor_state %}<br />RFC Editor State: {{ doc.rfc_editor_state|escape }}{% endif %}
{% endif %}
</td>
<td class="ballot">{% ballot_icon doc %}</td>
<td class="ad">{% if doc.ad_name %}{{ doc.ad_name|escape }}{% else %}&nbsp;{% endif %}</td>
</tr>

View file

@ -0,0 +1,50 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% if meta.max %}
<p><b>Too many documents match the query! Returning partial result only.</b></p>
{% endif %}
{% regroup docs by view_sort_group as grouped_docs %}
<table>
<tr><th class="doc">Document</th><th class="title">Title</th><th class="date">Date</th><th class="status" colspan="2">Status</th><th class="ad">Area Director</th></tr>
{% for doc_group in grouped_docs %}
<tr class="header"><td colspan="6">{{doc_group.grouper}}s</td></tr>
{% for doc in doc_group.list %}
{% include "idrfc/search_result_row.html" %}
{% endfor %}
{% endfor %}
</table>

View file

@ -0,0 +1,69 @@
{% comment %}
Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% extends "idrfc/base.html" %}
{% load ballot_icon %}
{% load ietf_filters %}
{% block title %}IESG Discuss Positions
{% endblock %}
{% block morecss %}
{% endblock %}
{% block content %}
<h1 style="margin-top:0;">IESG Discuss Positions</h1>
<div class="search_results">
<table>
<tr><th class="doc">Document</th><th class="status" colspan="2">Status</th><th class="ad">Area Director</th><th>Discusses</th></tr>
{% for row in docs %}
<tr class="{% cycle oddrow,evenrow %}">
<td class="doc">
<a href="/doc/{{row.doc.draft_name}}/">{{row.doc.draft_name_and_revision}}</a>
</td>
<td class="status">{{ row.doc.friendly_state|escape }}</td>
<td class="ballot">{% ballot_icon row.doc %}</td>
<td class="ad">{% if row.doc.ad_name %}{{ row.doc.ad_name|escape }}{% else %}&nbsp;{% endif %}</td>
<td>
{% for po in row.discuss_positions %}
{{po.ad_name}} ({% if po.discuss_date %}{{po.discuss_date|timesince_days}}{%endif%} days ago for -{{po.discuss_revision}})<br/>
{% endfor %}</td>
</tr>
{% endfor %}
</table>
</div>
{% endblock %}

115
static/css/base2.css Normal file
View file

@ -0,0 +1,115 @@
/*
* Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* * Neither the name of the Nokia Corporation and/or its
* subsidiary(-ies) nor the names of its contributors may be used
* to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
body { margin: 0; }
.yui-skin-sam h1 {margin: 0.5em 0; font-size: 167%;}
.yui-skin-sam .yui-navset .yui-content {
background: white;
border:0px;
border-top:1px solid #243356;
padding:0.5em 0;
}
.yui-navset .disabled a em {color:#a0a0a0;}
#ietf-login { color: white; }
#ietf-login a, #ietf-login a:visited { color: white; }
.ballotTable .left { background: #edf5ff; width:150px; padding-left: 10px; }
.ballotTable .right { padding-left: 15px; padding-right:15px; width:610px;padding-top:0px;}
.ballotTable h2.ballot_ad { background: #2647A0; color:white; padding: 2px 4px; font-size: 108%; margin-top: 0;}
.ballotTable .right { background: white; }
.mydialog button { margin-left: 8px; }
.mybutton { background-color:white; border: 1px outset #808080; padding: 1px 3px; }
.mybutton a { text-decoration: none; color: black; }
.leftmenu { background-color: #edf5ff; padding:0; border: 1px solid #89d; }
.leftmenu ul { padding: 0; margin: 0; }
.leftmenu ul li { list-style: none; padding: 0; margin: 0; font-size: 90%; }
.leftmenu ul li a { display:block; padding: 2px 2px 2px 10px; }
.leftmenu ul li.sect { font-weight:bold; color:#fff; background:#2647A0; margin-top:2px; text-indent:2px; padding: 2px 0;}
.leftmenu ul li.first { margin-top: 0px; }
.leftmenu ul li a:hover { color:#fff; background: #e60; }
.leftmenu .yuimenuitemlabel { font-size: 12px; padding: 0 10px; }
.leftmenu a.yuimenuitemlabel { color:#0000ee; /*text-decoration: underline;*/ }
.leftmenu #wgs .bd { background-color: #ecf5fa; }
.leftmenu #wgs > .bd { border: 0;}
#search_form_box {width: 99.5%; border: 0px solid #cccccc; background:#edf5ff;margin-top:8px; padding:4px; margin-bottom:1em; padding-left:8px;}
form#search_form { padding-top: 4px; padding-bottom: 4px; }
#search_form input { padding: 0; padding-left: 2px; border: 1px solid #89d;}
#search_form select { border: 1px solid #89d; }
#search_form div.search_field { margin-top:2px; }
#search_form label { width: 130px; float: left; }
/* checkboxes for document types */
#search_form table#search_types { border-collapse:collapse;}
#search_form #search_types td { padding:0; }
#search_form #search_types td input { margin-left: 0; width:14px;}
/* give checkbox a fixed width so that IE6 aligns the left edge correctly */
#search_form #id_filename,
#search_form #id_author { width: 244px; }
#search_form #id_state,
#search_form #id_ad,
#search_form #id_positionAd { width:248px; }
#search_form #id_group {width: 120px; margin-right:4px; }
#search_form #id_area {width:120px; }
.search_results table { border: 1px solid #7f7f7f; border-collapse:collapse; }
.search_results tr.header { border-top: 1px solid #7f7f7f; border-bottom: 1px solid #7f7f7f; border-left: 1px solid white; border-right:2px solid white;}
.search_results tr.header td {padding: 6px 6px; font-weight: bold; }
.search_results td { border-right: 1px solid #cbcbcb; padding: 3px 6px; }
.search_results th { border-right: 1px solid #7f7f7f; padding: 3px 6px; }
.search_results th { color: white; background:#2647A0; text-align: left; }
.search_results tr.evenrow { background-color: #EDF5FF; }
.search_results {}
.search_results table { max-width: 1200px; }
.search_results th.doc, .search_results td.title { min-width:20em; max-width: 35em; }
.search_results th.title, .search_results td.title { min-width: 20em; max-width: 35em; }
.search_results th.date, .search_results td.date { white-space:nowrap; min-width: 6em;}
.search_results th.status, .search_results td.status { min-width: 20em;}
.search_results th.ad, .search_results td.ad { white-space:nowrap; min-width: 6em; }
.search_results td.ballot { border-left: hidden; }
.ballot_icon_wrapper { font-size: 4pt; line-height: 0.1; color: black; }
table.ballot_icon { empty-cells: show; padding: 0; border-spacing: 0; border: 1px solid black; border-collapse: collapse; table-layout:fixed; min-width:35px;}
table.ballot_icon td { border: 1px solid black; height: 7px; width: 6px; padding: 0;}
td.ballot_icon_green { background:#80ff80; }
td.ballot_icon_red { background: #c00000; color: yellow; }
td.ballot_icon_gray { background: #c0c0c0; }
table.ballot_icon td.ballot_icon_my { border: 3px outset black;}

BIN
static/images/blue_dot.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

BIN
static/images/minus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

BIN
static/images/plus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

BIN
static/images/square.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

71
static/js/base.js Normal file
View file

@ -0,0 +1,71 @@
// Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
//
// * Neither the name of the Nokia Corporation and/or its
// subsidiary(-ies) nor the names of its contributors may be used
// to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
function showBallot(draftName, trackerId) {
var handleEditPosition = function() {
IETF_DOCS.ballotDialog.hide();
var tid = document.getElementById("doc_ballot_dialog_id").innerHTML;
window.open("https://datatracker.ietf.org/cgi-bin/idtracker.cgi?command=open_ballot&id_document_tag="+tid);
};
var handleClose = function() {
IETF_DOCS.ballotDialog.hide();
};
var el;
if (!IETF_DOCS.ballotDialog) {
el = document.createElement("div");
el.innerHTML = '<div id="doc_ballot_dialog" class="mydialog" style="visibility:hidden;"><div class="hd">Positions for <span id="doc_ballot_dialog_name">draft-ietf-foo-bar</span><span id="doc_ballot_dialog_id" style="display:none;"></span></div><div class="bd"> <div id="doc_ballot_dialog_12" style="overflow-y:scroll; height:500px;"></div> </div></div>';
document.getElementById("db-extras").appendChild(el);
var buttons = [{text:"Close", handler:handleClose, isDefault:true}];
buttons.unshift({text:"Edit Position", handler:handleEditPosition});
IETF_DOCS.ballotDialog = new YAHOO.widget.Dialog("doc_ballot_dialog", {
visible:false, draggable:false, close:true, modal:true,
width:"850px", fixedcenter:true, constraintoviewport:true,
buttons: buttons});
IETF_DOCS.ballotDialog.render();
}
document.getElementById("doc_ballot_dialog_name").innerHTML = draftName;
document.getElementById("doc_ballot_dialog_id").innerHTML = trackerId;
IETF_DOCS.ballotDialog.show();
el = document.getElementById("doc_ballot_dialog_12");
el.innerHTML = "Loading...";
YAHOO.util.Connect.asyncRequest('GET',
"/doc/"+draftName+"/_ballot.data",
{ success: function(o) { el.innerHTML = (o.responseText !== undefined) ? o.responseText : "?"; },
failure: function(o) { el.innerHTML = "Error: "+o.status+" "+o.statusText; },
argument: null
}, null);
}