Skip to content

Commit 8b5a639

Browse files
author
Seth Birkholz
committed
This should be the final fix to
resolve the meeting registration problem where a Person object was not being created - Legacy-Id: 14076
1 parent aaf3fa5 commit 8b5a639

2 files changed

Lines changed: 84 additions & 5 deletions

File tree

ietf/stats/tests.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from requests import Response
66

77
from django.urls import reverse as urlreverse
8+
from django.contrib.auth.models import User
89

910
from ietf.utils.test_data import make_test_data, make_review_data
1011
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent
@@ -13,11 +14,12 @@
1314
from ietf.submit.models import Submission
1415
from ietf.doc.models import Document, DocAlias, State, RelatedDocument, NewRevisionDocEvent
1516
from ietf.meeting.factories import MeetingFactory
16-
from ietf.person.models import Person
17+
from ietf.person.models import Person, Email
1718
from ietf.name.models import FormalLanguageName, DocRelationshipName, CountryName
1819
from ietf.stats.models import MeetingRegistration, CountryAlias
1920
from ietf.stats.utils import get_meeting_registration_data
2021

22+
2123
class StatisticsTests(TestCase):
2224
def test_stats_index(self):
2325
url = urlreverse(ietf.stats.views.stats_index)
@@ -199,3 +201,25 @@ 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+
email = "john.doe@example.us"
212+
user = User.objects.create(username=email)
213+
user.save()
214+
215+
mock_get.return_value = response
216+
meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96")
217+
get_meeting_registration_data(meeting)
218+
query = MeetingRegistration.objects.filter(first_name='John',last_name='Smith',country_code='US')
219+
emails = Email.objects.filter(address=email)
220+
self.assertTrue(query.count(), 1)
221+
self.assertTrue(isinstance(query[0].person, Person))
222+
self.assertTrue(len(emails)>=1)
223+
self.assertEqual(query[0].person, emails[0].person)
224+
225+

ietf/stats/utils.py

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
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, Email
10+
from django.contrib.auth.models import User
11+
from unidecode import unidecode
12+
913

1014
def compile_affiliation_ending_stripping_regexp():
1115
parts = []
@@ -226,7 +230,11 @@ def get_meeting_registration_data(meeting):
226230
else:
227231
raise RuntimeError("Could not decode response from registrations API: '%s...'" % (response.content[:64], ))
228232

233+
234+
# for each user identified in the Registration system
235+
# Create a DataTracker MeetingRegistration object
229236
for registration in decoded:
237+
person = None
230238
object, created = MeetingRegistration.objects.get_or_create(
231239
meeting_id=meeting.pk,
232240
first_name=registration['FirstName'],
@@ -235,14 +243,61 @@ def get_meeting_registration_data(meeting):
235243
country_code=registration['Country'],
236244
email=registration['Email'],
237245
)
246+
247+
# Add a Person object to MeetingRegistration object
248+
# if valid email is available
249+
if not object.person and registration["Email"] and '@' in registration["Email"]:
250+
# If the person already exists do not try to create a new one
251+
emails = Email.objects.filter(address=registration["Email"])
252+
# there can only be on Email object with a unique email address (primary key)
253+
if len(emails) == 1:
254+
person = emails[0].person
255+
# Create a new Person object
256+
else:
257+
# ascii_name - convert from unicode if necessary
258+
regname = "%s %s" % (registration["FirstName"], registration["LastName"])
259+
# if there are any unicode characters decode the string to ascii
260+
ascii_name = unidecode(regname).strip()
261+
262+
# Create a new user object if it does not exist already
263+
# if the user already exists do not try to create a new one
264+
users = User.objects.filter(username=registration["Email"])
265+
if len(users) > 0:
266+
user = users[0]
267+
else:
268+
# Create a new user.
269+
user = User.objects.create(
270+
first_name=registration["FirstName"],
271+
last_name=registration["LastName"],
272+
username=registration["Email"],
273+
email=registration["Email"]
274+
)
275+
user.save()
276+
277+
# Create the new Person object.
278+
person = Person.objects.create(
279+
name=regname,
280+
ascii=ascii_name,
281+
affiliation=registration["Company"],
282+
user=user
283+
)
284+
person.save()
285+
286+
# Create an associated Email address for this new Person
287+
Email.objects.create(
288+
person=person,
289+
address=registration["Email"],
290+
primary=True
291+
)
292+
293+
# update the person object to an actual value
294+
object.person = person
295+
object.save()
296+
238297
if created:
239298
num_created += 1
240299
num_processed += 1
241300
else:
242301
raise RuntimeError("Bad response from registrations API: %s, '%s'" % (response.status_code, response.content))
243302
num_total = MeetingRegistration.objects.filter(meeting_id=meeting.pk).count()
244303
return num_created, num_processed, num_total
245-
246-
247-
248-

0 commit comments

Comments
 (0)