Skip to content

Commit 7fb035c

Browse files
committed
Add Registration models
- Legacy-Id: 13182
1 parent 2c4f14c commit 7fb035c

3 files changed

Lines changed: 63 additions & 1 deletion

File tree

ietf/stats/models.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
from django.db import models
2+
from ietf.meeting.models import Meeting
23
from ietf.name.models import CountryName
4+
from ietf.person.models import Person
5+
36

47
class AffiliationAlias(models.Model):
58
"""Records that alias should be treated as name for statistical
@@ -39,3 +42,21 @@ def __unicode__(self):
3942
class Meta:
4043
verbose_name_plural = "country aliases"
4144

45+
class Registration(models.Model):
46+
"""Registration attendee records from the IETF registration system"""
47+
meeting = models.ForeignKey(Meeting)
48+
first_name = models.CharField(max_length=255)
49+
last_name = models.CharField(max_length=255)
50+
affiliation = models.CharField(blank=True, max_length=255)
51+
country = models.CharField(max_length=2) # ISO 3166
52+
person = models.ForeignKey(Person, blank=True, null=True)
53+
54+
def __unicode__(self):
55+
return u"{} {}".format(self.first_name, self.last_name)
56+
57+
class RegistrationStats(models.Model):
58+
"""Statistics from the IETF registration system"""
59+
meeting = models.ForeignKey(Meeting)
60+
gender_male = models.IntegerField(default=0)
61+
gender_female = models.IntegerField(default=0)
62+
gender_undeclared = models.IntegerField(default=0)

ietf/stats/tests.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
import datetime
22

3+
from mock import patch
34
from pyquery import PyQuery
5+
from requests import Response
46

57
from django.urls import reverse as urlreverse
68

79
from ietf.utils.test_data import make_test_data, make_review_data
810
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent
11+
from ietf.stats.models import Registration
12+
from ietf.stats.utils import get_registration_data
913
import ietf.stats.views
1014

1115
from ietf.submit.models import Submission
1216
from ietf.doc.models import Document, DocAlias, State, RelatedDocument, NewRevisionDocEvent
17+
from ietf.meeting.factories import MeetingFactory
1318
from ietf.person.models import Person
1419
from ietf.name.models import FormalLanguageName, DocRelationshipName
1520

@@ -147,3 +152,14 @@ def test_review_stats(self):
147152
self.assertEqual(r.status_code, 200)
148153
q = PyQuery(r.content)
149154
self.assertTrue(q('.review-stats td:contains("1")'))
155+
156+
@patch('requests.get')
157+
def test_get_registration_data(self, mock_get):
158+
response = Response()
159+
response.status_code = 200
160+
response._content = '[{"LastName":"Smith","FirstName":"John","Company":"ABC","Country":"US"}]'
161+
mock_get.return_value = response
162+
meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96")
163+
get_registration_data(meeting)
164+
query = Registration.objects.filter(first_name='John',last_name='Smith',country='US')
165+
self.assertTrue(query.count(),1)

ietf/stats/utils.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import re
2+
import requests
23
from collections import defaultdict
34

4-
from ietf.stats.models import AffiliationAlias, AffiliationIgnoredEnding, CountryAlias
5+
from django.conf import settings
6+
7+
from ietf.stats.models import AffiliationAlias, AffiliationIgnoredEnding, CountryAlias, Registration
58
from ietf.name.models import CountryName
69

710
def compile_affiliation_ending_stripping_regexp():
@@ -205,3 +208,25 @@ def compute_hirsch_index(citation_counts):
205208
i += 1
206209

207210
return i
211+
212+
213+
def get_registration_data(meeting):
214+
""""Retrieve registration attendee data and summary statistics. Returns number
215+
of Registration records created."""
216+
num_created = 0
217+
response = requests.get(settings.REGISTRATION_ATTENDEES_BASE_URL + meeting.number)
218+
if response.status_code == 200:
219+
for registration in response.json():
220+
object, created = Registration.objects.get_or_create(
221+
meeting=meeting,
222+
first_name=registration['FirstName'],
223+
last_name=registration['LastName'],
224+
affiliation=registration['Company'],
225+
country=registration['Country'])
226+
if created:
227+
num_created += 1
228+
return num_created
229+
230+
231+
232+

0 commit comments

Comments
 (0)