Insert change shepherd and change writeup links in document view.

Insert document view link in shepherd document list.
Allow secretariat to manage shepherds and writeups.
Fixes #643
 - Legacy-Id: 3012
This commit is contained in:
Emilio A. Sánchez López 2011-03-30 17:05:10 +00:00
parent 280cbbd707
commit e681c5e3c9
7 changed files with 40 additions and 17 deletions

View file

@ -60,7 +60,7 @@ class NoWorkflowStateForm(StreamDraftForm):
self.wgs = list(wgs)
self.fields['wg'].choices = [(i.group_acronym.pk, i.group_acronym.group_acronym.name) for i in self.wgs]
else:
self.onlywg = wgs[0].group_acronym
self.onlywg = list(wgs)[0].group_acronym
def save(self):
comment = self.cleaned_data.get('comment')

View file

@ -3,6 +3,8 @@ from django import template
from ietf.idrfc.idrfc_wrapper import IdRfcWrapper, IdWrapper
from ietf.ietfworkflows.utils import (get_workflow_for_draft,
get_state_for_draft)
from ietf.wgchairs.accounts import (can_manage_shepherd_of_a_document,
can_manage_writeup_of_a_document)
from ietf.ietfworkflows.streams import get_stream_from_wrapper
from ietf.ietfworkflows.accounts import (can_edit_state, can_edit_stream)
@ -65,5 +67,8 @@ def edit_actions(context, wrapper):
return {
'can_edit_state': can_edit_state(user, draft),
'can_edit_stream': can_edit_stream(user, draft),
'can_writeup': can_manage_writeup_of_a_document(user, draft),
'can_shepherd': can_manage_shepherd_of_a_document(user, draft),
'draft': draft,
'doc': wrapper,
}

View file

@ -1,4 +1,4 @@
from django.http import HttpResponseRedirect
from django.http import HttpResponseRedirect, HttpResponseForbidden
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
@ -12,6 +12,7 @@ from ietf.ietfworkflows.utils import (get_workflow_history_for_draft,
get_workflow_for_draft,
get_annotation_tags_for_draft,
get_state_for_draft)
from ietf.ietfworkflows.accounts import (can_edit_state, can_edit_stream)
REDUCED_HISTORY_LEN = 20
@ -46,9 +47,8 @@ def stream_history(request, name):
context_instance=RequestContext(request))
def edit_state(request, name, form_class=DraftTagsStateForm):
def _edit_draft_stream(request, draft, form_class=DraftTagsStateForm):
user = request.user
draft = get_object_or_404(InternetDraft, filename=name)
workflow = get_workflow_for_draft(draft)
if not workflow:
form_class = NoWorkflowStateForm
@ -75,5 +75,14 @@ def edit_state(request, name, form_class=DraftTagsStateForm):
context_instance=RequestContext(request))
def edit_state(request, name):
draft = get_object_or_404(InternetDraft, filename=name)
if not can_edit_state(request.user, draft):
return HttpResponseForbidden('You have no permission to access this view')
return _edit_draft_stream(request, draft, DraftTagsStateForm)
def edit_stream(request, name):
return edit_state(request, name, DraftStreamForm)
draft = get_object_or_404(InternetDraft, filename=name)
if not can_edit_stream(request.user, draft):
return HttpResponseForbidden('You have no permission to access this view')
return _edit_draft_stream(request, draft, DraftStreamForm)

View file

@ -1,5 +1,7 @@
<div>
<div style="margin-bottom: 1em;">
{% if can_edit_state %} <a href="{% url edit_state doc.draft_name %}">Change state</a> {% endif %}
{% if can_edit_stream %}{% if can_edit_state %} | {% endif %} <a href="{% url edit_stream doc.draft_name %}">Change draft stream</a>{% endif %}
{% if can_edit_stream %}{% if can_edit_state %} | {% endif %}<a href="{% url edit_stream doc.draft_name %}">Change draft stream</a>{% endif %}
{% if can_shepherd %}{% if can_edit_state or can_edit_stream %} | {% endif %}<a href="{% url doc_managing_shepherd draft.group.acronym draft.filename %}">Change draft shepherd</a>{% endif %}
{% if can_writeup %}{% if can_edit_state or can_edit_stream or can_writeup %} | {% endif %}<a href="{% url doc_managing_writeup draft.group.acronym draft.filename %}">Change draft writeup</a>{% endif %}
</div>

View file

@ -2,10 +2,10 @@
<tr class="{% cycle oddrow,evenrow %}">
<td class="title">
<a href="{% url doc_managing_shepherd wg.group_acronym.acronym doc %}">{{ doc.title }}</a>
<a href="{% url doc_view doc.filename %}">{{ doc.title }}</a>
</td>
<td class="status">
{{ doc.status.status }}
<td class="shepherd">
<a href="{% url doc_managing_shepherd wg.group_acronym.acronym doc %}">Change shepherd</a>
</td>
<td class="writeup">
{% writeup doc %}

View file

@ -56,7 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<table class="ietf-table ietf-doctable" style="margin-top:16px; width: 100%;">
<tr>
<th class="title">Document</th>
<th class="status">Status</th>
<th class="shepherd">Change shepherd</th>
<th class="writeup">Protocol write-up</th>
<th class="writeup_date">Protocol write-up last update</th>
</tr>

View file

@ -1,3 +1,9 @@
def is_secretariat(user):
if not user or not user.is_authenticated():
return False
return bool(user.groups.filter(name='Secretariat'))
def is_area_director_for_group(person, group):
return bool(group.area.area.areadirector_set.filter(person=person).count())
@ -27,35 +33,35 @@ def can_do_wg_workflow_in_group(user, group):
person = get_person_for_user(user)
if not person:
return False
return is_group_chair(person, group)
return (is_secretariat(user) or is_group_chair(person, group))
def can_do_wg_workflow_in_document(user, document):
person = get_person_for_user(user)
if not person or not document.group:
return False
return can_do_wg_workflow_in_group(document.group.ietfwg)
return (is_secretariat(user) or can_do_wg_workflow_in_group(document.group.ietfwg))
def can_manage_workflow_in_group(user, group):
person = get_person_for_user(user)
if not person:
return False
return is_group_chair(person, group)
return (is_secretariat(user) or is_group_chair(person, group))
def can_manage_delegates_in_group(user, group):
person = get_person_for_user(user)
if not person:
return False
return is_group_chair(person, group)
return (is_secretariat(user) or is_group_chair(person, group))
def can_manage_shepherds_in_group(user, group):
person = get_person_for_user(user)
if not person:
return False
return is_group_chair(person, group)
return (is_secretariat(user) or is_group_chair(person, group))
def can_manage_shepherd_of_a_document(user, document):
@ -70,7 +76,8 @@ def can_manage_writeup_of_a_document_no_state(user, document):
if not person or not document.group:
return False
group = document.group.ietfwg
return (is_group_chair(person, group) or
return (is_secretariat(user) or
is_group_chair(person, group) or
is_area_director_for_group(person, group) or
is_group_delegate(person, group))