datatracker/ietf/templates/submit/submission_status.html
Jennifer Richards a0f6cdb661
feat: Process uploaded submissions asynchronously (#5580)
* fix: Use relative URL for submission status link

* refactor: Refactor/rename process_uploaded_submission async task

* feat: Add async task to process but not accept a submission

* feat: Replace upload_submission() with an async implementation (WIP)

* fix: Do not put Submission in "uploaded" state if an error occured

* refactor: Improve text/XML draft processing flow

* feat: Extract authors from text in async processing

* fix: Fix call signatures and abort submission on failed validation

* feat: Validate submission name format

* fix: Correctly validate emails from text submission

* fix: Clean up submission validation

* fix: Better display errors on upload_submission page

* feat: Reload submission status page when awaiting validation

* test: Fix call signatures; remove unused imports

* chore: Add type hint

* test: Update tests to match renamed task

* fix: Fix typo in error message

* test: Fix failing Api- and AsyncSubmissionTests

* Rename process_uploaded_submission to process_and_accept_...
* Remove outdated tests

Does not yet test new behavior.

* refactor: Break up submission_file() helper

* test: Refactor tests to run the async processing (wip)

* test: Drop test of bad PDF submission

The PDF submission field was removed, so no need to test it.

* test: Update more tests

* test: Bring back create_and_post_submission() and fix more tests

* fix: Drop to manual, don't cancel, on revision inconsistency

Fixes remaining failing SubmitTest tests

* style: Restyle upload_submission() with black

* test: Verify that async submission processing is invoked on upload

* test: Bring back old do_submission and fix tests

Properly separating the upload and async processing stages of submission
is a bigger refactoring than will fit right now. This better exercises
the submission pipeline.

* fix: Accept only XML for API submissions

* test: Test submission processing utilities

* feat: Improve status display for "validating" submissions

* chore: Remove obsolete code

* test: Update test to match amended text

---------

Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
2023-05-09 15:21:46 -05:00

632 lines
28 KiB
HTML

{% extends "submit/submit_base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}
{% load static ietf_filters textfilters person_filters %}
{% load ietf_filters submit_tags misc_filters %}
{% block title %}Submission status of {{ submission.name }}-{{ submission.rev }}{% endblock %}
{% block pagehead %}
{{ block.super }}
{{ all_forms|merge_media:'css' }}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% block submit_content %}
{% origin %}
{% if submission.state_id != "uploaded" %}
<h2 class="mt-5">Submission status: {{ submission.state.name }}</h2>
{% endif %}
{% if message %}
<p class="alert alert-info my-3">
{{ message.1 }}
</p>
{% endif %}
{% if submission.state_id == "aut-appr" and submission.submitter_parsed.email not in confirmation_list|join:", " %}
<p class="alert alert-warning my-3">
Please note that since the database does not have your email address in the list of authors of previous
revisions of the document, you are <b>not</b> receiving a confirmation email yourself; one of the
addressees above will have to send a confirmation in order to complete the submission. This is done
to avoid document hijacking. If none of the known previous authors will be able to confirm the
submission, please contact
<a href="mailto:ietf-draft-submission@ietf.org">the Secretariat</a>
for action.
</p>
{% endif %}
{% if submitter_form.errors or replaces_form.errors or extresources_form.errors %}
<p class="alert alert-danger my-3">
Please fix errors in the form below.
</p>
{% endif %}
{% if submission.state_id != 'validating' %}
<h2 class="mt-5">Submission checks</h2>
<p class="alert {% if passes_checks %}alert-success{% else %}alert-warning{% endif %} my-3">
{% if passes_checks %}
Your Internet-Draft has been verified to pass the submission checks.
{% else %}
Your Internet-Draft has <b>NOT</b> been verified to pass the submission checks.
{% endif %}
</p>
{% if submission.authors|length > 5 %}
<p class="alert alert-danger my-3">
<b>
This document has more than five authors listed, which is considered excessive
under normal circumstances.</b> If you plan to request publication as an RFC, this
will require additional consideration by the stream manager (for example, the
IESG), and publication may be declined unless sufficient justification is
provided. See
<a href="{% url 'ietf.doc.views_doc.document_html' name='rfc7322' %}">RFC 7322, section 4.1.1</a>
for details.
</p>
{% endif %}
{% for check in submission.latest_checks %}
{% if check.errors %}
<p class="alert alert-warning my-3">
The {{ check.checker }} returned {{ check.errors }} error{{ check.errors|pluralize }}
and {{ check.warnings }} warning{{ check.warnings|pluralize }}; click the button
below to see details. Please fix those, and resubmit.
</p>
{% elif check.warnings %}
<p class="alert alert-warning my-3">
The {{ check.checker }} returned {{ check.warnings }} warning{{ check.warnings|pluralize }}.
</p>
{% endif %}
{% endfor %}
{% for check in submission.latest_checks %}
{% if check.passed != None %}
<button class="btn btn-{% if check.passed %}{% if check.warnings %}warning{% elif check.errors %}danger{% else %}success{% endif %}{% else %}danger{% endif %}"
type="button"
data-bs-toggle="modal"
data-bs-target="#check-{{ check.pk }}">
View {{ check.checker }}
</button>
<div class="modal fade"
id="check-{{ check.pk }}"
tabindex="-1"
role="dialog"
aria-labelledby="check-{{ check.pk }}"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content">
<div class="modal-header">
<p class="h5 modal-title" id="{{ check.checker|slugify }}-label">
{{ check.checker|title }} for {{ submission.name }}-{{ submission.rev }}
</p>
<button type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body" id="{{ check.checker|slugify }}-message">
<pre>{{ check.message|urlize_ietf_docs|linkify }}</pre>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
{% endif %}
{% endfor %}
{% endif %}
<div class="modal fade"
id="twopages"
tabindex="-1"
role="dialog"
aria-labelledby="twopageslabel"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content">
<div class="modal-header">
<p class="h5 modal-title" id="twopageslabel">First two pages of {{ submission.name }}-{{ submission.rev }}</p>
<button type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">{{ submission|two_pages_decorated_with_errors:errors }}</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
{% if submission.state_id == "waiting-for-draft" %}
<p class="alert alert-warning my-3">
This submission is awaiting the first Internet-Draft upload.
</p>
{% elif submission.state_id == 'validating' %}
<div class="alert alert-danger my-3">
Notice: The Internet-Draft submission process has changed as of Datatracker version 10.3.0.
Your Internet-Draft is currently being processed and validated asynchronously. Results will be
displayed at this URL when they are available. If JavaScript is enabled in your
browser, this page will refreshed automatically. If JavaScript is not enabled, or if you
disable the automatic refresh with the toggle below, please reload this page in a few
minutes to see the results.
</div>
<div class="alert alert-warning my-3">
This submission is being processed and validated. This normally takes a few minutes after
submission.
{% with earliest_event=submission.submissionevent_set.last %}
{% if earliest_event %}
Your draft was uploaded at {{ earliest_event.time }}<span id="time-since-uploaded" class="d-none">
({{ earliest_event.time|timesince }} ago)</span>.
{% endif %}
{% endwith %}
Please contact the secretariat for assistance if it has been more than an hour.
<div class="form-check form-switch mt-3 d-none">{# hide with d-none unless javascript makes it visible #}
<input class="form-check-input" type="checkbox" id="enableAutoReload" checked>
<label class="form-check-label" for="enableAutoReload"> Refresh automatically </label>
</div>
</div>
{% else %}
<h2 class="mt-5">Meta-data from the submission</h2>
{% if errors %}
<div class="alert alert-danger my-3">
<p>
<b>Meta-Data errors found!</b>
</p>
<p >
Please make sure that your Internet-Draft includes all of the required meta-data in the proper format.
</p>
<ul>
<li>
If your Internet-Draft <b>does</b> include all of the required meta-data in the proper format, and if
the error(s) identified below are due to the failure of the tool to extract the meta-data correctly,
then please use the "Adjust meta-data" button below, which will take you to the "Adjust screen" where
you can correct the improperly extracted meta-data. You will then be able to submit your Internet-Draft
to the Secretariat for manual posting.
</li>
<li>
If your Internet-Draft <b>does not</b> include all of the required meta-data in the proper format, then
please cancel this submission, update your Internet-Draft, and resubmit it.
</li>
</ul>
<p class="mb-0">
<b>Note:</b> The secretariat will <b>not</b> add any
meta-data to your Internet-Draft or edit the meta-data. An
Internet-Draft that does not include all of the required meta-data in
the proper format <b>will</b> be returned to the submitter.
</p>
</div>
{% endif %}
{% endif %}
<table class="table table-sm table-striped">
<tbody>
<tr>
<th scope="row">Document</th>
<td>
{% if submission.state_id == "posted" %}
<a href="{% url 'ietf.doc.views_doc.document_main' name=submission.name %}">{{ submission.name }}</a>
{% else %}
{{ submission.name }}
{% endif %}
{% if submission.first_two_pages %}
<button class="btn btn-primary btn-sm float-end ms-1"
type="button"
data-bs-toggle="modal"
data-bs-target="#twopages">
View first two pages
</button>
{% endif %}
{% show_submission_files submission %}
{% if errors.files %}
<p class="mt-1 mb-0 text-danger">
{{ errors.files|safe }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">Revision</th>
<td>
{{ submission.rev }}
{% if errors.rev %}
<button class="btn btn-primary btn-sm float-end"
type="button"
data-bs-toggle="modal"
data-bs-target="#twopages">
View errors in document
</button>
<p class="mt-1 mb-0 text-danger">
{{ errors.rev }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">Group</th>
<td>
{{ submission.group|default:"Individual Submission" }}
{% if submission.group %}<a href="{{ submission.group.about_url }}">({{ submission.group.acronym|upper }})</a>{% endif %}
{% if errors.group %}
<p class="mt-1 mb-0 text-danger">
{{ errors.group }}
</p>
{% endif %}
</td>
</tr>
{% if submission.state_id != 'validating' %}
<tr>
<th scope="row">Document date</th>
<td>
{{ submission.document_date }}
{% if errors.document_date %}
<p class="mt-1 mb-0 text-danger">
{{ errors.document_date }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">Submission date</th>
<td>{{ submission.submission_date }}</td>
</tr>
<tr>
<th scope="row">Title</th>
<td>
{{ submission.title|default:"" }}
{% if errors.title %}
<p class="mt-1 mb-0 text-danger">
{{ errors.title }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">Author count</th>
<td>
{{ submission.authors|length }} author{{ submission.authors|pluralize }}
{% if errors.authors %}
<p class="mt-1 mb-0 text-danger">
{{ errors.authors|safe }}
</p>
{% endif %}
</td>
</tr>
{% for author in submission.authors %}
<tr>
<th scope="row">Author {{ forloop.counter }}</th>
<td>
{{ author.name }}
{% if author.email %}&lt;{{ author.email|linkify }}&gt;{% endif %}
<br>
{% if author.affiliation %}
{{ author.affiliation }}
{% else %}
<i>unknown affiliation</i>
{% endif %}
<br>
{% if author.country %}
{{ author.country }}
{% if author.cleaned_country and author.country != author.cleaned_country %}
<span class="text-muted">(understood to be {{ author.cleaned_country }})</span>
{% endif %}
{% else %}
<i>unknown country</i>
{% endif %}
{% if author.country and not author.cleaned_country %}
<br>
<span class="text-warning">Unrecognized country: "{{ author.country }}"</span>: See
<a href="{% url "ietf.stats.views.known_countries_list" %}">
recognized country names
</a>.
{% endif %}
{% for auth_err in author.errors %}
<p class="mt-1 mb-0 text-danger">
{{ auth_err }}
</p>
{% endfor %}
</td>
</tr>
{% endfor %}
<tr>
<th scope="row">
Abstract
</th>
<td>
{{ submission.abstract|urlize_ietf_docs|linkify|linebreaksbr }}
{% if errors.abstract %}
<p class="mt-1 mb-0 text-danger">
{{ errors.abstract }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">
Page count
</th>
<td>
{{ submission.pages }}
{% if errors.pages %}
<p class="mt-1 mb-0 text-danger">
{{ errors.pages }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">
File size
</th>
<td>
{{ submission.file_size|filesizeformat }}
</td>
</tr>
<tr>
<th scope="row">
Formal languages used
</th>
<td>
{% for l in submission.formal_languages.all %}
{{ l.name }}{% if not forloop.last %},{% endif %}
{% empty %}None recognized
{% endfor %}
{% if errors.formal_languages %}
<p class="mt-1 mb-0 text-danger">
{{ errors.formal_languages }}
</p>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">
Submission additional resources
</th>
<td>
{% for r in external_resources.current %}
{% with res=r.res added=r.added %}
<div>
{{ res.name.name }}: {{ res.value }}
{% if res.display_name %}(as &quot;{{ res.display_name }}&quot;){% endif %}
{% if external_resources.show_changes and added %}<span class="badge rounded-pill bg-success">New</span>{% endif %}
</div>
{% endwith %}
{% empty %}
None
{% endfor %}
</td>
</tr>
{% if external_resources.show_changes %}
<tr>
<th scope="row">
Current document additional resources
</th>
<td>
{% for r in external_resources.previous %}
{% with res=r.res removed=r.removed %}
<div>
{{ res.name.name }}: {{ res.value }}
{% if res.display_name %}(as &quot;{{ res.display_name }}&quot;){% endif %}
{% if removed %}<span class="badge rounded-pill bg-warning">Removed</span>{% endif %}
</div>
{% endwith %}
{% empty %}
None
{% endfor %}
</td>
</tr>
{% endif %}
{% endif %}
</tbody>
</table>
{% if can_edit %}
<form method="post">
{% csrf_token %}
<input type="hidden" name="action" value="edit">
<button class="btn btn-warning" type="submit" value="adjust">
Adjust meta-data
</button>
</form>
<p class="form-text">
Leads to manual post by the secretariat.
</p>
{% if passes_checks and not errors and not submission.errors %}
<h2 class="mt-5">
Please edit the following meta-data before posting:
</h2>
<form class="idsubmit" method="post">
{% csrf_token %}
{% include "submit/submitter_form.html" %}
{% include "submit/replaces_form.html" %}
{% include "submit/extresources_form.html" %}
<input type="hidden" name="action" value="autopost">
<h2 class="mt-5">
Post submission
</h2>
<button class="btn btn-primary" type="submit">
Post submission
</button>
</form>
<p>
{% if requires_group_approval %}
Notifies group chairs to get approval.
{% elif requires_prev_authors_approval %}
Notifies authors of previous revision of Internet-Draft to get approval.
{% else %}
Notifies submitter and authors for confirmation.
{% endif %}
</p>
{% endif %}
{% else %}
{% if submission.submitter %}
<h2 class="mt-5">
Submitter information
</h2>
<table class="table table-sm table-striped">
<tbody>
<tr>
<th scope="row">
Name
</th>
<td>
{{ submission.submitter_parsed.name }}
</td>
</tr>
<tr>
<th scope="row">
Email address
</th>
<td>
{{ submission.submitter_parsed.email|linkify }}
</td>
</tr>
</tbody>
</table>
{% endif %}
{% if submission.replaces %}
<h2 class="mt-5">
Replaced documents
</h2>
<table class="table table-sm table-striped">
<tbody>
<tr>
<th scope="row">
Replaces
</th>
<td>
{{ submission.replaces|split:","|join:", "|urlize_ietf_docs }}
</td>
</tr>
</tbody>
</table>
{% endif %}
{% endif %}
{% if can_cancel %}
<form class="mt-3" id="cancel-submission" method="post">
{% csrf_token %}
<input type="hidden" name="action" value="cancel">
<button class="btn btn-danger"
type="submit"
data-bs-toggle="tooltip"
title="Deletes the uploaded file{{ submission.file_types|split:","|pluralize }} permanently.">
Cancel submission
</button>
</form>
{% endif %}
{% if can_group_approve %}
<form class="mt-3" method="post">
{% csrf_token %}
<input type="hidden" name="action" value="approve">
<button class="btn btn-success" type="submit">
Approve this submission
</button>
</form>
{% endif %}
{% if can_force_post %}
<form class="mt-3" method="post">
{% csrf_token %}
<input type="hidden" name="action" value="forcepost">
<button class="btn btn-warning" type="submit">
Force post of submission
</button>
</form>
{% endif %}
{% if user|has_role:"Secretariat" %}
<a id="send{{ submission.pk }}"
class="btn btn-primary mt-3"
href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk %}"
title="Email submitter">
<i class="bi bi-envelope" aria-hidden="true"></i> Send Email
</a>
{% endif %}
{% if show_send_full_url %}
<div class="alert alert-info my-3">
<p>
You are not allowed to modify or cancel this submission. You can
only modify or cancel this submission from the same URL you were
redirected to after the submission.
</p>
<p>
If you are the submitter check your browser history to find this
URL. You can share it with any person you need.
</p>
<p>
If you are one of the authors you can request the URL from which
you can modify or cancel this submission by clicking the next
button. An email will then be sent to the authors and submitter
(if submitter email was entered): {{ confirmation_list|join:", " }}.
</p>
<form class="mt-3" method="post">
{% csrf_token %}
<input type="hidden" name="action" value="sendfullurl">
<button class="btn btn-primary" type="submit">
Request full access URL
</button>
</form>
</div>
{% endif %}
<h2 class="mt-5">
History
</h2>
<table id="history" class="table table-sm table-striped tablesorter">
<thead>
<tr>
<th scope="col" data-sort="date">
Date
</th>
<th scope="col" data-sort="by">
By
</th>
<th scope="col" data-sort="event">
Event
</th>
</tr>
</thead>
{% if submission.submissionevent_set.all %}
<tbody>
{% for e in submission.submissionevent_set.all %}
<tr>
<td class="text-nowrap">
<span title="{{ e.time }}">{{ e.time|date:"Y-m-d" }}</span>
</td>
<td>
{% if e.by %}
{% person_link e.by %}
{% endif %}
</td>
{% if e.desc|startswith:"Received message" or e.desc|startswith:"Sent message" %}
{% with m=e.submissionemailevent.message %}
{% if user.is_authenticated %}
<td>
{% if e.desc|startswith:"Received message" and user|has_role:"Secretariat" %}
<a id="reply{{ submission.pk }}"
class="btn btn-primary btn-sm"
href="{% url "ietf.submit.views.send_submission_email" submission_id=submission.pk message_id=e.submissionemailevent.pk %}"
title="Reply">
<i class="bi bi-envelope" aria-hidden="true"></i> Reply
</a>
{% endif %}
Email:
<a id="aw{{ submission.pk }}-{{ m.pk }}"
href="{% url "ietf.submit.views.show_submission_email_message" submission_id=submission.pk message_id=e.submissionemailevent.pk access_token=submission.access_token %}">
{{ e.desc }}
</a>
</td>
{% else %}
<td>
Email:
<a id="aw{{ submission.pk }}-{{ m.pk }}"
href="{% url "ietf.submit.views.show_submission_email_message" submission_id=submission.pk message_id=e.submissionemailevent.pk %}">
{{ e.desc }}
</a>
</td>
{% endif %}
{% endwith %}
{% else %}
<td>
{{ e.desc|urlize_ietf_docs|linkify }}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
{% endif %}
</table>
{% include "submit/problem-reports-footer.html" %}
{% endblock %}
{% block js %}
{{ all_forms|merge_media:'js' }}
<script src="{% static "ietf/js/list.js" %}"></script>
<script src="{% static "ietf/js/draft-submit.js" %}"></script>
{% endblock %}