Commit d96de424 by jsa

Merge branch 'release'

parents ec5a2a1d 86515df7
......@@ -2,15 +2,16 @@
Tests course_creators.views.py.
"""
from django.test import TestCase
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
from django.test import TestCase, RequestFactory
from course_creators.views import add_user_with_status_unrequested, add_user_with_status_granted
from course_creators.views import get_course_creator_status, update_course_creator_group, user_requested_access
import mock
from student.roles import CourseCreatorRole
from student import auth
from edxmako.tests import mako_middleware_process_request
class CourseCreatorView(TestCase):
......@@ -70,6 +71,11 @@ class CourseCreatorView(TestCase):
def test_user_requested_access(self):
add_user_with_status_unrequested(self.user)
self.assertEqual('unrequested', get_course_creator_status(self.user))
request = RequestFactory().get('/')
request.user = self.user
mako_middleware_process_request(request)
user_requested_access(self.user)
self.assertEqual('pending', get_course_creator_status(self.user))
......
......@@ -12,15 +12,20 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import threading
from django.template import RequestContext
from util.request import safe_get_host
requestcontext = None
REQUEST_CONTEXT = threading.local()
class MakoMiddleware(object):
def process_request(self, request):
global requestcontext
requestcontext = RequestContext(request)
requestcontext['is_secure'] = request.is_secure()
requestcontext['site'] = safe_get_host(request)
REQUEST_CONTEXT.context = RequestContext(request)
REQUEST_CONTEXT.context['is_secure'] = request.is_secure()
REQUEST_CONTEXT.context['site'] = safe_get_host(request)
def process_response(self, request, response):
REQUEST_CONTEXT.context = None
return response
......@@ -92,8 +92,8 @@ 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 edxmako.middleware.requestcontext is not None:
for d in edxmako.middleware.requestcontext:
if edxmako.middleware.REQUEST_CONTEXT.context is not None:
for d in edxmako.middleware.REQUEST_CONTEXT.context:
context_dictionary.update(d)
for d in context_instance:
context_dictionary.update(d)
......
......@@ -48,8 +48,8 @@ class Template(MakoTemplate):
context_dictionary = {}
# In various testing contexts, there might not be a current request context.
if edxmako.middleware.requestcontext is not None:
for d in edxmako.middleware.requestcontext:
if edxmako.middleware.REQUEST_CONTEXT.context is not None:
for d in edxmako.middleware.REQUEST_CONTEXT.context:
context_dictionary.update(d)
for d in context_instance:
context_dictionary.update(d)
......
from mock import patch, Mock
from django.http import HttpResponse
from django.test import TestCase
from django.test.utils import override_settings
from django.test.client import RequestFactory
from django.core.urlresolvers import reverse
import edxmako.middleware
from edxmako import add_lookup, LOOKUP
from edxmako.shortcuts import marketing_link
from mock import patch
from student.tests.factories import UserFactory
from util.testing import UrlResetMixin
......@@ -37,3 +42,40 @@ class AddLookupTests(TestCase):
dirs = LOOKUP['test'].directories
self.assertEqual(len(dirs), 1)
self.assertTrue(dirs[0].endswith('management'))
class MakoMiddlewareTest(TestCase):
"""
Test MakoMiddleware.
"""
def setUp(self):
self.middleware = edxmako.middleware.MakoMiddleware()
self.user = UserFactory.create()
self.url = "/"
self.request = RequestFactory().get(self.url)
self.request.user = self.user
self.response = Mock(spec=HttpResponse)
def test_clear_request_context_variable(self):
"""
Test the global variable requestcontext is cleared correctly
when response middleware is called.
"""
self.middleware.process_request(self.request)
# requestcontext should not be None.
self.assertIsNotNone(edxmako.middleware.REQUEST_CONTEXT.context)
self.middleware.process_response(self.request, self.response)
# requestcontext should be None.
self.assertIsNone(edxmako.middleware.REQUEST_CONTEXT.context)
def mako_middleware_process_request(request):
"""
Initialize the global RequestContext variable
edxmako.middleware.requestcontext using the request object.
"""
mako_middleware = edxmako.middleware.MakoMiddleware()
mako_middleware.process_request(request)
......@@ -27,6 +27,7 @@ from external_auth.views import shib_login, course_specific_login, course_specif
from student.views import create_account, change_enrollment
from student.models import UserProfile, Registration, CourseEnrollment
from student.tests.factories import UserFactory
from edxmako.tests import mako_middleware_process_request
TEST_DATA_MIXED_MODULESTORE = mixed_store_config(settings.COMMON_TEST_DATA_ROOT, {})
......@@ -91,6 +92,9 @@ class ShibSPTest(ModuleStoreTestCase):
"""
no_remote_user_request = self.request_factory.get('/shib-login')
no_remote_user_request.META.update({'Shib-Identity-Provider': IDP})
no_remote_user_request.user = AnonymousUser()
mako_middleware_process_request(no_remote_user_request)
no_remote_user_response = shib_login(no_remote_user_request)
self.assertEqual(no_remote_user_response.status_code, 403)
self.assertIn("identity server did not return your ID information", no_remote_user_response.content)
......@@ -155,6 +159,8 @@ class ShibSPTest(ModuleStoreTestCase):
'REMOTE_USER': remote_user,
'mail': remote_user})
request.user = AnonymousUser()
mako_middleware_process_request(request)
with patch('external_auth.views.AUDIT_LOG') as mock_audit_log:
response = shib_login(request)
audit_log_calls = mock_audit_log.method_calls
......@@ -315,6 +321,8 @@ class ShibSPTest(ModuleStoreTestCase):
request2 = self.request_factory.post('/create_account', data=postvars)
request2.session = client.session
request2.user = AnonymousUser()
mako_middleware_process_request(request2)
with patch('student.views.AUDIT_LOG') as mock_audit_log:
_response2 = create_account(request2)
......
import json
import django.db
import unittest
......@@ -12,6 +13,7 @@ from mock import Mock, patch
from django.http import Http404, HttpResponse
from django.conf import settings
from edxmako.shortcuts import render_to_string
from edxmako.tests import mako_middleware_process_request
from util.request import safe_get_host
from textwrap import dedent
......@@ -93,9 +95,11 @@ class ReactivationEmailTests(EmailTestMixin, TestCase):
# Thorough tests for safe_get_host are elsewhere; here we just want a quick URL sanity check
request = RequestFactory().post('unused_url')
request.user = self.user
request.META['HTTP_HOST'] = "aGenericValidHostName"
self.append_allowed_hosts("aGenericValidHostName")
mako_middleware_process_request(request)
body = render_to_string('emails/activation_email.txt', context)
host = safe_get_host(request)
......@@ -248,9 +252,11 @@ class EmailChangeConfirmationTests(EmailTestMixin, TransactionTestCase):
# Thorough tests for safe_get_host are elsewhere; here we just want a quick URL sanity check
request = RequestFactory().post('unused_url')
request.user = self.user
request.META['HTTP_HOST'] = "aGenericValidHostName"
self.append_allowed_hosts("aGenericValidHostName")
mako_middleware_process_request(request)
body = render_to_string('emails/confirm_email_change.txt', context)
url = safe_get_host(request)
......
......@@ -6,12 +6,14 @@ import json
from django.test import TestCase
from django.test.client import RequestFactory
from django.core.urlresolvers import reverse
from django.contrib.auth.models import AnonymousUser
from django.utils.importlib import import_module
from django.test.utils import override_settings
from django.conf import settings
from mock import patch
from student.views import create_account
from edxmako.tests import mako_middleware_process_request
from external_auth.models import ExternalAuthMap
from student.views import create_account
@patch.dict("django.conf.settings.FEATURES", {'ENFORCE_PASSWORD_POLICY': True})
class TestPasswordPolicy(TestCase):
......@@ -255,6 +257,9 @@ class TestPasswordPolicy(TestCase):
internal_password=self.url_params['password'],
external_domain='shib:https://idp.stanford.edu/')
request.session['ExternalAuthMap'] = extauth
request.user = AnonymousUser()
mako_middleware_process_request(request)
response = create_account(request)
self.assertEqual(response.status_code, 200)
obj = json.loads(response.content)
......
......@@ -13,6 +13,7 @@ from django.contrib.messages.storage import fallback
from django.contrib.sessions.backends import cache
from django.test import utils as django_utils
from django.conf import settings as django_settings
from edxmako.tests import mako_middleware_process_request
from social import actions, exceptions
from social.apps.django_app import utils as social_utils
from social.apps.django_app import views as social_views
......@@ -420,6 +421,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
self.client.get(
pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
mako_middleware_process_request(strategy.request)
student_views.signin_user(strategy.request)
student_views.login_user(strategy.request)
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
......@@ -453,6 +456,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
self.client.get(
pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
mako_middleware_process_request(strategy.request)
student_views.signin_user(strategy.request)
student_views.login_user(strategy.request)
actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access
......@@ -508,6 +513,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
self.client.get('/login')
self.client.get(pipeline.get_login_url(self.PROVIDER_CLASS.NAME, pipeline.AUTH_ENTRY_LOGIN))
actions.do_complete(strategy, social_views._do_login) # pylint: disable-msg=protected-access
mako_middleware_process_request(strategy.request)
student_views.signin_user(strategy.request)
student_views.login_user(strategy.request)
actions.do_complete(strategy, social_views._do_login, user=user) # pylint: disable-msg=protected-access
......@@ -547,6 +554,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
# pylint: disable-msg=protected-access
self.assert_redirect_to_login_looks_correct(actions.do_complete(strategy, social_views._do_login))
mako_middleware_process_request(strategy.request)
# At this point we know the pipeline has resumed correctly. Next we
# fire off the view that displays the login form and posts it via JS.
self.assert_login_response_in_pipeline_looks_correct(student_views.signin_user(strategy.request))
......@@ -568,6 +576,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
user.is_active = False
user.save()
mako_middleware_process_request(strategy.request)
self.assert_json_failure_response_is_inactive_account(student_views.login_user(strategy.request))
def test_signin_fails_if_no_account_associated(self):
......@@ -613,6 +622,7 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
# pylint:disable-msg=protected-access
self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login))
mako_middleware_process_request(strategy.request)
# At this point we know the pipeline has resumed correctly. Next we
# fire off the view that displays the registration form.
self.assert_register_response_in_pipeline_looks_correct(
......@@ -672,6 +682,8 @@ class IntegrationTest(testutil.TestCase, test.TestCase):
strategy.backend.auth_complete = mock.MagicMock(return_value=self.fake_auth_complete(strategy))
# pylint:disable-msg=protected-access
self.assert_redirect_to_register_looks_correct(actions.do_complete(strategy, social_views._do_login))
mako_middleware_process_request(strategy.request)
self.assert_register_response_in_pipeline_looks_correct(
student_views.register_user(strategy.request), pipeline.get(request)['kwargs'])
strategy.request.POST = self.get_registration_post_vars()
......
......@@ -15,6 +15,7 @@ from xmodule.modulestore.tests.factories import CourseFactory
from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE
import student.views
from branding.views import index
from edxmako.tests import mako_middleware_process_request
FEATURES_WITH_STARTDATE = settings.FEATURES.copy()
FEATURES_WITH_STARTDATE['DISABLE_START_DATES'] = False
......@@ -45,6 +46,8 @@ class AnonymousIndexPageTest(ModuleStoreTestCase):
"""
request = self.factory.get('/')
request.user = AnonymousUser()
mako_middleware_process_request(request)
student.views.index(request)
@override_settings(FEATURES=FEATURES_WITH_STARTDATE)
......
......@@ -20,6 +20,7 @@ from django.core.urlresolvers import reverse
from student.models import CourseEnrollment
from student.tests.factories import AdminFactory
from edxmako.middleware import MakoMiddleware
from edxmako.tests import mako_middleware_process_request
from opaque_keys.edx.locations import Location
from xmodule.modulestore.django import modulestore
......@@ -413,6 +414,8 @@ class TestProgressDueDate(BaseDueDateTests):
def get_text(self, course):
""" Returns the HTML for the progress page """
mako_middleware_process_request(self.request)
return views.progress(self.request, course.id.to_deprecated_string(), self.user.id).content
......
......@@ -4,6 +4,7 @@ from django.test.utils import override_settings
from django.test.client import Client, RequestFactory
from xmodule.modulestore.tests.factories import CourseFactory
from student.tests.factories import UserFactory, CourseEnrollmentFactory
from edxmako.tests import mako_middleware_process_request
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from django.core.urlresolvers import reverse
from util.testing import UrlResetMixin
......@@ -276,6 +277,8 @@ class UserProfileTestCase(ModuleStoreTestCase):
mock_request.side_effect = make_mock_request_impl(self.TEST_THREAD_TEXT, self.TEST_THREAD_ID)
request = RequestFactory().get("dummy_url", data=params, **headers)
request.user = self.student
mako_middleware_process_request(request)
response = views.user_profile(
request,
self.course.id.to_deprecated_string(),
......
......@@ -9,6 +9,7 @@ from markupsafe import escape
from courseware.tests.tests import TEST_DATA_MIXED_MODULESTORE
from student.tests.factories import UserFactory, CourseEnrollmentFactory
from edxmako.tests import mako_middleware_process_request
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
......@@ -48,6 +49,8 @@ class TestXss(ModuleStoreTestCase):
)
req.user = self._instructor
req.session = {}
mako_middleware_process_request(req)
resp = legacy.instructor_dashboard(req, self._course.id.to_deprecated_string())
respUnicode = resp.content.decode(settings.DEFAULT_CHARSET)
self.assertNotIn(self._evil_student.profile.name, respUnicode)
......
......@@ -11,6 +11,7 @@ from mock import Mock, patch
from notification_prefs import NOTIFICATION_PREF_KEY
from notification_prefs.views import ajax_enable, ajax_disable, ajax_status, set_subscription, UsernameCipher
from student.tests.factories import UserFactory
from edxmako.tests import mako_middleware_process_request
from user_api.models import UserPreference
from util.testing import UrlResetMixin
......@@ -220,6 +221,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase):
def test_user(user):
request = self.request_factory.get("dummy")
request.user = AnonymousUser()
mako_middleware_process_request(request)
response = set_subscription(request, self.tokens[user], subscribe=False)
self.assertEqual(response.status_code, 200)
self.assertNotPrefExists(user)
......@@ -231,6 +234,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase):
self.create_prefs()
request = self.request_factory.get("dummy")
request.user = AnonymousUser()
mako_middleware_process_request(request)
set_subscription(request, self.tokens[self.user], False)
response = set_subscription(request, self.tokens[self.user], subscribe=False)
self.assertEqual(response.status_code, 200)
......@@ -242,6 +247,8 @@ class NotificationPrefViewTest(UrlResetMixin, TestCase):
self.assertFalse(UserPreference.objects.filter(user=user, key=NOTIFICATION_PREF_KEY))
request = self.request_factory.get("dummy")
request.user = AnonymousUser()
mako_middleware_process_request(request)
response = set_subscription(request, self.tokens[user], subscribe=True)
self.assertEqual(response.status_code, 200)
self.assertPrefValid(user)
......
......@@ -3,6 +3,7 @@ Tests for open ended grading interfaces
./manage.py lms --settings test test lms/djangoapps/open_ended_grading
"""
from django.test import RequestFactory
import json
import logging
......@@ -29,6 +30,7 @@ from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE
from lms.lib.xblock.runtime import LmsModuleSystem
from student.roles import CourseStaffRole
from edxmako.shortcuts import render_to_string
from edxmako.tests import mako_middleware_process_request
from student.models import unique_id_for_user
from open_ended_grading import staff_grading_service, views, utils
......@@ -471,7 +473,12 @@ class TestPanel(ModuleStoreTestCase):
Ensure that the problem list from the grading controller server can be rendered properly locally
@return:
"""
request = Mock(user=self.user)
request = RequestFactory().get(
reverse("open_ended_problems", kwargs={'course_id': self.course_key})
)
request.user = self.user
mako_middleware_process_request(request)
response = views.student_problem_list(request, self.course.id.to_deprecated_string())
self.assertRegexpMatches(response.content, "Here is a list of open ended problems for this course.")
......
......@@ -84,7 +84,7 @@
<th class="c_code">${_("Code")}</th>
<th class="c_dsc">${_("Description")}</th>
<th class="c_course_id">${_("Course_id")}</th>
<th class="c_discount">${_("Discount(%)")}</th>
<th class="c_discount">${_("Discount (%)")}</th>
<th class="c_count">${_("Count")}</th>
<th class="c_action">${_("Actions")}</th>
</tr>
......@@ -120,7 +120,7 @@
</div>
<script>
$(function () {
var icons = {
header: "ui-icon-circle-arrow-e",
activeHeader: "ui-icon-circle-arrow-s"
......@@ -140,7 +140,7 @@
active:isNaN(parseInt($.cookie('saved_index'))) ? 0 : parseInt($.cookie('saved_index')),
collapsible: true
});
$('a[rel*=leanModal]').leanModal();
$.each($("a.edit-right"), function () {
if ($(this).parent().parent('tr').hasClass('inactive_coupon')) {
......@@ -211,7 +211,7 @@
// Get the Code and Discount value and trim it
var code = $.trim($('#edit_coupon_code').val());
var coupon_discount = $.trim($('#edit_coupon_discount').val());
// Check if empty of not
if (code === '') {
$('#edit_coupon_form #coupon_form_error').attr('style', 'display: block !important');
......@@ -249,7 +249,7 @@
// Get the Code and Discount value and trim it
var course_price = $.trim($('#mode_price').val());
var currency = $.trim($('#course_mode_currency').val());
// Check if empty of not
if (course_price === '') {
$('#set_price_form #course_form_error').attr('style', 'display: block !important');
......@@ -275,7 +275,7 @@
// Get the Code and Discount value and trim it
var code = $.trim($('#coupon_code').val());
var coupon_discount = $.trim($('#coupon_discount').val());
// Check if empty of not
if (code === '') {
$("#add_coupon_button").removeAttr('disabled');
......@@ -302,7 +302,7 @@
return false;
}
});
$('#set_price_form').on('ajax:complete', function (event, xhr) {
if (xhr.status == 200) {
location.reload(true);
......@@ -312,7 +312,7 @@
$('#set_price_form #course_form_error').text(xhr.responseText);
}
});
$('#add_coupon_form').on('ajax:complete', function (event, xhr) {
if (xhr.status == 200) {
location.reload(true);
......@@ -322,7 +322,7 @@
$('#add_coupon_form #coupon_form_error').text(xhr.responseText);
}
});
$('#edit_coupon_form').on('ajax:complete', function (event, xhr) {
if (xhr.status == 200) {
location.reload(true);
......@@ -340,7 +340,7 @@
reset_input_fields();
e.preventDefault();
});
var onModalClose = function () {
$("#add-coupon-modal").attr("aria-hidden", "true");
$(".remove_coupon").focus();
......@@ -352,7 +352,7 @@
$("#update_coupon_button").removeAttr('disabled');
reset_input_fields();
};
var cycle_modal_tab = function (from_element_name, to_element_name) {
$(from_element_name).on('keydown', function (e) {
var keyCode = e.keyCode || e.which;
......@@ -363,12 +363,12 @@
}
});
};
$("#add-coupon-modal .close-modal").click(onModalClose);
$("#edit-coupon-modal .close-modal").click(onModalClose);
$("#set-course-mode-price-modal .close-modal").click(reset_input_fields);
// Hitting the ESC key will exit the modal
$("#add-coupon-modal, #edit-coupon-modal, #set-course-mode-price-modal").on("keydown", function (e) {
var keyCode = e.keyCode || e.which;
......@@ -391,6 +391,6 @@
$('input#coupon_code').val('');
$('input#coupon_discount').val('');
$('textarea#coupon_description').val('');
}
</script>
\ No newline at end of file
</script>
......@@ -27,7 +27,7 @@
-e git+https://github.com/edx/bok-choy.git@9162c0bfb8e0eb1e2fa8e6df8dec12d181322a90#egg=bok_choy
-e git+https://github.com/edx-solutions/django-splash.git@9965a53c269666a30bb4e2b3f6037c138aef2a55#egg=django-splash
-e git+https://github.com/edx/acid-block.git@459aff7b63db8f2c5decd1755706c1a64fb4ebb1#egg=acid-xblock
-e git+https://github.com/edx/edx-ora2.git@release-2014-07-28T12.09#egg=edx-ora2
-e git+https://github.com/edx/edx-ora2.git@hotfix-2014-08-06#egg=edx-ora2
-e git+https://github.com/edx/opaque-keys.git@454bd984d9539550c6290020e92ee2d6094038d0#egg=opaque-keys
-e git+https://github.com/edx/ease.git@97de68448e5495385ba043d3091f570a699d5b5f#egg=ease
-e git+https://github.com/edx/i18n-tools.git@f5303e82dff368c7595884d9325aeea1d802da25#egg=i18n-tools
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment