Skip to content

Commit 6359192

Browse files
author
Seth Birkholz
committed
Commit ready for merge. This commit implements fixes suggested by Henrik to the MeetingRegistration class
- added tests - reverted 'obj' to 'object' - removed check for valid email - identifing person by Email.person rather than Person.user__username - used a simpler form of unidecode logic. TBD: the previous code was stolen from elsewhere in the code which should also be simplified. - Person.name now uses firstname + lastname rather than email. - Legacy-Id: 13969
1 parent 95d3ac3 commit 6359192

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

ietf/stats/tests.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
12
import datetime
23

34
from mock import patch
45
from pyquery import PyQuery
56
from requests import Response
67

78
from django.urls import reverse as urlreverse
9+
from django.contrib.auth.models import User
810

911
from ietf.utils.test_data import make_test_data, make_review_data
1012
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent
@@ -199,3 +201,21 @@ def test_get_meeting_registration_data(self, mock_get):
199201
get_meeting_registration_data(meeting)
200202
query = MeetingRegistration.objects.filter(first_name='John',last_name='Smith',country_code='US')
201203
self.assertTrue(query.count(), 1)
204+
self.assertTrue(isinstance(query[0].person,Person))
205+
206+
@patch('requests.get')
207+
def test_get_meeting_registration_data_user_exists(self, mock_get):
208+
response = Response()
209+
response.status_code = 200
210+
response._content = '[{"LastName":"Smith","FirstName":"John","Company":"ABC","Country":"US","Email":"john.doe@example.us"}]'
211+
user = User.objects.create(username="john.doe@example.us")
212+
user.save()
213+
214+
mock_get.return_value = response
215+
meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96")
216+
get_meeting_registration_data(meeting)
217+
query = MeetingRegistration.objects.filter(first_name='John',last_name='Smith',country_code='US')
218+
self.assertTrue(query.count(), 1)
219+
self.assertTrue(isinstance(query[0].person, Person))
220+
221+

ietf/stats/utils.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
from ietf.stats.models import AffiliationAlias, AffiliationIgnoredEnding, CountryAlias, MeetingRegistration
88
from ietf.name.models import CountryName
9-
from ietf.person.models import Person
9+
from ietf.person.models import Person, Email
10+
from ietf.utils import log
1011
from django.contrib.auth.models import User
1112
from unidecode import unidecode
1213

@@ -236,7 +237,7 @@ def get_meeting_registration_data(meeting):
236237
# Create a DataTracker MeetingRegistration object
237238
for registration in decoded:
238239
person = None
239-
obj, created = MeetingRegistration.objects.get_or_create(
240+
object, created = MeetingRegistration.objects.get_or_create(
240241
meeting_id=meeting.pk,
241242
first_name=registration['FirstName'],
242243
last_name=registration['LastName'],
@@ -247,24 +248,21 @@ def get_meeting_registration_data(meeting):
247248

248249
# Add a Person object to MeetingRegistration object
249250
# if valid email is available
250-
if not obj.person and "Email" in registration and '@' in registration["Email"]:\
251+
if not object.person:
251252
# If the person already exists do not try to create a new one
252-
persons = Person.objects.filter(user__username=registration["Email"])
253-
if len(persons) > 0:
254-
person = persons[0]
253+
emails = Email.objects.filter(address=registration["Email"])
254+
# there can only be on Email object with a unique email address (primary key)
255+
if len(emails) == 1:
256+
person = emails[0].person
255257
# Create a new Person object
256258
else:
257259
# ascii_name - convert from unicode if necessary
258260
regname = "%s %s" % (registration["FirstName"], registration["LastName"])
259261
# if there are any unicode characters decode the string to ascii
260-
if not all(ord(c) < 128 for c in regname):
261-
ascii_name = unidecode(regname).strip()
262-
# it is already ascii, no need to convert
263-
else:
264-
ascii_name = regname
262+
ascii_name = unidecode(regname).strip()
265263

266264
# Create a new user object if it does not exist already
267-
# if the user already exists do not try ot create a new one
265+
# if the user already exists do not try to create a new one
268266
users = User.objects.filter(username=registration["Email"])
269267
if len(users) > 0:
270268
user = users[0]
@@ -276,19 +274,20 @@ def get_meeting_registration_data(meeting):
276274
username=registration["Email"],
277275
email=registration["Email"]
278276
)
277+
user.save()
279278

280279
# Create the new Person object.
281280
person = Person.objects.create(
282-
name=registration["Email"],
281+
name=regname,
283282
ascii=ascii_name,
284283
affiliation=registration["Company"],
285284
user=user
286285
)
287286
person.save()
288287

289288
# update the person object to an actual value
290-
obj.person = person
291-
obj.save()
289+
object.person = person
290+
object.save()
292291

293292
if created:
294293
num_created += 1

0 commit comments

Comments
 (0)