Skip to content

Commit b6b4516

Browse files
committed
Added email address to the MeetingRegistration model, and also to the fields imported from ietf.org/registration/attendees/NN . Changed the bin counting code for attendee-related stats to use names plus email as unique string, rather than only names.
- Legacy-Id: 13481
1 parent a92c2b4 commit b6b4516

File tree

7 files changed

+43
-24
lines changed

7 files changed

+43
-24
lines changed

ietf/bin/fetch-meeting-registration-data

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ else:
3939
sys.exit(1)
4040

4141
for meeting in meetings:
42-
total = get_meeting_registration_data(meeting)
43-
msg = "Fetched data for meeting {}: {} registrations added".format(meeting.number, total)
42+
added, processed, total = get_meeting_registration_data(meeting)
43+
msg = "Fetched data for meeting {}: {} processed, {} added, {} in table".format(meeting.number, processed, added, total)
4444
if sys.stdout.isatty():
4545
print(msg) # make debugging a bit easier
4646
else:

ietf/stats/backfill_data.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#!/usr/bin/env python
2+
13
import sys, os, argparse
24

35
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))

ietf/stats/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class MeetingRegistration(models.Model):
5050
affiliation = models.CharField(blank=True, max_length=255)
5151
country_code = models.CharField(max_length=2) # ISO 3166
5252
person = models.ForeignKey(Person, blank=True, null=True)
53+
email = models.EmailField(blank=True, null=True)
5354

5455
def __unicode__(self):
5556
return u"{} {}".format(self.first_name, self.last_name)

ietf/stats/resources.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class Meta:
6363
"last_name": ALL,
6464
"affiliation": ALL,
6565
"country_code": ALL,
66+
"email": ALL,
6667
"person": ALL_WITH_RELATIONS
6768
}
6869
api.stats.register(MeetingRegistrationResource())

ietf/stats/tests.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ def test_meeting_stats(self):
102102
# create some data for the statistics
103103
make_test_data()
104104
meeting = MeetingFactory(type_id='ietf', date=datetime.date.today(), number="96")
105-
MeetingRegistration.objects.create(first_name='John', last_name='Smith', country_code='US', meeting=meeting)
105+
MeetingRegistration.objects.create(first_name='John', last_name='Smith', country_code='US', email="john.smith@example.us", meeting=meeting)
106106
CountryAlias.objects.get_or_create(alias="US", country=CountryName.objects.get(slug="US"))
107-
MeetingRegistration.objects.create(first_name='Jaume', last_name='Guillaume', country_code='FR', meeting=meeting)
107+
MeetingRegistration.objects.create(first_name='Jaume', last_name='Guillaume', country_code='FR', email="jaume.guillaume@example.fr", meeting=meeting)
108108
CountryAlias.objects.get_or_create(alias="FR", country=CountryName.objects.get(slug="FR"))
109109

110110
# check redirect
@@ -193,7 +193,7 @@ def test_review_stats(self):
193193
def test_get_meeting_registration_data(self, mock_get):
194194
response = Response()
195195
response.status_code = 200
196-
response._content = '[{"LastName":"Smith","FirstName":"John","Company":"ABC","Country":"US"}]'
196+
response._content = '[{"LastName":"Smith","FirstName":"John","Company":"ABC","Country":"US","Email":"john.doe@example.us"}]'
197197
mock_get.return_value = response
198198
meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96")
199199
get_meeting_registration_data(meeting)

ietf/stats/utils.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,24 +214,34 @@ def get_meeting_registration_data(meeting):
214214
""""Retrieve registration attendee data and summary statistics. Returns number
215215
of Registration records created."""
216216
num_created = 0
217+
num_processed = 0
217218
response = requests.get(settings.REGISTRATION_ATTENDEES_BASE_URL + meeting.number)
218219
if response.status_code == 200:
219220
decoded = []
220221
try:
221222
decoded = response.json()
222223
except ValueError:
223-
pass
224+
if response.content.strip() == 'Invalid meeting':
225+
pass
226+
else:
227+
raise RuntimeError("Could not decode response from registrations API: '%s...'" % (response.content[:64], ))
224228

225229
for registration in decoded:
226230
object, created = MeetingRegistration.objects.get_or_create(
227231
meeting_id=meeting.pk,
228232
first_name=registration['FirstName'],
229233
last_name=registration['LastName'],
230234
affiliation=registration['Company'],
231-
country_code=registration['Country'])
235+
country_code=registration['Country'],
236+
email=registration['Email'],
237+
)
232238
if created:
233239
num_created += 1
234-
return num_created
240+
num_processed += 1
241+
else:
242+
raise RuntimeError("Bad response from registrations API: %s, '%s'" % (response.status_code, response.content))
243+
num_total = MeetingRegistration.objects.filter(meeting_id=meeting.pk).count()
244+
return num_created, num_processed, num_total
235245

236246

237247

ietf/stats/views.py

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import os
2+
import calendar
13
import datetime
4+
import email.utils
25
import itertools
36
import json
4-
import calendar
5-
import os
7+
68
from collections import defaultdict
79

810
from django.shortcuts import render
@@ -780,6 +782,9 @@ def get_country_mapping(registrations):
780782
if alias.alias.isupper()
781783
}
782784

785+
def reg_name(r):
786+
return email.utils.formataddr(((r.first_name + u" " + r.last_name).strip(), r.email))
787+
783788
if meeting and any(stats_type == t[0] for t in possible_stats_types):
784789
registrations = MeetingRegistration.objects.filter(meeting=meeting)
785790

@@ -794,7 +799,7 @@ def get_country_mapping(registrations):
794799
eu_countries = set(CountryName.objects.filter(in_eu=True))
795800

796801
for r in registrations:
797-
name = (r.first_name + " " + r.last_name).strip()
802+
name = reg_name(r)
798803
c = country_mapping.get(r.country_code)
799804
bins[c.name if c else ""].add(name)
800805

@@ -831,7 +836,7 @@ def get_country_mapping(registrations):
831836
country_mapping = get_country_mapping(registrations)
832837

833838
for r in registrations:
834-
name = (r.first_name + " " + r.last_name).strip()
839+
name = reg_name(r)
835840
c = country_mapping.get(r.country_code)
836841
bins[c.continent.name if c else ""].add(name)
837842

@@ -853,16 +858,16 @@ def get_country_mapping(registrations):
853858
elif not meeting and any(stats_type == t[0] for t in possible_stats_types):
854859
template_name = "overview"
855860

856-
registrations = MeetingRegistration.objects.filter(meeting__type="ietf")
861+
registrations = MeetingRegistration.objects.filter(meeting__type="ietf").select_related('meeting')
857862

858863
if stats_type == "overview":
859864
stats_title = "Number of registrations per meeting"
860865

861866
bins = defaultdict(set)
862867

863-
for first_name, last_name, meeting_number in registrations.values_list("first_name", "last_name", "meeting__number"):
864-
meeting_number = int(meeting_number)
865-
name = (first_name + " " + last_name).strip()
868+
for r in registrations:
869+
meeting_number = int(r.meeting.number)
870+
name = reg_name(r)
866871

867872
bins[meeting_number].add(name)
868873

@@ -891,10 +896,10 @@ def get_country_mapping(registrations):
891896

892897
bins = defaultdict(set)
893898

894-
for first_name, last_name, country_code, meeting_number in registrations.values_list("first_name", "last_name", "country_code", "meeting__number"):
895-
meeting_number = int(meeting_number)
896-
name = (first_name + " " + last_name).strip()
897-
c = country_mapping.get(country_code)
899+
for r in registrations:
900+
meeting_number = int(r.meeting.number)
901+
name = reg_name(r)
902+
c = country_mapping.get(r.country_code)
898903

899904
if c:
900905
bins[(meeting_number, c.name)].add(name)
@@ -911,10 +916,10 @@ def get_country_mapping(registrations):
911916

912917
bins = defaultdict(set)
913918

914-
for first_name, last_name, country_code, meeting_number in registrations.values_list("first_name", "last_name", "country_code", "meeting__number"):
915-
meeting_number = int(meeting_number)
916-
name = (first_name + " " + last_name).strip()
917-
c = country_mapping.get(country_code)
919+
for r in registrations:
920+
meeting_number = int(r.meeting.number)
921+
name = reg_name(r)
922+
c = country_mapping.get(r.country_code)
918923

919924
if c:
920925
bins[(meeting_number, c.continent.name)].add(name)

0 commit comments

Comments
 (0)