Commit cc9371d1 by Miles Steele

fix formatting, address comments from PR #322

parent 91bd3d72
...@@ -31,7 +31,10 @@ def profile_distribution(course_id, feature): ...@@ -31,7 +31,10 @@ def profile_distribution(course_id, feature):
feature_results = {} feature_results = {}
if not feature in AVAILABLE_PROFILE_FEATURES: if not feature in AVAILABLE_PROFILE_FEATURES:
raise ValueError("unsupported feature requested for distribution '{}'".format(feature)) raise ValueError(
"unsupported feature requested for distribution '{}'".format(
feature)
)
if feature in _EASY_CHOICE_FEATURES: if feature in _EASY_CHOICE_FEATURES:
if feature == 'gender': if feature == 'gender':
...@@ -39,25 +42,34 @@ def profile_distribution(course_id, feature): ...@@ -39,25 +42,34 @@ def profile_distribution(course_id, feature):
elif feature == 'level_of_education': elif feature == 'level_of_education':
raw_choices = UserProfile.LEVEL_OF_EDUCATION_CHOICES raw_choices = UserProfile.LEVEL_OF_EDUCATION_CHOICES
choices = [(short, full) for (short, full) in raw_choices] + [('no_data', 'No Data')] choices = [(short, full)
for (short, full) in raw_choices] + [('no_data', 'No Data')]
data = {} data = {}
for (short, full) in choices: for (short, full) in choices:
if feature == 'gender': if feature == 'gender':
count = CourseEnrollment.objects.filter(course_id=course_id, user__profile__gender=short).count() count = CourseEnrollment.objects.filter(
course_id=course_id, user__profile__gender=short
).count()
elif feature == 'level_of_education': elif feature == 'level_of_education':
count = CourseEnrollment.objects.filter(course_id=course_id, user__profile__level_of_education=short).count() count = CourseEnrollment.objects.filter(
course_id=course_id, user__profile__level_of_education=short
).count()
data[short] = count data[short] = count
feature_results['data'] = data feature_results['data'] = data
feature_results['type'] = 'EASY_CHOICE' feature_results['type'] = 'EASY_CHOICE'
feature_results['display_names'] = dict(choices) feature_results['display_names'] = dict(choices)
elif feature in _OPEN_CHOICE_FEATURES: elif feature in _OPEN_CHOICE_FEATURES:
profiles = UserProfile.objects.filter(user__courseenrollment__course_id=course_id) profiles = UserProfile.objects.filter(
query_distribution = profiles.values(feature).annotate(Count(feature)).order_by() user__courseenrollment__course_id=course_id)
# query_distribution is of the form [{'featureval': 'value1', 'featureval__count': 4}, {'featureval': 'value2', 'featureval__count': 2}, ...] query_distribution = profiles.values(
feature).annotate(Count(feature)).order_by()
distribution = dict((vald[feature], vald[feature + '__count']) for vald in query_distribution) # query_distribution is of the form [{'featureval': 'value1', 'featureval__count': 4},
# {'featureval': 'value2', 'featureval__count': 2}, ...]
distribution = dict((vald[feature], vald[feature + '__count'])
for vald in query_distribution)
# distribution is of the form {'value1': 4, 'value2': 2, ...} # distribution is of the form {'value1': 4, 'value2': 2, ...}
# change none to no_data for valid json key # change none to no_data for valid json key
...@@ -65,7 +77,9 @@ def profile_distribution(course_id, feature): ...@@ -65,7 +77,9 @@ def profile_distribution(course_id, feature):
distribution['no_data'] = distribution.pop(None) distribution['no_data'] = distribution.pop(None)
# django does not properly count NULL values, so the above will alwasy be 0. # django does not properly count NULL values, so the above will alwasy be 0.
# this correctly counts null values # this correctly counts null values
distribution['no_data'] = profiles.filter(**{feature: None}).count() distribution['no_data'] = profiles.filter(
**{feature: None}
).count()
feature_results['data'] = distribution feature_results['data'] = distribution
feature_results['type'] = 'OPEN_CHOICE' feature_results['type'] = 'OPEN_CHOICE'
......
...@@ -17,3 +17,10 @@ class TestInstructorAPIHelpers(TestCase): ...@@ -17,3 +17,10 @@ class TestInstructorAPIHelpers(TestCase):
for (stng, lst) in zip(strings, lists): for (stng, lst) in zip(strings, lists):
self.assertEqual(_split_input_list(stng), lst) self.assertEqual(_split_input_list(stng), lst)
def test_split_input_list_unicode(self):
self.assertEqual(_split_input_list('robot@robot.edu, robot2@robot.edu'), ['robot@robot.edu', 'robot2@robot.edu'])
self.assertEqual(_split_input_list(u'robot@robot.edu, robot2@robot.edu'), ['robot@robot.edu', 'robot2@robot.edu'])
self.assertEqual(_split_input_list(u'robot@robot.edu, robot2@robot.edu'), [u'robot@robot.edu', 'robot2@robot.edu'])
scary_unistuff = unichr(40960) + u'abcd' + unichr(1972)
self.assertEqual(_split_input_list(scary_unistuff), [scary_unistuff])
...@@ -98,7 +98,10 @@ def students_update_enrollment(request, course_id): ...@@ -98,7 +98,10 @@ def students_update_enrollment(request, course_id):
) )
action = request.GET.get('action') action = request.GET.get('action')
emails = _split_input_list(request.GET.get('emails')) emails_raw = request.GET.get('emails')
print "@@@@"
print type(emails_raw)
emails = _split_input_list(emails_raw)
auto_enroll = request.GET.get('auto_enroll') in ['true', 'True', True] auto_enroll = request.GET.get('auto_enroll') in ['true', 'True', True]
def format_result(func, email): def format_result(func, email):
...@@ -340,6 +343,9 @@ def profile_distribution(request, course_id): ...@@ -340,6 +343,9 @@ def profile_distribution(request, course_id):
@ensure_csrf_cookie @ensure_csrf_cookie
@cache_control(no_cache=True, no_store=True, must_revalidate=True) @cache_control(no_cache=True, no_store=True, must_revalidate=True)
@require_query_params(
student_email="email of student for whom to get progress url"
)
def get_student_progress_url(request, course_id): def get_student_progress_url(request, course_id):
""" """
Get the progress url of a student. Get the progress url of a student.
...@@ -355,8 +361,6 @@ def get_student_progress_url(request, course_id): ...@@ -355,8 +361,6 @@ def get_student_progress_url(request, course_id):
) )
student_email = request.GET.get('student_email') student_email = request.GET.get('student_email')
if not student_email:
return HttpResponseBadRequest()
user = User.objects.get(email=student_email) user = User.objects.get(email=student_email)
progress_url = reverse('student_progress', kwargs={'course_id': course_id, 'student_id': user.id}) progress_url = reverse('student_progress', kwargs={'course_id': course_id, 'student_id': user.id})
...@@ -650,7 +654,7 @@ def _msk_from_problem_urlname(course_id, urlname): ...@@ -650,7 +654,7 @@ def _msk_from_problem_urlname(course_id, urlname):
Convert a 'problem urlname' (instructor input name) Convert a 'problem urlname' (instructor input name)
to a module state key (db field) to a module state key (db field)
""" """
if urlname[-4:] == ".xml": if urlname.endswith(".xml"):
urlname = urlname[:-4] urlname = urlname[:-4]
urlname = "problem/" + urlname urlname = "problem/" + urlname
......
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