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:
Henrik Levkowetz 2013-04-07 20:40:15 +00:00
parent 68b697ccfc
commit becd10a81d
12 changed files with 235 additions and 225 deletions

View file

@ -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'

View file

@ -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'),

View file

@ -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):

View file

@ -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",

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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>

View file

@ -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 %}

View file

@ -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

View file

@ -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'),
)

View file

@ -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))