148 lines
6.6 KiB
Python
148 lines
6.6 KiB
Python
from django.http import HttpResponseRedirect, HttpResponseForbidden
|
|
from django.shortcuts import get_object_or_404, render_to_response
|
|
from django.template import RequestContext
|
|
from django.conf import settings
|
|
|
|
from ietf.idtracker.models import InternetDraft
|
|
from ietf.ietfworkflows.models import Stream, StreamDelegate
|
|
from ietf.ietfworkflows.forms import (DraftTagsStateForm,
|
|
DraftStreamForm,
|
|
NoWorkflowStateForm,
|
|
StreamDelegatesForm)
|
|
from ietf.ietfworkflows.streams import (get_stream_from_draft,
|
|
get_streamed_draft)
|
|
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,
|
|
is_chair_of_stream, can_adopt)
|
|
from ietf.doc.utils import get_tags_for_stream_id
|
|
from ietf.name.models import DocTagName
|
|
from ietf.group.utils import save_group_in_history
|
|
from ietf.group.models import Group, Role
|
|
|
|
|
|
REDUCED_HISTORY_LEN = 20
|
|
|
|
|
|
def stream_history(request, name):
|
|
draft = get_object_or_404(InternetDraft, filename=name)
|
|
streamed = get_streamed_draft(draft)
|
|
stream = get_stream_from_draft(draft)
|
|
workflow = get_workflow_for_draft(draft)
|
|
tags = []
|
|
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
|
used = list(draft.tags.all())
|
|
tags = DocTagName.objects.filter(slug__in=get_tags_for_stream_id(draft.stream_id))
|
|
for t in tags:
|
|
t.setted = t.slug in used
|
|
else:
|
|
if workflow:
|
|
tags_setted = [i.annotation_tag.pk for i in get_annotation_tags_for_draft(draft)]
|
|
for tag in workflow.get_tags():
|
|
tag.setted = tag.pk in tags_setted
|
|
tags.append(tag)
|
|
state = get_state_for_draft(draft)
|
|
history = get_workflow_history_for_draft(draft)
|
|
show_more = False
|
|
if len(history) > REDUCED_HISTORY_LEN:
|
|
show_more = True
|
|
|
|
return render_to_response('ietfworkflows/stream_history.html',
|
|
{'stream': stream,
|
|
'streamed': streamed,
|
|
'draft': draft,
|
|
'tags': tags,
|
|
'state': state,
|
|
'workflow': workflow,
|
|
'show_more': show_more,
|
|
'history': history[:REDUCED_HISTORY_LEN],
|
|
},
|
|
context_instance=RequestContext(request))
|
|
|
|
|
|
def _edit_draft_stream(request, draft, form_class=DraftTagsStateForm):
|
|
user = request.user
|
|
workflow = get_workflow_for_draft(draft)
|
|
if not workflow and form_class == DraftTagsStateForm:
|
|
form_class = NoWorkflowStateForm
|
|
if request.method == 'POST':
|
|
form = form_class(user=user, draft=draft, data=request.POST)
|
|
form.request = request
|
|
if form.is_valid():
|
|
form.save()
|
|
return HttpResponseRedirect('.')
|
|
else:
|
|
form = form_class(user=user, draft=draft)
|
|
form.request = request
|
|
state = get_state_for_draft(draft)
|
|
stream = get_stream_from_draft(draft)
|
|
history = get_workflow_history_for_draft(draft, 'objectworkflowhistoryentry')
|
|
tags = get_annotation_tags_for_draft(draft)
|
|
return render_to_response('ietfworkflows/state_edit.html',
|
|
{'draft': draft,
|
|
'state': state,
|
|
'stream': stream,
|
|
'workflow': workflow,
|
|
'history': history,
|
|
'tags': tags,
|
|
'form': form,
|
|
},
|
|
context_instance=RequestContext(request))
|
|
|
|
# these three views are reusing the same view really, which apart from
|
|
# being somewhat obscure means that there are subtle bugs (like the
|
|
# title being wrong) - would probably be better to switch to a model
|
|
# where each part is edited on its own, we come from an overview page
|
|
# anyway, so there's not a big win in putting in a common
|
|
# overview/edit page here
|
|
def edit_adopt(request, name):
|
|
draft = get_object_or_404(InternetDraft, filename=name)
|
|
if not can_adopt(request.user, draft):
|
|
return HttpResponseForbidden("You don't have permission to access this view")
|
|
return _edit_draft_stream(request, draft, NoWorkflowStateForm)
|
|
|
|
def edit_state(request, name):
|
|
draft = get_object_or_404(InternetDraft, filename=name)
|
|
if not can_edit_state(request.user, draft):
|
|
return HttpResponseForbidden("You don't have permission to access this view")
|
|
return _edit_draft_stream(request, draft, DraftTagsStateForm)
|
|
|
|
|
|
def edit_stream(request, name):
|
|
draft = get_object_or_404(InternetDraft, filename=name)
|
|
if not can_edit_stream(request.user, draft):
|
|
return HttpResponseForbidden("You don't have permission to access this view")
|
|
return _edit_draft_stream(request, draft, DraftStreamForm)
|
|
|
|
|
|
def stream_delegates(request, stream_name):
|
|
stream = get_object_or_404(Stream, name=stream_name)
|
|
if not is_chair_of_stream(request.user, stream):
|
|
return HttpResponseForbidden('You have no permission to access this view')
|
|
chairs = stream.get_chairs()
|
|
form = StreamDelegatesForm(stream=stream)
|
|
if request.method == 'POST':
|
|
if request.POST.get('delete', False):
|
|
pk_list = request.POST.getlist('remove_delegate')
|
|
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
|
|
stream_group = Group.objects.get(acronym=stream.slug)
|
|
save_group_in_history(stream_group)
|
|
Role.objects.filter(person__in=pk_list, group=stream_group, name="delegate").delete()
|
|
else:
|
|
StreamDelegate.objects.filter(stream=stream, person__pk__in=pk_list).delete()
|
|
else:
|
|
form = StreamDelegatesForm(request.POST, stream=stream)
|
|
if form.is_valid():
|
|
form.save()
|
|
form = StreamDelegatesForm(stream=stream)
|
|
delegates = stream.get_delegates()
|
|
return render_to_response('ietfworkflows/stream_delegates.html',
|
|
{'stream': stream,
|
|
'chairs': chairs,
|
|
'delegates': delegates,
|
|
'form': form,
|
|
},
|
|
context_instance=RequestContext(request))
|