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
fb2f9948
Commit
fb2f9948
authored
Aug 08, 2016
by
Mushtaq Ali
Committed by
Mushtaq Ali
Aug 09, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix dynamic load RequireJs issue on Maintenance Dashboard
parent
abb6af97
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
74 additions
and
66 deletions
+74
-66
cms/djangoapps/contentstore/views/tests/test_certificates.py
+4
-2
cms/static/js/maintenance/force_publish_course.js
+30
-33
cms/templates/maintenance/container.html
+14
-9
lms/djangoapps/instructor/views/api.py
+26
-22
No files found.
cms/djangoapps/contentstore/views/tests/test_certificates.py
View file @
fb2f9948
...
...
@@ -198,7 +198,8 @@ class CertificatesBaseTestCase(object):
@ddt.ddt
@override_settings
(
FEATURES
=
FEATURES_WITH_CERTS_ENABLED
)
class
CertificatesListHandlerTestCase
(
EventTestMixin
,
CourseTestCase
,
CertificatesBaseTestCase
,
HelperMethods
,
UrlResetMixin
):
EventTestMixin
,
CourseTestCase
,
CertificatesBaseTestCase
,
HelperMethods
,
UrlResetMixin
):
"""
Test cases for certificates_list_handler.
"""
...
...
@@ -423,7 +424,8 @@ class CertificatesListHandlerTestCase(
@ddt.ddt
@override_settings
(
FEATURES
=
FEATURES_WITH_CERTS_ENABLED
)
class
CertificatesDetailHandlerTestCase
(
EventTestMixin
,
CourseTestCase
,
CertificatesBaseTestCase
,
HelperMethods
,
UrlResetMixin
):
EventTestMixin
,
CourseTestCase
,
CertificatesBaseTestCase
,
HelperMethods
,
UrlResetMixin
):
"""
Test cases for CertificatesDetailHandlerTestCase.
"""
...
...
cms/static/js/maintenance/force_publish_course.js
View file @
fb2f9948
...
...
@@ -4,15 +4,14 @@ define([ // jshint ignore:line
'gettext'
,
'common/js/components/utils/view_utils'
,
'edx-ui-toolkit/js/utils/string-utils'
,
"edx-ui-toolkit/js/utils/html-utils"
,
'text!templates/maintenance/force-published-course-response.underscore'
'edx-ui-toolkit/js/utils/html-utils'
],
function
(
$
,
_
,
gettext
,
ViewUtils
,
StringUtils
,
HtmlUtils
,
ForcePublishedTemplate
)
{
function
(
$
,
_
,
gettext
,
ViewUtils
,
StringUtils
,
HtmlUtils
)
{
'use strict'
;
return
function
(
maintenanceViewURL
)
{
return
function
(
maintenanceViewURL
)
{
var
showError
;
// Reset values
$
(
'#reset-button'
).
click
(
function
(
e
)
{
$
(
'#reset-button'
).
click
(
function
(
e
)
{
e
.
preventDefault
();
$
(
'#course-id'
).
val
(
''
);
$
(
'#dry-run'
).
prop
(
'checked'
,
true
);
...
...
@@ -20,60 +19,58 @@ function($, _, gettext, ViewUtils, StringUtils, HtmlUtils, ForcePublishedTemplat
$
(
'#result-container'
).
html
(
''
);
});
var
showError
=
function
(
containerElSelector
,
error
){
var
errorWrapperElSelector
=
containerElSelector
+
' .wrapper-error'
;
var
errorHtml
=
'<div class="error" aria-live="polite" id="course-id-error">'
+
error
+
'</div>'
;
HtmlUtils
.
setHtml
(
$
(
errorWrapperElSelector
),
HtmlUtils
.
HTML
(
errorHtml
)
);
showError
=
function
(
containerElSelector
,
error
)
{
var
errorWrapperElSelector
,
errorHtml
;
errorWrapperElSelector
=
containerElSelector
+
' .wrapper-error'
;
errorHtml
=
'<div class="error" aria-live="polite" id="course-id-error">'
+
error
+
'</div>'
;
HtmlUtils
.
setHtml
(
$
(
errorWrapperElSelector
),
HtmlUtils
.
HTML
(
errorHtml
));
$
(
errorWrapperElSelector
).
css
(
'display'
,
'inline-block'
);
$
(
errorWrapperElSelector
).
fadeOut
(
5000
);
};
$
(
'form#force_publish'
).
submit
(
function
(
event
)
{
var
attrs
,
forcePublishedTemplate
,
$submitButton
,
deferred
,
promise
,
data
;
event
.
preventDefault
();
// clear out result container
$
(
'#result-container'
).
html
(
''
);
var
submitButton
=
$
(
'#submit_force_publish'
),
deferred
=
new
$
.
Deferred
(),
promise
=
deferred
.
promise
();
ViewUtils
.
disableElementWhileRunning
(
submitButton
,
function
()
{
return
promise
;
});
$submitButton
=
$
(
'#submit_force_publish'
);
deferred
=
new
$
.
Deferred
();
promise
=
deferred
.
promise
();
data
=
$
(
'#force_publish'
).
serialize
();
var
data
=
$
(
'#force_publish'
).
serialize
();
// disable submit button while executing.
ViewUtils
.
disableElementWhileRunning
(
$submitButton
,
function
()
{
return
promise
;
});
$
.
ajax
({
type
:
'POST'
,
type
:
'POST'
,
url
:
maintenanceViewURL
,
dataType
:
'json'
,
data
:
data
,
data
:
data
})
.
done
(
function
(
response
)
{
if
(
response
.
error
)
{
if
(
response
.
error
)
{
showError
(
'#course-id-container'
,
response
.
msg
);
}
else
{
if
(
response
.
msg
)
{
}
else
{
if
(
response
.
msg
)
{
showError
(
'#result-error'
,
response
.
msg
);
}
else
{
var
attrs
=
$
.
extend
({},
response
,
{
StringUtils
:
StringUtils
});
HtmlUtils
.
setHtml
(
$
(
'#result-container'
),
HtmlUtils
.
template
(
ForcePublishedTemplate
)(
attrs
)
}
else
{
attrs
=
$
.
extend
({},
response
,
{
StringUtils
:
StringUtils
});
forcePublishedTemplate
=
HtmlUtils
.
template
(
$
(
'#force-published-course-response-tpl'
).
text
()
);
HtmlUtils
.
setHtml
(
$
(
'#result-container'
),
forcePublishedTemplate
(
attrs
));
}
}
})
.
fail
(
function
(
response
)
{
// jshint ignore:line
.
fail
(
function
(
)
{
// response.responseText here because it would show some strange output, it may output Traceback
// sometimes if unexpected issue arises. Better to show just internal error when getting 500 error.
showError
(
'#result-error'
,
gettext
(
'Internal Server Error.'
));
})
.
always
(
function
(
response
)
{
// jshint ignore:line
.
always
(
function
(
)
{
deferred
.
resolve
();
});
});
...
...
cms/templates/maintenance/container.html
View file @
fb2f9948
...
...
@@ -12,17 +12,22 @@ from openedx.core.djangolib.js_utils import js_escaped_string
</h3>
</
%
block>
<
%
block
name=
"js_extra"
>
<script
src=
"${static.url('js/maintenance/force_publish.js')}"
></script>
</
%
block>
<
%
block
name=
"viewcontent"
>
<section
class=
"container maintenance-content"
>
<
%
include
file=
"_${view['slug']}.html"
/>
<
%
block
name=
"requirejs"
>
require(["js/maintenance/${view['slug'] | n, js_escaped_string}"], function(MaintenanceFactory) {
MaintenanceFactory("${reverse(view['url']) | n, js_escaped_string}");
});
</
%
block>
</section>
</
%
block>
<
%
block
name=
"header_extras"
>
% for template_name in ["force-published-course-response"]:
<script
type=
"text/template"
id=
"${template_name}-tpl"
>
<%
static
:
include
path
=
"js/maintenance/${template_name}.underscore"
/>
</script>
% endfor
</
%
block>
<
%
block
name=
"requirejs"
>
require(["js/maintenance/${view['slug'] | n, js_escaped_string}"], function(MaintenanceFactory) {
MaintenanceFactory("${reverse(view['url']) | n, js_escaped_string}");
});
</
%
block>
lms/djangoapps/instructor/views/api.py
View file @
fb2f9948
...
...
@@ -11,7 +11,7 @@ import logging
import
re
import
time
from
django.conf
import
settings
from
django.views.decorators.csrf
import
ensure_csrf_cookie
,
csrf_exempt
from
django.views.decorators.csrf
import
ensure_csrf_cookie
from
django.views.decorators.http
import
require_POST
,
require_http_methods
from
django.views.decorators.cache
import
cache_control
from
django.core.exceptions
import
ValidationError
,
PermissionDenied
...
...
@@ -29,7 +29,7 @@ import random
import
unicodecsv
import
decimal
from
student
import
auth
from
student.roles
import
GlobalStaff
,
CourseSalesAdminRole
,
CourseFinanceAdminRole
from
student.roles
import
CourseSalesAdminRole
,
CourseFinanceAdminRole
from
util.file
import
(
store_uploaded_file
,
course_and_time_based_filename_generator
,
FileValidationException
,
UniversalNewlineIterator
...
...
@@ -38,8 +38,6 @@ from util.json_request import JsonResponse, JsonResponseBadRequest
from
util.views
import
require_global_staff
from
instructor.views.instructor_task_helpers
import
extract_email_features
,
extract_task_features
from
microsite_configuration
import
microsite
from
courseware.access
import
has_access
from
courseware.courses
import
get_course_with_access
,
get_course_by_id
from
django.contrib.auth.models
import
User
...
...
@@ -111,7 +109,7 @@ from opaque_keys.edx.keys import CourseKey, UsageKey
from
opaque_keys.edx.locations
import
SlashSeparatedCourseKey
from
opaque_keys
import
InvalidKeyError
from
openedx.core.djangoapps.course_groups.cohorts
import
is_course_cohorted
from
openedx.core.djangoapps.
theming
import
helpers
as
theming
_helpers
from
openedx.core.djangoapps.
site_configuration
import
helpers
as
configuration
_helpers
log
=
logging
.
getLogger
(
__name__
)
...
...
@@ -287,7 +285,10 @@ def register_and_enroll_students(request, course_id): # pylint: disable=too-man
The failure will be messaged in a response in the browser.
"""
if
not
microsite
.
get_value
(
'ALLOW_AUTOMATED_SIGNUPS'
,
settings
.
FEATURES
.
get
(
'ALLOW_AUTOMATED_SIGNUPS'
,
False
)):
if
not
configuration_helpers
.
get_value
(
'ALLOW_AUTOMATED_SIGNUPS'
,
settings
.
FEATURES
.
get
(
'ALLOW_AUTOMATED_SIGNUPS'
,
False
),
):
return
HttpResponseForbidden
()
course_id
=
SlashSeparatedCourseKey
.
from_deprecated_string
(
course_id
)
...
...
@@ -534,7 +535,7 @@ def create_and_enroll_user(email, username, name, country, password, course_id,
'message'
:
'account_creation_and_enrollment'
,
'email_address'
:
email
,
'password'
:
password
,
'platform_name'
:
microsite
.
get_value
(
'platform_name'
,
settings
.
PLATFORM_NAME
),
'platform_name'
:
configuration_helpers
.
get_value
(
'platform_name'
,
settings
.
PLATFORM_NAME
),
})
send_mail_to_student
(
email
,
email_params
)
except
Exception
as
ex
:
# pylint: disable=broad-except
...
...
@@ -1198,7 +1199,7 @@ def get_students_features(request, course_id, csv=False): # pylint: disable=red
available_features
=
instructor_analytics
.
basic
.
AVAILABLE_FEATURES
# Allow for
micro
sites to be able to define additional columns.
# Allow for sites to be able to define additional columns.
# Note that adding additional columns has the potential to break
# the student profile report due to a character limit on the
# asynchronous job input which in this case is a JSON string
...
...
@@ -1206,7 +1207,7 @@ def get_students_features(request, course_id, csv=False): # pylint: disable=red
# TODO: Refactor the student profile report code to remove the list of columns
# that should be included in the report from the asynchronous job input.
# We need to clone the list because we modify it below
query_features
=
list
(
microsite
.
get_value
(
'student_profile_download_fields'
,
[]))
query_features
=
list
(
configuration_helpers
.
get_value
(
'student_profile_download_fields'
,
[]))
if
not
query_features
:
query_features
=
[
...
...
@@ -1691,15 +1692,15 @@ def generate_registration_codes(request, course_id):
)
registration_codes
.
append
(
generated_registration_code
)
site_name
=
microsite
.
get_value
(
'SITE_NAME'
,
'localhost'
)
site_name
=
configuration_helpers
.
get_value
(
'SITE_NAME'
,
'localhost'
)
quantity
=
course_code_number
discount
=
(
float
(
quantity
*
course_price
)
-
float
(
sale_price
))
course_url
=
'{base_url}{course_about}'
.
format
(
base_url
=
microsite
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
),
base_url
=
configuration_helpers
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
),
course_about
=
reverse
(
'about_course'
,
kwargs
=
{
'course_id'
:
course_id
.
to_deprecated_string
()})
)
dashboard_url
=
'{base_url}{dashboard}'
.
format
(
base_url
=
microsite
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
),
base_url
=
configuration_helpers
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
),
dashboard
=
reverse
(
'dashboard'
)
)
...
...
@@ -1709,7 +1710,7 @@ def generate_registration_codes(request, course_id):
log
.
exception
(
'Exception at creating pdf file.'
)
pdf_file
=
None
from_address
=
theming
_helpers
.
get_value
(
'email_from_address'
,
settings
.
DEFAULT_FROM_EMAIL
)
from_address
=
configuration
_helpers
.
get_value
(
'email_from_address'
,
settings
.
DEFAULT_FROM_EMAIL
)
context
=
{
'invoice'
:
sale_invoice
,
'site_name'
:
site_name
,
...
...
@@ -1722,11 +1723,14 @@ def generate_registration_codes(request, course_id):
'registration_codes'
:
registration_codes
,
'currency_symbol'
:
settings
.
PAID_COURSE_REGISTRATION_CURRENCY
[
1
],
'course_url'
:
course_url
,
'platform_name'
:
microsite
.
get_value
(
'platform_name'
,
settings
.
PLATFORM_NAME
),
'platform_name'
:
configuration_helpers
.
get_value
(
'platform_name'
,
settings
.
PLATFORM_NAME
),
'dashboard_url'
:
dashboard_url
,
'contact_email'
:
from_address
,
'corp_address'
:
microsite
.
get_value
(
'invoice_corp_address'
,
settings
.
INVOICE_CORP_ADDRESS
),
'payment_instructions'
:
microsite
.
get_value
(
'invoice_payment_instructions'
,
settings
.
INVOICE_PAYMENT_INSTRUCTIONS
),
'corp_address'
:
configuration_helpers
.
get_value
(
'invoice_corp_address'
,
settings
.
INVOICE_CORP_ADDRESS
),
'payment_instructions'
:
configuration_helpers
.
get_value
(
'invoice_payment_instructions'
,
settings
.
INVOICE_PAYMENT_INSTRUCTIONS
,
),
'date'
:
time
.
strftime
(
"
%
m/
%
d/
%
Y"
)
}
# composes registration codes invoice email
...
...
@@ -1740,11 +1744,11 @@ def generate_registration_codes(request, course_id):
csv_writer
=
csv
.
writer
(
csv_file
)
for
registration_code
in
registration_codes
:
full_redeem_code_url
=
'http://{base_url}{redeem_code_url}'
.
format
(
base_url
=
microsite
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
),
base_url
=
configuration_helpers
.
get_value
(
'SITE_NAME'
,
settings
.
SITE_NAME
),
redeem_code_url
=
reverse
(
'register_code_redemption'
,
kwargs
=
{
'registration_code'
:
registration_code
.
code
})
)
csv_writer
.
writerow
([
registration_code
.
code
,
full_redeem_code_url
])
finance_email
=
microsite
.
get_value
(
'finance_email'
,
settings
.
FINANCE_EMAIL
)
finance_email
=
configuration_helpers
.
get_value
(
'finance_email'
,
settings
.
FINANCE_EMAIL
)
if
finance_email
:
# append the finance email into the recipient_list
recipient_list
.
append
(
finance_email
)
...
...
@@ -2485,13 +2489,13 @@ def send_email(request, course_id):
subject
=
request
.
POST
.
get
(
"subject"
)
message
=
request
.
POST
.
get
(
"message"
)
# allow two branding points to come from
Microsites
: which CourseEmailTemplate should be used
# allow two branding points to come from
Site Configuration
: which CourseEmailTemplate should be used
# and what the 'from' field in the email should be
#
# If these are None (
because we are not in a Microsite or they are undefined in Microsite config
) than
# If these are None (
there is no site configuration enabled for the current site
) than
# the system will use normal system defaults
template_name
=
microsite
.
get_value
(
'course_email_template_name'
)
from_addr
=
microsite
.
get_value
(
'course_email_from_addr'
)
template_name
=
configuration_helpers
.
get_value
(
'course_email_template_name'
)
from_addr
=
configuration_helpers
.
get_value
(
'course_email_from_addr'
)
# Create the CourseEmail object. This is saved immediately, so that
# any transaction that has been pending up to this point will also be
...
...
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