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
69fd063d
Commit
69fd063d
authored
Dec 09, 2014
by
Sarina Canelake
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #6014 from edx/sarina/legacy-dash-cleanup
Legacy dash cleanup
parents
46545935
a1c8f8c4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
12 additions
and
560 deletions
+12
-560
lms/djangoapps/instructor/tests/test_legacy_anon_csv.py
+0
-67
lms/djangoapps/instructor/tests/test_legacy_download_csv.py
+0
-72
lms/djangoapps/instructor/tests/test_legacy_email.py
+0
-144
lms/djangoapps/instructor/tests/test_legacy_forum_admin.py
+0
-144
lms/djangoapps/instructor/tests/test_legacy_reset.py
+0
-70
lms/djangoapps/instructor/tests/test_legacy_xss.py
+0
-3
lms/djangoapps/instructor/views/legacy.py
+0
-0
lms/static/sass/base/_base.scss
+5
-0
lms/static/sass/base/_extends.scss
+7
-0
lms/templates/course_groups/cohort_management.html
+0
-42
lms/templates/course_groups/debug.html
+0
-18
lms/templates/courseware/legacy_instructor_dashboard.html
+0
-0
No files found.
lms/djangoapps/instructor/tests/test_legacy_anon_csv.py
deleted
100644 → 0
View file @
46545935
"""
Unit tests for instructor dashboard
Based on (and depends on) unit tests for courseware.
Notes for running by hand:
./manage.py lms --settings test test lms/djangoapps/instructor
"""
from
django.test.utils
import
override_settings
# Need access to internal func to put users in the right group
from
django.contrib.auth.models
import
User
from
django.core.urlresolvers
import
reverse
from
courseware.tests.helpers
import
LoginEnrollmentTestCase
from
xmodule.modulestore.tests.django_utils
import
TEST_DATA_MOCK_MODULESTORE
import
instructor.views.legacy
from
student.roles
import
CourseStaffRole
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
mock
import
Mock
,
patch
@override_settings
(
MODULESTORE
=
TEST_DATA_MOCK_MODULESTORE
)
class
TestInstructorDashboardAnonCSV
(
ModuleStoreTestCase
,
LoginEnrollmentTestCase
):
'''
Check for download of csv
'''
# Note -- I copied this setUp from a similar test
def
setUp
(
self
):
# clear_existing_modulestores()
self
.
toy
=
CourseFactory
.
create
(
org
=
'edX'
,
course
=
'toy'
,
display_name
=
'2012_Fall'
)
# Create two accounts
self
.
student
=
'view@test.com'
self
.
instructor
=
'view2@test.com'
self
.
password
=
'foo'
self
.
create_account
(
'u1'
,
self
.
student
,
self
.
password
)
self
.
create_account
(
'u2'
,
self
.
instructor
,
self
.
password
)
self
.
activate_user
(
self
.
student
)
self
.
activate_user
(
self
.
instructor
)
CourseStaffRole
(
self
.
toy
.
id
)
.
add_users
(
User
.
objects
.
get
(
email
=
self
.
instructor
))
self
.
logout
()
self
.
login
(
self
.
instructor
,
self
.
password
)
self
.
enroll
(
self
.
toy
)
@patch.object
(
instructor
.
views
.
legacy
,
'anonymous_id_for_user'
,
Mock
(
return_value
=
'42'
))
@patch.object
(
instructor
.
views
.
legacy
,
'unique_id_for_user'
,
Mock
(
return_value
=
'41'
))
def
test_download_anon_csv
(
self
):
course
=
self
.
toy
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
response
=
self
.
client
.
post
(
url
,
{
'action'
:
'Download CSV of all student anonymized IDs'
})
self
.
assertEqual
(
response
[
'Content-Type'
],
'text/csv'
)
body
=
response
.
content
.
replace
(
'
\r
'
,
''
)
self
.
assertEqual
(
body
,
(
'"User ID","Anonymized User ID","Course Specific Anonymized User ID"'
'
\n
"2","41","42"
\n
'
)
)
lms/djangoapps/instructor/tests/test_legacy_download_csv.py
deleted
100644 → 0
View file @
46545935
"""
Unit tests for instructor dashboard
Based on (and depends on) unit tests for courseware.
Notes for running by hand:
./manage.py lms --settings test test lms/djangoapps/instructor
"""
from
django.test.utils
import
override_settings
# Need access to internal func to put users in the right group
from
django.contrib.auth.models
import
User
from
django.core.urlresolvers
import
reverse
from
courseware.tests.helpers
import
LoginEnrollmentTestCase
from
xmodule.modulestore.tests.django_utils
import
TEST_DATA_MOCK_MODULESTORE
from
student.roles
import
CourseStaffRole
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
xmodule.modulestore.tests.factories
import
CourseFactory
@override_settings
(
MODULESTORE
=
TEST_DATA_MOCK_MODULESTORE
)
class
TestInstructorDashboardGradeDownloadCSV
(
ModuleStoreTestCase
,
LoginEnrollmentTestCase
):
'''
Check for download of csv
'''
def
setUp
(
self
):
# clear_existing_modulestores()
self
.
toy
=
CourseFactory
.
create
(
org
=
'edX'
,
course
=
'toy'
,
display_name
=
'2012_Fall'
)
# Create two accounts
self
.
student
=
'view@test.com'
self
.
instructor
=
'view2@test.com'
self
.
password
=
'foo'
self
.
create_account
(
'u1'
,
self
.
student
,
self
.
password
)
self
.
create_account
(
'u2'
,
self
.
instructor
,
self
.
password
)
self
.
activate_user
(
self
.
student
)
self
.
activate_user
(
self
.
instructor
)
CourseStaffRole
(
self
.
toy
.
id
)
.
add_users
(
User
.
objects
.
get
(
email
=
self
.
instructor
))
self
.
logout
()
self
.
login
(
self
.
instructor
,
self
.
password
)
self
.
enroll
(
self
.
toy
)
def
test_download_grades_csv
(
self
):
course
=
self
.
toy
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
msg
=
"url = {0}
\n
"
.
format
(
url
)
response
=
self
.
client
.
post
(
url
,
{
'action'
:
'Download CSV of all student grades for this course'
})
msg
+=
"instructor dashboard download csv grades: response = '{0}'
\n
"
.
format
(
response
)
self
.
assertEqual
(
response
[
'Content-Type'
],
'text/csv'
,
msg
)
cdisp
=
response
[
'Content-Disposition'
]
msg
+=
"Content-Disposition = '
%
s'
\n
"
%
cdisp
self
.
assertEqual
(
cdisp
,
'attachment; filename=grades_{0}.csv'
.
format
(
course
.
id
.
to_deprecated_string
()),
msg
)
body
=
response
.
content
.
replace
(
'
\r
'
,
''
)
msg
+=
"body = '{0}'
\n
"
.
format
(
body
)
# All the not-actually-in-the-course hw and labs come from the
# default grading policy string in graders.py
expected_body
=
'''"ID","Username","Full Name","edX email","External email","HW 01","HW 02","HW 03","HW 04","HW 05","HW 06","HW 07","HW 08","HW 09","HW 10","HW 11","HW 12","HW Avg","Lab 01","Lab 02","Lab 03","Lab 04","Lab 05","Lab 06","Lab 07","Lab 08","Lab 09","Lab 10","Lab 11","Lab 12","Lab Avg","Midterm","Final"
"2","u2","username","view2@test.com","","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"
'''
self
.
assertEqual
(
body
,
expected_body
,
msg
)
lms/djangoapps/instructor/tests/test_legacy_email.py
deleted
100644 → 0
View file @
46545935
"""
Unit tests for email feature flag in legacy instructor dashboard.
Additionally tests that bulk email is always disabled for non-Mongo
backed courses, regardless of email feature flag, and that the
view is conditionally available when Course Auth is turned on.
"""
from
django.test.utils
import
override_settings
from
django.conf
import
settings
from
django.core.urlresolvers
import
reverse
from
mock
import
patch
from
xmodule.modulestore.tests.django_utils
import
TEST_DATA_MOCK_MODULESTORE
from
student.tests.factories
import
AdminFactory
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
xmodule.modulestore
import
ModuleStoreEnum
from
bulk_email.models
import
CourseAuthorization
@override_settings
(
MODULESTORE
=
TEST_DATA_MOCK_MODULESTORE
)
class
TestInstructorDashboardEmailView
(
ModuleStoreTestCase
):
"""
Check for email view displayed with flag
"""
def
setUp
(
self
):
self
.
course
=
CourseFactory
.
create
()
# Create instructor account
instructor
=
AdminFactory
.
create
()
self
.
client
.
login
(
username
=
instructor
.
username
,
password
=
"test"
)
# URL for instructor dash
self
.
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
self
.
course
.
id
.
to_deprecated_string
()})
# URL for email view
self
.
email_link
=
'<a href="#" onclick="goto(
\'
Email
\'
)" class="None">Email</a>'
def
tearDown
(
self
):
"""
Undo all patches.
"""
patch
.
stopall
()
@patch.dict
(
settings
.
FEATURES
,
{
'ENABLE_INSTRUCTOR_EMAIL'
:
True
,
'REQUIRE_COURSE_EMAIL_AUTH'
:
False
})
def
test_email_flag_true
(
self
):
# Assert that the URL for the email view is in the response
response
=
self
.
client
.
get
(
self
.
url
)
self
.
assertTrue
(
self
.
email_link
in
response
.
content
)
# Select the Email view of the instructor dash
session
=
self
.
client
.
session
session
[
u'idash_mode:{0}'
.
format
(
self
.
course
.
location
.
course_key
.
to_deprecated_string
())]
=
'Email'
session
.
save
()
response
=
self
.
client
.
get
(
self
.
url
)
# Ensure we've selected the view properly and that the send_to field is present.
selected_email_link
=
'<a href="#" onclick="goto(
\'
Email
\'
)" class="selectedmode">Email</a>'
self
.
assertTrue
(
selected_email_link
in
response
.
content
)
send_to_label
=
'<label for="id_to">Send to:</label>'
self
.
assertTrue
(
send_to_label
in
response
.
content
)
@patch.dict
(
settings
.
FEATURES
,
{
'ENABLE_INSTRUCTOR_EMAIL'
:
True
,
'REQUIRE_COURSE_EMAIL_AUTH'
:
True
})
def
test_email_flag_unauthorized
(
self
):
# Assert that the URL for the email view is not in the response
# email is enabled, but this course is not authorized to send email
response
=
self
.
client
.
get
(
self
.
url
)
self
.
assertFalse
(
self
.
email_link
in
response
.
content
)
@patch.dict
(
settings
.
FEATURES
,
{
'ENABLE_INSTRUCTOR_EMAIL'
:
True
,
'REQUIRE_COURSE_EMAIL_AUTH'
:
True
})
def
test_email_flag_authorized
(
self
):
# Assert that the URL for the email view is in the response
# email is enabled, and this course is authorized to send email
# Assert that instructor email is not enabled for this course
self
.
assertFalse
(
CourseAuthorization
.
instructor_email_enabled
(
self
.
course
.
id
))
response
=
self
.
client
.
get
(
self
.
url
)
self
.
assertFalse
(
self
.
email_link
in
response
.
content
)
# Authorize the course to use email
cauth
=
CourseAuthorization
(
course_id
=
self
.
course
.
id
,
email_enabled
=
True
)
cauth
.
save
()
# Assert that instructor email is enabled for this course
self
.
assertTrue
(
CourseAuthorization
.
instructor_email_enabled
(
self
.
course
.
id
))
response
=
self
.
client
.
get
(
self
.
url
)
self
.
assertTrue
(
self
.
email_link
in
response
.
content
)
@patch.dict
(
settings
.
FEATURES
,
{
'ENABLE_INSTRUCTOR_EMAIL'
:
False
})
def
test_email_flag_false
(
self
):
# Assert that the URL for the email view is not in the response
response
=
self
.
client
.
get
(
self
.
url
)
self
.
assertFalse
(
self
.
email_link
in
response
.
content
)
@patch.dict
(
settings
.
FEATURES
,
{
'ENABLE_INSTRUCTOR_EMAIL'
:
True
})
def
test_email_flag_true_xml_store
(
self
):
# If the enable email setting is enabled, but this is an XML backed course,
# the email view shouldn't be available on the instructor dashboard.
# The course factory uses a MongoModuleStore backing, so patch the
# `get_modulestore_type` method to pretend to be XML-backed.
# This is OK; we're simply testing that the `is_mongo_modulestore_type` flag
# in `instructor/views/legacy.py` is doing the correct thing.
with
patch
(
'xmodule.modulestore.mongo.base.MongoModuleStore.get_modulestore_type'
)
as
mock_modulestore
:
mock_modulestore
.
return_value
=
ModuleStoreEnum
.
Type
.
xml
# Assert that the URL for the email view is not in the response
response
=
self
.
client
.
get
(
self
.
url
)
self
.
assertFalse
(
self
.
email_link
in
response
.
content
)
@patch.dict
(
settings
.
FEATURES
,
{
'ENABLE_INSTRUCTOR_EMAIL'
:
True
})
def
test_send_mail_unauthorized
(
self
):
""" Test 'Send email' action returns an error if course is not authorized to send email. """
response
=
self
.
client
.
post
(
self
.
url
,
{
'action'
:
'Send email'
,
'to_option'
:
'all'
,
'subject'
:
"Welcome to the course!"
,
'message'
:
"Lets start with an introduction!"
}
)
self
.
assertContains
(
response
,
"Email is not enabled for this course."
)
@patch.dict
(
settings
.
FEATURES
,
{
'ENABLE_INSTRUCTOR_EMAIL'
:
True
})
def
test_send_mail_authorized
(
self
):
""" Test 'Send email' action when course is authorized to send email. """
course_authorization
=
CourseAuthorization
(
course_id
=
self
.
course
.
id
,
email_enabled
=
True
)
course_authorization
.
save
()
session
=
self
.
client
.
session
session
[
u'idash_mode:{0}'
.
format
(
self
.
course
.
location
.
course_key
.
to_deprecated_string
())]
=
'Email'
session
.
save
()
response
=
self
.
client
.
post
(
self
.
url
,
{
'action'
:
'Send email'
,
'to_option'
:
'all'
,
'subject'
:
'Welcome to the course!'
,
'message'
:
'Lets start with an introduction!'
,
}
)
self
.
assertContains
(
response
,
"Your email was successfully queued for sending."
)
lms/djangoapps/instructor/tests/test_legacy_forum_admin.py
deleted
100644 → 0
View file @
46545935
"""
Unit tests for instructor dashboard forum administration
"""
from
django.test.utils
import
override_settings
# Need access to internal func to put users in the right group
from
django.contrib.auth.models
import
User
from
django.core.urlresolvers
import
reverse
from
django_comment_common.models
import
Role
,
FORUM_ROLE_ADMINISTRATOR
,
\
FORUM_ROLE_MODERATOR
,
FORUM_ROLE_COMMUNITY_TA
,
FORUM_ROLE_STUDENT
from
django_comment_client.utils
import
has_forum_access
from
courseware.tests.helpers
import
LoginEnrollmentTestCase
from
xmodule.modulestore.tests.django_utils
import
TEST_DATA_MOCK_MODULESTORE
from
student.roles
import
CourseStaffRole
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
xmodule.modulestore.tests.factories
import
CourseFactory
FORUM_ROLES
=
[
FORUM_ROLE_ADMINISTRATOR
,
FORUM_ROLE_MODERATOR
,
FORUM_ROLE_COMMUNITY_TA
]
FORUM_ADMIN_ACTION_SUFFIX
=
{
FORUM_ROLE_ADMINISTRATOR
:
'admin'
,
FORUM_ROLE_MODERATOR
:
'moderator'
,
FORUM_ROLE_COMMUNITY_TA
:
'community TA'
}
FORUM_ADMIN_USER
=
{
FORUM_ROLE_ADMINISTRATOR
:
'forumadmin'
,
FORUM_ROLE_MODERATOR
:
'forummoderator'
,
FORUM_ROLE_COMMUNITY_TA
:
'forummoderator'
}
def
action_name
(
operation
,
rolename
):
if
operation
==
'List'
:
return
'{0} course forum {1}s'
.
format
(
operation
,
FORUM_ADMIN_ACTION_SUFFIX
[
rolename
])
else
:
return
'{0} forum {1}'
.
format
(
operation
,
FORUM_ADMIN_ACTION_SUFFIX
[
rolename
])
@override_settings
(
MODULESTORE
=
TEST_DATA_MOCK_MODULESTORE
)
class
TestInstructorDashboardForumAdmin
(
ModuleStoreTestCase
,
LoginEnrollmentTestCase
):
'''
Check for change in forum admin role memberships
'''
def
setUp
(
self
):
self
.
toy
=
CourseFactory
.
create
(
org
=
'edX'
,
course
=
'toy'
,
display_name
=
'2012_Fall'
)
# Create two accounts
self
.
student
=
'view@test.com'
self
.
instructor
=
'view2@test.com'
self
.
password
=
'foo'
self
.
create_account
(
'u1'
,
self
.
student
,
self
.
password
)
self
.
create_account
(
'u2'
,
self
.
instructor
,
self
.
password
)
self
.
activate_user
(
self
.
student
)
self
.
activate_user
(
self
.
instructor
)
CourseStaffRole
(
self
.
toy
.
id
)
.
add_users
(
User
.
objects
.
get
(
email
=
self
.
instructor
))
self
.
logout
()
self
.
login
(
self
.
instructor
,
self
.
password
)
self
.
enroll
(
self
.
toy
)
def
initialize_roles
(
self
,
course_id
):
self
.
admin_role
=
Role
.
objects
.
get_or_create
(
name
=
FORUM_ROLE_ADMINISTRATOR
,
course_id
=
course_id
)[
0
]
self
.
moderator_role
=
Role
.
objects
.
get_or_create
(
name
=
FORUM_ROLE_MODERATOR
,
course_id
=
course_id
)[
0
]
self
.
community_ta_role
=
Role
.
objects
.
get_or_create
(
name
=
FORUM_ROLE_COMMUNITY_TA
,
course_id
=
course_id
)[
0
]
def
test_add_forum_admin_users_for_unknown_user
(
self
):
course
=
self
.
toy
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
username
=
'unknown'
for
action
in
[
'Add'
,
'Remove'
]:
for
rolename
in
FORUM_ROLES
:
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
action
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertTrue
(
response
.
content
.
find
(
'Error: unknown username "{0}"'
.
format
(
username
))
>=
0
)
def
test_add_forum_admin_users_for_missing_roles
(
self
):
course
=
self
.
toy
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
username
=
'u1'
for
action
in
[
'Add'
,
'Remove'
]:
for
rolename
in
FORUM_ROLES
:
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
action
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertTrue
(
response
.
content
.
find
(
'Error: unknown rolename "{0}"'
.
format
(
rolename
))
>=
0
)
def
test_remove_forum_admin_users_for_missing_users
(
self
):
course
=
self
.
toy
self
.
initialize_roles
(
course
.
id
)
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
username
=
'u1'
action
=
'Remove'
for
rolename
in
FORUM_ROLES
:
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
action
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertTrue
(
response
.
content
.
find
(
'Error: user "{0}" does not have rolename "{1}"'
.
format
(
username
,
rolename
))
>=
0
)
def
test_add_and_remove_forum_admin_users
(
self
):
course
=
self
.
toy
self
.
initialize_roles
(
course
.
id
)
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
username
=
'u2'
for
rolename
in
FORUM_ROLES
:
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
'Add'
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertContains
(
response
,
'Added "{0}" to "{1}" forum role = "{2}"'
.
format
(
username
,
course
.
id
.
to_deprecated_string
(),
rolename
))
self
.
assertTrue
(
has_forum_access
(
username
,
course
.
id
,
rolename
))
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
'Remove'
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertContains
(
response
,
'Removed "{0}" from "{1}" forum role = "{2}"'
.
format
(
username
,
course
.
id
.
to_deprecated_string
(),
rolename
))
self
.
assertFalse
(
has_forum_access
(
username
,
course
.
id
,
rolename
))
def
test_add_and_read_forum_admin_users
(
self
):
course
=
self
.
toy
self
.
initialize_roles
(
course
.
id
)
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
username
=
'u2'
for
rolename
in
FORUM_ROLES
:
# perform an add, and follow with a second identical add:
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
'Add'
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
'Add'
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertTrue
(
response
.
content
.
find
(
'Error: user "{0}" already has rolename "{1}", cannot add'
.
format
(
username
,
rolename
))
>=
0
)
self
.
assertTrue
(
has_forum_access
(
username
,
course
.
id
,
rolename
))
def
test_add_nonstaff_forum_admin_users
(
self
):
course
=
self
.
toy
self
.
initialize_roles
(
course
.
id
)
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
username
=
'u1'
rolename
=
FORUM_ROLE_ADMINISTRATOR
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
'Add'
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertTrue
(
response
.
content
.
find
(
'Error: user "{0}" should first be added as staff'
.
format
(
username
))
>=
0
)
def
test_list_forum_admin_users
(
self
):
course
=
self
.
toy
self
.
initialize_roles
(
course
.
id
)
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
course
.
id
.
to_deprecated_string
()})
username
=
'u2'
added_roles
=
[
FORUM_ROLE_STUDENT
]
# u2 is already added as a student to the discussion forums
self
.
assertTrue
(
has_forum_access
(
username
,
course
.
id
,
'Student'
))
for
rolename
in
FORUM_ROLES
:
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
'Add'
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
self
.
assertTrue
(
has_forum_access
(
username
,
course
.
id
,
rolename
))
response
=
self
.
client
.
post
(
url
,
{
'action'
:
action_name
(
'List'
,
rolename
),
FORUM_ADMIN_USER
[
rolename
]:
username
})
for
header
in
[
'Username'
,
'Full name'
,
'Roles'
]:
self
.
assertTrue
(
response
.
content
.
find
(
'<th>{0}</th>'
.
format
(
header
))
>
0
)
self
.
assertTrue
(
response
.
content
.
find
(
'<td>{0}</td>'
.
format
(
username
))
>=
0
)
# concatenate all roles for user, in sorted order:
added_roles
.
append
(
rolename
)
added_roles
.
sort
()
roles
=
', '
.
join
(
added_roles
)
self
.
assertTrue
(
response
.
content
.
find
(
'<td>{0}</td>'
.
format
(
roles
))
>=
0
,
'not finding roles "{0}"'
.
format
(
roles
))
lms/djangoapps/instructor/tests/test_legacy_reset.py
deleted
100644 → 0
View file @
46545935
"""
View-level tests for resetting student state in legacy instructor dash.
"""
import
json
from
django.core.urlresolvers
import
reverse
from
django.test.utils
import
override_settings
from
courseware.tests.helpers
import
LoginEnrollmentTestCase
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
xmodule.modulestore.tests.django_utils
import
TEST_DATA_MOCK_MODULESTORE
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
student.tests.factories
import
UserFactory
,
AdminFactory
,
CourseEnrollmentFactory
from
courseware.models
import
StudentModule
from
submissions
import
api
as
sub_api
from
student.models
import
anonymous_id_for_user
@override_settings
(
MODULESTORE
=
TEST_DATA_MOCK_MODULESTORE
)
class
InstructorResetStudentStateTest
(
ModuleStoreTestCase
,
LoginEnrollmentTestCase
):
"""
Reset student state from the legacy instructor dash.
"""
def
setUp
(
self
):
"""
Log in as an instructor, and create a course/student to reset.
"""
instructor
=
AdminFactory
.
create
()
self
.
client
.
login
(
username
=
instructor
.
username
,
password
=
'test'
)
self
.
student
=
UserFactory
.
create
(
username
=
'test'
,
email
=
'test@example.com'
)
self
.
course
=
CourseFactory
.
create
()
CourseEnrollmentFactory
.
create
(
user
=
self
.
student
,
course_id
=
self
.
course
.
id
)
def
test_delete_student_state_resets_scores
(
self
):
problem_location
=
self
.
course
.
id
.
make_usage_key
(
'dummy'
,
'module'
)
# Create a student module for the user
StudentModule
.
objects
.
create
(
student
=
self
.
student
,
course_id
=
self
.
course
.
id
,
module_state_key
=
problem_location
,
state
=
json
.
dumps
({})
)
# Create a submission and score for the student using the submissions API
student_item
=
{
'student_id'
:
anonymous_id_for_user
(
self
.
student
,
self
.
course
.
id
),
'course_id'
:
self
.
course
.
id
.
to_deprecated_string
(),
'item_id'
:
problem_location
.
to_deprecated_string
(),
'item_type'
:
'openassessment'
}
submission
=
sub_api
.
create_submission
(
student_item
,
'test answer'
)
sub_api
.
set_score
(
submission
[
'uuid'
],
1
,
2
)
# Delete student state using the instructor dash
url
=
reverse
(
'instructor_dashboard_legacy'
,
kwargs
=
{
'course_id'
:
self
.
course
.
id
.
to_deprecated_string
()})
response
=
self
.
client
.
post
(
url
,
{
'action'
:
'Delete student state for module'
,
'unique_student_identifier'
:
self
.
student
.
email
,
'problem_for_student'
:
problem_location
.
to_deprecated_string
(),
})
self
.
assertEqual
(
response
.
status_code
,
200
)
# Verify that the student's scores have been reset in the submissions API
score
=
sub_api
.
get_score
(
student_item
)
self
.
assertIs
(
score
,
None
)
lms/djangoapps/instructor/tests/test_legacy_xss.py
View file @
69fd063d
...
...
@@ -63,6 +63,3 @@ class TestXss(ModuleStoreTestCase):
def
test_dump_list_of_enrolled
(
self
):
self
.
_test_action
(
"Dump list of enrolled students"
)
def
test_dump_grades
(
self
):
self
.
_test_action
(
"Dump Grades for all students in this course"
)
lms/djangoapps/instructor/views/legacy.py
View file @
69fd063d
This diff is collapsed.
Click to expand it.
lms/static/sass/base/_base.scss
View file @
69fd063d
...
...
@@ -315,6 +315,11 @@ mark {
display
:
none
;
}
// UI - is deprecated
.is-deprecated
{
@extend
%ui-deprecated
;
}
// UI - semantically hide text
.sr
{
@extend
%text-sr
;
...
...
lms/static/sass/base/_extends.scss
View file @
69fd063d
...
...
@@ -113,3 +113,10 @@
padding
:
0
;
}
}
%ui-deprecated
{
@extend
%t-weight4
;
background
:
tint
(
$warning-color
,
85%
);
padding
:
(
$baseline
/
5
)
(
$baseline
/
2
);
color
:
shade
(
$warning-color
,
45%
);
}
lms/templates/course_groups/cohort_management.html
deleted
100644 → 0
View file @
46545935
<
%!
from
django
.
utils
.
translation
import
ugettext
as
_
%
>
<section
class=
"cohort_manager"
data-ajax_url=
"${cohorts_ajax_url}"
>
<h3>
${_("Cohort groups")}
</h3>
<div
class=
"controls"
style=
"padding-top:15px"
>
<a
href=
"#"
class=
"button show_cohorts"
>
${_("Show cohorts")}
</a>
</div>
<ul
class=
"errors"
>
</ul>
<div
class=
"summary"
style=
"display:none"
>
<h3>
${_("Cohorts in the course")}
</h3>
<ul
class=
"cohorts"
>
</ul>
<p>
<input
class=
"cohort_name"
/>
<a
href=
"#"
class=
"button add_cohort"
>
${_("Add cohort")}
</a>
</p>
</div>
<div
class=
"detail"
style=
"display:none"
>
<h3
class=
"header"
></h3>
<table
class=
"users"
>
</table>
<span
class=
"page_num"
></span>
<p>
${_("Add users by username or email. One per line or comma-separated.")}
</p>
<textarea
cols=
"50"
row=
"30"
class=
"users_area"
style=
"height: 200px"
></textarea>
<a
href=
"#"
class=
"button add_members"
>
${_("Add cohort members")}
</a>
<ul
class=
"op_results"
>
</ul>
</div>
</section>
lms/templates/course_groups/debug.html
deleted
100644 → 0
View file @
46545935
<!DOCTYPE html>
<
%!
from
django
.
utils
.
translation
import
ugettext
as
_
%
>
<html
lang=
"${LANGUAGE_CODE}"
>
<head>
## "edX" should not be translated
<
%
block
name=
"pagetitle"
></
%
block>
<script
type=
"text/javascript"
src=
"/static/js/vendor/jquery.min.js"
></script>
<script
type=
"text/javascript"
src=
"/static/js/course_groups/cohorts.js"
></script>
</head>
<body
class=
"<%block name='bodyclass'/>"
>
<
%
include
file=
"/course_groups/cohort_management.html"
/>
</body>
</html>
lms/templates/courseware/instructor_dashboard.html
→
lms/templates/courseware/
legacy_
instructor_dashboard.html
View file @
69fd063d
This diff is collapsed.
Click to expand it.
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