Skip to content

Commit bcf6ef0

Browse files
committed
Add milestone support in charter diffs by outputting them on a special
.txt generating page that looks up the milestones available at the time the charter was submitted (actually just before the next one was submitted) - Legacy-Id: 4578
1 parent b68bf9b commit bcf6ef0

6 files changed

Lines changed: 87 additions & 22 deletions

File tree

ietf/idrfc/views_doc.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -170,29 +170,31 @@ def document_history(request, name):
170170
doc = get_object_or_404(Document, docalias__name=name)
171171
top = render_document_top(request, doc, "history", name)
172172

173-
diff_documents = [ doc ]
174-
diff_documents.extend(Document.objects.filter(docalias__relateddocument__source=doc, docalias__relateddocument__relationship="replaces"))
175-
176173
# pick up revisions from events
177174
diff_revisions = []
178-
seen = set()
179175

180176
diffable = name.startswith("draft") or name.startswith("charter")
181-
182177
if diffable:
178+
diff_documents = [ doc ]
179+
diff_documents.extend(Document.objects.filter(docalias__relateddocument__source=doc, docalias__relateddocument__relationship="replaces"))
180+
181+
seen = set()
183182
for e in NewRevisionDocEvent.objects.filter(type="new_revision", doc__in=diff_documents).select_related('doc').order_by("-time", "-id"):
184-
if not (e.doc.name, e.rev) in seen:
185-
seen.add((e.doc.name, e.rev))
186-
187-
url = ""
188-
if name.startswith("charter"):
189-
h = find_history_active_at(e.doc, e.time)
190-
url = settings.CHARTER_TXT_URL + ("%s-%s.txt" % ((h or doc).canonical_name(), e.rev))
191-
elif name.startswith("draft"):
192-
# rfcdiff tool has special support for IDs
193-
url = e.doc.name + "-" + e.rev
194-
195-
diff_revisions.append((e.doc.name, e.rev, e.time, url))
183+
if (e.doc.name, e.rev) in seen:
184+
continue
185+
186+
seen.add((e.doc.name, e.rev))
187+
188+
url = ""
189+
if name.startswith("charter"):
190+
#h = find_history_active_at(e.doc, e.time)
191+
#url = settings.CHARTER_TXT_URL + ("%s-%s.txt" % ((h or doc).canonical_name(), e.rev))
192+
url = request.build_absolute_uri(urlreverse("charter_with_milestones_txt", kwargs=dict(name=e.doc.name, rev=e.rev)))
193+
elif name.startswith("draft"):
194+
# rfcdiff tool has special support for IDs
195+
url = e.doc.name + "-" + e.rev
196+
197+
diff_revisions.append((e.doc.name, e.rev, e.time, url))
196198

197199
# grab event history
198200
events = doc.docevent_set.all().order_by("-time", "-id").select_related("by")
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{% load ietf_filters %}{% autoescape off %}{% filter wrap_long_lines %}{{ charter_text }}{% endfilter %}
2+
3+
Milestones
4+
5+
{% for milestone in milestones %}{% if milestone.resolved %}{{ milestone.resolved|ljust:8 }}{% else %}{{ milestone.due|date:"M Y" }}{% endif %} - {{ milestone.desc_filled }}{% for d in milestone.docs.all %}
6+
o {{ d.name }}{% endfor %}
7+
8+
{% endfor %}{% endautoescape %}

ietf/wgcharter/feeds.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from django.utils.html import strip_tags
1010
from django.utils.text import truncate_words
1111

12-
from ietf.utils.history import find_history_active_at
1312
from ietf.group.models import Group, GroupEvent
1413
from ietf.doc.models import DocEvent
1514

ietf/wgcharter/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@
1111
url(r'^ballotwriteupnotes/$', "ietf.wgcharter.views.ballot_writeupnotes"),
1212
url(r'^approve/$', "ietf.wgcharter.views.approve", name='charter_approve'),
1313
url(r'^submit/$', "ietf.wgcharter.views.submit", name='charter_submit'),
14-
url(r'^submit/(?P<option>initcharter|recharter)/$', "ietf.wgcharter.views.submit", name='charter_submit'),
14+
url(r'^submit/(?P<option>initcharter|recharter)/$', "ietf.wgcharter.views.submit", name='charter_submit'), # shouldn't be here
15+
url(r'^withmilestones-(?P<rev>[0-9-]+).txt$', "ietf.wgcharter.views.charter_with_milestones_txt", name='charter_with_milestones_txt'),
1516
)

ietf/wgcharter/utils.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
from ietf.group.models import GroupEvent, ChangeStateGroupEvent
66
from ietf.doc.models import Document, DocAlias, DocHistory, RelatedDocument, DocumentAuthor, DocEvent
7-
from ietf.utils.history import find_history_active_at
87

98
def log_state_changed(request, doc, by, prev_state):
109
e = DocEvent(doc=doc, by=by)

ietf/wgcharter/views.py

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import re, os, string, datetime, shutil
1+
import re, os, string, datetime, shutil, textwrap
22

3-
from django.http import HttpResponse, HttpResponseRedirect, Http404
3+
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound, Http404
44
from django.shortcuts import render_to_response, get_object_or_404, redirect
55
from django.template.loader import render_to_string
66
from django.core.urlresolvers import reverse as urlreverse
@@ -15,6 +15,7 @@
1515

1616
from ietf.utils.mail import send_mail_text, send_mail_preformatted
1717
from ietf.utils.textupload import get_cleaned_text_file_content
18+
from ietf.utils.history import find_history_active_at
1819
from ietf.ietfauth.decorators import has_role, role_required
1920
from ietf.iesg.models import TelechatDate
2021
from ietf.doc.models import *
@@ -626,3 +627,58 @@ def approve(request, name):
626627
announcement=announcement),
627628
context_instance=RequestContext(request))
628629

630+
def charter_with_milestones_txt(request, name, rev):
631+
charter = get_object_or_404(Document, type="charter", docalias__name=name)
632+
633+
revision_event = charter.latest_event(NewRevisionDocEvent, type="new_revision", rev=rev)
634+
if not revision_event:
635+
return HttpResponseNotFound("Revision %s not found in database" % rev)
636+
637+
# read charter text
638+
c = find_history_active_at(charter, revision_event.time) or charter
639+
filename = '%s-%s.txt' % (c.canonical_name(), rev)
640+
641+
charter_text = ""
642+
643+
try:
644+
with open(os.path.join(settings.CHARTER_PATH, filename), 'r') as f:
645+
charter_text = f.read()
646+
except IOError:
647+
charter_text = "Error reading charter text %s" % filename
648+
649+
650+
# find milestones
651+
652+
chartering = "-" in rev
653+
if chartering:
654+
need_state = "charter"
655+
else:
656+
need_state = "active"
657+
658+
# slight complication - we can assign milestones to a revision up
659+
# until the point where the next superseding revision is
660+
# published, so that time shall be our limit
661+
e = charter.docevent_set.filter(time__gt=revision_event.time, type="new_revision").order_by("time")
662+
if not chartering:
663+
e = e.exclude(newrevisiondocevent__rev__contains="-")
664+
665+
if e:
666+
# subtract a margen of error
667+
just_before_next_rev = e[0].time - datetime.timedelta(seconds=5)
668+
else:
669+
just_before_next_rev = datetime.datetime.now()
670+
671+
wrapper = textwrap.TextWrapper(initial_indent="", subsequent_indent=" " * 11, width=80, break_long_words=False)
672+
673+
milestones = []
674+
for m in charter.chartered_group.groupmilestone_set.all():
675+
mh = find_history_active_at(m, just_before_next_rev)
676+
if mh and mh.state_id == need_state:
677+
mh.desc_filled = wrapper.fill(mh.desc)
678+
milestones.append(mh)
679+
680+
return render_to_response('wgcharter/charter_with_milestones.txt',
681+
dict(charter_text=charter_text,
682+
milestones=milestones),
683+
context_instance=RequestContext(request),
684+
mimetype="text/plain")

0 commit comments

Comments
 (0)