diff --git a/djangoapps/courseware/module_render.py b/djangoapps/courseware/module_render.py index fc7240286f..278d19fd2c 100644 --- a/djangoapps/courseware/module_render.py +++ b/djangoapps/courseware/module_render.py @@ -98,14 +98,20 @@ def render_x_module(user, request, xml_module, module_object_preload): # get coursename if stored coursename = multicourse_settings.get_coursename_from_request(request) - xp = multicourse_settings.get_course_xmlpath(coursename) # path to XML for the course + + if coursename and settings.ENABLE_MULTICOURSE: + xp = multicourse_settings.get_course_xmlpath(coursename) # path to XML for the course + data_root = settings.DATA_DIR + xp + else: + data_root = settings.DATA_DIR # Create a new instance ajax_url = settings.MITX_ROOT_URL + '/modx/'+module_type+'/'+module_id+'/' + system = I4xSystem(track_function = make_track_function(request), render_function = lambda x: render_module(user, request, x, module_object_preload), ajax_url = ajax_url, - filestore = OSFS(settings.DATA_DIR + xp), + filestore = OSFS(data_root), ) instance=module_class(system, etree.tostring(xml_module), diff --git a/djangoapps/courseware/views.py b/djangoapps/courseware/views.py index 857bdd2e03..313259bdb7 100644 --- a/djangoapps/courseware/views.py +++ b/djangoapps/courseware/views.py @@ -19,7 +19,6 @@ from lxml import etree from module_render import render_module, make_track_function, I4xSystem from models import StudentModule from student.models import UserProfile -from util.errors import record_exception from util.views import accepts from multicourse import multicourse_settings @@ -114,7 +113,7 @@ def render_section(request, section): try: dom = content_parser.section_file(user, section, coursename) except: - record_exception(log, "Unable to parse courseware xml") + log.exception("Unable to parse courseware xml") return render_to_response('courseware-error.html', {}) context = { @@ -133,7 +132,7 @@ def render_section(request, section): try: module = render_module(user, request, dom, module_object_preload) except: - record_exception(log, "Unable to load module") + log.exception("Unable to load module") context.update({ 'init': '', 'content': render_to_string("module-error.html", {}), @@ -182,7 +181,7 @@ def index(request, course=None, chapter="Using the System", section="Hints"): try: dom = content_parser.course_file(user,course) # also pass course to it, for course-specific XML path except: - record_exception(log, "Unable to parse courseware xml") + log.exception("Unable to parse courseware xml") return render_to_response('courseware-error.html', {}) dom_module = dom.xpath("//course[@name=$course]/chapter[@name=$chapter]//section[@name=$section]/*[1]", @@ -211,7 +210,7 @@ def index(request, course=None, chapter="Using the System", section="Hints"): try: module = render_module(user, request, module, module_object_preload) except: - record_exception(log, "Unable to load module") + log.exception("Unable to load module") context.update({ 'init': '', 'content': render_to_string("module-error.html", {}), @@ -250,13 +249,18 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): # get coursename if stored coursename = multicourse_settings.get_coursename_from_request(request) - xp = multicourse_settings.get_course_xmlpath(coursename) # path to XML for the course + + if coursename and settings.ENABLE_MULTICOURSE: + xp = multicourse_settings.get_course_xmlpath(coursename) # path to XML for the course + data_root = settings.DATA_DIR + xp + else: + data_root = settings.DATA_DIR # Grab the XML corresponding to the request from course.xml try: xml = content_parser.module_xml(request.user, module, 'id', id, coursename) except: - record_exception(log, "Unable to load module during ajax call") + log.exception("Unable to load module during ajax call") if accepts(request, 'text/html'): return render_to_response("module-error.html", {}) else: @@ -267,7 +271,7 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): system = I4xSystem(track_function = make_track_function(request), render_function = None, ajax_url = ajax_url, - filestore = OSFS(settings.DATA_DIR + xp), + filestore = OSFS(data_root), ) try: @@ -276,7 +280,7 @@ def modx_dispatch(request, module=None, dispatch=None, id=None): id, state=oldstate) except: - record_exception(log, "Unable to load module instance during ajax call") + log.exception("Unable to load module instance during ajax call") if accepts(request, 'text/html'): return render_to_response("module-error.html", {}) else: diff --git a/envs/logsettings.py b/envs/logsettings.py index 3f077703fc..abfdf04b8e 100644 --- a/envs/logsettings.py +++ b/envs/logsettings.py @@ -29,7 +29,7 @@ def get_logger_config(log_dir, " %(process)d] [%(filename)s:%(lineno)d] - %(message)s").format( logging_env=logging_env, hostname=hostname) - handlers = ['console'] if debug else ['console', 'syslogger'] + handlers = ['console'] if debug else ['console', 'syslogger', 'newrelic'] return { 'version': 1, @@ -60,6 +60,11 @@ def get_logger_config(log_dir, 'filename' : tracking_file_loc, 'formatter' : 'raw', }, + 'newrelic' : { + 'level': 'ERROR', + 'class': 'newrelic_logging.NewRelicHandler', + 'formatter': 'raw', + } }, 'loggers' : { 'django' : { diff --git a/lib/newrelic_logging/__init__.py b/lib/newrelic_logging/__init__.py new file mode 100644 index 0000000000..2c5749e3fa --- /dev/null +++ b/lib/newrelic_logging/__init__.py @@ -0,0 +1,14 @@ +import newrelic.agent + +import logging + +class NewRelicHandler(logging.Handler): + def emit(self, record): + if record.exc_info is not None: + params = record.__dict__ + params['log_message'] = record.getMessage() + + newrelic.agent.record_exception( + *record.exc_info, + params=params + ) diff --git a/lib/util/errors.py b/lib/util/errors.py deleted file mode 100644 index c662003a11..0000000000 --- a/lib/util/errors.py +++ /dev/null @@ -1,7 +0,0 @@ -import newrelic.agent -import sys - -def record_exception(logger, msg, params={}, ignore_errors=[]): - logger.exception(msg) - newrelic.agent.record_exception(*sys.exc_info()) - diff --git a/static/coffee/src/calculator.coffee b/static/coffee/src/calculator.coffee index 7d62f5a794..003cf5b1f4 100644 --- a/static/coffee/src/calculator.coffee +++ b/static/coffee/src/calculator.coffee @@ -10,6 +10,11 @@ class window.Calculator toggle: -> $('li.calc-main').toggleClass 'open' $('#calculator_wrapper #calculator_input').focus() + if $('.calc.closed').length + $('.calc').attr 'aria-label', 'Open Calculator' + else + $('.calc').attr 'aria-label', 'Close Calculator' + $('.calc').toggleClass 'closed' helpToggle: -> diff --git a/templates/courseware.html b/templates/courseware.html index 050172626a..404871e49c 100644 --- a/templates/courseware.html +++ b/templates/courseware.html @@ -20,7 +20,7 @@
-
+

Courseware Index

close diff --git a/templates/info.html b/templates/info.html index 8c914f9f60..67ce69ec85 100644 --- a/templates/info.html +++ b/templates/info.html @@ -27,14 +27,14 @@ $(document).ready(function(){
<%include file="updates.html" />
-
+
<%include file="handouts.html" />
% else:
<%include file="guest_updates.html" />
-
+
<%include file="guest_handouts.html" />
% endif diff --git a/templates/main.html b/templates/main.html index 472ed58100..beeb9d991e 100644 --- a/templates/main.html +++ b/templates/main.html @@ -43,7 +43,7 @@

Copyright © 2012. MIT. Some rights reserved.

-