1- # Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
1+ # Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
22# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
33#
44# Redistribution and use in source and binary forms, with or without
3030# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3131# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232
33- import re
33+ import re , os
34+ from datetime import datetime , time
3435from django .http import HttpResponse , Http404
3536from django .shortcuts import render_to_response , get_object_or_404
3637from ietf .idtracker .models import InternetDraft , IDInternal , BallotInfo
4243from django .template .defaultfilters import truncatewords_html
4344from ietf .idtracker .templatetags .ietf_filters import format_textarea , fill
4445
46+
4547def document_debug (request , name ):
4648 r = re .compile ("^rfc([0-9]+)$" )
4749 m = r .match (name )
@@ -54,29 +56,40 @@ def document_debug(request, name):
5456 doc = IdWrapper (draft = id )
5557 return HttpResponse (doc .to_json (), mimetype = 'text/plain' )
5658
57- def document_main_rfc (request , rfc_number ):
58- rfci = get_object_or_404 (RfcIndex , rfc_number = rfc_number )
59- doc = RfcWrapper (rfci )
60-
61- info = {}
62- content1 = None
63- content2 = None
59+ def _get_html (key , filename ):
6460 f = None
6561 try :
66- try :
67- f = open (settings .RFC_PATH + "rfc" + str (rfc_number )+ ".txt" )
68- content = f .read ()
69- (content1 , content2 ) = markup_txt .markup (content )
70- except IOError :
71- content1 = "Error - can't find" + "rfc" + str (rfc_number )+ ".txt"
72- content2 = ""
62+ f = open (filename , 'rb' )
63+ raw_content = f .read ()
64+ except IOError :
65+ return ("Error; cannot read " + key , "" )
7366 finally :
7467 if f :
7568 f .close ()
69+ (c1 ,c2 ) = markup_txt .markup (raw_content )
70+ return (c1 ,c2 )
71+
72+ def document_main_rfc (request , rfc_number ):
73+ rfci = get_object_or_404 (RfcIndex , rfc_number = rfc_number )
74+ doc = RfcWrapper (rfci )
75+
76+ info = {}
77+ info ['is_rfc' ] = True
78+ (content1 , content2 ) = _get_html (
79+ "rfc" + str (rfc_number )+ ",html" ,
80+ os .path .join (settings .RFC_PATH , "rfc" + str (rfc_number )+ ".txt" ))
81+
82+ if doc .in_ietf_process () and doc .ietf_process .has_iesg_ballot ():
83+ ballot = doc .ietf_process .iesg_ballot ()
84+ else :
85+ ballot = None
86+
87+ history = _get_history (doc )
7688
7789 return render_to_response ('idrfc/doc_main_rfc.html' ,
7890 {'content1' :content1 , 'content2' :content2 ,
79- 'doc' :doc , 'info' :info },
91+ 'doc' :doc , 'info' :info , 'ballot' :ballot ,
92+ 'history' :history },
8093 context_instance = RequestContext (request ));
8194
8295def document_main (request , name ):
@@ -108,53 +121,71 @@ def document_main(request, name):
108121 info ['type' ] = "Old Internet-Draft" + stream
109122
110123 info ['has_pdf' ] = (".pdf" in doc .file_types ())
124+ info ['is_rfc' ] = False
111125
112- content1 = None
113- content2 = None
114- if info ['is_active_draft' ]:
115- f = None
116- try :
117- try :
118- f = open (settings .INTERNET_DRAFT_PATH + name + "-" + id .revision + ".txt" )
119- content = f .read ()
120- (content1 , content2 ) = markup_txt .markup (content )
121- except IOError :
122- content1 = "Error - can't find " + name + "-" + id .revision + ".txt"
123- content2 = ""
124- finally :
125- if f :
126- f .close ()
126+ (content1 , content2 ) = _get_html (
127+ str (name )+ "," + str (id .revision )+ ",html" ,
128+ os .path .join (settings .INTERNET_DRAFT_PATH , name + "-" + id .revision + ".txt" ))
129+
130+ if doc .in_ietf_process () and doc .ietf_process .has_iesg_ballot ():
131+ ballot = doc .ietf_process .iesg_ballot ()
132+ else :
133+ ballot = None
134+
135+ versions = _get_versions (id )
136+ history = _get_history (doc )
127137
128138 return render_to_response ('idrfc/doc_main_id.html' ,
129139 {'content1' :content1 , 'content2' :content2 ,
130- 'doc' :doc , 'info' :info },
140+ 'doc' :doc , 'info' :info , 'ballot' :ballot ,
141+ 'versions' :versions , 'history' :history },
131142 context_instance = RequestContext (request ));
132143
133- def document_comments (request , name ):
134- r = re .compile ("^rfc([0-9]+)$" )
135- m = r .match (name )
136- if m :
137- id = get_object_or_404 (IDInternal , rfc_flag = 1 , draft = int (m .group (1 )))
138- else :
139- id = get_object_or_404 (IDInternal , rfc_flag = 0 , draft__filename = name )
144+ # doc is either IdWrapper or RfcWrapper
145+ def _get_history (doc ):
140146 results = []
141- commentNumber = 0
142- for comment in id .public_comments ():
143- info = {}
144- r = re .compile (r'^(.*) by (?:<b>)?([A-Z]\w+ [A-Z]\w+)(?:</b>)?$' )
145- m = r .match (comment .comment_text )
146- if m :
147- info ['text' ] = m .group (1 )
148- info ['by' ] = m .group (2 )
149- else :
147+ if doc ._idinternal :
148+ for comment in doc ._idinternal .public_comments ():
149+ info = {}
150150 info ['text' ] = comment .comment_text
151151 info ['by' ] = comment .get_fullname ()
152- info ['textSnippet' ] = truncatewords_html (format_textarea (fill (info ['text' ], 80 )), 25 )
153- info ['snipped' ] = info ['textSnippet' ][- 3 :] == "..."
154- info ['commentNumber' ] = commentNumber
155- commentNumber = commentNumber + 1
156- results .append ({'comment' :comment , 'info' :info })
157- return render_to_response ('idrfc/doc_comments.html' , {'comments' :results }, context_instance = RequestContext (request ))
152+ info ['textSnippet' ] = truncatewords_html (format_textarea (fill (info ['text' ], 80 )), 25 )
153+ info ['snipped' ] = info ['textSnippet' ][- 3 :] == "..."
154+ results .append ({'comment' :comment , 'info' :info , 'date' :comment .datetime (), 'is_com' :True })
155+ if doc .is_id_wrapper :
156+ versions = _get_versions (doc ._draft , False )
157+ versions .reverse ()
158+ for v in versions :
159+ v ['is_rev' ] = True
160+ results .append (v )
161+ if doc .is_id_wrapper and doc .draft_status == "Expired" and doc ._draft .expiration_date :
162+ results .append ({'is_text' :True , 'date' :doc ._draft .expiration_date , 'text' :'Draft expired' })
163+ if doc .is_rfc_wrapper :
164+ results .append ({'is_text' :True , 'date' :doc .publication_date , 'text' :'RFC Published' })
165+
166+ # convert plain dates to datetimes (required for sorting)
167+ for x in results :
168+ if not isinstance (x ['date' ], datetime ):
169+ x ['date' ] = datetime .combine (x ['date' ], time (0 ,0 ,0 ))
170+
171+ results .sort (key = lambda x : x ['date' ])
172+ results .reverse ()
173+ return results
174+
175+ # takes InternetDraft instance
176+ def _get_versions (draft , include_replaced = True ):
177+ ov = []
178+ ov .append ({"draft_name" :draft .filename , "revision" :draft .revision_display (), "date" :draft .revision_date })
179+ if include_replaced :
180+ draft_list = [draft ]+ list (draft .replaces_set .all ())
181+ else :
182+ draft_list = [draft ]
183+ for d in draft_list :
184+ for v in DraftVersions .objects .filter (filename = d .filename ).order_by ('-revision' ):
185+ if (d .filename == draft .filename ) and (draft .revision_display () == v .revision ):
186+ continue
187+ ov .append ({"draft_name" :d .filename , "revision" :v .revision , "date" :v .revision_date })
188+ return ov
158189
159190def document_ballot (request , name ):
160191 r = re .compile ("^rfc([0-9]+)$" )
@@ -172,15 +203,3 @@ def document_ballot(request, name):
172203 ballot = BallotWrapper (id )
173204 return render_to_response ('idrfc/doc_ballot.html' , {'ballot' :ballot }, context_instance = RequestContext (request ))
174205
175- def document_versions (request , name ):
176- draft = get_object_or_404 (InternetDraft , filename = name )
177- ov = []
178- ov .append ({"draft_name" :draft .filename , "revision" :draft .revision , "revision_date" :draft .revision_date })
179- for d in [draft ]+ list (draft .replaces_set .all ()):
180- for v in DraftVersions .objects .filter (filename = d .filename ).order_by ('-revision' ):
181- if (d .filename == draft .filename ) and (draft .revision == v .revision ):
182- continue
183- ov .append ({"draft_name" :d .filename , "revision" :v .revision , "revision_date" :v .revision_date })
184-
185- return render_to_response ('idrfc/doc_versions.html' , {'versions' :ov }, context_instance = RequestContext (request ))
186-
0 commit comments