From 7c6e33acb30d201aa78ad06366ad1a7680a751cb Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Sat, 14 Jan 2012 00:03:22 -0500 Subject: [PATCH 1/5] Removed wiki print statements --- simplewiki/mdx_camelcase.py | 2 -- simplewiki/mdx_circuit.py | 2 -- simplewiki/mdx_mathjax.py | 2 -- simplewiki/models.py | 1 - simplewiki/settings.py | 1 - 5 files changed, 8 deletions(-) diff --git a/simplewiki/mdx_camelcase.py b/simplewiki/mdx_camelcase.py index bf4e721860..1b979520ab 100644 --- 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 ====================================== diff --git a/simplewiki/mdx_circuit.py b/simplewiki/mdx_circuit.py index 16e9bdd229..95d0359253 100644 --- a/simplewiki/mdx_circuit.py +++ b/simplewiki/mdx_circuit.py @@ -26,7 +26,6 @@ class CircuitExtension(markdown.Extension): md.inlinePatterns.add(name, pattern, "[a-zA-Z0-9]*)$') class CircuitLink(markdown.inlinepatterns.Pattern): @@ -39,5 +38,4 @@ class CircuitLink(markdown.inlinepatterns.Pattern): def makeExtension(configs=None) : - print "Here" return CircuitExtension(configs=configs) diff --git a/simplewiki/mdx_mathjax.py b/simplewiki/mdx_mathjax.py index bc25bace66..1afb3c9ed9 100644 --- a/simplewiki/mdx_mathjax.py +++ b/simplewiki/mdx_mathjax.py @@ -1,7 +1,5 @@ # Source: https://github.com/mayoff/python-markdown-mathjax -print "Hello" - import markdown class MathJaxPattern(markdown.inlinepatterns.Pattern): diff --git a/simplewiki/models.py b/simplewiki/models.py index 2d04299360..d549534659 100644 --- a/simplewiki/models.py +++ b/simplewiki/models.py @@ -247,7 +247,6 @@ class Revision(models.Model): # Create pre-parsed contents - no need to parse on-the-fly ext = WIKI_MARKDOWN_EXTENSIONS - print "Waka", WIKI_MARKDOWN_EXTENSIONS ext += ["wikilinks(base_url=%s/)" % reverse('wiki_view', args=('',))] self.contents_parsed = markdown(self.contents, extensions=ext, diff --git a/simplewiki/settings.py b/simplewiki/settings.py index 58c54130b3..3e5bab94d6 100644 --- a/simplewiki/settings.py +++ b/simplewiki/settings.py @@ -94,7 +94,6 @@ WIKI_MARKDOWN_EXTENSIONS = getattr(settings, 'SIMPLE_WIKI_MARKDOWN_EXTENSIONS', 'circuit' ]) -print WIKI_MARKDOWN_EXTENSIONS WIKI_IMAGE_EXTENSIONS = getattr(settings, 'SIMPLE_WIKI_IMAGE_EXTENSIONS', From 238ed768966918855241245c03411a6d0209923e Mon Sep 17 00:00:00 2001 From: Bridger Maxwell Date: Sat, 14 Jan 2012 00:09:01 -0500 Subject: [PATCH 2/5] The new markdown framework version was not backwards compatible. Now the wiki source can use either version of the API. --- simplewiki/mdx_camelcase.py | 11 +++++++++-- simplewiki/mdx_circuit.py | 14 +++++++++----- simplewiki/mdx_image.py | 10 +++++++++- simplewiki/mdx_mathjax.py | 12 +++++++++--- simplewiki/mdx_video.py | 17 ++++++++++++----- 5 files changed, 48 insertions(+), 16 deletions(-) mode change 100644 => 100755 simplewiki/mdx_camelcase.py mode change 100644 => 100755 simplewiki/mdx_circuit.py mode change 100644 => 100755 simplewiki/mdx_image.py mode change 100644 => 100755 simplewiki/mdx_video.py diff --git a/simplewiki/mdx_camelcase.py b/simplewiki/mdx_camelcase.py old mode 100644 new mode 100755 index bf4e721860..600c7ea17b --- a/simplewiki/mdx_camelcase.py +++ b/simplewiki/mdx_camelcase.py @@ -69,6 +69,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 +104,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..f87262d9fc --- 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): @@ -33,9 +37,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) : 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'(? Date: Sat, 14 Jan 2012 07:06:25 -0500 Subject: [PATCH 3/5] Calculator and submit feedback available to everyone --- util/views.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/util/views.py b/util/views.py index b555cbfade..4b6254b047 100644 --- a/util/views.py +++ b/util/views.py @@ -12,8 +12,8 @@ from django.conf import settings import datetime 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) @@ -22,15 +22,19 @@ def calculate(request): 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, From b118f4361cd96fe76c0eebc52d7dc0028a56b7f2 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Sat, 14 Jan 2012 07:33:43 -0500 Subject: [PATCH 4/5] Tracking improvements. Calculator is tracked --- courseware/capa_module.py | 4 ++++ settings.py | 7 ++++++- track/views.py | 24 ++++++++++++++++++------ util/views.py | 5 +++++ 4 files changed, 33 insertions(+), 7 deletions(-) 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/track/views.py b/track/views.py index d793bf8911..2a368b3188 100644 --- a/track/views.py +++ b/track/views.py @@ -14,7 +14,6 @@ else: logfile = None file_index = 0 log_index = 0 -MAXLOG = 5 filename = None def make_file(): @@ -31,20 +30,28 @@ def make_file(): def log_event(event): global logfile, log_index + event_str = json.dumps(event) if settings.TRACK_DIR == None: # print event return - if logfile == None or log_index >= 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 4b6254b047..f61edf040e 100644 --- a/util/views.py +++ b/util/views.py @@ -10,6 +10,8 @@ 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(): @@ -18,6 +20,9 @@ def calculate(request): 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})) From e3e1f1fafa2060d95f92b38c3f53b9e2bc33db60 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Sat, 14 Jan 2012 07:36:38 -0500 Subject: [PATCH 5/5] Removed old, HTML-style textbook --- textbook/__init__.py | 0 textbook/models.py | 3 --- textbook/tests.py | 16 ---------------- textbook/views.py | 18 ------------------ 4 files changed, 37 deletions(-) delete mode 100644 textbook/__init__.py delete mode 100644 textbook/models.py delete mode 100644 textbook/tests.py delete mode 100644 textbook/views.py diff --git a/textbook/__init__.py b/textbook/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/textbook/models.py b/textbook/models.py deleted file mode 100644 index 71a8362390..0000000000 --- a/textbook/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/textbook/tests.py b/textbook/tests.py deleted file mode 100644 index 501deb776c..0000000000 --- a/textbook/tests.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -This file demonstrates writing tests using the unittest module. These will pass -when you run "manage.py test". - -Replace this with more appropriate tests for your application. -""" - -from django.test import TestCase - - -class SimpleTest(TestCase): - def test_basic_addition(self): - """ - Tests that 1 + 1 always equals 2. - """ - self.assertEqual(1 + 1, 2) diff --git a/textbook/views.py b/textbook/views.py deleted file mode 100644 index 6cc9e8ba6c..0000000000 --- a/textbook/views.py +++ /dev/null @@ -1,18 +0,0 @@ -from djangomako.shortcuts import render_to_response, render_to_string -from django.shortcuts import redirect -import os -from django.conf import settings -from django.http import Http404 - -# We don't do subdirectories to reduce odds of possible future -# security issues. Feel free to re-add them if needed -- just make -# sure things like /../../etc/passwd are handled okay. - -valid_files=os.listdir(settings.TEXTBOOK_DIR) - -def index(request, filename): - if filename in valid_files: - text=open(settings.TEXTBOOK_DIR+filename).read() - return render_to_response('textbook.html',{'text':text}) - else: - raise Http404