From 4a28fd3b1333c6a07d61d1acd92a977f08bb1f21 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Thu, 5 Jan 2012 20:28:05 -0500 Subject: [PATCH 1/3] Working calculator --- courseware/calc.py | 6 +++--- courseware/capa_problem.py | 2 +- settings.py | 1 + urls.py | 2 ++ util/__init__.py | 0 util/models.py | 3 +++ util/tests.py | 16 +++++++++++++++ util/views.py | 41 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 util/__init__.py create mode 100644 util/models.py create mode 100644 util/tests.py create mode 100644 util/views.py diff --git a/courseware/calc.py b/courseware/calc.py index f617c3b21b..a51ea94da2 100644 --- a/courseware/calc.py +++ b/courseware/calc.py @@ -4,7 +4,7 @@ from pyparsing import Word, alphas, nums, oneOf, Literal from pyparsing import ZeroOrMore, OneOrMore, StringStart from pyparsing import StringEnd, Optional, Forward from pyparsing import CaselessLiteral, Group, StringEnd -from pyparsing import NoMatch +from pyparsing import NoMatch, stringEnd def evaluator(variables, functions, string): @@ -105,7 +105,7 @@ def evaluator(variables, functions, string): term = term.setParseAction(prod_parse_action) expr << Optional((plus|minus)) + term + ZeroOrMore((plus|minus)+term) expr=expr.setParseAction(sum_parse_action) - return expr.parseString(string)[0] + return (expr+stringEnd).parseString(string)[0] if __name__=='__main__': variables={'R1':2.0, 'R3':4.0} @@ -117,4 +117,4 @@ if __name__=='__main__': print evaluator({'a': 2.2997471478310274, 'k': 9, 'm': 8, 'x': 0.66009498411213041}, {}, "5") print evaluator({},{}, "-1") print evaluator({},{}, "-(7+5)") - print evaluator({},{}, "QWSEKO") + print evaluator({},{}, "5+7 QWSEKO") diff --git a/courseware/capa_problem.py b/courseware/capa_problem.py index ab82ea11a8..97c09fa2b5 100644 --- a/courseware/capa_problem.py +++ b/courseware/capa_problem.py @@ -168,9 +168,9 @@ class LoncapaProblem(): return html def grade_schem(self, element): + print element return "correct" - def grade_nr(self, question, answer): error = abs(evaluator({},{},answer) - question['answer']) allowed_error = abs(question['answer']*question['tolerance']) diff --git a/settings.py b/settings.py index 0b2cd8a557..269f05edad 100644 --- a/settings.py +++ b/settings.py @@ -1,6 +1,7 @@ ASKBOT_ENABLED = True DEFAULT_FROM_EMAIL = 'pmitros@csail.mit.edu' +DEFAULT_FEEDBACK_EMAIL = 'pmitros@csail.mit.edu' WIKI_REQUIRE_LOGIN_EDIT = True WIKI_REQUIRE_LOGIN_VIEW = True diff --git a/urls.py b/urls.py index bff8798d30..bf609adfcb 100644 --- a/urls.py +++ b/urls.py @@ -40,6 +40,8 @@ urlpatterns = ('', # url(r'^show_circuit/(?P[^/]*)$', 'circuit.views.show_circuit'), url(r'^edit_circuit/(?P[^/]*)$', 'circuit.views.edit_circuit'), url(r'^save_circuit/(?P[^/]*)$', 'circuit.views.save_circuit'), + url(r'^calculate$', 'util.views.calculate'), + url(r'^send_feedback$', 'util.views.send_feedback'), ) if settings.ASKBOT_ENABLED: diff --git a/util/__init__.py b/util/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/util/models.py b/util/models.py new file mode 100644 index 0000000000..71a8362390 --- /dev/null +++ b/util/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/util/tests.py b/util/tests.py new file mode 100644 index 0000000000..501deb776c --- /dev/null +++ b/util/tests.py @@ -0,0 +1,16 @@ +""" +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/util/views.py b/util/views.py new file mode 100644 index 0000000000..6a8a2bf0be --- /dev/null +++ b/util/views.py @@ -0,0 +1,41 @@ +from djangomako.shortcuts import render_to_response, render_to_string +from django.shortcuts import redirect +from django.contrib.auth.models import User +from django.http import HttpResponse +import json +from django.conf import settings +from django.core.context_processors import csrf +from django.http import Http404 +import courseware.calc +from django.core.mail import send_mail +from django.conf import settings +import datetime + +def calculate(request): + if not request.user.is_authenticated(): + raise Http404 + equation = request.GET['equation'] + try: + result = courseware.calc.evaluator({}, {}, equation) + except: + 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 + + feedback = render_to_string("feedback_email.txt", + {"subject":request.GET['subject'], + "url": request.GET['url'], + "time": datetime.datetime.now().isoformat(), + "feedback": request.GET['message'], + "user":request.user.username}) + + send_mail("MITx Feedback / " +request.GET['subject'], + feedback, + settings.DEFAULT_FROM_EMAIL, + [ settings.DEFAULT_FEEDBACK_EMAIL ], + fail_silently = False + ) + return HttpResponse(json.dumps({'success':True})) From 138ff04f77c58491365634da57457ae6d477f016 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Thu, 5 Jan 2012 22:09:43 -0500 Subject: [PATCH 2/3] Feedback button works --- util/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/views.py b/util/views.py index 6a8a2bf0be..62fb63700b 100644 --- a/util/views.py +++ b/util/views.py @@ -26,13 +26,13 @@ def send_feedback(request): raise Http404 feedback = render_to_string("feedback_email.txt", - {"subject":request.GET['subject'], - "url": request.GET['url'], + {"subject":request.POST['subject'], + "url": request.POST['url'], "time": datetime.datetime.now().isoformat(), - "feedback": request.GET['message'], + "feedback": request.POST['message'], "user":request.user.username}) - send_mail("MITx Feedback / " +request.GET['subject'], + send_mail("MITx Feedback / " +request.POST['subject'], feedback, settings.DEFAULT_FROM_EMAIL, [ settings.DEFAULT_FEEDBACK_EMAIL ], From 2aec53aa83b8cfa0636306ac07aff7af576221a4 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Fri, 6 Jan 2012 19:50:23 -0500 Subject: [PATCH 3/3] New-style classes --- courseware/capa_problem.py | 2 +- courseware/x_module.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/courseware/capa_problem.py b/courseware/capa_problem.py index 97c09fa2b5..f635470bbb 100644 --- a/courseware/capa_problem.py +++ b/courseware/capa_problem.py @@ -13,7 +13,7 @@ def strip_dict(d): (type(d[k]) == float or type(d[k]) == int) ]) return d -class LoncapaProblem(): +class LoncapaProblem(object): def get_state(self): ''' Stored per-user session data neeeded to: 1) Recreate the problem diff --git a/courseware/x_module.py b/courseware/x_module.py index 9773bf74af..c9ece2816f 100644 --- a/courseware/x_module.py +++ b/courseware/x_module.py @@ -1,4 +1,4 @@ -class XModule: +class XModule(object): ''' Implements a generic learning module. Initialized on access with __init__, first time with state=None, and then with state