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.IDSUBMIT_REPOSITORY_PATH = self.saved_idsubmit_repository_path
settings.INTERNET_DRAFT_ARCHIVE_DIR = self.saved_archive_dir 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') url = urlreverse('ietf.submit.views.api_submit')
if author is None: if author is None:
author = PersonFactory() author = PersonFactory()
@ -1831,14 +1831,14 @@ class ApiSubmitTests(TestCase):
self.assertEqual(r.status_code, 405) self.assertEqual(r.status_code, 405)
def test_api_submit_ok(self): 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','')) expected = "Upload of %s OK, confirmation requests sent to:\n %s" % (name, author.formatted_email().replace('\n',''))
self.assertContains(r, expected, status_code=200) self.assertContains(r, expected, status_code=200)
def test_api_submit_secondary_email_active(self): def test_api_submit_secondary_email_active(self):
person = PersonFactory() person = PersonFactory()
email = EmailFactory(person=person) 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 [ for expected in [
"Upload of %s OK, confirmation requests sent to:" % (name, ), "Upload of %s OK, confirmation requests sent to:" % (name, ),
author.formatted_email().replace('\n',''), author.formatted_email().replace('\n',''),
@ -1851,43 +1851,43 @@ class ApiSubmitTests(TestCase):
prim.primary = True prim.primary = True
prim.save() prim.save()
email = EmailFactory(person=person, active=False) 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 expected = "No such user: %s" % email.address
self.assertContains(r, expected, status_code=400) self.assertContains(r, expected, status_code=400)
def test_api_submit_no_user(self): def test_api_submit_no_user(self):
email='nonexistant.user@example.org' 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 expected = "No such user: %s" % email
self.assertContains(r, expected, status_code=400) self.assertContains(r, expected, status_code=400)
def test_api_submit_no_person(self): def test_api_submit_no_person(self):
user = UserFactory() user = UserFactory()
email = user.username 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 expected = "No person with username %s" % email
self.assertContains(r, expected, status_code=400) self.assertContains(r, expected, status_code=400)
def test_api_submit_wrong_revision(self): 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)" expected = "Invalid revision (revision 00 is expected)"
self.assertContains(r, expected, status_code=400) self.assertContains(r, expected, status_code=400)
def test_api_submit_pending_submission(self): 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" expected = "Upload of"
self.assertContains(r, expected, status_code=200) 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" expected = "A submission with same name and revision is currently being processed"
self.assertContains(r, expected, status_code=400) self.assertContains(r, expected, status_code=400)
def test_api_submit_no_title(self): 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" expected = "Could not extract a valid title from the upload"
self.assertContains(r, expected, status_code=400) self.assertContains(r, expected, status_code=400)
def test_api_submit_failed_idnits(self): 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" expected = "Document date must be within 3 days of submission date"
self.assertContains(r, expected, status_code=400) 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.conf import settings
from django.core.validators import validate_email, ValidationError from django.core.validators import validate_email, ValidationError
from django.db import transaction
from django.http import HttpRequest # pyflakes:ignore from django.http import HttpRequest # pyflakes:ignore
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
@ -239,7 +240,8 @@ def post_rev00_submission_events(draft, submission, submitter):
return events 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)") system = Person.objects.get(name="(System)")
submitter_parsed = submission.submitter_parsed() submitter_parsed = submission.submitter_parsed()
if submitter_parsed["name"] and submitter_parsed["email"]: if submitter_parsed["name"] and submitter_parsed["email"]:
@ -294,7 +296,7 @@ def post_submission(request, submission, approvedDesc):
type="new_submission", type="new_submission",
doc=draft, doc=draft,
by=system, by=system,
desc=approvedDesc, desc=approved_doc_desc,
submission=submission, submission=submission,
rev=submission.rev, rev=submission.rev,
) )
@ -419,6 +421,8 @@ def post_submission(request, submission, approvedDesc):
submission.draft = draft submission.draft = draft
submission.save() submission.save()
create_submission_event(request, submission, approved_subm_desc)
def update_replaces_from_submission(request, submission, draft): def update_replaces_from_submission(request, submission, draft):
if not submission.replaces: if not submission.replaces:
return [], [] 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") docevent_from_submission(request, submission, desc="Uploaded new revision")
desc = "Secretariat manually posting. Approvals already received" desc = "Secretariat manually posting. Approvals already received"
post_submission(request, submission, desc) post_submission(request, submission, desc, desc)
create_submission_event(request, submission, desc)
else: else:
doc = submission.existing_document() doc = submission.existing_document()
prev_authors = [] if not doc else [ author.person for author in doc.documentauthor_set.all() ] 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 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 desc = "New version accepted (logged-in submitter: %s)" % request.user.person # type: ignore
post_submission(request, submission, desc) post_submission(request, submission, desc, desc)
create_submission_event(request, submission, desc)
else: else:
sent_to, desc, docDesc = send_confirmation_emails(request, submission, requires_group_approval, requires_prev_authors_approval) 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" % ( 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: if not can_group_approve:
return HttpResponseForbidden('You do not have permission to perform this action') return HttpResponseForbidden('You do not have permission to perform this action')
post_submission(request, submission, "WG -00 approved") post_submission(request, submission, "WG -00 approved", "Approved and posted submission")
create_submission_event(request, submission, "Approved and posted submission")
return redirect("ietf.doc.views_doc.document_main", name=submission.name) 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: else:
desc = "Forced post of submission" desc = "Forced post of submission"
post_submission(request, submission, desc) post_submission(request, submission, desc, desc)
create_submission_event(request, submission, desc)
return redirect("ietf.doc.views_doc.document_main", name=submission.name) return redirect("ietf.doc.views_doc.document_main", name=submission.name)
@ -523,9 +519,7 @@ def confirm_submission(request, submission_id, auth_token):
else: else:
desc = "New version approved by previous author" desc = "New version approved by previous author"
post_submission(request, submission, desc) post_submission(request, submission, desc, "Confirmed and posted submission")
create_submission_event(request, submission, "Confirmed and posted submission")
return redirect("ietf.doc.views_doc.document_main", name=submission.name) return redirect("ietf.doc.views_doc.document_main", name=submission.name)