datatracker/ietf/wgchairs/views.py
Emilio A. Sánchez López e4f9bbe1ff Added state definitions in workflow edit form.
Re-order states in workflow edit form.
See #644
 - Legacy-Id: 3014
2011-03-30 18:56:35 +00:00

215 lines
10 KiB
Python

from django.conf import settings
from ietf.idtracker.models import IETFWG, InternetDraft
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from django.http import HttpResponseForbidden, Http404
from ietf.idrfc.views_search import SearchForm, search_query
from ietf.wgchairs.forms import (RemoveDelegateForm, add_form_factory,
workflow_form_factory, TransitionFormSet,
WriteUpEditForm)
from ietf.wgchairs.accounts import (can_manage_delegates_in_group, get_person_for_user,
can_manage_shepherds_in_group,
can_manage_workflow_in_group,
can_manage_shepherd_of_a_document,
can_manage_writeup_of_a_document,
can_manage_writeup_of_a_document_no_state,
)
from ietf.ietfworkflows.constants import REQUIRED_STATES
from ietf.ietfworkflows.utils import (get_workflow_for_wg,
get_default_workflow_for_wg,
get_state_by_name,
get_annotation_tags_for_draft,
get_state_for_draft, WAITING_WRITEUP,
FOLLOWUP_TAG)
def manage_delegates(request, acronym):
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
user = request.user
if not can_manage_delegates_in_group(user, wg):
return HttpResponseForbidden('You have no permission to access this view')
delegates = wg.wgdelegate_set.all()
add_form = add_form_factory(request, wg, user)
if request.method == 'POST':
if request.POST.get('remove', None):
form = RemoveDelegateForm(wg=wg, data=request.POST.copy())
if form.is_valid():
form.save()
elif add_form.is_valid():
add_form.save()
add_form = add_form.get_next_form()
max_delegates = getattr(settings, 'MAX_WG_DELEGATES', 3)
return render_to_response('wgchairs/manage_delegates.html',
{'wg': wg,
'delegates': delegates,
'selected': 'manage_delegates',
'can_add': delegates.count() < max_delegates,
'max_delegates': max_delegates,
'add_form': add_form,
}, RequestContext(request))
def manage_workflow(request, acronym):
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
user = request.user
if not can_manage_workflow_in_group(user, wg):
return HttpResponseForbidden('You have no permission to access this view')
workflow = get_workflow_for_wg(wg)
default_workflow = get_default_workflow_for_wg()
formset = None
if request.method == 'POST':
form = workflow_form_factory(request, wg=wg, user=user)
if form.is_valid():
form.save()
elif isinstance(form, TransitionFormSet):
formset = form
tags = workflow.selected_tags.all()
default_tags = default_workflow.annotation_tags.all()
states = workflow.selected_states.all().order_by('statedescription__order')
default_states = default_workflow.states.all().order_by('statedescription__order')
for i in default_states:
if states.filter(name=i.name).count() == 1:
i.used = True
if i.name in REQUIRED_STATES:
i.freeze = True
for i in default_tags:
if tags.filter(name=i.name).count() == 1:
i.used = True
if not formset:
formset = TransitionFormSet(queryset=workflow.transitions.all(), user=user, wg=wg)
return render_to_response('wgchairs/manage_workflow.html',
{'wg': wg,
'workflow': workflow,
'default_workflow': default_workflow,
'states': states,
'tags': tags,
'default_states': default_states,
'default_tags': default_tags,
'formset': formset,
'selected': 'manage_workflow',
}, RequestContext(request))
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'):
doc.shepherd = None
doc.save()
elif request.POST.get('setme'):
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
if not can_manage_shepherds_in_group(user, wg):
return HttpResponseForbidden('You have no permission to access this view')
current_person = get_person_for_user(user)
form = SearchForm({'by': 'group', 'group': str(wg.group_acronym.acronym),
'activeDrafts': 'on'})
if not form.is_valid():
raise ValueError("form did not validate")
(docs, meta) = search_query(form.cleaned_data)
base_qs = InternetDraft.objects.filter(pk__in=[i.id._draft.pk for i in docs if i.id]).select_related('status')
documents_no_shepherd = base_qs.filter(shepherd__isnull=True)
documents_my = base_qs.filter(shepherd=current_person)
documents_other = base_qs.exclude(shepherd__isnull=True).exclude(shepherd__pk__in=[current_person.pk, 0])
context = {
'no_shepherd': documents_no_shepherd,
'my_documents': documents_my,
'other_shepherds': documents_other,
'selected': 'manage_shepherds',
'wg': wg,
}
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)
if not can_manage_writeup_of_a_document(user, doc):
raise Http404
current_state = get_state_for_draft(doc)
can_edit = True
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.count():
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)
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,
),
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)
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,
),
context_instance=RequestContext(request))