Commit 70ad954e by Michael Frey

Merge pull request #11648 from edx/patch/2016-02-24

Only allow ecommerce checkout if user is also activated
parents 44c27bb1 c63dcf0d
......@@ -91,7 +91,7 @@
// end of Annotation tool files
// externally hosted files
"mathjax": "//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_CHTML&delayStartupUntil=configured", // jshint ignore:line
"mathjax": "//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured", // jshint ignore:line
"youtube": [
// youtube URL does not end in ".js". We add "?noext" to the path so
// that require.js adds the ".js" to the query component of the URL,
......
......@@ -51,7 +51,7 @@ requirejs.config({
"URI": "xmodule_js/common_static/js/vendor/URI.min",
"mock-ajax": "xmodule_js/common_static/js/vendor/mock-ajax",
"mathjax": "//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_CHTML&delayStartupUntil=configured",
"mathjax": "//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured",
"youtube": "//www.youtube.com/player_api?noext",
"coffee/src/ajax_prefix": "xmodule_js/common_static/coffee/src/ajax_prefix",
......
......@@ -42,7 +42,7 @@ requirejs.config({
"domReady": "xmodule_js/common_static/js/vendor/domReady",
"URI": "xmodule_js/common_static/js/vendor/URI.min",
"mathjax": "//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_CHTML&delayStartupUntil=configured",
"mathjax": "//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured",
"youtube": "//www.youtube.com/player_api?noext",
"coffee/src/ajax_prefix": "xmodule_js/common_static/coffee/src/ajax_prefix"
......
......@@ -151,7 +151,7 @@ class ChooseModeView(View):
if verified_mode.sku:
ecommerce_service = EcommerceService()
context["use_ecommerce_payment_flow"] = ecommerce_service.is_enabled()
context["use_ecommerce_payment_flow"] = ecommerce_service.is_enabled(request)
context["ecommerce_payment_page"] = ecommerce_service.payment_page_url()
context["sku"] = verified_mode.sku
......
......@@ -739,7 +739,7 @@ def dashboard(request):
}
ecommerce_service = EcommerceService()
if ecommerce_service.is_enabled():
if ecommerce_service.is_enabled(request):
context.update({
'use_ecommerce_payment_flow': True,
'ecommerce_payment_page': ecommerce_service.payment_page_url(),
......
......@@ -346,7 +346,7 @@ def css_contains_text(css_selector, partial_text, index=0):
# If we're expecting a non-empty string, give the page
# a chance to fill in text fields.
if partial_text:
wait_for(lambda _: css_html(css_selector, index=index))
wait_for(lambda _: css_html(css_selector, index=index), timeout=8)
actual_text = css_html(css_selector, index=index)
......
......@@ -20,7 +20,7 @@
<p id="answer_${id}" class="answer"></p>
<div id="input_${id}_preview" class="equation">
\[\]
\(\)
<img src="${STATIC_URL}images/spinner.gif" class="loading" alt="Loading"/>
</div>
</div>
......
......@@ -139,7 +139,7 @@ describe("Formula Equation Preview", function () {
// Either it makes a request or jumps straight into displaying ''.
waitsFor(function () {
// (Short circuit if `inputAjax` is indeed called)
return Problem.inputAjax.wasCalled ||
return Problem.inputAjax.wasCalled || // jshint ignore:line
MathJax.Hub.Queue.wasCalled;
}, "AJAX never called on user input", 1000);
......@@ -266,7 +266,7 @@ describe("Formula Equation Preview", function () {
// We should look in the preview div for the MathJax.
var previewElement = $("#input_THE_ID_preview")[0];
expect(previewElement.firstChild.data).toEqual("\\[THE_FORMULA\\]");
expect(previewElement.firstChild.data).toEqual("\\(THE_FORMULA\\)");
// Refresh the MathJax.
expect(MathJax.Hub.Queue).toHaveBeenCalledWith(
......
......@@ -145,7 +145,7 @@ formulaEquationPreview.enable = function () {
console.log("[FormulaEquationInput] Oops no mathjax for ", latex);
// Fall back to modifying the actual element.
var textNode = previewElement.childNodes[0];
textNode.data = "\\[" + latex + "\\]";
textNode.data = "\\(" + latex + "\\)";
MathJax.Hub.Queue(["Typeset", MathJax.Hub, previewElement]);
}
});
......
......@@ -76,4 +76,4 @@
<!-- This must appear after all mathjax-config blocks, so it is after the imports from the other templates.
It can't be run through static.url because MathJax uses crazy url introspection to do lazy loading of
MathJax extension libraries -->
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<script type="text/javascript" src="https://cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG"></script>
......@@ -126,7 +126,7 @@ class DiscussionThreadPage(PageObject, DiscussionPageMixin):
def verify_mathjax_rendered(self):
""" Checks that MathJax css class is present """
self.wait_for(
lambda: self._is_element_visible(".MathJax_CHTML"),
lambda: self._is_element_visible(".MathJax_SVG"),
description="MathJax Preview is rendered"
)
......
......@@ -49,7 +49,7 @@ class ProblemPage(PageObject):
"""
def mathjax_present():
""" Returns True if MathJax css is present in the problem body """
mathjax_container = self.q(css="div.problem p .MathJax_CHTML")
mathjax_container = self.q(css="div.problem p .MathJax_SVG")
return mathjax_container.visible and mathjax_container.present
self.wait_for(
......@@ -63,7 +63,7 @@ class ProblemPage(PageObject):
"""
def mathjax_present():
""" Returns True if MathJax css is present in the problem body """
mathjax_container = self.q(css="div.problem div.problem-hint .MathJax_CHTML")
mathjax_container = self.q(css="div.problem div.problem-hint .MathJax_SVG")
return mathjax_container.visible and mathjax_container.present
self.wait_for(
......
......@@ -40,7 +40,7 @@ class TabNavPage(PageObject):
"""
Check that MathJax has rendered in tab content
"""
mathjax_container = self.q(css=".static_tab_wrapper .MathJax_CHTML")
mathjax_container = self.q(css=".static_tab_wrapper .MathJax_SVG")
EmptyPromise(
lambda: mathjax_container.present and mathjax_container.visible,
"MathJax is not visible"
......
......@@ -5,6 +5,7 @@ Tests for discussion pages
import datetime
from uuid import uuid4
from flaky import flaky
from nose.plugins.attrib import attr
from pytz import UTC
......@@ -400,6 +401,7 @@ class DiscussionCommentDeletionTest(BaseDiscussionTestCase):
)
view.push()
@flaky # TODO: TNL-4151
def test_comment_deletion_as_student(self):
self.setup_user()
self.setup_view()
......
......@@ -5,6 +5,8 @@ from mock import patch
from commerce.utils import audit_log, EcommerceService
from commerce.models import CommerceConfiguration
from django.test.client import RequestFactory
from student.tests.factories import UserFactory
class AuditLogTests(TestCase):
......@@ -25,6 +27,10 @@ class EcommerceServiceTests(TestCase):
SKU = 'TESTSKU'
def setUp(self):
self.request_factory = RequestFactory()
self.user = UserFactory.create()
self.request = self.request_factory.get("foo")
self.request.user = self.user
CommerceConfiguration.objects.create(
checkout_on_ecommerce_service=True,
single_course_checkout_page='/test_basket/'
......@@ -33,20 +39,20 @@ class EcommerceServiceTests(TestCase):
def test_is_enabled(self):
"""Verify that is_enabled() returns True when ecomm checkout is enabled. """
is_enabled = EcommerceService().is_enabled()
is_enabled = EcommerceService().is_enabled(self.request)
self.assertTrue(is_enabled)
config = CommerceConfiguration.current()
config.checkout_on_ecommerce_service = False
config.save()
is_not_enabled = EcommerceService().is_enabled()
is_not_enabled = EcommerceService().is_enabled(self.request)
self.assertFalse(is_not_enabled)
@patch('openedx.core.djangoapps.theming.helpers.is_request_in_themed_site')
def test_is_enabled_for_microsites(self, is_microsite):
"""Verify that is_enabled() returns False if used for a microsite."""
is_microsite.return_value = True
is_not_enabled = EcommerceService().is_enabled()
is_not_enabled = EcommerceService().is_enabled(self.request)
self.assertFalse(is_not_enabled)
@override_settings(ECOMMERCE_PUBLIC_URL_ROOT='http://ecommerce_url')
......
......@@ -44,9 +44,10 @@ class EcommerceService(object):
def __init__(self):
self.config = CommerceConfiguration.current()
def is_enabled(self):
""" Check if the service is enabled and that the site is not a microsite. """
return self.config.checkout_on_ecommerce_service and not helpers.is_request_in_themed_site()
def is_enabled(self, request):
""" Check if the user is activated, if the service is enabled and that the site is not a microsite. """
return (request.user.is_active and self.config.checkout_on_ecommerce_service and not
helpers.is_request_in_themed_site())
def payment_page_url(self):
""" Return the URL for the checkout page.
......
......@@ -39,6 +39,7 @@ from courseware.testutils import RenderXBlockTestMixin
from courseware.tests.factories import StudentModuleFactory
from courseware.user_state_client import DjangoXBlockUserStateClient
from edxmako.tests import mako_middleware_process_request
from lms.djangoapps.commerce.utils import EcommerceService # pylint: disable=import-error
from milestones.tests.utils import MilestonesTestCaseMixin
from openedx.core.djangoapps.self_paced.models import SelfPacedConfiguration
from openedx.core.lib.gating import api as gating_api
......@@ -271,13 +272,23 @@ class ViewsTestCase(ModuleStoreTestCase):
@ddt.data(True, False)
def test_ecommerce_checkout(self, is_anonymous):
self.assert_enrollment_link_present(is_anonymous=is_anonymous)
if not is_anonymous:
self.assert_enrollment_link_present(is_anonymous=is_anonymous)
else:
request = self.request_factory.get("foo")
request.user = AnonymousUser()
self.assertEqual(EcommerceService().is_enabled(request), False)
@ddt.data(True, False)
@unittest.skipUnless(settings.FEATURES.get('ENABLE_SHOPPING_CART'), 'Shopping Cart not enabled in settings')
@patch.dict(settings.FEATURES, {'ENABLE_PAID_COURSE_REGISTRATION': True})
def test_ecommerce_checkout_shopping_cart_enabled(self, is_anonymous):
self.assert_enrollment_link_present(is_anonymous=is_anonymous, _id=True)
if not is_anonymous:
self.assert_enrollment_link_present(is_anonymous=is_anonymous, _id=True)
else:
request = self.request_factory.get("foo")
request.user = AnonymousUser()
self.assertEqual(EcommerceService().is_enabled(request), False)
def test_user_groups(self):
# depreciated function
......
......@@ -906,7 +906,7 @@ def course_about(request, course_id):
ecommerce_checkout_link = ''
professional_mode = ''
ecomm_service = EcommerceService()
if ecomm_service.is_enabled() and (
if ecomm_service.is_enabled(request) and (
CourseMode.PROFESSIONAL in modes or CourseMode.NO_ID_PROFESSIONAL_MODE in modes
):
professional_mode = modes.get(CourseMode.PROFESSIONAL, '') or \
......@@ -944,7 +944,7 @@ def course_about(request, course_id):
'is_cosmetic_price_enabled': settings.FEATURES.get('ENABLE_COSMETIC_DISPLAY_PRICE'),
'course_price': course_price,
'in_cart': in_cart,
'ecommerce_checkout': ecomm_service.is_enabled(),
'ecommerce_checkout': ecomm_service.is_enabled(request),
'ecommerce_checkout_link': ecommerce_checkout_link,
'professional_mode': professional_mode,
'reg_then_add_to_cart_link': reg_then_add_to_cart_link,
......
......@@ -49,7 +49,7 @@
'jasmine.async': 'xmodule_js/common_static/js/vendor/jasmine.async',
'draggabilly': 'xmodule_js/common_static/js/vendor/draggabilly.pkgd',
'domReady': 'xmodule_js/common_static/js/vendor/domReady',
'mathjax': '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_CHTML&delayStartupUntil=configured', // jshint ignore:line
'mathjax': '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured', // jshint ignore:line
'youtube': '//www.youtube.com/player_api?noext',
'coffee/src/ajax_prefix': 'xmodule_js/common_static/coffee/src/ajax_prefix',
'coffee/src/instructor_dashboard/student_admin': 'coffee/src/instructor_dashboard/student_admin',
......
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