Commit 6fc3d10a by Clinton Blackburn

Merge pull request #5 from edx/csv-and-fake-data

Added CSV Support and Fake Data Command
parents acefe9fc 88eb164b
[run]
omit = analyticsdataserver/settings*
*wsgi.py
analytics_data_api/management/commands/generate_fake_enrollment_data.py
[report]
# Regexes for lines to exclude from consideration
......
......@@ -50,7 +50,8 @@ syncdb:
$(foreach db_name,$(DATABASES),./manage.py syncdb --migrate --noinput --database=$(db_name);)
loaddata: syncdb
python manage.py loaddata courses education_levels single_course_activity course_enrollment_birth_year course_enrollment_education course_enrollment_gender problem_response_answer_distribution course_enrollment_daily countries course_enrollment_country --database=analytics
python manage.py loaddata courses education_levels countries single_course_activity problem_response_answer_distribution --database=analytics
python manage.py generate_fake_enrollment_data
demo: clean requirements loaddata
python manage.py set_api_key analytics analytics
python manage.py set_api_key edx edx
......@@ -32,12 +32,12 @@ Getting Started
Loading Data
------------
The fixtures directory contains demo data. This data can be loaded with the following commands:
The fixtures directory contains demo data and the `generate_fake_enrollment_data` management command can generate
enrollment data. Run the command below to load/generate this data in the database.
$ make loaddata
Running Tests
-------------
Run `make validate` install the requirements, run the tests, and run lint. If you want to get the API server ready for
acceptance testing or demos, `make demo` will install requirements and load the fixture data.
Run `make validate` install the requirements, run the tests, and run lint.
[
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 5,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1894,
"count": 13,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 6,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1895,
"count": 19,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 7,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1896,
"count": 3,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 8,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1898,
"count": 2,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 9,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1900,
"count": 14,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 10,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1901,
"count": 2,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 11,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1906,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 12,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1907,
"count": 2,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 13,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1909,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 14,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1911,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 15,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1912,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 16,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1913,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 17,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1914,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 18,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1915,
"count": 3,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 19,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1916,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 20,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1917,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 21,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1918,
"count": 1,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 22,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1920,
"count": 5,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 23,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1921,
"count": 7,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 24,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1922,
"count": 11,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 25,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1923,
"count": 20,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 26,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1924,
"count": 16,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 27,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1925,
"count": 21,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 28,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1926,
"count": 29,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 29,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1927,
"count": 27,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 30,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1928,
"count": 44,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 31,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1929,
"count": 56,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 32,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1930,
"count": 71,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 33,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1931,
"count": 85,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 34,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1932,
"count": 98,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 35,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1933,
"count": 115,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 36,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1934,
"count": 135,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 37,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1935,
"count": 139,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 38,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1936,
"count": 186,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 39,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1937,
"count": 207,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 40,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1938,
"count": 236,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 41,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1939,
"count": 297,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 42,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1940,
"count": 329,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 43,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1941,
"count": 394,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 44,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1942,
"count": 503,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 45,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1943,
"count": 545,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 46,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1944,
"count": 627,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 47,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1945,
"count": 634,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 48,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1946,
"count": 877,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 49,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1947,
"count": 1101,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 50,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1948,
"count": 998,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 51,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1949,
"count": 1081,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 52,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1950,
"count": 1117,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 53,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1951,
"count": 1222,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 54,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1952,
"count": 1343,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 55,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1953,
"count": 1406,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 56,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1954,
"count": 1525,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 57,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1955,
"count": 1739,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 58,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1956,
"count": 1769,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 59,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1957,
"count": 1882,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 60,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1958,
"count": 1966,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 61,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1959,
"count": 2105,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 62,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1960,
"count": 2355,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 63,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1961,
"count": 2261,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 64,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1962,
"count": 2405,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 65,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1963,
"count": 2486,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 66,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1964,
"count": 2546,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 67,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1965,
"count": 2648,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 68,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1966,
"count": 2562,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 69,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1967,
"count": 2715,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 70,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1968,
"count": 2751,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 71,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1969,
"count": 2925,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 72,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1970,
"count": 3164,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 73,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1971,
"count": 3051,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 74,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1972,
"count": 3096,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 75,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1973,
"count": 3073,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 76,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1974,
"count": 3286,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 77,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1975,
"count": 3452,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 78,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1976,
"count": 3609,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 79,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1977,
"count": 3890,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 80,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1978,
"count": 3986,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 81,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1979,
"count": 4484,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 82,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1980,
"count": 4978,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 83,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1981,
"count": 5033,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 84,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1982,
"count": 5376,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 85,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1983,
"count": 5665,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 86,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1984,
"count": 6093,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 87,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1985,
"count": 6343,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 88,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1986,
"count": 6915,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 89,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1987,
"count": 7368,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 90,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1988,
"count": 7675,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 91,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1989,
"count": 8282,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 92,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1990,
"count": 8668,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 93,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1991,
"count": 8636,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 94,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1992,
"count": 8163,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 95,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1993,
"count": 8067,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 96,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1994,
"count": 7312,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 97,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1995,
"count": 5801,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 98,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1996,
"count": 3955,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 99,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1997,
"count": 2780,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 100,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1998,
"count": 1815,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 101,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 1999,
"count": 978,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 102,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2000,
"count": 562,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 103,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2001,
"count": 217,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 104,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2002,
"count": 114,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 105,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2003,
"count": 71,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 106,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2004,
"count": 30,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 107,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2005,
"count": 22,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 108,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2006,
"count": 12,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 109,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2007,
"count": 16,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 110,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2008,
"count": 13,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 111,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2009,
"count": 17,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 112,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2010,
"count": 29,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 113,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2011,
"count": 19,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 114,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2012,
"count": 67,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 115,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2013,
"count": 230,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByBirthYear",
"pk": 116,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"birth_year": 2014,
"count": 79,
"date": "2014-07-01"
}
}
]
[
{
"model": "v0.CourseEnrollmentByCountry",
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"country": "US",
"date": "2014-06-01",
"count": 100
}
},
{
"model": "v0.CourseEnrollmentByCountry",
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"country": "IN",
"date": "2014-06-01",
"count": 240
}
},
{
"model": "v0.CourseEnrollmentByCountry",
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"country": "US",
"date": "2014-06-02",
"count": 106
}
},
{
"model": "v0.CourseEnrollmentByCountry",
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"country": "IN",
"date": "2014-06-02",
"count": 199
}
},
{
"model": "v0.CourseEnrollmentByCountry",
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"country": "US",
"date": "2014-06-03",
"count": 200
}
},
{
"model": "v0.CourseEnrollmentByCountry",
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"country": "IN",
"date": "2014-06-03",
"count": 300
}
},
{
"model": "v0.CourseEnrollmentByCountry",
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"country": "IS",
"date": "2014-06-03",
"count": 6
}
}
]
[
{
"model": "v0.CourseEnrollmentDaily",
"pk": 1,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"date": "2014-06-01",
"count": 100
}
},
{
"model": "v0.CourseEnrollmentDaily",
"pk": 2,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"date": "2014-06-02",
"count": 150
}
},
{
"model": "v0.CourseEnrollmentDaily",
"pk": 3,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"date": "2014-06-03",
"count": 300
}
}
]
[
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 5,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 6,
"count": 12255,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 6,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 7,
"count": 70885,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 7,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 3,
"count": 981,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 8,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 5,
"count": 51591,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 9,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 4,
"count": 6051,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 10,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 8,
"count": 53216,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 11,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 1,
"count": 667,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 12,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 2,
"count": 5722,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 13,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 9,
"count": 9940,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 14,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 6,
"count": 12295,
"date": "2014-07-02"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 6,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 7,
"count": 70885,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 7,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 3,
"count": 981,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 8,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 5,
"count": 51591,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 9,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 4,
"count": 6051,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 10,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 8,
"count": 53216,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 11,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 1,
"count": 667,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 12,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 2,
"count": 5722,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByEducation",
"pk": 13,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"education_level": 9,
"count": 9940,
"date": "2014-07-01"
}
}
]
[
{
"model": "v0.CourseEnrollmentByGender",
"pk": 1,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"gender": "m",
"count": 133240,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByGender",
"pk": 2,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"gender": "f",
"count": 77495,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByGender",
"pk": 3,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"gender": "o",
"count": 423,
"date": "2014-07-01"
}
},
{
"model": "v0.CourseEnrollmentByGender",
"pk": 4,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"gender": "m",
"count": 1332,
"date": "2014-07-02"
}
},
{
"model": "v0.CourseEnrollmentByGender",
"pk": 5,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"gender": "f",
"count": 77445,
"date": "2014-07-02"
}
},
{
"model": "v0.CourseEnrollmentByGender",
"pk": 6,
"fields": {
"course": ["edX/DemoX/Demo_Course"],
"gender": "o",
"count": 34,
"date": "2014-07-02"
}
}
]
import datetime
import random
from django.core.management.base import BaseCommand
from analytics_data_api.v0 import models
# http://stackoverflow.com/a/3590105
def constrained_sum_sample_pos(num_values, total):
"""Return a randomly chosen list of n positive integers summing to total.
Each such list is equally likely to occur."""
dividers = sorted(random.sample(xrange(1, total), num_values - 1))
return [a - b for a, b in zip(dividers + [total], [0] + dividers)]
def get_count(start):
delta = 25 * random.gauss(0, 1)
return int(start + delta)
class Command(BaseCommand):
def handle(self, *args, **options):
days = 120
course = models.Course.objects.first()
start_date = datetime.date(year=2014, month=1, day=1)
genders = {
'm': 0.6107,
'f': 0.3870,
'o': 0.23
}
education_levels = {
'associates': 0.058,
'bachelors': 0.3355,
'primary': 0.0046,
'secondary': 0.2442,
'junior_secondary': 0.0286,
'masters': 0.2518,
'none': 0.0032,
'other': 0.0271,
'doctorate': 0.0470
}
countries = {
'US': 0.34,
'GH': 0.12,
'IN': 0.10,
'CA': 0.14,
'CN': 0.22,
'DE': 0.08
}
birth_years = range(1960, 2005)
ratios = [n / 1000.0 for n in constrained_sum_sample_pos(len(birth_years), 1000)]
birth_years = dict(zip(birth_years, ratios))
# Delete existing data
for model in [models.CourseEnrollmentDaily, models.CourseEnrollmentByGender, models.CourseEnrollmentByEducation,
models.CourseEnrollmentByBirthYear, models.CourseEnrollmentByCountry]:
model.objects.all().delete()
# Create new data data
daily_total = 1500
for i in range(days):
daily_total = get_count(daily_total)
date = start_date + datetime.timedelta(days=i)
models.CourseEnrollmentDaily.objects.create(course=course, date=date, count=daily_total)
for gender, ratio in genders.iteritems():
count = int(ratio * daily_total)
models.CourseEnrollmentByGender.objects.create(course=course, date=date, count=count, gender=gender)
for short_name, ratio in education_levels.iteritems():
education_level = models.EducationLevel.objects.get(short_name=short_name)
count = int(ratio * daily_total)
models.CourseEnrollmentByEducation.objects.create(course=course, date=date, count=count,
education_level=education_level)
for code, ratio in countries.iteritems():
country = models.Country.objects.get(code=code)
count = int(ratio * daily_total)
models.CourseEnrollmentByCountry.objects.create(course=course, date=date, count=count, country=country)
for birth_year, ratio in birth_years.iteritems():
count = int(ratio * daily_total)
models.CourseEnrollmentByBirthYear.objects.create(course=course, date=date, count=count,
birth_year=birth_year)
......@@ -31,7 +31,7 @@ class CourseActivityByWeek(models.Model):
class BaseCourseEnrollment(models.Model):
course = models.ForeignKey(Course, null=False)
date = models.DateField(null=False)
date = models.DateField(null=False, db_index=True)
count = models.IntegerField(null=False)
class Meta(object):
......
# NOTE: Full URLs are used throughout these tests to ensure that the API contract is fulfilled. The URLs should *not*
# change for versions greater than 1.0.0. Tests target a specific version of the API, additional tests should be added
# for subsequent versions if there are breaking changes introduced in those versions.
import StringIO
import csv
import datetime
import random
......@@ -9,11 +10,9 @@ from django.conf import settings
from django_dynamic_fixture import G
import pytz
from analytics_data_api.v0.models import CourseEnrollmentByBirthYear, CourseEnrollmentByEducation, EducationLevel, \
CourseEnrollmentByGender, CourseActivityByWeek, Course, ProblemResponseAnswerDistribution, CourseEnrollmentDaily, \
Country, \
CourseEnrollmentByCountry
from analytics_data_api.v0 import models
from analytics_data_api.v0.serializers import ProblemResponseAnswerDistributionSerializer
from analytics_data_api.v0.tests.utils import flatten
from analyticsdataserver.tests import TestCaseWithAuthentication
......@@ -21,16 +20,16 @@ class CourseActivityLastWeekTest(TestCaseWithAuthentication):
def setUp(self):
super(CourseActivityLastWeekTest, self).setUp()
self.course_id = 'edX/DemoX/Demo_Course'
self.course = G(Course, course_id=self.course_id)
self.course = G(models.Course, course_id=self.course_id)
interval_start = '2014-05-24T00:00:00Z'
interval_end = '2014-06-01T00:00:00Z'
G(CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
G(models.CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
activity_type='posted_forum', count=100)
G(CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
G(models.CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
activity_type='attempted_problem', count=200)
G(CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
G(models.CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
activity_type='any', count=300)
G(CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
G(models.CourseActivityByWeek, course=self.course, interval_start=interval_start, interval_end=interval_end,
activity_type='played_video', count=400)
def test_activity(self):
......@@ -89,7 +88,7 @@ class CourseEnrollmentViewTestCase(object):
def _get_non_existent_course_id(self):
course_id = random.randint(100, 9999)
if not Course.objects.filter(course_id=course_id).exists():
if not models.Course.objects.filter(course_id=course_id).exists():
return course_id
return self._get_non_existent_course_id()
......@@ -105,12 +104,38 @@ class CourseEnrollmentViewTestCase(object):
self.assertEquals(response.status_code, 404)
def test_get(self):
# Validate the basic response status
response = self.authenticated_get('/api/v0/courses/%s%s' % (self.course.course_id, self.path,))
self.assertEquals(response.status_code, 200)
# Validate the actual data
expected = self.get_expected_response(*self.model.objects.filter(date=self.date))
self.assertEquals(response.data, expected)
def test_get_csv(self):
path = '/api/v0/courses/%s%s' % (self.course.course_id, self.path,)
csv_content_type = 'text/csv'
response = self.authenticated_get(path, HTTP_ACCEPT=csv_content_type)
# Validate the basic response status and content code
self.assertEquals(response.status_code, 200)
self.assertEquals(response['Content-Type'].split(';')[0], csv_content_type)
# Validate the actual data
data = self.get_expected_response(*self.model.objects.filter(date=self.date))
data = map(flatten, data)
# The CSV renderer sorts the headers alphabetically
fieldnames = sorted(data[0].keys())
# Generate the expected CSV output
expected = StringIO.StringIO()
writer = csv.DictWriter(expected, fieldnames)
writer.writeheader()
writer.writerows(data)
self.assertEqual(response.content, expected.getvalue())
def test_get_with_intervals(self):
expected = self.get_expected_response(*self.model.objects.filter(date=self.date))
self.assertIntervalFilteringWorks(expected, self.date, self.date + datetime.timedelta(days=1))
......@@ -141,11 +166,11 @@ class CourseEnrollmentViewTestCase(object):
class CourseEnrollmentByBirthYearViewTests(TestCaseWithAuthentication, CourseEnrollmentViewTestCase):
path = '/enrollment/birth_year'
model = CourseEnrollmentByBirthYear
model = models.CourseEnrollmentByBirthYear
@classmethod
def setUpClass(cls):
cls.course = G(Course)
cls.course = G(models.Course)
cls.date = datetime.date(2014, 1, 1)
G(cls.model, course=cls.course, date=cls.date, birth_year=1956)
G(cls.model, course=cls.course, date=cls.date, birth_year=1986)
......@@ -153,7 +178,8 @@ class CourseEnrollmentByBirthYearViewTests(TestCaseWithAuthentication, CourseEnr
G(cls.model, course=cls.course, date=cls.date - datetime.timedelta(days=10), birth_year=1986)
def get_expected_response(self, *args):
return [{'course_id': ce.course.course_id, 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
return [
{'course_id': str(ce.course.course_id), 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
'birth_year': ce.birth_year} for ce in args]
def test_get(self):
......@@ -170,13 +196,13 @@ class CourseEnrollmentByBirthYearViewTests(TestCaseWithAuthentication, CourseEnr
class CourseEnrollmentByEducationViewTests(TestCaseWithAuthentication, CourseEnrollmentViewTestCase):
path = '/enrollment/education/'
model = CourseEnrollmentByEducation
model = models.CourseEnrollmentByEducation
@classmethod
def setUpClass(cls):
cls.el1 = G(EducationLevel, name='Doctorate', short_name='doctorate')
cls.el2 = G(EducationLevel, name='Top Secret', short_name='top_secret')
cls.course = G(Course)
cls.el1 = G(models.EducationLevel, name='Doctorate', short_name='doctorate')
cls.el2 = G(models.EducationLevel, name='Top Secret', short_name='top_secret')
cls.course = G(models.Course)
cls.date = datetime.date(2014, 1, 1)
G(cls.model, course=cls.course, date=cls.date, education_level=cls.el1)
G(cls.model, course=cls.course, date=cls.date, education_level=cls.el2)
......@@ -184,25 +210,27 @@ class CourseEnrollmentByEducationViewTests(TestCaseWithAuthentication, CourseEnr
education_level=cls.el2)
def get_expected_response(self, *args):
return [{'course_id': ce.course.course_id, 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
return [
{'course_id': str(ce.course.course_id), 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
'education_level': {'name': ce.education_level.name, 'short_name': ce.education_level.short_name}} for
ce in args]
class CourseEnrollmentByGenderViewTests(TestCaseWithAuthentication, CourseEnrollmentViewTestCase):
path = '/enrollment/gender/'
model = CourseEnrollmentByGender
model = models.CourseEnrollmentByGender
@classmethod
def setUpClass(cls):
cls.course = G(Course)
cls.course = G(models.Course)
cls.date = datetime.date(2014, 1, 1)
G(cls.model, course=cls.course, gender='m', date=cls.date, count=34)
G(cls.model, course=cls.course, gender='f', date=cls.date, count=45)
G(cls.model, course=cls.course, gender='f', date=cls.date - datetime.timedelta(days=2), count=45)
def get_expected_response(self, *args):
return [{'course_id': ce.course.course_id, 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
return [
{'course_id': str(ce.course.course_id), 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
'gender': ce.gender} for ce in args]
......@@ -217,7 +245,7 @@ class AnswerDistributionTests(TestCaseWithAuthentication):
cls.module_id = "i4x://org/num/run/problem/RANDOMNUMBER"
cls.part_id1 = "i4x-org-num-run-problem-RANDOMNUMBER_2_1"
cls.ad1 = G(
ProblemResponseAnswerDistribution,
models.ProblemResponseAnswerDistribution,
course_id=cls.course_id,
module_id=cls.module_id,
part_id=cls.part_id1
......@@ -238,33 +266,36 @@ class AnswerDistributionTests(TestCaseWithAuthentication):
class CourseEnrollmentViewTests(TestCaseWithAuthentication, CourseEnrollmentViewTestCase):
model = CourseEnrollmentDaily
model = models.CourseEnrollmentDaily
path = '/enrollment'
@classmethod
def setUpClass(cls):
cls.course = G(Course)
cls.course = G(models.Course)
cls.date = datetime.date(2014, 1, 1)
G(cls.model, course=cls.course, date=cls.date, count=203)
G(cls.model, course=cls.course, date=cls.date - datetime.timedelta(days=5), count=203)
def get_expected_response(self, *args):
return [{'course_id': ce.course.course_id, 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT)}
return [
{'course_id': str(ce.course.course_id), 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT)}
for ce in args]
class CourseEnrollmentByLocationViewTests(TestCaseWithAuthentication, CourseEnrollmentViewTestCase):
path = '/enrollment/location/'
model = CourseEnrollmentByCountry
model = models.CourseEnrollmentByCountry
def get_expected_response(self, *args):
return [{'course_id': ce.course.course_id, 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
return [
{'course_id': str(ce.course.course_id), 'count': ce.count, 'date': ce.date.strftime(settings.DATE_FORMAT),
'country': {'code': ce.country.code, 'name': ce.country.name}} for ce in args]
@classmethod
def setUpClass(cls):
cls.course = G(Course)
cls.course = G(models.Course)
cls.date = datetime.date(2014, 1, 1)
G(cls.model, course=cls.course, country=G(Country), count=455, date=cls.date)
G(cls.model, course=cls.course, country=G(Country), count=356, date=cls.date)
G(cls.model, course=cls.course, country=G(Country), count=12, date=cls.date - datetime.timedelta(days=29))
G(cls.model, course=cls.course, country=G(models.Country), count=455, date=cls.date)
G(cls.model, course=cls.course, country=G(models.Country), count=356, date=cls.date)
G(cls.model, course=cls.course, country=G(models.Country), count=12,
date=cls.date - datetime.timedelta(days=29))
import collections
def flatten(dictionary, parent_key='', sep='.'):
"""
Flatten dictionary
http://stackoverflow.com/a/6027615
"""
items = []
for key, value in dictionary.items():
new_key = parent_key + sep + key if parent_key else key
if isinstance(value, collections.MutableMapping):
items.extend(flatten(value, new_key).items())
else:
items.append((new_key, value))
return dict(items)
"""Common settings and globals."""
from os.path import abspath, basename, dirname, join, normpath
from sys import stderr
......@@ -250,6 +249,11 @@ REST_FRAMEWORK = {
# For the browseable API
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
'rest_framework_csv.renderers.CSVRenderer',
)
}
########## END REST FRAMEWORK CONFIGURATION
......
......@@ -85,5 +85,5 @@ ENABLE_ADMIN_SITE = True
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
SWAGGER_SETTINGS = {
'api_key': 'analytics'
'api_key': 'edx'
}
from contextlib import contextmanager
from functools import partial
from django.conf import settings
from django.contrib.auth.models import User
from django.db.utils import ConnectionHandler, DatabaseError
from django.test import TestCase
from django.test.utils import override_settings
from mock import patch, Mock
import mock
from rest_framework.authtoken.models import Token
......@@ -15,13 +14,16 @@ class TestCaseWithAuthentication(TestCase):
def setUp(self):
super(TestCaseWithAuthentication, self).setUp()
test_user = User.objects.create_user('tester', 'test@example.com', 'testpassword')
token = Token.objects.create(user=test_user)
self.authenticated_get = partial(self.client.get, HTTP_AUTHORIZATION='Token ' + token.key, follow=True)
self.token = Token.objects.create(user=test_user)
def authenticated_get(self, path, data=None, follow=True, **extra):
data = data or {}
return self.client.get(path, data, follow, HTTP_AUTHORIZATION='Token ' + self.token.key, **extra)
@contextmanager
def no_database():
cursor_mock = Mock(side_effect=DatabaseError)
cursor_mock = mock.Mock(side_effect=DatabaseError)
with mock.patch('django.db.backends.util.CursorWrapper', cursor_mock):
yield
......@@ -58,7 +60,7 @@ class OperationalEndpointsTest(TestCaseWithAuthentication):
@staticmethod
@contextmanager
def override_database_connections(databases):
with patch('analyticsdataserver.views.connections', ConnectionHandler(databases)):
with mock.patch('analyticsdataserver.views.connections', ConnectionHandler(databases)):
yield
@override_settings(ANALYTICS_DATABASE='reporting')
......
......@@ -5,3 +5,4 @@ django-model-utils==1.4.0
djangorestframework==2.3.5
ipython==2.1.0
django-rest-swagger==0.1.14
djangorestframework-csv==1.3.3
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment