Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-analytics-data-api
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-analytics-data-api
Commits
d925f797
Commit
d925f797
authored
Nov 29, 2016
by
Tyler Hallada
Committed by
Dennis Jen
Nov 30, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add tests for CourseSummariesView, add count, generate fake summaries, progress bars
parent
6596d90f
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
60 additions
and
5 deletions
+60
-5
analytics_data_api/management/commands/generate_fake_course_data.py
+27
-4
analytics_data_api/v0/models.py
+1
-0
analytics_data_api/v0/serializers.py
+2
-0
analytics_data_api/v0/tests/views/test_courses.py
+29
-1
requirements/local.txt
+1
-0
No files found.
analytics_data_api/management/commands/generate_fake_course_data.py
View file @
d925f797
...
...
@@ -2,8 +2,10 @@
import
datetime
import
logging
from
optparse
import
make_option
import
math
import
random
from
optparse
import
make_option
from
tqdm
import
tqdm
from
django.core.management.base
import
BaseCommand
from
django.utils
import
timezone
...
...
@@ -87,7 +89,8 @@ class Command(BaseCommand):
models
.
CourseEnrollmentByGender
,
models
.
CourseEnrollmentByEducation
,
models
.
CourseEnrollmentByBirthYear
,
models
.
CourseEnrollmentByCountry
]:
models
.
CourseEnrollmentByCountry
,
models
.
CourseMetaSummaryEnrollment
]:
model
.
objects
.
all
()
.
delete
()
logger
.
info
(
"Deleted all daily course enrollment data."
)
...
...
@@ -98,6 +101,7 @@ class Command(BaseCommand):
date
=
start_date
cumulative_count
=
0
progress
=
tqdm
(
total
=
(
end_date
-
date
)
.
days
+
2
)
while
date
<=
end_date
:
daily_total
=
get_count
(
daily_total
)
models
.
CourseEnrollmentDaily
.
objects
.
create
(
course_id
=
course_id
,
date
=
date
,
count
=
daily_total
)
...
...
@@ -128,8 +132,21 @@ class Command(BaseCommand):
models
.
CourseEnrollmentByBirthYear
.
objects
.
create
(
course_id
=
course_id
,
date
=
date
,
count
=
count
,
birth_year
=
birth_year
)
progress
.
update
(
1
)
date
=
date
+
datetime
.
timedelta
(
days
=
1
)
for
mode
,
ratio
in
enrollment_mode_ratios
.
iteritems
():
count
=
int
(
ratio
*
daily_total
)
cumulative_count
=
count
+
random
.
randint
(
0
,
100
)
models
.
CourseMetaSummaryEnrollment
.
objects
.
create
(
course_id
=
course_id
,
catalog_course_title
=
'Demo Course'
,
catalog_course
=
'Demo_Course'
,
start_date
=
timezone
.
now
()
-
datetime
.
timedelta
(
weeks
=
6
),
end_date
=
timezone
.
now
()
+
datetime
.
timedelta
(
weeks
=
10
),
pacing_type
=
'self_paced'
,
availability
=
'Current'
,
mode
=
mode
,
count
=
count
,
cumulative_count
=
cumulative_count
,
count_change_7_days
=
random
.
randint
(
-
50
,
50
))
progress
.
update
(
1
)
progress
.
close
()
logger
.
info
(
"Done!"
)
def
generate_weekly_data
(
self
,
course_id
,
start_date
,
end_date
):
...
...
@@ -144,6 +161,7 @@ class Command(BaseCommand):
logger
.
info
(
"Generating new weekly course activity data..."
)
progress
=
tqdm
(
total
=
math
.
ceil
((
end_date
-
start
)
.
days
/
7.0
)
+
1
)
while
start
<
end_date
:
active_students
=
random
.
randint
(
100
,
4000
)
# End date should occur on Saturday at 23:59:59
...
...
@@ -159,8 +177,10 @@ class Command(BaseCommand):
count
=
active_students
,
interval_start
=
start
,
interval_end
=
end
)
progress
.
update
(
1
)
start
=
end
progress
.
close
()
logger
.
info
(
"Done!"
)
def
generate_video_timeline_data
(
self
,
video_id
):
...
...
@@ -193,6 +213,7 @@ class Command(BaseCommand):
logger
.
info
(
"Generating learner engagement module data..."
)
current
=
start_date
progress
=
tqdm
(
total
=
(
end_date
-
start_date
)
.
days
+
1
)
while
current
<
end_date
:
current
=
current
+
datetime
.
timedelta
(
days
=
1
)
for
metric
in
engagement_events
.
INDIVIDUAL_EVENTS
:
...
...
@@ -206,7 +227,9 @@ class Command(BaseCommand):
models
.
ModuleEngagement
.
objects
.
create
(
course_id
=
course_id
,
username
=
username
,
date
=
current
,
entity_type
=
entity_type
,
entity_id
=
entity_id
,
event
=
event
,
count
=
count
)
logger
.
info
(
"Done!"
)
progress
.
update
(
1
)
progress
.
close
()
logger
.
info
(
"Done!"
)
def
generate_learner_engagement_range_data
(
self
,
course_id
,
start_date
,
end_date
,
max_value
=
100
):
logger
.
info
(
"Deleting engagement range data..."
)
...
...
@@ -256,7 +279,7 @@ class Command(BaseCommand):
username
=
options
[
'username'
]
video_id
=
'0fac49ba'
video_module_id
=
'i4x-edX-DemoX-video-5c90cffecd9b48b188cbfea176bf7fe9'
start_date
=
datetime
.
datetime
(
year
=
2016
,
month
=
1
,
day
=
1
,
tzinfo
=
timezone
.
utc
)
start_date
=
timezone
.
now
()
-
datetime
.
timedelta
(
weeks
=
10
)
num_weeks
=
options
[
'num_weeks'
]
if
num_weeks
:
...
...
analytics_data_api/v0/models.py
View file @
d925f797
...
...
@@ -75,6 +75,7 @@ class CourseMetaSummaryEnrollment(BaseCourseModel):
pacing_type
=
models
.
CharField
(
db_index
=
True
,
max_length
=
255
)
availability
=
models
.
CharField
(
db_index
=
True
,
max_length
=
255
)
mode
=
models
.
CharField
(
max_length
=
255
)
count
=
models
.
IntegerField
(
null
=
False
)
cumulative_count
=
models
.
IntegerField
(
null
=
False
)
count_change_7_days
=
models
.
IntegerField
(
default
=
0
)
...
...
analytics_data_api/v0/serializers.py
View file @
d925f797
...
...
@@ -521,8 +521,10 @@ class CourseMetaSummaryEnrollmentSerializer(ModelSerializerWithCreatedField):
pacing_type
=
serializers
.
CharField
()
availability
=
serializers
.
CharField
()
mode
=
serializers
.
CharField
()
count
=
serializers
.
IntegerField
(
default
=
0
)
cumulative_count
=
serializers
.
IntegerField
(
default
=
0
)
count_change_7_days
=
serializers
.
IntegerField
(
default
=
0
)
# TODO: 0 as default?
class
Meta
(
object
):
model
=
models
.
CourseMetaSummaryEnrollment
exclude
=
(
'id'
,)
analytics_data_api/v0/tests/views/test_courses.py
View file @
d925f797
...
...
@@ -16,7 +16,7 @@ from mock import patch, Mock
from
analytics_data_api.constants
import
country
,
enrollment_modes
,
genders
from
analytics_data_api.constants.country
import
get_country
from
analytics_data_api.v0
import
models
from
analytics_data_api.v0
import
models
,
serializers
from
analytics_data_api.v0.tests.views
import
CourseSamples
,
VerifyCsvResponseMixin
from
analytics_data_api.utils
import
get_filename_safe_course_id
from
analyticsdataserver.tests
import
TestCaseWithAuthentication
...
...
@@ -889,3 +889,31 @@ class CourseReportDownloadViewTests(TestCaseWithAuthentication):
'expiration_date'
:
datetime
.
datetime
(
2014
,
1
,
1
,
tzinfo
=
pytz
.
utc
)
.
strftime
(
settings
.
DATETIME_FORMAT
)
}
self
.
assertEqual
(
response
.
data
,
expected
)
class
CourseSummariesViewTests
(
TestCaseWithAuthentication
):
model
=
models
.
CourseMetaSummaryEnrollment
serializer
=
serializers
.
CourseMetaSummaryEnrollmentSerializer
path
=
'/course_summaries'
expected_summaries
=
[]
fake_course_ids
=
[
'edX/DemoX/Demo_Course'
,
'edX/DemoX/2'
,
'edX/DemoX/3'
,
'edX/DemoX/4'
]
# csv_filename_slug = u'course_summaries'
def
setUp
(
self
):
super
(
CourseSummariesViewTests
,
self
)
.
setUp
()
self
.
generate_data
()
def
generate_data
(
self
):
for
course_id
in
self
.
fake_course_ids
:
self
.
expected_summaries
.
append
(
self
.
serializer
(
G
(
self
.
model
,
course_id
=
course_id
,
count
=
10
,
cumulative_count
=
15
))
.
data
)
def
test_get
(
self
):
response
=
self
.
authenticated_get
(
u'/api/v0/course_summaries/?course_ids=
%
s'
%
','
.
join
(
self
.
fake_course_ids
))
self
.
assertEquals
(
response
.
status_code
,
200
)
self
.
assertItemsEqual
(
response
.
data
,
self
.
expected_summaries
)
def
test_no_summaries
(
self
):
self
.
model
.
objects
.
all
()
.
delete
()
response
=
self
.
authenticated_get
(
u'/api/v0/course_summaries/?course_ids=
%
s'
%
','
.
join
(
self
.
fake_course_ids
))
self
.
assertEquals
(
response
.
status_code
,
404
)
requirements/local.txt
View file @
d925f797
# Local development dependencies go here
-r base.txt
tqdm==4.10.0 # MIT
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment