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) |