diff --git a/courseware/capa_module.py b/courseware/capa_module.py index 15c19432cd..b94ffac537 100644 --- a/courseware/capa_module.py +++ b/courseware/capa_module.py @@ -245,6 +245,10 @@ class LoncapaModule(XModule): correct_map = self.lcp.grade_answers(answers) except: self.lcp = LoncapaProblem(filename, id=lcp_id, state=old_state) + print {'error':sys.exc_info(), + 'answers':answers, + 'seed':self.lcp.seed, + 'filename':self.lcp.filename} return json.dumps({'success':'syntax'}) self.attempts = self.attempts + 1 diff --git a/settings.py b/settings.py index 9abff2f6ca..be214e5987 100644 --- a/settings.py +++ b/settings.py @@ -125,7 +125,12 @@ LOGGING = { } } -TRACK_DIR = None +#TRACK_DIR = None +DEBUG_TRACK_LOG = False +# Maximum length of a tracking string. We don't want e.g. a file upload in our log +TRACK_MAX_EVENT = 1000 +# Maximum length of log file before starting a new one. +MAXLOG = 500 execfile("../settings.py") diff --git a/simplewiki/mdx_camelcase.py b/simplewiki/mdx_camelcase.py old mode 100644 new mode 100755 index bf4e721860..3ec0c08fe2 --- a/simplewiki/mdx_camelcase.py +++ b/simplewiki/mdx_camelcase.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -print "Hello" - ''' WikiLink Extention for Python-Markdown ====================================== @@ -69,6 +67,13 @@ Dependencies: ''' import markdown +try: + # Markdown 2.1.0 changed from 2.0.3. We try importing the new version first, + # but import the 2.0.3 version if it fails + from markdown.util import etree +except: + from markdown import etree + class CamelCaseExtension(markdown.Extension): def __init__(self, configs): @@ -97,14 +102,14 @@ class CamelCaseExtension(markdown.Extension): class CamelCaseLinks(markdown.inlinepatterns.Pattern): def handleMatch(self, m) : if m.group('escape') == '\\': - a = markdown.etree.Element('a')#doc.createTextNode(m.group('camelcase')) + a = etree.Element('a')#doc.createTextNode(m.group('camelcase')) else : url = m.group('camelcase') #'%s%s%s'% (self.md.wiki_config['base_url'][0], \ #m.group('camelcase'), \ #self.md.wiki_config['end_url'][0]) label = m.group('camelcase').replace('_', ' ') - a = markdown.etree.Element('a') + a = etree.Element('a') a.set('href', url) a.text = label a.set('class', 'wikilink') diff --git a/simplewiki/mdx_circuit.py b/simplewiki/mdx_circuit.py old mode 100644 new mode 100755 index 16e9bdd229..efac721b7c --- a/simplewiki/mdx_circuit.py +++ b/simplewiki/mdx_circuit.py @@ -7,12 +7,16 @@ circuit:name becomes the circuit. ''' import simplewiki.settings as settings -import markdown -from markdown import etree_loader from djangomako.shortcuts import render_to_response, render_to_string -ElementTree=etree_loader.importETree() +import markdown +try: + # Markdown 2.1.0 changed from 2.0.3. We try importing the new version first, + # but import the 2.0.3 version if it fails + from markdown.util import etree +except: + from markdown import etree class CircuitExtension(markdown.Extension): def __init__(self, configs): @@ -26,18 +30,16 @@ class CircuitExtension(markdown.Extension): md.inlinePatterns.add(name, pattern, "[a-zA-Z0-9]*)$') class CircuitLink(markdown.inlinepatterns.Pattern): def handleMatch(self, m): name = m.group('name') if not name.isalnum(): - return ElementTree.fromstring("
Circuit name must be alphanumeric
") + return etree.fromstring("
Circuit name must be alphanumeric
") - return ElementTree.fromstring(render_to_string('show_circuit.html', {'name':name})) + return etree.fromstring(render_to_string('show_circuit.html', {'name':name})) def makeExtension(configs=None) : - print "Here" return CircuitExtension(configs=configs) diff --git a/simplewiki/mdx_image.py b/simplewiki/mdx_image.py old mode 100644 new mode 100755 index 7f74a07550..956641baa7 --- a/simplewiki/mdx_image.py +++ b/simplewiki/mdx_image.py @@ -16,7 +16,15 @@ Requires Python-Markdown 1.6+ ''' import simplewiki.settings as settings + import markdown +try: + # Markdown 2.1.0 changed from 2.0.3. We try importing the new version first, + # but import the 2.0.3 version if it fails + from markdown.util import etree +except: + from markdown import etree + class ImageExtension(markdown.Extension): def __init__(self, configs): @@ -35,7 +43,7 @@ class ImageExtension(markdown.Extension): class ImageLink(markdown.inlinepatterns.Pattern): def handleMatch(self, m): - img = markdown.etree.Element('img') + img = etree.Element('img') proto = m.group('proto') or "http://" domain = m.group('domain') path = m.group('path') diff --git a/simplewiki/mdx_mathjax.py b/simplewiki/mdx_mathjax.py index bc25bace66..e694ca861e 100644 --- a/simplewiki/mdx_mathjax.py +++ b/simplewiki/mdx_mathjax.py @@ -1,8 +1,12 @@ # Source: https://github.com/mayoff/python-markdown-mathjax -print "Hello" - import markdown +try: + # Markdown 2.1.0 changed from 2.0.3. We try importing the new version first, + # but import the 2.0.3 version if it fails + from markdown.util import etree, AtomicString +except: + from markdown import etree, AtomicString class MathJaxPattern(markdown.inlinepatterns.Pattern): @@ -10,7 +14,9 @@ class MathJaxPattern(markdown.inlinepatterns.Pattern): markdown.inlinepatterns.Pattern.__init__(self, r'(?= MAXLOG: + if logfile == None or log_index >= settings.MAXLOG: make_file() - event_str = json.dumps(event) - logfile.write(event_str+'\n') + logfile.write(event_str[:settings.TRACK_MAX_EVENT]+'\n') + if settings.DEBUG_TRACK_LOG: + print event_str log_index = log_index + 1 def user_track(request): + try: # TODO: Do the same for many of the optional META parameters + username = request.user.username + except: + username = "anonymous" + + # TODO: Move a bunch of this into log_event event = { - "username" : request.user.username, + "username" : username, "session" : request.META['HTTP_COOKIE'], "ip" : request.META['REMOTE_ADDR'], "event_source" : "browser", @@ -57,8 +64,13 @@ def user_track(request): return HttpResponse('success') def server_track(request, event_type, event, page=None): + try: + username = request.user.username + except: + username = "anonymous" + event = { - "username" : request.user.username, + "username" : username, "ip" : request.META['REMOTE_ADDR'], "event_source" : "server", "event_type" : event_type, diff --git a/util/views.py b/util/views.py index b555cbfade..f61edf040e 100644 --- a/util/views.py +++ b/util/views.py @@ -10,27 +10,36 @@ import courseware.capa.calc from django.core.mail import send_mail from django.conf import settings import datetime +import sys +import track.views def calculate(request): - if not request.user.is_authenticated(): - raise Http404 +# if not request.user.is_authenticated(): +# raise Http404 equation = request.GET['equation'] try: result = courseware.capa.calc.evaluator({}, {}, equation) except: + event = {'error':map(str,sys.exc_info()), + 'equation':equation} + track.views.server_track(request, 'error:calc', event, page='calc') return HttpResponse(json.dumps({'result':'Invalid syntax'})) return HttpResponse(json.dumps({'result':result})) def send_feedback(request): - if not request.user.is_authenticated(): - raise Http404 +# if not request.user.is_authenticated(): +# raise Http404 + try: + username = request.user.username + except: + username = "anonymous" feedback = render_to_string("feedback_email.txt", {"subject":request.POST['subject'], "url": request.POST['url'], "time": datetime.datetime.now().isoformat(), "feedback": request.POST['message'], - "user":request.user.username}) + "user":username}) send_mail("MITx Feedback / " +request.POST['subject'], feedback,