|
|
@@ -21,20 +21,38 @@ from django.contrib.auth.decorators import login_required
|
|
|
@login_required
|
|
|
def submit(request, lab_id):
|
|
|
from django.http import HttpResponseRedirect
|
|
|
+ from django.db import IntegrityError
|
|
|
if request.method == 'POST':
|
|
|
form = SubmissionForm(request.POST, request.FILES)
|
|
|
if form.is_valid():
|
|
|
labobj = Lab.objects.get(pk=lab_id)
|
|
|
rfile = request.FILES['file']
|
|
|
submission = Submission(lab=labobj, user=request.user, file=rfile)
|
|
|
- submission.save()
|
|
|
- return HttpResponseRedirect("/lab/%s/" % lab_id)
|
|
|
+ try:
|
|
|
+ submission.save()
|
|
|
+ except IntegrityError:
|
|
|
+ pass
|
|
|
+ score, err = grade(submission.file.name, lab_id)
|
|
|
+ return render_to_response('submit.html', {
|
|
|
+ 'err' : err,
|
|
|
+ 'score' : score,
|
|
|
+ 'form' : form,
|
|
|
+ }, context_instance=RequestContext(request))
|
|
|
else:
|
|
|
form = SubmissionForm()
|
|
|
return render_to_response('submit.html', {
|
|
|
'form' : form,
|
|
|
}, context_instance=RequestContext(request))
|
|
|
|
|
|
+def grade(file, id):
|
|
|
+ import subprocess
|
|
|
+ from os import path
|
|
|
+ graderfile = "lab%s.py" % id
|
|
|
+ graderdir = path.dirname(__file__) + '/../../graders/'
|
|
|
+ grader = graderdir + graderfile
|
|
|
+ p = subprocess.Popen([grader, file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
|
+ return p.communicate()
|
|
|
+
|
|
|
from django import forms
|
|
|
class SubmissionForm(forms.Form):
|
|
|
file = forms.FileField()
|