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
88690dab
Commit
88690dab
authored
Feb 14, 2014
by
zubiar-arbi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
resolve conflict on rebase
parent
d7b63da6
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
87 additions
and
5 deletions
+87
-5
cms/djangoapps/contentstore/views/course.py
+87
-5
No files found.
cms/djangoapps/contentstore/views/course.py
View file @
88690dab
...
...
@@ -7,6 +7,7 @@ import string # pylint: disable=W0402
import
re
import
bson
from
django.db.models
import
Q
from
django.utils.translation
import
ugettext
as
_
from
django.contrib.auth.decorators
import
login_required
from
django_future.csrf
import
ensure_csrf_cookie
...
...
@@ -50,7 +51,7 @@ from xmodule.html_module import AboutDescriptor
from
xmodule.modulestore.locator
import
BlockUsageLocator
from
course_creators.views
import
get_course_creator_status
,
add_user_with_status_unrequested
from
contentstore
import
utils
from
student.roles
import
CourseInstructorRole
,
CourseStaffRole
,
CourseCreatorRole
from
student.roles
import
CourseInstructorRole
,
CourseStaffRole
,
CourseCreatorRole
,
GlobalStaff
from
student
import
auth
from
microsite_configuration.middleware
import
MicrositeConfiguration
...
...
@@ -156,11 +157,9 @@ def _xmodule_json(xmodule, course_id):
return
result
@login_required
@ensure_csrf_cookie
def
course_listing
(
request
):
def
_accessible_courses_list
(
request
):
"""
List all courses available to the logged in user
List all courses available to the logged in user
by iterating through all the courses
"""
courses
=
modulestore
(
'direct'
)
.
get_courses
()
...
...
@@ -177,6 +176,89 @@ def course_listing(request):
and
course
.
location
.
course
!=
''
and
course
.
location
.
name
!=
''
)
courses
=
filter
(
course_filter
,
courses
)
return
courses
def
_accessible_courses_list_from_groups
(
request
):
"""
List all courses available to the logged in user by reversing access group names
"""
courses_list
=
[]
course_id_list
=
[]
user_staff_group_names
=
request
.
user
.
groups
.
filter
(
Q
(
name__startswith
=
'instructor_'
)
|
Q
(
name__startswith
=
'staff_'
))
.
values_list
(
'name'
,
flat
=
True
)
# first try to get new and unique group names (course_id's) before querying database
for
user_staff_group_name
in
user_staff_group_names
:
# to avoid duplication try to convert all course_id's to new format e.g. "edX.course.run"
course_id
=
re
.
sub
(
r'^(instructor_|staff_)'
,
''
,
user_staff_group_name
)
.
replace
(
'/'
,
'.'
)
if
len
(
course_id
.
split
(
'.'
))
==
3
:
if
course_id
not
in
course_id_list
:
course_id_list
.
append
(
course_id
)
else
:
# old group format: course number only e.g. "course"
# not preferable (so return)
#
# Note: We can try to get course with only course number if there is exactly
# one course with this course number
return
(
False
,
courses_list
)
for
course_id
in
course_id_list
:
# new group format: id of course e.g. "edX.course.run"
org
,
course
,
name
=
course_id
.
split
(
'.'
)
course_location
=
Location
(
'i4x'
,
org
,
course
,
'course'
,
name
)
try
:
course
=
modulestore
(
'direct'
)
.
get_item
(
course_location
)
courses_list
.
append
(
course
)
except
ItemNotFoundError
:
course
=
None
if
not
course
:
# since access groups are being stored in lowercase, also do a case-insensitive search
# for the potential course id.
course_search_location
=
bson
.
son
.
SON
({
'_id.tag'
:
'i4x'
,
# pylint: disable=no-member
'_id.org'
:
re
.
compile
(
u'^{}$'
.
format
(
course_location
.
org
),
re
.
IGNORECASE
|
re
.
UNICODE
),
# pylint: disable=no-member
'_id.course'
:
re
.
compile
(
u'^{}$'
.
format
(
course_location
.
course
),
re
.
IGNORECASE
|
re
.
UNICODE
),
'_id.category'
:
'course'
,
# pylint: disable=no-member
'_id.name'
:
re
.
compile
(
u'^{}$'
.
format
(
course_location
.
name
),
re
.
IGNORECASE
|
re
.
UNICODE
)
})
courses
=
modulestore
()
.
collection
.
find
(
course_search_location
,
fields
=
(
'_id'
))
if
courses
.
count
()
==
1
:
course_id
=
courses
[
0
]
.
get
(
'_id'
)
course_location
=
Location
(
'i4x'
,
course_id
.
get
(
'org'
),
course_id
.
get
(
'course'
),
'course'
,
course_id
.
get
(
'name'
))
try
:
course
=
modulestore
(
'direct'
)
.
get_item
(
course_location
)
courses_list
.
append
(
course
)
except
ItemNotFoundError
:
return
(
False
,
courses_list
)
else
:
return
(
False
,
courses_list
)
return
(
True
,
courses_list
)
@login_required
@ensure_csrf_cookie
def
course_listing
(
request
):
"""
List all courses available to the logged in user
Try to get all courses by first reversing django groups and fallback to old method if it fails
Note: overhead of pymongo reads will increase if getting courses from django groups fails
"""
if
GlobalStaff
()
.
has_user
(
request
.
user
):
# user has global access so no need to get courses from django groups
courses
=
_accessible_courses_list
(
request
)
else
:
success
,
courses_from_groups
=
_accessible_courses_list_from_groups
(
request
)
if
success
:
courses
=
courses_from_groups
else
:
# user have some old groups or there was some error getting courses from django groups
# so fallback to iterating through all courses
courses
=
_accessible_courses_list
(
request
)
def
format_course_for_view
(
course
):
"""
...
...
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