Merged in branch/iola/charter-fixes from olau@iola.dk with a series of fixes to the charter management code.

- Legacy-Id: 4483
This commit is contained in:
Henrik Levkowetz 2012-06-20 23:01:28 +00:00
commit b1b21e5529
14 changed files with 69 additions and 55 deletions

View file

@ -101,7 +101,7 @@ def render_ballot_icon(user, doc):
c = "position-%s" % (pos.pos.slug if pos else "norecord")
if hasattr(user, "get_profile") and ad == user.get_profile():
if ad.user_id == user.id:
c += " my"
res.append('<td class="%s" />' % c)

View file

@ -42,33 +42,33 @@ urlpatterns = patterns('',
(r'^in-last-call/$', views_search.in_last_call),
url(r'^ad/(?P<name>[A-Za-z0-9.-]+)/$', views_search.by_ad, name="doc_search_by_ad"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/((?P<rev>[0-9-]+)/)?$', views_doc.document_main, name="doc_view"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/history/$', views_doc.document_history, name="doc_history"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/writeup/$', views_doc.document_writeup, name="doc_writeup"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/position/$', views_ballot.edit_position, name='doc_edit_position'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/emailposition/$', views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/$', views_doc.document_ballot, name="doc_ballot"),
url(r'^(?P<name>[A-Za-z0-9.-]+)/ballot/$', views_doc.document_ballot, name="doc_ballot"),
(r'^(?P<name>[A-Za-z0-9.-]+)/doc.json$', views_doc.document_debug),
(r'^(?P<name>[A-Za-z0-9.-]+)/_ballot.data$', views_doc.ballot_html), # why is this url so weird instead of just ballot.html?
(r'^(?P<name>[A-Za-z0-9.-]+)/ballot.tsv$', views_doc.ballot_tsv),
(r'^(?P<name>[A-Za-z0-9.-]+)/ballot.json$', views_doc.ballot_json),
url(r'^(?P<name>[A-Za-z0-9._-]+)/((?P<rev>[0-9-]+)/)?$', views_doc.document_main, name="doc_view"),
url(r'^(?P<name>[A-Za-z0-9._-]+)/history/$', views_doc.document_history, name="doc_history"),
url(r'^(?P<name>[A-Za-z0-9._-]+)/writeup/$', views_doc.document_writeup, name="doc_writeup"),
url(r'^(?P<name>[A-Za-z0-9._-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/position/$', views_ballot.edit_position, name='doc_edit_position'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/emailposition/$', views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/ballot/(?P<ballot_id>[A-Za-z0-9.-]+)/$', views_doc.document_ballot, name="doc_ballot"),
url(r'^(?P<name>[A-Za-z0-9._-]+)/ballot/$', views_doc.document_ballot, name="doc_ballot"),
(r'^(?P<name>[A-Za-z0-9._-]+)/doc.json$', views_doc.document_debug),
(r'^(?P<name>[A-Za-z0-9._-]+)/_ballot.data$', views_doc.ballot_html), # why is this url so weird instead of just ballot.html?
(r'^(?P<name>[A-Za-z0-9._-]+)/ballot.tsv$', views_doc.ballot_tsv),
(r'^(?P<name>[A-Za-z0-9._-]+)/ballot.json$', views_doc.ballot_json),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/state/$', views_edit.change_state, name='doc_change_state'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/info/$', views_edit.edit_info, name='doc_edit_info'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/requestresurrect/$', views_edit.request_resurrect, name='doc_request_resurrect'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/resurrect/$', views_edit.resurrect, name='doc_resurrect'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/addcomment/$', views_edit.add_comment, name='doc_add_comment'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/clearballot/$', views_ballot.clear_ballot, name='doc_clear_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/lastcalltext/$', views_ballot.lastcalltext, name='doc_ballot_lastcall'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/ballotwriteupnotes/$', views_ballot.ballot_writeupnotes, name='doc_ballot_writeupnotes'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/approvaltext/$', views_ballot.ballot_approvaltext, name='doc_ballot_approvaltext'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/approveballot/$', views_ballot.approve_ballot, name='doc_approve_ballot'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/makelastcall/$', views_ballot.make_last_call, name='doc_make_last_call'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/state/$', views_edit.change_state, name='doc_change_state'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/info/$', views_edit.edit_info, name='doc_edit_info'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/requestresurrect/$', views_edit.request_resurrect, name='doc_request_resurrect'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/resurrect/$', views_edit.resurrect, name='doc_resurrect'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/addcomment/$', views_edit.add_comment, name='doc_add_comment'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/clearballot/$', views_ballot.clear_ballot, name='doc_clear_ballot'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/lastcalltext/$', views_ballot.lastcalltext, name='doc_ballot_lastcall'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/ballotwriteupnotes/$', views_ballot.ballot_writeupnotes, name='doc_ballot_writeupnotes'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/approvaltext/$', views_ballot.ballot_approvaltext, name='doc_ballot_approvaltext'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/approveballot/$', views_ballot.approve_ballot, name='doc_approve_ballot'),
url(r'^(?P<name>[A-Za-z0-9._-]+)/edit/makelastcall/$', views_ballot.make_last_call, name='doc_make_last_call'),
(r'^(?P<name>[A-Za-z0-9.-]+)/charter/', include('ietf.wgcharter.urls')),
(r'^(?P<name>[A-Za-z0-9._-]+)/charter/', include('ietf.wgcharter.urls')),
)
urlpatterns += patterns('django.views.generic.simple',

View file

@ -55,20 +55,20 @@ from ietf.utils.history import find_history_active_at
from ietf.ietfauth.decorators import has_role
def render_document_top(request, doc, tab):
def render_document_top(request, doc, tab, name):
tabs = []
tabs.append(("Document", "document", urlreverse("ietf.idrfc.views_doc.document_main", kwargs=dict(name=doc.name)), True))
tabs.append(("Document", "document", urlreverse("ietf.idrfc.views_doc.document_main", kwargs=dict(name=name)), True))
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if doc.type_id == "draft":
# if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=doc.name)), ballot))
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=name)), ballot))
elif doc.type_id == "charter":
tabs.append(("IESG Review", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=doc.name)), ballot))
tabs.append(("IESG Review", "ballot", urlreverse("ietf.idrfc.views_doc.document_ballot", kwargs=dict(name=name)), ballot))
# FIXME: if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot:
tabs.append(("IESG Writeups", "writeup", urlreverse("ietf.idrfc.views_doc.document_writeup", kwargs=dict(name=doc.name)), True))
tabs.append(("History", "history", urlreverse("ietf.idrfc.views_doc.document_history", kwargs=dict(name=doc.name)), True))
tabs.append(("IESG Writeups", "writeup", urlreverse("ietf.idrfc.views_doc.document_writeup", kwargs=dict(name=name)), True))
tabs.append(("History", "history", urlreverse("ietf.idrfc.views_doc.document_history", kwargs=dict(name=name)), True))
name = doc.canonical_name()
if name.startswith("rfc"):
@ -120,7 +120,7 @@ def document_main(request, name, rev=None):
if gh:
group = gh
top = render_document_top(request, doc, "document")
top = render_document_top(request, doc, "document", name)
telechat = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
@ -159,9 +159,8 @@ def document_history(request, name):
if name.lower().startswith("draft") or name.lower().startswith("rfc"):
return document_main_idrfc(request, name, "history")
doc = get_object_or_404(Document, docalias__name=name)
top = render_document_top(request, doc, "history")
top = render_document_top(request, doc, "history", name)
diff_documents = [ doc ]
diff_documents.extend(Document.objects.filter(docalias__relateddocument__source=doc, docalias__relateddocument__relationship="replaces"))
@ -206,7 +205,7 @@ def document_writeup(request, name):
return document_main_idrfc(request, name, "writeup")
doc = get_object_or_404(Document, docalias__name=name)
top = render_document_top(request, doc, "writeup")
top = render_document_top(request, doc, "writeup", name)
writeups = []
if doc.type_id == "charter":
@ -328,7 +327,7 @@ def document_ballot_content(request, doc, ballot_id, editable=True):
def document_ballot(request, name, ballot_id=None):
doc = get_object_or_404(Document, docalias__name=name)
top = render_document_top(request, doc, "ballot")
top = render_document_top(request, doc, "ballot", name)
c = document_ballot_content(request, doc, ballot_id, editable=True)

View file

@ -221,11 +221,13 @@ def agenda_docs(date, next_agenda):
def agenda_wg_actions(date):
res = dict(("s%s%s%s" % (i, j, k), []) for i in range(2, 5) for j in range (1, 4) for k in range(1, 4))
charters = Document.objects.filter(type="charter", docevent__telechatdocevent__telechat_date=date).distinct()
charters = Document.objects.filter(type="charter", docevent__telechatdocevent__telechat_date=date).select_related("group").distinct()
for c in charters:
if c.latest_event(TelechatDocEvent, type="scheduled_for_telechat").telechat_date != date:
continue
c.group.txt_link = settings.CHARTER_TXT_URL + "%s-%s.txt" % (c.canonical_name(), c.rev)
section_key = "s" + get_wg_section(c.group)
if section_key not in res:
res[section_key] = []

View file

@ -193,7 +193,7 @@ INTERNET_DRAFT_PATH = '/a/www/ietf-ftp/internet-drafts/'
INTERNET_DRAFT_PDF_PATH = '/a/www/ietf-datatracker/pdf/'
RFC_PATH = '/a/www/ietf-ftp/rfc/'
CHARTER_PATH = '/a/www/ietf-ftp/charters/'
CHARTER_TXT_URL = 'http://www.ietf.org/charters/'
CHARTER_TXT_URL = 'http://www.ietf.org/charter/'
AGENDA_PATH = '/a/www/www6s/proceedings/'
AGENDA_PATH_PATTERN = '/a/www/www6s/proceedings/%(meeting)s/agenda/%(wg)s.%(ext)s'
MINUTES_PATH_PATTERN = '/a/www/www6s/proceedings/%(meeting)s/minutes/%(wg)s.%(ext)s'

View file

@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td>{{ wg.obj.parent.acronym|upper }}</td>
<td>{{ wg.obj.time|date:"M d"}}</td>
<td>
<a href="http://www.ietf.org/iesg/evaluation/charter-ietf-{{wg.obj.acronym}}-{{wg.obj.charter.rev}}.txt">
<a href="{{ wg.obj.txt_link }}">
{{ wg.obj.name|escape }} ({{wg.obj.acronym}})
</a>
</td>

View file

@ -1,10 +1,8 @@
{% load ietf_filters %}{% autoescape off %}From: The IESG <iesg-secretary@ietf.org>
To: IETF-Announce <ietf-announce@ietf.org>
To: IETF-Announce <ietf-announce@ietf.org>{% if wg.list_email %}
Cc: {{ wg.acronym }} WG <{{ wg.list_email }}> {% endif %}
Subject: WG Action: {{ action_type }} {{ wg.name }} ({{ wg.acronym }})
{% filter wordwrap:73 %}{% ifequal action_type "Formed" %}A new IETF working group has been formed in the {{ wg.parent.name }}.{% endifequal %}{% ifequal action_type "Rechartered" %}The {{ wg.name }} ({{ wg.acronym }}) working group in the {{ wg.parent.name }} of the IETF has been rechartered.{% endifequal %} For additional information please contact the Area Directors or the WG Chair{{ chairs|pluralize}}.
{% include "wgcharter/wg_info.txt" %}
{% endfilter %}
{% endautoescape %}
{% include "wgcharter/wg_info.txt" %}{% endfilter %}{% endautoescape %}

View file

@ -18,14 +18,20 @@ form #id_announcement_text {
<div class="actions">
<a href="{{ back_url }}">Back</a>
<input type="submit" name="save_text" value="Save WG {{ announcement }} announcement text" />
<input type="submit" name="regenerate_text" value="Regenerate {{ announcement }} text" />
<input type="submit" name="regenerate_text" value="Regenerate" />
<input type="submit" name="save_text" value="Save" />
</div>
{% load ietf_filters %}
{% if user|has_role:"Secretariat" %}
<h3>Secretariat actions</h3>
<div class="actions">
{% if announcement == "action" %}
<a href="{% url charter_approve name=charter.canonical_name %}">Go to charter approval page</a>
{% else %}
<input type="submit" name="send_text" value="Send WG {{ announcement }} announcement" />
{% endif %}
</div>
{% endif %}

View file

@ -19,7 +19,7 @@ form.approve .announcement {
{% endblock %}
{% block content %}
<h1>Approve {{ charter.canonical_name }}</h1>
<h1>Approve {{ charter.canonical_name }}-{{ charter.rev }}</h1>
<div>IETF announcement:</div>
@ -31,6 +31,7 @@ form.approve .announcement {
<div class="actions">
<a href="{% url doc_view name=charter.name %}">Back</a>
<a href="{% url charter_edit_announcement name=charter.canonical_name,ann="action" %}?next=approve">Go to edit/regenerate announcement page</a>
<input type="submit" value="Send out the announcement, close ballot and update revision"/>
</div>
</form>

View file

@ -1,10 +1,8 @@
{% load ietf_filters %}{% autoescape off %}From: The IESG <iesg-secretary@ietf.org>
To: IETF-Announce <ietf-announce@ietf.org>
To: IETF-Announce <ietf-announce@ietf.org>{% if wg.list_email %}
Cc: {{ wg.acronym }} WG <{{ wg.list_email }}> {% endif %}
Subject: WG Review: {{ wg.name }} ({{ wg.acronym }})
{% filter wordwrap:73 %}{% ifequal review_type "new" %}A new IETF working group has been proposed in the {{ wg.parent.name }}.{% endifequal %}{% ifequal review_type "recharter" %}The {{ wg.name }} ({{wg.acronym}}) working group in the {{ wg.parent.name }} of the IETF is undergoing rechartering.{% endifequal %} The IESG has not made any determination yet. The following draft charter was submitted, and is provided for informational purposes only. Please send your comments to the IESG mailing list (iesg at ietf.org) by {{ review_date }}.
{% include "wgcharter/wg_info.txt" %}
{% endfilter %}
{% endautoescape %}
{% include "wgcharter/wg_info.txt" %}{% endfilter %}{% endautoescape %}

View file

@ -22,3 +22,7 @@ Current Status: {{ wg.state.name }} Working Group
Charter of Working Group:
{{ charter_text }}
Milestones:
{% for milestone in milestones %} {% if milestone.done %}Done {% else %}{{ milestone.expected_due_date|date:"M Y" }}{% endif %} - {{ milestone.desc|safe }}
{% endfor %}

View file

@ -79,6 +79,7 @@ def default_action_text(wg, charter, user):
chairs=wg.role_set.filter(name="chair"),
secr=wg.role_set.filter(name="secr"),
techadv=wg.role_set.filter(name="techadv"),
milestones=wg.groupmilestone_set.all(),
ad_email=wg.ad.role_email("ad") if wg.ad else None,
action_type=action,
))
@ -98,6 +99,7 @@ def default_review_text(wg, charter, user):
chairs=wg.role_set.filter(name="chair"),
secr=wg.role_set.filter(name="secr"),
techadv=wg.role_set.filter(name="techadv"),
milestones=wg.groupmilestone_set.all(),
ad_email=wg.ad.role_email("ad") if wg.ad else None,
review_date=(datetime.date.today() + datetime.timedelta(weeks=1)).isoformat(),
review_type="new" if wg.state_id == "proposed" else "recharter",

View file

@ -7,7 +7,7 @@ urlpatterns = patterns('',
url(r'^(?P<option>initcharter|recharter|abandon)/$', "ietf.wgcharter.views.change_state", name='charter_startstop_process'),
url(r'^telechat/$', "ietf.wgcharter.views.telechat_date", name='charter_telechat_date'),
url(r'^notify/$', "ietf.wgcharter.views.edit_notify", name='charter_edit_notify'),
url(r'^(?P<ann>action|review)/$', "ietf.wgcharter.views.announcement_text"),
url(r'^(?P<ann>action|review)/$', "ietf.wgcharter.views.announcement_text", name="charter_edit_announcement"),
url(r'^ballotwriteupnotes/$', "ietf.wgcharter.views.ballot_writeupnotes"),
url(r'^approve/$', "ietf.wgcharter.views.approve", name='charter_approve'),
url(r'^submit/$', "ietf.wgcharter.views.submit", name='charter_submit'),

View file

@ -397,7 +397,11 @@ def announcement_text(request, name, ann):
charter.time = e.time
charter.save()
return redirect('doc_writeup', name=charter.name)
if request.GET.get("next", "") == "approve":
return redirect('charter_approve', name=charter.canonical_name())
return redirect('doc_writeup', name=charter.canonical_name())
if "regenerate_text" in request.POST:
if ann == "action":