diff -r 0b061d58aea3 -r 0eda880b3d25 testappproj/testapp/views.py --- a/testappproj/testapp/views.py Mon May 17 22:33:59 2010 +0530 +++ b/testappproj/testapp/views.py Fri May 21 02:40:17 2010 +0530 @@ -1,10 +1,12 @@ + # Python imports import doctest import logging import os import traceback import random - +import StringIO +import sys # # AppEngine imports @@ -37,7 +39,8 @@ from datetime import date from django.contrib.auth.decorators import permission_required from models import Problem - +from django.contrib.auth.decorators import login_required +from models import Score def respond(request, user,template, params=None): """Helper to render a response, passing standard stuff to the response. @@ -67,26 +70,54 @@ template += '.html' return shortcuts.render_to_response(template, params) -def execute_test_cases(request, test_cases, g): - li = [] +def execute_test_cases(code , solution): - solved = True - for e in test_cases: - if not e.want: - exec e.source in g - continue - call = e.source.strip() - got = eval(e.source.strip(), g) - expected = eval(e.want, g) - - if got == expected: - status = 'pass' - else: - status = 'fail' - solved = False - li.append([call, expected, "%r" % got, status]) + print code + print "solution"+solution + + + solved=False + # create file-like string to capture output + codeOut = StringIO.StringIO() + codeErr = StringIO.StringIO() + + + + # capture output and errors + sys.stdout = codeOut + sys.stderr = codeErr + + exec code + +# restore stdout and stderr + sys.stdout = sys.__stdout__ + sys.stderr = sys.__stderr__ + + - return li, solved + + + s = codeOut.getvalue() + + s=unicode(s) + + + print s.strip() + print solution.strip() + + + + if solution.strip() == s.strip(): + solved =True + + errors=codeErr.getvalue() + print "errors"+errors + + + codeOut.close() + codeErr.close() + + return solved,errors @@ -140,7 +171,7 @@ # pu = get_pu(problem) # if pu == "PU_NOT_FOUND" or pu == "USER_NOT_SIGNED_IN": return False # return pu.solved - +@login_required(function=None, redirect_field_name='next') def problems(request, category=None): user = request.user @@ -183,16 +214,17 @@ session =get_problem.session ) entries.append(e) - + return respond(request, user, 'problems',{'entries' : entries } ) - +@login_required(function=None, redirect_field_name='next') def code(request, problem_id): - print problem_id +# print problem_id problem = Problem.objects.get(id=int(problem_id)) - + if problem is None: + return http.HttpResponseNotFound('No such problem.') # pu = get_pu(problem) @@ -200,12 +232,15 @@ # pu = models.ProblemUser(problem=problem, user=users.get_current_user(), solution='', solved=False) # pu.put() # pu = None - - return respond(request, request.user ,'code' , ) + print problem.id + return respond(request, request.user ,'code' ,{'problem' : problem } ) def run(request): user = request.user + print request.POST + problem_id = request.POST.get('problem_id') + if problem_id: problem = Problem.objects.get(id=int(problem_id)) @@ -229,16 +264,16 @@ errors = '' - try: - print user_code - compiled = compile(user_code, 'error_file', 'exec') - g = {} - exec compiled in g + # try: + # print user_code + # compiled = compile(user_code, 'error_file', 'exec') + # g = {} + # exec compiled in g # s = problem.tests.replace('\r\n', '\n') # s += '\n\n' # test_cases = doctest.DocTestParser().get_examples(s) - # results, solved = execute_test_cases(request, test_cases, g) + solved,errors = execute_test_cases(user_code,problem.solution) # if solved: # pu = get_pu(problem) # if pu.__class__ == models.ProblemUser: @@ -249,10 +284,33 @@ # if pu.__class__ == models.ProblemUser: # pu.solved = False # pu.put() - except: - errors = traceback.format_exc() - return respond(request, user, 'traceback', {'errors': errors}) - results="solved" + + + + + if solved==True: + + #user is answering his first question + try: + # print user.id + score_for_user= Score.objects.get(user=user) + score_for_user.total_credits+=problem.credit + score_for_user.save() + + # user has answered questions previously + except Score.DoesNotExist: +# print user.id + score_new_user=user.id + score_total_credits=problem.credit + score=Score(user_id=user.id,total_credits=score_total_credits) + score.save() + + + + else: + print "oops" + results=solved + return respond(request, request.user, 'run', {'results': results}) @@ -310,12 +368,14 @@ problem_type=form.cleaned_data['Problem_type'] solution=form.cleaned_data['Solution'] session=form.cleaned_data['Session'] + credit=form.cleaned_data['Credit'] + author = user.username created = date.today() modified=date.today() - - problem=Problem(description=description,problem_type=problem_type,solution=solution,session=session,author=author,created=created,modified=modified) + + problem=Problem(description=description,problem_type=problem_type,solution=solution,session=session,author=author,created=created,modified=modified,credit=credit) problem.save() print "saved" @@ -328,14 +388,10 @@ # errors['__all__'] = unicode(err) - # if errors: - # print "new world" - # if internal: - - # print errors - # return ('error',errors) - # return respond(request, user, 'new_edit_problem', - # {'form': form, 'problem':problem, 'creating':creating_new,'error':errors}) + if form.errors: + print "new world" + return respond(request, user, 'new_edit_problem', + {'form': form, 'problem':problem, 'creating':creating_new,'error':errors}) # if creating_new: # # if internal: