Skip to content

Commit 9728186

Browse files
committed
Make revision history (via crawl_history) available in document templates. This
lays the foundation for graphical timelines. - Legacy-Id: 10542
1 parent 30f2e87 commit 9728186

2 files changed

Lines changed: 51 additions & 12 deletions

File tree

ietf/doc/utils.py

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import urllib
44
import math
55
import datetime
6+
import operator
67

78
from django.conf import settings
89
from 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

5859
def 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+
148149
def 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

360361
def 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))

ietf/doc/views_doc.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
from ietf.doc.utils import ( add_links_in_new_revision_events, augment_events_with_revision,
5050
can_adopt_draft, get_chartering_type, get_document_content, get_tags_for_stream_id,
5151
needed_ballot_positions, nice_consensus, prettify_std_name, update_telechat, has_same_ballot,
52-
get_initial_notify, make_notify_changed_event )
52+
get_initial_notify, make_notify_changed_event, crawl_history)
5353
from ietf.community.models import CommunityList
5454
from ietf.group.models import Role
5555
from ietf.group.utils import can_manage_group_type, can_manage_materials
@@ -417,6 +417,7 @@ def document_main(request, name, rev=None):
417417
search_archive=search_archive,
418418
actions=actions,
419419
tracking_document=tracking_document,
420+
rev_history=crawl_history(latest_revision.doc if latest_revision else doc),
420421
),
421422
context_instance=RequestContext(request))
422423

@@ -442,6 +443,8 @@ def document_main(request, name, rev=None):
442443

443444
can_manage = can_manage_group_type(request.user, doc.group.type_id)
444445

446+
latest_revision = doc.latest_event(NewRevisionDocEvent, type="new_revision")
447+
445448
return render_to_response("doc/document_charter.html",
446449
dict(doc=doc,
447450
top=top,
@@ -456,6 +459,7 @@ def document_main(request, name, rev=None):
456459
group=group,
457460
milestones=milestones,
458461
can_manage=can_manage,
462+
rev_history=crawl_history(latest_revision.doc if latest_revision else doc),
459463
),
460464
context_instance=RequestContext(request))
461465

@@ -473,6 +477,8 @@ def document_main(request, name, rev=None):
473477
if doc.get_state_slug() in ("iesgeval") and doc.active_ballot():
474478
ballot_summary = needed_ballot_positions(doc, doc.active_ballot().active_ad_positions().values())
475479

480+
latest_revision = doc.latest_event(NewRevisionDocEvent, type="new_revision")
481+
476482
return render_to_response("doc/document_conflict_review.html",
477483
dict(doc=doc,
478484
top=top,
@@ -484,6 +490,7 @@ def document_main(request, name, rev=None):
484490
conflictdoc=conflictdoc,
485491
ballot_summary=ballot_summary,
486492
approved_states=('appr-reqnopub-pend','appr-reqnopub-sent','appr-noprob-pend','appr-noprob-sent'),
493+
rev_history=crawl_history(latest_revision.doc if latest_revision else doc),
487494
),
488495
context_instance=RequestContext(request))
489496

@@ -508,6 +515,8 @@ def document_main(request, name, rev=None):
508515
else:
509516
sorted_relations=None
510517

518+
latest_revision = doc.latest_event(NewRevisionDocEvent, type="new_revision")
519+
511520
return render_to_response("doc/document_status_change.html",
512521
dict(doc=doc,
513522
top=top,
@@ -519,6 +528,7 @@ def document_main(request, name, rev=None):
519528
ballot_summary=ballot_summary,
520529
approved_states=('appr-pend','appr-sent'),
521530
sorted_relations=sorted_relations,
531+
rev_history=crawl_history(latest_revision.doc if latest_revision else doc),
522532
),
523533
context_instance=RequestContext(request))
524534

0 commit comments

Comments
 (0)