Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
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-platform
Commits
ae778cf6
Commit
ae778cf6
authored
Sep 19, 2014
by
Zia Fazal
Committed by
Jonathan Piacenti
Aug 20, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ziafazal/api-added-ability-to-skip-leaders-list: ability
to skip leaders list for home page call
parent
99c64d62
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
31 additions
and
16 deletions
+31
-16
lms/djangoapps/api_manager/courses/tests.py
+10
-0
lms/djangoapps/api_manager/courses/views.py
+21
-16
No files found.
lms/djangoapps/api_manager/courses/tests.py
View file @
ae778cf6
...
@@ -1754,6 +1754,16 @@ class CoursesApiTests(TestCase):
...
@@ -1754,6 +1754,16 @@ class CoursesApiTests(TestCase):
self
.
assertEqual
(
response
.
data
[
'position'
],
2
)
self
.
assertEqual
(
response
.
data
[
'position'
],
2
)
self
.
assertEqual
(
response
.
data
[
'completions'
],
28
)
self
.
assertEqual
(
response
.
data
[
'completions'
],
28
)
# with skipleaders filter
test_uri
=
'{}/{}/metrics/completions/leaders/?user_id={}&skipleaders=true'
.
format
(
self
.
base_courses_uri
,
self
.
test_course_id
,
self
.
users
[
1
]
.
id
)
response
=
self
.
do_get
(
test_uri
)
self
.
assertEqual
(
response
.
status_code
,
200
)
self
.
assertIsNone
(
response
.
data
.
get
(
'leaders'
,
None
))
self
.
assertIsNone
(
response
.
data
.
get
(
'position'
,
None
))
self
.
assertEqual
(
response
.
data
[
'completions'
],
28
)
# test with bogus course
# test with bogus course
test_uri
=
'{}/{}/metrics/completions/leaders/'
.
format
(
self
.
base_courses_uri
,
self
.
test_bogus_course_id
)
test_uri
=
'{}/{}/metrics/completions/leaders/'
.
format
(
self
.
base_courses_uri
,
self
.
test_bogus_course_id
)
response
=
self
.
do_get
(
test_uri
)
response
=
self
.
do_get
(
test_uri
)
...
...
lms/djangoapps/api_manager/courses/views.py
View file @
ae778cf6
...
@@ -35,7 +35,7 @@ from api_manager.models import CourseGroupRelationship, CourseContentGroupRelati
...
@@ -35,7 +35,7 @@ from api_manager.models import CourseGroupRelationship, CourseContentGroupRelati
CourseModuleCompletion
CourseModuleCompletion
from
api_manager.permissions
import
SecureAPIView
,
SecureListAPIView
from
api_manager.permissions
import
SecureAPIView
,
SecureListAPIView
from
api_manager.users.serializers
import
UserSerializer
,
UserCountByCitySerializer
from
api_manager.users.serializers
import
UserSerializer
,
UserCountByCitySerializer
from
api_manager.utils
import
generate_base_uri
from
api_manager.utils
import
generate_base_uri
,
str2bool
from
projects.models
import
Project
,
Workgroup
from
projects.models
import
Project
,
Workgroup
from
projects.serializers
import
ProjectSerializer
,
BasicWorkgroupSerializer
from
projects.serializers
import
ProjectSerializer
,
BasicWorkgroupSerializer
from
.serializers
import
CourseModuleCompletionSerializer
,
CourseSerializer
from
.serializers
import
CourseModuleCompletionSerializer
,
CourseSerializer
...
@@ -1588,6 +1588,8 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
...
@@ -1588,6 +1588,8 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
```/api/courses/{course_id}/metrics/completions/leaders/?content_id={content_id}```
```/api/courses/{course_id}/metrics/completions/leaders/?content_id={content_id}```
To get more than 3 users use count parameter
To get more than 3 users use count parameter
```/api/courses/{course_id}/metrics/completions/leaders/?count=6```
```/api/courses/{course_id}/metrics/completions/leaders/?count=6```
To get only percentage of a user and course average skipleaders parameter can be used
```/api/courses/{course_id}/metrics/completions/leaders/?user_id={user_id}&skipleaders=true```
### Use Cases/Notes:
### Use Cases/Notes:
* Example: Display leaders in terms of completions in a given course
* Example: Display leaders in terms of completions in a given course
* Example: Display top 3 users leading in terms of completions in a given course
* Example: Display top 3 users leading in terms of completions in a given course
...
@@ -1599,6 +1601,7 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
...
@@ -1599,6 +1601,7 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
"""
"""
user_id
=
self
.
request
.
QUERY_PARAMS
.
get
(
'user_id'
,
None
)
user_id
=
self
.
request
.
QUERY_PARAMS
.
get
(
'user_id'
,
None
)
count
=
self
.
request
.
QUERY_PARAMS
.
get
(
'count'
,
3
)
count
=
self
.
request
.
QUERY_PARAMS
.
get
(
'count'
,
3
)
skipleaders
=
str2bool
(
self
.
request
.
QUERY_PARAMS
.
get
(
'skipleaders'
,
'false'
))
data
=
{}
data
=
{}
course_avg
=
0
course_avg
=
0
if
not
course_exists
(
request
,
request
.
user
,
course_id
):
if
not
course_exists
(
request
,
request
.
user
,
course_id
):
...
@@ -1617,13 +1620,14 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
...
@@ -1617,13 +1620,14 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
user_queryset
=
CourseModuleCompletion
.
objects
.
filter
(
course_id
=
course_key
,
user__id
=
user_id
)
\
user_queryset
=
CourseModuleCompletion
.
objects
.
filter
(
course_id
=
course_key
,
user__id
=
user_id
)
\
.
exclude
(
cat_list
)
.
exclude
(
cat_list
)
user_completions
=
user_queryset
.
count
()
user_completions
=
user_queryset
.
count
()
user_time_completed
=
user_queryset
.
aggregate
(
time_completed
=
Max
(
'created'
))
if
not
skipleaders
:
user_time_completed
=
user_time_completed
[
'time_completed'
]
or
timezone
.
now
()
user_time_completed
=
user_queryset
.
aggregate
(
time_completed
=
Max
(
'created'
))
completions_above_user
=
queryset
.
filter
(
user__is_active
=
True
)
.
values
(
'user__id'
)
\
user_time_completed
=
user_time_completed
[
'time_completed'
]
or
timezone
.
now
()
.
annotate
(
completions
=
Count
(
'content_id'
))
.
annotate
(
time_completed
=
Max
(
'created'
))
\
completions_above_user
=
queryset
.
filter
(
user__is_active
=
True
)
.
values
(
'user__id'
)
\
.
filter
(
Q
(
completions__gt
=
user_completions
)
|
Q
(
completions
=
user_completions
,
.
annotate
(
completions
=
Count
(
'content_id'
))
.
annotate
(
time_completed
=
Max
(
'created'
))
\
time_completed__lt
=
user_time_completed
))
.
count
()
.
filter
(
Q
(
completions__gt
=
user_completions
)
|
Q
(
completions
=
user_completions
,
data
[
'position'
]
=
completions_above_user
+
1
time_completed__lt
=
user_time_completed
))
.
count
()
data
[
'position'
]
=
completions_above_user
+
1
completion_percentage
=
0
completion_percentage
=
0
if
total_possible_completions
>
0
:
if
total_possible_completions
>
0
:
completion_percentage
=
int
(
round
(
100
*
user_completions
/
total_possible_completions
))
completion_percentage
=
int
(
round
(
100
*
user_completions
/
total_possible_completions
))
...
@@ -1634,14 +1638,15 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
...
@@ -1634,14 +1638,15 @@ class CoursesMetricsCompletionsLeadersList(SecureAPIView):
course_avg
=
round
(
total_actual_completions
/
float
(
total_users
),
1
)
course_avg
=
round
(
total_actual_completions
/
float
(
total_users
),
1
)
course_avg
=
int
(
round
(
100
*
course_avg
/
total_possible_completions
))
# avg in percentage
course_avg
=
int
(
round
(
100
*
course_avg
/
total_possible_completions
))
# avg in percentage
data
[
'course_avg'
]
=
course_avg
data
[
'course_avg'
]
=
course_avg
if
not
skipleaders
:
queryset
=
queryset
.
filter
(
user__is_active
=
True
)
.
values
(
'user__id'
,
'user__username'
,
'user__profile__title'
,
queryset
=
queryset
.
filter
(
user__is_active
=
True
)
.
values
(
'user__id'
,
'user__username'
,
'user__profile__avatar_url'
)
\
'user__profile__title'
,
.
annotate
(
completions
=
Count
(
'content_id'
))
.
annotate
(
time_completed
=
Max
(
'created'
))
\
'user__profile__avatar_url'
)
\
.
order_by
(
'-completions'
,
'time_completed'
)[:
count
]
.
annotate
(
completions
=
Count
(
'content_id'
))
.
annotate
(
time_completed
=
Max
(
'created'
))
\
serializer
=
CourseCompletionsLeadersSerializer
(
queryset
,
many
=
True
,
.
order_by
(
'-completions'
,
'time_completed'
)[:
count
]
context
=
{
'total_completions'
:
total_possible_completions
})
serializer
=
CourseCompletionsLeadersSerializer
(
queryset
,
many
=
True
,
data
[
'leaders'
]
=
serializer
.
data
# pylint: disable=E1101
context
=
{
'total_completions'
:
total_possible_completions
})
data
[
'leaders'
]
=
serializer
.
data
# pylint: disable=E1101
return
Response
(
data
,
status
=
status
.
HTTP_200_OK
)
return
Response
(
data
,
status
=
status
.
HTTP_200_OK
)
...
...
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