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
ca6da2db
Commit
ca6da2db
authored
Dec 20, 2017
by
Diana Huang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add discussion information to learner context.
parent
5f5df7e7
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
73 additions
and
65 deletions
+73
-65
lms/djangoapps/discussion/views.py
+66
-61
openedx/features/learner_analytics/templates/learner_analytics/dashboard.html
+1
-0
openedx/features/learner_analytics/views.py
+6
-4
No files found.
lms/djangoapps/discussion/views.py
View file @
ca6da2db
...
@@ -483,6 +483,64 @@ def _create_discussion_board_context(request, base_context, thread=None):
...
@@ -483,6 +483,64 @@ def _create_discussion_board_context(request, base_context, thread=None):
return
context
return
context
def
create_user_profile_context
(
request
,
course_key
,
user_id
):
""" Generate a context dictionary for the user profile. """
user
=
cc
.
User
.
from_django_user
(
request
.
user
)
course
=
get_course_with_access
(
request
.
user
,
'load'
,
course_key
,
check_if_enrolled
=
True
)
# If user is not enrolled in the course, do not proceed.
django_user
=
User
.
objects
.
get
(
id
=
user_id
)
if
not
CourseEnrollment
.
is_enrolled
(
django_user
,
course
.
id
):
raise
Http404
query_params
=
{
'page'
:
request
.
GET
.
get
(
'page'
,
1
),
'per_page'
:
THREADS_PER_PAGE
,
# more than threads_per_page to show more activities
}
group_id
=
get_group_id_for_comments_service
(
request
,
course_key
)
if
group_id
is
not
None
:
query_params
[
'group_id'
]
=
group_id
profiled_user
=
cc
.
User
(
id
=
user_id
,
course_id
=
course_key
,
group_id
=
group_id
)
else
:
profiled_user
=
cc
.
User
(
id
=
user_id
,
course_id
=
course_key
)
threads
,
page
,
num_pages
=
profiled_user
.
active_threads
(
query_params
)
query_params
[
'page'
]
=
page
query_params
[
'num_pages'
]
=
num_pages
with
function_trace
(
"get_metadata_for_threads"
):
user_info
=
cc
.
User
.
from_django_user
(
request
.
user
)
.
to_dict
()
annotated_content_info
=
utils
.
get_metadata_for_threads
(
course_key
,
threads
,
request
.
user
,
user_info
)
is_staff
=
has_permission
(
request
.
user
,
'openclose_thread'
,
course
.
id
)
threads
=
[
utils
.
prepare_content
(
thread
,
course_key
,
is_staff
)
for
thread
in
threads
]
with
function_trace
(
"add_courseware_context"
):
add_courseware_context
(
threads
,
course
,
request
.
user
)
user_roles
=
django_user
.
roles
.
filter
(
course_id
=
course
.
id
)
.
order_by
(
"name"
)
.
values_list
(
"name"
,
flat
=
True
)
.
distinct
()
with
function_trace
(
"get_cohort_info"
):
course_discussion_settings
=
get_course_discussion_settings
(
course_key
)
user_group_id
=
get_group_id_for_user
(
request
.
user
,
course_discussion_settings
)
context
=
_create_base_discussion_view_context
(
request
,
course_key
)
context
.
update
({
'django_user'
:
django_user
,
'django_user_roles'
:
user_roles
,
'profiled_user'
:
profiled_user
.
to_dict
(),
'threads'
:
threads
,
'user_group_id'
:
user_group_id
,
'annotated_content_info'
:
annotated_content_info
,
'page'
:
query_params
[
'page'
],
'num_pages'
:
query_params
[
'num_pages'
],
'sort_preference'
:
user
.
default_sort_key
,
'learner_profile_page_url'
:
reverse
(
'learner_profile'
,
kwargs
=
{
'username'
:
django_user
.
username
}),
})
return
context
@require_GET
@require_GET
@login_required
@login_required
@use_bulk_ops
@use_bulk_ops
...
@@ -491,75 +549,22 @@ def user_profile(request, course_key, user_id):
...
@@ -491,75 +549,22 @@ def user_profile(request, course_key, user_id):
Renders a response to display the user profile page (shown after clicking
Renders a response to display the user profile page (shown after clicking
on a post author's username).
on a post author's username).
"""
"""
user
=
cc
.
User
.
from_django_user
(
request
.
user
)
course
=
get_course_with_access
(
request
.
user
,
'load'
,
course_key
,
check_if_enrolled
=
True
)
try
:
try
:
# If user is not enrolled in the course, do not proceed.
context
=
create_user_profile_context
(
request
,
course_key
,
user_id
)
django_user
=
User
.
objects
.
get
(
id
=
user_id
)
if
not
CourseEnrollment
.
is_enrolled
(
django_user
,
course
.
id
):
raise
Http404
query_params
=
{
'page'
:
request
.
GET
.
get
(
'page'
,
1
),
'per_page'
:
THREADS_PER_PAGE
,
# more than threads_per_page to show more activities
}
try
:
group_id
=
get_group_id_for_comments_service
(
request
,
course_key
)
except
ValueError
:
return
HttpResponseServerError
(
"Invalid group_id"
)
if
group_id
is
not
None
:
query_params
[
'group_id'
]
=
group_id
profiled_user
=
cc
.
User
(
id
=
user_id
,
course_id
=
course_key
,
group_id
=
group_id
)
else
:
profiled_user
=
cc
.
User
(
id
=
user_id
,
course_id
=
course_key
)
threads
,
page
,
num_pages
=
profiled_user
.
active_threads
(
query_params
)
query_params
[
'page'
]
=
page
query_params
[
'num_pages'
]
=
num_pages
with
function_trace
(
"get_metadata_for_threads"
):
user_info
=
cc
.
User
.
from_django_user
(
request
.
user
)
.
to_dict
()
annotated_content_info
=
utils
.
get_metadata_for_threads
(
course_key
,
threads
,
request
.
user
,
user_info
)
is_staff
=
has_permission
(
request
.
user
,
'openclose_thread'
,
course
.
id
)
threads
=
[
utils
.
prepare_content
(
thread
,
course_key
,
is_staff
)
for
thread
in
threads
]
with
function_trace
(
"add_courseware_context"
):
add_courseware_context
(
threads
,
course
,
request
.
user
)
if
request
.
is_ajax
():
if
request
.
is_ajax
():
return
utils
.
JsonResponse
({
return
utils
.
JsonResponse
({
'discussion_data'
:
threads
,
'discussion_data'
:
context
[
'threads'
]
,
'page'
:
query_params
[
'page'
],
'page'
:
context
[
'page'
],
'num_pages'
:
query_params
[
'num_pages'
],
'num_pages'
:
context
[
'num_pages'
],
'annotated_content_info'
:
annotated_content_info
,
'annotated_content_info'
:
context
[
'annotated_content_info'
]
,
})
})
else
:
else
:
user_roles
=
django_user
.
roles
.
filter
(
print
context
course_id
=
course
.
id
)
.
order_by
(
"name"
)
.
values_list
(
"name"
,
flat
=
True
)
.
distinct
()
with
function_trace
(
"get_cohort_info"
):
course_discussion_settings
=
get_course_discussion_settings
(
course_key
)
user_group_id
=
get_group_id_for_user
(
request
.
user
,
course_discussion_settings
)
context
=
_create_base_discussion_view_context
(
request
,
course_key
)
context
.
update
({
'django_user'
:
django_user
,
'django_user_roles'
:
user_roles
,
'profiled_user'
:
profiled_user
.
to_dict
(),
'threads'
:
threads
,
'user_group_id'
:
user_group_id
,
'annotated_content_info'
:
annotated_content_info
,
'page'
:
query_params
[
'page'
],
'num_pages'
:
query_params
[
'num_pages'
],
'sort_preference'
:
user
.
default_sort_key
,
'learner_profile_page_url'
:
reverse
(
'learner_profile'
,
kwargs
=
{
'username'
:
django_user
.
username
}),
})
return
render_to_response
(
'discussion/discussion_profile_page.html'
,
context
)
return
render_to_response
(
'discussion/discussion_profile_page.html'
,
context
)
except
User
.
DoesNotExist
:
except
User
.
DoesNotExist
:
raise
Http404
raise
Http404
except
ValueError
:
return
HttpResponseServerError
(
"Invalid group_id"
)
@login_required
@login_required
...
...
openedx/features/learner_analytics/templates/learner_analytics/dashboard.html
View file @
ca6da2db
...
@@ -61,6 +61,7 @@ from openedx.features.course_experience import course_home_page_title
...
@@ -61,6 +61,7 @@ from openedx.features.course_experience import course_home_page_title
'schedule': assignment_schedule,
'schedule': assignment_schedule,
'grading_policy': grading_policy,
'grading_policy': grading_policy,
'grades': assignment_grades,
'grades': assignment_grades,
'discussion_info': discussion_info,
}
}
)}
)}
</div>
</div>
...
...
openedx/features/learner_analytics/views.py
View file @
ca6da2db
...
@@ -16,8 +16,8 @@ from django.views.generic import View
...
@@ -16,8 +16,8 @@ from django.views.generic import View
from
opaque_keys.edx.keys
import
CourseKey
from
opaque_keys.edx.keys
import
CourseKey
from
lms.djangoapps.course_api.blocks.api
import
get_blocks
from
lms.djangoapps.course_api.blocks.api
import
get_blocks
from
lms.djangoapps.courseware.courses
import
get_course_with_access
from
lms.djangoapps.courseware.courses
import
get_course_with_access
from
lms.djangoapps.discussion.views
import
create_user_profile_context
from
lms.djangoapps.grades.course_grade_factory
import
CourseGradeFactory
from
lms.djangoapps.grades.course_grade_factory
import
CourseGradeFactory
from
openedx.core.djangoapps.plugin_api.views
import
EdxFragmentView
from
openedx.features.course_experience
import
default_course_url_name
from
openedx.features.course_experience
import
default_course_url_name
from
xmodule.modulestore.django
import
modulestore
from
xmodule.modulestore.django
import
modulestore
from
util.views
import
ensure_valid_course_key
from
util.views
import
ensure_valid_course_key
...
@@ -51,7 +51,8 @@ class LearnerAnalyticsView(View):
...
@@ -51,7 +51,8 @@ class LearnerAnalyticsView(View):
'uses_pattern_library'
:
True
,
'uses_pattern_library'
:
True
,
'grading_policy'
:
course
.
grading_policy
,
'grading_policy'
:
course
.
grading_policy
,
'assignment_grades'
:
self
.
get_grade_data
(
request
.
user
,
course_key
),
'assignment_grades'
:
self
.
get_grade_data
(
request
.
user
,
course_key
),
'assignment_schedule'
:
self
.
get_schedule
(
request
,
course_key
)
'assignment_schedule'
:
self
.
get_schedule
(
request
,
course_key
),
'discussion_info'
:
self
.
get_discussion_data
(
request
,
course_key
)
}
}
return
render_to_response
(
'learner_analytics/dashboard.html'
,
context
)
return
render_to_response
(
'learner_analytics/dashboard.html'
,
context
)
...
@@ -74,7 +75,7 @@ class LearnerAnalyticsView(View):
...
@@ -74,7 +75,7 @@ class LearnerAnalyticsView(View):
}
}
return
json
.
dumps
(
grades
)
return
json
.
dumps
(
grades
)
def
get_discussion_data
(
self
,
user
,
course_key
):
def
get_discussion_data
(
self
,
request
,
course_key
):
"""
"""
Collects and formats the discussion data from a particular user and course.
Collects and formats the discussion data from a particular user and course.
...
@@ -82,7 +83,8 @@ class LearnerAnalyticsView(View):
...
@@ -82,7 +83,8 @@ class LearnerAnalyticsView(View):
user: User
user: User
course_key: CourseKey
course_key: CourseKey
"""
"""
pass
discussion_data
=
create_user_profile_context
(
request
,
course_key
,
request
.
user
.
id
)
return
json
.
dumps
(
discussion_data
)
def
get_schedule
(
self
,
request
,
course_key
):
def
get_schedule
(
self
,
request
,
course_key
):
"""
"""
...
...
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