Merged [5570] from rjsparks@nostrum.com:
Moves the interface to edit shepherds and sheperd writeups out of the wgtracker interface and into the doc views (via idrfc). Added a little to the simple authorization code (can_edit_) in idrfc. Added a way to reset the writeup to the current templates (leaving extension points to take templates for non-ietf stream documents). Fixes bug #967. Implementation notes: Currently reused EmailsField -- in the long run a better approach will be to build a similar PersonField. This also fixes tickets #834 and #691 (which were effectively duplicates of #967) - Legacy-Id: 5631 Note: SVN reference [5570] has been migrated to Git commit 3bc9e9a7add65bf135d669381cb5d93c5a2e3e19
This commit is contained in:
parent
68b697ccfc
commit
becd10a81d
|
@ -1366,6 +1366,89 @@ class IndividualInfoFormsTestCase(django.test.TestCase):
|
|||
self.assertEquals(self.doc.ad,ad2)
|
||||
self.assertTrue(self.doc.latest_event(DocEvent,type="added_comment").desc.startswith('Shepherding AD changed'))
|
||||
|
||||
def test_doc_change_shepherd(self):
|
||||
url = urlreverse('doc_edit_shepherd',kwargs=dict(name=self.docname))
|
||||
|
||||
login_testing_unauthorized(self, "plain", url)
|
||||
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code,403)
|
||||
|
||||
# get as the secretariat (and remain secretariat)
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code,200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form input[id=id_shepherd]')),1)
|
||||
|
||||
# change the shepherd
|
||||
plain = Person.objects.get(name='Plain Man')
|
||||
plain_email = plain.email_set.all()[0]
|
||||
r = self.client.post(url,dict(shepherd=plain_email))
|
||||
self.assertEquals(r.status_code,302)
|
||||
self.doc = Document.objects.get(name=self.docname)
|
||||
self.assertEquals(self.doc.shepherd,plain)
|
||||
self.assertTrue(self.doc.latest_event(DocEvent,type="added_comment").desc.startswith('Document shepherd changed to Plain Man'))
|
||||
|
||||
ad = Person.objects.get(name='Aread Irector')
|
||||
two_answers = "%s,%s" % (plain_email, ad.email_set.all()[0])
|
||||
r = self.client.post(url,(dict(shepherd=two_answers)))
|
||||
self.assertEquals(r.status_code,200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(len(q('form ul.errorlist')) > 0)
|
||||
|
||||
def test_doc_view_shepherd_writeup(self):
|
||||
url = urlreverse('doc_shepherd_writeup',kwargs=dict(name=self.docname))
|
||||
|
||||
# get as a shepherd
|
||||
self.client.login(remote_user="plain")
|
||||
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code,200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('span[id=doc_edit_shepherd_writeup]')),1)
|
||||
|
||||
# Try again when no longer a shepherd.
|
||||
|
||||
self.doc.shepherd = None
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code,200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('span[id=doc_edit_shepherd_writeup]')),1)
|
||||
|
||||
def test_doc_change_shepherd_writeup(self):
|
||||
url = urlreverse('doc_edit_shepherd_writeup',kwargs=dict(name=self.docname))
|
||||
|
||||
# get
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code,200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('form textarea[id=id_content]')),1)
|
||||
|
||||
# direct edit
|
||||
r = self.client.post(url,dict(content='here is a new writeup',submit_response="1"))
|
||||
print r.content
|
||||
self.assertEquals(r.status_code,302)
|
||||
self.doc = Document.objects.get(name=self.docname)
|
||||
self.assertTrue(self.doc.latest_event(WriteupDocEvent,type="changed_protocol_writeup").text.startswith('here is a new writeup'))
|
||||
|
||||
# file upload
|
||||
test_file = StringIO.StringIO("This is a different writeup.")
|
||||
test_file.name = "unnamed"
|
||||
r = self.client.post(url,dict(txt=test_file,submit_response="1"))
|
||||
self.assertEquals(r.status_code, 302)
|
||||
doc = Document.objects.get(name=self.docname)
|
||||
self.assertTrue(self.doc.latest_event(WriteupDocEvent,type="changed_protocol_writeup").text.startswith('This is a different writeup.'))
|
||||
|
||||
# template reset
|
||||
r = self.client.post(url,dict(txt=test_file,reset_text="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue(q('textarea')[0].text.startswith("As required by RFC 4858"))
|
||||
|
||||
def setUp(self):
|
||||
make_test_data()
|
||||
self.docname='draft-ietf-mars-test'
|
||||
|
|
|
@ -49,6 +49,7 @@ urlpatterns = patterns('',
|
|||
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._+-]+)/shepherdwriteup/$', views_doc.document_shepherd_writeup, name="doc_shepherd_writeup"),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/ballot/(?P<ballot_id>[0-9]+)/position/$', views_ballot.edit_position),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/ballot/(?P<ballot_id>[0-9]+)/emailposition/$', views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/ballot/(?P<ballot_id>[0-9]+)/$', views_doc.document_ballot, name="doc_ballot"),
|
||||
|
@ -72,6 +73,8 @@ urlpatterns = patterns('',
|
|||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/iesgnote/$', views_edit.edit_iesg_note, name='doc_change_iesg_note'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/ad/$', views_edit.edit_ad, name='doc_change_ad'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/consensus/$', views_edit.edit_consensus, name='doc_edit_consensus'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherd/$', views_edit.edit_shepherd, name='doc_edit_shepherd'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/shepherdwriteup/$', views_edit.edit_shepherd_writeup, name='doc_edit_shepherd_writeup'),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/requestpublication/$', views_edit.request_publication, name='doc_request_publication'),
|
||||
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/clearballot/$', views_ballot.clear_ballot, name='doc_clear_ballot'),
|
||||
|
|
|
@ -177,16 +177,20 @@ def update_telechatREDESIGN(request, doc, by, new_telechat_date, new_returning_i
|
|||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
update_telechat = update_telechatREDESIGN
|
||||
|
||||
def can_edit_intended_std_level(doc, user):
|
||||
def can_edit_base(doc, user):
|
||||
return user.is_authenticated() and (
|
||||
has_role(user, ["Secretariat", "Area Director"]) or
|
||||
doc.group.role_set.filter(name__in=("chair", "auth", "delegate"), person__user=user)
|
||||
)
|
||||
|
||||
def can_edit_consensus(doc, user):
|
||||
can_edit_intended_std_level = can_edit_base
|
||||
can_edit_consensus = can_edit_base
|
||||
can_edit_shepherd = can_edit_base
|
||||
|
||||
def can_edit_shepherd_writeup(doc, user):
|
||||
return user.is_authenticated() and (
|
||||
has_role(user, ["Secretariat", "Area Director"]) or
|
||||
doc.group.role_set.filter(name__in=("chair", "auth", "delegate"), person__user=user)
|
||||
can_edit_base(doc,user) or
|
||||
(doc.shepherd==user.person)
|
||||
)
|
||||
|
||||
def nice_consensus(consensus):
|
||||
|
|
|
@ -317,6 +317,21 @@ def document_writeup(request, name):
|
|||
),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
def document_shepherd_writeup(request, name):
|
||||
doc = get_object_or_404(Document, docalias__name=name)
|
||||
lastwriteup = doc.latest_event(WriteupDocEvent,type="changed_protocol_writeup")
|
||||
if lastwriteup:
|
||||
writeup_text = lastwriteup.text
|
||||
else:
|
||||
writeup_text = "(There is no shepherd's writeup available for this document)"
|
||||
return render_to_response("idrfc/shepherd_writeup.html",
|
||||
dict(doc=doc,
|
||||
writeup=writeup_text,
|
||||
can_edit=can_edit_shepherd_writeup(doc,request.user)
|
||||
),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_ballot_content(request, doc, ballot_id, editable=True):
|
||||
"""Render HTML string with content of ballot page."""
|
||||
all_ballots = list(BallotDocEvent.objects.filter(doc=doc, type="created_ballot").order_by("time"))
|
||||
|
@ -501,6 +516,7 @@ def document_main_idrfc(request, name, tab):
|
|||
info["consensus"] = nice_consensus(e and e.consensus)
|
||||
info["can_edit_consensus"] = can_edit_consensus(id, request.user)
|
||||
info["can_edit_intended_std_level"] = can_edit_intended_std_level(id, request.user)
|
||||
info["can_edit_shepherd"] = can_edit_shepherd(id, request.user)
|
||||
|
||||
(content1, content2) = _get_html(
|
||||
str(name)+","+str(id.revision)+",html",
|
||||
|
|
|
@ -23,6 +23,9 @@ from ietf.iesg.models import *
|
|||
from ietf.idrfc.mails import *
|
||||
from ietf.idrfc.utils import *
|
||||
from ietf.idrfc.lastcall import request_last_call
|
||||
from ietf.utils.textupload import get_cleaned_text_file_content
|
||||
from ietf.person.forms import EmailsField
|
||||
|
||||
|
||||
from ietf.ietfworkflows.models import Stream
|
||||
from ietf.ietfworkflows.utils import update_stream
|
||||
|
@ -866,6 +869,122 @@ def edit_iesg_note(request, name):
|
|||
),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
class ShepherdWriteupUploadForm(forms.Form):
|
||||
content = forms.CharField(widget=forms.Textarea, label="Shepherd writeup", help_text="Edit the shepherd writeup", required=False)
|
||||
txt = forms.FileField(label=".txt format", help_text="Or upload a .txt file", required=False)
|
||||
|
||||
def clean_content(self):
|
||||
return self.cleaned_data["content"].replace("\r", "")
|
||||
|
||||
def clean_txt(self):
|
||||
return get_cleaned_text_file_content(self.cleaned_data["txt"])
|
||||
|
||||
def edit_shepherd_writeup(request, name):
|
||||
"""Change this document's shepherd writeup"""
|
||||
doc = get_object_or_404(Document, type="draft", name=name)
|
||||
|
||||
if not can_edit_shepherd_writeup(doc, request.user):
|
||||
return HttpResponseForbidden("You do not have the necessary permissions to view this page")
|
||||
|
||||
login = request.user.get_profile()
|
||||
|
||||
if request.method == 'POST':
|
||||
if "submit_response" in request.POST:
|
||||
form = ShepherdWriteupUploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
|
||||
from_file = form.cleaned_data['txt']
|
||||
if from_file:
|
||||
writeup = from_file
|
||||
else:
|
||||
writeup = form.cleaned_data['content']
|
||||
|
||||
e = WriteupDocEvent(doc=doc, by=login, type="changed_protocol_writeup")
|
||||
e.desc = "Changed document writeup"
|
||||
e.text = writeup
|
||||
e.save()
|
||||
|
||||
return HttpResponseRedirect(urlreverse('doc_view', kwargs={'name': doc.name}))
|
||||
|
||||
elif "reset_text" in request.POST:
|
||||
|
||||
init = { "content": render_to_string("doc/shepherd_writeup.txt",dict(doc=doc))}
|
||||
form = ShepherdWriteupUploadForm(initial=init)
|
||||
|
||||
# Protect against handcrufted malicious posts
|
||||
else:
|
||||
form = None
|
||||
|
||||
else:
|
||||
form = None
|
||||
|
||||
if not form:
|
||||
init = { "content": ""}
|
||||
|
||||
previous_writeup = doc.latest_event(WriteupDocEvent,type="changed_protocol_writeup")
|
||||
if previous_writeup:
|
||||
init["content"] = previous_writeup.text
|
||||
else:
|
||||
init["content"] = render_to_string("doc/shepherd_writeup.txt",
|
||||
dict(doc=doc),
|
||||
)
|
||||
form = ShepherdWriteupUploadForm(initial=init)
|
||||
|
||||
return render_to_response('idrfc/change_shepherd_writeup.html',
|
||||
{'form': form,
|
||||
'doc' : doc,
|
||||
},
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
class ShepherdForm(forms.Form):
|
||||
shepherd = EmailsField(label="Shepherd", required=False)
|
||||
|
||||
def clean_shepherd(self):
|
||||
data = self.cleaned_data['shepherd']
|
||||
if len(data)>1:
|
||||
raise forms.ValidationError("Please choose at most one shepherd.")
|
||||
return data
|
||||
|
||||
def edit_shepherd(request, name):
|
||||
"""Change the shepherd for a Document"""
|
||||
# TODO - this shouldn't be type="draft" specific
|
||||
doc = get_object_or_404(Document, type="draft", name=name)
|
||||
|
||||
if not can_edit_shepherd(doc, request.user):
|
||||
return HttpResponseForbidden("You do not have the necessary permissions to view this page")
|
||||
|
||||
if request.method == 'POST':
|
||||
form = ShepherdForm(request.POST)
|
||||
if form.is_valid():
|
||||
|
||||
if form.cleaned_data['shepherd']:
|
||||
doc.shepherd = form.cleaned_data['shepherd'][0].person
|
||||
else:
|
||||
doc.shepherd = None
|
||||
doc.save()
|
||||
|
||||
login = request.user.get_profile()
|
||||
c = DocEvent(type="added_comment", doc=doc, by=login)
|
||||
c.desc = "Document shepherd changed to "+doc.shepherd.name
|
||||
c.save()
|
||||
|
||||
return HttpResponseRedirect(urlreverse('doc_view', kwargs={'name': doc.name}))
|
||||
|
||||
else:
|
||||
current_shepherd = None
|
||||
if doc.shepherd:
|
||||
e = doc.shepherd.email_set.order_by("-active", "-time")
|
||||
if e:
|
||||
current_shepherd=e[0].pk
|
||||
init = { "shepherd": current_shepherd}
|
||||
form = ShepherdForm(initial=init)
|
||||
|
||||
return render_to_response('idrfc/change_shepherd.html',
|
||||
{'form': form,
|
||||
'doc': doc,
|
||||
},
|
||||
context_instance = RequestContext(request))
|
||||
|
||||
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)
|
||||
|
|
|
@ -77,14 +77,6 @@ def edit_actions(context, wrapper):
|
|||
if draft.stream_id in ("iab", "ise", "irtf"):
|
||||
actions.append(("Request publication", urlreverse('doc_request_publication', kwargs=dict(name=doc.draft_name))))
|
||||
|
||||
if can_manage_shepherd_of_a_document(user, draft):
|
||||
actions.append(("Change shepherd", urlreverse('doc_managing_shepherd', kwargs=dict(acronym=draft.group.acronym, name=draft.filename))))
|
||||
|
||||
if can_manage_writeup_of_a_document(user, draft):
|
||||
actions.append(("Change stream writeup", urlreverse('doc_managing_writeup', kwargs=dict(acronym=draft.group.acronym, name=draft.filename))))
|
||||
else:
|
||||
actions.append(("View writeup", urlreverse('doc_managing_writeup', kwargs=dict(acronym=draft.group.acronym, name=draft.filename))))
|
||||
|
||||
return dict(actions=actions)
|
||||
|
||||
|
||||
|
|
|
@ -69,14 +69,6 @@ def edit_actions(context, wrapper):
|
|||
if can_edit_stream(user, draft):
|
||||
actions.append(("Change stream", urlreverse('edit_stream', kwargs=dict(name=doc.draft_name))))
|
||||
|
||||
if can_manage_shepherd_of_a_document(user, draft):
|
||||
actions.append(("Change shepherd", urlreverse('doc_managing_shepherd', kwargs=dict(acronym=draft.group.acronym, name=draft.filename))))
|
||||
|
||||
if can_manage_writeup_of_a_document(user, draft):
|
||||
actions.append(("Change stream writeup", urlreverse('doc_managing_writeup', kwargs=dict(acronym=draft.group.acronym, name=draft.filename))))
|
||||
else:
|
||||
actions.append(("View writeup", urlreverse('doc_managing_writeup', kwargs=dict(acronym=draft.group.acronym, name=draft.filename))))
|
||||
|
||||
return dict(actions=actions)
|
||||
|
||||
|
||||
|
|
|
@ -115,7 +115,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
{% endif %}
|
||||
{% endifequal %}
|
||||
{% endif %}
|
||||
<tr><td>Document shepherd:</td><td>{{ stream_info.shepherd|default:"" }}</td></tr>
|
||||
<tr><td>Document shepherd:</td><td><a {% if info.can_edit_shepherd %}class="editlink" href="{% url doc_edit_shepherd name=doc.draft_name %}"{% endif %}>{{ doc.underlying_document.shepherd|default:"(None)" }}</a></td></tr>
|
||||
<tr><td></td><td><a href="{% url doc_shepherd_writeup name=doc.draft_name %}">Shepherd writeup</a></td></tr>
|
||||
|
||||
{% if info.consensus %}
|
||||
<tr><td>Consensus:</td><td><a title="Whether the document is the result of a community consensus process as defined in RFC 5741" {% if info.can_edit_consensus %}class="editlink" href="{% url doc_edit_consensus name=doc.draft_name %}"{% endif %}>{{ info.consensus }}</a></td></tr>
|
||||
|
|
|
@ -5,11 +5,11 @@
|
|||
<a href="{% url doc_view doc.filename %}">{{ doc.title }}</a>
|
||||
</td>
|
||||
<td class="shepherd">
|
||||
<a href="{% url doc_managing_shepherd wg.group_acronym.acronym doc %}">Change shepherd</a>
|
||||
<a href="{% url doc_edit_shepherd doc %}">Change shepherd</a>
|
||||
</td>
|
||||
<td class="writeup">
|
||||
{% writeup doc %}
|
||||
<a href="{% url doc_managing_writeup wg.group_acronym.acronym doc %}" style="display: block;" href="">[Edit]</a>
|
||||
<a href="{% url doc_edit_shepherd_writeup doc %}" style="display: block;" href="">[Edit]</a>
|
||||
</td>
|
||||
<td class="writeup_date">
|
||||
{% writeupdate doc %}
|
||||
|
|
|
@ -137,54 +137,6 @@ class ManageShepherdsTestCase(django.test.TestCase):
|
|||
self.assertEquals(len(q('div#mydocs a:contains("Shepherd me")')), 1)
|
||||
self.assertEquals(len(q('div#othershepherds a:contains("Shepherd other")')), 1)
|
||||
|
||||
def test_set_shepherd(self):
|
||||
draft = make_test_data()
|
||||
|
||||
url = urlreverse('doc_managing_shepherd', kwargs=dict(acronym="mars", name=draft.name))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
# get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('input[type=submit][name=setme]')), 1)
|
||||
|
||||
# set me
|
||||
events_before = draft.docevent_set.count()
|
||||
r = self.client.post(url,
|
||||
dict(setme="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
draft = Document.objects.get(name=draft.name)
|
||||
self.assertTrue(draft.shepherd)
|
||||
self.assertEquals(draft.shepherd.user.username, "secretary")
|
||||
self.assertEquals(draft.docevent_set.count(), events_before + 1)
|
||||
|
||||
# get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
self.assertTrue(Person.objects.get(user__username="secretary").plain_name() in r.content)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q('input[type=submit][name=remove_shepherd]')), 1)
|
||||
|
||||
# unassign
|
||||
events_before = draft.docevent_set.count()
|
||||
r = self.client.post(url,
|
||||
dict(remove_shepherd="1"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
draft = Document.objects.get(name=draft.name)
|
||||
self.assertTrue(not draft.shepherd)
|
||||
self.assertEquals(draft.docevent_set.count(), events_before + 1)
|
||||
|
||||
# change to existing person
|
||||
events_before = draft.docevent_set.count()
|
||||
r = self.client.post(url,
|
||||
dict(email="plain@example.com",
|
||||
form_type="single"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertTrue("Shepherd assigned" in r.content)
|
||||
self.assertTrue(Email.objects.get(address="plain@example.com").person.plain_name() in r.content)
|
||||
self.assertEquals(draft.docevent_set.count(), events_before + 1)
|
||||
|
||||
class ManageWorkflowTestCase(django.test.TestCase):
|
||||
fixtures = ['names']
|
||||
|
@ -204,7 +156,7 @@ class ManageWorkflowTestCase(django.test.TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q("form.set-state").find("input[name=state][value='%s']" % state.pk).parents("form").find("input[name=active][value=0]")), 1)
|
||||
self.assertEquals(len(q("form.set-state").find("input[name=state][value='%s']" % state.pk).parents("form").find("input[name=active][value='0']")), 1)
|
||||
|
||||
# deactivate state
|
||||
r = self.client.post(url,
|
||||
|
@ -213,7 +165,7 @@ class ManageWorkflowTestCase(django.test.TestCase):
|
|||
active="0"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q("form.set-state").find("input[name=state][value='%s']" % state.pk).parents("form").find("input[name=active][value=1]")), 1)
|
||||
self.assertEquals(len(q("form.set-state").find("input[name=state][value='%s']" % state.pk).parents("form").find("input[name=active][value='1']")), 1)
|
||||
group = Group.objects.get(acronym=group.acronym)
|
||||
self.assertTrue(state in group.unused_states.all())
|
||||
|
||||
|
@ -254,48 +206,6 @@ class ManageWorkflowTestCase(django.test.TestCase):
|
|||
group = Group.objects.get(acronym=group.acronym)
|
||||
self.assertTrue(tag in group.unused_tags.all())
|
||||
|
||||
class ManageWriteupTestCase(django.test.TestCase):
|
||||
fixtures = ['names']
|
||||
|
||||
def test_manage_writeup(self):
|
||||
draft = make_test_data()
|
||||
|
||||
self.assertTrue(not draft.tags.filter(slug="sheph-u"))
|
||||
|
||||
url = urlreverse('doc_managing_writeup', kwargs=dict(acronym=draft.group.acronym, name=draft.name))
|
||||
r = self.client.get(url)
|
||||
self.client.login(remote_user="secretary")
|
||||
|
||||
# get
|
||||
r = self.client.get(url)
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q("input[type=submit][value*=Change]")), 1)
|
||||
|
||||
# post text
|
||||
r = self.client.post(url,
|
||||
dict(writeup="New writeup"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEquals(len(q("input[name=followup]")), 1)
|
||||
self.assertEquals(len(q("input[name=confirm]")), 1)
|
||||
self.assertEquals(q("input[name=writeup]").val(), "New writeup")
|
||||
|
||||
# update tag and confirm
|
||||
r = self.client.post(url,
|
||||
dict(writeup="New writeup",
|
||||
confirm="1",
|
||||
followup="1",
|
||||
comment="Starting on write up",
|
||||
complete_tag="Modify"))
|
||||
self.assertEquals(r.status_code, 200)
|
||||
e = draft.latest_event(WriteupDocEvent, type="changed_protocol_writeup")
|
||||
self.assertTrue(e)
|
||||
self.assertEquals(e.text, "New writeup")
|
||||
self.assertEquals(e.by.user.username, "secretary")
|
||||
self.assertFalse(draft.tags.filter(slug="sheph-u"))
|
||||
|
||||
|
||||
if not settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
# the above tests only work with the new schema
|
||||
del ManageDelegatesTestCase
|
||||
|
|
|
@ -6,6 +6,4 @@ urlpatterns = patterns('ietf.wgchairs.views',
|
|||
url(r'^workflows/$', 'manage_workflow', name='manage_workflow'),
|
||||
url(r'^delegates/$', 'manage_delegates', name='manage_delegates'),
|
||||
url(r'^shepherds/$', 'wg_shepherd_documents', name='manage_shepherds'),
|
||||
url(r'^shepherds/(?P<name>[^/]+)/$', 'managing_shepherd', name='doc_managing_shepherd'),
|
||||
url(r'^shepherds/(?P<name>[^/]+)/writeup/$', 'managing_writeup', name='doc_managing_writeup'),
|
||||
)
|
||||
|
|
|
@ -179,45 +179,6 @@ def manage_workflowREDESIGN(request, acronym):
|
|||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
manage_workflow = manage_workflowREDESIGN
|
||||
|
||||
def managing_shepherd(request, acronym, name):
|
||||
"""
|
||||
View for managing the assigned shepherd of a document.
|
||||
"""
|
||||
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
|
||||
user = request.user
|
||||
person = get_person_for_user(user)
|
||||
if not can_manage_shepherds_in_group(user, wg):
|
||||
return HttpResponseForbidden('You have no permission to access this view')
|
||||
doc = get_object_or_404(InternetDraft, filename=name)
|
||||
if not can_manage_shepherd_of_a_document(user, doc):
|
||||
raise Http404
|
||||
add_form = add_form_factory(request, wg, user, shepherd=doc)
|
||||
if request.method == 'POST':
|
||||
if request.POST.get('remove_shepherd'):
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
assign_shepherd(user, doc, None)
|
||||
else:
|
||||
doc.shepherd = None
|
||||
doc.save()
|
||||
elif request.POST.get('setme'):
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
assign_shepherd(user, doc, person)
|
||||
else:
|
||||
doc.shepherd = person
|
||||
doc.save()
|
||||
elif add_form.is_valid():
|
||||
add_form.save()
|
||||
add_form = add_form.get_next_form()
|
||||
return render_to_response('wgchairs/edit_management_shepherd.html',
|
||||
dict(doc=doc,
|
||||
form=add_form,
|
||||
user=user,
|
||||
selected='manage_shepherds',
|
||||
wg=wg,
|
||||
),
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def wg_shepherd_documents(request, acronym):
|
||||
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
|
||||
user = request.user
|
||||
|
@ -246,72 +207,3 @@ def wg_shepherd_documents(request, acronym):
|
|||
}
|
||||
return render_to_response('wgchairs/wg_shepherd_documents.html', context, RequestContext(request))
|
||||
|
||||
|
||||
def managing_writeup(request, acronym, name):
|
||||
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
|
||||
user = request.user
|
||||
doc = get_object_or_404(InternetDraft, filename=name)
|
||||
authorized_user = can_manage_writeup_of_a_document_no_state(user, doc)
|
||||
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
||||
from ietf.doc.models import State
|
||||
state = doc.get_state("draft-stream-%s" % doc.stream_id)
|
||||
can_edit = (state and state.slug == "writeupw") or can_manage_writeup_of_a_document_no_state(user, doc)
|
||||
else:
|
||||
can_edit = True
|
||||
current_state = get_state_for_draft(doc)
|
||||
if current_state != get_state_by_name(WAITING_WRITEUP) and not can_manage_writeup_of_a_document_no_state(user, doc):
|
||||
can_edit = False
|
||||
writeup = doc.protowriteup_set.all()
|
||||
if writeup:
|
||||
writeup = writeup[0]
|
||||
else:
|
||||
writeup = None
|
||||
error = False
|
||||
followup_tag = get_annotation_tags_for_draft(doc).filter(annotation_tag__name=FOLLOWUP_TAG)
|
||||
followup = bool(followup_tag.count())
|
||||
if request.method == 'POST':
|
||||
form = WriteUpEditForm(wg=wg, doc=doc, user=user, data=request.POST, files=request.FILES)
|
||||
form.request = request
|
||||
if request.FILES.get('uploaded_writeup', None):
|
||||
try:
|
||||
newwriteup = request.FILES['uploaded_writeup'].read().encode('ascii')
|
||||
form.data.update({'writeup': newwriteup})
|
||||
except:
|
||||
form.set_message('error', 'You have try to upload a non ascii file')
|
||||
error = True
|
||||
valid = form.is_valid()
|
||||
if (valid and not error and not request.POST.get('confirm', None)) or (not valid and not error):
|
||||
if not valid:
|
||||
form.set_message('error', 'You have to specify a comment')
|
||||
return render_to_response('wgchairs/confirm_management_writeup.html',
|
||||
dict(doc=doc,
|
||||
user=user,
|
||||
selected='manage_shepherds',
|
||||
wg=wg,
|
||||
followup=followup,
|
||||
form=form,
|
||||
writeup=writeup,
|
||||
can_edit=can_edit,
|
||||
authorized_user=authorized_user,
|
||||
),
|
||||
context_instance=RequestContext(request))
|
||||
elif valid and not error:
|
||||
writeup = form.save()
|
||||
form = WriteUpEditForm(wg=wg, doc=doc, user=user)
|
||||
followup_tag = get_annotation_tags_for_draft(doc).filter(annotation_tag__name=FOLLOWUP_TAG)
|
||||
followup = bool(followup_tag.count())
|
||||
else:
|
||||
form = WriteUpEditForm(wg=wg, doc=doc, user=user)
|
||||
form.request = request
|
||||
return render_to_response('wgchairs/edit_management_writeup.html',
|
||||
dict(doc=doc,
|
||||
user=user,
|
||||
selected='manage_shepherds',
|
||||
wg=wg,
|
||||
form=form,
|
||||
writeup=writeup,
|
||||
followup=followup,
|
||||
can_edit=can_edit,
|
||||
authorized_user=authorized_user,
|
||||
),
|
||||
context_instance=RequestContext(request))
|
||||
|
|
Loading…
Reference in a new issue