Skip to content

Commit 3939c0b

Browse files
committed
Changed draft submission to not require an email round-trip when the submitter is logged in. Added corresponding test cases.
- Legacy-Id: 16749
1 parent 466bd06 commit 3939c0b

3 files changed

Lines changed: 75 additions & 10 deletions

File tree

ietf/submit/tests.py

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,10 @@ def submission_file(name, rev, group, format, templatename, author=None, email=N
6868
name="%s-%s" % (name, rev),
6969
group=group or "",
7070
author=author.ascii if ascii else author.name,
71+
asciiAuthor=author.ascii,
7172
initials=author.initials(),
7273
surname=author.ascii_parts()[3] if ascii else author.name_parts()[3],
74+
asciiSurname=author.ascii_parts()[3],
7375
email=email,
7476
title=title,
7577
)
@@ -158,7 +160,7 @@ def do_submission(self, name, rev, group=None, formats=["txt",], author=None):
158160
submission = Submission.objects.get(name=name)
159161
if len(submission.authors) != 1:
160162
sys.stderr.write("\nAuthor extraction failure.\n")
161-
sys.stderr.write(("Author name used in test: %s\n"%author).encode('utf8'))
163+
sys.stderr.write(six.ensure_text("Author name used in test: %s\n"%author))
162164
sys.stderr.write("Author ascii name: %s\n" % author.ascii)
163165
sys.stderr.write("Author initials: %s\n" % author.initials())
164166
self.assertEqual(len(submission.authors), 1)
@@ -594,6 +596,51 @@ def test_submit_new_individual_xml(self):
594596
def test_submit_new_individual_txt_xml(self):
595597
self.submit_new_individual(["txt", "xml"])
596598

599+
def submit_new_individual_logged_in(self, formats):
600+
# submit new -> supply submitter info -> done
601+
602+
name = "draft-authorname-testing-logged-in"
603+
rev = "00"
604+
group = None
605+
606+
author = PersonFactory()
607+
username = author.user.email
608+
self.client.login(username=username, password=username+"+password")
609+
610+
status_url, author = self.do_submission(name, rev, group, formats, author=author)
611+
612+
# supply submitter info, then draft should be be ready for email auth
613+
mailbox_before = len(outbox)
614+
r = self.supply_extra_metadata(name, status_url, author.name, username, replaces="")
615+
616+
self.assertEqual(r.status_code, 302)
617+
status_url = r["Location"]
618+
r = self.client.get(status_url)
619+
self.assertEqual(r.status_code, 200)
620+
self.assertContains(r, "New version accepted")
621+
622+
self.assertEqual(len(outbox), mailbox_before+2)
623+
announcement_email = outbox[-2]
624+
self.assertIn(name, announcement_email["Subject"])
625+
self.assertIn('I-D Action:', announcement_email["Subject"])
626+
self.assertIn('i-d-announce', announcement_email["To"])
627+
notification_email = outbox[-1]
628+
self.assertIn(name, notification_email["Subject"])
629+
self.assertIn("New Version Notification", notification_email["Subject"])
630+
self.assertIn(author.email().address.lower(), notification_email["To"])
631+
632+
draft = Document.objects.get(docalias__name=name)
633+
self.assertEqual(draft.rev, rev)
634+
new_revision = draft.latest_event()
635+
self.assertEqual(new_revision.type, "new_revision")
636+
self.assertEqual(new_revision.by.name, author.name)
637+
638+
def test_submit_new_logged_in_txt(self):
639+
self.submit_new_individual_logged_in(["txt"])
640+
641+
def test_submit_new_logged_in_xml(self):
642+
self.submit_new_individual_logged_in(["xml"])
643+
597644
def test_submit_update_individual(self):
598645
IndividualDraftFactory(name='draft-ietf-random-thing', states=[('draft','rfc')], other_aliases=['rfc9999',], pages=5)
599646
ad=Person.objects.get(user__username='ad')
@@ -1047,7 +1094,7 @@ def test_submit_missing_author_email(self):
10471094
for e in author.email_set.all():
10481095
e.delete()
10491096

1050-
files = {"txt": submission_file(name, rev, group, "txt", "test_submission.txt", author=author, ascii=False)[0] }
1097+
files = {"txt": submission_file(name, rev, group, "txt", "test_submission.txt", author=author, ascii=True)[0] }
10511098

10521099
# submit
10531100
url = urlreverse('ietf.submit.views.upload_submission')

ietf/submit/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,8 @@ def get_draft_meta(form, saved_files):
653653
if xml_version == '3':
654654
prep = xml2rfc.PrepToolWriter(form.xmltree, quiet=True)
655655
form.xmltree.tree = prep.prep()
656+
if form.xmltree.tree == None:
657+
raise ValidationError("Error from xml2rfc (prep): %s" % prep.errors)
656658
except Exception as e:
657659
raise ValidationError("Error from xml2rfc (prep): %s" % e)
658660
if not ('txt' in form.cleaned_data and form.cleaned_data['txt']):

ietf/submit/views.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
from ietf.submit.utils import ( approvable_submissions_for_user, preapprovals_for_user,
3535
recently_approved_by_user, validate_submission, create_submission_event, docevent_from_submission,
3636
post_submission, cancel_submission, rename_submission_files, remove_submission_files, get_draft_meta,
37-
get_submission, fill_in_submission, apply_checkers, send_confirmation_emails, save_files )
37+
get_submission, fill_in_submission, apply_checkers, send_confirmation_emails, save_files,
38+
get_person_from_name_email )
3839
from ietf.stats.utils import clean_country_name
3940
from ietf.utils.accesstoken import generate_access_token
4041
from ietf.utils.log import log
@@ -74,6 +75,8 @@ def upload_submission(request):
7475
form = SubmissionManualUploadForm(request=request)
7576
form._errors = {}
7677
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])
78+
if debug.debug:
79+
raise
7780
else:
7881
form = SubmissionManualUploadForm(request=request)
7982

@@ -258,6 +261,7 @@ def submission_status(request, submission_id, access_token=None):
258261
submitter_form = SubmitterForm(request.POST, prefix="submitter")
259262
replaces_form = ReplacesForm(request.POST, name=submission.name)
260263
validations = [submitter_form.is_valid(), replaces_form.is_valid()]
264+
261265
if all(validations):
262266
submission.submitter = submitter_form.cleaned_line()
263267
replaces = replaces_form.cleaned_data.get("replaces", [])
@@ -276,13 +280,25 @@ def submission_status(request, submission_id, access_token=None):
276280
post_submission(request, submission, desc)
277281
create_submission_event(request, submission, desc)
278282
else:
279-
sent_to, desc, docDesc = send_confirmation_emails(request, submission, requires_group_approval, requires_prev_authors_approval)
280-
msg = "Set submitter to \"%s\", replaces to %s and %s" % (
281-
submission.submitter,
282-
", ".join(prettify_std_name(r.name) for r in replaces) if replaces else "(none)",
283-
desc)
284-
create_submission_event(request, submission, msg)
285-
docevent_from_submission(request, submission, docDesc, who="(System)")
283+
doc = submission.existing_document()
284+
prev_authors = [] if not doc else [ author.person for author in doc.documentauthor_set.all() ]
285+
curr_authors = [ get_person_from_name_email(author["name"], author.get("email")) for author in submission.authors ]
286+
287+
if request.user.is_authenticated and request.user.person in (prev_authors if prev_authors else curr_authors):
288+
# go directly to posting submission
289+
docevent_from_submission(request, submission, desc="Uploaded new revision", who=request.user.person)
290+
291+
desc = "New version accepted (logged-in submitter: %s)" % request.user.person
292+
post_submission(request, submission, desc)
293+
create_submission_event(request, submission, desc)
294+
else:
295+
sent_to, desc, docDesc = send_confirmation_emails(request, submission, requires_group_approval, requires_prev_authors_approval)
296+
msg = "Set submitter to \"%s\", replaces to %s and %s" % (
297+
submission.submitter,
298+
", ".join(prettify_std_name(r.name) for r in replaces) if replaces else "(none)",
299+
desc)
300+
create_submission_event(request, submission, msg)
301+
docevent_from_submission(request, submission, docDesc, who="(System)")
286302

287303
if access_token:
288304
return redirect("ietf.submit.views.submission_status", submission_id=submission.pk, access_token=access_token)

0 commit comments

Comments
 (0)