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:
parent
65b4f738ae
commit
aa54250805
17
changelog
17
changelog
|
@ -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
519
ietf/idrfc/idrfc_wrapper.py
Normal 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
69
ietf/idrfc/markup_txt.py
Normal 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)
|
|
@ -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")
|
||||
|
|
1
ietf/idrfc/templatetags/__init__.py
Normal file
1
ietf/idrfc/templatetags/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
#
|
110
ietf/idrfc/templatetags/ballot_icon.py
Normal file
110
ietf/idrfc/templatetags/ballot_icon.py
Normal 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)
|
78
ietf/idrfc/templatetags/wg_menu.py
Normal file
78
ietf/idrfc/templatetags/wg_menu.py
Normal 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)
|
|
@ -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
174
ietf/idrfc/views_doc.py
Normal 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
217
ietf/idrfc/views_search.py
Normal 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))
|
||||
|
|
@ -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()
|
||||
|
|
|
@ -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),
|
||||
)
|
||||
|
|
|
@ -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})
|
||||
|
||||
|
||||
|
|
|
@ -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__":
|
||||
|
|
|
@ -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
|
||||
|
|
111
ietf/templates/idrfc/base.html
Normal file
111
ietf/templates/idrfc/base.html
Normal 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 }} | <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>
|
83
ietf/templates/idrfc/base_leftmenu.html
Normal file
83
ietf/templates/idrfc/base_leftmenu.html
Normal 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 & 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>
|
38
ietf/templates/idrfc/base_wgmenu.html
Normal file
38
ietf/templates/idrfc/base_wgmenu.html
Normal 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}} — {{wg.group_acronym.name|escape}}</a></li>{% endfor %}
|
||||
</ul></div></div></li>
|
||||
{% endfor %}
|
126
ietf/templates/idrfc/doc_ballot.html
Normal file
126
ietf/templates/idrfc/doc_ballot.html
Normal 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>
|
62
ietf/templates/idrfc/doc_comments.html
Normal file
62
ietf/templates/idrfc/doc_comments.html
Normal 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>
|
277
ietf/templates/idrfc/doc_main_id.html
Normal file
277
ietf/templates/idrfc/doc_main_id.html
Normal 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>
|
||||
<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>
|
||||
<span class="mybutton"><a href="https://datatracker.ietf.org/ipr/search/?option=document_search&id_document_tag={{doc.tracker_id}}" rel="nofollow" target="_blank">IPR Disclosures</a></span>
|
||||
<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>
|
||||
{% if doc.in_iesg_tracker %}
|
||||
<span class="mybutton"><a href="https://datatracker.ietf.org/cgi-bin/idtracker.cgi?command=view_id&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&dTag={{doc.tracker_id}}&rfc_flag=0&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&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&filename={{doc.draft_filename}}&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 }} <{{author.email}}></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 %}
|
167
ietf/templates/idrfc/doc_main_rfc.html
Normal file
167
ietf/templates/idrfc/doc_main_rfc.html
Normal 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 %}
|
69
ietf/templates/idrfc/doc_versions.html
Normal file
69
ietf/templates/idrfc/doc_versions.html
Normal 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>
|
132
ietf/templates/idrfc/search_form.html
Normal file
132
ietf/templates/idrfc/search_form.html
Normal 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>
|
54
ietf/templates/idrfc/search_main.html
Normal file
54
ietf/templates/idrfc/search_main.html
Normal 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 %}
|
57
ietf/templates/idrfc/search_result_row.html
Normal file
57
ietf/templates/idrfc/search_result_row.html
Normal 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 %} {% endif %}</td>
|
||||
|
||||
</tr>
|
50
ietf/templates/idrfc/search_results.html
Normal file
50
ietf/templates/idrfc/search_results.html
Normal 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>
|
69
ietf/templates/iesg/discusses.html
Normal file
69
ietf/templates/iesg/discusses.html
Normal 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 %} {% 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
115
static/css/base2.css
Normal 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
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
BIN
static/images/minus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 204 B |
BIN
static/images/plus.png
Normal file
BIN
static/images/plus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 208 B |
BIN
static/images/square.png
Normal file
BIN
static/images/square.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 202 B |
BIN
static/images/title_line.gif
Normal file
BIN
static/images/title_line.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
71
static/js/base.js
Normal file
71
static/js/base.js
Normal 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);
|
||||
}
|
Loading…
Reference in a new issue