Skip to content

Commit 90051a1

Browse files
committed
Add support for displaying and editing author affiliation and country
when submitting a draft, replace the Submission.authors line-based text field with a JSON field - Legacy-Id: 12745
1 parent 4426e33 commit 90051a1

13 files changed

Lines changed: 110 additions & 93 deletions

File tree

ietf/mailtrigger/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def gather_submission_authors(self, **kwargs):
177177
addrs = []
178178
if 'submission' in kwargs:
179179
submission = kwargs['submission']
180-
addrs.extend(["%s <%s>" % (author["name"], author["email"]) for author in submission.authors_parsed() if author["email"]])
180+
addrs.extend(["%s <%s>" % (author["name"], author["email"]) for author in submission.authors if author.get("email")])
181181
return addrs
182182

183183
def gather_submission_group_chairs(self, **kwargs):
@@ -200,7 +200,7 @@ def gather_submission_confirmers(self, **kwargs):
200200
doc=submission.existing_document()
201201
if doc:
202202
old_authors = [author.formatted_email() for author in doc.documentauthor_set.all() if author.email]
203-
new_authors = [u'"%s" <%s>' % (author["name"], author["email"]) for author in submission.authors_parsed() if author["email"]]
203+
new_authors = [u'"%s" <%s>' % (author["name"], author["email"]) for author in submission.authors if author.get("email")]
204204
addrs.extend(old_authors)
205205
if doc.group and set(old_authors)!=set(new_authors):
206206
if doc.group.type_id in ['wg','rg','ag']:
@@ -212,7 +212,7 @@ def gather_submission_confirmers(self, **kwargs):
212212
if doc.stream_id and doc.stream_id not in ['ietf']:
213213
addrs.extend(Recipient.objects.get(slug='stream_managers').gather(**{'streams':[doc.stream_id]}))
214214
else:
215-
addrs.extend([u"%s <%s>" % (author["name"], author["email"]) for author in submission.authors_parsed() if author["email"]])
215+
addrs.extend([u"%s <%s>" % (author["name"], author["email"]) for author in submission.authors if author.get("email")])
216216
if submission.submitter_parsed()["email"]:
217217
addrs.append(submission.submitter)
218218
return addrs

ietf/secr/drafts/views.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -574,8 +574,6 @@ def authors(request, id):
574574

575575
return redirect('drafts_view', id=id)
576576

577-
print form.is_valid(), form.errors
578-
579577
if form.is_valid():
580578
person = form.cleaned_data['person']
581579
email = form.cleaned_data['email']

ietf/submit/forms.py

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from django.utils.html import mark_safe
1313
from django.core.urlresolvers import reverse as urlreverse
1414

15+
from django_countries.fields import countries
16+
1517
import debug # pyflakes:ignore
1618

1719
from ietf.doc.models import Document
@@ -30,6 +32,14 @@
3032
from ietf.submit.parsers.xml_parser import XMLParser
3133
from ietf.utils.draft import Draft
3234

35+
def clean_country(country):
36+
country = country.upper()
37+
for code, name in countries:
38+
if country == code:
39+
return code
40+
if country == name.upper():
41+
return code
42+
return "" # unknown
3343

3444
class SubmissionUploadForm(forms.Form):
3545
txt = forms.FileField(label=u'.txt format', required=False)
@@ -178,18 +188,14 @@ def clean(self):
178188
self.abstract = self.xmlroot.findtext('front/abstract').strip()
179189
if type(self.abstract) is unicode:
180190
self.abstract = unidecode(self.abstract)
181-
self.author_list = []
182191
author_info = self.xmlroot.findall('front/author')
183192
for author in author_info:
184-
author_dict = dict(
185-
company = author.findtext('organization'),
186-
last_name = author.attrib.get('surname'),
187-
full_name = author.attrib.get('fullname'),
188-
email = author.findtext('address/email'),
189-
)
190-
self.author_list.append(author_dict)
191-
line = "%(full_name)s <%(email)s>" % author_dict
192-
self.authors.append(line)
193+
self.authors.append({
194+
"name": author.attrib.get('fullname'),
195+
"email": author.findtext('address/email'),
196+
"affiliation": author.findtext('organization'),
197+
"country": clean_country(author.findtext('address/postal/country')),
198+
})
193199
except forms.ValidationError:
194200
raise
195201
except Exception as e:
@@ -325,18 +331,12 @@ def deduce_group(self):
325331
return None
326332

327333
class NameEmailForm(forms.Form):
328-
"""For validating supplied submitter and author information."""
329334
name = forms.CharField(required=True)
330-
email = forms.EmailField(label=u'Email address')
331-
332-
#Fields for secretariat only
333-
approvals_received = forms.BooleanField(label=u'Approvals received', required=False, initial=False)
335+
email = forms.EmailField(label=u'Email address', required=True)
334336

335337
def __init__(self, *args, **kwargs):
336-
email_required = kwargs.pop("email_required", True)
337338
super(NameEmailForm, self).__init__(*args, **kwargs)
338339

339-
self.fields["email"].required = email_required
340340
self.fields["name"].widget.attrs["class"] = "name"
341341
self.fields["email"].widget.attrs["class"] = "email"
342342

@@ -346,6 +346,18 @@ def clean_name(self):
346346
def clean_email(self):
347347
return self.cleaned_data["email"].replace("\n", "").replace("\r", "").replace("<", "").replace(">", "").strip()
348348

349+
class AuthorForm(NameEmailForm):
350+
affiliation = forms.CharField(max_length=100, required=False)
351+
country = forms.ChoiceField(choices=[('', "(Not specified)")] + list(countries), required=False)
352+
353+
def __init__(self, *args, **kwargs):
354+
super(AuthorForm, self).__init__(*args, **kwargs)
355+
self.fields["email"].required = False
356+
357+
class SubmitterForm(NameEmailForm):
358+
#Fields for secretariat only
359+
approvals_received = forms.BooleanField(label=u'Approvals received', required=False, initial=False)
360+
349361
def cleaned_line(self):
350362
line = self.cleaned_data["name"]
351363
email = self.cleaned_data.get("email")

ietf/submit/models.py

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Submission(models.Model):
3939
words = models.IntegerField(null=True, blank=True)
4040
formal_languages = models.ManyToManyField(FormalLanguageName, blank=True, help_text="Formal languages used in document")
4141

42-
authors = models.TextField(blank=True, help_text="List of author names and emails, one author per line, e.g. \"John Doe &lt;john@example.org&gt;\".")
42+
authors = jsonfield.JSONField(default=list, help_text="List of authors with name, email, affiliation and country code.")
4343
note = models.TextField(blank=True)
4444
replaces = models.CharField(max_length=1000, blank=True)
4545

@@ -56,21 +56,6 @@ class Submission(models.Model):
5656
def __unicode__(self):
5757
return u"%s-%s" % (self.name, self.rev)
5858

59-
def authors_parsed(self):
60-
if not hasattr(self, '_cached_authors_parsed'):
61-
from ietf.submit.utils import ensure_person_email_info_exists
62-
res = []
63-
for line in self.authors.replace("\r", "").split("\n"):
64-
line = line.strip()
65-
if line:
66-
parsed = parse_email_line(line)
67-
if not parsed["email"]:
68-
person, email = ensure_person_email_info_exists(**parsed)
69-
parsed["email"] = email.address
70-
res.append(parsed)
71-
self._cached_authors_parsed = res
72-
return self._cached_authors_parsed
73-
7459
def submitter_parsed(self):
7560
return parse_email_line(self.submitter)
7661

ietf/submit/tests.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,18 +125,20 @@ def do_submission(self, name, rev, group=None, formats=["txt",]):
125125
q = PyQuery(r.content)
126126
print(q('div.has-error div.alert').text())
127127

128-
self.assertEqual(r.status_code, 302)
128+
self.assertNoFormPostErrors(r, ".has-error,.alert-danger")
129129

130130
status_url = r["Location"]
131131
for format in formats:
132132
self.assertTrue(os.path.exists(os.path.join(self.staging_dir, u"%s-%s.%s" % (name, rev, format))))
133133
self.assertEqual(Submission.objects.filter(name=name).count(), 1)
134134
submission = Submission.objects.get(name=name)
135135
self.assertTrue(all([ c.passed!=False for c in submission.checks.all() ]))
136-
self.assertEqual(len(submission.authors_parsed()), 1)
137-
author = submission.authors_parsed()[0]
136+
self.assertEqual(len(submission.authors), 1)
137+
author = submission.authors[0]
138138
self.assertEqual(author["name"], "Author Name")
139139
self.assertEqual(author["email"], "author@example.com")
140+
self.assertEqual(author["affiliation"], "Test Centre Inc.")
141+
# FIXMEself.assertEqual(author["country"], "UK")
140142

141143
return status_url
142144

@@ -664,7 +666,7 @@ def test_edit_submission_and_force_post(self):
664666

665667
"authors-prefix": ["authors-", "authors-0", "authors-1", "authors-2"],
666668
})
667-
self.assertEqual(r.status_code, 302)
669+
self.assertNoFormPostErrors(r, ".has-error,.alert-danger")
668670

669671
submission = Submission.objects.get(name=name)
670672
self.assertEqual(submission.title, "some title")
@@ -676,14 +678,14 @@ def test_edit_submission_and_force_post(self):
676678
self.assertEqual(submission.replaces, draft.docalias_set.all().first().name)
677679
self.assertEqual(submission.state_id, "manual")
678680

679-
authors = submission.authors_parsed()
681+
authors = submission.authors
680682
self.assertEqual(len(authors), 3)
681683
self.assertEqual(authors[0]["name"], "Person 1")
682684
self.assertEqual(authors[0]["email"], "person1@example.com")
683685
self.assertEqual(authors[1]["name"], "Person 2")
684686
self.assertEqual(authors[1]["email"], "person2@example.com")
685687
self.assertEqual(authors[2]["name"], "Person 3")
686-
self.assertEqual(authors[2]["email"], "unknown-email-Person-3")
688+
self.assertEqual(authors[2]["email"], "")
687689

688690
self.assertEqual(len(outbox), mailbox_before + 1)
689691
self.assertTrue("Manual Post Requested" in outbox[-1]["Subject"])
@@ -939,7 +941,6 @@ def test_submit_nonascii_name(self):
939941
files = {"txt": submission_file(name, rev, group, "txt", "test_submission.nonascii", author=author) }
940942

941943
r = self.client.post(url, files)
942-
943944
self.assertEqual(r.status_code, 302)
944945
status_url = r["Location"]
945946
r = self.client.get(status_url)
@@ -1443,8 +1444,8 @@ def do_submission(self, name, rev, group=None, formats=["txt",]):
14431444
self.assertEqual(Submission.objects.filter(name=name).count(), 1)
14441445
submission = Submission.objects.get(name=name)
14451446
self.assertTrue(all([ c.passed!=False for c in submission.checks.all() ]))
1446-
self.assertEqual(len(submission.authors_parsed()), 1)
1447-
author = submission.authors_parsed()[0]
1447+
self.assertEqual(len(submission.authors), 1)
1448+
author = submission.authors[0]
14481449
self.assertEqual(author["name"], "Author Name")
14491450
self.assertEqual(author["email"], "author@example.com")
14501451

ietf/submit/utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def validate_submission(submission):
4242
if not submission.abstract:
4343
errors['abstract'] = 'Abstract is empty or was not found'
4444

45-
if not submission.authors_parsed():
45+
if not submission.authors:
4646
errors['authors'] = 'No authors found'
4747

4848
# revision
@@ -427,14 +427,16 @@ def ensure_person_email_info_exists(name, email):
427427

428428
def update_authors(draft, submission):
429429
persons = []
430-
for order, author in enumerate(submission.authors_parsed()):
431-
person, email = ensure_person_email_info_exists(author["name"], author["email"])
430+
for order, author in enumerate(submission.authors):
431+
person, email = ensure_person_email_info_exists(author["name"], author.get("email"))
432432

433433
a = DocumentAuthor.objects.filter(document=draft, person=person).first()
434434
if not a:
435435
a = DocumentAuthor(document=draft, person=person)
436436

437437
a.email = email
438+
a.affiliation = author.get("affiliation") or ""
439+
a.country = author.get("country") or ""
438440
a.order = order
439441
a.save()
440442

0 commit comments

Comments
 (0)