88from django .db .models .query import EmptyQuerySet
99from django .forms import ValidationError
1010from django .utils .html import strip_tags , escape
11+ from django .core .urlresolvers import reverse as urlreverse
1112
1213from ietf .doc .models import Document , DocHistory , State
1314from ietf .doc .models import DocAlias , RelatedDocument , BallotType , DocReminder
@@ -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,41 @@ 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 inclusion in doc.json (used by timeline)
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 ({
563+ 'name' : d .name ,
564+ 'rev' : e .newrevisiondocevent .rev ,
565+ 'published' : e .time .isoformat (),
566+ 'url' : urlreverse ("doc_view" , kwargs = dict (name = d )) + e .newrevisiondocevent .rev + "/"
567+ })
568+
569+ if doc .type_id == "draft" :
570+ e = doc .latest_event (type = 'published_rfc' )
571+ else :
572+ e = doc .latest_event (type = 'iesg_approved' )
573+ if e :
574+ retval .append ({
575+ 'name' : e .doc .canonical_name (),
576+ 'rev' : e .doc .canonical_name (),
577+ 'published' : e .time .isoformat (),
578+ 'url' : urlreverse ("doc_view" , kwargs = dict (name = e .doc ))
579+ })
580+ return sorted (retval , key = lambda x : x ['published' ])
0 commit comments