From e50fd0f99818fae1cb1e9b85f793cd991a6e3573 Mon Sep 17 00:00:00 2001 From: ichuang Date: Mon, 28 May 2012 10:08:07 -0400 Subject: [PATCH] add check code to dogfood; cleaned up interface to quickedit --- lib/dogfood/__init__.py | 1 + lib/dogfood/check.py | 50 +++++++++++++++++++++++++++++++++++++++++ lib/dogfood/views.py | 17 ++++++-------- 3 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 lib/dogfood/check.py diff --git a/lib/dogfood/__init__.py b/lib/dogfood/__init__.py index e69de29bb2..d00d8ea793 100644 --- a/lib/dogfood/__init__.py +++ b/lib/dogfood/__init__.py @@ -0,0 +1 @@ +from check import * diff --git a/lib/dogfood/check.py b/lib/dogfood/check.py new file mode 100644 index 0000000000..2a04284a28 --- /dev/null +++ b/lib/dogfood/check.py @@ -0,0 +1,50 @@ +#!/usr/bin/python + +from random import choice +import string +import traceback + +from django.conf import settings +import courseware.capa.capa_problem as lcp +from dogfood.views import update_problem + +def GenID(length=8, chars=string.letters + string.digits): + return ''.join([choice(chars) for i in range(length)]) + +randomid = GenID() + +def check_problem_code(ans,the_lcp,correct_answers,false_answers): + """ + ans = student's answer + the_lcp = LoncapaProblem instance + + returns dict {'ok':is_ok,'msg': message with iframe} + """ + pfn = "dog%s" % randomid + pfn += the_lcp.problem_id.replace('filename','') # add problem ID to dogfood problem name + update_problem(pfn,ans,filestore=the_lcp.system.filestore) + msg = '
' + msg += '' % (settings.MITX_ROOT_URL,pfn) + msg += '
' + + is_ok = True + try: + # check correctness + fp = the_lcp.system.filestore.open('problems/%s.xml' % pfn) + test_lcp = lcp.LoncapaProblem(fp, '1', system=the_lcp.system) + + if not (test_lcp.grade_answers(correct_answers)['1_2_1']=='correct'): + is_ok = False + if (test_lcp.grade_answers(false_answers)['1_2_1']=='correct'): + is_ok = False + except Exception,err: + is_ok = False + msg += "

Error: %s

" % str(err).replace('<','<') + msg += "

%s

" % traceback.format_exc().replace('<','<') + + ret = {'ok':is_ok, + 'msg': msg, + } + return ret + + \ No newline at end of file diff --git a/lib/dogfood/views.py b/lib/dogfood/views.py index cbaebbd4ba..54090d744a 100644 --- a/lib/dogfood/views.py +++ b/lib/dogfood/views.py @@ -65,11 +65,11 @@ def df_capa_problem(request, id=None): Accepts XML for a problem, inserts it into the dogfood course.xml. Returns rendered problem. ''' - print "WARNING: UNDEPLOYABLE CODE. FOR DEV USE ONLY." - print "In deployed use, this will only edit on one server" - print "We need a setting to disable for production where there is" - print "a load balanacer" + # "WARNING: UNDEPLOYABLE CODE. FOR DEV USE ONLY." + if settings.DEBUG: + print '[lib.dogfood.df_capa_problem] id=%s' % id + if not 'coursename' in request.session: coursename = DOGFOOD_COURSENAME else: @@ -133,11 +133,8 @@ def df_capa_problem(request, id=None): if not xml: print "[lib.dogfood.df_capa_problem] problem xml not found!" + # add problem ID to list so that is_staff check can be bypassed + request.session['dogfood_id'] = id + # hand over to quickedit to do the rest - try: - html = quickedit(request,id=id,qetemplate='dogfood.html',coursename=coursename) - return html - except Exception, err: - print '[lib.dogfood.df_capa_problem] Error generating html on first pass: %s' % err - return quickedit(request,id=id,qetemplate='dogfood.html',coursename=coursename)