testappproj/testapp/views.py
changeset 1 0eda880b3d25
parent 0 0b061d58aea3
child 2 654c583fd78e
equal deleted inserted replaced
0:0b061d58aea3 1:0eda880b3d25
       
     1 
     1 # Python imports
     2 # Python imports
     2 import doctest
     3 import doctest
     3 import logging
     4 import logging
     4 import os
     5 import os
     5 import traceback
     6 import traceback
     6 import random
     7 import random
     7 
     8 import StringIO
       
     9 import sys
     8 
    10 
     9 # # AppEngine imports
    11 # # AppEngine imports
    10 
    12 
    11 from django.contrib.auth.models import User 
    13 from django.contrib.auth.models import User 
    12 
    14 
    35 import models
    37 import models
    36 from helpers import bulkuploader as pykataupload
    38 from helpers import bulkuploader as pykataupload
    37 from datetime import date
    39 from datetime import date
    38 from django.contrib.auth.decorators import permission_required
    40 from django.contrib.auth.decorators import permission_required
    39 from models import Problem
    41 from models import Problem
    40 
    42 from django.contrib.auth.decorators import login_required 
       
    43 from models import Score 
    41 
    44 
    42 def respond(request, user,template, params=None):
    45 def respond(request, user,template, params=None):
    43   """Helper to render a response, passing standard stuff to the response.
    46   """Helper to render a response, passing standard stuff to the response.
    44 
    47 
    45   Args:
    48   Args:
    65     params['sign_in'] = 1
    68     params['sign_in'] = 1
    66   # if not template.endswith('.html'):
    69   # if not template.endswith('.html'):
    67   template += '.html'
    70   template += '.html'
    68   return shortcuts.render_to_response(template, params)
    71   return shortcuts.render_to_response(template, params)
    69 
    72 
    70 def execute_test_cases(request, test_cases, g):
    73 def execute_test_cases(code , solution):
    71   li = []
    74   
    72   
    75   print code 
    73   solved = True
    76   print "solution"+solution
    74   for e in test_cases:
    77 
    75     if not e.want:
    78 
    76       exec e.source in g
    79   solved=False
    77       continue
    80   # create file-like string to capture output
    78     call = e.source.strip()
    81   codeOut = StringIO.StringIO()
    79     got = eval(e.source.strip(), g)
    82   codeErr = StringIO.StringIO()
    80     expected = eval(e.want, g)
    83 
    81     
    84 
    82     if got == expected:
    85 
    83       status = 'pass'
    86   # capture output and errors
    84     else:
    87   sys.stdout = codeOut
    85       status = 'fail'
    88   sys.stderr = codeErr
    86       solved = False
    89 
    87     li.append([call, expected, "%r" % got, status])
    90   exec code
    88 
    91 
    89   return li, solved
    92 # restore stdout and stderr
       
    93   sys.stdout = sys.__stdout__
       
    94   sys.stderr = sys.__stderr__
       
    95 
       
    96 
       
    97 
       
    98   
       
    99   
       
   100   s = codeOut.getvalue()
       
   101   
       
   102   s=unicode(s)
       
   103   
       
   104 
       
   105   print s.strip()
       
   106   print solution.strip()
       
   107   
       
   108  
       
   109      
       
   110   if solution.strip() == s.strip():
       
   111     solved =True
       
   112 
       
   113   errors=codeErr.getvalue()
       
   114   print "errors"+errors
       
   115   
       
   116 
       
   117   codeOut.close()
       
   118   codeErr.close()
       
   119 
       
   120   return solved,errors
    90 
   121 
    91 
   122 
    92 
   123 
    93 
   124 
    94 def index(request):
   125 def index(request):
   138    
   169    
   139 # def is_solved(problem):
   170 # def is_solved(problem):
   140 #   pu = get_pu(problem)
   171 #   pu = get_pu(problem)
   141 #   if pu == "PU_NOT_FOUND" or pu == "USER_NOT_SIGNED_IN": return False
   172 #   if pu == "PU_NOT_FOUND" or pu == "USER_NOT_SIGNED_IN": return False
   142 #   return pu.solved
   173 #   return pu.solved
   143 
   174 @login_required(function=None, redirect_field_name='next')
   144 def problems(request, category=None):
   175 def problems(request, category=None):
   145   user = request.user
   176   user = request.user
   146   
   177   
   147   # if category is None:
   178   # if category is None:
   148   #   problems = db.GqlQuery('SELECT * FROM Problem ORDER BY created DESC')
   179   #   problems = db.GqlQuery('SELECT * FROM Problem ORDER BY created DESC')
   181              username=user.username,
   212              username=user.username,
   182              problem_id=get_problem.id,
   213              problem_id=get_problem.id,
   183              session =get_problem.session
   214              session =get_problem.session
   184                )
   215                )
   185     entries.append(e)
   216     entries.append(e)
   186 
   217     
   187 
   218 
   188   return respond(request, user, 'problems',{'entries' : entries }  )
   219   return respond(request, user, 'problems',{'entries' : entries }  )
   189 
   220 @login_required(function=None, redirect_field_name='next')
   190 def code(request, problem_id):
   221 def code(request, problem_id):
   191   
   222   
   192   print problem_id
   223 #  print problem_id
   193   problem = Problem.objects.get(id=int(problem_id))
   224   problem = Problem.objects.get(id=int(problem_id))
   194 
   225   
   195   if problem is None:
   226   if problem is None:
       
   227   
   196     return http.HttpResponseNotFound('No such problem.')
   228     return http.HttpResponseNotFound('No such problem.')
   197   
   229   
   198 #  pu = get_pu(problem)
   230 #  pu = get_pu(problem)
   199 #  if pu == "PU_NOT_FOUND":  # user is attempting problem for the first time
   231 #  if pu == "PU_NOT_FOUND":  # user is attempting problem for the first time
   200 #    pu = models.ProblemUser(problem=problem, user=users.get_current_user(), solution='', solved=False)
   232 #    pu = models.ProblemUser(problem=problem, user=users.get_current_user(), solution='', solved=False)
   201 #    pu.put()
   233 #    pu.put()
   202 #    pu = None
   234 #    pu = None
   203 
   235   print problem.id
   204   return respond(request, request.user ,'code' , )
   236   return respond(request, request.user ,'code' ,{'problem' : problem } )
   205 
   237 
   206 def run(request):
   238 def run(request):
   207   user = request.user 
   239   user = request.user 
       
   240   print request.POST
       
   241 
   208   problem_id = request.POST.get('problem_id')
   242   problem_id = request.POST.get('problem_id')
       
   243   
   209   if problem_id:
   244   if problem_id:
   210     problem = Problem.objects.get(id=int(problem_id))
   245     problem = Problem.objects.get(id=int(problem_id))
   211 
   246 
   212     if problem is None:
   247     if problem is None:
   213       return http.HttpResponseNotFound('No such problem.')
   248       return http.HttpResponseNotFound('No such problem.')
   227   user_code += '\n\n'
   262   user_code += '\n\n'
   228 
   263 
   229   errors = ''
   264   errors = ''
   230   
   265   
   231   
   266   
   232   try:
   267   # try:
   233     print user_code
   268   #   print user_code
   234     compiled = compile(user_code, 'error_file', 'exec')
   269   #   compiled = compile(user_code, 'error_file', 'exec')
   235     g = {}
   270   #   g = {}
   236     exec compiled in g
   271   #   exec compiled in g
   237 
   272 
   238 #    s = problem.tests.replace('\r\n', '\n')
   273 #    s = problem.tests.replace('\r\n', '\n')
   239 #    s += '\n\n'
   274 #    s += '\n\n'
   240     # test_cases = doctest.DocTestParser().get_examples(s) 
   275     # test_cases = doctest.DocTestParser().get_examples(s) 
   241     # results, solved = execute_test_cases(request, test_cases, g)
   276   solved,errors = execute_test_cases(user_code,problem.solution)
   242     # if solved:
   277     # if solved:
   243     #   pu = get_pu(problem)
   278     #   pu = get_pu(problem)
   244     #   if pu.__class__ == models.ProblemUser:
   279     #   if pu.__class__ == models.ProblemUser:
   245     #     pu.solved = True
   280     #     pu.solved = True
   246     #     pu.put()
   281     #     pu.put()
   247     # else:
   282     # else:
   248     #   pu = get_pu(problem)
   283     #   pu = get_pu(problem)
   249     #   if pu.__class__ == models.ProblemUser:
   284     #   if pu.__class__ == models.ProblemUser:
   250     #     pu.solved = False
   285     #     pu.solved = False
   251     #     pu.put()
   286     #     pu.put()
   252   except:
   287   
   253     errors = traceback.format_exc()
   288   
   254     return respond(request, user, 'traceback', {'errors': errors})
   289   
   255   results="solved"
   290 
       
   291   if solved==True:
       
   292     
       
   293     #user is answering his first question
       
   294     try:
       
   295    # print user.id
       
   296       score_for_user= Score.objects.get(user=user)
       
   297       score_for_user.total_credits+=problem.credit
       
   298       score_for_user.save()
       
   299     
       
   300    # user has answered questions previously
       
   301     except Score.DoesNotExist:
       
   302 #      print user.id 
       
   303       score_new_user=user.id
       
   304       score_total_credits=problem.credit
       
   305       score=Score(user_id=user.id,total_credits=score_total_credits)
       
   306       score.save()
       
   307   
       
   308 
       
   309 
       
   310   else:
       
   311     print "oops"
       
   312   results=solved
       
   313       
   256   return respond(request, request.user, 'run', {'results': results})
   314   return respond(request, request.user, 'run', {'results': results})
   257   
   315   
   258 
   316 
   259 @permission_required('testapp.add_problem' , login_url="/code/1234")
   317 @permission_required('testapp.add_problem' , login_url="/code/1234")
   260 def new_edit(request, problem_id=None, internal=False):
   318 def new_edit(request, problem_id=None, internal=False):
   308     
   366     
   309     description = form.cleaned_data['Description']
   367     description = form.cleaned_data['Description']
   310     problem_type=form.cleaned_data['Problem_type']
   368     problem_type=form.cleaned_data['Problem_type']
   311     solution=form.cleaned_data['Solution']
   369     solution=form.cleaned_data['Solution']
   312     session=form.cleaned_data['Session']
   370     session=form.cleaned_data['Session']
       
   371     credit=form.cleaned_data['Credit']
       
   372 
   313     
   373     
   314     author = user.username
   374     author = user.username
   315     created = date.today()
   375     created = date.today()
   316     modified=date.today()
   376     modified=date.today()
   317 
   377   
   318     problem=Problem(description=description,problem_type=problem_type,solution=solution,session=session,author=author,created=created,modified=modified)
   378     problem=Problem(description=description,problem_type=problem_type,solution=solution,session=session,author=author,created=created,modified=modified,credit=credit)
   319     
   379     
   320     problem.save() 
   380     problem.save() 
   321     print "saved"
   381     print "saved"
   322   else:
   382   else:
   323     print "form is valid"
   383     print "form is valid"
   326 #  print form.errors
   386 #  print form.errors
   327   #  except ValueError, err:
   387   #  except ValueError, err:
   328   #    errors['__all__'] = unicode(err)
   388   #    errors['__all__'] = unicode(err)
   329       
   389       
   330 
   390 
   331   # if errors:
   391   if form.errors:
   332   #   print "new world"
   392     print "new world"
   333   #   if internal:
   393     return respond(request, user, 'new_edit_problem', 
   334       
   394                          {'form': form, 'problem':problem, 'creating':creating_new,'error':errors})
   335   #     print errors
       
   336   #     return ('error',errors)
       
   337   #   return respond(request, user, 'new_edit_problem', 
       
   338   #                        {'form': form, 'problem':problem, 'creating':creating_new,'error':errors})
       
   339 
   395 
   340   # if creating_new:
   396   # if creating_new:
   341   #   # if internal:
   397   #   # if internal:
   342   #   #   if len(request.POST['user_id'])>0:
   398   #   #   if len(request.POST['user_id'])>0:
   343   #   #     logging.info(request.POST)
   399   #   #     logging.info(request.POST)