From 186e2ae67b8bfdc8914b42a3e8df9d1c9fe5ee47 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Thu, 28 May 2020 15:01:33 +0000 Subject: [PATCH] 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 --- ietf/submit/tests.py | 22 +++++++++++----------- ietf/submit/utils.py | 8 ++++++-- ietf/submit/views.py | 20 +++++++------------- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index c933aae3e..72b64915b 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -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) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index de493d5fe..82142d134 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -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 [], [] diff --git a/ietf/submit/views.py b/ietf/submit/views.py index f7a33f5c9..a22a4a8bf 100644 --- a/ietf/submit/views.py +++ b/ietf/submit/views.py @@ -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)