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
f25b414d
Commit
f25b414d
authored
Jul 01, 2013
by
Miles Steele
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix pep8 violations, fix pylint violations
parent
a727959d
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
131 additions
and
105 deletions
+131
-105
lms/djangoapps/analytics/basic.py
+36
-29
lms/djangoapps/analytics/csvs.py
+13
-6
lms/djangoapps/analytics/distributions.py
+0
-1
lms/djangoapps/analytics/tests/test_basic.py
+5
-3
lms/djangoapps/analytics/tests/test_csvs.py
+2
-1
lms/djangoapps/analytics/tests/test_distributions.py
+2
-2
lms/djangoapps/instructor/access.py
+7
-6
lms/djangoapps/instructor/enrollment.py
+9
-9
lms/djangoapps/instructor/tests/test_access.py
+30
-19
lms/djangoapps/instructor/tests/test_enrollment.py
+14
-14
lms/djangoapps/instructor/views/api.py
+0
-0
lms/djangoapps/instructor/views/instructor_dashboard.py
+13
-15
No files found.
lms/djangoapps/analytics/basic.py
View file @
f25b414d
...
...
@@ -9,7 +9,8 @@ import xmodule.graders as xmgraders
STUDENT_FEATURES
=
(
'username'
,
'first_name'
,
'last_name'
,
'is_staff'
,
'email'
)
PROFILE_FEATURES
=
(
'name'
,
'language'
,
'location'
,
'year_of_birth'
,
'gender'
,
'level_of_education'
,
'mailing_address'
,
'goals'
)
PROFILE_FEATURES
=
(
'name'
,
'language'
,
'location'
,
'year_of_birth'
,
'gender'
,
'level_of_education'
,
'mailing_address'
,
'goals'
)
AVAILABLE_FEATURES
=
STUDENT_FEATURES
+
PROFILE_FEATURES
...
...
@@ -19,17 +20,19 @@ def enrolled_students_profiles(course_id, features):
"""
# enrollments = CourseEnrollment.objects.filter(course_id=course_id)
# students = [enrollment.user for enrollment in enrollments]
students
=
User
.
objects
.
filter
(
courseenrollment__course_id
=
course_id
)
.
order_by
(
'username'
)
.
select_related
(
'profile'
)
print
len
(
students
)
print
students
students
=
User
.
objects
.
filter
(
courseenrollment__course_id
=
course_id
)
\
.
order_by
(
'username'
)
.
select_related
(
'profile'
)
def
extract_student
(
student
):
student_features
=
[
feature
for
feature
in
features
if
feature
in
STUDENT_FEATURES
]
profile_features
=
[
feature
for
feature
in
features
if
feature
in
PROFILE_FEATURES
]
""" convert student to dictionary """
student_features
=
[
x
for
x
in
STUDENT_FEATURES
if
x
in
features
]
profile_features
=
[
x
for
x
in
PROFILE_FEATURES
if
x
in
features
]
student_dict
=
dict
((
feature
,
getattr
(
student
,
feature
))
for
feature
in
student_features
)
student_dict
=
dict
((
feature
,
getattr
(
student
,
feature
))
for
feature
in
student_features
)
profile
=
student
.
profile
profile_dict
=
dict
((
feature
,
getattr
(
profile
,
feature
))
for
feature
in
profile_features
)
profile_dict
=
dict
((
feature
,
getattr
(
profile
,
feature
))
for
feature
in
profile_features
)
student_dict
.
update
(
profile_dict
)
return
student_dict
...
...
@@ -38,12 +41,14 @@ def enrolled_students_profiles(course_id, features):
def
dump_grading_context
(
course
):
"""
Render information about course grading context (eg which problems are graded in what assignments)
Render information about course grading context
(e.g. which problems are graded in what assignments)
Useful for debugging grading_policy.json and policy.json
Returns HTML string
"""
msg
=
"-----------------------------------------------------------------------------
\n
"
hbar
=
"{}
\n
"
.
format
(
"-"
*
77
)
msg
=
hbar
msg
+=
"Course grader:
\n
"
msg
+=
'
%
s
\n
'
%
course
.
grader
.
__class__
...
...
@@ -52,34 +57,36 @@ def dump_grading_context(course):
msg
+=
'
\n
'
msg
+=
"Graded sections:
\n
"
for
subgrader
,
category
,
weight
in
course
.
grader
.
sections
:
msg
+=
" subgrader=
%
s, type=
%
s, category=
%
s, weight=
%
s
\n
"
%
(
subgrader
.
__class__
,
subgrader
.
type
,
category
,
weight
)
msg
+=
" subgrader=
%
s, type=
%
s, category=
%
s, weight=
%
s
\n
"
\
%
(
subgrader
.
__class__
,
subgrader
.
type
,
category
,
weight
)
subgrader
.
index
=
1
graders
[
subgrader
.
type
]
=
subgrader
msg
+=
"-----------------------------------------------------------------------------
\n
"
msg
+=
hbar
msg
+=
"Listing grading context for course
%
s
\n
"
%
course
.
id
gc
=
course
.
grading_context
gc
ontext
=
course
.
grading_context
msg
+=
"graded sections:
\n
"
msg
+=
'
%
s
\n
'
%
gc
[
'graded_sections'
]
.
keys
()
for
(
gs
,
gsvals
)
in
gc
[
'graded_sections'
]
.
items
():
msg
+=
"--> Section
%
s:
\n
"
%
(
gs
)
msg
+=
'
%
s
\n
'
%
gc
ontext
[
'graded_sections'
]
.
keys
()
for
(
gs
omething
,
gsvals
)
in
gcontext
[
'graded_sections'
]
.
items
():
msg
+=
"--> Section
%
s:
\n
"
%
(
gs
omething
)
for
sec
in
gsvals
:
s
=
sec
[
'section_descriptor'
]
f
ormat
=
getattr
(
s
.
lms
,
'format'
,
None
)
s
desc
=
sec
[
'section_descriptor'
]
f
rmat
=
getattr
(
sdesc
.
lms
,
'format'
,
None
)
aname
=
''
if
f
o
rmat
in
graders
:
g
=
graders
[
fo
rmat
]
aname
=
'
%
s
%02
d'
%
(
g
.
short_label
,
g
.
index
)
g
.
index
+=
1
elif
s
.
display_name
in
graders
:
g
=
graders
[
s
.
display_name
]
aname
=
'
%
s'
%
g
.
short_label
if
frmat
in
graders
:
g
form
=
graders
[
f
rmat
]
aname
=
'
%
s
%02
d'
%
(
g
form
.
short_label
,
gform
.
index
)
g
form
.
index
+=
1
elif
s
desc
.
display_name
in
graders
:
g
form
=
graders
[
sdesc
.
display_name
]
aname
=
'
%
s'
%
g
form
.
short_label
notes
=
''
if
getattr
(
s
,
'score_by_attempt'
,
False
):
if
getattr
(
s
desc
,
'score_by_attempt'
,
False
):
notes
=
', score by attempt!'
msg
+=
"
%
s (format=
%
s, Assignment=
%
s
%
s)
\n
"
%
(
s
.
display_name
,
format
,
aname
,
notes
)
msg
+=
"
%
s (format=
%
s, Assignment=
%
s
%
s)
\n
"
\
%
(
sdesc
.
display_name
,
frmat
,
aname
,
notes
)
msg
+=
"all descriptors:
\n
"
msg
+=
"length=
%
d
\n
"
%
len
(
gc
[
'all_descriptors'
])
msg
=
'<pre>
%
s</pre>'
%
msg
.
replace
(
'<'
,
'<'
)
msg
+=
"length=
%
d
\n
"
%
len
(
gc
ontext
[
'all_descriptors'
])
msg
=
'<pre>
%
s</pre>'
%
msg
.
replace
(
'<'
,
'<'
)
return
msg
lms/djangoapps/analytics/csvs.py
View file @
f25b414d
...
...
@@ -16,8 +16,14 @@ def create_csv_response(filename, header, datarows):
datarows e.g. [['Jim', 'jim@edy.org'], ['Jake', 'jake@edy.org'], ...]
"""
response
=
HttpResponse
(
mimetype
=
'text/csv'
)
response
[
'Content-Disposition'
]
=
'attachment; filename={0}'
.
format
(
filename
)
csvwriter
=
csv
.
writer
(
response
,
dialect
=
'excel'
,
quotechar
=
'"'
,
quoting
=
csv
.
QUOTE_ALL
)
response
[
'Content-Disposition'
]
=
'attachment; filename={0}'
\
.
format
(
filename
)
csvwriter
=
csv
.
writer
(
response
,
dialect
=
'excel'
,
quotechar
=
'"'
,
quoting
=
csv
.
QUOTE_ALL
)
csvwriter
.
writerow
(
header
)
for
datarow
in
datarows
:
encoded_row
=
[
unicode
(
s
)
.
encode
(
'utf-8'
)
for
s
in
datarow
]
...
...
@@ -56,14 +62,15 @@ def format_dictlist(dictlist):
else
:
header
=
[]
def
dict_to_entry
(
d
):
ordered
=
sorted
(
d
.
items
(),
key
=
lambda
(
k
,
v
):
header
.
index
(
k
))
vals
=
map
(
lambda
(
k
,
v
):
v
,
ordered
)
def
dict_to_entry
(
dct
):
""" Convert dictionary to list for a csv row """
ordered
=
sorted
(
dct
.
items
(),
key
=
lambda
(
k
,
v
):
header
.
index
(
k
))
vals
=
[
v
for
(
_
,
v
)
in
ordered
]
return
vals
datarows
=
map
(
dict_to_entry
,
dictlist
)
return
{
'header'
:
header
,
'header'
:
header
,
'datarows'
:
datarows
,
}
lms/djangoapps/analytics/distributions.py
View file @
f25b414d
...
...
@@ -3,7 +3,6 @@ Profile Distributions
"""
from
django.db.models
import
Count
from
django.contrib.auth.models
import
User
,
Group
from
student.models
import
CourseEnrollment
,
UserProfile
AVAILABLE_PROFILE_FEATURES
=
[
'gender'
,
'level_of_education'
,
'year_of_birth'
]
...
...
lms/djangoapps/analytics/tests/test_basic.py
View file @
f25b414d
"""
Tests for instructor.basic
"""
from
django.test
import
TestCase
from
django.contrib.auth.models
import
User
,
Group
from
student.models
import
CourseEnrollment
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
student.tests.factories
import
UserFactory
from
analytics.basic
import
enrolled_students_profiles
,
AVAILABLE_FEATURES
,
STUDENT_FEATURES
,
PROFILE_FEATURES
class
TestAnalyticsBasic
(
TestCase
):
'''Test basic analytics functions.'''
""" Test basic analytics functions. """
def
setUp
(
self
):
self
.
course_id
=
'some/robot/course/id'
...
...
lms/djangoapps/analytics/tests/test_csvs.py
View file @
f25b414d
""" Tests for analytics.csvs """
from
django.test
import
TestCase
from
analytics.csvs
import
create_csv_response
,
format_dictlist
...
...
@@ -57,7 +59,6 @@ class TestAnalyticsCSVS(TestCase):
self
.
assertEqual
(
format_dictlist
(
data_in
),
data_out
)
def
test_format_dictlist_empty
(
self
):
self
.
assertEqual
(
format_dictlist
([]),
{
'header'
:
[],
...
...
lms/djangoapps/analytics/tests/test_distributions.py
View file @
f25b414d
""" Tests for analytics.distributions """
from
django.test
import
TestCase
from
nose.tools
import
raises
from
django.contrib.auth.models
import
User
,
Group
from
student.models
import
CourseEnrollment
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
student.tests.factories
import
UserFactory
from
analytics.distributions
import
profile_distribution
,
AVAILABLE_PROFILE_FEATURES
...
...
lms/djangoapps/instructor/access.py
View file @
f25b414d
...
...
@@ -9,12 +9,13 @@ TODO sync instructor and staff flags
{instructor: true, staff: true}
"""
from
django.contrib.auth.models
import
User
,
Group
from
courseware.access
import
get_access_group_name
,
course_beta_test_group_name
from
django_comment_common.models
import
(
Role
,
FORUM_ROLE_ADMINISTRATOR
,
FORUM_ROLE_MODERATOR
,
FORUM_ROLE_COMMUNITY_TA
)
from
django.contrib.auth.models
import
Group
from
courseware.access
import
(
get_access_group_name
,
course_beta_test_group_name
)
from
django_comment_common.models
import
Role
# FORUM_ROLE_ADMINISTRATOR,
# FORUM_ROLE_MODERATOR,
# FORUM_ROLE_COMMUNITY_TA)
def
list_with_level
(
course
,
level
):
...
...
lms/djangoapps/instructor/enrollment.py
View file @
f25b414d
...
...
@@ -28,10 +28,10 @@ def enroll_emails(course_id, student_emails, auto_enroll=False):
auto_string
=
{
False
:
'allowed'
,
True
:
'willautoenroll'
}[
auto_enroll
]
status_map
=
{
'user/ce/alreadyenrolled'
:
[],
'user/!ce/enrolled'
:
[],
'user/!ce/rejected'
:
[],
'!user/cea/'
+
auto_string
:
[],
'user/ce/alreadyenrolled'
:
[],
'user/!ce/enrolled'
:
[],
'user/!ce/rejected'
:
[],
'!user/cea/'
+
auto_string
:
[],
'!user/!cea/'
+
auto_string
:
[],
}
...
...
@@ -48,11 +48,11 @@ def enroll_emails(course_id, student_emails, auto_enroll=False):
except
CourseEnrollment
.
DoesNotExist
:
# status: user/!ce/enrolled
try
:
ce
=
CourseEnrollment
(
user
=
user
,
course_id
=
course_id
)
ce
.
save
()
ce
nr
=
CourseEnrollment
(
user
=
user
,
course_id
=
course_id
)
ce
nr
.
save
()
status_map
[
'user/!ce/enrolled'
]
.
append
(
student_email
)
# status: user/!ce/rejected
except
:
except
Exception
:
status_map
[
'user/!ce/rejected'
]
.
append
(
student_email
)
# status: !user
except
User
.
DoesNotExist
:
...
...
@@ -106,9 +106,9 @@ def unenroll_emails(course_id, student_emails):
# delete CourseEnrollment
try
:
ce
=
CourseEnrollment
.
objects
.
get
(
course_id
=
course_id
,
user__email
=
student_email
)
ce
nr
=
CourseEnrollment
.
objects
.
get
(
course_id
=
course_id
,
user__email
=
student_email
)
try
:
ce
.
delete
()
ce
nr
.
delete
()
status_map
[
'ce/unenrolled'
]
.
append
(
student_email
)
except
Exception
:
status_map
[
'ce/rejected'
]
.
append
(
student_email
)
...
...
lms/djangoapps/instructor/tests/test_access.py
View file @
f25b414d
from
django.test
import
TestCase
"""
Test instructor.access
"""
from
nose.tools
import
raises
from
django.contrib.auth.models
import
User
,
Group
from
django.contrib.auth.models
import
Group
from
student.tests.factories
import
UserFactory
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
...
...
@@ -9,10 +12,9 @@ from django.test.utils import override_settings
from
django.conf
import
settings
from
uuid
import
uuid4
from
student.models
import
CourseEnrollment
,
CourseEnrollmentAllowed
from
courseware.access
import
get_access_group_name
from
django_comment_common.models
import
(
Role
,
FORUM_ROLE_ADMINISTRATOR
,
#
FORUM_ROLE_ADMINISTRATOR,
FORUM_ROLE_MODERATOR
,
FORUM_ROLE_COMMUNITY_TA
)
from
instructor.access
import
allow_access
,
revoke_access
,
list_with_level
,
update_forum_role_membership
...
...
@@ -24,11 +26,11 @@ from instructor.access import allow_access, revoke_access, list_with_level, upda
# moved here from old courseware/tests/tests.py
# when it disappeared this test broke.
def
mongo_store_config
(
data_dir
):
'''
"""
Defines default module store using MongoModuleStore
Use of this config requires mongo to be running
'''
"""
store
=
{
'default'
:
{
'ENGINE'
:
'xmodule.modulestore.mongo.MongoModuleStore'
,
...
...
@@ -52,7 +54,7 @@ TEST_DATA_MONGO_MODULESTORE = mongo_store_config(TEST_DATA_DIR)
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
class
TestInstructorAccessControlDB
(
ModuleStoreTestCase
):
'''Test instructor access administration against database effects'''
""" Test instructor access administration against database effects """
def
setUp
(
self
):
# self.course_id = 'jus:/a/fake/c::rse/id'
...
...
@@ -132,12 +134,16 @@ class TestInstructorAccessControlDB(ModuleStoreTestCase):
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
class
TestInstructorAccessControlPrefilledDB
(
ModuleStoreTestCase
):
"""
Test access with existing users.
"""
def
setUp
(
self
):
self
.
course
=
CourseFactory
.
create
()
# setup instructors
self
.
instructors
=
set
([
UserFactory
.
create
(),
UserFactory
.
create
()])
[
allow_access
(
self
.
course
,
user
,
'instructor'
)
for
user
in
self
.
instructors
]
for
user
in
self
.
instructors
:
allow_access
(
self
.
course
,
user
,
'instructor'
)
def
test_list_with_level
(
self
):
instructors
=
set
(
list_with_level
(
self
.
course
,
'instructor'
))
...
...
@@ -155,63 +161,68 @@ class TestInstructorAccessControlPrefilledDB(ModuleStoreTestCase):
self
.
assertEqual
(
set
(),
beta_testers_result
)
beta_testers
=
set
([
UserFactory
.
create
(),
UserFactory
.
create
()])
[
allow_access
(
self
.
course
,
user
,
'beta'
)
for
user
in
beta_testers
]
for
user
in
beta_testers
:
allow_access
(
self
.
course
,
user
,
'beta'
)
beta_testers_result
=
set
(
list_with_level
(
self
.
course
,
'beta'
))
self
.
assertEqual
(
beta_testers
,
beta_testers_result
)
@override_settings
(
MODULESTORE
=
TEST_DATA_MONGO_MODULESTORE
)
class
TestInstructorAccessForumDB
(
ModuleStoreTestCase
):
"""
Test forum access control.
"""
def
setUp
(
self
):
self
.
course
=
CourseFactory
.
create
()
self
.
moderators
=
set
([
UserFactory
.
create
()
for
_
in
xrange
(
4
)])
self
.
mod_role
=
Role
.
objects
.
create
(
course_id
=
self
.
course
.
id
,
name
=
FORUM_ROLE_MODERATOR
)
[
self
.
mod_role
.
users
.
add
(
user
)
for
user
in
self
.
moderators
]
for
user
in
self
.
moderators
:
self
.
mod_role
.
users
.
add
(
user
)
def
test_update_forum_
role_
membership_allow_existing_role
(
self
):
def
test_update_forum_membership_allow_existing_role
(
self
):
user
=
UserFactory
.
create
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'allow'
)
self
.
assertIn
(
user
,
self
.
mod_role
.
users
.
all
())
def
test_update_forum_
role_
membership_allow_existing_role_allowed_user
(
self
):
def
test_update_forum_membership_allow_existing_role_allowed_user
(
self
):
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
())
@raises
(
Role
.
DoesNotExist
)
def
test_update_forum_
role_
membership_allow_not_existing_role
(
self
):
def
test_update_forum_membership_allow_not_existing_role
(
self
):
user
=
UserFactory
.
create
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_COMMUNITY_TA
,
'allow'
)
def
test_update_forum_
role_
membership_revoke_existing_role
(
self
):
def
test_update_forum_membership_revoke_existing_role
(
self
):
user
=
iter
(
self
.
moderators
)
.
next
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'revoke'
)
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
def
test_update_forum_
role_membership_revoke
_existing_role_revoked_user
(
self
):
def
test_update_forum_
membership
_existing_role_revoked_user
(
self
):
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_MODERATOR
,
'revoke'
)
self
.
assertNotIn
(
user
,
self
.
mod_role
.
users
.
all
())
@raises
(
Role
.
DoesNotExist
)
def
test_update_forum_
role_
membership_revoke_not_existing_role
(
self
):
def
test_update_forum_membership_revoke_not_existing_role
(
self
):
user
=
iter
(
self
.
moderators
)
.
next
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_COMMUNITY_TA
,
'revoke'
)
@raises
(
Role
.
DoesNotExist
)
def
test_update_forum_
role_
membership_bad_role_allow
(
self
):
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
)
def
test_update_forum_
role_
membership_bad_role_revoke
(
self
):
def
test_update_forum_membership_bad_role_revoke
(
self
):
user
=
UserFactory
.
create
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
'robot-definitely-not-a-forum-role'
,
'revoke'
)
@raises
(
ValueError
)
def
test_update_forum_
role_
membership_bad_mode
(
self
):
def
test_update_forum_membership_bad_mode
(
self
):
user
=
iter
(
self
.
moderators
)
.
next
()
update_forum_role_membership
(
self
.
course
.
id
,
user
,
FORUM_ROLE_MODERATOR
,
'robot-not-a-mode'
)
lms/djangoapps/instructor/tests/test_enrollment.py
View file @
f25b414d
...
...
@@ -3,7 +3,7 @@ Unit tests for instructor.enrollment methods.
"""
import
json
from
django.contrib.auth.models
import
Group
,
User
from
django.contrib.auth.models
import
User
# from courseware.access import _course_staff_group_name
from
courseware.models
import
StudentModule
from
django.test
import
TestCase
...
...
@@ -25,13 +25,13 @@ class TestInstructorEnrollmentDB(TestCase):
strings
.
append
(
"Lorem@ipsum.dolor, sit@amet.consectetur
\n
adipiscing@elit.Aenean
\r
convallis@at.lacus
\r
, ut@lacinia.Sed"
)
lists
.
append
([
'Lorem@ipsum.dolor'
,
'sit@amet.consectetur'
,
'adipiscing@elit.Aenean'
,
'convallis@at.lacus'
,
'ut@lacinia.Sed'
])
for
(
s
,
l
)
in
zip
(
strings
,
lists
):
self
.
assertEqual
(
split_input_list
(
s
),
l
)
for
(
s
tng
,
lst
)
in
zip
(
strings
,
lists
):
self
.
assertEqual
(
split_input_list
(
s
tng
),
lst
)
def
test_enroll_emails_userexists_alreadyenrolled
(
self
):
user
=
UserFactory
()
ce
=
CourseEnrollment
(
course_id
=
self
.
course_id
,
user
=
user
)
ce
.
save
()
ce
nr
=
CourseEnrollment
(
course_id
=
self
.
course_id
,
user
=
user
)
ce
nr
.
save
()
self
.
assertEqual
(
CourseEnrollment
.
objects
.
filter
(
course_id
=
self
.
course_id
,
user__email
=
user
.
email
)
.
count
(),
1
)
...
...
@@ -49,7 +49,7 @@ class TestInstructorEnrollmentDB(TestCase):
self
.
assertEqual
(
CourseEnrollment
.
objects
.
filter
(
course_id
=
self
.
course_id
,
user__email
=
user
.
email
)
.
count
(),
1
)
def
test_enroll_emails_nouser_alreadyallowed
(
self
):
email_without_user
=
'
tes
t_enroll_emails_nouser_alreadyallowed@test.org'
email_without_user
=
'
robo
t_enroll_emails_nouser_alreadyallowed@test.org'
self
.
assertEqual
(
User
.
objects
.
filter
(
email
=
email_without_user
)
.
count
(),
0
)
self
.
assertEqual
(
CourseEnrollment
.
objects
.
filter
(
course_id
=
self
.
course_id
,
user__email
=
email_without_user
)
.
count
(),
0
)
...
...
@@ -65,7 +65,7 @@ class TestInstructorEnrollmentDB(TestCase):
self
.
assertEqual
(
CourseEnrollmentAllowed
.
objects
.
get
(
course_id
=
self
.
course_id
,
email
=
email_without_user
)
.
auto_enroll
,
False
)
def
test_enroll_emails_nouser_suceedallow
(
self
):
email_without_user
=
'
tes
t_enroll_emails_nouser_suceedallow@test.org'
email_without_user
=
'
robo
t_enroll_emails_nouser_suceedallow@test.org'
self
.
assertEqual
(
User
.
objects
.
filter
(
email
=
email_without_user
)
.
count
(),
0
)
self
.
assertEqual
(
CourseEnrollment
.
objects
.
filter
(
course_id
=
self
.
course_id
,
user__email
=
email_without_user
)
.
count
(),
0
)
...
...
@@ -81,9 +81,9 @@ class TestInstructorEnrollmentDB(TestCase):
user1
=
UserFactory
()
user2
=
UserFactory
()
user3
=
UserFactory
()
email_without_user1
=
'
tes
t_enroll_emails_nouser_suceedallow_1@test.org'
email_without_user2
=
'
tes
t_enroll_emails_nouser_suceedallow_2@test.org'
email_without_user3
=
'
tes
t_enroll_emails_nouser_suceedallow_3@test.org'
email_without_user1
=
'
robo
t_enroll_emails_nouser_suceedallow_1@test.org'
email_without_user2
=
'
robo
t_enroll_emails_nouser_suceedallow_2@test.org'
email_without_user3
=
'
robo
t_enroll_emails_nouser_suceedallow_3@test.org'
def
test_db
(
auto_enroll
):
for
user
in
[
user1
,
user2
,
user3
]:
...
...
@@ -101,7 +101,7 @@ class TestInstructorEnrollmentDB(TestCase):
test_db
(
False
)
def
test_unenroll_alreadyallowed
(
self
):
email_without_user
=
'
tes
t_unenroll_alreadyallowed@test.org'
email_without_user
=
'
robo
t_unenroll_alreadyallowed@test.org'
cea
=
CourseEnrollmentAllowed
(
course_id
=
self
.
course_id
,
email
=
email_without_user
,
auto_enroll
=
False
)
cea
.
save
()
...
...
@@ -113,8 +113,8 @@ class TestInstructorEnrollmentDB(TestCase):
def
test_unenroll_alreadyenrolled
(
self
):
user
=
UserFactory
()
ce
=
CourseEnrollment
(
course_id
=
self
.
course_id
,
user
=
user
)
ce
.
save
()
ce
nr
=
CourseEnrollment
(
course_id
=
self
.
course_id
,
user
=
user
)
ce
nr
.
save
()
unenroll_emails
(
self
.
course_id
,
[
user
.
email
])
...
...
@@ -130,7 +130,7 @@ class TestInstructorEnrollmentDB(TestCase):
self
.
assertEqual
(
CourseEnrollmentAllowed
.
objects
.
filter
(
course_id
=
self
.
course_id
,
email
=
user
.
email
)
.
count
(),
0
)
def
test_unenroll_nosuchuser
(
self
):
email_without_user
=
'
tes
t_unenroll_nosuchuser@test.org'
email_without_user
=
'
robo
t_unenroll_nosuchuser@test.org'
unenroll_emails
(
self
.
course_id
,
[
email_without_user
])
...
...
lms/djangoapps/instructor/views/api.py
View file @
f25b414d
This diff is collapsed.
Click to expand it.
lms/djangoapps/instructor/views/instructor_dashboard.py
View file @
f25b414d
...
...
@@ -4,12 +4,6 @@ Instructor Dashboard Views
TODO add tracking
"""
import
csv
import
json
import
logging
import
os
import
re
import
requests
from
django_future.csrf
import
ensure_csrf_cookie
from
django.views.decorators.cache
import
cache_control
from
mitxmako.shortcuts
import
render_to_response
...
...
@@ -17,12 +11,13 @@ from django.core.urlresolvers import reverse
from
django.utils.html
import
escape
from
django.http
import
Http404
from
django.conf
import
settings
from
courseware.access
import
has_access
,
get_access_group_name
,
course_beta_test_group_name
from
courseware.access
import
has_access
from
courseware.courses
import
get_course_by_id
from
django_comment_client.utils
import
has_forum_access
from
instructor.offline_gradecalc
import
student_grades
,
offline_grades_available
from
django_comment_common.models
import
Role
,
FORUM_ROLE_ADMINISTRATOR
,
FORUM_ROLE_MODERATOR
,
FORUM_ROLE_COMMUNITY_TA
from
django_comment_common.models
import
(
Role
,
FORUM_ROLE_ADMINISTRATOR
,
FORUM_ROLE_MODERATOR
,
FORUM_ROLE_COMMUNITY_TA
)
from
xmodule.modulestore.django
import
modulestore
from
student.models
import
CourseEnrollment
...
...
@@ -36,9 +31,12 @@ def instructor_dashboard_2(request, course_id):
access
=
{
'admin'
:
request
.
user
.
is_staff
,
'instructor'
:
has_access
(
request
.
user
,
course
,
'instructor'
),
# an instructor can manage staff lists
'staff'
:
has_access
(
request
.
user
,
course
,
'staff'
),
'forum_admin'
:
has_forum_access
(
request
.
user
,
course_id
,
FORUM_ROLE_ADMINISTRATOR
),
# an instructor can manage staff lists
'instructor'
:
has_access
(
request
.
user
,
course
,
'instructor'
),
'staff'
:
has_access
(
request
.
user
,
course
,
'staff'
),
'forum_admin'
:
has_forum_access
(
request
.
user
,
course_id
,
FORUM_ROLE_ADMINISTRATOR
),
}
if
not
access
[
'staff'
]:
...
...
@@ -107,7 +105,7 @@ def _section_membership(course_id, access):
'section_key'
:
'membership'
,
'section_display_name'
:
'Membership'
,
'access'
:
access
,
'enroll_button_url'
:
reverse
(
'students_update_enrollment_email'
,
kwargs
=
{
'course_id'
:
course_id
}),
'enroll_button_url'
:
reverse
(
'students_update_enrollment_email'
,
kwargs
=
{
'course_id'
:
course_id
}),
'unenroll_button_url'
:
reverse
(
'students_update_enrollment_email'
,
kwargs
=
{
'course_id'
:
course_id
}),
'list_course_role_members_url'
:
reverse
(
'list_course_role_members'
,
kwargs
=
{
'course_id'
:
course_id
}),
'access_allow_revoke_url'
:
reverse
(
'access_allow_revoke'
,
kwargs
=
{
'course_id'
:
course_id
}),
...
...
@@ -136,7 +134,7 @@ def _section_data_download(course_id):
section_data
=
{
'section_key'
:
'data_download'
,
'section_display_name'
:
'Data Download'
,
'grading_config_url'
:
reverse
(
'grading_config'
,
kwargs
=
{
'course_id'
:
course_id
}),
'grading_config_url'
:
reverse
(
'grading_config'
,
kwargs
=
{
'course_id'
:
course_id
}),
'enrolled_students_profiles_url'
:
reverse
(
'enrolled_students_profiles'
,
kwargs
=
{
'course_id'
:
course_id
}),
}
return
section_data
...
...
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