Add change shepherd email page so that a document shepherd can change

the email address used for shepherding a document
 - Legacy-Id: 8297
This commit is contained in:
Ole Laursen 2014-08-25 22:59:33 +00:00
parent 1aafd73ec1
commit 5b7258ae12
6 changed files with 111 additions and 11 deletions

View file

@ -791,6 +791,9 @@ class IndividualInfoFormsTests(TestCase):
self.assertTrue(self.doc.latest_event(DocEvent,type="added_comment").desc.startswith('Shepherding AD changed'))
def test_doc_change_shepherd(self):
self.doc.shepherd = None
self.doc.save()
url = urlreverse('doc_edit_shepherd',kwargs=dict(name=self.docname))
login_testing_unauthorized(self, "plain", url)
@ -822,6 +825,34 @@ class IndividualInfoFormsTests(TestCase):
q = PyQuery(r.content)
self.assertTrue(len(q('form ul.errorlist')) > 0)
def test_doc_change_shepherd_email(self):
self.doc.shepherd = None
self.doc.save()
url = urlreverse('doc_change_shepherd_email',kwargs=dict(name=self.docname))
r = self.client.get(url)
self.assertEqual(r.status_code, 404)
self.doc.shepherd = Email.objects.get(person__user__username="ad1")
self.doc.save()
login_testing_unauthorized(self, "plain", url)
self.doc.shepherd = Email.objects.get(person__user__username="plain")
self.doc.save()
new_email = Email.objects.create(address="anotheremail@example.com", person=self.doc.shepherd.person)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
# change the shepherd email
r = self.client.post(url, dict(shepherd=new_email))
self.assertEqual(r.status_code, 302)
self.doc = Document.objects.get(name=self.docname)
self.assertEqual(self.doc.shepherd, new_email)
self.assertTrue(self.doc.latest_event(DocEvent, type="added_comment").desc.startswith('Document shepherd email changed'))
def test_doc_view_shepherd_writeup(self):
url = urlreverse('doc_shepherd_writeup',kwargs=dict(name=self.docname))

View file

@ -81,6 +81,7 @@ urlpatterns = patterns('',
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/ad/$', views_draft.edit_ad, name='doc_change_ad'),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/consensus/$', views_draft.edit_consensus, name='doc_edit_consensus'),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherd/$', views_draft.edit_shepherd, name='doc_edit_shepherd'),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherdemail/$', views_draft.change_shepherd_email, name='doc_change_shepherd_email'),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherdwriteup/$', views_draft.edit_shepherd_writeup, name='doc_edit_shepherd_writeup'),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/requestpublication/$', views_draft.request_publication, name='doc_request_publication'),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/adopt/$', views_draft.adopt_draft, name='doc_adopt_draft'),

View file

@ -350,6 +350,7 @@ def document_main(request, name, rev=None):
can_edit=can_edit,
can_change_stream=can_change_stream,
can_edit_stream_info=can_edit_stream_info,
is_shepherd = user_is_person(request.user, doc.shepherd and doc.shepherd.person),
can_edit_shepherd_writeup=can_edit_shepherd_writeup,
can_edit_iana_state=can_edit_iana_state,
can_edit_consensus=can_edit_consensus,

View file

@ -1051,7 +1051,6 @@ def edit_shepherd(request, name):
doc = get_object_or_404(Document, type="draft", name=name)
can_edit_stream_info = is_authorized_in_doc_stream(request.user, doc)
if not can_edit_stream_info:
return HttpResponseForbidden("You do not have the necessary permissions to view this page")
@ -1060,25 +1059,67 @@ def edit_shepherd(request, name):
if form.is_valid():
save_document_in_history(doc)
doc.shepherd = form.cleaned_data['shepherd']
doc.save()
if form.cleaned_data['shepherd'] != doc.shepherd:
doc.shepherd = form.cleaned_data['shepherd']
doc.save()
login = request.user.person
c = DocEvent(type="added_comment", doc=doc, by=login)
c.desc = "Document shepherd changed to "+ (doc.shepherd.person.name if doc.shepherd else "(None)")
c.save()
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c.desc = "Document shepherd changed to "+ (doc.shepherd.person.name if doc.shepherd else "(None)")
c.save()
return redirect('doc_view', name=doc.name)
else:
init = { "shepherd": doc.shepherd_id }
form = ShepherdForm(initial=init)
form = ShepherdForm(initial={ "shepherd": doc.shepherd_id })
return render(request, 'doc/change_shepherd.html', {
'form': form,
'doc': doc,
})
class ChangeShepherdEmailForm(forms.Form):
shepherd = forms.ModelChoiceField(queryset=Email.objects.all(), label="Shepherd email", empty_label=None)
def __init__(self, *args, **kwargs):
super(ChangeShepherdEmailForm, self).__init__(*args, **kwargs)
self.fields["shepherd"].queryset = self.fields["shepherd"].queryset.filter(person__email=self.initial["shepherd"]).distinct()
def change_shepherd_email(request, name):
"""Change the shepherd email address for a Document"""
doc = get_object_or_404(Document, name=name)
if not doc.shepherd:
raise Http404
can_edit_stream_info = is_authorized_in_doc_stream(request.user, doc)
is_shepherd = user_is_person(request.user, doc.shepherd and doc.shepherd.person)
if not can_edit_stream_info and not is_shepherd:
return HttpResponseForbidden("You do not have the necessary permissions to view this page")
initial = { "shepherd": doc.shepherd_id }
if request.method == 'POST':
form = ChangeShepherdEmailForm(request.POST, initial=initial)
if form.is_valid():
if form.cleaned_data['shepherd'] != doc.shepherd:
save_document_in_history(doc)
doc.shepherd = form.cleaned_data['shepherd']
doc.save()
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c.desc = "Document shepherd email changed"
c.save()
return redirect('doc_view', name=doc.name)
else:
form = ChangeShepherdEmailForm(initial=initial)
return render(request, 'doc/change_shepherd_email.html', {
'form': form,
'doc': doc,
})
class AdForm(forms.Form):
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'),
label="Shepherding AD", empty_label="(None)", required=True)

View file

@ -0,0 +1,26 @@
{% extends "base.html" %}
{% block title %}
Change the document shepherd email for {{ doc.name }}-{{ doc.rev }}
{% endblock %}
{% block pagehead %}
<link rel="stylesheet" type="text/css" href="/css/token-input.css"></link>
{% endblock %}
{% block content %}
<h1>Change the document shepherd email for {{ doc.name }}-{{ doc.rev }}</h1>
<form class="edit-info" method="post">{% csrf_token %}
<table>
{{ form.as_table }}
<tr>
<td></td>
<td class="actions">
<a class="button" href="{% url "doc_view" name=doc.name %}">Cancel</a>
<input class="button" type="submit" value="Save"/>
</td>
</tr>
</table>
</form>
{% endblock %}

View file

@ -131,8 +131,8 @@
<tr>
<td>Document shepherd:</td>
<td>
<a {% if can_edit_stream_info %}class="editlink" href="{% url "doc_edit_shepherd" name=doc.name %}"{% endif %}>
{% if doc.shepherd %}{{ doc.shepherd.person }}{% else %}No shepherd assigned{% endif %}
<a {% if can_edit_stream_info or is_shepherd %}class="editlink" href="{% if can_edit_stream_info %}{% url "doc_edit_shepherd" name=doc.name %}{% elif is_shepherd %}{% url "doc_change_shepherd_email" name=doc.name %}{% endif %}"{% endif %}>
{% if doc.shepherd %}{{ doc.shepherd.person }}{% else %}No shepherd assigned{% endif %}
</a>
</td>
</tr>