Decorated post_submission() with @transaction.atomic, and did some slight refactoring of code related to post_submission() calls and submission events. This was triggered by a submission left in an intermediate state because of a WSGI timeout (leading to a 504 error).

- Legacy-Id: 17892
This commit is contained in:
Henrik Levkowetz 2020-05-28 15:01:33 +00:00
parent b3374fa351
commit 186e2ae67b
3 changed files with 24 additions and 26 deletions

View file

@ -1803,7 +1803,7 @@ class ApiSubmitTests(TestCase):
settings.IDSUBMIT_REPOSITORY_PATH = self.saved_idsubmit_repository_path
settings.INTERNET_DRAFT_ARCHIVE_DIR = self.saved_archive_dir
def post_submission(self, rev, author=None, name=None, group=None, email=None, title=None, year=None):
def do_post_submission(self, rev, author=None, name=None, group=None, email=None, title=None, year=None):
url = urlreverse('ietf.submit.views.api_submit')
if author is None:
author = PersonFactory()
@ -1831,14 +1831,14 @@ class ApiSubmitTests(TestCase):
self.assertEqual(r.status_code, 405)
def test_api_submit_ok(self):
r, author, name = self.post_submission('00')
r, author, name = self.do_post_submission('00')
expected = "Upload of %s OK, confirmation requests sent to:\n %s" % (name, author.formatted_email().replace('\n',''))
self.assertContains(r, expected, status_code=200)
def test_api_submit_secondary_email_active(self):
person = PersonFactory()
email = EmailFactory(person=person)
r, author, name = self.post_submission('00', author=person, email=email.address)
r, author, name = self.do_post_submission('00', author=person, email=email.address)
for expected in [
"Upload of %s OK, confirmation requests sent to:" % (name, ),
author.formatted_email().replace('\n',''),
@ -1851,43 +1851,43 @@ class ApiSubmitTests(TestCase):
prim.primary = True
prim.save()
email = EmailFactory(person=person, active=False)
r, author, name = self.post_submission('00', author=person, email=email.address)
r, author, name = self.do_post_submission('00', author=person, email=email.address)
expected = "No such user: %s" % email.address
self.assertContains(r, expected, status_code=400)
def test_api_submit_no_user(self):
email='nonexistant.user@example.org'
r, author, name = self.post_submission('00', email=email)
r, author, name = self.do_post_submission('00', email=email)
expected = "No such user: %s" % email
self.assertContains(r, expected, status_code=400)
def test_api_submit_no_person(self):
user = UserFactory()
email = user.username
r, author, name = self.post_submission('00', email=email)
r, author, name = self.do_post_submission('00', email=email)
expected = "No person with username %s" % email
self.assertContains(r, expected, status_code=400)
def test_api_submit_wrong_revision(self):
r, author, name = self.post_submission('01')
r, author, name = self.do_post_submission('01')
expected = "Invalid revision (revision 00 is expected)"
self.assertContains(r, expected, status_code=400)
def test_api_submit_pending_submission(self):
r, author, name = self.post_submission('00')
r, author, name = self.do_post_submission('00')
expected = "Upload of"
self.assertContains(r, expected, status_code=200)
r, author, name = self.post_submission('00', author=author, name=name)
r, author, name = self.do_post_submission('00', author=author, name=name)
expected = "A submission with same name and revision is currently being processed"
self.assertContains(r, expected, status_code=400)
def test_api_submit_no_title(self):
r, author, name = self.post_submission('00', title=" ")
r, author, name = self.do_post_submission('00', title=" ")
expected = "Could not extract a valid title from the upload"
self.assertContains(r, expected, status_code=400)
def test_api_submit_failed_idnits(self):
r, author, name = self.post_submission('00', year="2010")
r, author, name = self.do_post_submission('00', year="2010")
expected = "Document date must be within 3 days of submission date"
self.assertContains(r, expected, status_code=400)

View file

@ -12,6 +12,7 @@ from typing import Callable, Optional # pyflakes:ignore
from django.conf import settings
from django.core.validators import validate_email, ValidationError
from django.db import transaction
from django.http import HttpRequest # pyflakes:ignore
from django.utils.module_loading import import_string
@ -239,7 +240,8 @@ def post_rev00_submission_events(draft, submission, submitter):
return events
def post_submission(request, submission, approvedDesc):
@transaction.atomic
def post_submission(request, submission, approved_doc_desc, approved_subm_desc):
system = Person.objects.get(name="(System)")
submitter_parsed = submission.submitter_parsed()
if submitter_parsed["name"] and submitter_parsed["email"]:
@ -294,7 +296,7 @@ def post_submission(request, submission, approvedDesc):
type="new_submission",
doc=draft,
by=system,
desc=approvedDesc,
desc=approved_doc_desc,
submission=submission,
rev=submission.rev,
)
@ -419,6 +421,8 @@ def post_submission(request, submission, approvedDesc):
submission.draft = draft
submission.save()
create_submission_event(request, submission, approved_subm_desc)
def update_replaces_from_submission(request, submission, draft):
if not submission.replaces:
return [], []

View file

@ -304,8 +304,8 @@ def submission_status(request, submission_id, access_token=None):
docevent_from_submission(request, submission, desc="Uploaded new revision")
desc = "Secretariat manually posting. Approvals already received"
post_submission(request, submission, desc)
create_submission_event(request, submission, desc)
post_submission(request, submission, desc, desc)
else:
doc = submission.existing_document()
prev_authors = [] if not doc else [ author.person for author in doc.documentauthor_set.all() ]
@ -316,8 +316,8 @@ def submission_status(request, submission_id, access_token=None):
docevent_from_submission(request, submission, desc="Uploaded new revision", who=request.user.person) # type: ignore
desc = "New version accepted (logged-in submitter: %s)" % request.user.person # type: ignore
post_submission(request, submission, desc)
create_submission_event(request, submission, desc)
post_submission(request, submission, desc, desc)
else:
sent_to, desc, docDesc = send_confirmation_emails(request, submission, requires_group_approval, requires_prev_authors_approval)
msg = "Set submitter to \"%s\", replaces to %s and %s" % (
@ -360,9 +360,7 @@ def submission_status(request, submission_id, access_token=None):
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")
post_submission(request, submission, "WG -00 approved", "Approved and posted submission")
return redirect("ietf.doc.views_doc.document_main", name=submission.name)
@ -376,9 +374,7 @@ def submission_status(request, submission_id, access_token=None):
else:
desc = "Forced post of submission"
post_submission(request, submission, desc)
create_submission_event(request, submission, desc)
post_submission(request, submission, desc, desc)
return redirect("ietf.doc.views_doc.document_main", name=submission.name)
@ -523,9 +519,7 @@ def confirm_submission(request, submission_id, auth_token):
else:
desc = "New version approved by previous author"
post_submission(request, submission, desc)
create_submission_event(request, submission, "Confirmed and posted submission")
post_submission(request, submission, desc, "Confirmed and posted submission")
return redirect("ietf.doc.views_doc.document_main", name=submission.name)