Commit f25b414d by Miles Steele

fix pep8 violations, fix pylint violations

parent a727959d
...@@ -9,7 +9,8 @@ import xmodule.graders as xmgraders ...@@ -9,7 +9,8 @@ import xmodule.graders as xmgraders
STUDENT_FEATURES = ('username', 'first_name', 'last_name', 'is_staff', 'email') 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 AVAILABLE_FEATURES = STUDENT_FEATURES + PROFILE_FEATURES
...@@ -19,17 +20,19 @@ def enrolled_students_profiles(course_id, features): ...@@ -19,17 +20,19 @@ def enrolled_students_profiles(course_id, features):
""" """
# enrollments = CourseEnrollment.objects.filter(course_id=course_id) # enrollments = CourseEnrollment.objects.filter(course_id=course_id)
# students = [enrollment.user for enrollment in enrollments] # students = [enrollment.user for enrollment in enrollments]
students = User.objects.filter(courseenrollment__course_id=course_id).order_by('username').select_related('profile') students = User.objects.filter(courseenrollment__course_id=course_id)\
print len(students) .order_by('username').select_related('profile')
print students
def extract_student(student): def extract_student(student):
student_features = [feature for feature in features if feature in STUDENT_FEATURES] """ convert student to dictionary """
profile_features = [feature for feature in features if feature in PROFILE_FEATURES] 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 = 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) student_dict.update(profile_dict)
return student_dict return student_dict
...@@ -38,12 +41,14 @@ def enrolled_students_profiles(course_id, features): ...@@ -38,12 +41,14 @@ def enrolled_students_profiles(course_id, features):
def dump_grading_context(course): 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 Useful for debugging grading_policy.json and policy.json
Returns HTML string Returns HTML string
""" """
msg = "-----------------------------------------------------------------------------\n" hbar = "{}\n".format("-" * 77)
msg = hbar
msg += "Course grader:\n" msg += "Course grader:\n"
msg += '%s\n' % course.grader.__class__ msg += '%s\n' % course.grader.__class__
...@@ -52,34 +57,36 @@ def dump_grading_context(course): ...@@ -52,34 +57,36 @@ def dump_grading_context(course):
msg += '\n' msg += '\n'
msg += "Graded sections:\n" msg += "Graded sections:\n"
for subgrader, category, weight in course.grader.sections: 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 subgrader.index = 1
graders[subgrader.type] = subgrader graders[subgrader.type] = subgrader
msg += "-----------------------------------------------------------------------------\n" msg += hbar
msg += "Listing grading context for course %s\n" % course.id msg += "Listing grading context for course %s\n" % course.id
gc = course.grading_context gcontext = course.grading_context
msg += "graded sections:\n" msg += "graded sections:\n"
msg += '%s\n' % gc['graded_sections'].keys() msg += '%s\n' % gcontext['graded_sections'].keys()
for (gs, gsvals) in gc['graded_sections'].items(): for (gsomething, gsvals) in gcontext['graded_sections'].items():
msg += "--> Section %s:\n" % (gs) msg += "--> Section %s:\n" % (gsomething)
for sec in gsvals: for sec in gsvals:
s = sec['section_descriptor'] sdesc = sec['section_descriptor']
format = getattr(s.lms, 'format', None) frmat = getattr(sdesc.lms, 'format', None)
aname = '' aname = ''
if format in graders: if frmat in graders:
g = graders[format] gform = graders[frmat]
aname = '%s %02d' % (g.short_label, g.index) aname = '%s %02d' % (gform.short_label, gform.index)
g.index += 1 gform.index += 1
elif s.display_name in graders: elif sdesc.display_name in graders:
g = graders[s.display_name] gform = graders[sdesc.display_name]
aname = '%s' % g.short_label aname = '%s' % gform.short_label
notes = '' notes = ''
if getattr(s, 'score_by_attempt', False): if getattr(sdesc, 'score_by_attempt', False):
notes = ', score by attempt!' 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 += "all descriptors:\n"
msg += "length=%d\n" % len(gc['all_descriptors']) msg += "length=%d\n" % len(gcontext['all_descriptors'])
msg = '<pre>%s</pre>' % msg.replace('<','&lt;') msg = '<pre>%s</pre>' % msg.replace('<', '&lt;')
return msg return msg
...@@ -16,8 +16,14 @@ def create_csv_response(filename, header, datarows): ...@@ -16,8 +16,14 @@ def create_csv_response(filename, header, datarows):
datarows e.g. [['Jim', 'jim@edy.org'], ['Jake', 'jake@edy.org'], ...] datarows e.g. [['Jim', 'jim@edy.org'], ['Jake', 'jake@edy.org'], ...]
""" """
response = HttpResponse(mimetype='text/csv') response = HttpResponse(mimetype='text/csv')
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename) response['Content-Disposition'] = 'attachment; filename={0}'\
csvwriter = csv.writer(response, dialect='excel', quotechar='"', quoting=csv.QUOTE_ALL) .format(filename)
csvwriter = csv.writer(
response,
dialect='excel',
quotechar='"',
quoting=csv.QUOTE_ALL)
csvwriter.writerow(header) csvwriter.writerow(header)
for datarow in datarows: for datarow in datarows:
encoded_row = [unicode(s).encode('utf-8') for s in datarow] encoded_row = [unicode(s).encode('utf-8') for s in datarow]
...@@ -56,14 +62,15 @@ def format_dictlist(dictlist): ...@@ -56,14 +62,15 @@ def format_dictlist(dictlist):
else: else:
header = [] header = []
def dict_to_entry(d): def dict_to_entry(dct):
ordered = sorted(d.items(), key=lambda (k, v): header.index(k)) """ Convert dictionary to list for a csv row """
vals = map(lambda (k, v): v, ordered) ordered = sorted(dct.items(), key=lambda (k, v): header.index(k))
vals = [v for (_, v) in ordered]
return vals return vals
datarows = map(dict_to_entry, dictlist) datarows = map(dict_to_entry, dictlist)
return { return {
'header': header, 'header': header,
'datarows': datarows, 'datarows': datarows,
} }
...@@ -3,7 +3,6 @@ Profile Distributions ...@@ -3,7 +3,6 @@ Profile Distributions
""" """
from django.db.models import Count from django.db.models import Count
from django.contrib.auth.models import User, Group
from student.models import CourseEnrollment, UserProfile from student.models import CourseEnrollment, UserProfile
AVAILABLE_PROFILE_FEATURES = ['gender', 'level_of_education', 'year_of_birth'] AVAILABLE_PROFILE_FEATURES = ['gender', 'level_of_education', 'year_of_birth']
......
"""
Tests for instructor.basic
"""
from django.test import TestCase from django.test import TestCase
from django.contrib.auth.models import User, Group
from student.models import CourseEnrollment from student.models import CourseEnrollment
from xmodule.modulestore.tests.factories import CourseFactory
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from analytics.basic import enrolled_students_profiles, AVAILABLE_FEATURES, STUDENT_FEATURES, PROFILE_FEATURES from analytics.basic import enrolled_students_profiles, AVAILABLE_FEATURES, STUDENT_FEATURES, PROFILE_FEATURES
class TestAnalyticsBasic(TestCase): class TestAnalyticsBasic(TestCase):
'''Test basic analytics functions.''' """ Test basic analytics functions. """
def setUp(self): def setUp(self):
self.course_id = 'some/robot/course/id' self.course_id = 'some/robot/course/id'
......
""" Tests for analytics.csvs """
from django.test import TestCase from django.test import TestCase
from analytics.csvs import create_csv_response, format_dictlist from analytics.csvs import create_csv_response, format_dictlist
...@@ -57,7 +59,6 @@ class TestAnalyticsCSVS(TestCase): ...@@ -57,7 +59,6 @@ class TestAnalyticsCSVS(TestCase):
self.assertEqual(format_dictlist(data_in), data_out) self.assertEqual(format_dictlist(data_in), data_out)
def test_format_dictlist_empty(self): def test_format_dictlist_empty(self):
self.assertEqual(format_dictlist([]), { self.assertEqual(format_dictlist([]), {
'header': [], 'header': [],
......
""" Tests for analytics.distributions """
from django.test import TestCase from django.test import TestCase
from nose.tools import raises from nose.tools import raises
from django.contrib.auth.models import User, Group
from student.models import CourseEnrollment from student.models import CourseEnrollment
from xmodule.modulestore.tests.factories import CourseFactory
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from analytics.distributions import profile_distribution, AVAILABLE_PROFILE_FEATURES from analytics.distributions import profile_distribution, AVAILABLE_PROFILE_FEATURES
......
...@@ -9,12 +9,13 @@ TODO sync instructor and staff flags ...@@ -9,12 +9,13 @@ TODO sync instructor and staff flags
{instructor: true, staff: true} {instructor: true, staff: true}
""" """
from django.contrib.auth.models import User, Group from django.contrib.auth.models import Group
from courseware.access import get_access_group_name, course_beta_test_group_name from courseware.access import (get_access_group_name,
from django_comment_common.models import (Role, course_beta_test_group_name)
FORUM_ROLE_ADMINISTRATOR, from django_comment_common.models import Role
FORUM_ROLE_MODERATOR, # FORUM_ROLE_ADMINISTRATOR,
FORUM_ROLE_COMMUNITY_TA) # FORUM_ROLE_MODERATOR,
# FORUM_ROLE_COMMUNITY_TA)
def list_with_level(course, level): def list_with_level(course, level):
......
...@@ -28,10 +28,10 @@ def enroll_emails(course_id, student_emails, auto_enroll=False): ...@@ -28,10 +28,10 @@ def enroll_emails(course_id, student_emails, auto_enroll=False):
auto_string = {False: 'allowed', True: 'willautoenroll'}[auto_enroll] auto_string = {False: 'allowed', True: 'willautoenroll'}[auto_enroll]
status_map = { status_map = {
'user/ce/alreadyenrolled': [], 'user/ce/alreadyenrolled': [],
'user/!ce/enrolled': [], 'user/!ce/enrolled': [],
'user/!ce/rejected': [], 'user/!ce/rejected': [],
'!user/cea/' + auto_string: [], '!user/cea/' + auto_string: [],
'!user/!cea/' + auto_string: [], '!user/!cea/' + auto_string: [],
} }
...@@ -48,11 +48,11 @@ def enroll_emails(course_id, student_emails, auto_enroll=False): ...@@ -48,11 +48,11 @@ def enroll_emails(course_id, student_emails, auto_enroll=False):
except CourseEnrollment.DoesNotExist: except CourseEnrollment.DoesNotExist:
# status: user/!ce/enrolled # status: user/!ce/enrolled
try: try:
ce = CourseEnrollment(user=user, course_id=course_id) cenr = CourseEnrollment(user=user, course_id=course_id)
ce.save() cenr.save()
status_map['user/!ce/enrolled'].append(student_email) status_map['user/!ce/enrolled'].append(student_email)
# status: user/!ce/rejected # status: user/!ce/rejected
except: except Exception:
status_map['user/!ce/rejected'].append(student_email) status_map['user/!ce/rejected'].append(student_email)
# status: !user # status: !user
except User.DoesNotExist: except User.DoesNotExist:
...@@ -106,9 +106,9 @@ def unenroll_emails(course_id, student_emails): ...@@ -106,9 +106,9 @@ def unenroll_emails(course_id, student_emails):
# delete CourseEnrollment # delete CourseEnrollment
try: try:
ce = CourseEnrollment.objects.get(course_id=course_id, user__email=student_email) cenr = CourseEnrollment.objects.get(course_id=course_id, user__email=student_email)
try: try:
ce.delete() cenr.delete()
status_map['ce/unenrolled'].append(student_email) status_map['ce/unenrolled'].append(student_email)
except Exception: except Exception:
status_map['ce/rejected'].append(student_email) status_map['ce/rejected'].append(student_email)
......
from django.test import TestCase """
Test instructor.access
"""
from nose.tools import raises 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 student.tests.factories import UserFactory
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
...@@ -9,10 +12,9 @@ from django.test.utils import override_settings ...@@ -9,10 +12,9 @@ from django.test.utils import override_settings
from django.conf import settings from django.conf import settings
from uuid import uuid4 from uuid import uuid4
from student.models import CourseEnrollment, CourseEnrollmentAllowed
from courseware.access import get_access_group_name from courseware.access import get_access_group_name
from django_comment_common.models import (Role, from django_comment_common.models import (Role,
FORUM_ROLE_ADMINISTRATOR, # FORUM_ROLE_ADMINISTRATOR,
FORUM_ROLE_MODERATOR, FORUM_ROLE_MODERATOR,
FORUM_ROLE_COMMUNITY_TA) FORUM_ROLE_COMMUNITY_TA)
from instructor.access import allow_access, revoke_access, list_with_level, update_forum_role_membership 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 ...@@ -24,11 +26,11 @@ from instructor.access import allow_access, revoke_access, list_with_level, upda
# moved here from old courseware/tests/tests.py # moved here from old courseware/tests/tests.py
# when it disappeared this test broke. # when it disappeared this test broke.
def mongo_store_config(data_dir): def mongo_store_config(data_dir):
''' """
Defines default module store using MongoModuleStore Defines default module store using MongoModuleStore
Use of this config requires mongo to be running Use of this config requires mongo to be running
''' """
store = { store = {
'default': { 'default': {
'ENGINE': 'xmodule.modulestore.mongo.MongoModuleStore', 'ENGINE': 'xmodule.modulestore.mongo.MongoModuleStore',
...@@ -52,7 +54,7 @@ TEST_DATA_MONGO_MODULESTORE = mongo_store_config(TEST_DATA_DIR) ...@@ -52,7 +54,7 @@ TEST_DATA_MONGO_MODULESTORE = mongo_store_config(TEST_DATA_DIR)
@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE) @override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE)
class TestInstructorAccessControlDB(ModuleStoreTestCase): class TestInstructorAccessControlDB(ModuleStoreTestCase):
'''Test instructor access administration against database effects''' """ Test instructor access administration against database effects """
def setUp(self): def setUp(self):
# self.course_id = 'jus:/a/fake/c::rse/id' # self.course_id = 'jus:/a/fake/c::rse/id'
...@@ -132,12 +134,16 @@ class TestInstructorAccessControlDB(ModuleStoreTestCase): ...@@ -132,12 +134,16 @@ class TestInstructorAccessControlDB(ModuleStoreTestCase):
@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE) @override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE)
class TestInstructorAccessControlPrefilledDB(ModuleStoreTestCase): class TestInstructorAccessControlPrefilledDB(ModuleStoreTestCase):
"""
Test access with existing users.
"""
def setUp(self): def setUp(self):
self.course = CourseFactory.create() self.course = CourseFactory.create()
# setup instructors # setup instructors
self.instructors = set([UserFactory.create(), UserFactory.create()]) 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): def test_list_with_level(self):
instructors = set(list_with_level(self.course, 'instructor')) instructors = set(list_with_level(self.course, 'instructor'))
...@@ -155,63 +161,68 @@ class TestInstructorAccessControlPrefilledDB(ModuleStoreTestCase): ...@@ -155,63 +161,68 @@ class TestInstructorAccessControlPrefilledDB(ModuleStoreTestCase):
self.assertEqual(set(), beta_testers_result) self.assertEqual(set(), beta_testers_result)
beta_testers = set([UserFactory.create(), UserFactory.create()]) 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')) beta_testers_result = set(list_with_level(self.course, 'beta'))
self.assertEqual(beta_testers, beta_testers_result) self.assertEqual(beta_testers, beta_testers_result)
@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE) @override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE)
class TestInstructorAccessForumDB(ModuleStoreTestCase): class TestInstructorAccessForumDB(ModuleStoreTestCase):
"""
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.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 = 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() 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_role_membership_allow_existing_role_allowed_user(self): def test_update_forum_membership_allow_existing_role_allowed_user(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')
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_role_membership_allow_not_existing_role(self): def test_update_forum_membership_allow_not_existing_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, 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() 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()) 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() 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')
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) @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() user = iter(self.moderators).next()
update_forum_role_membership(self.course.id, user, FORUM_ROLE_COMMUNITY_TA, 'revoke') update_forum_role_membership(self.course.id, user, FORUM_ROLE_COMMUNITY_TA, 'revoke')
@raises(Role.DoesNotExist) @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() user = UserFactory.create()
update_forum_role_membership(self.course.id, user, 'robot-definitely-not-a-forum-role', 'allow') 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_role_membership_bad_role_revoke(self): def test_update_forum_membership_bad_role_revoke(self):
user = UserFactory.create() user = UserFactory.create()
update_forum_role_membership(self.course.id, user, 'robot-definitely-not-a-forum-role', 'revoke') update_forum_role_membership(self.course.id, user, 'robot-definitely-not-a-forum-role', 'revoke')
@raises(ValueError) @raises(ValueError)
def test_update_forum_role_membership_bad_mode(self): def test_update_forum_membership_bad_mode(self):
user = iter(self.moderators).next() user = iter(self.moderators).next()
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')
...@@ -3,7 +3,7 @@ Unit tests for instructor.enrollment methods. ...@@ -3,7 +3,7 @@ Unit tests for instructor.enrollment methods.
""" """
import json 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.access import _course_staff_group_name
from courseware.models import StudentModule from courseware.models import StudentModule
from django.test import TestCase from django.test import TestCase
...@@ -25,13 +25,13 @@ class TestInstructorEnrollmentDB(TestCase): ...@@ -25,13 +25,13 @@ class TestInstructorEnrollmentDB(TestCase):
strings.append("Lorem@ipsum.dolor, sit@amet.consectetur\nadipiscing@elit.Aenean\r convallis@at.lacus\r, ut@lacinia.Sed") strings.append("Lorem@ipsum.dolor, sit@amet.consectetur\nadipiscing@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']) lists.append(['Lorem@ipsum.dolor', 'sit@amet.consectetur', 'adipiscing@elit.Aenean', 'convallis@at.lacus', 'ut@lacinia.Sed'])
for (s, l) in zip(strings, lists): for (stng, lst) in zip(strings, lists):
self.assertEqual(split_input_list(s), l) self.assertEqual(split_input_list(stng), lst)
def test_enroll_emails_userexists_alreadyenrolled(self): def test_enroll_emails_userexists_alreadyenrolled(self):
user = UserFactory() user = UserFactory()
ce = CourseEnrollment(course_id=self.course_id, user=user) cenr = CourseEnrollment(course_id=self.course_id, user=user)
ce.save() cenr.save()
self.assertEqual(CourseEnrollment.objects.filter(course_id=self.course_id, user__email=user.email).count(), 1) self.assertEqual(CourseEnrollment.objects.filter(course_id=self.course_id, user__email=user.email).count(), 1)
...@@ -49,7 +49,7 @@ class TestInstructorEnrollmentDB(TestCase): ...@@ -49,7 +49,7 @@ class TestInstructorEnrollmentDB(TestCase):
self.assertEqual(CourseEnrollment.objects.filter(course_id=self.course_id, user__email=user.email).count(), 1) self.assertEqual(CourseEnrollment.objects.filter(course_id=self.course_id, user__email=user.email).count(), 1)
def test_enroll_emails_nouser_alreadyallowed(self): def test_enroll_emails_nouser_alreadyallowed(self):
email_without_user = 'test_enroll_emails_nouser_alreadyallowed@test.org' email_without_user = 'robot_enroll_emails_nouser_alreadyallowed@test.org'
self.assertEqual(User.objects.filter(email=email_without_user).count(), 0) 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) self.assertEqual(CourseEnrollment.objects.filter(course_id=self.course_id, user__email=email_without_user).count(), 0)
...@@ -65,7 +65,7 @@ class TestInstructorEnrollmentDB(TestCase): ...@@ -65,7 +65,7 @@ class TestInstructorEnrollmentDB(TestCase):
self.assertEqual(CourseEnrollmentAllowed.objects.get(course_id=self.course_id, email=email_without_user).auto_enroll, False) self.assertEqual(CourseEnrollmentAllowed.objects.get(course_id=self.course_id, email=email_without_user).auto_enroll, False)
def test_enroll_emails_nouser_suceedallow(self): def test_enroll_emails_nouser_suceedallow(self):
email_without_user = 'test_enroll_emails_nouser_suceedallow@test.org' email_without_user = 'robot_enroll_emails_nouser_suceedallow@test.org'
self.assertEqual(User.objects.filter(email=email_without_user).count(), 0) 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) self.assertEqual(CourseEnrollment.objects.filter(course_id=self.course_id, user__email=email_without_user).count(), 0)
...@@ -81,9 +81,9 @@ class TestInstructorEnrollmentDB(TestCase): ...@@ -81,9 +81,9 @@ class TestInstructorEnrollmentDB(TestCase):
user1 = UserFactory() user1 = UserFactory()
user2 = UserFactory() user2 = UserFactory()
user3 = UserFactory() user3 = UserFactory()
email_without_user1 = 'test_enroll_emails_nouser_suceedallow_1@test.org' email_without_user1 = 'robot_enroll_emails_nouser_suceedallow_1@test.org'
email_without_user2 = 'test_enroll_emails_nouser_suceedallow_2@test.org' email_without_user2 = 'robot_enroll_emails_nouser_suceedallow_2@test.org'
email_without_user3 = 'test_enroll_emails_nouser_suceedallow_3@test.org' email_without_user3 = 'robot_enroll_emails_nouser_suceedallow_3@test.org'
def test_db(auto_enroll): def test_db(auto_enroll):
for user in [user1, user2, user3]: for user in [user1, user2, user3]:
...@@ -101,7 +101,7 @@ class TestInstructorEnrollmentDB(TestCase): ...@@ -101,7 +101,7 @@ class TestInstructorEnrollmentDB(TestCase):
test_db(False) test_db(False)
def test_unenroll_alreadyallowed(self): def test_unenroll_alreadyallowed(self):
email_without_user = 'test_unenroll_alreadyallowed@test.org' email_without_user = 'robot_unenroll_alreadyallowed@test.org'
cea = CourseEnrollmentAllowed(course_id=self.course_id, email=email_without_user, auto_enroll=False) cea = CourseEnrollmentAllowed(course_id=self.course_id, email=email_without_user, auto_enroll=False)
cea.save() cea.save()
...@@ -113,8 +113,8 @@ class TestInstructorEnrollmentDB(TestCase): ...@@ -113,8 +113,8 @@ class TestInstructorEnrollmentDB(TestCase):
def test_unenroll_alreadyenrolled(self): def test_unenroll_alreadyenrolled(self):
user = UserFactory() user = UserFactory()
ce = CourseEnrollment(course_id=self.course_id, user=user) cenr = CourseEnrollment(course_id=self.course_id, user=user)
ce.save() cenr.save()
unenroll_emails(self.course_id, [user.email]) unenroll_emails(self.course_id, [user.email])
...@@ -130,7 +130,7 @@ class TestInstructorEnrollmentDB(TestCase): ...@@ -130,7 +130,7 @@ class TestInstructorEnrollmentDB(TestCase):
self.assertEqual(CourseEnrollmentAllowed.objects.filter(course_id=self.course_id, email=user.email).count(), 0) self.assertEqual(CourseEnrollmentAllowed.objects.filter(course_id=self.course_id, email=user.email).count(), 0)
def test_unenroll_nosuchuser(self): def test_unenroll_nosuchuser(self):
email_without_user = 'test_unenroll_nosuchuser@test.org' email_without_user = 'robot_unenroll_nosuchuser@test.org'
unenroll_emails(self.course_id, [email_without_user]) unenroll_emails(self.course_id, [email_without_user])
......
...@@ -4,12 +4,6 @@ Instructor Dashboard Views ...@@ -4,12 +4,6 @@ Instructor Dashboard Views
TODO add tracking 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_future.csrf import ensure_csrf_cookie
from django.views.decorators.cache import cache_control from django.views.decorators.cache import cache_control
from mitxmako.shortcuts import render_to_response from mitxmako.shortcuts import render_to_response
...@@ -17,12 +11,13 @@ from django.core.urlresolvers import reverse ...@@ -17,12 +11,13 @@ from django.core.urlresolvers import reverse
from django.utils.html import escape from django.utils.html import escape
from django.http import Http404 from django.http import Http404
from django.conf import settings from courseware.access import has_access
from courseware.access import has_access, get_access_group_name, course_beta_test_group_name
from courseware.courses import get_course_by_id from courseware.courses import get_course_by_id
from django_comment_client.utils import has_forum_access 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,
from django_comment_common.models import Role, FORUM_ROLE_ADMINISTRATOR, FORUM_ROLE_MODERATOR, FORUM_ROLE_COMMUNITY_TA FORUM_ROLE_ADMINISTRATOR,
FORUM_ROLE_MODERATOR,
FORUM_ROLE_COMMUNITY_TA)
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from student.models import CourseEnrollment from student.models import CourseEnrollment
...@@ -36,9 +31,12 @@ def instructor_dashboard_2(request, course_id): ...@@ -36,9 +31,12 @@ def instructor_dashboard_2(request, course_id):
access = { access = {
'admin': request.user.is_staff, 'admin': request.user.is_staff,
'instructor': has_access(request.user, course, 'instructor'), # an instructor can manage staff lists # an instructor can manage staff lists
'staff': has_access(request.user, course, 'staff'), 'instructor': has_access(request.user, course, 'instructor'),
'forum_admin': has_forum_access(request.user, course_id, FORUM_ROLE_ADMINISTRATOR), 'staff': has_access(request.user, course, 'staff'),
'forum_admin': has_forum_access(
request.user, course_id, FORUM_ROLE_ADMINISTRATOR
),
} }
if not access['staff']: if not access['staff']:
...@@ -107,7 +105,7 @@ def _section_membership(course_id, access): ...@@ -107,7 +105,7 @@ def _section_membership(course_id, access):
'section_key': 'membership', 'section_key': 'membership',
'section_display_name': 'Membership', 'section_display_name': 'Membership',
'access': access, '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}), '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}), '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}), 'access_allow_revoke_url': reverse('access_allow_revoke', kwargs={'course_id': course_id}),
...@@ -136,7 +134,7 @@ def _section_data_download(course_id): ...@@ -136,7 +134,7 @@ def _section_data_download(course_id):
section_data = { section_data = {
'section_key': 'data_download', 'section_key': 'data_download',
'section_display_name': '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}), 'enrolled_students_profiles_url': reverse('enrolled_students_profiles', kwargs={'course_id': course_id}),
} }
return section_data return section_data
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment