From 5d066db1bfd7a6f10cb7514501abb9c16440b47d Mon Sep 17 00:00:00 2001 From: Carson Gee Date: Mon, 30 Sep 2013 21:31:29 -0400 Subject: [PATCH 01/15] Add feature to do auto signup with external auth This adds a feature flag: AUTH_USE_MIT_CERTIFICATES_IMMEDIATE_SIGNUP that does an automatic signup of users if they are using external authentcation. --- common/djangoapps/external_auth/views.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/common/djangoapps/external_auth/views.py b/common/djangoapps/external_auth/views.py index 587295578081..2583b7bd2019 100644 --- a/common/djangoapps/external_auth/views.py +++ b/common/djangoapps/external_auth/views.py @@ -250,6 +250,19 @@ def _signup(request, eamap): # save this for use by student.views.create_account request.session['ExternalAuthMap'] = eamap + if settings.MITX_FEATURES.get('AUTH_USE_MIT_CERTIFICATES_IMMEDIATE_SIGNUP',''): + # do signin immediately, by calling create_account, instead of asking + # student to fill in form. MIT students already have information filed. + username = eamap.external_email.split('@',1)[0] + username = username.replace('.','_') + post_vars = dict(username = username, + honor_code = u'true', + terms_of_service = u'true', + ) + log.info('doing immediate signup for %s, params=%s' % (username, post_vars)) + student.views.create_account(request, post_vars) + return redirect('/') + # default conjoin name, no spaces, flattened to ascii b/c django can't handle unicode usernames, sadly # but this only affects username, not fullname username = re.sub(r'\s', '', _flatten_to_ascii(eamap.external_name), flags=re.UNICODE) From 0f324baaca090b9ede527c061527b899c9496e01 Mon Sep 17 00:00:00 2001 From: Carson Gee Date: Mon, 7 Oct 2013 11:50:58 -0400 Subject: [PATCH 02/15] Fixed PEP8 and indentation issues --- common/djangoapps/external_auth/views.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/common/djangoapps/external_auth/views.py b/common/djangoapps/external_auth/views.py index 2583b7bd2019..1d341312452a 100644 --- a/common/djangoapps/external_auth/views.py +++ b/common/djangoapps/external_auth/views.py @@ -250,15 +250,14 @@ def _signup(request, eamap): # save this for use by student.views.create_account request.session['ExternalAuthMap'] = eamap - if settings.MITX_FEATURES.get('AUTH_USE_MIT_CERTIFICATES_IMMEDIATE_SIGNUP',''): + if settings.MITX_FEATURES.get('AUTH_USE_MIT_CERTIFICATES_IMMEDIATE_SIGNUP', ''): # do signin immediately, by calling create_account, instead of asking # student to fill in form. MIT students already have information filed. - username = eamap.external_email.split('@',1)[0] - username = username.replace('.','_') - post_vars = dict(username = username, - honor_code = u'true', - terms_of_service = u'true', - ) + username = eamap.external_email.split('@', 1)[0] + username = username.replace('.', '_') + post_vars = dict(username=username, + honor_code=u'true', + terms_of_service=u'true') log.info('doing immediate signup for %s, params=%s' % (username, post_vars)) student.views.create_account(request, post_vars) return redirect('/') From 96c7cb5ffdf82aced8fc8eff33e2469fb946fa81 Mon Sep 17 00:00:00 2001 From: Carson Gee Date: Mon, 25 Nov 2013 12:58:08 -0500 Subject: [PATCH 03/15] Added tests for signup skipping --- AUTHORS | 1 + .../external_auth/tests/test_ssl.py | 138 ++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 common/djangoapps/external_auth/tests/test_ssl.py diff --git a/AUTHORS b/AUTHORS index 60ac912d49ed..700bc6e63879 100644 --- a/AUTHORS +++ b/AUTHORS @@ -98,3 +98,4 @@ Olivier Marquez Florian Dufour Manuel Freire Daniel Cebrián Robles +Carson Gee diff --git a/common/djangoapps/external_auth/tests/test_ssl.py b/common/djangoapps/external_auth/tests/test_ssl.py new file mode 100644 index 000000000000..f933784d4c86 --- /dev/null +++ b/common/djangoapps/external_auth/tests/test_ssl.py @@ -0,0 +1,138 @@ +""" +Provides unit tests for SSL based authentication portions +of the external_auth app. +""" + +import unittest + +from django.conf import settings +from django.contrib.auth.models import AnonymousUser, User +from django.contrib.sessions.middleware import SessionMiddleware +from django.core.urlresolvers import reverse +from django.test import TestCase +from django.test.client import Client +from django.test.client import RequestFactory +from django.test.utils import override_settings + +from external_auth.models import ExternalAuthMap +import external_auth.views + +MITX_FEATURES_WITH_SSL_AUTH = settings.MITX_FEATURES.copy() +MITX_FEATURES_WITH_SSL_AUTH['AUTH_USE_MIT_CERTIFICATES'] = True +MITX_FEATURES_WITH_SSL_AUTH_IMMEDIATE_SIGNUP = MITX_FEATURES_WITH_SSL_AUTH.copy() +MITX_FEATURES_WITH_SSL_AUTH_IMMEDIATE_SIGNUP['AUTH_USE_MIT_CERTIFICATES_IMMEDIATE_SIGNUP'] = True + + +@override_settings(MITX_FEATURES=MITX_FEATURES_WITH_SSL_AUTH) +class SSLClientTest(TestCase): + """ + Tests SSL Authentication code sections of external_auth + """ + + AUTH_DN = '/C=US/ST=Massachusetts/O=Massachusetts Institute of Technology/OU=Client CA v1/CN={0}/emailAddress={1}' + USER_NAME = 'test_user_ssl' + USER_EMAIL = 'test_user_ssl@EDX.ORG' + + def _create_ssl_request(self, url): + """Creates a basic request for SSL use.""" + request = self.factory.get(url) + request.META['SSL_CLIENT_S_DN'] = self.AUTH_DN.format(self.USER_NAME, self.USER_EMAIL) + request.user = AnonymousUser() + middleware = SessionMiddleware() + middleware.process_request(request) + request.session.save() + return request + + def setUp(self): + """Setup test case by adding primary user.""" + super(TestCase, self).setUp() + self.client = Client() + self.factory = RequestFactory() + + @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') + def test_ssl_login_with_signup_lms(self): + """ + Validate that an SSL login creates an eamap user and + redirects them to the signup page. + """ + + response = external_auth.views.ssl_login(self._create_ssl_request('/')) + + # Response should contain template for signup form, eamap should have user, and internal + # auth should not have a user + self.assertIn('
Date: Mon, 25 Nov 2013 14:17:42 -0500 Subject: [PATCH 04/15] Corrected CMS tests so that one is passing, added external_auth to cms apps Several pylint fixes and bad super call --- cms/envs/common.py | 3 +++ .../external_auth/tests/test_ssl.py | 27 ++++++++++--------- common/djangoapps/external_auth/views.py | 2 +- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/cms/envs/common.py b/cms/envs/common.py index 8e2788a86a0e..5d0e56a4d19c 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -385,6 +385,9 @@ 'student', # misleading name due to sharing with lms 'course_groups', # not used in cms (yet), but tests run + # External auth (OpenID, shib, SSL) + 'external_auth', + # Tracking 'track', 'eventtracking.django', diff --git a/common/djangoapps/external_auth/tests/test_ssl.py b/common/djangoapps/external_auth/tests/test_ssl.py index f933784d4c86..8d6438a41bd6 100644 --- a/common/djangoapps/external_auth/tests/test_ssl.py +++ b/common/djangoapps/external_auth/tests/test_ssl.py @@ -45,7 +45,7 @@ def _create_ssl_request(self, url): def setUp(self): """Setup test case by adding primary user.""" - super(TestCase, self).setUp() + super(SSLClientTest, self).setUp() self.client = Client() self.factory = RequestFactory() @@ -62,7 +62,7 @@ def test_ssl_login_with_signup_lms(self): # auth should not have a user self.assertIn(' Date: Mon, 25 Nov 2013 17:08:18 -0500 Subject: [PATCH 05/15] Removing external_auth addition to cms, and skipping test --- cms/envs/common.py | 3 --- common/djangoapps/external_auth/tests/test_ssl.py | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cms/envs/common.py b/cms/envs/common.py index 5d0e56a4d19c..8e2788a86a0e 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -385,9 +385,6 @@ 'student', # misleading name due to sharing with lms 'course_groups', # not used in cms (yet), but tests run - # External auth (OpenID, shib, SSL) - 'external_auth', - # Tracking 'track', 'eventtracking.django', diff --git a/common/djangoapps/external_auth/tests/test_ssl.py b/common/djangoapps/external_auth/tests/test_ssl.py index 8d6438a41bd6..b5eb60de0d1f 100644 --- a/common/djangoapps/external_auth/tests/test_ssl.py +++ b/common/djangoapps/external_auth/tests/test_ssl.py @@ -115,6 +115,7 @@ def test_ssl_login_without_signup_lms(self): @unittest.skipUnless(settings.ROOT_URLCONF == 'cms.urls', 'Test only valid in cms') @override_settings(MITX_FEATURES=MITX_FEATURES_WITH_SSL_AUTH_IMMEDIATE_SIGNUP) + @unittest.skip def test_ssl_login_without_signup_cms(self): """ Test IMMEDIATE_SIGNUP feature flag and ensure the user account is From a0fa9d0b148f6d05f8cd8e1afa2aa0e3004abdb9 Mon Sep 17 00:00:00 2001 From: Greg Price Date: Fri, 22 Nov 2013 17:48:29 -0500 Subject: [PATCH 06/15] Refactor keypress activation for forum buttons This removes the use of the space key to activate buttons, which is not expected behavior. --- common/static/coffee/src/discussion/utils.coffee | 5 +++++ .../discussion/views/discussion_content_view.coffee | 13 ++----------- .../views/discussion_thread_profile_view.coffee | 3 ++- .../views/discussion_thread_show_view.coffee | 6 ++++-- .../views/thread_response_show_view.coffee | 3 ++- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/common/static/coffee/src/discussion/utils.coffee b/common/static/coffee/src/discussion/utils.coffee index 89014c5f57f1..53509b35e0ff 100644 --- a/common/static/coffee/src/discussion/utils.coffee +++ b/common/static/coffee/src/discussion/utils.coffee @@ -87,6 +87,11 @@ class @DiscussionUtil "notifications_status" : "/notification_prefs/status" }[name] + @activateOnEnter: (event, func) -> + if event.which == 13 + e.preventDefault() + func(event) + @makeFocusTrap: (elem) -> elem.keydown( (event) -> diff --git a/common/static/coffee/src/discussion/views/discussion_content_view.coffee b/common/static/coffee/src/discussion/views/discussion_content_view.coffee index c69595589720..9c3c4a01f53e 100644 --- a/common/static/coffee/src/discussion/views/discussion_content_view.coffee +++ b/common/static/coffee/src/discussion/views/discussion_content_view.coffee @@ -4,7 +4,8 @@ if Backbone? events: "click .discussion-flag-abuse": "toggleFlagAbuse" - "keypress .discussion-flag-abuse": "toggleFlagAbuseKeypress" + "keypress .discussion-flag-abuse": + (event) -> DiscussionUtil.activateOnEnter(event, toggleFlagAbuse) attrRenderer: endorsed: (endorsed) -> @@ -106,11 +107,6 @@ if Backbone? @model.bind('change', @renderPartialAttrs, @) - toggleFollowingKeypress: (event) -> - # Activate on spacebar or enter - if event.which == 32 or event.which == 13 - @toggleFollowing(event) - toggleFollowing: (event) -> event.preventDefault() $elem = $(event.target) @@ -126,11 +122,6 @@ if Backbone? url: url type: "POST" - toggleFlagAbuseKeypress: (event) -> - # Activate on spacebar or enter - if event.which == 32 or event.which == 13 - @toggleFlagAbuse(event) - toggleFlagAbuse: (event) -> event.preventDefault() if window.user.id in @model.get("abuse_flaggers") or (DiscussionUtil.isFlagModerator and @model.get("abuse_flaggers").length > 0) diff --git a/common/static/coffee/src/discussion/views/discussion_thread_profile_view.coffee b/common/static/coffee/src/discussion/views/discussion_thread_profile_view.coffee index b8cecbf39b34..7130ac555c71 100644 --- a/common/static/coffee/src/discussion/views/discussion_thread_profile_view.coffee +++ b/common/static/coffee/src/discussion/views/discussion_thread_profile_view.coffee @@ -4,7 +4,8 @@ if Backbone? events: "click .discussion-vote": "toggleVote" "click .action-follow": "toggleFollowing" - "keypress .action-follow": "toggleFollowingKeypress" + "keypress .action-follow": + (event) -> DiscussionUtil.activateOnEnter(event, toggleFollowing) "click .expand-post": "expandPost" "click .collapse-post": "collapsePost" diff --git a/common/static/coffee/src/discussion/views/discussion_thread_show_view.coffee b/common/static/coffee/src/discussion/views/discussion_thread_show_view.coffee index b5f478a8afb9..1a3f8929e131 100644 --- a/common/static/coffee/src/discussion/views/discussion_thread_show_view.coffee +++ b/common/static/coffee/src/discussion/views/discussion_thread_show_view.coffee @@ -4,10 +4,12 @@ if Backbone? events: "click .discussion-vote": "toggleVote" "click .discussion-flag-abuse": "toggleFlagAbuse" - "keypress .discussion-flag-abuse": "toggleFlagAbuseKeypress" + "keypress .discussion-flag-abuse": + (event) -> DiscussionUtil.activateOnEnter(event, toggleFlagAbuse) "click .admin-pin": "togglePin" "click .action-follow": "toggleFollowing" - "keypress .action-follow": "toggleFollowingKeypress" + "keypress .action-follow": + (event) -> DiscussionUtil.activateOnEnter(event, toggleFollowing) "click .action-edit": "edit" "click .action-delete": "_delete" "click .action-openclose": "toggleClosed" diff --git a/common/static/coffee/src/discussion/views/thread_response_show_view.coffee b/common/static/coffee/src/discussion/views/thread_response_show_view.coffee index aaff4a4a3911..eaed0568c2dd 100644 --- a/common/static/coffee/src/discussion/views/thread_response_show_view.coffee +++ b/common/static/coffee/src/discussion/views/thread_response_show_view.coffee @@ -6,7 +6,8 @@ if Backbone? "click .action-delete": "_delete" "click .action-edit": "edit" "click .discussion-flag-abuse": "toggleFlagAbuse" - "keypress .discussion-flag-abuse": "toggleFlagAbuseKeypress" + "keypress .discussion-flag-abuse": + (event) -> DiscussionUtil.activateOnEnter(event, toggleFlagAbuse) $: (selector) -> @$el.find(selector) From 81798dd8be9f72f2ab7f61f9aa2526320a6a5ce7 Mon Sep 17 00:00:00 2001 From: Greg Price Date: Fri, 22 Nov 2013 17:50:39 -0500 Subject: [PATCH 07/15] Improve accessibility of inline discussions The show/hide toggle now properly acts like a button, and focus is now trapped on the loading element for both the show/hide action and loading of a new page. --- CHANGELOG.rst | 2 ++ .../coffee/src/discussion/discussion_module_view.coffee | 4 ++++ common/static/coffee/src/discussion/utils.coffee | 9 ++++++--- lms/templates/discussion/_discussion_module.html | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8e2ff9f89627..a9926ad9e627 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -20,6 +20,8 @@ Studio: Continued modification of Studio pages to follow a RESTful framework. includes Settings pages, edit page for Subsection and Unit, and interfaces for updating xblocks (xmodules) and getting their editing HTML. +LMS: Improve accessibility of inline discussions in courseware. + Blades: Put 2nd "Hide output" button at top of test box & increase text size for code response questions. BLD-126. diff --git a/common/static/coffee/src/discussion/discussion_module_view.coffee b/common/static/coffee/src/discussion/discussion_module_view.coffee index f99eba3872e7..e23215561e80 100644 --- a/common/static/coffee/src/discussion/discussion_module_view.coffee +++ b/common/static/coffee/src/discussion/discussion_module_view.coffee @@ -2,6 +2,8 @@ if Backbone? class @DiscussionModuleView extends Backbone.View events: "click .discussion-show": "toggleDiscussion" + "keypress .discussion-show": + (event) -> DiscussionUtil.activateOnEnter(event, toggleDiscussion) "click .new-post-btn": "toggleNewPost" "click .new-post-cancel": "hideNewPost" "click .discussion-paginator a": "navigateToPage" @@ -70,6 +72,7 @@ if Backbone? DiscussionUtil.safeAjax $elem: $elem $loading: $elem + takeFocus: true url: url type: "GET" dataType: 'json' @@ -77,6 +80,7 @@ if Backbone? error: error renderDiscussion: ($elem, response, textStatus, discussionId) => + $elem.focus() window.user = new DiscussionUser(response.user_info) Content.loadContentInfos(response.annotated_content_info) DiscussionUtil.loadRoles(response.roles) diff --git a/common/static/coffee/src/discussion/utils.coffee b/common/static/coffee/src/discussion/utils.coffee index 53509b35e0ff..466beff4191b 100644 --- a/common/static/coffee/src/discussion/utils.coffee +++ b/common/static/coffee/src/discussion/utils.coffee @@ -2,9 +2,12 @@ $ -> if !window.$$contents window.$$contents = {} $.fn.extend - loading: -> - @$_loading = $("
Loading content
") + loading: (takeFocus) -> + @$_loading = $("
Loading content
") $(this).after(@$_loading) + if takeFocus + DiscussionUtil.makeFocusTrap(@$_loading) + @$_loading.focus() loaded: -> @$_loading.remove() @@ -132,7 +135,7 @@ class @DiscussionUtil if params["loadingCallback"]? params["loadingCallback"].apply(params["$loading"]) else - params["$loading"].loading() + params["$loading"].loading(params["takeFocus"]) if !params["error"] params["error"] = => @discussionAlert( diff --git a/lms/templates/discussion/_discussion_module.html b/lms/templates/discussion/_discussion_module.html index 37f8052520b2..00f6c94801a9 100644 --- a/lms/templates/discussion/_discussion_module.html +++ b/lms/templates/discussion/_discussion_module.html @@ -2,6 +2,6 @@ <%include file="_underscore_templates.html" /> From 8f013871788097d3e93d763f92331f6163499b62 Mon Sep 17 00:00:00 2001 From: polesye Date: Mon, 2 Dec 2013 10:25:43 +0200 Subject: [PATCH 08/15] BLD-525: Fix Numerical input to support mathematical operations. --- CHANGELOG.rst | 2 ++ .../lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee | 4 ++-- common/lib/xmodule/xmodule/js/src/problem/edit.coffee | 8 +++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e2ebb76e53cc..e654098fb1f0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,6 +5,8 @@ These are notable changes in edx-platform. This is a rolling list of changes, in roughly chronological order, most recent first. Add your entries at or near the top. Include a label indicating the component affected. +Blades: Fix Numerical input to support mathematical operations. BLD-525. + Blades: Improve calculator's tooltip accessibility. Add possibility to navigate through the hints via arrow keys. BLD-533. diff --git a/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee b/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee index ea1341cc23e5..d7f163dd0233 100644 --- a/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee +++ b/common/lib/xmodule/xmodule/js/spec/problem/edit_spec.coffee @@ -100,7 +100,7 @@ describe 'MarkdownEditingDescriptor', -> = 3.14159 +- .02 Enter the approximate value of 502*9: - = 4518 +- 15% + = 502*9 +- 15% Enter the number of fingers on a human hand: = 5 @@ -125,7 +125,7 @@ describe 'MarkdownEditingDescriptor', ->

Enter the approximate value of 502*9:

- + diff --git a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee index 9f5d36100949..3115a46a9ad1 100644 --- a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee +++ b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee @@ -234,12 +234,14 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor floatValue = parseFloat(answersList[0]); if(!isNaN(floatValue)) { - var params = /(.*?)\+\-\s*(.*?$)/.exec(answersList[0]); + var params = /(.*?)\+\-\s*(.*?$)/.exec(answersList[0]), + answer = answersList[0].replace(/\s+/g, ''); if(params) { - string = '\n'; + answer = params[1].replace(/\s+/g, ''); + string = '\n'; string += ' \n'; } else { - string = '\n'; + string = '\n'; } string += ' \n'; string += '\n\n'; From 9dc68b03a02578767c55686f371129c00f078883 Mon Sep 17 00:00:00 2001 From: Don Mitchell Date: Wed, 27 Nov 2013 10:01:10 -0500 Subject: [PATCH 09/15] Improve auth handling of Locators Ensure user admin screen gets the union of all possibly matching group names. Smarter default group naming. STUD-1003 --- cms/djangoapps/auth/authz.py | 130 ++++++++++++------ .../contentstore/tests/test_permissions.py | 127 +++++++++++++++++ .../contentstore/tests/test_users.py | 16 +-- cms/djangoapps/contentstore/views/course.py | 4 +- cms/djangoapps/contentstore/views/user.py | 63 ++++----- 5 files changed, 246 insertions(+), 94 deletions(-) create mode 100644 cms/djangoapps/contentstore/tests/test_permissions.py diff --git a/cms/djangoapps/auth/authz.py b/cms/djangoapps/auth/authz.py index c4d1a9ddffb3..1a1f138cb588 100644 --- a/cms/djangoapps/auth/authz.py +++ b/cms/djangoapps/auth/authz.py @@ -1,3 +1,6 @@ +""" +Studio authorization functions primarily for course creators, instructors, and staff +""" #======================================================================================================================= # # This code is somewhat duplicative of access.py in the LMS. We will unify the code as a separate story @@ -11,7 +14,8 @@ from xmodule.modulestore import Location from xmodule.modulestore.locator import CourseLocator, Locator from xmodule.modulestore.django import loc_mapper -from xmodule.modulestore.exceptions import InvalidLocationError +from xmodule.modulestore.exceptions import InvalidLocationError, ItemNotFoundError +import itertools # define a couple of simple roles, we just need ADMIN and EDITOR now for our purposes @@ -26,7 +30,11 @@ # of those two variables -def get_course_groupname_for_role(location, role): +def get_all_course_role_groupnames(location, role, use_filter=True): + ''' + Get all of the possible groupnames for this role location pair. If use_filter==True, + only return the ones defined in the groups collection. + ''' location = Locator.to_locator_or_location(location) # hack: check for existence of a group name in the legacy LMS format _ @@ -38,22 +46,46 @@ def get_course_groupname_for_role(location, role): except InvalidLocationError: # will occur on old locations where location is not of category course pass if isinstance(location, Location): + # least preferred role_course format groupnames.append('{0}_{1}'.format(role, location.course)) + try: + locator = loc_mapper().translate_location(location.course_id, location, False, False) + groupnames.append('{0}_{1}'.format(role, locator.course_id)) + except (InvalidLocationError, ItemNotFoundError): + pass elif isinstance(location, CourseLocator): old_location = loc_mapper().translate_locator_to_location(location, get_course=True) if old_location: + # the slashified version of the course_id (myu/mycourse/myrun) groupnames.append('{0}_{1}'.format(role, old_location.course_id)) - - for groupname in groupnames: - if Group.objects.filter(name=groupname).exists(): - return groupname - return groupnames[0] + # add the least desirable but sometimes occurring format. + groupnames.append('{0}_{1}'.format(role, old_location.course)) + # filter to the ones which exist + default = groupnames[0] + if use_filter: + groupnames = [group for group in groupnames if Group.objects.filter(name=group).exists()] + return groupnames, default -def get_users_in_course_group_by_role(location, role): - groupname = get_course_groupname_for_role(location, role) - (group, _created) = Group.objects.get_or_create(name=groupname) - return group.user_set.all() +def get_course_groupname_for_role(location, role): + ''' + Get the preferred used groupname for this role, location combo. + Preference order: + * role_course_id (e.g., staff_myu.mycourse.myrun) + * role_old_course_id (e.g., staff_myu/mycourse/myrun) + * role_old_course (e.g., staff_mycourse) + ''' + groupnames, default = get_all_course_role_groupnames(location, role) + return groupnames[0] if groupnames else default + + +def get_course_role_users(course_locator, role): + ''' + Get all of the users with the given role in the given course. + ''' + groupnames, _ = get_all_course_role_groupnames(course_locator, role) + groups = [Group.objects.get(name=groupname) for groupname in groupnames] + return list(itertools.chain.from_iterable(group.user_set.all() for group in groups)) def create_all_course_groups(creator, location): @@ -65,11 +97,11 @@ def create_all_course_groups(creator, location): def create_new_course_group(creator, location, role): - groupname = get_course_groupname_for_role(location, role) - (group, created) = Group.objects.get_or_create(name=groupname) - if created: - group.save() - + ''' + Create the new course group always using the preferred name even if another form already exists. + ''' + groupnames, __ = get_all_course_role_groupnames(location, role, use_filter=False) + group, __ = Group.objects.get_or_create(name=groupnames[0]) creator.groups.add(group) creator.save() @@ -82,15 +114,13 @@ def _delete_course_group(location): asserted permissions """ # remove all memberships - instructors = Group.objects.get(name=get_course_groupname_for_role(location, INSTRUCTOR_ROLE_NAME)) - for user in instructors.user_set.all(): - user.groups.remove(instructors) - user.save() - - staff = Group.objects.get(name=get_course_groupname_for_role(location, STAFF_ROLE_NAME)) - for user in staff.user_set.all(): - user.groups.remove(staff) - user.save() + for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: + groupnames, _ = get_all_course_role_groupnames(location, role) + for groupname in groupnames: + group = Group.objects.get(name=groupname) + for user in group.user_set.all(): + user.groups.remove(group) + user.save() def _copy_course_group(source, dest): @@ -98,25 +128,25 @@ def _copy_course_group(source, dest): This is to be called only by either a command line code path or through an app which has already asserted permissions to do this action """ - instructors = Group.objects.get(name=get_course_groupname_for_role(source, INSTRUCTOR_ROLE_NAME)) - new_instructors_group = Group.objects.get(name=get_course_groupname_for_role(dest, INSTRUCTOR_ROLE_NAME)) - for user in instructors.user_set.all(): - user.groups.add(new_instructors_group) - user.save() - - staff = Group.objects.get(name=get_course_groupname_for_role(source, STAFF_ROLE_NAME)) - new_staff_group = Group.objects.get(name=get_course_groupname_for_role(dest, STAFF_ROLE_NAME)) - for user in staff.user_set.all(): - user.groups.add(new_staff_group) - user.save() + for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: + groupnames, _ = get_all_course_role_groupnames(source, role) + for groupname in groupnames: + group = Group.objects.get(name=groupname) + new_group, _ = Group.objects.get_or_create(name=get_course_groupname_for_role(dest, INSTRUCTOR_ROLE_NAME)) + for user in group.user_set.all(): + user.groups.add(new_group) + user.save() def add_user_to_course_group(caller, user, location, role): + """ + If caller is authorized, add the given user to the given course's role + """ # only admins can add/remove other users if not is_user_in_course_group_role(caller, location, INSTRUCTOR_ROLE_NAME): raise PermissionDenied - group = Group.objects.get(name=get_course_groupname_for_role(location, role)) + group, _ = Group.objects.get_or_create(name=get_course_groupname_for_role(location, role)) return _add_user_to_group(user, group) @@ -132,9 +162,7 @@ def add_user_to_creator_group(caller, user): if not caller.is_active or not caller.is_authenticated or not caller.is_staff: raise PermissionDenied - (group, created) = Group.objects.get_or_create(name=COURSE_CREATOR_GROUP_NAME) - if created: - group.save() + (group, _) = Group.objects.get_or_create(name=COURSE_CREATOR_GROUP_NAME) return _add_user_to_group(user, group) @@ -152,6 +180,9 @@ def _add_user_to_group(user, group): def get_user_by_email(email): + """ + Get the user whose email is the arg. Return None if no such user exists. + """ user = None # try to look up user, return None if not found try: @@ -163,13 +194,21 @@ def get_user_by_email(email): def remove_user_from_course_group(caller, user, location, role): + """ + If caller is authorized, remove the given course x role authorization for user + """ # only admins can add/remove other users if not is_user_in_course_group_role(caller, location, INSTRUCTOR_ROLE_NAME): raise PermissionDenied # see if the user is actually in that role, if not then we don't have to do anything - if is_user_in_course_group_role(user, location, role): - _remove_user_from_group(user, get_course_groupname_for_role(location, role)) + groupnames, _ = get_all_course_role_groupnames(location, role) + for groupname in groupnames: + groups = user.groups.filter(name=groupname) + if groups: + # will only be one with that name + user.groups.remove(groups[0]) + user.save() def remove_user_from_creator_group(caller, user): @@ -195,11 +234,16 @@ def _remove_user_from_group(user, group_name): def is_user_in_course_group_role(user, location, role, check_staff=True): + """ + Check whether the given user has the given role in this course. If check_staff + then give permission if the user is staff without doing a course-role query. + """ if user.is_active and user.is_authenticated: # all "is_staff" flagged accounts belong to all groups if check_staff and user.is_staff: return True - return user.groups.filter(name=get_course_groupname_for_role(location, role)).exists() + groupnames, _ = get_all_course_role_groupnames(location, role) + return any(user.groups.filter(name=groupname).exists() for groupname in groupnames) return False diff --git a/cms/djangoapps/contentstore/tests/test_permissions.py b/cms/djangoapps/contentstore/tests/test_permissions.py new file mode 100644 index 000000000000..6dae9d883171 --- /dev/null +++ b/cms/djangoapps/contentstore/tests/test_permissions.py @@ -0,0 +1,127 @@ +""" +Test CRUD for authorization. +""" +from django.test.utils import override_settings +from django.contrib.auth.models import User, Group + +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from contentstore.tests.modulestore_config import TEST_MODULESTORE +from contentstore.tests.utils import AjaxEnabledTestClient +from xmodule.modulestore.django import loc_mapper +from xmodule.modulestore import Location +from auth.authz import INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME +from auth import authz +import copy +from contentstore.views.access import has_access + + +@override_settings(MODULESTORE=TEST_MODULESTORE) +class TestCourseAccess(ModuleStoreTestCase): + """ + Course-based access (as opposed to access of a non-course xblock) + """ + def setUp(self): + """ + Create a staff user and log them in (creating the client). + + Create a pool of users w/o granting them any permissions + """ + super(TestCourseAccess, self).setUp() + uname = 'testuser' + email = 'test+courses@edx.org' + password = 'foo' + + # Create the use so we can log them in. + self.user = User.objects.create_user(uname, email, password) + + # Note that we do not actually need to do anything + # for registration if we directly mark them active. + self.user.is_active = True + # Staff has access to view all courses + self.user.is_staff = True + self.user.save() + + self.client = AjaxEnabledTestClient() + self.client.login(username=uname, password=password) + + # create a course via the view handler which has a different strategy for permissions than the factory + self.course_location = Location(['i4x', 'myu', 'mydept.mycourse', 'course', 'myrun']) + self.course_locator = loc_mapper().translate_location( + self.course_location.course_id, self.course_location, False, True + ) + self.client.ajax_post( + self.course_locator.url_reverse('course'), + { + 'org': self.course_location.org, + 'number': self.course_location.course, + 'display_name': 'My favorite course', + 'run': self.course_location.name, + } + ) + + self.users = self._create_users() + + def _create_users(self): + """ + Create 8 users and return them + """ + users = [] + for i in range(8): + username = "user{}".format(i) + email = "test+user{}@edx.org".format(i) + user = User.objects.create_user(username, email, 'foo') + user.is_active = True + user.save() + users.append(user) + return users + + def tearDown(self): + """ + Reverse the setup + """ + self.client.logout() + ModuleStoreTestCase.tearDown(self) + + def test_get_all_users(self): + """ + Test getting all authors for a course where their permissions run the gamut of allowed group + types. + """ + # first check the groupname for the course creator. + self.assertTrue( + self.user.groups.filter( + name="{}_{}".format(INSTRUCTOR_ROLE_NAME, self.course_locator.course_id) + ).exists(), + "Didn't add creator as instructor." + ) + users = copy.copy(self.users) + user_by_role = {} + # add the misc users to the course in different groups + for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: + user_by_role[role] = [] + groupnames, _ = authz.get_all_course_role_groupnames(self.course_locator, role) + for groupname in groupnames: + group, _ = Group.objects.get_or_create(name=groupname) + user = users.pop() + user_by_role[role].append(user) + user.groups.add(group) + user.save() + self.assertTrue(has_access(user, self.course_locator), "{} does not have access".format(user)) + self.assertTrue(has_access(user, self.course_location), "{} does not have access".format(user)) + + response = self.client.get_html(self.course_locator.url_reverse('course_team')) + for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: + for user in user_by_role[role]: + self.assertContains(response, user.email) + + # test copying course permissions + copy_course_location = Location(['i4x', 'copyu', 'copydept.mycourse', 'course', 'myrun']) + copy_course_locator = loc_mapper().translate_location( + copy_course_location.course_id, copy_course_location, False, True + ) + # pylint: disable=protected-access + authz._copy_course_group(self.course_locator, copy_course_locator) + for role in [INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME]: + for user in user_by_role[role]: + self.assertTrue(has_access(user, copy_course_locator), "{} no copy access".format(user)) + self.assertTrue(has_access(user, copy_course_location), "{} no copy access".format(user)) \ No newline at end of file diff --git a/cms/djangoapps/contentstore/tests/test_users.py b/cms/djangoapps/contentstore/tests/test_users.py index c10dec61bd61..ec8b5570a534 100644 --- a/cms/djangoapps/contentstore/tests/test_users.py +++ b/cms/djangoapps/contentstore/tests/test_users.py @@ -29,8 +29,8 @@ def setUp(self): self.detail_url = self.location.url_reverse('course_team', self.ext_user.email) self.inactive_detail_url = self.location.url_reverse('course_team', self.inactive_user.email) self.invalid_detail_url = self.location.url_reverse('course_team', "nonexistent@user.com") - self.staff_groupname = get_course_groupname_for_role(self.course.location, "staff") - self.inst_groupname = get_course_groupname_for_role(self.course.location, "instructor") + self.staff_groupname = get_course_groupname_for_role(self.course_locator, "staff") + self.inst_groupname = get_course_groupname_for_role(self.course_locator, "instructor") def test_index(self): resp = self.client.get(self.index_url, HTTP_ACCEPT='text/html') @@ -145,18 +145,6 @@ def test_detail_post_missing_role(self): self.assertIn("error", result) self.assert_not_enrolled() - def test_detail_post_bad_json(self): - resp = self.client.post( - self.detail_url, - data="{foo}", - content_type="application/json", - HTTP_ACCEPT="application/json", - ) - self.assertEqual(resp.status_code, 400) - result = json.loads(resp.content) - self.assertIn("error", result) - self.assert_not_enrolled() - def test_detail_post_no_json(self): resp = self.client.post( self.detail_url, diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index 044ef79473bf..c7e379869b30 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -292,7 +292,8 @@ def create_new_course(request): initialize_course_tabs(new_course) - create_all_course_groups(request.user, new_course.location) + new_location = loc_mapper().translate_location(new_course.location.course_id, new_course.location, False, True) + create_all_course_groups(request.user, new_location) # seed the forums seed_permissions_roles(new_course.location.course_id) @@ -301,7 +302,6 @@ def create_new_course(request): # work. CourseEnrollment.enroll(request.user, new_course.location.course_id) - new_location = loc_mapper().translate_location(new_course.location.course_id, new_course.location, False, True) return JsonResponse({'url': new_location.url_reverse("course/", "")}) diff --git a/cms/djangoapps/contentstore/views/user.py b/cms/djangoapps/contentstore/views/user.py index 6f2a2fbdec9f..d68aaeff7b6b 100644 --- a/cms/djangoapps/contentstore/views/user.py +++ b/cms/djangoapps/contentstore/views/user.py @@ -1,5 +1,4 @@ import json -from django.conf import settings from django.core.exceptions import PermissionDenied from django.contrib.auth.models import User, Group from django.contrib.auth.decorators import login_required @@ -10,9 +9,11 @@ from mitxmako.shortcuts import render_to_response from xmodule.modulestore.django import modulestore, loc_mapper -from util.json_request import JsonResponse +from util.json_request import JsonResponse, expect_json from auth.authz import ( - STAFF_ROLE_NAME, INSTRUCTOR_ROLE_NAME, get_course_groupname_for_role) + STAFF_ROLE_NAME, INSTRUCTOR_ROLE_NAME, get_course_groupname_for_role, + get_course_role_users +) from course_creators.views import user_requested_access from .access import has_access @@ -35,6 +36,7 @@ def request_course_creator(request): return JsonResponse({"Status": "OK"}) +# pylint: disable=unused-argument @login_required @ensure_csrf_cookie @require_http_methods(("GET", "POST", "PUT", "DELETE")) @@ -62,38 +64,39 @@ def course_team_handler(request, tag=None, course_id=None, branch=None, version_ return HttpResponseNotFound() -def _manage_users(request, location): +def _manage_users(request, locator): """ This view will return all CMS users who are editors for the specified course """ - old_location = loc_mapper().translate_locator_to_location(location) + old_location = loc_mapper().translate_locator_to_location(locator) # check that logged in user has permissions to this item - if not has_access(request.user, location, role=INSTRUCTOR_ROLE_NAME) and not has_access(request.user, location, role=STAFF_ROLE_NAME): + if not has_access(request.user, locator): raise PermissionDenied() course_module = modulestore().get_item(old_location) - - staff_groupname = get_course_groupname_for_role(location, "staff") - staff_group, __ = Group.objects.get_or_create(name=staff_groupname) - inst_groupname = get_course_groupname_for_role(location, "instructor") - inst_group, __ = Group.objects.get_or_create(name=inst_groupname) + instructors = get_course_role_users(locator, INSTRUCTOR_ROLE_NAME) + # the page only lists staff and assumes they're a superset of instructors. Do a union to ensure. + staff = set(get_course_role_users(locator, STAFF_ROLE_NAME)).union(instructors) return render_to_response('manage_users.html', { 'context_course': course_module, - 'staff': staff_group.user_set.all(), - 'instructors': inst_group.user_set.all(), - 'allow_actions': has_access(request.user, location, role=INSTRUCTOR_ROLE_NAME), + 'staff': staff, + 'instructors': instructors, + 'allow_actions': has_access(request.user, locator, role=INSTRUCTOR_ROLE_NAME), }) -def _course_team_user(request, location, email): - old_location = loc_mapper().translate_locator_to_location(location) +@expect_json +def _course_team_user(request, locator, email): + """ + Handle the add, remove, promote, demote requests ensuring the requester has authority + """ # check that logged in user has permissions to this item - if has_access(request.user, location, role=INSTRUCTOR_ROLE_NAME): + if has_access(request.user, locator, role=INSTRUCTOR_ROLE_NAME): # instructors have full permissions pass - elif has_access(request.user, location, role=STAFF_ROLE_NAME) and email == request.user.email: + elif has_access(request.user, locator, role=STAFF_ROLE_NAME) and email == request.user.email: # staff can only affect themselves pass else: @@ -123,7 +126,7 @@ def _course_team_user(request, location, email): # what's the highest role that this user has? groupnames = set(g.name for g in user.groups.all()) for role in roles: - role_groupname = get_course_groupname_for_role(old_location, role) + role_groupname = get_course_groupname_for_role(locator, role) if role_groupname in groupnames: msg["role"] = role break @@ -139,7 +142,7 @@ def _course_team_user(request, location, email): # make sure that the role groups exist groups = {} for role in roles: - groupname = get_course_groupname_for_role(old_location, role) + groupname = get_course_groupname_for_role(locator, role) group, __ = Group.objects.get_or_create(name=groupname) groups[role] = group @@ -162,22 +165,13 @@ def _course_team_user(request, location, email): return JsonResponse() # all other operations require the requesting user to specify a role - if request.META.get("CONTENT_TYPE", "").startswith("application/json") and request.body: - try: - payload = json.loads(request.body) - except: - return JsonResponse({"error": _("malformed JSON")}, 400) - try: - role = payload["role"] - except KeyError: - return JsonResponse({"error": _("`role` is required")}, 400) - else: - if not "role" in request.POST: - return JsonResponse({"error": _("`role` is required")}, 400) - role = request.POST["role"] + role = request.json.get("role", request.POST.get("role")) + if role is None: + return JsonResponse({"error": _("`role` is required")}, 400) + old_location = loc_mapper().translate_locator_to_location(locator) if role == "instructor": - if not has_access(request.user, location, role=INSTRUCTOR_ROLE_NAME): + if not has_access(request.user, locator, role=INSTRUCTOR_ROLE_NAME): msg = { "error": _("Only instructors may create other instructors") } @@ -203,4 +197,3 @@ def _course_team_user(request, location, email): CourseEnrollment.enroll(user, old_location.course_id) return JsonResponse() - From ddb24833676460e4a61f9c497ccdc1fbc982ba21 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Mon, 2 Dec 2013 15:48:05 -0500 Subject: [PATCH 10/15] Update the XBlock version. --- requirements/edx/github.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/edx/github.txt b/requirements/edx/github.txt index 3f00a7c9159d..798c40f6bd3c 100644 --- a/requirements/edx/github.txt +++ b/requirements/edx/github.txt @@ -15,7 +15,7 @@ -e git+https://github.com/eventbrite/zendesk.git@d53fe0e81b623f084e91776bcf6369f8b7b63879#egg=zendesk # Our libraries: --e git+https://github.com/edx/XBlock.git@341d162f353289cfd3974a4f4f9354ce81ab60db#egg=XBlock +-e git+https://github.com/edx/XBlock.git@c54c63cf8294c54512887e6232d4274003afc6e3#egg=XBlock -e git+https://github.com/edx/codejail.git@0a1b468#egg=codejail -e git+https://github.com/edx/diff-cover.git@v0.2.6#egg=diff_cover -e git+https://github.com/edx/js-test-tool.git@v0.1.4#egg=js_test_tool From 78149d0ae42332367774fd9209804ba3f2f9145d Mon Sep 17 00:00:00 2001 From: polesye Date: Tue, 3 Dec 2013 09:08:44 +0200 Subject: [PATCH 11/15] Add comment. --- common/lib/xmodule/xmodule/js/src/problem/edit.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee index 3115a46a9ad1..d50cbae86574 100644 --- a/common/lib/xmodule/xmodule/js/src/problem/edit.coffee +++ b/common/lib/xmodule/xmodule/js/src/problem/edit.coffee @@ -234,6 +234,7 @@ class @MarkdownEditingDescriptor extends XModule.Descriptor floatValue = parseFloat(answersList[0]); if(!isNaN(floatValue)) { + // Tries to extract parameters from string like 'expr +- tolerance' var params = /(.*?)\+\-\s*(.*?$)/.exec(answersList[0]), answer = answersList[0].replace(/\s+/g, ''); if(params) { From 41d82dfcc1a444ad3b9e8c4219c4268f0b0e3270 Mon Sep 17 00:00:00 2001 From: polesye Date: Tue, 3 Dec 2013 17:21:04 +0200 Subject: [PATCH 12/15] BLD-542: Add display name. --- common/lib/xmodule/xmodule/lti_module.py | 1 + 1 file changed, 1 insertion(+) diff --git a/common/lib/xmodule/xmodule/lti_module.py b/common/lib/xmodule/xmodule/lti_module.py index 12bca979dbac..c499f38af901 100644 --- a/common/lib/xmodule/xmodule/lti_module.py +++ b/common/lib/xmodule/xmodule/lti_module.py @@ -83,6 +83,7 @@ class LTIFields(object): https://github.com/idan/oauthlib/blob/master/oauthlib/oauth1/rfc5849/signature.py#L136 """ + display_name = String(display_name="Display Name", help="Display name for this module", scope=Scope.settings, default="LTI") lti_id = String(help="Id of the tool", default='', scope=Scope.settings) launch_url = String(help="URL of the tool", default='http://www.example.com', scope=Scope.settings) custom_parameters = List(help="Custom parameters (vbid, book_location, etc..)", scope=Scope.settings) From 599bdbb1023534ceddb815f6334fc447d2419d10 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 3 Dec 2013 14:05:33 -0500 Subject: [PATCH 13/15] Show full diffs in ResponseType tests. --- common/lib/capa/capa/tests/test_responsetypes.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/lib/capa/capa/tests/test_responsetypes.py b/common/lib/capa/capa/tests/test_responsetypes.py index 99b3f1d52c7e..6b400dc65308 100644 --- a/common/lib/capa/capa/tests/test_responsetypes.py +++ b/common/lib/capa/capa/tests/test_responsetypes.py @@ -29,6 +29,9 @@ class ResponseTest(unittest.TestCase): xml_factory_class = None + # If something is wrong, show it to us. + maxDiff = None + def setUp(self): if self.xml_factory_class: self.xml_factory = self.xml_factory_class() From 8eff442752b6ca6720b8d97373102140427f3486 Mon Sep 17 00:00:00 2001 From: David Baumgold Date: Mon, 2 Dec 2013 11:37:07 -0500 Subject: [PATCH 14/15] mitxmako => edxmako --- cms/djangoapps/contentstore/views/assets.py | 2 +- cms/djangoapps/contentstore/views/checklist.py | 2 +- cms/djangoapps/contentstore/views/component.py | 2 +- cms/djangoapps/contentstore/views/course.py | 2 +- cms/djangoapps/contentstore/views/dev.py | 2 +- cms/djangoapps/contentstore/views/error.py | 2 +- cms/djangoapps/contentstore/views/helpers.py | 2 +- cms/djangoapps/contentstore/views/import_export.py | 2 +- cms/djangoapps/contentstore/views/item.py | 2 +- cms/djangoapps/contentstore/views/preview.py | 2 +- cms/djangoapps/contentstore/views/public.py | 2 +- cms/djangoapps/contentstore/views/tabs.py | 2 +- cms/djangoapps/contentstore/views/user.py | 2 +- cms/djangoapps/course_creators/admin.py | 2 +- cms/envs/acceptance.py | 2 +- cms/envs/common.py | 4 ++-- cms/envs/dev.py | 2 +- cms/envs/test.py | 2 +- common/djangoapps/course_groups/views.py | 2 +- common/djangoapps/course_modes/views.py | 2 +- common/djangoapps/{mitxmako => edxmako}/README | 0 common/djangoapps/{mitxmako => edxmako}/__init__.py | 0 .../djangoapps/{mitxmako => edxmako}/makoloader.py | 2 +- .../{mitxmako => edxmako}/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../management/commands/preprocess_assets.py | 0 .../djangoapps/{mitxmako => edxmako}/middleware.py | 0 common/djangoapps/{mitxmako => edxmako}/shortcuts.py | 10 +++++----- common/djangoapps/{mitxmako => edxmako}/startup.py | 4 ++-- common/djangoapps/{mitxmako => edxmako}/template.py | 12 ++++++------ .../{mitxmako => edxmako}/templatetag_helpers.py | 0 common/djangoapps/{mitxmako => edxmako}/tests.py | 4 ++-- common/djangoapps/external_auth/views.py | 2 +- common/djangoapps/pipeline_js/views.py | 2 +- common/djangoapps/pipeline_mako/__init__.py | 2 +- .../student/management/commands/massemail.py | 6 +++--- .../student/management/commands/massemailtxt.py | 6 +++--- common/djangoapps/student/views.py | 2 +- common/djangoapps/track/views.py | 2 +- common/djangoapps/util/views.py | 2 +- common/djangoapps/xmodule_modifiers.py | 2 +- .../xmodule/modulestore/tests/django_utils.py | 6 +++--- docs/internal/overview.md | 2 +- lms/djangoapps/branding/views.py | 4 ++-- lms/djangoapps/circuit/views.py | 2 +- lms/djangoapps/courseware/module_render.py | 2 +- lms/djangoapps/courseware/tests/__init__.py | 2 +- lms/djangoapps/courseware/tests/test_views.py | 2 +- lms/djangoapps/courseware/views.py | 2 +- lms/djangoapps/dashboard/views.py | 2 +- lms/djangoapps/debug/views.py | 2 +- lms/djangoapps/django_comment_client/base/views.py | 2 +- lms/djangoapps/django_comment_client/forum/views.py | 2 +- lms/djangoapps/django_comment_client/utils.py | 4 ++-- lms/djangoapps/instructor/enrollment.py | 2 +- lms/djangoapps/instructor/hint_manager.py | 2 +- .../instructor/views/instructor_dashboard.py | 2 +- lms/djangoapps/instructor/views/legacy.py | 2 +- lms/djangoapps/licenses/views.py | 2 +- lms/djangoapps/multicourse/views.py | 2 +- lms/djangoapps/notes/views.py | 2 +- lms/djangoapps/notification_prefs/views.py | 2 +- .../open_ended_grading/open_ended_notifications.py | 2 +- .../open_ended_grading/staff_grading_service.py | 2 +- lms/djangoapps/open_ended_grading/tests.py | 2 +- lms/djangoapps/open_ended_grading/utils.py | 2 +- lms/djangoapps/open_ended_grading/views.py | 4 ++-- lms/djangoapps/shoppingcart/models.py | 2 +- .../shoppingcart/processors/CyberSource.py | 2 +- lms/djangoapps/shoppingcart/tests/payment_fake.py | 2 +- lms/djangoapps/shoppingcart/tests/test_views.py | 2 +- lms/djangoapps/shoppingcart/views.py | 2 +- lms/djangoapps/static_template_view/views.py | 2 +- lms/djangoapps/staticbook/views.py | 2 +- lms/djangoapps/verify_student/views.py | 2 +- lms/envs/acceptance.py | 2 +- lms/envs/cms/dev.py | 2 +- lms/envs/cms/mixed_dev.py | 2 +- lms/envs/common.py | 10 +++++----- lms/envs/dev_ike.py | 2 +- lms/envs/dev_mongo.py | 2 +- 81 files changed, 99 insertions(+), 99 deletions(-) rename common/djangoapps/{mitxmako => edxmako}/README (100%) rename common/djangoapps/{mitxmako => edxmako}/__init__.py (100%) rename common/djangoapps/{mitxmako => edxmako}/makoloader.py (98%) rename common/djangoapps/{mitxmako => edxmako}/management/__init__.py (100%) rename common/djangoapps/{mitxmako => edxmako}/management/commands/__init__.py (100%) rename common/djangoapps/{mitxmako => edxmako}/management/commands/preprocess_assets.py (100%) rename common/djangoapps/{mitxmako => edxmako}/middleware.py (100%) rename common/djangoapps/{mitxmako => edxmako}/shortcuts.py (94%) rename common/djangoapps/{mitxmako => edxmako}/startup.py (94%) rename common/djangoapps/{mitxmako => edxmako}/template.py (88%) rename common/djangoapps/{mitxmako => edxmako}/templatetag_helpers.py (100%) rename common/djangoapps/{mitxmako => edxmako}/tests.py (92%) diff --git a/cms/djangoapps/contentstore/views/assets.py b/cms/djangoapps/contentstore/views/assets.py index 7f2fab96f3ea..ed3588d8958e 100644 --- a/cms/djangoapps/contentstore/views/assets.py +++ b/cms/djangoapps/contentstore/views/assets.py @@ -7,7 +7,7 @@ from django_future.csrf import ensure_csrf_cookie from django.views.decorators.http import require_POST -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from cache_toolbox.core import del_cached_content from xmodule.contentstore.django import contentstore diff --git a/cms/djangoapps/contentstore/views/checklist.py b/cms/djangoapps/contentstore/views/checklist.py index 61c6c672a73f..7326c3d16b53 100644 --- a/cms/djangoapps/contentstore/views/checklist.py +++ b/cms/djangoapps/contentstore/views/checklist.py @@ -6,7 +6,7 @@ from django.contrib.auth.decorators import login_required from django.views.decorators.http import require_http_methods from django_future.csrf import ensure_csrf_cookie -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from django.http import HttpResponseNotFound from django.core.exceptions import PermissionDenied from xmodule.modulestore.django import loc_mapper diff --git a/cms/djangoapps/contentstore/views/component.py b/cms/djangoapps/contentstore/views/component.py index 3742c7af203e..269b603effc0 100644 --- a/cms/djangoapps/contentstore/views/component.py +++ b/cms/djangoapps/contentstore/views/component.py @@ -9,7 +9,7 @@ from django_future.csrf import ensure_csrf_cookie from django.conf import settings from xmodule.modulestore.exceptions import ItemNotFoundError -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from xmodule.modulestore.django import modulestore from xmodule.util.date_utils import get_default_time_display diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index 044ef79473bf..a92708bd69dc 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -16,7 +16,7 @@ from django.core.urlresolvers import reverse from django.http import HttpResponseBadRequest, HttpResponseNotFound from util.json_request import JsonResponse -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from xmodule.error_module import ErrorDescriptor from xmodule.modulestore.django import modulestore, loc_mapper diff --git a/cms/djangoapps/contentstore/views/dev.py b/cms/djangoapps/contentstore/views/dev.py index 0fcc355c117b..6bda59abddff 100644 --- a/cms/djangoapps/contentstore/views/dev.py +++ b/cms/djangoapps/contentstore/views/dev.py @@ -4,7 +4,7 @@ in a 404 error. """ # pylint: disable=W0613 -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response def dev_mode(request): diff --git a/cms/djangoapps/contentstore/views/error.py b/cms/djangoapps/contentstore/views/error.py index 56499a69acb9..9983987d29ef 100644 --- a/cms/djangoapps/contentstore/views/error.py +++ b/cms/djangoapps/contentstore/views/error.py @@ -2,7 +2,7 @@ from django.http import (HttpResponse, HttpResponseServerError, HttpResponseNotFound) -from mitxmako.shortcuts import render_to_string, render_to_response +from edxmako.shortcuts import render_to_string, render_to_response import functools import json diff --git a/cms/djangoapps/contentstore/views/helpers.py b/cms/djangoapps/contentstore/views/helpers.py index abbf84755ef3..a10a489c9aa3 100644 --- a/cms/djangoapps/contentstore/views/helpers.py +++ b/cms/djangoapps/contentstore/views/helpers.py @@ -1,6 +1,6 @@ from django.http import HttpResponse from django.shortcuts import redirect -from mitxmako.shortcuts import render_to_string, render_to_response +from edxmako.shortcuts import render_to_string, render_to_response __all__ = ['edge', 'event', 'landing'] diff --git a/cms/djangoapps/contentstore/views/import_export.py b/cms/djangoapps/contentstore/views/import_export.py index f740d10707e5..c36d30a34d87 100644 --- a/cms/djangoapps/contentstore/views/import_export.py +++ b/cms/djangoapps/contentstore/views/import_export.py @@ -21,7 +21,7 @@ from django.views.decorators.http import require_http_methods, require_GET from django.utils.translation import ugettext as _ -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from auth.authz import create_all_course_groups from xmodule.modulestore.xml_importer import import_from_xml diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index 220da038a781..0a85eb7765cd 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -30,7 +30,7 @@ from django.http import HttpResponseBadRequest from xblock.fields import Scope from preview import handler_prefix, get_preview_html -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string from models.settings.course_grading import CourseGradingModel __all__ = ['orphan_handler', 'xblock_handler'] diff --git a/cms/djangoapps/contentstore/views/preview.py b/cms/djangoapps/contentstore/views/preview.py index 123d7fbadbdd..3f5bfbfa6079 100644 --- a/cms/djangoapps/contentstore/views/preview.py +++ b/cms/djangoapps/contentstore/views/preview.py @@ -5,7 +5,7 @@ from django.core.urlresolvers import reverse from django.http import Http404, HttpResponseBadRequest from django.contrib.auth.decorators import login_required -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string from xmodule_modifiers import replace_static_urls, wrap_xblock from xmodule.error_module import ErrorDescriptor diff --git a/cms/djangoapps/contentstore/views/public.py b/cms/djangoapps/contentstore/views/public.py index 9ab03a409331..c7857af0c0a9 100644 --- a/cms/djangoapps/contentstore/views/public.py +++ b/cms/djangoapps/contentstore/views/public.py @@ -6,7 +6,7 @@ from django.shortcuts import redirect from django.conf import settings -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from external_auth.views import ssl_login_shortcut diff --git a/cms/djangoapps/contentstore/views/tabs.py b/cms/djangoapps/contentstore/views/tabs.py index 46791ddc26f3..cf0ab42ffb4a 100644 --- a/cms/djangoapps/contentstore/views/tabs.py +++ b/cms/djangoapps/contentstore/views/tabs.py @@ -9,7 +9,7 @@ from django.core.exceptions import PermissionDenied from django_future.csrf import ensure_csrf_cookie from django.views.decorators.http import require_http_methods -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from xmodule.modulestore import Location from xmodule.modulestore.inheritance import own_metadata from xmodule.modulestore.django import modulestore diff --git a/cms/djangoapps/contentstore/views/user.py b/cms/djangoapps/contentstore/views/user.py index 6f2a2fbdec9f..50120bad3861 100644 --- a/cms/djangoapps/contentstore/views/user.py +++ b/cms/djangoapps/contentstore/views/user.py @@ -7,7 +7,7 @@ from django.utils.translation import ugettext as _ from django.views.decorators.http import require_POST from django_future.csrf import ensure_csrf_cookie -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from xmodule.modulestore.django import modulestore, loc_mapper from util.json_request import JsonResponse diff --git a/cms/djangoapps/course_creators/admin.py b/cms/djangoapps/course_creators/admin.py index df2baa1aa26b..87e17fabfa90 100644 --- a/cms/djangoapps/course_creators/admin.py +++ b/cms/djangoapps/course_creators/admin.py @@ -8,7 +8,7 @@ from ratelimitbackend import admin from django.conf import settings from django.dispatch import receiver -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from django.core.mail import send_mail from smtplib import SMTPException diff --git a/cms/envs/acceptance.py b/cms/envs/acceptance.py index 1a9621a221f4..afbdff7d3f0c 100644 --- a/cms/envs/acceptance.py +++ b/cms/envs/acceptance.py @@ -34,7 +34,7 @@ def seed(): MODULESTORE_OPTIONS = { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': TEST_ROOT / "data", - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } MODULESTORE = { diff --git a/cms/envs/common.py b/cms/envs/common.py index 8e2788a86a0e..961a089a14f0 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -161,7 +161,7 @@ 'django.contrib.messages.middleware.MessageMiddleware', 'track.middleware.TrackMiddleware', - 'mitxmako.middleware.MakoMiddleware', + 'edxmako.middleware.MakoMiddleware', # Detects user-requested locale from 'accept-language' header in http request 'django.middleware.locale.LocaleMiddleware', @@ -393,7 +393,7 @@ 'datadog', # For asset pipelining - 'mitxmako', + 'edxmako', 'pipeline', 'staticfiles', 'static_replace', diff --git a/cms/envs/dev.py b/cms/envs/dev.py index ea66688a8a01..ddf1708c875f 100644 --- a/cms/envs/dev.py +++ b/cms/envs/dev.py @@ -30,7 +30,7 @@ modulestore_options = { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': GITHUB_REPO_ROOT, - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } MODULESTORE = { diff --git a/cms/envs/test.py b/cms/envs/test.py index c64e0ef1e893..ef7133e0bd60 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -60,7 +60,7 @@ MODULESTORE_OPTIONS = { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': TEST_ROOT / "data", - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } MODULESTORE = { diff --git a/common/djangoapps/course_groups/views.py b/common/djangoapps/course_groups/views.py index 764f6c301d14..fb1a99a6aa02 100644 --- a/common/djangoapps/course_groups/views.py +++ b/common/djangoapps/course_groups/views.py @@ -9,7 +9,7 @@ import re from courseware.courses import get_course_with_access -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from . import cohorts diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py index 7c4bb3a1f787..f3dca5d08f8a 100644 --- a/common/djangoapps/course_modes/views.py +++ b/common/djangoapps/course_modes/views.py @@ -13,7 +13,7 @@ from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from course_modes.models import CourseMode from courseware.access import has_access diff --git a/common/djangoapps/mitxmako/README b/common/djangoapps/edxmako/README similarity index 100% rename from common/djangoapps/mitxmako/README rename to common/djangoapps/edxmako/README diff --git a/common/djangoapps/mitxmako/__init__.py b/common/djangoapps/edxmako/__init__.py similarity index 100% rename from common/djangoapps/mitxmako/__init__.py rename to common/djangoapps/edxmako/__init__.py diff --git a/common/djangoapps/mitxmako/makoloader.py b/common/djangoapps/edxmako/makoloader.py similarity index 98% rename from common/djangoapps/mitxmako/makoloader.py rename to common/djangoapps/edxmako/makoloader.py index 06ae2219e642..8e741f994608 100644 --- a/common/djangoapps/mitxmako/makoloader.py +++ b/common/djangoapps/edxmako/makoloader.py @@ -6,7 +6,7 @@ from django.template.loaders.filesystem import Loader as FilesystemLoader from django.template.loaders.app_directories import Loader as AppDirectoriesLoader -from mitxmako.template import Template +from edxmako.template import Template import tempdir diff --git a/common/djangoapps/mitxmako/management/__init__.py b/common/djangoapps/edxmako/management/__init__.py similarity index 100% rename from common/djangoapps/mitxmako/management/__init__.py rename to common/djangoapps/edxmako/management/__init__.py diff --git a/common/djangoapps/mitxmako/management/commands/__init__.py b/common/djangoapps/edxmako/management/commands/__init__.py similarity index 100% rename from common/djangoapps/mitxmako/management/commands/__init__.py rename to common/djangoapps/edxmako/management/commands/__init__.py diff --git a/common/djangoapps/mitxmako/management/commands/preprocess_assets.py b/common/djangoapps/edxmako/management/commands/preprocess_assets.py similarity index 100% rename from common/djangoapps/mitxmako/management/commands/preprocess_assets.py rename to common/djangoapps/edxmako/management/commands/preprocess_assets.py diff --git a/common/djangoapps/mitxmako/middleware.py b/common/djangoapps/edxmako/middleware.py similarity index 100% rename from common/djangoapps/mitxmako/middleware.py rename to common/djangoapps/edxmako/middleware.py diff --git a/common/djangoapps/mitxmako/shortcuts.py b/common/djangoapps/edxmako/shortcuts.py similarity index 94% rename from common/djangoapps/mitxmako/shortcuts.py rename to common/djangoapps/edxmako/shortcuts.py index 356c80ced3f1..e83f1b028f31 100644 --- a/common/djangoapps/mitxmako/shortcuts.py +++ b/common/djangoapps/edxmako/shortcuts.py @@ -16,8 +16,8 @@ from django.http import HttpResponse import logging -import mitxmako -import mitxmako.middleware +import edxmako +import edxmako.middleware from django.conf import settings from django.core.urlresolvers import reverse log = logging.getLogger(__name__) @@ -81,15 +81,15 @@ def render_to_string(template_name, dictionary, context=None, namespace='main'): context_instance['marketing_link'] = marketing_link # In various testing contexts, there might not be a current request context. - if mitxmako.middleware.requestcontext is not None: - for d in mitxmako.middleware.requestcontext: + if edxmako.middleware.requestcontext is not None: + for d in edxmako.middleware.requestcontext: context_dictionary.update(d) for d in context_instance: context_dictionary.update(d) if context: context_dictionary.update(context) # fetch and render template - template = mitxmako.lookup[namespace].get_template(template_name) + template = edxmako.lookup[namespace].get_template(template_name) return template.render_unicode(**context_dictionary) diff --git a/common/djangoapps/mitxmako/startup.py b/common/djangoapps/edxmako/startup.py similarity index 94% rename from common/djangoapps/mitxmako/startup.py rename to common/djangoapps/edxmako/startup.py index db9483b36634..2b58deac2ea4 100644 --- a/common/djangoapps/mitxmako/startup.py +++ b/common/djangoapps/edxmako/startup.py @@ -6,7 +6,7 @@ from django.conf import settings from mako.lookup import TemplateLookup -import mitxmako +import edxmako def run(): @@ -30,4 +30,4 @@ def run(): encoding_errors='replace', ) - mitxmako.lookup = lookup + edxmako.lookup = lookup diff --git a/common/djangoapps/mitxmako/template.py b/common/djangoapps/edxmako/template.py similarity index 88% rename from common/djangoapps/mitxmako/template.py rename to common/djangoapps/edxmako/template.py index 7dfc6de026c3..d515425b1637 100644 --- a/common/djangoapps/mitxmako/template.py +++ b/common/djangoapps/edxmako/template.py @@ -14,10 +14,10 @@ from django.conf import settings from mako.template import Template as MakoTemplate -from mitxmako.shortcuts import marketing_link +from edxmako.shortcuts import marketing_link -import mitxmako -import mitxmako.middleware +import edxmako +import edxmako.middleware django_variables = ['lookup', 'output_encoding', 'encoding_errors'] @@ -34,7 +34,7 @@ class Template(MakoTemplate): def __init__(self, *args, **kwargs): """Overrides base __init__ to provide django variable overrides""" if not kwargs.get('no_django', False): - overrides = dict([(k, getattr(mitxmako, k, None),) for k in django_variables]) + overrides = dict([(k, getattr(edxmako, k, None),) for k in django_variables]) overrides['lookup'] = overrides['lookup']['main'] kwargs.update(overrides) super(Template, self).__init__(*args, **kwargs) @@ -48,8 +48,8 @@ def render(self, context_instance): context_dictionary = {} # In various testing contexts, there might not be a current request context. - if mitxmako.middleware.requestcontext is not None: - for d in mitxmako.middleware.requestcontext: + if edxmako.middleware.requestcontext is not None: + for d in edxmako.middleware.requestcontext: context_dictionary.update(d) for d in context_instance: context_dictionary.update(d) diff --git a/common/djangoapps/mitxmako/templatetag_helpers.py b/common/djangoapps/edxmako/templatetag_helpers.py similarity index 100% rename from common/djangoapps/mitxmako/templatetag_helpers.py rename to common/djangoapps/edxmako/templatetag_helpers.py diff --git a/common/djangoapps/mitxmako/tests.py b/common/djangoapps/edxmako/tests.py similarity index 92% rename from common/djangoapps/mitxmako/tests.py rename to common/djangoapps/edxmako/tests.py index e7e56a94724e..a4eb84eda8f2 100644 --- a/common/djangoapps/mitxmako/tests.py +++ b/common/djangoapps/edxmako/tests.py @@ -1,14 +1,14 @@ from django.test import TestCase from django.test.utils import override_settings from django.core.urlresolvers import reverse -from mitxmako.shortcuts import marketing_link +from edxmako.shortcuts import marketing_link from mock import patch from util.testing import UrlResetMixin class ShortcutsTests(UrlResetMixin, TestCase): """ - Test the mitxmako shortcuts file + Test the edxmako shortcuts file """ @override_settings(MKTG_URLS={'ROOT': 'dummy-root', 'ABOUT': '/about-us'}) @override_settings(MKTG_URL_LINK_MAP={'ABOUT': 'login'}) diff --git a/common/djangoapps/external_auth/views.py b/common/djangoapps/external_auth/views.py index a995dff22b56..aa7536c46095 100644 --- a/common/djangoapps/external_auth/views.py +++ b/common/djangoapps/external_auth/views.py @@ -28,7 +28,7 @@ from django.shortcuts import redirect from django.utils.translation import ugettext as _ -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string try: from django.views.decorators.csrf import csrf_exempt except ImportError: diff --git a/common/djangoapps/pipeline_js/views.py b/common/djangoapps/pipeline_js/views.py index 06b76900cf25..6cd97159d45b 100644 --- a/common/djangoapps/pipeline_js/views.py +++ b/common/djangoapps/pipeline_js/views.py @@ -5,7 +5,7 @@ from django.conf import settings from django.http import HttpResponse from staticfiles.storage import staticfiles_storage -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response def get_xmodule_urls(): diff --git a/common/djangoapps/pipeline_mako/__init__.py b/common/djangoapps/pipeline_mako/__init__.py index 1cdc287e2eae..ed343588dacc 100644 --- a/common/djangoapps/pipeline_mako/__init__.py +++ b/common/djangoapps/pipeline_mako/__init__.py @@ -1,4 +1,4 @@ -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from pipeline.conf import settings from pipeline.packager import Packager diff --git a/common/djangoapps/student/management/commands/massemail.py b/common/djangoapps/student/management/commands/massemail.py index a1864f048e68..5ce8afb41fdd 100644 --- a/common/djangoapps/student/management/commands/massemail.py +++ b/common/djangoapps/student/management/commands/massemail.py @@ -1,7 +1,7 @@ from django.core.management.base import BaseCommand from django.contrib.auth.models import User -import mitxmako +import edxmako class Command(BaseCommand): @@ -15,8 +15,8 @@ def handle(self, *args, **options): #text = open(args[0]).read() #subject = open(args[1]).read() users = User.objects.all() - text = mitxmako.lookup['main'].get_template('email/' + args[0] + ".txt").render() - subject = mitxmako.lookup['main'].get_template('email/' + args[0] + "_subject.txt").render().strip() + text = edxmako.lookup['main'].get_template('email/' + args[0] + ".txt").render() + subject = edxmako.lookup['main'].get_template('email/' + args[0] + "_subject.txt").render().strip() for user in users: if user.is_active: user.email_user(subject, text) diff --git a/common/djangoapps/student/management/commands/massemailtxt.py b/common/djangoapps/student/management/commands/massemailtxt.py index 0228acf9239a..1ff8557a2592 100644 --- a/common/djangoapps/student/management/commands/massemailtxt.py +++ b/common/djangoapps/student/management/commands/massemailtxt.py @@ -4,7 +4,7 @@ from django.core.management.base import BaseCommand from django.conf import settings -import mitxmako +import edxmako from django.core.mail import send_mass_mail import sys @@ -39,8 +39,8 @@ def handle(self, *args, **options): users = [u.strip() for u in open(user_file).readlines()] - message = mitxmako.lookup['main'].get_template('emails/' + message_base + "_body.txt").render() - subject = mitxmako.lookup['main'].get_template('emails/' + message_base + "_subject.txt").render().strip() + message = edxmako.lookup['main'].get_template('emails/' + message_base + "_body.txt").render() + subject = edxmako.lookup['main'].get_template('emails/' + message_base + "_subject.txt").render().strip() rate = int(ratestr) self.log_file = open(logfilename, "a+", buffering=0) diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 2c3099a67278..28c4e4f5fd4d 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -35,7 +35,7 @@ from ratelimitbackend.exceptions import RateLimitException -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string from course_modes.models import CourseMode from student.models import ( diff --git a/common/djangoapps/track/views.py b/common/djangoapps/track/views.py index e493babe5dda..ec052323957d 100644 --- a/common/djangoapps/track/views.py +++ b/common/djangoapps/track/views.py @@ -9,7 +9,7 @@ from django_future.csrf import ensure_csrf_cookie -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from track import tracker from track import contexts diff --git a/common/djangoapps/util/views.py b/common/djangoapps/util/views.py index 10492e383d54..b08c719baa50 100644 --- a/common/djangoapps/util/views.py +++ b/common/djangoapps/util/views.py @@ -9,7 +9,7 @@ from django.http import (Http404, HttpResponse, HttpResponseNotAllowed, HttpResponseServerError) from dogapi import dog_stats_api -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response import zendesk import calc diff --git a/common/djangoapps/xmodule_modifiers.py b/common/djangoapps/xmodule_modifiers.py index 6e6d01c28f4d..d46065d5a765 100644 --- a/common/djangoapps/xmodule_modifiers.py +++ b/common/djangoapps/xmodule_modifiers.py @@ -9,7 +9,7 @@ from django.conf import settings from django.utils.timezone import UTC -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from xblock.fragment import Fragment from xmodule.seq_module import SequenceModule diff --git a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py index 776543ec4eb4..16f756b233af 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py @@ -60,7 +60,7 @@ def mongo_store_config(data_dir): 'OPTIONS': { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': data_dir, - 'render_template': 'mitxmako.shortcuts.render_to_string' + 'render_template': 'edxmako.shortcuts.render_to_string' } } } @@ -77,7 +77,7 @@ def draft_mongo_store_config(data_dir): modulestore_options = { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': data_dir, - 'render_template': 'mitxmako.shortcuts.render_to_string' + 'render_template': 'edxmako.shortcuts.render_to_string' } store = { @@ -126,7 +126,7 @@ def studio_store_config(data_dir): options = { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': data_dir, - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } store = { diff --git a/docs/internal/overview.md b/docs/internal/overview.md index a74c512fbfb5..911c93ab2454 100644 --- a/docs/internal/overview.md +++ b/docs/internal/overview.md @@ -120,7 +120,7 @@ environments, defined in `cms/envs`. - javascript -- we use coffeescript, which compiles to js, and is much nicer to work with. Look for `*.coffee` files. We use _jasmine_ for testing js. -- _mako_ -- we use this for templates, and have wrapper called mitxmako that makes mako look like the django templating calls. +- _mako_ -- we use this for templates, and have wrapper called edxmako that makes mako look like the django templating calls. We use a fork of django-pipeline to make sure that the js and css always reflect the latest `*.coffee` and `*.sass` files (We're hoping to get our changes merged in the official version soon). This works differently in development and production. Test uses the production settings. diff --git a/lms/djangoapps/branding/views.py b/lms/djangoapps/branding/views.py index 3ce8dbd40177..215d442de547 100644 --- a/lms/djangoapps/branding/views.py +++ b/lms/djangoapps/branding/views.py @@ -3,12 +3,12 @@ from django.http import Http404 from django.shortcuts import redirect from django_future.csrf import ensure_csrf_cookie -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response import student.views import branding import courseware.views -from mitxmako.shortcuts import marketing_link +from edxmako.shortcuts import marketing_link from util.cache import cache_if_anonymous diff --git a/lms/djangoapps/circuit/views.py b/lms/djangoapps/circuit/views.py index cc85c2a4525e..5af9ce1b4456 100644 --- a/lms/djangoapps/circuit/views.py +++ b/lms/djangoapps/circuit/views.py @@ -4,7 +4,7 @@ from django.http import Http404 from django.http import HttpResponse -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from .models import ServerCircuit diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py index 3b804c4ba96f..436e9ee54af4 100644 --- a/lms/djangoapps/courseware/module_render.py +++ b/lms/djangoapps/courseware/module_render.py @@ -22,7 +22,7 @@ from courseware.model_data import FieldDataCache, DjangoKeyValueStore from lms.lib.xblock.field_data import LmsFieldData from lms.lib.xblock.runtime import LmsModuleSystem, handler_prefix, unquote_slashes -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from psychometrics.psychoanalyze import make_psychometrics_data_update_handler from student.models import anonymous_id_for_user, user_by_anonymous_id from util.json_request import JsonResponse diff --git a/lms/djangoapps/courseware/tests/__init__.py b/lms/djangoapps/courseware/tests/__init__.py index 9a17073a372c..fcca925f3574 100644 --- a/lms/djangoapps/courseware/tests/__init__.py +++ b/lms/djangoapps/courseware/tests/__init__.py @@ -11,7 +11,7 @@ from django.core.urlresolvers import reverse from django.test.client import Client -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from student.tests.factories import UserFactory, CourseEnrollmentFactory from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE from xblock.field_data import DictFieldData diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index 17198c372d17..b1634a72ac00 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -17,7 +17,7 @@ from student.models import CourseEnrollment from student.tests.factories import AdminFactory -from mitxmako.middleware import MakoMiddleware +from edxmako.middleware import MakoMiddleware from xmodule.modulestore import Location from xmodule.modulestore.django import modulestore diff --git a/lms/djangoapps/courseware/views.py b/lms/djangoapps/courseware/views.py index 69fd33f41767..2ce1f545717f 100644 --- a/lms/djangoapps/courseware/views.py +++ b/lms/djangoapps/courseware/views.py @@ -11,7 +11,7 @@ from django.contrib.auth.decorators import login_required from django.http import Http404, HttpResponse, HttpResponseRedirect from django.shortcuts import redirect -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string from django_future.csrf import ensure_csrf_cookie from django.views.decorators.cache import cache_control from django.db import transaction diff --git a/lms/djangoapps/dashboard/views.py b/lms/djangoapps/dashboard/views.py index 630222d7bfe2..8d1f63b410d5 100644 --- a/lms/djangoapps/dashboard/views.py +++ b/lms/djangoapps/dashboard/views.py @@ -1,5 +1,5 @@ from django.http import Http404 -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from django.db import connection from student.models import CourseEnrollment diff --git a/lms/djangoapps/debug/views.py b/lms/djangoapps/debug/views.py index 317ebcada988..5a5927e35008 100644 --- a/lms/djangoapps/debug/views.py +++ b/lms/djangoapps/debug/views.py @@ -6,7 +6,7 @@ from django.http import Http404 from django.contrib.auth.decorators import login_required from django_future.csrf import ensure_csrf_cookie -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from codejail.safe_exec import safe_exec diff --git a/lms/djangoapps/django_comment_client/base/views.py b/lms/djangoapps/django_comment_client/base/views.py index 4600f121f707..0e0bedc141a1 100644 --- a/lms/djangoapps/django_comment_client/base/views.py +++ b/lms/djangoapps/django_comment_client/base/views.py @@ -19,7 +19,7 @@ from django.utils.translation import ugettext as _ from django.contrib.auth.models import User -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from courseware.courses import get_course_with_access, get_course_by_id from course_groups.cohorts import get_cohort_id, is_commentable_cohorted diff --git a/lms/djangoapps/django_comment_client/forum/views.py b/lms/djangoapps/django_comment_client/forum/views.py index dac91512d6a0..83516fc3ac3f 100644 --- a/lms/djangoapps/django_comment_client/forum/views.py +++ b/lms/djangoapps/django_comment_client/forum/views.py @@ -8,7 +8,7 @@ from django.contrib.auth.models import User import newrelic.agent -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from courseware.courses import get_course_with_access from course_groups.cohorts import (is_course_cohorted, get_cohort_id, is_commentable_cohorted, get_cohorted_commentables, get_course_cohorts, get_cohort_by_id) diff --git a/lms/djangoapps/django_comment_client/utils.py b/lms/djangoapps/django_comment_client/utils.py index 527a7d0860c8..a92797f7e6c5 100644 --- a/lms/djangoapps/django_comment_client/utils.py +++ b/lms/djangoapps/django_comment_client/utils.py @@ -12,7 +12,7 @@ from django_comment_common.models import Role, FORUM_ROLE_STUDENT from django_comment_client.permissions import check_permissions_by_view -import mitxmako +import edxmako import pystache_custom as pystache from xmodule.modulestore.django import modulestore @@ -310,7 +310,7 @@ def url_for_tags(course_id, tags): def render_mustache(template_name, dictionary, *args, **kwargs): - template = mitxmako.lookup['main'].get_template(template_name).source + template = edxmako.lookup['main'].get_template(template_name).source return pystache.render(template, dictionary) diff --git a/lms/djangoapps/instructor/enrollment.py b/lms/djangoapps/instructor/enrollment.py index 508271fa8b8c..a7c4fe0b6554 100644 --- a/lms/djangoapps/instructor/enrollment.py +++ b/lms/djangoapps/instructor/enrollment.py @@ -12,7 +12,7 @@ from student.models import CourseEnrollment, CourseEnrollmentAllowed from courseware.models import StudentModule -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string # For determining if a shibboleth course SHIBBOLETH_DOMAIN_PREFIX = 'shib:' diff --git a/lms/djangoapps/instructor/hint_manager.py b/lms/djangoapps/instructor/hint_manager.py index 9f555b9c56f2..a8b97fbe32a9 100644 --- a/lms/djangoapps/instructor/hint_manager.py +++ b/lms/djangoapps/instructor/hint_manager.py @@ -13,7 +13,7 @@ from django.http import HttpResponse, Http404 from django_future.csrf import ensure_csrf_cookie -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string from courseware.courses import get_course_with_access from courseware.models import XModuleUserStateSummaryField diff --git a/lms/djangoapps/instructor/views/instructor_dashboard.py b/lms/djangoapps/instructor/views/instructor_dashboard.py index de14df29404e..9c1cc43a6146 100644 --- a/lms/djangoapps/instructor/views/instructor_dashboard.py +++ b/lms/djangoapps/instructor/views/instructor_dashboard.py @@ -6,7 +6,7 @@ from django.utils.translation import ugettext as _ from django_future.csrf import ensure_csrf_cookie from django.views.decorators.cache import cache_control -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from django.core.urlresolvers import reverse from django.utils.html import escape from django.http import Http404 diff --git a/lms/djangoapps/instructor/views/legacy.py b/lms/djangoapps/instructor/views/legacy.py index 98c18dc68bea..09046f759381 100644 --- a/lms/djangoapps/instructor/views/legacy.py +++ b/lms/djangoapps/instructor/views/legacy.py @@ -50,7 +50,7 @@ submit_reset_problem_attempts_for_all_students, submit_bulk_course_email) from instructor_task.views import get_task_completion_info -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string from psychometrics import psychoanalyze from student.models import CourseEnrollment, CourseEnrollmentAllowed, unique_id_for_user from student.views import course_from_id diff --git a/lms/djangoapps/licenses/views.py b/lms/djangoapps/licenses/views.py index 1c1a80ed3182..42ecb9ecf19c 100644 --- a/lms/djangoapps/licenses/views.py +++ b/lms/djangoapps/licenses/views.py @@ -5,7 +5,7 @@ from collections import namedtuple, defaultdict -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User diff --git a/lms/djangoapps/multicourse/views.py b/lms/djangoapps/multicourse/views.py index da9ccb77a665..c48c4477e48f 100644 --- a/lms/djangoapps/multicourse/views.py +++ b/lms/djangoapps/multicourse/views.py @@ -1,5 +1,5 @@ from django.conf import settings -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from multicourse import multicourse_settings diff --git a/lms/djangoapps/notes/views.py b/lms/djangoapps/notes/views.py index 01671b7ccdab..bf57f80c3d48 100644 --- a/lms/djangoapps/notes/views.py +++ b/lms/djangoapps/notes/views.py @@ -1,6 +1,6 @@ from django.contrib.auth.decorators import login_required from django.http import Http404 -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from courseware.courses import get_course_with_access from notes.models import Note from notes.utils import notes_enabled_for_course diff --git a/lms/djangoapps/notification_prefs/views.py b/lms/djangoapps/notification_prefs/views.py index 6be5b8f76647..68e8c875daf2 100644 --- a/lms/djangoapps/notification_prefs/views.py +++ b/lms/djangoapps/notification_prefs/views.py @@ -10,7 +10,7 @@ from django.http import Http404, HttpResponse from django.views.decorators.http import require_GET, require_POST -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from notification_prefs import NOTIFICATION_PREF_KEY from user_api.models import UserPreference diff --git a/lms/djangoapps/open_ended_grading/open_ended_notifications.py b/lms/djangoapps/open_ended_grading/open_ended_notifications.py index c4580dd30436..e99f51283c78 100644 --- a/lms/djangoapps/open_ended_grading/open_ended_notifications.py +++ b/lms/djangoapps/open_ended_grading/open_ended_notifications.py @@ -9,7 +9,7 @@ from courseware.access import has_access from lms.lib.xblock.runtime import LmsModuleSystem -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from student.models import unique_id_for_user from util.cache import cache diff --git a/lms/djangoapps/open_ended_grading/staff_grading_service.py b/lms/djangoapps/open_ended_grading/staff_grading_service.py index 1322f3f06933..ba8009ece3c3 100644 --- a/lms/djangoapps/open_ended_grading/staff_grading_service.py +++ b/lms/djangoapps/open_ended_grading/staff_grading_service.py @@ -13,7 +13,7 @@ from courseware.access import has_access from lms.lib.xblock.runtime import LmsModuleSystem -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from student.models import unique_id_for_user from util.json_request import expect_json diff --git a/lms/djangoapps/open_ended_grading/tests.py b/lms/djangoapps/open_ended_grading/tests.py index ad6298d71a9f..7e4a805fc9e4 100644 --- a/lms/djangoapps/open_ended_grading/tests.py +++ b/lms/djangoapps/open_ended_grading/tests.py @@ -27,7 +27,7 @@ from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE from lms.lib.xblock.runtime import LmsModuleSystem from courseware.roles import CourseStaffRole -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from student.models import unique_id_for_user from open_ended_grading import staff_grading_service, views, utils diff --git a/lms/djangoapps/open_ended_grading/utils.py b/lms/djangoapps/open_ended_grading/utils.py index bfde229e9c85..01d58fb479d4 100644 --- a/lms/djangoapps/open_ended_grading/utils.py +++ b/lms/djangoapps/open_ended_grading/utils.py @@ -11,7 +11,7 @@ from django.conf import settings from lms.lib.xblock.runtime import LmsModuleSystem -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string log = logging.getLogger(__name__) diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index e8002e0883f7..383187bbb9b7 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -2,7 +2,7 @@ from django.conf import settings from django.views.decorators.cache import cache_control -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from django.core.urlresolvers import reverse from student.models import unique_id_for_user @@ -19,7 +19,7 @@ from xmodule.modulestore.exceptions import ItemNotFoundError, NoPathToItem from django.http import HttpResponse, Http404, HttpResponseRedirect -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from django.utils.translation import ugettext as _ from open_ended_grading.utils import (STAFF_ERROR_MESSAGE, STUDENT_ERROR_MESSAGE, diff --git a/lms/djangoapps/shoppingcart/models.py b/lms/djangoapps/shoppingcart/models.py index fa77efb50f93..7de62343c778 100644 --- a/lms/djangoapps/shoppingcart/models.py +++ b/lms/djangoapps/shoppingcart/models.py @@ -23,7 +23,7 @@ from xmodule.modulestore.exceptions import ItemNotFoundError from course_modes.models import CourseMode -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from student.views import course_from_id from student.models import CourseEnrollment, unenroll_done diff --git a/lms/djangoapps/shoppingcart/processors/CyberSource.py b/lms/djangoapps/shoppingcart/processors/CyberSource.py index 5d43482bd4c3..d6811303a1f7 100644 --- a/lms/djangoapps/shoppingcart/processors/CyberSource.py +++ b/lms/djangoapps/shoppingcart/processors/CyberSource.py @@ -13,7 +13,7 @@ from textwrap import dedent from django.conf import settings from django.utils.translation import ugettext as _ -from mitxmako.shortcuts import render_to_string +from edxmako.shortcuts import render_to_string from shoppingcart.models import Order from shoppingcart.processors.exceptions import * diff --git a/lms/djangoapps/shoppingcart/tests/payment_fake.py b/lms/djangoapps/shoppingcart/tests/payment_fake.py index fa6f40190415..0de87410ef03 100644 --- a/lms/djangoapps/shoppingcart/tests/payment_fake.py +++ b/lms/djangoapps/shoppingcart/tests/payment_fake.py @@ -15,7 +15,7 @@ from django.views.generic.base import View from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse, HttpResponseBadRequest -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response # We use the same hashing function as the software under test, diff --git a/lms/djangoapps/shoppingcart/tests/test_views.py b/lms/djangoapps/shoppingcart/tests/test_views.py index 0451277ce235..0d23dc041904 100644 --- a/lms/djangoapps/shoppingcart/tests/test_views.py +++ b/lms/djangoapps/shoppingcart/tests/test_views.py @@ -18,7 +18,7 @@ from student.tests.factories import UserFactory from student.models import CourseEnrollment from course_modes.models import CourseMode -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from shoppingcart.processors import render_purchase_form_html from mock import patch, Mock diff --git a/lms/djangoapps/shoppingcart/views.py b/lms/djangoapps/shoppingcart/views.py index ad7ef6b0800a..26cf3e5a51d3 100644 --- a/lms/djangoapps/shoppingcart/views.py +++ b/lms/djangoapps/shoppingcart/views.py @@ -10,7 +10,7 @@ from django.core.urlresolvers import reverse from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.decorators import login_required -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from .models import Order, PaidCourseRegistration, OrderItem from .processors import process_postpay_callback, render_purchase_form_html from .exceptions import ItemAlreadyInCartException, AlreadyEnrolledInCourseException, CourseDoesNotExistException diff --git a/lms/djangoapps/static_template_view/views.py b/lms/djangoapps/static_template_view/views.py index e5a8c43ca86a..4cff3c77ac71 100644 --- a/lms/djangoapps/static_template_view/views.py +++ b/lms/djangoapps/static_template_view/views.py @@ -3,7 +3,7 @@ # List of valid templates is explicitly managed for (short-term) # security reasons. -from mitxmako.shortcuts import render_to_response, render_to_string +from edxmako.shortcuts import render_to_response, render_to_string from mako.exceptions import TopLevelLookupException from django.shortcuts import redirect from django.conf import settings diff --git a/lms/djangoapps/staticbook/views.py b/lms/djangoapps/staticbook/views.py index f73cfb6e5bb3..db9dce87dd16 100644 --- a/lms/djangoapps/staticbook/views.py +++ b/lms/djangoapps/staticbook/views.py @@ -4,7 +4,7 @@ from django.contrib.auth.decorators import login_required from django.http import Http404 -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from courseware.access import has_access from courseware.courses import get_course_with_access diff --git a/lms/djangoapps/verify_student/views.py b/lms/djangoapps/verify_student/views.py index 673564e72c06..2ac798bbf203 100644 --- a/lms/djangoapps/verify_student/views.py +++ b/lms/djangoapps/verify_student/views.py @@ -6,7 +6,7 @@ import logging import decimal -from mitxmako.shortcuts import render_to_response +from edxmako.shortcuts import render_to_response from django.conf import settings from django.core.urlresolvers import reverse diff --git a/lms/envs/acceptance.py b/lms/envs/acceptance.py index 8236303161e7..76db5b005b9c 100644 --- a/lms/envs/acceptance.py +++ b/lms/envs/acceptance.py @@ -36,7 +36,7 @@ def seed(): modulestore_options = { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': TEST_ROOT / "data", - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } MODULESTORE = { diff --git a/lms/envs/cms/dev.py b/lms/envs/cms/dev.py index 0978d88d173b..f70d05653f57 100644 --- a/lms/envs/cms/dev.py +++ b/lms/envs/cms/dev.py @@ -31,7 +31,7 @@ modulestore_options = { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': DATA_DIR, - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } MODULESTORE = { diff --git a/lms/envs/cms/mixed_dev.py b/lms/envs/cms/mixed_dev.py index ba45d7e747cc..f636566558cf 100644 --- a/lms/envs/cms/mixed_dev.py +++ b/lms/envs/cms/mixed_dev.py @@ -33,7 +33,7 @@ 'OPTIONS': { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': DATA_DIR, - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } } }, diff --git a/lms/envs/common.py b/lms/envs/common.py index 46c9df1a6ecb..2341e30cb128 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -281,7 +281,7 @@ 'course_wiki.course_nav.context_processor', # Hack to get required link URLs to password reset templates - 'mitxmako.shortcuts.marketing_link_context_processor', + 'edxmako.shortcuts.marketing_link_context_processor', # Shoppingcart processor (detects if request.user has a cart) 'shoppingcart.context_processor.user_has_cart_context_processor', @@ -592,8 +592,8 @@ # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( - 'mitxmako.makoloader.MakoFilesystemLoader', - 'mitxmako.makoloader.MakoAppDirectoriesLoader', + 'edxmako.makoloader.MakoFilesystemLoader', + 'edxmako.makoloader.MakoAppDirectoriesLoader', # 'django.template.loaders.filesystem.Loader', # 'django.template.loaders.app_directories.Loader', @@ -615,7 +615,7 @@ 'django.contrib.messages.middleware.MessageMiddleware', 'track.middleware.TrackMiddleware', - 'mitxmako.middleware.MakoMiddleware', + 'edxmako.middleware.MakoMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'course_wiki.course_nav.Middleware', @@ -928,7 +928,7 @@ 'service_status', # For asset pipelining - 'mitxmako', + 'edxmako', 'pipeline', 'staticfiles', 'static_replace', diff --git a/lms/envs/dev_ike.py b/lms/envs/dev_ike.py index 50bbfff0968d..0123c5c1e0af 100644 --- a/lms/envs/dev_ike.py +++ b/lms/envs/dev_ike.py @@ -47,7 +47,7 @@ INSTALLED_APPS = tuple([app for app in INSTALLED_APPS if not app.startswith('debug_toolbar')]) MIDDLEWARE_CLASSES = tuple([mcl for mcl in MIDDLEWARE_CLASSES if not mcl.startswith('debug_toolbar')]) -#TEMPLATE_LOADERS = tuple([ app for app in TEMPLATE_LOADERS if not app.startswith('mitxmako') ]) +#TEMPLATE_LOADERS = tuple([ app for app in TEMPLATE_LOADERS if not app.startswith('edxmako') ]) TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', diff --git a/lms/envs/dev_mongo.py b/lms/envs/dev_mongo.py index bd7a8b20aa95..3a99f4465551 100644 --- a/lms/envs/dev_mongo.py +++ b/lms/envs/dev_mongo.py @@ -21,7 +21,7 @@ 'OPTIONS': { 'default_class': 'xmodule.raw_module.RawDescriptor', 'fs_root': GITHUB_REPO_ROOT, - 'render_template': 'mitxmako.shortcuts.render_to_string', + 'render_template': 'edxmako.shortcuts.render_to_string', } } } From 991312ccf69e23e9140478ddc16ca9f73f0bc6cd Mon Sep 17 00:00:00 2001 From: fmyzjs Date: Wed, 4 Dec 2013 20:00:37 +0800 Subject: [PATCH 15/15] Update base.txt to solve ImportError: No module named numpy.distutils.core --- requirements/edx/base.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 3bcfe9abe0ea..6330092e5e66 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -62,6 +62,7 @@ pytz==2012h pysrt==0.4.7 PyYAML==3.10 requests==1.2.3 +numpy==1.6.2 scipy==0.11.0 Shapely==1.2.16 singledispatch==3.4.0.2