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
f488aa05
Commit
f488aa05
authored
Jul 10, 2013
by
Miles Steele
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rewrite test_access, add stricter argument to access
parent
cc9371d1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
127 additions
and
125 deletions
+127
-125
lms/djangoapps/instructor/access.py
+9
-5
lms/djangoapps/instructor/tests/test_access.py
+118
-120
No files found.
lms/djangoapps/instructor/access.py
View file @
f488aa05
...
@@ -23,7 +23,7 @@ def list_with_level(course, level):
...
@@ -23,7 +23,7 @@ def list_with_level(course, level):
There could be other levels specific to the course.
There could be other levels specific to the course.
If there is no Group for that course-level, returns an empty list
If there is no Group for that course-level, returns an empty list
"""
"""
if
level
i
n
[
'beta'
]
:
if
level
i
s
'beta'
:
grpname
=
course_beta_test_group_name
(
course
.
location
)
grpname
=
course_beta_test_group_name
(
course
.
location
)
else
:
else
:
grpname
=
get_access_group_name
(
course
,
level
)
grpname
=
get_access_group_name
(
course
,
level
)
...
@@ -60,10 +60,12 @@ def _change_access(course, user, level, mode):
...
@@ -60,10 +60,12 @@ def _change_access(course, user, level, mode):
mode is one of ['allow', 'revoke']
mode is one of ['allow', 'revoke']
"""
"""
if
level
i
n
[
'beta'
]
:
if
level
i
s
'beta'
:
grpname
=
course_beta_test_group_name
(
course
.
location
)
grpname
=
course_beta_test_group_name
(
course
.
location
)
el
se
:
el
if
level
in
[
'instructor'
,
'staff'
]
:
grpname
=
get_access_group_name
(
course
,
level
)
grpname
=
get_access_group_name
(
course
,
level
)
else
:
raise
ValueError
(
"unrecognized level '{}'"
.
format
(
level
))
group
,
_
=
Group
.
objects
.
get_or_create
(
name
=
grpname
)
group
,
_
=
Group
.
objects
.
get_or_create
(
name
=
grpname
)
if
mode
==
'allow'
:
if
mode
==
'allow'
:
...
@@ -78,9 +80,11 @@ def update_forum_role_membership(course_id, user, rolename, mode):
...
@@ -78,9 +80,11 @@ def update_forum_role_membership(course_id, user, rolename, mode):
"""
"""
Change forum access of user.
Change forum access of user.
rolename is one of [FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_MODERATOR, FORUM_ROLE_COMMUNITY_TA]
`rolename` is one of [FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_MODERATOR, FORUM_ROLE_COMMUNITY_TA]
`mode` is one of ['allow', 'revoke']
mode is one of ['allow', 'revoke']
if `mode` is bad, raises ValueError
if `rolename` does not exist, raises Role.DoesNotExist
"""
"""
role
=
Role
.
objects
.
get
(
course_id
=
course_id
,
name
=
rolename
)
role
=
Role
.
objects
.
get
(
course_id
=
course_id
,
name
=
rolename
)
...
...
lms/djangoapps/instructor/tests/test_access.py
View file @
f488aa05
...
@@ -11,183 +11,181 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
...
@@ -11,183 +11,181 @@ from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from
django.test.utils
import
override_settings
from
django.test.utils
import
override_settings
from
courseware.tests.modulestore_config
import
TEST_DATA_MONGO_MODULESTORE
from
courseware.tests.modulestore_config
import
TEST_DATA_MONGO_MODULESTORE
from
courseware.access
import
get_access_group_name
from
courseware.access
import
(
get_access_group_name
,
course_beta_test_group_name
)
from
django_comment_common.models
import
(
Role
,
from
django_comment_common.models
import
(
Role
,
# FORUM_ROLE_ADMINISTRATOR,
FORUM_ROLE_MODERATOR
)
FORUM_ROLE_MODERATOR
,
from
instructor.access
import
(
allow_access
,
FORUM_ROLE_COMMUNITY_TA
)
revoke_access
,
from
instructor.access
import
allow_access
,
revoke_access
,
list_with_level
,
update_forum_role_membership
list_with_level
,
update_forum_role_membership
)
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
class
TestInstructorAccessControlDB
(
ModuleStoreTestCase
):
class
TestInstructorAccessList
(
ModuleStoreTestCase
):
""" Test instructor access administration against database effects """
""" Test access listings. """
def
setUp
(
self
):
def
setUp
(
self
):
self
.
course
=
CourseFactory
.
create
()
self
.
course
=
CourseFactory
.
create
()
def
test_allow
(
self
):
self
.
instructors
=
[
UserFactory
.
create
()
for
_
in
xrange
(
4
)]
user
=
UserFactory
()
for
user
in
self
.
instructors
:
level
=
'staff'
allow_access
(
self
.
course
,
user
,
'instructor'
)
self
.
beta_testers
=
[
UserFactory
.
create
()
for
_
in
xrange
(
4
)]
for
user
in
self
.
beta_testers
:
allow_access
(
self
.
course
,
user
,
'beta'
)
allow_access
(
self
.
course
,
user
,
level
)
def
test_list_instructors
(
self
):
instructors
=
list_with_level
(
self
.
course
,
'instructor'
)
self
.
assertEqual
(
set
(
instructors
),
set
(
self
.
instructors
))
self
.
assertIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
def
test_list_beta
(
self
):
beta_testers
=
list_with_level
(
self
.
course
,
'beta'
)
self
.
assertEqual
(
set
(
beta_testers
),
set
(
self
.
beta_testers
))
def
test_allow_twice
(
self
):
user
=
UserFactory
()
level
=
'staff'
allow_access
(
self
.
course
,
user
,
level
)
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
self
.
assertIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
class
TestInstructorAccessAllow
(
ModuleStoreTestCase
):
allow_access
(
self
.
course
,
user
,
level
)
""" Test access allow. """
self
.
assertIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
def
setUp
(
self
):
self
.
course
=
CourseFactory
.
create
()
def
test_allow_revoke
(
self
):
def
test_allow
(
self
):
user
=
UserFactory
()
level
=
'staff'
allow_access
(
self
.
course
,
user
,
level
)
self
.
assertIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
revoke_access
(
self
.
course
,
user
,
level
)
self
.
assertNotIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
allow_access
(
self
.
course
,
user
,
level
)
self
.
assertIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
revoke_access
(
self
.
course
,
user
,
level
)
self
.
assertNotIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
def
test_revoke_without_group
(
self
):
user
=
UserFactory
()
user
=
UserFactory
()
level
=
'staff'
allow_access
(
self
.
course
,
user
,
'staff'
)
group
=
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
)
)
self
.
assertIn
(
user
,
group
.
user_set
.
all
())
revoke_access
(
self
.
course
,
user
,
level
)
def
test_allow_twice
(
self
):
self
.
assertNotIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
user
=
UserFactory
()
allow_access
(
self
.
course
,
user
,
'staff'
)
allow_access
(
self
.
course
,
user
,
'staff'
)
group
=
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
)
)
self
.
assertIn
(
user
,
group
.
user_set
.
all
())
def
test_allow_beta
(
self
):
""" Test allow beta against list beta. """
user
=
UserFactory
()
allow_access
(
self
.
course
,
user
,
'beta'
)
self
.
assertIn
(
user
,
list_with_level
(
self
.
course
,
'beta'
))
def
test_revoke_with_group
(
self
):
@raises
(
ValueError
)
def
test_allow_badlevel
(
self
):
user
=
UserFactory
()
user
=
UserFactory
()
level
=
'staff'
allow_access
(
self
.
course
,
user
,
'robot-not-a-level'
)
group
=
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'robot-not-a-level'
))
Group
(
name
=
get_access_group_name
(
self
.
course
,
level
))
self
.
assertIn
(
user
,
group
.
user_set
.
all
())
revoke_access
(
self
.
course
,
user
,
level
)
self
.
assertNotIn
(
user
,
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
.
user_set
.
all
())
def
test_allow_disallow_multiuser
(
self
):
users
=
[
UserFactory
()
for
_
in
xrange
(
3
)]
levels
=
[
'staff'
,
'instructor'
,
'staff'
]
antilevels
=
[
'instructor'
,
'staff'
,
'instructor'
]
allow_access
(
self
.
course
,
users
[
0
],
levels
[
0
])
allow_access
(
self
.
course
,
users
[
1
],
levels
[
1
])
allow_access
(
self
.
course
,
users
[
2
],
levels
[
2
])
self
.
assertIn
(
users
[
0
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
0
]))
.
user_set
.
all
())
self
.
assertIn
(
users
[
1
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
1
]))
.
user_set
.
all
())
self
.
assertIn
(
users
[
2
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
2
]))
.
user_set
.
all
())
revoke_access
(
self
.
course
,
users
[
0
],
levels
[
0
])
revoke_access
(
self
.
course
,
users
[
0
],
antilevels
[
0
])
self
.
assertNotIn
(
users
[
0
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
0
]))
.
user_set
.
all
())
self
.
assertIn
(
users
[
1
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
1
]))
.
user_set
.
all
())
self
.
assertIn
(
users
[
2
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
2
]))
.
user_set
.
all
())
revoke_access
(
self
.
course
,
users
[
1
],
levels
[
1
])
allow_access
(
self
.
course
,
users
[
0
],
antilevels
[
0
])
self
.
assertNotIn
(
users
[
0
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
0
]))
.
user_set
.
all
())
self
.
assertIn
(
users
[
0
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
antilevels
[
0
]))
.
user_set
.
all
())
self
.
assertNotIn
(
users
[
1
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
1
]))
.
user_set
.
all
())
self
.
assertIn
(
users
[
2
],
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
levels
[
2
]))
.
user_set
.
all
())
@raises
(
Exception
)
def
test_allow_noneuser
(
self
):
user
=
None
allow_access
(
self
.
course
,
user
,
'staff'
)
group
=
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
))
self
.
assertIn
(
user
,
group
.
user_set
.
all
())
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
class
TestInstructorAccessControlPrefilledDB
(
ModuleStoreTestCase
):
class
TestInstructorAccessRevoke
(
ModuleStoreTestCase
):
"""
""" Test access revoke. """
Test access with existing users.
"""
def
setUp
(
self
):
def
setUp
(
self
):
self
.
course
=
CourseFactory
.
create
()
self
.
course
=
CourseFactory
.
create
()
# setup instructors
self
.
staff
=
[
UserFactory
.
create
()
for
_
in
xrange
(
4
)]
self
.
instructors
=
set
([
UserFactory
.
create
(),
UserFactory
.
create
()])
for
user
in
self
.
staff
:
for
user
in
self
.
instructors
:
allow_access
(
self
.
course
,
user
,
'staff'
)
allow_access
(
self
.
course
,
user
,
'instructor'
)
self
.
beta_testers
=
[
UserFactory
.
create
()
for
_
in
xrange
(
4
)]
for
user
in
self
.
beta_testers
:
def
test_list_with_level
(
self
):
allow_access
(
self
.
course
,
user
,
'beta'
)
instructors
=
set
(
list_with_level
(
self
.
course
,
'instructor'
))
self
.
assertEqual
(
instructors
,
self
.
instructors
)
def
test_list_with_level_not_yet_group
(
self
):
instructors
=
set
(
list_with_level
(
self
.
course
,
'staff'
))
self
.
assertEqual
(
instructors
,
set
())
def
test_list_with_level_bad_group
(
self
):
self
.
assertEqual
(
set
(
list_with_level
(
self
.
course
,
'robot-definitely-not-a-group'
)),
set
())
def
test_list_with_level_beta
(
self
):
def
test_revoke
(
self
):
beta_testers_result
=
set
(
list_with_level
(
self
.
course
,
'beta'
))
user
=
self
.
staff
[
0
]
self
.
assertEqual
(
set
(),
beta_testers_result
)
revoke_access
(
self
.
course
,
user
,
'staff'
)
group
=
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
)
)
self
.
assertNotIn
(
user
,
group
.
user_set
.
all
())
def
test_revoke_twice
(
self
):
user
=
self
.
staff
[
0
]
revoke_access
(
self
.
course
,
user
,
'staff'
)
group
=
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'staff'
)
)
self
.
assertNotIn
(
user
,
group
.
user_set
.
all
())
def
test_revoke_beta
(
self
):
user
=
self
.
beta_testers
[
0
]
revoke_access
(
self
.
course
,
user
,
'beta'
)
self
.
assertNotIn
(
user
,
list_with_level
(
self
.
course
,
'beta'
))
beta_testers
=
set
([
UserFactory
.
create
(),
UserFactory
.
create
()])
@raises
(
ValueError
)
for
user
in
beta_testers
:
def
test_revoke_badrolename
(
self
):
allow_access
(
self
.
course
,
user
,
'beta'
)
user
=
UserFactory
()
beta_testers_result
=
set
(
list_with_level
(
self
.
course
,
'beta'
))
revoke_access
(
self
.
course
,
user
,
'robot-not-a-level'
)
self
.
assertEqual
(
beta_testers
,
beta_testers_result
)
group
=
Group
.
objects
.
get
(
name
=
get_access_group_name
(
self
.
course
,
'robot-not-a-level'
)
)
self
.
assertNotIn
(
user
,
group
.
user_set
.
all
())
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
class
TestInstructorAccessForum
DB
(
ModuleStoreTestCase
):
class
TestInstructorAccessForum
(
ModuleStoreTestCase
):
"""
"""
Test forum access control.
Test forum access control.
"""
"""
def
setUp
(
self
):
def
setUp
(
self
):
self
.
course
=
CourseFactory
.
create
()
self
.
course
=
CourseFactory
.
create
()
self
.
moderators
=
set
([
UserFactory
.
create
()
for
_
in
xrange
(
4
)])
self
.
mod_role
=
Role
.
objects
.
create
(
self
.
mod_role
=
Role
.
objects
.
create
(
course_id
=
self
.
course
.
id
,
name
=
FORUM_ROLE_MODERATOR
)
course_id
=
self
.
course
.
id
,
name
=
FORUM_ROLE_MODERATOR
)
self
.
moderators
=
[
UserFactory
.
create
()
for
_
in
xrange
(
4
)]
for
user
in
self
.
moderators
:
for
user
in
self
.
moderators
:
self
.
mod_role
.
users
.
add
(
user
)
self
.
mod_role
.
users
.
add
(
user
)
def
test_
update_forum_membership_allow_existing_role
(
self
):
def
test_
allow
(
self
):
user
=
UserFactory
.
create
()
user
=
UserFactory
.
create
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'allow'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'allow'
)
self
.
assertIn
(
user
,
self
.
mod_role
.
users
.
all
())
self
.
assertIn
(
user
,
self
.
mod_role
.
users
.
all
())
def
test_
update_forum_membership_allow_existing_role_allowed_user
(
self
):
def
test_
allow_twice
(
self
):
user
=
UserFactory
.
create
()
user
=
UserFactory
.
create
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'allow'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'allow'
)
self
.
assertIn
(
user
,
self
.
mod_role
.
users
.
all
())
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'allow'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'allow'
)
self
.
assertIn
(
user
,
self
.
mod_role
.
users
.
all
())
self
.
assertIn
(
user
,
self
.
mod_role
.
users
.
all
())
@raises
(
Role
.
DoesNotExist
)
@raises
(
Role
.
DoesNotExist
)
def
test_
update_forum_membership_allow_not_existing_
role
(
self
):
def
test_
allow_bad
role
(
self
):
user
=
UserFactory
.
create
()
user
=
UserFactory
.
create
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_COMMUNITY_TA
,
'allow'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
'robot-not-a-real-role'
,
'allow'
)
def
test_
update_forum_membership_revoke_existing_rol
e
(
self
):
def
test_
revok
e
(
self
):
user
=
iter
(
self
.
moderators
)
.
next
()
user
=
self
.
moderators
[
0
]
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
def
test_
update_forum_membership_existing_role_revoked_user
(
self
):
def
test_
revoke_twice
(
self
):
user
=
iter
(
self
.
moderators
)
.
next
()
user
=
self
.
moderators
[
0
]
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
@raises
(
Role
.
DoesNotExist
)
def
test_revoke_notallowed
(
self
):
def
test_update_forum_membership_revoke_not_existing_role
(
self
):
user
=
UserFactory
()
user
=
iter
(
self
.
moderators
)
.
next
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_COMMUNITY_TA
,
'revoke'
)
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
@raises
(
Role
.
DoesNotExist
)
def
test_update_forum_membership_bad_role_allow
(
self
):
user
=
UserFactory
.
create
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
'robot-definitely-not-a-forum-role'
,
'allow'
)
@raises
(
Role
.
DoesNotExist
)
@raises
(
Role
.
DoesNotExist
)
def
test_
update_forum_membership_bad_role_revok
e
(
self
):
def
test_
revoke_badrol
e
(
self
):
user
=
UserFactory
.
create
()
user
=
self
.
moderators
[
0
]
update_forum_role_membership
(
self
.
course
.
id
,
user
,
'robot-
definitely-not-a-forum-role'
,
'revoke
'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
'robot-
not-a-real-role'
,
'allow
'
)
@raises
(
ValueError
)
@raises
(
ValueError
)
def
test_
update_forum_membership_
bad_mode
(
self
):
def
test_bad_mode
(
self
):
user
=
iter
(
self
.
moderators
)
.
next
()
user
=
UserFactory
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'robot-not-a-mode'
)
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'robot-not-a-mode'
)
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