66
77from ietf .stats .models import AffiliationAlias , AffiliationIgnoredEnding , CountryAlias , MeetingRegistration
88from 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
1014def 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