Added ability to use the submission API with active secondary email addresses. Fixes issue #2639.

- Legacy-Id: 17383
This commit is contained in:
Henrik Levkowetz 2020-03-04 18:05:56 +00:00
parent af6ca37513
commit b4d7dd131a
3 changed files with 66 additions and 7 deletions

View file

@ -1,3 +1,27 @@
ietfdb (6.119.1) ietf; urgency=medium
**Py2/3 fixes, Change to use the "requests" lib instead of urlopen()**
* Py2/3 compatibility tweaks for pyflakes.
* Changed some cases of urlopen() to use requests.get()
* Python3 is more ticklish about comparing strings to None than Py2.
Fixed an issue with this in generate_sort_key() for document searches.
* Fixed a Py2/3 issue in the pyflakes management command, and tweaked the
verbose output format.
* Merged back production changes to two scripts indirectly called by
/a/www/www6s/scripts/run-ietf-report, through
/a/www/www6s/scripts/run-report.
* Changed the release script to not pick up other email addresses than
those of contributors from the release notes.
-- Henrik Levkowetz <henrik@levkowetz.com> 03 Mar 2020 11:23:46 +0000
ietfdb (6.119.0) ietf; urgency=medium
**Improved email handling, and roundup of Py2/3 conversion issues**

View file

@ -35,7 +35,7 @@ from ietf.meeting.factories import MeetingFactory
from ietf.message.models import Message
from ietf.name.models import FormalLanguageName
from ietf.person.models import Person
from ietf.person.factories import UserFactory, PersonFactory
from ietf.person.factories import UserFactory, PersonFactory, EmailFactory
from ietf.submit.models import Submission, Preapproval
from ietf.submit.mail import add_submission_email, process_response_email
from ietf.utils.mail import outbox, empty_outbox, get_payload
@ -1773,6 +1773,26 @@ class ApiSubmitTests(TestCase):
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)
for expected in [
"Upload of %s OK, confirmation requests sent to:" % (name, ),
author.formatted_email().replace('\n',''),
]:
self.assertContains(r, expected, status_code=200)
def test_api_submit_secondary_email_inactive(self):
person = PersonFactory()
prim = person.email()
prim.primary = True
prim.save()
email = EmailFactory(person=person, active=False)
r, author, name = self.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)

View file

@ -1,4 +1,4 @@
# Copyright The IETF Trust 2011-2019, All Rights Reserved
# Copyright The IETF Trust 2011-2020, All Rights Reserved
# -*- coding: utf-8 -*-
@ -30,7 +30,7 @@ from ietf.group.utils import group_features_group_filter
from ietf.ietfauth.utils import has_role, role_required
from ietf.mailtrigger.utils import gather_address_lists
from ietf.message.models import Message, MessageAttachment
from ietf.person.models import Person
from ietf.person.models import Person, Email
from ietf.submit.forms import ( SubmissionManualUploadForm, SubmissionAutoUploadForm, AuthorForm,
SubmitterForm, EditSubmissionForm, PreapprovalForm, ReplacesForm, SubmissionEmailForm, MessageModelForm )
from ietf.submit.mail import ( send_full_url, send_manual_post_request, add_submission_email, get_reply_to )
@ -106,10 +106,25 @@ def api_submit(request):
username = form.cleaned_data['user']
user = User.objects.filter(username=username)
if user.count() == 0:
return err(400, "No such user: %s" % username)
if user.count() > 1:
# See if a secondary login was being used
email = Email.objects.filter(address=username, active=True)
# The error messages don't talk about 'email', as the field we're
# looking at is still the 'username' field.
if email.count() == 0:
return err(400, "No such user: %s" % username)
elif email.count() > 1:
return err(500, "Multiple matching accounts for %s" % username)
email = email.first()
if not hasattr(email, 'person'):
return err(400, "No person matches %s" % username)
person = email.person
if not hasattr(person, 'user'):
return err(400, "No user matches: %s" % username)
user = person.user
elif user.count() > 1:
return err(500, "Multiple matching accounts for %s" % username)
user = user.first()
else:
user = user.first()
if not hasattr(user, 'person'):
return err(400, "No person with username %s" % username)
@ -133,7 +148,7 @@ def api_submit(request):
if errors:
raise ValidationError(errors)
if not user.username.lower() in [ a['email'].lower() for a in authors ]:
if not username.lower() in [ a['email'].lower() for a in authors ]:
raise ValidationError('Submitter %s is not one of the document authors' % user.username)
submission.submitter = user.person.formatted_email()