diff --git a/.pylintrc b/.pylintrc index 2f2be69eb0..49fcf80eb9 100644 --- a/.pylintrc +++ b/.pylintrc @@ -35,6 +35,7 @@ load-plugins= # it should appear only once). disable= # C0301: Line too long +# C0302: Too many lines in module # W0141: Used builtin function 'map' # W0142: Used * or ** magic # R0201: Method could be a function @@ -42,8 +43,11 @@ disable= # R0902: Too many instance attributes # R0903: Too few public methods (1/2) # R0904: Too many public methods +# R0911: Too many return statements +# R0912: Too many branches # R0913: Too many arguments - C0301,W0141,W0142,R0201,R0901,R0902,R0903,R0904,R0913 +# R0914: Too many local variables + C0301,C0302,W0141,W0142,R0201,R0901,R0902,R0903,R0904,R0911,R0912,R0913,R0914 [REPORTS] @@ -92,7 +96,7 @@ zope=no # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E0201 when accessed. Python regular # expressions are accepted. -generated-members=REQUEST,acl_users,aq_parent,objects,DoesNotExist,can_read,can_write,get_url,size +generated-members=REQUEST,acl_users,aq_parent,objects,DoesNotExist,can_read,can_write,get_url,size,content [BASIC] diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 6d047050be..4140beb2da 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -1,3 +1,5 @@ +if (!window.CmsUtils) window.CmsUtils = {}; + var $body; var $modal; var $modalCover; @@ -91,7 +93,7 @@ $(document).ready(function () { $('a[rel*="view"][href^="#"]').bind('click', smoothScrollLink); // tender feedback window scrolling - $('a.show-tender').bind('click', smoothScrollTop); + $('a.show-tender').bind('click', window.CmsUtils.smoothScrollTop); // toggling footer additional support $('.cta-show-sock').bind('click', toggleSock); @@ -172,7 +174,10 @@ function smoothScrollLink(e) { }); } -function smoothScrollTop(e) { +// On AWS instances, this base.js gets wrapped in a separate scope as part of Django static +// pipelining (note, this doesn't happen on local runtimes). So if we set it on window, +// when we can access it from other scopes (namely Course Advanced Settings). +window.CmsUtils.smoothScrollTop = function (e) { (e).preventDefault(); $.smoothScroll({ diff --git a/cms/static/js/views/settings/advanced_view.js b/cms/static/js/views/settings/advanced_view.js index 9c62499773..c1392831b8 100644 --- a/cms/static/js/views/settings/advanced_view.js +++ b/cms/static/js/views/settings/advanced_view.js @@ -130,7 +130,7 @@ CMS.Views.Settings.Advanced = CMS.Views.ValidatingView.extend({ } }, saveView : function(event) { - smoothScrollTop(event); + window.CmsUtils.smoothScrollTop(event); // TODO one last verification scan: // call validateKey on each to ensure proper format // check for dupes diff --git a/lms/djangoapps/instructor/management/commands/dump_grades.py b/lms/djangoapps/instructor/management/commands/dump_grades.py index 13f86c0e0f..3707ad33ed 100644 --- a/lms/djangoapps/instructor/management/commands/dump_grades.py +++ b/lms/djangoapps/instructor/management/commands/dump_grades.py @@ -3,17 +3,12 @@ # django management command: dump grades to csv files # for use by batch processes -import os -import sys -import string -import datetime -import json +import csv -from instructor.views import * +from instructor.views import get_student_grade_summary_data from courseware.courses import get_course_by_id from xmodule.modulestore.django import modulestore -from django.conf import settings from django.core.management.base import BaseCommand @@ -45,7 +40,7 @@ class Command(BaseCommand): request = self.DummyRequest() try: course = get_course_by_id(course_id) - except Exception as err: + except Exception: if course_id in modulestore().courses: course = modulestore().courses[course_id] else: diff --git a/lms/djangoapps/instructor/views.py b/lms/djangoapps/instructor/views.py index 762b993504..a3b4f42bf7 100644 --- a/lms/djangoapps/instructor/views.py +++ b/lms/djangoapps/instructor/views.py @@ -11,7 +11,6 @@ import requests from requests.status_codes import codes import urllib from collections import OrderedDict -import json from StringIO import StringIO @@ -21,7 +20,6 @@ from django.http import HttpResponse from django_future.csrf import ensure_csrf_cookie from django.views.decorators.cache import cache_control from mitxmako.shortcuts import render_to_response -import requests from django.core.urlresolvers import reverse from courseware import grades @@ -36,11 +34,7 @@ from django_comment_client.models import (Role, from django_comment_client.utils import has_forum_access from psychometrics import psychoanalyze from student.models import CourseEnrollment, CourseEnrollmentAllowed -from xmodule.course_module import CourseDescriptor -from xmodule.modulestore import Location from xmodule.modulestore.django import modulestore -from xmodule.modulestore.exceptions import InvalidLocationError, ItemNotFoundError, NoPathToItem -from xmodule.modulestore.search import path_to_location import xmodule.graders as xmgraders import track.views @@ -48,14 +42,15 @@ from .offline_gradecalc import student_grades, offline_grades_available log = logging.getLogger(__name__) -template_imports = {'urllib': urllib} - # internal commands for managing forum roles: FORUM_ROLE_ADD = 'add' FORUM_ROLE_REMOVE = 'remove' def split_by_comma_and_whitespace(s): + """ + Return string s, split by , or whitespace + """ return re.split(r'[\s,]', s) @@ -141,7 +136,7 @@ def instructor_dashboard(request, course_id): # 'beta', so adding it to get_access_group_name doesn't really make # sense. name = course_beta_test_group_name(course.location) - (group, created) = Group.objects.get_or_create(name=name) + (group, _) = Group.objects.get_or_create(name=name) return group # process actions from form POST @@ -237,13 +232,13 @@ def instructor_dashboard(request, course_id): if '/' not in problem_to_reset: # allow state of modules other than problem to be reset problem_to_reset = "problem/" + problem_to_reset # but problem is the default try: - (org, course_name, run) = course_id.split("/") + (org, course_name, _) = course_id.split("/") module_state_key = "i4x://" + org + "/" + course_name + "/" + problem_to_reset module_to_reset = StudentModule.objects.get(student_id=student_to_reset.id, course_id=course_id, module_state_key=module_state_key) msg += "Found module to reset. " - except Exception as e: + except Exception: msg += "Couldn't find module with that urlname. " if "Delete student state for problem" in action: @@ -352,7 +347,7 @@ def instructor_dashboard(request, course_id): return_csv('', datatable, fp=fp) fp.seek(0) files = {'datafile': fp} - msg2, dataset = _do_remote_gradebook(request.user, course, 'post-grades', files=files) + msg2, _ = _do_remote_gradebook(request.user, course, 'post-grades', files=files) msg += msg2 @@ -423,7 +418,7 @@ def instructor_dashboard(request, course_id): datatable = {'header': ['username', 'email'] + profkeys} def getdat(u): p = u.profile - return [u.username, u.email] + [getattr(p,x,'') for x in profkeys] + return [u.username, u.email] + [getattr(p, x, '') for x in profkeys] datatable['data'] = [getdat(u) for u in enrolled_students] datatable['title'] = 'Student profile data for course %s' % course_id @@ -433,17 +428,17 @@ def instructor_dashboard(request, course_id): elif 'Download CSV of all responses to problem' in action: problem_to_dump = request.POST.get('problem_to_dump','') - if problem_to_dump[-4:]==".xml": - problem_to_dump=problem_to_dump[:-4] + if problem_to_dump[-4:] == ".xml": + problem_to_dump = problem_to_dump[:-4] try: - (org, course_name, run)=course_id.split("/") - module_state_key="i4x://"+org+"/"+course_name+"/problem/"+problem_to_dump + (org, course_name, run) = course_id.split("/") + module_state_key = "i4x://" + org + "/" + course_name + "/problem/" + problem_to_dump smdat = StudentModule.objects.filter(course_id=course_id, module_state_key=module_state_key) smdat = smdat.order_by('student') msg += "Found %d records to dump " % len(smdat) except Exception as err: - msg+="Couldn't find module with that urlname. " + msg += "Couldn't find module with that urlname. " msg += "
%s" % escape(err) smdat = [] @@ -741,7 +736,7 @@ def _list_course_forum_members(course_id, rolename, datatable): # make sure datatable is set up properly for display first, before checking for errors datatable['header'] = ['Username', 'Full name', 'Roles'] datatable['title'] = 'List of Forum {0}s in course {1}'.format(rolename, course_id) - datatable['data'] = []; + datatable['data'] = [] try: role = Role.objects.get(name=rolename, course_id=course_id) except Role.DoesNotExist: @@ -923,7 +918,7 @@ def get_student_grade_summary_data(request, course, course_id, get_grades=True, datarow = [student.id, student.username, student.profile.name, student.email] try: datarow.append(student.externalauthmap.external_email) - except: # ExternalAuthMap.DoesNotExist + except: # ExternalAuthMap.DoesNotExist datarow.append('') if get_grades: @@ -1040,7 +1035,8 @@ def _do_enroll_students(course, course_id, students, overload=False): datatable['data'] = [[x, status[x]] for x in status] datatable['title'] = 'Enrollment of students' - def sf(stat): return [x for x in status if status[x] == stat] + def sf(stat): + return [x for x in status if status[x] == stat] data = dict(added=sf('added'), rejected=sf('rejected') + sf('exists'), deleted=sf('deleted'), datatable=datatable) @@ -1136,7 +1132,7 @@ def dump_grading_context(course): ''' msg = "-----------------------------------------------------------------------------\n" msg += "Course grader:\n" - + msg += '%s\n' % course.grader.__class__ graders = {} if isinstance(course.grader, xmgraders.WeightedSubsectionsGrader): @@ -1151,7 +1147,7 @@ def dump_grading_context(course): gc = 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) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 78da00bf2b..cb617d609d 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -27,8 +27,6 @@ from mitxmako.shortcuts import render_to_string log = logging.getLogger(__name__) -template_imports = {'urllib': urllib} - system = ModuleSystem( ajax_url=None, track_function=None, diff --git a/lms/static/images/university/delft/delft-cover.jpg b/lms/static/images/university/delft/delft-cover.jpg index e69c836908..fe41928b41 100644 Binary files a/lms/static/images/university/delft/delft-cover.jpg and b/lms/static/images/university/delft/delft-cover.jpg differ