Skip to content

Commit 5b7258a

Browse files
committed
Add change shepherd email page so that a document shepherd can change
the email address used for shepherding a document - Legacy-Id: 8297
1 parent 1aafd73 commit 5b7258a

6 files changed

Lines changed: 111 additions & 11 deletions

File tree

ietf/doc/tests_draft.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,9 @@ def test_doc_change_ad(self):
791791
self.assertTrue(self.doc.latest_event(DocEvent,type="added_comment").desc.startswith('Shepherding AD changed'))
792792

793793
def test_doc_change_shepherd(self):
794+
self.doc.shepherd = None
795+
self.doc.save()
796+
794797
url = urlreverse('doc_edit_shepherd',kwargs=dict(name=self.docname))
795798

796799
login_testing_unauthorized(self, "plain", url)
@@ -822,6 +825,34 @@ def test_doc_change_shepherd(self):
822825
q = PyQuery(r.content)
823826
self.assertTrue(len(q('form ul.errorlist')) > 0)
824827

828+
def test_doc_change_shepherd_email(self):
829+
self.doc.shepherd = None
830+
self.doc.save()
831+
832+
url = urlreverse('doc_change_shepherd_email',kwargs=dict(name=self.docname))
833+
r = self.client.get(url)
834+
self.assertEqual(r.status_code, 404)
835+
836+
self.doc.shepherd = Email.objects.get(person__user__username="ad1")
837+
self.doc.save()
838+
839+
login_testing_unauthorized(self, "plain", url)
840+
841+
self.doc.shepherd = Email.objects.get(person__user__username="plain")
842+
self.doc.save()
843+
844+
new_email = Email.objects.create(address="anotheremail@example.com", person=self.doc.shepherd.person)
845+
846+
r = self.client.get(url)
847+
self.assertEqual(r.status_code, 200)
848+
849+
# change the shepherd email
850+
r = self.client.post(url, dict(shepherd=new_email))
851+
self.assertEqual(r.status_code, 302)
852+
self.doc = Document.objects.get(name=self.docname)
853+
self.assertEqual(self.doc.shepherd, new_email)
854+
self.assertTrue(self.doc.latest_event(DocEvent, type="added_comment").desc.startswith('Document shepherd email changed'))
855+
825856
def test_doc_view_shepherd_writeup(self):
826857
url = urlreverse('doc_shepherd_writeup',kwargs=dict(name=self.docname))
827858

ietf/doc/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/ad/$', views_draft.edit_ad, name='doc_change_ad'),
8282
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/consensus/$', views_draft.edit_consensus, name='doc_edit_consensus'),
8383
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherd/$', views_draft.edit_shepherd, name='doc_edit_shepherd'),
84+
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherdemail/$', views_draft.change_shepherd_email, name='doc_change_shepherd_email'),
8485
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherdwriteup/$', views_draft.edit_shepherd_writeup, name='doc_edit_shepherd_writeup'),
8586
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/requestpublication/$', views_draft.request_publication, name='doc_request_publication'),
8687
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/adopt/$', views_draft.adopt_draft, name='doc_adopt_draft'),

ietf/doc/views_doc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ def document_main(request, name, rev=None):
350350
can_edit=can_edit,
351351
can_change_stream=can_change_stream,
352352
can_edit_stream_info=can_edit_stream_info,
353+
is_shepherd = user_is_person(request.user, doc.shepherd and doc.shepherd.person),
353354
can_edit_shepherd_writeup=can_edit_shepherd_writeup,
354355
can_edit_iana_state=can_edit_iana_state,
355356
can_edit_consensus=can_edit_consensus,

ietf/doc/views_draft.py

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,7 +1051,6 @@ def edit_shepherd(request, name):
10511051
doc = get_object_or_404(Document, type="draft", name=name)
10521052

10531053
can_edit_stream_info = is_authorized_in_doc_stream(request.user, doc)
1054-
10551054
if not can_edit_stream_info:
10561055
return HttpResponseForbidden("You do not have the necessary permissions to view this page")
10571056

@@ -1060,25 +1059,67 @@ def edit_shepherd(request, name):
10601059
if form.is_valid():
10611060
save_document_in_history(doc)
10621061

1063-
doc.shepherd = form.cleaned_data['shepherd']
1064-
doc.save()
1062+
if form.cleaned_data['shepherd'] != doc.shepherd:
1063+
doc.shepherd = form.cleaned_data['shepherd']
1064+
doc.save()
10651065

1066-
login = request.user.person
1067-
c = DocEvent(type="added_comment", doc=doc, by=login)
1068-
c.desc = "Document shepherd changed to "+ (doc.shepherd.person.name if doc.shepherd else "(None)")
1069-
c.save()
1066+
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
1067+
c.desc = "Document shepherd changed to "+ (doc.shepherd.person.name if doc.shepherd else "(None)")
1068+
c.save()
10701069

10711070
return redirect('doc_view', name=doc.name)
10721071

10731072
else:
1074-
init = { "shepherd": doc.shepherd_id }
1075-
form = ShepherdForm(initial=init)
1073+
form = ShepherdForm(initial={ "shepherd": doc.shepherd_id })
10761074

10771075
return render(request, 'doc/change_shepherd.html', {
10781076
'form': form,
10791077
'doc': doc,
10801078
})
10811079

1080+
class ChangeShepherdEmailForm(forms.Form):
1081+
shepherd = forms.ModelChoiceField(queryset=Email.objects.all(), label="Shepherd email", empty_label=None)
1082+
1083+
def __init__(self, *args, **kwargs):
1084+
super(ChangeShepherdEmailForm, self).__init__(*args, **kwargs)
1085+
self.fields["shepherd"].queryset = self.fields["shepherd"].queryset.filter(person__email=self.initial["shepherd"]).distinct()
1086+
1087+
def change_shepherd_email(request, name):
1088+
"""Change the shepherd email address for a Document"""
1089+
doc = get_object_or_404(Document, name=name)
1090+
1091+
if not doc.shepherd:
1092+
raise Http404
1093+
1094+
can_edit_stream_info = is_authorized_in_doc_stream(request.user, doc)
1095+
is_shepherd = user_is_person(request.user, doc.shepherd and doc.shepherd.person)
1096+
if not can_edit_stream_info and not is_shepherd:
1097+
return HttpResponseForbidden("You do not have the necessary permissions to view this page")
1098+
1099+
initial = { "shepherd": doc.shepherd_id }
1100+
if request.method == 'POST':
1101+
form = ChangeShepherdEmailForm(request.POST, initial=initial)
1102+
if form.is_valid():
1103+
if form.cleaned_data['shepherd'] != doc.shepherd:
1104+
save_document_in_history(doc)
1105+
1106+
doc.shepherd = form.cleaned_data['shepherd']
1107+
doc.save()
1108+
1109+
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
1110+
c.desc = "Document shepherd email changed"
1111+
c.save()
1112+
1113+
return redirect('doc_view', name=doc.name)
1114+
1115+
else:
1116+
form = ChangeShepherdEmailForm(initial=initial)
1117+
1118+
return render(request, 'doc/change_shepherd_email.html', {
1119+
'form': form,
1120+
'doc': doc,
1121+
})
1122+
10821123
class AdForm(forms.Form):
10831124
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'),
10841125
label="Shepherding AD", empty_label="(None)", required=True)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{% extends "base.html" %}
2+
3+
{% block title %}
4+
Change the document shepherd email for {{ doc.name }}-{{ doc.rev }}
5+
{% endblock %}
6+
7+
{% block pagehead %}
8+
<link rel="stylesheet" type="text/css" href="/css/token-input.css"></link>
9+
{% endblock %}
10+
11+
{% block content %}
12+
<h1>Change the document shepherd email for {{ doc.name }}-{{ doc.rev }}</h1>
13+
14+
<form class="edit-info" method="post">{% csrf_token %}
15+
<table>
16+
{{ form.as_table }}
17+
<tr>
18+
<td></td>
19+
<td class="actions">
20+
<a class="button" href="{% url "doc_view" name=doc.name %}">Cancel</a>
21+
<input class="button" type="submit" value="Save"/>
22+
</td>
23+
</tr>
24+
</table>
25+
</form>
26+
{% endblock %}

ietf/templates/doc/document_draft.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@
131131
<tr>
132132
<td>Document shepherd:</td>
133133
<td>
134-
<a {% if can_edit_stream_info %}class="editlink" href="{% url "doc_edit_shepherd" name=doc.name %}"{% endif %}>
135-
{% if doc.shepherd %}{{ doc.shepherd.person }}{% else %}No shepherd assigned{% endif %}
134+
<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 %}>
135+
{% if doc.shepherd %}{{ doc.shepherd.person }}{% else %}No shepherd assigned{% endif %}
136136
</a>
137137
</td>
138138
</tr>

0 commit comments

Comments
 (0)