def add_submission_email(request, remote_ip, name, rev, submission_pk, message, by, msgtype): """Add email to submission history""" #in_reply_to = form.cleaned_data['in_reply_to'] # create Message parts = pyzmail.parse.get_mail_parts(message) body = '' for part in parts: if part.is_body == 'text/plain' and part.disposition == None: payload, used_charset = pyzmail.decode_text( part.get_payload(), part.charset, None) body = body + payload + '\n' msg = submit_message_from_message(message, body, by) if (submission_pk != None): # Must exist - we're adding a message to an existing submission submission = Submission.objects.get(pk=submission_pk) else: # Must not exist submissions = Submission.objects.filter( name=name, rev=rev).exclude(state_id='cancel') if submissions.count() > 0: raise ValidationError("Submission {} already exists".format(name)) # create Submission using the name try: submission = Submission.objects.create( state_id="waiting-for-draft", remote_ip=remote_ip, name=name, rev=rev, title=name, note="", submission_date=datetime.date.today(), replaces="", ) from ietf.submit.utils import create_submission_event, docevent_from_submission desc = "Submission created for rev {} in response to email".format( rev) create_submission_event(request, submission, desc) docevent_from_submission(request, submission, desc) except Exception as e: log("Exception: %s\n" % e) raise if msgtype == 'msgin': rs = "Received" else: rs = "Sent" desc = "{} message - manual post - {}-{}".format(rs, name, rev) submission_email_event = SubmissionEmailEvent.objects.create( desc=desc, submission=submission, msgtype=msgtype, by=by, message=msg) #in_reply_to = in_reply_to save_submission_email_attachments(submission_email_event, parts) return submission, submission_email_event
def confirm_submission(request, submission_id, auth_token): submission = get_object_or_404(Submission, pk=submission_id) key_matched = submission.auth_key and auth_token == generate_access_token(submission.auth_key) if not key_matched: key_matched = auth_token == submission.auth_key # backwards-compat if request.method == 'POST' and submission.state_id in ("auth", "aut-appr") and key_matched: # Set a temporary state 'confirmed' to avoid entering this code # multiple times to confirm. submission.state = DraftSubmissionStateName.objects.get(slug="confirmed") submission.save() action = request.POST.get('action') if action == 'confirm': submitter_parsed = submission.submitter_parsed() if submitter_parsed["name"] and submitter_parsed["email"]: # We know who approved it desc = "New version approved" elif submission.state_id == "auth": desc = "New version approved by author" else: desc = "New version approved by previous author" post_submission(request, submission, desc) create_submission_event(request, submission, "Confirmed and posted submission") return redirect("ietf.doc.views_doc.document_main", name=submission.name) elif action == "cancel": if submission.state.next_states.filter(slug="cancel"): cancel_submission(submission) create_submission_event(request, submission, "Cancelled submission") messages.success(request, 'The submission was cancelled.') else: messages.error(request, 'The submission is not in a state where it can be cancelled.') return redirect("ietf.submit.views.submission_status", submission_id=submission_id) else: raise RuntimeError("Unexpected state in confirm_submission()") return render(request, 'submit/confirm_submission.html', { 'submission': submission, 'key_matched': key_matched, })
def confirm_submission(request, submission_id, auth_token): submission = get_object_or_404(Submission, pk=submission_id) key_matched = submission.auth_key and auth_token == generate_access_token(submission.auth_key) if not key_matched: key_matched = auth_token == submission.auth_key # backwards-compat if request.method == 'POST' and submission.state_id in ("auth", "aut-appr") and key_matched: post_submission(request, submission) create_submission_event(request, submission, "Confirmed and posted submission") return redirect("doc_view", name=submission.name) return render_to_response('submit/confirm_submission.html', { 'submission': submission, 'key_matched': key_matched, }, context_instance=RequestContext(request))
def cancel_waiting_for_draft(request): if request.method == 'POST': can_cancel = has_role(request.user, "Secretariat") if not can_cancel: return HttpResponseForbidden('You do not have permission to perform this action') submission_id = request.POST.get('submission_id', '') access_token = request.POST.get('access_token', '') submission = get_submission_or_404(submission_id, access_token = access_token) cancel_submission(submission) create_submission_event(request, submission, "Cancelled submission") if (submission.rev != "00"): # Add a doc event docevent_from_submission(request, submission, "Cancelled submission for rev {}".format(submission.rev)) return redirect("ietf.submit.views.manualpost")
def upload_submission(request): if request.method == 'POST': try: form = SubmissionManualUploadForm(request, data=request.POST, files=request.FILES) if form.is_valid(): authors, abstract, file_name, file_size = get_draft_meta(form) submission = get_submission(form) try: fill_in_submission(form, submission, authors, abstract, file_size) except Exception as e: if submission: submission.delete() log("Exception: %s\n" % e) raise apply_checkers(submission, file_name) create_submission_event(request, submission, desc="Uploaded submission") # Don't add an "Uploaded new revision doevent yet, in case of cancellation return redirect("ietf.submit.views.submission_status", submission_id=submission.pk, access_token=submission.access_token()) except IOError as e: if "read error" in str(e): # The server got an IOError when trying to read POST data form = SubmissionManualUploadForm(request=request) form._errors = {} form._errors["__all__"] = form.error_class(["There was a failure receiving the complete form data -- please try again."]) else: raise except ValidationError as e: form = SubmissionManualUploadForm(request=request) form._errors = {} form._errors["__all__"] = form.error_class(["There was a failure converting the xml file to text -- please verify that your xml file is valid. (%s)" % e.message]) else: form = SubmissionManualUploadForm(request=request) return render(request, 'submit/upload_submission.html', {'selected': 'index', 'form': form})
def api_submit(request): "Automated submission entrypoint" submission = None def err(code, text): return HttpResponse(text, status=code, content_type='text/plain') if request.method == 'GET': return render(request, 'submit/api_submit_info.html') elif request.method == 'POST': e = None try: form = SubmissionAutoUploadForm(request, data=request.POST, files=request.FILES) if form.is_valid(): username = form.cleaned_data['user'] user = User.objects.filter(username=username) if user.count() == 0: return err(404, "No such user: %s" % username) if user.count() > 1: return err(500, "Multiple matching accounts for %s" % username) user = user.first() if not hasattr(user, 'person'): return err(404, "No person with username %s" % username) authors, abstract, file_name, file_size = get_draft_meta(form) submission = get_submission(form) fill_in_submission(form, submission, authors, abstract, file_size) apply_checkers(submission, file_name) create_submission_event(request, submission, desc="Uploaded submission") errors = validate_submission(submission) if errors: raise ValidationError(errors) errors = [ c.message for c in submission.checks.all() if c.passed==False ] if errors: raise ValidationError(errors) if not user.username in [ a['email'] for a in authors ]: raise ValidationError('Submitter %s is not one of the document authors' % user.username) submission.submitter = user.person.formatted_email() docevent_from_submission(request, submission, desc="Uploaded new revision") requires_group_approval = (submission.rev == '00' and submission.group and submission.group.type_id in ("wg", "rg", "ietf", "irtf", "iab", "iana", "rfcedtyp") and not Preapproval.objects.filter(name=submission.name).exists()) requires_prev_authors_approval = Document.objects.filter(name=submission.name) sent_to, desc, docDesc = send_confirmation_emails(request, submission, requires_group_approval, requires_prev_authors_approval) msg = u"Set submitter to \"%s\" and %s" % (submission.submitter, desc) create_submission_event(request, submission, msg) docevent_from_submission(request, submission, docDesc, who="(System)") return HttpResponse( "Upload of %s OK, confirmation requests sent to:\n %s" % (submission.name, ',\n '.join(sent_to)), content_type="text/plain") else: raise ValidationError(form.errors) except IOError as e: return err(500, "IO Error: %s" % str(e)) except ValidationError as e: return err(400, "Validation Error: %s" % str(e)) except Exception as e: raise return err(500, "Exception: %s" % str(e)) finally: if e and submission: remove_submission_files(submission) submission.delete() else: return err(405, "Method not allowed")
def edit_submission(request, submission_id, access_token=None): submission = get_object_or_404(Submission, pk=submission_id, state="uploaded") if not can_edit_submission(request.user, submission, access_token): return HttpResponseForbidden('You do not have permission to access this page') errors = validate_submission(submission) form_errors = False # we split the form handling into multiple forms, one for the # submission itself, one for the submitter, and a list of forms # for the authors empty_author_form = AuthorForm() if request.method == 'POST': # get a backup submission now, the model form may change some # fields during validation prev_submission = Submission.objects.get(pk=submission.pk) edit_form = EditSubmissionForm(request.POST, instance=submission, prefix="edit") submitter_form = SubmitterForm(request.POST, prefix="submitter") replaces_form = ReplacesForm(request.POST,name=submission.name) author_forms = [ AuthorForm(request.POST, prefix=prefix) for prefix in request.POST.getlist("authors-prefix") if prefix != "authors-" ] # trigger validation of all forms validations = [edit_form.is_valid(), submitter_form.is_valid(), replaces_form.is_valid()] + [ f.is_valid() for f in author_forms ] if all(validations): changed_fields = [] submission.submitter = submitter_form.cleaned_line() replaces = replaces_form.cleaned_data.get("replaces", []) submission.replaces = ",".join(o.name for o in replaces) submission.authors = [ { attr: f.cleaned_data.get(attr) or "" for attr in ["name", "email", "affiliation", "country"] } for f in author_forms ] edit_form.save(commit=False) # transfer changes if submission.rev != prev_submission.rev: rename_submission_files(submission, prev_submission.rev, submission.rev) submission.state = DraftSubmissionStateName.objects.get(slug="manual") submission.save() formal_languages_changed = False if set(submission.formal_languages.all()) != set(edit_form.cleaned_data["formal_languages"]): submission.formal_languages = edit_form.cleaned_data["formal_languages"] formal_languages_changed = True send_manual_post_request(request, submission, errors) changed_fields += [ submission._meta.get_field(f).verbose_name for f in list(edit_form.fields.keys()) + ["submitter", "authors"] if (f == "formal_languages" and formal_languages_changed) or getattr(submission, f) != getattr(prev_submission, f) ] if changed_fields: desc = u"Edited %s and sent request for manual post" % u", ".join(changed_fields) else: desc = "Sent request for manual post" create_submission_event(request, submission, desc) return redirect("ietf.submit.views.submission_status", submission_id=submission.pk) else: form_errors = True else: edit_form = EditSubmissionForm(instance=submission, prefix="edit") submitter_form = SubmitterForm(initial=submission.submitter_parsed(), prefix="submitter") replaces_form = ReplacesForm(name=submission.name,initial=DocAlias.objects.filter(name__in=submission.replaces.split(","))) author_forms = [ AuthorForm(initial=author, prefix="authors-%s" % i) for i, author in enumerate(submission.authors) ] return render(request, 'submit/edit_submission.html', {'selected': 'status', 'submission': submission, 'edit_form': edit_form, 'submitter_form': submitter_form, 'replaces_form': replaces_form, 'author_forms': author_forms, 'empty_author_form': empty_author_form, 'errors': errors, 'form_errors': form_errors, })
def submission_status(request, submission_id, access_token=None): submission = get_object_or_404(Submission, pk=submission_id) key_matched = access_token and submission.access_token() == access_token if not key_matched: key_matched = submission.access_key == access_token # backwards-compat if access_token and not key_matched: raise Http404 errors = validate_submission(submission) passes_checks = all([ c.passed!=False for c in submission.checks.all() ]) is_secretariat = has_role(request.user, "Secretariat") is_chair = submission.group and submission.group.has_role(request.user, "chair") can_edit = can_edit_submission(request.user, submission, access_token) and submission.state_id == "uploaded" can_cancel = (key_matched or is_secretariat) and submission.state.next_states.filter(slug="cancel") can_group_approve = (is_secretariat or is_chair) and submission.state_id == "grp-appr" can_force_post = ( is_secretariat and submission.state.next_states.filter(slug="posted").exists() and submission.state_id != "waiting-for-draft") show_send_full_url = ( not key_matched and not is_secretariat and not submission.state_id in ("cancel", "posted") ) # Begin common code chunk addrs = gather_address_lists('sub_confirmation_requested',submission=submission) confirmation_list = addrs.to confirmation_list.extend(addrs.cc) requires_group_approval = (submission.rev == '00' and submission.group and submission.group.type_id in ("wg", "rg", "ietf", "irtf", "iab", "iana", "rfcedtyp") and not Preapproval.objects.filter(name=submission.name).exists()) requires_prev_authors_approval = Document.objects.filter(name=submission.name) message = None if submission.state_id == "cancel": message = ('error', 'This submission has been cancelled, modification is no longer possible.') elif submission.state_id == "auth": message = ('success', u'The submission is pending email authentication. An email has been sent to: %s' % ", ".join(confirmation_list)) elif submission.state_id == "grp-appr": message = ('success', 'The submission is pending approval by the group chairs.') elif submission.state_id == "aut-appr": message = ('success', 'The submission is pending approval by the authors of the previous version. An email has been sent to: %s' % ", ".join(confirmation_list)) submitter_form = SubmitterForm(initial=submission.submitter_parsed(), prefix="submitter") replaces_form = ReplacesForm(name=submission.name,initial=DocAlias.objects.filter(name__in=submission.replaces.split(","))) if request.method == 'POST': action = request.POST.get('action') if action == "autopost" and submission.state_id == "uploaded": if not can_edit: return HttpResponseForbidden("You do not have permission to perform this action") submitter_form = SubmitterForm(request.POST, prefix="submitter") replaces_form = ReplacesForm(request.POST, name=submission.name) validations = [submitter_form.is_valid(), replaces_form.is_valid()] if all(validations): submission.submitter = submitter_form.cleaned_line() replaces = replaces_form.cleaned_data.get("replaces", []) submission.replaces = ",".join(o.name for o in replaces) approvals_received = submitter_form.cleaned_data['approvals_received'] if approvals_received: if not is_secretariat: return HttpResponseForbidden('You do not have permission to perform this action') # go directly to posting submission docevent_from_submission(request, submission, desc="Uploaded new revision") desc = u"Secretariat manually posting. Approvals already received" post_submission(request, submission, desc) create_submission_event(request, submission, desc) else: sent_to, desc, docDesc = send_confirmation_emails(request, submission, requires_group_approval, requires_prev_authors_approval) msg = u"Set submitter to \"%s\", replaces to %s and %s" % ( submission.submitter, ", ".join(prettify_std_name(r.name) for r in replaces) if replaces else "(none)", desc) create_submission_event(request, submission, msg) docevent_from_submission(request, submission, docDesc, who="(System)") if access_token: return redirect("ietf.submit.views.submission_status", submission_id=submission.pk, access_token=access_token) else: return redirect("ietf.submit.views.submission_status", submission_id=submission.pk) elif action == "edit" and submission.state_id == "uploaded": if access_token: return redirect("ietf.submit.views.edit_submission", submission_id=submission.pk, access_token=access_token) else: return redirect("ietf.submit.views.edit_submission", submission_id=submission.pk) elif action == "sendfullurl" and submission.state_id not in ("cancel", "posted"): sent_to = send_full_url(request, submission) message = ('success', u'An email has been sent with the full access URL to: %s' % u",".join(confirmation_list)) create_submission_event(request, submission, u"Sent full access URL to: %s" % u", ".join(sent_to)) elif action == "cancel" and submission.state.next_states.filter(slug="cancel"): if not can_cancel: return HttpResponseForbidden('You do not have permission to perform this action') cancel_submission(submission) create_submission_event(request, submission, "Cancelled submission") return redirect("ietf.submit.views.submission_status", submission_id=submission_id) elif action == "approve" and submission.state_id == "grp-appr": if not can_group_approve: return HttpResponseForbidden('You do not have permission to perform this action') post_submission(request, submission, "WG -00 approved") create_submission_event(request, submission, "Approved and posted submission") return redirect("ietf.doc.views_doc.document_main", name=submission.name) elif action == "forcepost" and submission.state.next_states.filter(slug="posted"): if not can_force_post: return HttpResponseForbidden('You do not have permission to perform this action') if submission.state_id == "manual": desc = "Posted submission manually" else: desc = "Forced post of submission" post_submission(request, submission, desc) create_submission_event(request, submission, desc) return redirect("ietf.doc.views_doc.document_main", name=submission.name) else: # something went wrong, turn this into a GET and let the user deal with it return HttpResponseRedirect("") for author in submission.authors: author["cleaned_country"] = clean_country_name(author.get("country")) return render(request, 'submit/submission_status.html', { 'selected': 'status', 'submission': submission, 'errors': errors, 'passes_checks': passes_checks, 'submitter_form': submitter_form, 'replaces_form': replaces_form, 'message': message, 'can_edit': can_edit, 'can_force_post': can_force_post, 'can_group_approve': can_group_approve, 'can_cancel': can_cancel, 'show_send_full_url': show_send_full_url, 'requires_group_approval': requires_group_approval, 'requires_prev_authors_approval': requires_prev_authors_approval, 'confirmation_list': confirmation_list, })
def edit_submission(request, submission_id, access_token=None): submission = get_object_or_404(Submission, pk=submission_id, state="uploaded") if not can_edit_submission(request.user, submission, access_token): return HttpResponseForbidden('You do not have permission to access this page') errors = validate_submission(submission) form_errors = False # we split the form handling into multiple forms, one for the # submission itself, one for the submitter, and a list of forms # for the authors empty_author_form = NameEmailForm(email_required=False) if request.method == 'POST': # get a backup submission now, the model form may change some # fields during validation prev_submission = Submission.objects.get(pk=submission.pk) edit_form = EditSubmissionForm(request.POST, instance=submission, prefix="edit") submitter_form = NameEmailForm(request.POST, prefix="submitter") author_forms = [ NameEmailForm(request.POST, email_required=False, prefix=prefix) for prefix in request.POST.getlist("authors-prefix") if prefix != "authors-" ] # trigger validation of all forms validations = [edit_form.is_valid(), submitter_form.is_valid()] + [ f.is_valid() for f in author_forms ] if all(validations): submission.submitter = submitter_form.cleaned_line() submission.authors = "\n".join(f.cleaned_line() for f in author_forms) edit_form.save(commit=False) # transfer changes if submission.rev != prev_submission.rev: rename_submission_files(submission, prev_submission.rev, submission.rev) submission.state = DraftSubmissionStateName.objects.get(slug="manual") submission.save() send_manual_post_request(request, submission, errors) changed_fields = [ submission._meta.get_field(f).verbose_name for f in list(edit_form.fields.keys()) + ["submitter", "authors"] if getattr(submission, f) != getattr(prev_submission, f) ] if changed_fields: desc = u"Edited %s and sent request for manual post" % u", ".join(changed_fields) else: desc = "Sent request for manual post" create_submission_event(request, submission, desc) return redirect("submit_submission_status", submission_id=submission.pk) else: form_errors = True else: edit_form = EditSubmissionForm(instance=submission, prefix="edit") submitter_form = NameEmailForm(initial=submission.submitter_parsed(), prefix="submitter") author_forms = [ NameEmailForm(initial=author, email_required=False, prefix="authors-%s" % i) for i, author in enumerate(submission.authors_parsed()) ] return render_to_response('submit/edit_submission.html', {'selected': 'status', 'submission': submission, 'edit_form': edit_form, 'submitter_form': submitter_form, 'author_forms': author_forms, 'empty_author_form': empty_author_form, 'errors': errors, 'form_errors': form_errors, }, context_instance=RequestContext(request))
def upload_submission(request): if request.method == 'POST': try: form = UploadForm(request, data=request.POST, files=request.FILES) if form.is_valid(): # save files file_types = [] for ext in ['txt', 'pdf', 'xml', 'ps']: f = form.cleaned_data[ext] if not f: continue file_types.append('.%s' % ext) draft = form.parsed_draft name = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s.%s' % (draft.filename, draft.revision, ext)) with open(name, 'wb+') as destination: for chunk in f.chunks(): destination.write(chunk) # check idnits text_path = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s.txt' % (draft.filename, draft.revision)) idnits_message = check_idnits(text_path) # extract author lines authors = [] for author in draft.get_author_list(): full_name, first_name, middle_initial, last_name, name_suffix, email, company = author line = full_name.replace("\n", "").replace("\r", "").replace("<", "").replace(">", "").strip() email = (email or "").strip() if email: try: validate_email(email) except ValidationError: email = "" if email: line += u" <%s>" % email authors.append(line) # save submission submission = Submission.objects.create( state=DraftSubmissionStateName.objects.get(slug="uploaded"), remote_ip=form.remote_ip, name=draft.filename, group=form.group, title=draft.get_title(), abstract=draft.get_abstract(), rev=draft.revision, pages=draft.get_pagecount(), authors="\n".join(authors), note="", first_two_pages=''.join(draft.pages[:2]), file_size=form.cleaned_data['txt'].size, file_types=','.join(file_types), submission_date=datetime.date.today(), document_date=draft.get_creation_date(), replaces="", idnits_message=idnits_message, ) create_submission_event(request, submission, desc="Uploaded submission") return redirect("submit_submission_status_by_hash", submission_id=submission.pk, access_token=submission.access_token()) except IOError as e: if "read error" in str(e): # The server got an IOError when trying to read POST data form = UploadForm(request=request) form._errors = {} form._errors["__all__"] = form.error_class(["There was a failure receiving the complete form data -- please try again."]) else: raise else: form = UploadForm(request=request) return render_to_response('submit/upload_submission.html', {'selected': 'index', 'form': form}, context_instance=RequestContext(request))
def submission_status(request, submission_id, access_token=None): submission = get_object_or_404(Submission, pk=submission_id) key_matched = access_token and submission.access_token() == access_token if not key_matched: key_matched = submission.access_key == access_token # backwards-compat if access_token and not key_matched: raise Http404 errors = validate_submission(submission) passes_idnits = found_idnits(submission.idnits_message) is_secretariat = has_role(request.user, "Secretariat") is_chair = submission.group and submission.group.has_role(request.user, "chair") can_edit = can_edit_submission(request.user, submission, access_token) and submission.state_id == "uploaded" can_cancel = (key_matched or is_secretariat) and submission.state.next_states.filter(slug="cancel") can_group_approve = (is_secretariat or is_chair) and submission.state_id == "grp-appr" can_force_post = is_secretariat and submission.state.next_states.filter(slug="posted") show_send_full_url = not key_matched and not is_secretariat and submission.state_id not in ("cancel", "posted") confirmation_list = submission_confirmation_email_list(submission) try: preapproval = Preapproval.objects.get(name=submission.name) except Preapproval.DoesNotExist: preapproval = None requires_group_approval = submission.rev == '00' and submission.group and submission.group.type_id in ("wg", "rg") and not preapproval requires_prev_authors_approval = Document.objects.filter(name=submission.name) message = None if submission.state_id == "cancel": message = ('error', 'This submission has been canceled, modification is no longer possible.') elif submission.state_id == "auth": message = ('success', u'The submission is pending email authentication. An email has been sent to: %s' % ", ".join(confirmation_list)) elif submission.state_id == "grp-appr": message = ('success', 'The submission is pending approval by the group chairs.') elif submission.state_id == "aut-appr": message = ('success', 'The submission is pending approval by the authors of the previous version. An email has been sent to: %s' % ", ".join(confirmation_list)) submitter_form = NameEmailForm(initial=submission.submitter_parsed(), prefix="submitter") if request.method == 'POST': action = request.POST.get('action') if action == "autopost" and submission.state_id == "uploaded": if not can_edit: return HttpResponseForbidden("You do not have permission to perfom this action") submitter_form = NameEmailForm(request.POST, prefix="submitter") if submitter_form.is_valid(): submission.submitter = submitter_form.cleaned_line() if requires_group_approval: submission.state = DraftSubmissionStateName.objects.get(slug="grp-appr") submission.save() sent_to = send_approval_request_to_group(request, submission) desc = "sent approval email to group chairs: %s" % u", ".join(sent_to) else: submission.auth_key = generate_random_key() if requires_prev_authors_approval: submission.state = DraftSubmissionStateName.objects.get(slug="aut-appr") else: submission.state = DraftSubmissionStateName.objects.get(slug="auth") submission.save() sent_to = send_submission_confirmation(request, submission) if submission.state_id == "aut-appr": desc = u"sent confirmation email to previous authors: %s" % u", ".join(sent_to) else: desc = u"sent confirmation email to submitter and authors: %s" % u", ".join(sent_to) create_submission_event(request, submission, u"Set submitter to \"%s\" and %s" % (submission.submitter, desc)) if access_token: return redirect("submit_submission_status_by_hash", submission_id=submission.pk, access_token=access_token) else: return redirect("submit_submission_status", submission_id=submission.pk) elif action == "edit" and submission.state_id == "uploaded": if access_token: return redirect("submit_edit_submission_by_hash", submission_id=submission.pk, access_token=access_token) else: return redirect("submit_edit_submission", submission_id=submission.pk) elif action == "sendfullurl" and submission.state_id not in ("cancel", "posted"): sent_to = send_full_url(request, submission) message = ('success', u'An email has been sent with the full access URL to: %s' % u",".join(confirmation_list)) create_submission_event(request, submission, u"Sent full access URL to: %s" % u", ".join(sent_to)) elif action == "cancel" and submission.state.next_states.filter(slug="cancel"): if not can_cancel: return HttpResponseForbidden('You do not have permission to perform this action') cancel_submission(submission) create_submission_event(request, submission, "Canceled submission") return redirect("submit_submission_status", submission_id=submission_id) elif action == "approve" and submission.state_id == "grp-appr": if not can_group_approve: return HttpResponseForbidden('You do not have permission to perform this action') post_submission(request, submission) create_submission_event(request, submission, "Approved and posted submission") return redirect("doc_view", name=submission.name) elif action == "forcepost" and submission.state.next_states.filter(slug="posted"): if not can_force_post: return HttpResponseForbidden('You do not have permission to perform this action') post_submission(request, submission) if submission.state_id == "manual": desc = "Posted submission manually" else: desc = "Forced post of submission" create_submission_event(request, submission, desc) return redirect("doc_view", name=submission.name) else: # something went wrong, turn this into a GET and let the user deal with it return HttpResponseRedirect("") return render_to_response('submit/submission_status.html', {'selected': 'status', 'submission': submission, 'errors': errors, 'passes_idnits': passes_idnits, 'submitter_form': submitter_form, 'message': message, 'can_edit': can_edit, 'can_force_post': can_force_post, 'can_group_approve': can_group_approve, 'can_cancel': can_cancel, 'show_send_full_url': show_send_full_url, 'requires_group_approval': requires_group_approval, 'requires_prev_authors_approval': requires_prev_authors_approval, 'confirmation_list': confirmation_list, }, context_instance=RequestContext(request))
def upload_submission(request): if request.method == 'POST': try: form = SubmissionUploadForm(request, data=request.POST, files=request.FILES) if form.is_valid(): authors = [] file_name = {} abstract = None file_size = None for ext in form.fields.keys(): f = form.cleaned_data[ext] if not f: continue name = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s.%s' % (form.filename, form.revision, ext)) file_name[ext] = name with open(name, 'wb+') as destination: for chunk in f.chunks(): destination.write(chunk) if form.cleaned_data['xml']: if not form.cleaned_data['txt']: file_name['txt'] = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s.txt' % (form.filename, form.revision)) try: pagedwriter = xml2rfc.PaginatedTextRfcWriter(form.xmltree, quiet=True) pagedwriter.write(file_name['txt']) except Exception as e: raise ValidationError("Error from xml2rfc: %s" % e) file_size = os.stat(file_name['txt']).st_size # Some meta-information, such as the page-count, can only # be retrieved from the generated text file. Provide a # parsed draft object to get at that kind of information. with open(file_name['txt']) as txt_file: form.parsed_draft = Draft(txt_file.read(), txt_file.name) else: file_size = form.cleaned_data['txt'].size if form.authors: authors = form.authors else: # If we don't have an xml file, try to extract the # relevant information from the text file for author in form.parsed_draft.get_author_list(): full_name, first_name, middle_initial, last_name, name_suffix, email, company = author line = full_name.replace("\n", "").replace("\r", "").replace("<", "").replace(">", "").strip() email = (email or "").strip() if email: try: validate_email(email) except ValidationError: email = "" if email: line += u" <%s>" % email authors.append(line) if form.abstract: abstract = form.abstract else: abstract = form.parsed_draft.get_abstract() # check idnits idnits_message = check_idnits(file_name['txt']) # save submission try: submission = Submission.objects.create( state=DraftSubmissionStateName.objects.get(slug="uploaded"), remote_ip=form.remote_ip, name=form.filename, group=form.group, title=form.title, abstract=abstract, rev=form.revision, pages=form.parsed_draft.get_pagecount(), authors="\n".join(authors), note="", first_two_pages=''.join(form.parsed_draft.pages[:2]), file_size=file_size, file_types=','.join(form.file_types), submission_date=datetime.date.today(), document_date=form.parsed_draft.get_creation_date(), replaces="", idnits_message=idnits_message, ) except Exception as e: log("Exception: %s\n" % e) raise create_submission_event(request, submission, desc="Uploaded submission") return redirect("submit_submission_status_by_hash", submission_id=submission.pk, access_token=submission.access_token()) except IOError as e: if "read error" in str(e): # The server got an IOError when trying to read POST data form = SubmissionUploadForm(request=request) form._errors = {} form._errors["__all__"] = form.error_class(["There was a failure receiving the complete form data -- please try again."]) else: raise except ValidationError as e: form = SubmissionUploadForm(request=request) form._errors = {} form._errors["__all__"] = form.error_class(["There was a failure converting the xml file to text -- please verify that your xml file is valid. (%s)" % e.message]) else: form = SubmissionUploadForm(request=request) return render(request, 'submit/upload_submission.html', {'selected': 'index', 'form': form})