|
1 | | -import re, os, string, datetime, shutil |
| 1 | +import re, os, string, datetime, shutil, textwrap |
2 | 2 |
|
3 | | -from django.http import HttpResponse, HttpResponseRedirect, Http404 |
| 3 | +from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound, Http404 |
4 | 4 | from django.shortcuts import render_to_response, get_object_or_404, redirect |
5 | 5 | from django.template.loader import render_to_string |
6 | 6 | from django.core.urlresolvers import reverse as urlreverse |
|
15 | 15 |
|
16 | 16 | from ietf.utils.mail import send_mail_text, send_mail_preformatted |
17 | 17 | from ietf.utils.textupload import get_cleaned_text_file_content |
| 18 | +from ietf.utils.history import find_history_active_at |
18 | 19 | from ietf.ietfauth.decorators import has_role, role_required |
19 | 20 | from ietf.iesg.models import TelechatDate |
20 | 21 | from ietf.doc.models import * |
@@ -626,3 +627,58 @@ def approve(request, name): |
626 | 627 | announcement=announcement), |
627 | 628 | context_instance=RequestContext(request)) |
628 | 629 |
|
| 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