33import urllib
44import math
55import datetime
6+ import operator
67
78from django .conf import settings
89from django .db .models .query import EmptyQuerySet
@@ -27,7 +28,7 @@ def email_update_telechat(request, doc, text):
2728
2829 if not to :
2930 return
30-
31+
3132 text = strip_tags (text )
3233 send_mail (request , to , None ,
3334 "Telechat update notice: %s" % doc .file_tag (),
@@ -41,7 +42,7 @@ def get_state_types(doc):
4142
4243 if not doc :
4344 return res
44-
45+
4546 res .append (doc .type_id )
4647
4748 if doc .type_id == "draft" :
@@ -52,7 +53,7 @@ def get_state_types(doc):
5253 res .append ("draft-iana-review" )
5354 res .append ("draft-iana-action" )
5455 res .append ("draft-rfceditor" )
55-
56+
5657 return res
5758
5859def get_tags_for_stream_id (stream_id ):
@@ -144,7 +145,7 @@ def needed_ballot_positions(doc, active_positions):
144145 answer .append ("Has enough positions to pass." )
145146
146147 return " " .join (answer )
147-
148+
148149def create_ballot_if_not_open (doc , by , ballot_slug , time = None ):
149150 if not doc .ballot_open (ballot_slug ):
150151 if time :
@@ -359,7 +360,7 @@ def make_notify_changed_event(request, doc, by, new_notify, time=None):
359360
360361def update_telechat (request , doc , by , new_telechat_date , new_returning_item = None ):
361362 from ietf .doc .models import TelechatDocEvent
362-
363+
363364 on_agenda = bool (new_telechat_date )
364365
365366 prev = doc .latest_event (TelechatDocEvent , type = "scheduled_for_telechat" )
@@ -378,7 +379,7 @@ def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None
378379
379380 # auto-set returning item _ONLY_ if the caller did not provide a value
380381 if ( new_returning_item != None
381- and on_agenda
382+ and on_agenda
382383 and prev_agenda
383384 and new_telechat_date != prev_telechat
384385 and prev_telechat < datetime .date .today ()
@@ -392,7 +393,7 @@ def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None
392393 e .doc = doc
393394 e .returning_item = returning
394395 e .telechat_date = new_telechat_date
395-
396+
396397 if on_agenda != prev_agenda :
397398 if on_agenda :
398399 e .desc = "Placed on agenda for telechat - %s" % (new_telechat_date )
@@ -426,7 +427,7 @@ def rebuild_reference_relations(doc,filename=None):
426427 refs = draft .Draft (draft ._gettext (filename ), filename ).get_refs ()
427428 except IOError as e :
428429 return { 'errors' : ["%s :%s" % (e .strerror , filename )] }
429-
430+
430431 doc .relateddocument_set .filter (relationship__slug__in = ['refnorm' ,'refinfo' ,'refold' ,'refunk' ]).delete ()
431432
432433 warnings = []
@@ -449,11 +450,11 @@ def rebuild_reference_relations(doc,filename=None):
449450
450451 ret = {}
451452 if errors :
452- ret ['errors' ]= errors
453+ ret ['errors' ]= errors
453454 if warnings :
454- ret ['warnings' ]= warnings
455+ ret ['warnings' ]= warnings
455456 if unfound :
456- ret ['unfound' ]= list (unfound )
457+ ret ['unfound' ]= list (unfound )
457458
458459 return ret
459460
@@ -539,3 +540,31 @@ def uppercase_std_abbreviated_name(name):
539540 return name .upper ()
540541 else :
541542 return name
543+
544+ def crawl_history (doc ):
545+ # return document history data for use in ietf/templates/doc/timeline.html
546+ def ancestors (doc ):
547+ retval = []
548+ if hasattr (doc , 'relateddocument_set' ):
549+ for rel in doc .relateddocument_set .filter (relationship__slug = 'replaces' ):
550+ if rel .target .document not in retval :
551+ retval .append (rel .target .document )
552+ retval .extend (ancestors (rel .target .document ))
553+ return retval
554+
555+ retval = []
556+ history = ancestors (doc )
557+ if history is not None :
558+ history .append (doc )
559+ for d in history :
560+ for e in d .docevent_set .filter (type = 'new_revision' ):
561+ if hasattr (e , 'newrevisiondocevent' ):
562+ retval .append ((d .name , e .newrevisiondocevent .rev , e .time .isoformat ()))
563+
564+ if doc .type_id == "draft" :
565+ e = doc .latest_event (type = 'published_rfc' )
566+ else :
567+ e = doc .latest_event (type = 'iesg_approved' )
568+ if e :
569+ retval .append ((doc .name , e .doc .canonical_name , e .time .isoformat ()))
570+ return sorted (retval , key = operator .itemgetter (2 ))
0 commit comments