Skip to content

Commit f09302a

Browse files
committed
Merge in /branch/amsl/author-stats-r13145, with a few modifications
- Legacy-Id: 13252
2 parents 2c4f14c + 304d04e commit f09302a

4 files changed

Lines changed: 86 additions & 1 deletion

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.10.6 on 2017-03-30 14:38
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('person', '0015_clean_primary'),
13+
('meeting', '0048_auto_20170330_1438'),
14+
('stats', '0002_add_initial_aliases'),
15+
]
16+
17+
operations = [
18+
migrations.CreateModel(
19+
name='Registration',
20+
fields=[
21+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22+
('first_name', models.CharField(max_length=255)),
23+
('last_name', models.CharField(max_length=255)),
24+
('affiliation', models.CharField(blank=True, max_length=255)),
25+
('country', models.CharField(max_length=2)),
26+
('meeting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='meeting.Meeting')),
27+
('person', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
28+
],
29+
),
30+
]

ietf/stats/models.py

Lines changed: 14 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,14 @@ 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)

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_id=meeting.pk,
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)