237 lines
11 KiB
Python
237 lines
11 KiB
Python
# Copyright The IETF Trust 2007, All Rights Reserved
|
|
from django.conf import settings
|
|
from django.core.urlresolvers import reverse
|
|
from django.contrib.sites.models import Site
|
|
from django.http import HttpResponseRedirect, Http404, HttpResponseForbidden
|
|
from django.shortcuts import get_object_or_404
|
|
from django.shortcuts import render_to_response
|
|
from django.template import RequestContext
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
|
|
from ietf.submit.models import IdSubmissionDetail, IdApprovedDetail
|
|
from ietf.submit.forms import UploadForm, AutoPostForm, MetaDataForm
|
|
from ietf.submit.utils import (DraftValidation, perform_post, remove_docs,
|
|
get_person_for_user, is_secretariat,
|
|
request_full_url, UPLOADED,
|
|
WAITING_AUTHENTICATION, CANCELED,
|
|
INITIAL_VERSION_APPROVAL_REQUESTED,
|
|
MANUAL_POST_REQUESTED, POSTED)
|
|
from ietf.utils.mail import send_mail
|
|
|
|
|
|
def submit_index(request):
|
|
if request.method == 'POST':
|
|
form = UploadForm(request=request, data=request.POST, files=request.FILES)
|
|
if form.is_valid():
|
|
submit = form.save()
|
|
return HttpResponseRedirect(reverse(draft_status, None, kwargs={'submission_id': submit.submission_id, 'submission_hash': submit.get_hash()}))
|
|
else:
|
|
form = UploadForm(request=request)
|
|
return render_to_response('submit/submit_index.html',
|
|
{'selected': 'index',
|
|
'form': form},
|
|
context_instance=RequestContext(request))
|
|
|
|
|
|
def submit_status(request):
|
|
error = None
|
|
filename = None
|
|
if request.method == 'POST':
|
|
filename = request.POST.get('filename', '')
|
|
detail = IdSubmissionDetail.objects.filter(filename=filename).order_by('-pk')
|
|
if detail:
|
|
return HttpResponseRedirect(reverse(draft_status, None, kwargs={'submission_id': detail[0].submission_id}))
|
|
error = 'No valid history found for %s' % filename
|
|
return render_to_response('submit/submit_status.html',
|
|
{'selected': 'status',
|
|
'error': error,
|
|
'filename': filename},
|
|
context_instance=RequestContext(request))
|
|
|
|
|
|
def _can_approve(user, detail):
|
|
person = get_person_for_user(user)
|
|
if detail.status_id != INITIAL_VERSION_APPROVAL_REQUESTED or not detail.group_acronym:
|
|
return None
|
|
if person in [i.person for i in detail.group_acronym.wgchair_set.all()] or is_secretariat(user):
|
|
return True
|
|
return False
|
|
|
|
|
|
def _can_force_post(user, detail):
|
|
if detail.status_id not in [MANUAL_POST_REQUESTED,
|
|
WAITING_AUTHENTICATION, INITIAL_VERSION_APPROVAL_REQUESTED]:
|
|
return None
|
|
if is_secretariat(user):
|
|
return True
|
|
return False
|
|
|
|
def _can_cancel(user, detail, submission_hash):
|
|
if detail.status_id in [CANCELED, POSTED]:
|
|
return None
|
|
if is_secretariat(user):
|
|
return True
|
|
if submission_hash and detail.get_hash() == submission_hash:
|
|
return True
|
|
return False
|
|
|
|
def _can_edit(user, detail, submission_hash):
|
|
if detail.status_id != UPLOADED:
|
|
return None
|
|
if is_secretariat(user):
|
|
return True
|
|
if submission_hash and detail.get_hash() == submission_hash:
|
|
return True
|
|
return False
|
|
|
|
def draft_status(request, submission_id, submission_hash=None, message=None):
|
|
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
|
|
if submission_hash and not detail.get_hash() == submission_hash:
|
|
raise Http404
|
|
validation = DraftValidation(detail)
|
|
is_valid = validation.is_valid()
|
|
status = None
|
|
allow_edit = _can_edit(request.user, detail, submission_hash)
|
|
can_force_post = _can_force_post(request.user, detail)
|
|
can_approve = _can_approve(request.user, detail)
|
|
can_cancel = _can_cancel(request.user, detail, submission_hash)
|
|
if detail.status_id != UPLOADED:
|
|
if detail.status_id == CANCELED:
|
|
message = ('error', 'This submission has been canceled, modification is no longer possible')
|
|
status = detail.status
|
|
allow_edit = None
|
|
|
|
if request.method == 'POST' and allow_edit:
|
|
if request.POST.get('autopost', False):
|
|
auto_post_form = AutoPostForm(draft=detail, validation=validation, data=request.POST)
|
|
if auto_post_form.is_valid():
|
|
try:
|
|
approved_detail = IdApprovedDetail.objects.get(filename=detail.filename)
|
|
except ObjectDoesNotExist:
|
|
approved_detail = None
|
|
detail.status_id = INITIAL_VERSION_APPROVAL_REQUESTED
|
|
detail.save()
|
|
|
|
if detail.revision == '00' and not approved_detail:
|
|
submitter = auto_post_form.save_submitter_info()
|
|
subject = 'New draft waiting for approval: %s' % detail.filename
|
|
from_email = settings.IDST_FROM_EMAIL
|
|
to_email = []
|
|
if detail.group_acronym:
|
|
to_email += [i.person.email()[1] for i in detail.group_acronym.wgchair_set.all()]
|
|
to_email = list(set(to_email))
|
|
if to_email:
|
|
metadata_form = MetaDataForm(draft=detail, validation=validation)
|
|
send_mail(request, to_email, from_email, subject, 'submit/submission_approval.txt',
|
|
{'submitter': submitter, 'form': metadata_form,
|
|
'draft': detail, 'domain': Site.objects.get_current().domain})
|
|
return HttpResponseRedirect(reverse(draft_status, None, kwargs={'submission_id': detail.submission_id}))
|
|
else:
|
|
auto_post_form.save(request)
|
|
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
|
|
validation = DraftValidation(detail)
|
|
is_valid = validation.is_valid()
|
|
status = detail.status
|
|
can_force_post = _can_force_post(request.user, detail)
|
|
can_approve = _can_approve(request.user, detail)
|
|
can_cancel = _can_cancel(request.user, detail, submission_hash)
|
|
allow_edit = None
|
|
message = ('success', 'Your submission is pending email authentication. An email has been sent you with instructions.')
|
|
else:
|
|
return HttpResponseRedirect(reverse(draft_edit, None, kwargs={'submission_id': detail.submission_id}))
|
|
else:
|
|
auto_post_form = AutoPostForm(draft=detail, validation=validation)
|
|
|
|
show_notify_button = False
|
|
if allow_edit == False or can_cancel == False:
|
|
show_notify_button = True
|
|
return render_to_response('submit/draft_status.html',
|
|
{'selected': 'status',
|
|
'detail': detail,
|
|
'validation': validation,
|
|
'auto_post_form': auto_post_form,
|
|
'is_valid': is_valid,
|
|
'status': status,
|
|
'message': message,
|
|
'allow_edit': allow_edit,
|
|
'can_force_post': can_force_post,
|
|
'can_approve': can_approve,
|
|
'can_cancel': can_cancel,
|
|
'submission_hash': submission_hash,
|
|
'show_notify_button': show_notify_button,
|
|
},
|
|
context_instance=RequestContext(request))
|
|
|
|
|
|
def draft_cancel(request, submission_id, submission_hash=None):
|
|
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
|
|
can_cancel = _can_cancel(request.user, detail, submission_hash)
|
|
if not can_cancel:
|
|
if can_cancel == None:
|
|
raise Http404
|
|
return HttpResponseForbidden('You have no permission to perform this action')
|
|
detail.status_id = CANCELED
|
|
detail.save()
|
|
remove_docs(detail)
|
|
return HttpResponseRedirect(reverse(draft_status, None, kwargs={'submission_id': submission_id}))
|
|
|
|
|
|
def draft_edit(request, submission_id, submission_hash=None):
|
|
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
|
|
can_edit = _can_edit(request.user, detail, submission_hash)
|
|
if not can_edit:
|
|
if can_edit == None:
|
|
raise Http404
|
|
return HttpResponseForbidden('You have no permission to perform this action')
|
|
validation = DraftValidation(detail)
|
|
validation.validate_wg()
|
|
if request.method == 'POST':
|
|
form = MetaDataForm(draft=detail, validation=validation, data=request.POST)
|
|
if form.is_valid():
|
|
form.save(request)
|
|
return HttpResponseRedirect(reverse(draft_status, None, kwargs={'submission_id': detail.submission_id}))
|
|
else:
|
|
form = MetaDataForm(draft=detail, validation=validation)
|
|
return render_to_response('submit/draft_edit.html',
|
|
{'selected': 'status',
|
|
'detail': detail,
|
|
'validation': validation,
|
|
'form': form,
|
|
},
|
|
context_instance=RequestContext(request))
|
|
|
|
|
|
def draft_confirm(request, submission_id, auth_key):
|
|
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
|
|
message = None
|
|
if auth_key != detail.auth_key:
|
|
message = ('error', 'Incorrect authorization key')
|
|
elif detail.status_id != WAITING_AUTHENTICATION:
|
|
message = ('error', 'The submission can not be autoposted because it is in state: %s' % detail.status.status_value)
|
|
else:
|
|
message = ('success', 'Authorization key accepted. Auto-Post complete')
|
|
perform_post(detail)
|
|
return draft_status(request, submission_id, message=message)
|
|
|
|
|
|
def draft_approve(request, submission_id, check_function=_can_approve):
|
|
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
|
|
can_perform = check_function(request.user, detail)
|
|
if not can_perform:
|
|
if can_perform == None:
|
|
raise Http404
|
|
return HttpResponseForbidden('You have no permission to perform this action')
|
|
perform_post(detail)
|
|
return HttpResponseRedirect(reverse(draft_status, None, kwargs={'submission_id': submission_id}))
|
|
|
|
|
|
def draft_force(request, submission_id):
|
|
return draft_approve(request, submission_id, check_function=_can_force_post)
|
|
|
|
|
|
def full_url_request(request, submission_id):
|
|
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
|
|
request_full_url(request, detail)
|
|
message = ('success', 'An email has been sent to draft authors to inform them of the full access url')
|
|
return draft_status(request, submission_id, message=message)
|