示例#1
0
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
示例#2
0
文件: views.py 项目: ekr/ietfdb
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,
    })
示例#3
0
文件: views.py 项目: algby/ietfdb
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))
示例#4
0
文件: views.py 项目: ekr/ietfdb
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")
示例#5
0
文件: views.py 项目: ekr/ietfdb
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})
示例#6
0
文件: views.py 项目: ekr/ietfdb
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")
示例#7
0
文件: views.py 项目: ekr/ietfdb
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,
                              })
示例#8
0
文件: views.py 项目: ekr/ietfdb
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,
    })
示例#9
0
文件: views.py 项目: algby/ietfdb
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))
示例#10
0
文件: views.py 项目: algby/ietfdb
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))
示例#11
0
文件: views.py 项目: algby/ietfdb
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))
示例#12
0
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})