Merged [2412], [2413] and [2480] from rjsparks@nostrum.com, from log:sprint/78/rjs@2480. Splits the ballot writeups page into three pages, for a more understandable user interface.

- Legacy-Id: 2517
Note: SVN reference [2412] has been migrated to Git commit f87a9376b985814435b1e9b8bb5d73a45fd7292d

Note: SVN reference [2413] has been migrated to Git commit 6835826cb3d5ad1e1558b828bd9d349d5feffa98

Note: SVN reference [2480] has been migrated to Git commit ec80763835dbaad0c68c3bdaee41fdeb92876897
This commit is contained in:
Henrik Levkowetz 2010-09-16 10:04:48 +00:00
parent 02b8e54fa4
commit 28e0f982c5
8 changed files with 231 additions and 27 deletions

View file

@ -526,7 +526,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
def test_edit_last_call_text(self):
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
url = urlreverse('doc_ballot_writeups', kwargs=dict(name=draft.filename))
url = urlreverse('doc_ballot_lastcall', kwargs=dict(name=draft.filename))
login_testing_unauthorized(self, "klm", url)
# normal get
@ -563,7 +563,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
def test_request_last_call(self):
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
url = urlreverse('doc_ballot_writeups', kwargs=dict(name=draft.filename))
url = urlreverse('doc_ballot_lastcall', kwargs=dict(name=draft.filename))
login_testing_unauthorized(self, "klm", url)
mailbox_before = len(mail_outbox)
@ -580,7 +580,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
def test_edit_ballot_writeup(self):
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
url = urlreverse('doc_ballot_writeups', kwargs=dict(name=draft.filename))
url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.filename))
login_testing_unauthorized(self, "klm", url)
# normal get
@ -600,7 +600,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
def test_issue_ballot(self):
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
url = urlreverse('doc_ballot_writeups', kwargs=dict(name=draft.filename))
url = urlreverse('doc_ballot_writeupnotes', kwargs=dict(name=draft.filename))
login_testing_unauthorized(self, "rhousley", url)
draft.idinternal.ballot.ballot_issued = False
@ -635,7 +635,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
def test_edit_approval_text(self):
draft = InternetDraft.objects.get(filename="draft-ietf-mipshop-pfmipv6")
url = urlreverse('doc_ballot_writeups', kwargs=dict(name=draft.filename))
url = urlreverse('doc_ballot_approvaltext', kwargs=dict(name=draft.filename))
login_testing_unauthorized(self, "klm", url)
# normal get

View file

@ -55,7 +55,9 @@ urlpatterns = patterns('',
url(r'^(?P<name>[^/]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'),
url(r'^(?P<name>[^/]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'),
url(r'^(?P<name>[^/]+)/edit/sendballotcomment/$', views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
url(r'^(?P<name>[^/]+)/edit/ballotwriteups/$', views_ballot.ballot_writeups, name='doc_ballot_writeups'),
url(r'^(?P<name>[^/]+)/edit/lastcalltext/$', views_ballot.lastcalltext, name='doc_ballot_lastcall'),
url(r'^(?P<name>[^/]+)/edit/ballotwriteupnotes/$', views_ballot.ballot_writeupnotes, name='doc_ballot_writeupnotes'),
url(r'^(?P<name>[^/]+)/edit/approvaltext/$', views_ballot.ballot_approvaltext, name='doc_ballot_approvaltext'),
url(r'^(?P<name>[^/]+)/edit/approveballot/$', views_ballot.approve_ballot, name='doc_approve_ballot'),
url(r'^(?P<name>[^/]+)/edit/makelastcall/$', views_ballot.make_last_call, name='doc_make_last_call'),
)

View file

@ -311,8 +311,8 @@ class ApprovalTextForm(forms.ModelForm):
return self.cleaned_data["approval_text"].replace("\r", "")
@group_required('Area_Director','Secretariat')
def ballot_writeups(request, name):
"""Editing of ballot write-ups, sending last calls, ..."""
def lastcalltext(request, name):
"""Editing of the last call text"""
doc = get_object_or_404(InternetDraft, filename=name)
if not doc.idinternal:
raise Http404()
@ -325,8 +325,6 @@ def ballot_writeups(request, name):
ballot = generate_ballot(request, doc)
last_call_form = LastCallTextForm(instance=ballot)
ballot_writeup_form = BallotWriteupForm(instance=ballot)
approval_text_form = ApprovalTextForm(instance=ballot)
if request.method == 'POST':
if "save_last_call_text" in request.POST or "send_last_call_request" in request.POST:
@ -356,6 +354,43 @@ def ballot_writeups(request, name):
# make sure form has the updated text
last_call_form = LastCallTextForm(instance=ballot)
doc.idinternal.event_date = date.today()
doc.idinternal.save()
can_request_last_call = doc.idinternal.cur_state_id < 27
can_make_last_call = doc.idinternal.cur_state_id < 20
can_announce = doc.idinternal.cur_state_id > 19
docs_with_invalid_status = [d.document().file_tag() for d in doc.idinternal.ballot_set() if "None" in d.document().intended_status.intended_status or "Request" in d.document().intended_status.intended_status]
need_intended_status = ", ".join(docs_with_invalid_status)
return render_to_response('idrfc/ballot_lastcalltext.html',
dict(doc=doc,
ballot=ballot,
last_call_form=last_call_form,
can_request_last_call=can_request_last_call,
can_make_last_call=can_make_last_call,
need_intended_status=need_intended_status,
),
context_instance=RequestContext(request))
@group_required('Area_Director','Secretariat')
def ballot_writeupnotes(request, name):
"""Editing of ballot write-up and notes"""
doc = get_object_or_404(InternetDraft, filename=name)
if not doc.idinternal:
raise Http404()
login = IESGLogin.objects.get(login_name=request.user.username)
try:
ballot = doc.idinternal.ballot
except BallotInfo.DoesNotExist:
ballot = generate_ballot(request, doc)
ballot_writeup_form = BallotWriteupForm(instance=ballot)
if request.method == 'POST':
if "save_ballot_writeup" in request.POST:
ballot_writeup_form = BallotWriteupForm(request.POST, instance=ballot)
if ballot_writeup_form.is_valid():
@ -398,6 +433,38 @@ def ballot_writeups(request, name):
context_instance=RequestContext(request))
doc.idinternal.event_date = date.today()
doc.idinternal.save()
docs_with_invalid_status = [d.document().file_tag() for d in doc.idinternal.ballot_set() if "None" in d.document().intended_status.intended_status or "Request" in d.document().intended_status.intended_status]
need_intended_status = ", ".join(docs_with_invalid_status)
return render_to_response('idrfc/ballot_writeupnotes.html',
dict(doc=doc,
ballot=ballot,
ballot_writeup_form=ballot_writeup_form,
need_intended_status=need_intended_status,
),
context_instance=RequestContext(request))
@group_required('Area_Director','Secretariat')
def ballot_approvaltext(request, name):
"""Editing of approval text"""
doc = get_object_or_404(InternetDraft, filename=name)
if not doc.idinternal:
raise Http404()
login = IESGLogin.objects.get(login_name=request.user.username)
try:
ballot = doc.idinternal.ballot
except BallotInfo.DoesNotExist:
ballot = generate_ballot(request, doc)
approval_text_form = ApprovalTextForm(instance=ballot)
if request.method == 'POST':
if "save_approval_text" in request.POST:
approval_text_form = ApprovalTextForm(request.POST, instance=ballot)
if approval_text_form.is_valid():
@ -414,20 +481,14 @@ def ballot_writeups(request, name):
doc.idinternal.event_date = date.today()
doc.idinternal.save()
can_request_last_call = doc.idinternal.cur_state_id < 27
can_make_last_call = doc.idinternal.cur_state_id < 20
can_announce = doc.idinternal.cur_state_id > 19
docs_with_invalid_status = [d.document().file_tag() for d in doc.idinternal.ballot_set() if "None" in d.document().intended_status.intended_status or "Request" in d.document().intended_status.intended_status]
need_intended_status = ", ".join(docs_with_invalid_status)
return render_to_response('idrfc/ballot_writeups.html',
return render_to_response('idrfc/ballot_approvaltext.html',
dict(doc=doc,
ballot=ballot,
last_call_form=last_call_form,
ballot_writeup_form=ballot_writeup_form,
approval_text_form=approval_text_form,
can_request_last_call=can_request_last_call,
can_make_last_call=can_make_last_call,
can_announce=can_announce,
need_intended_status=need_intended_status,
),

View file

@ -0,0 +1,36 @@
{% extends "base.html" %}
{% block title %}Approval announcement writeup for {{ doc }}{% endblock %}
{% block morecss %}
form #id_approval_text {
width: 700px;
height: 600px;
}
{% endblock %}
{% block content %}
<h1>Approval announcement writeup for {{ doc }}</h1>
<form action="" method="POST">
<p>Sent after approval.</p>
{{ approval_text_form.approval_text }}
<div class="actions">
<a href="{{ doc.idinternal.get_absolute_url }}">Back</a>
<input type="submit" name="save_approval_text" value="Save Approval Announcement Text" />
<input type="submit" name="regenerate_approval_text" value="Regenerate Approval Announcement Text" />
</div>
</form>
{% load ietf_filters %}
{% if user|in_group:"Secretariat" %}
<p>
{% if can_announce %}
<a href="{% url doc_approve_ballot name=doc.filename %}">Approve ballot</a>
{% endif %}
</p>
{% endif %}
{% endblock%}

View file

@ -0,0 +1,46 @@
{% extends "base.html" %}
{% block title %}Last Call text for {{ doc }}{% endblock %}
{% block morecss %}
form #id_last_call_text {
width: 700px;
height: 600px;
}
{% endblock %}
{% block content %}
<h1>Last Call text for {{ doc }}</h1>
<form action="" method="POST">
<p>{{ last_call_form.last_call_text.errors }}</p>
{{ last_call_form.last_call_text }}
<p>{{ last_call_form.last_call_text.errors }}</p>
{% if can_request_last_call and need_intended_status %}
<p>You need to select intended status of {{ need_intended_status }} and regenerate last call text to request last call.</p>
{% endif %}
<div class="actions">
<a href="{{ doc.idinternal.get_absolute_url }}">Back</a>
<input type="submit" name="save_last_call_text" value="Save Last Call Text" />
<input type="submit" name="regenerate_last_call_text" value="Regenerate Last Call Text" />
{% if can_request_last_call and not need_intended_status %}
<input style="margin-left: 8px" type="submit" name="send_last_call_request" value="Save and Request Last Call" />
{% endif %}
</div>
</form>
{% load ietf_filters %}
{% if user|in_group:"Secretariat" %}
<p>
{% if can_make_last_call %}
<a href="{% url doc_make_last_call name=doc.filename %}">Make Last Call</a>
{% endif %}
</p>
{% endif %}
{% endblock%}

View file

@ -0,0 +1,34 @@
{% extends "base.html" %}
{% block title %}Ballot writeup and notes for {{ doc }}{% endblock %}
{% block morecss %}
form #id_ballot_writeup {
width: 700px;
height: 600px;
}
{% endblock %}
{% block content %}
<h1>Ballot writeup and notes for {{ doc }}</h1>
<form action="" method="POST">
<p>(Technical Summary, Working Group Summary, Document Quality,
Personnel, RFC Editor Note, IRTF Note, IESG Note, IANA Note)</p>
<p>This text will be appended to all announcements and messages to
the IRTF or RFC Editor.</p>
{{ ballot_writeup_form.ballot_writeup }}
<div class="actions">
<a href="{{ doc.idinternal.get_absolute_url }}">Back</a>
<input type="submit" name="save_ballot_writeup" value="Save Ballot Writeup" />
<input style="margin-left: 8px" type="submit" name="issue_ballot" value="Save and {% if ballot.ballot_issued %}Re-{% endif %}Issue Ballot" />
</div>
</form>
{% endblock%}

View file

@ -95,9 +95,6 @@ div.diffTool { padding: 8px 4px; margin: 8px 0;}
<span id="doc_edit_state_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url doc_change_state name=doc.draft_name %}">Change state</a></span></span>
<span id="doc_edit_info_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url doc_edit_info name=doc.draft_name %}">Edit</a></span></span>
{% if not doc.ietf_process_has_iesg_ballot %}
<span id="doc_edit_info_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url doc_ballot_writeups name=doc.draft_name %}">Ballot Writeups</a></span></span>
{% endif %}
{% else %}
<span id="doc_add_button" class="yui-button yui-link-button" style="margin-left:2px;"><span class="first-child"><a href="{% url doc_edit_info name=doc.draft_name %}">Add</a></span></span>
{% endif %}
@ -133,20 +130,39 @@ div.diffTool { padding: 8px 4px; margin: 8px 0;}
<div id="writeup">
<div id="writeup_content">
---- following is a DRAFT of message to be sent AFTER approval ---
{% if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot %}
{% if user|in_group:"Area_Director,Secretariat" %}
<div style="margin-bottom:8px;">
<span id="doc_writeup_edit_button" class="yui-button yui-link-button"><span class="first-child">
<a href="{% url doc_ballot_writeups name=doc.draft_name %}">Ballot write-ups</a>
</span></span></div>
{% endif %}{# user in_group #}
---- following is a DRAFT of message to be sent AFTER approval ---
<div style="background:#E0E0FF">
<p align=right>
<span id="doc_edit_announce_button" class="yui-button yui-link-button"><span class="first-child">
<a href="{% url doc_ballot_approvaltext name=doc.draft_name %}">Edit Announcement Text</a>
</span></span>
</p>
{% endif %}
{% endif %}
<pre>
{{ doc.ietf_process.iesg_ballot.approval_text|escape|urlize }}
</pre>
{% if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot %}
{% if user|in_group:"Area_Director,Secretariat" %}
</div>
<div style="background:#E0E0FF">
<p align=right>
<span id="doc_ballot_edit_button" class="yui-button yui-link-button"><span class="first-child">
<a href="{% url doc_ballot_writeupnotes name=doc.draft_name %}">Edit Ballot Text</a>
</span></span>
</p>
{% endif %}
{% endif %}
<pre>
{{ doc.ietf_process.iesg_ballot.ballot_writeup|escape|urlize }}
</pre>
{% if doc.in_ietf_process and doc.ietf_process.has_iesg_ballot %}
{% if user|in_group:"Area_Director,Secretariat" %}
</div>
{% endif %}
{% endif %}
</div>
</div>

View file

@ -76,11 +76,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endblock doc_metatable %}
{% block doc_metalinks %}
<a href="mailto:{{doc.draft_name}}@tools.ietf.org?subject=Mail%20regarding%20{{doc.draft_name}}" rel="nofollow">Email Authors</a>
<div>
<a href="mailto:{{doc.draft_name}}@tools.ietf.org?subject=Mail%20regarding%20{{doc.draft_name}}" rel="nofollow">Email Authors</a>
| <a href="/ipr/search/?option=document_search&amp;id_document_tag={{doc.tracker_id}}" rel="nofollow">IPR Disclosures</a>
| <a href="http://www.fenron.net/~fenner/ietf/deps/index.cgi?dep={{doc.draft_name}}" rel="nofollow">Dependencies to this draft</a>
| <a href="http://tools.ietf.org/idnits?url=http://tools.ietf.org/id/{{doc.draft_name_and_revision}}.txt" rel="nofollow" target="_blank">Check nits</a>
{% if doc.in_ietf_process %}| <a href="/feed/comments/{% if info.is_rfc %}rfc{{doc.rfc_number}}{% else %}{{doc.draft_name}}{% endif %}/">Comments feed</a>{% endif %}
</div>
{% if user|in_group:"Area_Director,Secretariat" %}
<div>
<a href="{% url doc_ballot_lastcall name=doc.draft_name %}">Last Call Text</a>
| <a href="{% url doc_ballot_writeupnotes name=doc.draft_name %}">Ballot Text</a>
| <a href="{% url doc_ballot_approvaltext name=doc.draft_name %}">Announcement Text</a>
</div>
{% endif %}
{% endblock %}
{% block doc_text1 %}