Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
1fcf32cf
Commit
1fcf32cf
authored
Jun 24, 2016
by
Douglas Hall
Committed by
GitHub
Jun 24, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #12822 from edx/patch/2016-06-22
Patch Release 2016-06-22
parents
a5a235bd
e2fd776a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
159 additions
and
213 deletions
+159
-213
common/djangoapps/course_modes/tests/test_views.py
+9
-8
common/djangoapps/student/forms.py
+1
-1
common/djangoapps/student/tests/test_email.py
+3
-3
common/djangoapps/student/tests/test_reset_password.py
+1
-1
common/djangoapps/student/tests/tests.py
+1
-1
common/djangoapps/student/views.py
+4
-4
common/lib/xmodule/xmodule/css/video/display.scss
+0
-2
common/lib/xmodule/xmodule/js/fixtures/video_yt_multiple.html
+3
-6
common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
+4
-5
common/lib/xmodule/xmodule/js/spec/main_requirejs.js
+4
-36
common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js
+1
-3
common/lib/xmodule/xmodule/js/spec/video/video_speed_control_spec.js
+6
-8
common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
+20
-59
common/lib/xmodule/xmodule/js/src/video/09_video_caption.js
+0
-0
lms/djangoapps/branding/tests/test_views.py
+1
-1
lms/djangoapps/bulk_email/tasks.py
+1
-1
lms/djangoapps/commerce/tests/test_views.py
+1
-1
lms/djangoapps/course_wiki/tests/test_comprehensive_theming.py
+1
-1
lms/djangoapps/courseware/tests/test_comprehensive_theming.py
+1
-1
lms/djangoapps/courseware/tests/test_footer.py
+1
-1
lms/djangoapps/student_account/test/test_views.py
+1
-1
lms/djangoapps/verify_student/tests/test_views.py
+1
-1
lms/static/karma_lms_coffee.conf.js
+9
-14
lms/static/lms/js/spec/main_requirejs_coffee.js
+3
-35
lms/templates/emails/activation_email.txt
+6
-3
lms/templates/emails/activation_email_subject.txt
+4
-1
lms/templates/emails/confirm_email_change.txt
+8
-3
lms/templates/emails/email_change.txt
+8
-2
lms/templates/emails/email_change_subject.txt
+4
-1
openedx/core/djangoapps/credit/email_utils.py
+1
-1
openedx/core/djangoapps/theming/helpers.py
+22
-4
openedx/core/djangoapps/theming/tests/__init__.py
+0
-0
openedx/core/djangoapps/theming/tests/test_helpers.py
+25
-0
openedx/core/djangoapps/theming/tests/test_util.py
+1
-1
openedx/core/djangoapps/user_api/accounts/api.py
+1
-1
requirements/edx/base.txt
+1
-1
requirements/edx/github.txt
+1
-1
No files found.
common/djangoapps/course_modes/tests/test_views.py
View file @
1fcf32cf
...
...
@@ -9,21 +9,22 @@ import ddt
import
freezegun
from
mock
import
patch
from
nose.plugins.attrib
import
attr
from
django.conf
import
settings
from
django.core.urlresolvers
import
reverse
from
lms.djangoapps.commerce.tests
import
test_utils
as
ecomm_test_utils
from
openedx.core.djangoapps.theming.tests
import
test_util
as
theming_test_utils
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
util.testing
import
UrlResetMixin
from
embargo.test_utils
import
restrict_course
from
xmodule.modulestore.django
import
modulestore
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
course_modes.models
import
CourseMode
,
Mode
from
course_modes.tests.factories
import
CourseModeFactory
from
student.tests.factories
import
CourseEnrollmentFactory
,
UserFactory
from
embargo.test_utils
import
restrict_course
from
student.models
import
CourseEnrollment
import
lms.djangoapps.commerce.tests.test_utils
as
ecomm_test_utils
from
course_modes.models
import
CourseMode
,
Mode
from
openedx.core.djangoapps.theming.test_util
import
with_is_edx_domain
from
student.tests.factories
import
CourseEnrollmentFactory
,
UserFactory
from
util.testing
import
UrlResetMixin
@attr
(
'shard_3'
)
...
...
@@ -373,7 +374,7 @@ class CourseModeViewTest(UrlResetMixin, ModuleStoreTestCase):
self
.
assertEquals
(
course_modes
,
expected_modes
)
@unittest.skipUnless
(
settings
.
ROOT_URLCONF
==
'lms.urls'
,
'Test only valid in lms'
)
@with_is_edx_domain
(
True
)
@
theming_test_utils.
with_is_edx_domain
(
True
)
def
test_hide_nav
(
self
):
# Create the course modes
for
mode
in
[
"honor"
,
"verified"
]:
...
...
common/djangoapps/student/forms.py
View file @
1fcf32cf
...
...
@@ -58,7 +58,7 @@ class PasswordResetFormNoActive(PasswordResetForm):
email_template_name
=
'registration/password_reset_email.html'
,
use_https
=
False
,
token_generator
=
default_token_generator
,
from_email
=
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
),
from_email
=
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
),
request
=
None
):
"""
...
...
common/djangoapps/student/tests/test_email.py
View file @
1fcf32cf
...
...
@@ -20,7 +20,7 @@ from django.conf import settings
from
edxmako.shortcuts
import
render_to_string
from
util.request
import
safe_get_host
from
util.testing
import
EventTestMixin
from
openedx.core.djangoapps.theming.test_util
import
with_is_edx_domain
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_is_edx_domain
from
openedx.core.djangoapps.theming
import
helpers
as
theming_helpers
...
...
@@ -57,7 +57,7 @@ class EmailTestMixin(object):
email_user
.
assert_called_with
(
mock_render_to_string
(
subject_template
,
subject_context
),
mock_render_to_string
(
body_template
,
body_context
),
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
)
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
)
)
def
append_allowed_hosts
(
self
,
hostname
):
...
...
@@ -298,7 +298,7 @@ class EmailChangeRequestTests(EventTestMixin, TestCase):
send_mail
.
assert_called_with
(
mock_render_to_string
(
'emails/email_change_subject.txt'
,
context
),
mock_render_to_string
(
'emails/email_change.txt'
,
context
),
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
),
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
),
[
new_email
]
)
self
.
assert_event_emitted
(
...
...
common/djangoapps/student/tests/test_reset_password.py
View file @
1fcf32cf
...
...
@@ -125,7 +125,7 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase):
(
subject
,
msg
,
from_addr
,
to_addrs
)
=
send_email
.
call_args
[
0
]
self
.
assertIn
(
"Password reset"
,
subject
)
self
.
assertIn
(
"You're receiving this e-mail because you requested a password reset"
,
msg
)
self
.
assertEquals
(
from_addr
,
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
))
self
.
assertEquals
(
from_addr
,
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
))
self
.
assertEquals
(
len
(
to_addrs
),
1
)
self
.
assertIn
(
self
.
user
.
email
,
to_addrs
)
...
...
common/djangoapps/student/tests/tests.py
View file @
1fcf32cf
...
...
@@ -46,7 +46,7 @@ from certificates.tests.factories import GeneratedCertificateFactory # pylint:
from
lms.djangoapps.verify_student.models
import
SoftwareSecurePhotoVerification
import
shoppingcart
# pylint: disable=import-error
from
openedx.core.djangoapps.programs.tests.mixins
import
ProgramsApiConfigMixin
from
openedx.core.djangoapps.theming.test_util
import
with_is_edx_domain
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_is_edx_domain
# Explicitly import the cache from ConfigurationModel so we can reset it after each test
from
config_models.models
import
cache
...
...
common/djangoapps/student/views.py
View file @
1fcf32cf
...
...
@@ -2229,11 +2229,11 @@ def reactivation_email_for_user(user):
message
=
render_to_string
(
'emails/activation_email.txt'
,
context
)
try
:
user
.
email_user
(
subject
,
message
,
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
))
user
.
email_user
(
subject
,
message
,
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
))
except
Exception
:
# pylint: disable=broad-except
log
.
error
(
u'Unable to send reactivation email from "
%
s"'
,
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
),
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
),
exc_info
=
True
)
return
JsonResponse
({
...
...
@@ -2357,7 +2357,7 @@ def confirm_email_change(request, key): # pylint: disable=unused-argument
user
.
email_user
(
subject
,
message
,
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
)
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
)
)
except
Exception
:
# pylint: disable=broad-except
log
.
warning
(
'Unable to send confirmation email to old address'
,
exc_info
=
True
)
...
...
@@ -2373,7 +2373,7 @@ def confirm_email_change(request, key): # pylint: disable=unused-argument
user
.
email_user
(
subject
,
message
,
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
)
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
)
)
except
Exception
:
# pylint: disable=broad-except
log
.
warning
(
'Unable to send confirmation email to new address'
,
exc_info
=
True
)
...
...
common/lib/xmodule/xmodule/css/video/display.scss
View file @
1fcf32cf
...
...
@@ -535,8 +535,6 @@
.speed-option
,
.control-lang
{
@include
border-left
(
$baseline
/
10
solid
rgb
(
14
,
166
,
236
));
font-weight
:
$font-bold
;
color
:
rgb
(
14
,
166
,
236
);
// UXPL primary accent
}
}
...
...
common/lib/xmodule/xmodule/js/fixtures/video_yt_multiple.html
View file @
1fcf32cf
...
...
@@ -55,9 +55,8 @@
</div>
</section>
</article>
<div
class=
"subtitles"
>
<ol
class=
"subtitles-menu"
><li></li></ol>
</div>
<ol
class=
"subtitles"
><li></li></ol>
</div>
</div>
</div>
...
...
@@ -109,9 +108,7 @@
</section>
</article>
<div
class=
"subtitles"
>
<ol
class=
"subtitles-menu"
><li></li></ol>
</div>
<ol
class=
"subtitles"
><li></li></ol>
</div>
</div>
</div>
...
...
common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
View file @
1fcf32cf
...
...
@@ -20,10 +20,12 @@ var options = {
libraryFilesToInclude
:
[
{
pattern
:
'common_static/js/vendor/requirejs/require.js'
,
included
:
true
},
{
pattern
:
'RequireJS-namespace-undefine.js'
,
included
:
true
},
{
pattern
:
'spec/main_requirejs.js'
,
included
:
true
},
{
pattern
:
'common_static/coffee/src/ajax_prefix.js'
,
included
:
true
},
{
pattern
:
'common_static/common/js/vendor/underscore.js'
,
included
:
true
},
{
pattern
:
'common_static/common/js/vendor/backbone.js'
,
included
:
true
},
{
pattern
:
'common_static/edx-ui-toolkit/js/utils/global-loader.js'
,
included
:
true
},
{
pattern
:
'common_static/js/vendor/CodeMirror/codemirror.js'
,
included
:
true
},
{
pattern
:
'common_static/js/vendor/draggabilly.js'
},
{
pattern
:
'common_static/common/js/vendor/jquery.js'
,
included
:
true
},
...
...
@@ -48,14 +50,11 @@ var options = {
{
pattern
:
'common_static/js/vendor/jasmine-imagediff.js'
,
included
:
true
},
{
pattern
:
'common_static/common/js/spec_helpers/jasmine-waituntil.js'
,
included
:
true
},
{
pattern
:
'common_static/common/js/spec_helpers/jasmine-extensions.js'
,
included
:
true
},
{
pattern
:
'common_static/js/vendor/sinon-1.17.0.js'
,
included
:
true
},
{
pattern
:
'spec/main_requirejs.js'
,
included
:
true
},
{
pattern
:
'common_static/js/vendor/sinon-1.17.0.js'
,
included
:
true
}
],
libraryFiles
:
[
{
pattern
:
'common_static/edx-pattern-library/js/**/*.js'
},
{
pattern
:
'common_static/edx-ui-toolkit/js/**/*.js'
}
{
pattern
:
'common_static/edx-pattern-library/js/**/*.js'
}
],
// Make sure the patterns in sourceFiles and specFiles do not match the same file.
...
...
common/lib/xmodule/xmodule/js/spec/main_requirejs.js
View file @
1fcf32cf
(
function
(
requirejs
,
define
)
{
'use strict'
;
// We do not wish to bundle common libraries (that may also be used by non-RequireJS code on the page
// into the optimized files. Therefore load these libraries through script tags and explicitly define them.
// Note that when the optimizer executes this code, window will not be defined.
if
(
window
)
{
var
defineDependency
=
function
(
globalName
,
name
,
noShim
)
{
var
getGlobalValue
=
function
(
name
)
{
var
globalNamePath
=
name
.
split
(
'.'
),
result
=
window
,
i
;
for
(
i
=
0
;
i
<
globalNamePath
.
length
;
i
++
)
{
result
=
result
[
globalNamePath
[
i
]];
}
return
result
;
},
globalValue
=
getGlobalValue
(
globalName
);
if
(
globalValue
)
{
if
(
noShim
)
{
define
(
name
,
{});
}
else
{
define
(
name
,
[],
function
()
{
return
globalValue
;
});
}
}
else
{
console
.
error
(
"Expected library to be included on page, but not found on window object: "
+
name
);
}
};
defineDependency
(
"jQuery"
,
"jquery"
);
defineDependency
(
"jQuery"
,
"jquery-migrate"
);
defineDependency
(
"_"
,
"underscore"
);
}
(
function
(
requirejs
)
{
requirejs
.
config
({
baseUrl
:
'/base/'
,
paths
:
{
...
...
@@ -38,8 +6,7 @@
"modernizr"
:
"common_static/edx-pattern-library/js/modernizr-custom"
,
"afontgarde"
:
"common_static/edx-pattern-library/js/afontgarde"
,
"edxicons"
:
"common_static/edx-pattern-library/js/edx-icons"
,
"draggabilly"
:
"common_static/js/vendor/draggabilly"
,
'edx-ui-toolkit'
:
'common_static/edx-ui-toolkit'
"draggabilly"
:
"common_static/js/vendor/draggabilly"
},
"moment"
:
{
exports
:
"moment"
...
...
@@ -51,4 +18,5 @@
exports
:
"AFontGarde"
}
});
}).
call
(
this
,
RequireJS
.
requirejs
,
RequireJS
.
define
);
}).
call
(
this
,
RequireJS
.
requirejs
);
common/lib/xmodule/xmodule/js/spec/video/video_caption_spec.js
View file @
1fcf32cf
...
...
@@ -266,7 +266,6 @@
expect
(
$
(
'.closed-captions'
)).
toHaveAttrs
({
'lang'
:
'de'
});
expect
(
link
).
toHaveAttr
(
'aria-pressed'
,
'true'
);
});
it
(
'when clicking on link with current language'
,
function
()
{
...
...
@@ -285,7 +284,6 @@
expect
(
state
.
storage
.
setItem
)
.
not
.
toHaveBeenCalledWith
(
'language'
,
'en'
);
expect
(
$
(
'.langs-list li.is-active'
).
length
).
toBe
(
1
);
expect
(
link
).
toHaveAttr
(
'aria-pressed'
,
'true'
);
});
it
(
'open the language toggle on hover'
,
function
()
{
...
...
@@ -415,7 +413,7 @@
});
it
(
'show explanation message'
,
function
()
{
expect
(
$
(
'.subtitles
.subtitles
-menu li'
)).
toHaveText
(
expect
(
$
(
'.subtitles-menu li'
)).
toHaveText
(
'Transcript will be displayed when you start playing the video.'
);
});
...
...
common/lib/xmodule/xmodule/js/spec/video/video_speed_control_spec.js
View file @
1fcf32cf
...
...
@@ -203,18 +203,16 @@
describe
(
'onSpeedChange'
,
function
()
{
beforeEach
(
function
()
{
state
=
jasmine
.
initializePlayer
();
$
(
'li[data-speed="1.0"]'
).
addClass
(
'is-active'
)
.
attr
(
'aria-pressed'
,
'true'
)
;
$
(
'li[data-speed="1.0"]'
).
addClass
(
'is-active'
);
state
.
videoSpeedControl
.
setSpeed
(
0.75
);
});
it
(
'set the new speed as active'
,
function
()
{
expect
(
$
(
'li[data-speed="1.0"]'
)).
not
.
toHaveClass
(
'is-active'
);
expect
(
$
(
'li[data-speed="1.0"] .speed-option'
).
attr
(
'aria-pressed'
)).
not
.
toEqual
(
'true'
);
expect
(
$
(
'li[data-speed="0.75"]'
)).
toHaveClass
(
'is-active'
);
expect
(
$
(
'li[data-speed="0.75"] .speed-option'
).
attr
(
'aria-pressed'
)).
toEqual
(
'true'
);
expect
(
$
(
'.speeds .speed-button .value'
)).
toHaveHtml
(
'0.75x'
);
expect
(
$
(
'.video-speeds li[data-speed="1.0"]'
))
.
not
.
toHaveClass
(
'is-active'
);
expect
(
$
(
'.video-speeds li[data-speed="0.75"]'
))
.
toHaveClass
(
'is-active'
);
expect
(
$
(
'.speeds .value'
)).
toHaveHtml
(
'0.75x'
);
});
});
...
...
common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
View file @
1fcf32cf
(
function
(
requirejs
,
require
,
define
)
{
"use strict"
;
define
(
'video/08_video_speed_control.js'
,
[
'video/00_iterator.js'
,
'edx-ui-toolkit/js/utils/html-utils'
],
function
(
Iterator
,
HtmlUtils
)
{
'video/08_video_speed_control.js'
,
[
'video/00_iterator.js'
],
function
(
Iterator
)
{
/**
* Video speed control module.
* @exports video/08_video_speed_control.js
...
...
@@ -96,37 +95,23 @@ define(
* Creates any necessary DOM elements, attach them, and set their,
* initial configuration.
* @param {array} speeds List of speeds available for the player.
* @param {string} currentSpeed The current speed set to the player.
*/
render
:
function
(
speeds
,
currentSpeed
)
{
render
:
function
(
speeds
)
{
var
speedsContainer
=
this
.
speedsContainer
,
reversedSpeeds
=
speeds
.
concat
().
reverse
(),
speedsList
=
$
.
map
(
reversedSpeeds
,
function
(
speed
)
{
return
HtmlUtils
.
interpolateHtml
(
HtmlUtils
.
joinHtml
(
HtmlUtils
.
HTML
(
'<li data-speed="{speed}">'
),
HtmlUtils
.
HTML
(
'<button class="control speed-option" tabindex="-1" aria-pressed="false">'
),
HtmlUtils
.
HTML
(
speed
),
HtmlUtils
.
HTML
(
'x'
),
HtmlUtils
.
HTML
(
'</button>'
),
HtmlUtils
.
HTML
(
'</li>'
)
),
{
speed
:
speed
}
).
toString
();
return
[
'<li data-speed="'
,
speed
,
'">'
,
'<button class="control speed-option" tabindex="-1">'
,
speed
,
'x'
,
'</button>'
,
'</li>'
].
join
(
''
);
});
HtmlUtils
.
setHtml
(
speedsContainer
,
HtmlUtils
.
HTML
(
speedsList
)
);
speedsContainer
.
html
(
speedsList
.
join
(
''
));
this
.
speedLinks
=
new
Iterator
(
speedsContainer
.
find
(
'.speed-option'
));
HtmlUtils
.
prepend
(
this
.
state
.
el
.
find
(
'.secondary-controls'
),
HtmlUtils
.
HTML
(
this
.
el
)
);
this
.
setActiveSpeed
(
currentSpeed
);
this
.
state
.
el
.
find
(
'.secondary-controls'
).
prepend
(
this
.
el
);
},
/**
...
...
@@ -231,38 +216,17 @@ define(
if
(
speed
!==
this
.
currentSpeed
||
forceUpdate
)
{
this
.
speedsContainer
.
find
(
'li'
)
.
siblings
(
"li[data-speed='"
+
speed
+
"']"
);
.
removeClass
(
'is-active'
)
.
siblings
(
"li[data-speed='"
+
speed
+
"']"
)
.
addClass
(
'is-active'
);
this
.
speedButton
.
find
(
'.value'
).
text
(
speed
+
'x'
);
this
.
speedButton
.
find
(
'.value'
).
html
(
speed
+
'x'
);
this
.
currentSpeed
=
speed
;
if
(
!
silent
)
{
this
.
el
.
trigger
(
'speedchange'
,
[
speed
,
this
.
state
.
speed
]);
}
}
this
.
resetActiveSpeed
();
this
.
setActiveSpeed
(
speed
);
},
resetActiveSpeed
:
function
()
{
var
speedOptions
=
this
.
speedsContainer
.
find
(
'li'
);
$
(
speedOptions
).
each
(
function
(
index
,
el
)
{
$
(
el
).
removeClass
(
'is-active'
)
.
find
(
'.speed-option'
)
.
attr
(
'aria-pressed'
,
'false'
);
});
},
setActiveSpeed
:
function
(
speed
)
{
var
speedOption
=
this
.
speedsContainer
.
find
(
'li[data-speed="'
+
speed
+
'"]'
);
speedOption
.
addClass
(
'is-active'
)
.
find
(
'.speed-option'
)
.
attr
(
'aria-pressed'
,
'true'
);
this
.
speedButton
.
attr
(
'title'
,
gettext
(
'Video speed: '
)
+
speed
+
'x'
);
},
/**
...
...
@@ -280,13 +244,10 @@ define(
* @param {jquery Event} event
*/
clickLinkHandler
:
function
(
event
)
{
var
el
=
$
(
event
.
currentTarget
).
parent
(),
speed
=
$
(
el
).
data
(
'speed'
);
this
.
resetActiveSpeed
();
this
.
setActiveSpeed
(
speed
);
var
speed
=
$
(
event
.
currentTarget
).
parent
().
data
(
'speed'
);
this
.
closeMenu
();
this
.
state
.
videoCommands
.
execute
(
'speed'
,
speed
);
this
.
closeMenu
(
true
);
return
false
;
},
...
...
common/lib/xmodule/xmodule/js/src/video/09_video_caption.js
View file @
1fcf32cf
This diff is collapsed.
Click to expand it.
lms/djangoapps/branding/tests/test_views.py
View file @
1fcf32cf
...
...
@@ -10,7 +10,7 @@ import mock
import
ddt
from
config_models.models
import
cache
from
branding.models
import
BrandingApiConfig
from
openedx.core.djangoapps.theming.test_util
import
with_edx_domain_context
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_edx_domain_context
@ddt.ddt
...
...
lms/djangoapps/bulk_email/tasks.py
View file @
1fcf32cf
...
...
@@ -389,7 +389,7 @@ def _get_source_address(course_id, course_title, truncate=True):
course_title
=
course_title_no_quotes
,
course_name
=
course_name
,
from_email
=
theming_helpers
.
get_value
(
'
bulk_email_default_from_email
'
,
'
email_from_address
'
,
settings
.
BULK_EMAIL_DEFAULT_FROM_EMAIL
)
)
...
...
lms/djangoapps/commerce/tests/test_views.py
View file @
1fcf32cf
...
...
@@ -8,7 +8,7 @@ from django.test import TestCase
import
mock
from
student.tests.factories
import
UserFactory
from
openedx.core.djangoapps.theming.test_util
import
with_is_edx_domain
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_is_edx_domain
class
UserMixin
(
object
):
...
...
lms/djangoapps/course_wiki/tests/test_comprehensive_theming.py
View file @
1fcf32cf
...
...
@@ -9,7 +9,7 @@ from wiki.models import URLPath
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
xmodule.modulestore.tests.factories
import
CourseFactory
from
openedx.core.djangoapps.theming.test_util
import
with_comprehensive_theme
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_comprehensive_theme
from
courseware.tests.factories
import
InstructorFactory
from
course_wiki.views
import
get_or_create_root
...
...
lms/djangoapps/courseware/tests/test_comprehensive_theming.py
View file @
1fcf32cf
...
...
@@ -6,7 +6,7 @@ from django.test import TestCase
from
path
import
path
# pylint: disable=no-name-in-module
from
django.contrib
import
staticfiles
from
openedx.core.djangoapps.theming.test_util
import
with_comprehensive_theme
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_comprehensive_theme
from
openedx.core.lib.tempdir
import
mkdtemp_clean
...
...
lms/djangoapps/courseware/tests/test_footer.py
View file @
1fcf32cf
...
...
@@ -9,7 +9,7 @@ from django.conf import settings
from
django.test
import
TestCase
from
django.test.utils
import
override_settings
from
openedx.core.djangoapps.theming.test_util
import
with_is_edx_domain
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_is_edx_domain
@attr
(
'shard_1'
)
...
...
lms/djangoapps/student_account/test/test_views.py
View file @
1fcf32cf
...
...
@@ -33,7 +33,7 @@ from student_account.views import account_settings_context, get_user_orders
from
third_party_auth.tests.testutil
import
simulate_running_pipeline
,
ThirdPartyAuthTestMixin
from
util.testing
import
UrlResetMixin
from
xmodule.modulestore.tests.django_utils
import
ModuleStoreTestCase
from
openedx.core.djangoapps.theming.test_util
import
with_edx_domain_context
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_edx_domain_context
@ddt.ddt
...
...
lms/djangoapps/verify_student/tests/test_views.py
View file @
1fcf32cf
...
...
@@ -39,7 +39,7 @@ from commerce.models import CommerceConfiguration
from
commerce.tests
import
TEST_PAYMENT_DATA
,
TEST_API_URL
,
TEST_API_SIGNING_KEY
,
TEST_PUBLIC_URL_ROOT
from
embargo.test_utils
import
restrict_course
from
openedx.core.djangoapps.user_api.accounts.api
import
get_account_settings
from
openedx.core.djangoapps.theming.test_util
import
with_is_edx_domain
from
openedx.core.djangoapps.theming.test
s.test
_util
import
with_is_edx_domain
from
shoppingcart.models
import
Order
,
CertificateItem
from
student.tests.factories
import
UserFactory
,
CourseEnrollmentFactory
from
student.models
import
CourseEnrollment
...
...
lms/static/karma_lms_coffee.conf.js
View file @
1fcf32cf
...
...
@@ -3,6 +3,7 @@
/* jshint node: true */
/*jshint -W079 */
'use strict'
;
var
path
=
require
(
'path'
);
var
configModule
=
require
(
path
.
join
(
__dirname
,
'../../common/static/common/js/karma.common.conf.js'
));
...
...
@@ -15,27 +16,23 @@ var options = {
// Avoid adding files to this list. Use RequireJS.
libraryFilesToInclude
:
[
{
pattern
:
'xmodule_js/common_static/js/vendor/requirejs/require.js'
,
included
:
true
},
{
pattern
:
'js/RequireJS-namespace-undefine.js'
,
included
:
true
},
{
pattern
:
'common/js/vendor/jquery.js'
,
included
:
true
},
{
pattern
:
'common/js/vendor/jquery-migrate.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/jquery.event.drag-2.2.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/slick.core.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/slick.grid.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/requirejs/require.js'
,
included
:
true
},
{
pattern
:
'lms/js/spec/main_requirejs_coffee.js'
,
included
:
true
},
{
pattern
:
'js/RequireJS-namespace-undefine.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/coffee/src/ajax_prefix.js'
,
included
:
true
},
{
pattern
:
'common/js/vendor/jquery.js'
,
included
:
true
},
{
pattern
:
'common/js/vendor/jquery-migrate.js'
,
included
:
true
},
{
pattern
:
'common/js/vendor/underscore.js'
,
included
:
true
},
{
pattern
:
'edx-ui-toolkit/js/utils/global-loader.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/src/logger.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/test/i18n.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/CodeMirror/codemirror.js'
,
included
:
true
},
{
pattern
:
'common/js/vendor/jquery.js'
,
included
:
true
},
{
pattern
:
'common/js/vendor/jquery-migrate.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/jquery.cookie.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/flot/jquery.flot.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/coffee/src/jquery.immediateDescendents.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/jquery-ui.min.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/moment.min.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/moment-with-locales.min.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/URI.min.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/xblock/*.js'
,
included
:
true
},
...
...
@@ -45,9 +42,7 @@ var options = {
{
pattern
:
'xmodule_js/src/xmodule.js'
,
included
:
true
},
{
pattern
:
'xmodule_js/common_static/js/vendor/jasmine-imagediff.js'
,
included
:
true
},
{
pattern
:
'common/js/spec_helpers/jasmine-extensions.js'
,
included
:
true
},
{
pattern
:
'lms/js/spec/main_requirejs_coffee.js'
,
included
:
true
}
{
pattern
:
'common/js/spec_helpers/jasmine-extensions.js'
,
included
:
true
}
],
libraryFiles
:
[
...
...
lms/static/lms/js/spec/main_requirejs_coffee.js
View file @
1fcf32cf
(
function
(
requirejs
,
define
)
{
(
function
(
requirejs
)
{
'use strict'
;
// We do not wish to bundle common libraries (that may also be used by non-RequireJS code on the page
// into the optimized files. Therefore load these libraries through script tags and explicitly define them.
// Note that when the optimizer executes this code, window will not be defined.
if
(
window
)
{
var
defineDependency
=
function
(
globalName
,
name
,
noShim
)
{
var
getGlobalValue
=
function
(
name
)
{
var
globalNamePath
=
name
.
split
(
'.'
),
result
=
window
,
i
;
for
(
i
=
0
;
i
<
globalNamePath
.
length
;
i
++
)
{
result
=
result
[
globalNamePath
[
i
]];
}
return
result
;
},
globalValue
=
getGlobalValue
(
globalName
);
if
(
globalValue
)
{
if
(
noShim
)
{
define
(
name
,
{});
}
else
{
define
(
name
,
[],
function
()
{
return
globalValue
;
});
}
}
else
{
console
.
error
(
"Expected library to be included on page, but not found on window object: "
+
name
);
}
};
defineDependency
(
"jQuery"
,
"jquery"
);
defineDependency
(
"jQuery"
,
"jquery-migrate"
);
defineDependency
(
"_"
,
"underscore"
);
}
requirejs
.
config
({
baseUrl
:
'/base/'
,
paths
:
{
...
...
@@ -38,8 +7,7 @@
"modernizr"
:
"edx-pattern-library/js/modernizr-custom"
,
"afontgarde"
:
"edx-pattern-library/js/afontgarde"
,
"edxicons"
:
"edx-pattern-library/js/edx-icons"
,
"draggabilly"
:
"xmodule_js/common_static/js/vendor/draggabilly"
,
'edx-ui-toolkit'
:
'edx-ui-toolkit'
"draggabilly"
:
"xmodule_js/common_static/js/vendor/draggabilly"
},
"moment"
:
{
exports
:
"moment"
...
...
@@ -52,4 +20,4 @@
}
});
}).
call
(
this
,
RequireJS
.
requirejs
,
RequireJS
.
define
);
}).
call
(
this
,
requirejs
,
define
);
// jshint ignore:line
lms/templates/emails/activation_email.txt
View file @
1fcf32cf
<%! from django.utils.translation import ugettext as _ %>
${_("Thank you for signing up for {platform_name}.").format(platform_name=settings.PLATFORM_NAME)}
<%! from openedx.core.djangoapps.theming.helpers import get_value as get_themed_value %>
${_("Thank you for signing up for {platform_name}.").format(
platform_name=get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME)
)}
${_("Change your life and start learning today by activating your "
"{platform_name} account. Click on the link below or copy and "
"paste it into your browser's address bar.").format(
platform_name=settings.PLATFORM_NAME
platform_name=get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME)
)}
% if is_secure:
...
...
@@ -15,4 +18,4 @@ ${_("Change your life and start learning today by activating your "
${_("If you didn't request this, you don't need to do anything; you won't "
"receive any more email from us. Please do not reply to this e-mail; "
"if you require assistance, check the help section of the "
"{platform_name} website.").format(platform_name=
settings.PLATFORM_NAME
)}
"{platform_name} website.").format(platform_name=
get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME)
)}
lms/templates/emails/activation_email_subject.txt
View file @
1fcf32cf
<%! from django.utils.translation import ugettext as _ %>
<%! from openedx.core.djangoapps.theming.helpers import get_value as get_themed_value %>
${_("Activate Your {platform_name} Account").format(platform_name=settings.PLATFORM_NAME)}
${_("Activate Your {platform_name} Account").format(
platform_name=get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME
))}
lms/templates/emails/confirm_email_change.txt
View file @
1fcf32cf
<%! from django.core.urlresolvers import reverse %>
<%! from django.utils.translation import ugettext as _ %>
<%! from openedx.core.djangoapps.theming.helpers import get_value as get_themed_value %>
${_("This is to confirm that you changed the e-mail associated with "
"{platform_name} from {old_email} to {new_email}. If you "
"did not make this request, please contact us immediately. Contact "
"information is listed at:").format(platform_name=settings.PLATFORM_NAME, old_email=old_email, new_email=new_email)}
"information is listed at:").format(
platform_name=get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME),
old_email=old_email,
new_email=new_email
)
}
% if is_secure:
https://${ site }${reverse('contact')}
...
...
@@ -11,5 +17,4 @@ ${_("This is to confirm that you changed the e-mail associated with "
http://${ site }${reverse('contact')}
% endif
${_("We keep a log of old e-mails, so if this request was unintentional, we "
"can investigate.")}
${_("We keep a log of old e-mails, so if this request was unintentional, we can investigate.")}
lms/templates/emails/email_change.txt
View file @
1fcf32cf
<%! from django.utils.translation import ugettext as _ %>
<%! from openedx.core.djangoapps.theming.helpers import get_value as get_themed_value %>
${_("We received a request to change the e-mail associated with your "
"{platform_name} account from {old_email} to {new_email}. "
"If this is correct, please confirm your new e-mail address by "
"visiting:").format(platform_name=settings.PLATFORM_NAME, old_email=old_email, new_email=new_email)}
"visiting:").format(
platform_name=get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME),
old_email=old_email,
new_email=new_email
)
}
% if is_secure:
https://${ site }/email_confirm/${ key }
...
...
@@ -13,4 +19,4 @@ ${_("We received a request to change the e-mail associated with your "
${_("If you didn't request this, you don't need to do anything; you won't "
"receive any more email from us. Please do not reply to this e-mail; "
"if you require assistance, check the help section of the "
"{platform_name} web site.").format(platform_name=
settings.PLATFORM_NAME
)}
"{platform_name} web site.").format(platform_name=
get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME)
)}
lms/templates/emails/email_change_subject.txt
View file @
1fcf32cf
<%! from django.utils.translation import ugettext as _ %>
${_("Request to change {platform_name} account e-mail").format(platform_name=settings.PLATFORM_NAME)}
<%! from openedx.core.djangoapps.theming.helpers import get_value as get_themed_value %>
${_("Request to change {platform_name} account e-mail").format(
platform_name=get_themed_value('PLATFORM_NAME', settings.PLATFORM_NAME)
)}
openedx/core/djangoapps/credit/email_utils.py
View file @
1fcf32cf
...
...
@@ -125,7 +125,7 @@ def send_credit_notifications(username, course_key):
notification_msg
.
attach
(
logo_image
)
# add email addresses of sender and receiver
from_address
=
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
)
from_address
=
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
)
to_address
=
user
.
email
# send the root email message
...
...
openedx/core/djangoapps/theming/helpers.py
View file @
1fcf32cf
"""
Helpers for accessing comprehensive theming related variables.
Helpers for accessing comprehensive theming related variables.
"""
from
microsite_configuration
import
microsite
from
microsite_configuration
import
page_title_breadcrumbs
from
django.conf
import
settings
from
microsite_configuration
import
microsite
,
page_title_breadcrumbs
def
get_page_title_breadcrumbs
(
*
args
):
"""
...
...
@@ -17,7 +17,25 @@ def get_value(val_name, default=None, **kwargs):
"""
This is a proxy function to hide microsite_configuration behind comprehensive theming.
"""
return
microsite
.
get_value
(
val_name
,
default
=
default
,
**
kwargs
)
# Retrieve the requested field/value from the microsite configuration
microsite_value
=
microsite
.
get_value
(
val_name
,
default
=
default
,
**
kwargs
)
# Attempt to perform a dictionary update using the provided default
# This will fail if either the default or the microsite value is not a dictionary
try
:
value
=
dict
(
default
)
value
.
update
(
microsite_value
)
# If the dictionary update fails, just use the microsite value
# TypeError: default is not iterable (simple value or None)
# ValueError: default is iterable but not a dict (list, not dict)
# AttributeError: default does not have an 'update' method
except
(
TypeError
,
ValueError
,
AttributeError
):
value
=
microsite_value
# Return the end result to the caller
return
value
def
get_template_path
(
relative_path
,
**
kwargs
):
...
...
openedx/core/djangoapps/theming/tests/__init__.py
0 → 100644
View file @
1fcf32cf
openedx/core/djangoapps/theming/tests/test_helpers.py
0 → 100644
View file @
1fcf32cf
"""
Test helpers for Comprehensive Theming.
"""
from
django.test
import
TestCase
from
mock
import
patch
from
openedx.core.djangoapps.theming
import
helpers
class
ThemingHelpersTests
(
TestCase
):
"""
Make sure some of the theming helper functions work
"""
def
test_get_value_returns_override
(
self
):
"""
Tests to make sure the get_value() operation returns a combined dictionary consisting
of the base container with overridden keys from the microsite configuration
"""
with
patch
(
'microsite_configuration.microsite.get_value'
)
as
mock_get_value
:
override_key
=
'JWT_ISSUER'
override_value
=
'testing'
mock_get_value
.
return_value
=
{
override_key
:
override_value
}
jwt_auth
=
helpers
.
get_value
(
'JWT_AUTH'
)
self
.
assertEqual
(
jwt_auth
[
override_key
],
override_value
)
openedx/core/djangoapps/theming/test_util.py
→
openedx/core/djangoapps/theming/test
s/test
_util.py
View file @
1fcf32cf
...
...
@@ -15,7 +15,7 @@ from django.test.utils import override_settings
import
edxmako
from
.core
import
comprehensive_theme_changes
from
openedx.core.djangoapps.theming
.core
import
comprehensive_theme_changes
EDX_THEME_DIR
=
settings
.
REPO_ROOT
/
"themes"
/
"edx.org"
...
...
openedx/core/djangoapps/user_api/accounts/api.py
View file @
1fcf32cf
...
...
@@ -398,7 +398,7 @@ def request_password_change(email, orig_host, is_secure):
# Generate a single-use link for performing a password reset
# and email it to the user.
form
.
save
(
from_email
=
theming_helpers
.
get_value
(
'
default_from_email
'
,
settings
.
DEFAULT_FROM_EMAIL
),
from_email
=
theming_helpers
.
get_value
(
'
email_from_address
'
,
settings
.
DEFAULT_FROM_EMAIL
),
domain_override
=
orig_host
,
use_https
=
is_secure
)
...
...
requirements/edx/base.txt
View file @
1fcf32cf
...
...
@@ -43,7 +43,7 @@ edx-drf-extensions==0.5.1
edx-lint==0.4.3
edx-django-oauth2-provider==1.1.1
edx-django-sites-extensions==2.0.1
edx-oauth2-provider==1.1.
1
edx-oauth2-provider==1.1.
2
edx-opaque-keys==0.2.1
edx-organizations==0.4.1
edx-rest-api-client==1.2.1
...
...
requirements/edx/github.txt
View file @
1fcf32cf
...
...
@@ -90,7 +90,7 @@ git+https://github.com/edx/xblock-utils.git@v1.0.2#egg=xblock-utils==1.0.2
-e git+https://github.com/edx/edx-reverification-block.git@0.0.5#egg=edx-reverification-block==0.0.5
git+https://github.com/edx/edx-user-state-client.git@1.0.1#egg=edx-user-state-client==1.0.1
git+https://github.com/edx/xblock-lti-consumer.git@v1.0.9#egg=xblock-lti-consumer==1.0.9
git+https://github.com/edx/edx-proctoring.git@0.12.
19#egg=edx-proctoring==0.12.19
git+https://github.com/edx/edx-proctoring.git@0.12.
21#egg=edx-proctoring==0.12.21
# Third Party XBlocks
-e git+https://github.com/mitodl/edx-sga@172a90fd2738f8142c10478356b2d9ed3e55334a#egg=edx-sga
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment