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
4dc96948
Commit
4dc96948
authored
Jul 07, 2015
by
Fred Smith
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #460 from edx-solutions/rc/2015-07-01
Rc/2015 07 01
parents
44b09dd8
0166729a
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
51 additions
and
15 deletions
+51
-15
lms/djangoapps/api_manager/users/urls.py
+13
-9
lms/djangoapps/django_comment_client/management/commands/export_discussion_participation.py
+12
-3
lms/djangoapps/django_comment_client/tests/management/test_export_discussion_participation.py
+23
-0
requirements/edx/custom.txt
+3
-3
No files found.
lms/djangoapps/api_manager/users/urls.py
View file @
4dc96948
""" Users API URI specification """
""" Users API URI specification """
from
django.conf
import
settings
from
django.conf.urls
import
patterns
,
url
from
django.conf.urls
import
patterns
,
url
from
rest_framework.urlpatterns
import
format_suffix_patterns
from
rest_framework.urlpatterns
import
format_suffix_patterns
from
api_manager.users
import
views
as
users_views
from
api_manager.users
import
views
as
users_views
COURSE_ID_PATTERN
=
settings
.
COURSE_ID_PATTERN
urlpatterns
=
patterns
(
urlpatterns
=
patterns
(
''
,
''
,
url
(
r'^metrics/cities/$'
,
users_views
.
UsersMetricsCitiesList
.
as_view
(),
name
=
'apimgr-users-metrics-cities-list'
),
url
(
r'^metrics/cities/$'
,
users_views
.
UsersMetricsCitiesList
.
as_view
(),
name
=
'apimgr-users-metrics-cities-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/grades$'
,
users_views
.
UsersCoursesGradesList
.
as_view
(),
name
=
'users-courses-grades-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/grades$'
,
users_views
.
UsersCoursesGradesList
.
as_view
(),
name
=
'users-courses-grades-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[^/]+/[^/]+/[^/]+)/grades$'
,
users_views
.
UsersCoursesGradesDetail
.
as_view
(),
name
=
'users-courses-grades-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}/grades$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersCoursesGradesDetail
.
as_view
(),
name
=
'users-courses-grades-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[^/]+/[^/]+/[^/]+)/metrics/social/$'
,
users_views
.
UsersSocialMetrics
.
as_view
(),
name
=
'users-social-metrics'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}/metrics/social/$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersSocialMetrics
.
as_view
(),
name
=
'users-social-metrics'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[^/]+/[^/]+/[^/]+)/completions/$'
,
users_views
.
UsersCoursesCompletionsList
.
as_view
(),
name
=
'users-courses-completions-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}/completions/$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersCoursesCompletionsList
.
as_view
(),
name
=
'users-courses-completions-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[^/]+/[^/]+/[^/]+)$'
,
users_views
.
UsersCoursesDetail
.
as_view
(),
name
=
'users-courses-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersCoursesDetail
.
as_view
(),
name
=
'users-courses-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[a-zA-Z0-9_+\/:]+)/grades$'
,
users_views
.
UsersCoursesGradesDetail
.
as_view
(),
name
=
'users-courses-grades-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}/grades$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersCoursesGradesDetail
.
as_view
(),
name
=
'users-courses-grades-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[a-zA-Z0-9_+\/:]+)/metrics/social/$'
,
users_views
.
UsersSocialMetrics
.
as_view
(),
name
=
'users-social-metrics'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}/metrics/social/$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersSocialMetrics
.
as_view
(),
name
=
'users-social-metrics'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[a-zA-Z0-9_+\/:]+)/completions/$'
,
users_views
.
UsersCoursesCompletionsList
.
as_view
(),
name
=
'users-courses-completions-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}/completions/$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersCoursesCompletionsList
.
as_view
(),
name
=
'users-courses-completions-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
(?P<course_id>[a-zA-Z0-9_+\/:]+)$'
,
users_views
.
UsersCoursesDetail
.
as_view
(),
name
=
'users-courses-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/
{0}$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersCoursesDetail
.
as_view
(),
name
=
'users-courses-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/*$'
,
users_views
.
UsersCoursesList
.
as_view
(),
name
=
'users-courses-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/courses/*$'
,
users_views
.
UsersCoursesList
.
as_view
(),
name
=
'users-courses-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/groups/*$'
,
users_views
.
UsersGroupsList
.
as_view
(),
name
=
'users-groups-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/groups/*$'
,
users_views
.
UsersGroupsList
.
as_view
(),
name
=
'users-groups-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/groups/(?P<group_id>[0-9]+)$'
,
users_views
.
UsersGroupsDetail
.
as_view
(),
name
=
'users-groups-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/groups/(?P<group_id>[0-9]+)$'
,
users_views
.
UsersGroupsDetail
.
as_view
(),
name
=
'users-groups-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/preferences$'
,
users_views
.
UsersPreferences
.
as_view
(),
name
=
'users-preferences-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/preferences$'
,
users_views
.
UsersPreferences
.
as_view
(),
name
=
'users-preferences-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/preferences/(?P<preference_id>[a-zA-Z0-9_]+)$'
,
users_views
.
UsersPreferencesDetail
.
as_view
(),
name
=
'users-preferences-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/preferences/(?P<preference_id>[a-zA-Z0-9_]+)$'
,
users_views
.
UsersPreferencesDetail
.
as_view
(),
name
=
'users-preferences-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/organizations/$'
,
users_views
.
UsersOrganizationsList
.
as_view
(),
name
=
'users-organizations-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/organizations/$'
,
users_views
.
UsersOrganizationsList
.
as_view
(),
name
=
'users-organizations-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/roles/(?P<role>[a-z_]+)/courses/
(?P<course_id>[a-zA-Z0-9_+\/:]+)$'
,
users_views
.
UsersRolesCoursesDetail
.
as_view
(),
name
=
'users-roles-courses-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/roles/(?P<role>[a-z_]+)/courses/
{0}$'
.
format
(
COURSE_ID_PATTERN
)
,
users_views
.
UsersRolesCoursesDetail
.
as_view
(),
name
=
'users-roles-courses-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/roles/*$'
,
users_views
.
UsersRolesList
.
as_view
(),
name
=
'users-roles-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/roles/*$'
,
users_views
.
UsersRolesList
.
as_view
(),
name
=
'users-roles-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/workgroups/$'
,
users_views
.
UsersWorkgroupsList
.
as_view
(),
name
=
'users-workgroups-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/workgroups/$'
,
users_views
.
UsersWorkgroupsList
.
as_view
(),
name
=
'users-workgroups-list'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/notifications/(?P<msg_id>[0-9]+)/$'
,
users_views
.
UsersNotificationsDetail
.
as_view
(),
name
=
'users-notifications-detail'
),
url
(
r'^(?P<user_id>[a-zA-Z0-9]+)/notifications/(?P<msg_id>[0-9]+)/$'
,
users_views
.
UsersNotificationsDetail
.
as_view
(),
name
=
'users-notifications-detail'
),
...
...
lms/djangoapps/django_comment_client/management/commands/export_discussion_participation.py
View file @
4dc96948
...
@@ -20,6 +20,11 @@ import django_comment_client.utils as utils
...
@@ -20,6 +20,11 @@ import django_comment_client.utils as utils
from
xmodule.modulestore.django
import
modulestore
from
xmodule.modulestore.django
import
modulestore
class
MissingCohortedConfigCommandError
(
CommandError
):
#pylint: disable=no-init
""" Raised when a command requires cohorted discussions configured, but none are found """
pass
class
DiscussionExportFields
(
object
):
class
DiscussionExportFields
(
object
):
""" Container class for field names """
""" Container class for field names """
USER_ID
=
u"id"
USER_ID
=
u"id"
...
@@ -153,7 +158,10 @@ class Command(BaseCommand):
...
@@ -153,7 +158,10 @@ class Command(BaseCommand):
raw_course_key
,
raw_course_key
,
dir_name
/
self
.
get_default_file_location
(
raw_course_key
)
dir_name
/
self
.
get_default_file_location
(
raw_course_key
)
]
]
self
.
dump_one
(
*
args
,
**
options
)
try
:
self
.
dump_one
(
*
args
,
**
options
)
except
MissingCohortedConfigCommandError
as
e
:
print
(
'Error generating CSV for course {}: {}'
.
format
(
raw_course_key
,
e
.
message
))
def
dump_one
(
self
,
*
args
,
**
options
):
def
dump_one
(
self
,
*
args
,
**
options
):
if
not
args
:
if
not
args
:
...
@@ -180,8 +188,9 @@ class Command(BaseCommand):
...
@@ -180,8 +188,9 @@ class Command(BaseCommand):
if
options
.
get
(
self
.
COHORTED_ONLY_PARAMETER
,
False
):
if
options
.
get
(
self
.
COHORTED_ONLY_PARAMETER
,
False
):
cohorted_discussions
=
course
.
cohort_config
.
get
(
'cohorted_inline_discussions'
,
None
)
cohorted_discussions
=
course
.
cohort_config
.
get
(
'cohorted_inline_discussions'
,
None
)
if
not
cohorted_discussions
:
if
not
cohorted_discussions
:
raise
CommandError
(
"Only cohorted discussions are marked for export, "
raise
MissingCohortedConfigCommandError
(
"but no cohorted discussions found for the course"
)
"Only cohorted discussions are marked for export, "
"but no cohorted discussions found for the course"
)
else
:
else
:
target_discussion_ids
=
cohorted_discussions
target_discussion_ids
=
cohorted_discussions
...
...
lms/djangoapps/django_comment_client/tests/management/test_export_discussion_participation.py
View file @
4dc96948
...
@@ -96,6 +96,29 @@ class CommandTest(TestCase):
...
@@ -96,6 +96,29 @@ class CommandTest(TestCase):
self
.
assertIn
(
'test_dir/social_stats_course-v1SandboxSandboxSandbox'
,
calls
[
1
][
0
][
1
])
self
.
assertIn
(
'test_dir/social_stats_course-v1SandboxSandboxSandbox'
,
calls
[
1
][
0
][
1
])
self
.
assertIn
(
'test_dir/social_stats_course-v1TestTestyTestify'
,
calls
[
2
][
0
][
1
])
self
.
assertIn
(
'test_dir/social_stats_course-v1TestTestyTestify'
,
calls
[
2
][
0
][
1
])
def
test_all_cohortedonly_options_together
(
self
,
patched_get_course
):
""" Ensure the 'all' option doesn't stop when one of the course doesn't have cohorted discussions """
self
.
set_up_default_mocks
(
patched_get_course
)
type
(
patched_get_course
.
return_value
)
.
cohort_config
=
mock
.
PropertyMock
(
return_value
=
{
'cohorted_inline_discussions'
:
[]}
)
self
.
command
.
get_all_courses
=
mock
.
Mock
()
course_list
=
[
mock
.
Mock
()
for
__
in
range
(
0
,
3
)]
locator_list
=
[
CourseLocator
(
org
=
"edX"
,
course
=
"demoX"
,
run
=
"now"
),
CourseLocator
(
org
=
"Sandbox"
,
course
=
"Sandbox"
,
run
=
"Sandbox"
),
CourseLocator
(
org
=
"Test"
,
course
=
"Testy"
,
run
=
"Testify"
),
]
for
index
,
course
in
enumerate
(
course_list
):
course
.
location
.
course_key
=
locator_list
[
index
]
self
.
command
.
get_all_courses
.
return_value
=
course_list
self
.
command
.
handle
(
"test_dir"
,
all
=
True
,
cohorted_only
=
True
,
dummy
=
'test'
)
calls
=
patched_get_course
.
call_args_list
self
.
assertEqual
(
len
(
calls
),
3
)
self
.
assertEqual
(
calls
[
0
][
0
][
0
],
locator_list
[
0
])
self
.
assertEqual
(
calls
[
1
][
0
][
0
],
locator_list
[
1
])
self
.
assertEqual
(
calls
[
2
][
0
][
0
],
locator_list
[
2
])
@ddt.data
(
"edX/demoX/now"
,
"otherX/CourseX/later"
)
@ddt.data
(
"edX/demoX/now"
,
"otherX/CourseX/later"
)
def
test_handle_writes_to_correct_location_when_output_file_not_specified
(
self
,
course_key
,
patched_get_course
):
def
test_handle_writes_to_correct_location_when_output_file_not_specified
(
self
,
course_key
,
patched_get_course
):
""" Tests that when no explicit filename is given data is exported to default location """
""" Tests that when no explicit filename is given data is exported to default location """
...
...
requirements/edx/custom.txt
View file @
4dc96948
# Custom requirements to be customized by individual OpenEdX instances
# Custom requirements to be customized by individual OpenEdX instances
-e git+https://github.com/edx/xblock-utils.git@a0e77eeb4eb971ac57243fe1056dd8db6806f514#egg=xblock-utils
-e git+https://github.com/edx/xblock-utils.git@a0e77eeb4eb971ac57243fe1056dd8db6806f514#egg=xblock-utils
-e git+https://github.com/edx-solutions/xblock-mentoring.git@
82a4219b865d12db80ac57bda43fef9e30bec3f1
#egg=xblock-mentoring
-e git+https://github.com/edx-solutions/xblock-mentoring.git@
bd0b3f413ae7e8274985555adfd7de7af3eca84c
#egg=xblock-mentoring
-e git+https://github.com/edx-solutions/xblock-image-explorer.git@21b9bcc4f2c7917463ab18a596161ac6c58c9c4a#egg=xblock-image-explorer
-e git+https://github.com/edx-solutions/xblock-image-explorer.git@21b9bcc4f2c7917463ab18a596161ac6c58c9c4a#egg=xblock-image-explorer
-e git+https://github.com/edx-solutions/xblock-drag-and-drop.git@92ee2055a16899090a073e1df81e35d5293ad767#egg=xblock-drag-and-drop
-e git+https://github.com/edx-solutions/xblock-drag-and-drop.git@92ee2055a16899090a073e1df81e35d5293ad767#egg=xblock-drag-and-drop
-e git+https://github.com/edx-solutions/xblock-drag-and-drop-v2.git@5736ed8774b92c8b8396b5bd455f8a8fb80295fb#egg=xblock-drag-and-drop-v2
-e git+https://github.com/edx-solutions/xblock-drag-and-drop-v2.git@5736ed8774b92c8b8396b5bd455f8a8fb80295fb#egg=xblock-drag-and-drop-v2
-e git+https://github.com/edx-solutions/xblock-ooyala.git@ac49b30452aff0cc34cace6a34b788e100490f24#egg=xblock-ooyala
-e git+https://github.com/edx-solutions/xblock-ooyala.git@ac49b30452aff0cc34cace6a34b788e100490f24#egg=xblock-ooyala
-e git+https://github.com/edx-solutions/xblock-group-project.git@
dd8eaf16b3bc7b7be3fb392d588328dadef56c00
#egg=xblock-group-project
-e git+https://github.com/edx-solutions/xblock-group-project.git@
74477db1e478e6a055383f1ab1add3bd443a578f
#egg=xblock-group-project
-e git+https://github.com/edx-solutions/xblock-adventure.git@effa22006bb6528bc6d3788787466eb4e74e1161#egg=xblock-adventure
-e git+https://github.com/edx-solutions/xblock-adventure.git@effa22006bb6528bc6d3788787466eb4e74e1161#egg=xblock-adventure
-e git+https://github.com/mckinseyacademy/xblock-poll.git@ca0e6eb4ef10c128d573c3cec015dcfee7984730#egg=xblock-poll
-e git+https://github.com/mckinseyacademy/xblock-poll.git@ca0e6eb4ef10c128d573c3cec015dcfee7984730#egg=xblock-poll
-e git+https://github.com/OfficeDev/xblock-officemix/@86238f5968a08db005717dbddc346808f1ed3716#egg=xblock_officemix-master
-e git+https://github.com/OfficeDev/xblock-officemix/@86238f5968a08db005717dbddc346808f1ed3716#egg=xblock_officemix-master
-e git+https://github.com/edx/edx-notifications.git@4e3323da6775a101da5d8beab80c231278df69d2#egg=edx-notifications
-e git+https://github.com/edx/edx-notifications.git@4e3323da6775a101da5d8beab80c231278df69d2#egg=edx-notifications
-e git+https://github.com/open-craft/problem-builder.git@
42901b107b8b1482891027a97dda9ae29e66388
a#egg=problem-builder
-e git+https://github.com/open-craft/problem-builder.git@
f42c7c572c7c9e5155062f3f1874714abf63e92
a#egg=problem-builder
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