Merge in /branch/amsl/author-stats-r13145, with a few modifications

- Legacy-Id: 13252
This commit is contained in:
Ole Laursen 2017-04-28 11:05:50 +00:00
commit f09302adb5
4 changed files with 86 additions and 1 deletions

View file

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.6 on 2017-03-30 14:38
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('person', '0015_clean_primary'),
('meeting', '0048_auto_20170330_1438'),
('stats', '0002_add_initial_aliases'),
]
operations = [
migrations.CreateModel(
name='Registration',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=255)),
('last_name', models.CharField(max_length=255)),
('affiliation', models.CharField(blank=True, max_length=255)),
('country', models.CharField(max_length=2)),
('meeting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='meeting.Meeting')),
('person', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='person.Person')),
],
),
]

View file

@ -1,5 +1,8 @@
from django.db import models
from ietf.meeting.models import Meeting
from ietf.name.models import CountryName
from ietf.person.models import Person
class AffiliationAlias(models.Model):
"""Records that alias should be treated as name for statistical
@ -39,3 +42,14 @@ class CountryAlias(models.Model):
class Meta:
verbose_name_plural = "country aliases"
class Registration(models.Model):
"""Registration attendee records from the IETF registration system"""
meeting = models.ForeignKey(Meeting)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
affiliation = models.CharField(blank=True, max_length=255)
country = models.CharField(max_length=2) # ISO 3166
person = models.ForeignKey(Person, blank=True, null=True)
def __unicode__(self):
return u"{} {}".format(self.first_name, self.last_name)

View file

@ -1,15 +1,20 @@
import datetime
from mock import patch
from pyquery import PyQuery
from requests import Response
from django.urls import reverse as urlreverse
from ietf.utils.test_data import make_test_data, make_review_data
from ietf.utils.test_utils import login_testing_unauthorized, TestCase, unicontent
from ietf.stats.models import Registration
from ietf.stats.utils import get_registration_data
import ietf.stats.views
from ietf.submit.models import Submission
from ietf.doc.models import Document, DocAlias, State, RelatedDocument, NewRevisionDocEvent
from ietf.meeting.factories import MeetingFactory
from ietf.person.models import Person
from ietf.name.models import FormalLanguageName, DocRelationshipName
@ -147,3 +152,14 @@ class StatisticsTests(TestCase):
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue(q('.review-stats td:contains("1")'))
@patch('requests.get')
def test_get_registration_data(self, mock_get):
response = Response()
response.status_code = 200
response._content = '[{"LastName":"Smith","FirstName":"John","Company":"ABC","Country":"US"}]'
mock_get.return_value = response
meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96")
get_registration_data(meeting)
query = Registration.objects.filter(first_name='John',last_name='Smith',country='US')
self.assertTrue(query.count(),1)

View file

@ -1,7 +1,10 @@
import re
import requests
from collections import defaultdict
from ietf.stats.models import AffiliationAlias, AffiliationIgnoredEnding, CountryAlias
from django.conf import settings
from ietf.stats.models import AffiliationAlias, AffiliationIgnoredEnding, CountryAlias, Registration
from ietf.name.models import CountryName
def compile_affiliation_ending_stripping_regexp():
@ -205,3 +208,25 @@ def compute_hirsch_index(citation_counts):
i += 1
return i
def get_registration_data(meeting):
""""Retrieve registration attendee data and summary statistics. Returns number
of Registration records created."""
num_created = 0
response = requests.get(settings.REGISTRATION_ATTENDEES_BASE_URL + meeting.number)
if response.status_code == 200:
for registration in response.json():
object, created = Registration.objects.get_or_create(
meeting_id=meeting.pk,
first_name=registration['FirstName'],
last_name=registration['LastName'],
affiliation=registration['Company'],
country=registration['Country'])
if created:
num_created += 1
return num_created