summaryrefslogtreecommitdiff
path: root/yaksh
diff options
context:
space:
mode:
Diffstat (limited to 'yaksh')
-rw-r--r--yaksh/models.py11
-rw-r--r--yaksh/views.py32
2 files changed, 31 insertions, 12 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index 398f508..9134663 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -66,7 +66,7 @@ test_status = (
def get_assignment_dir(instance, filename):
return os.sep.join((
- instance.user.user, instance.assignmentQuestion.id, filename
+ str(instance.user.user), str(instance.assignmentQuestion.id), filename
))
@@ -264,6 +264,9 @@ class Question(models.Model):
# Does this question allow partial grading
partial_grading = models.BooleanField(default=False)
+ # Check assignment upload based question
+ grade_assignment_upload = models.BooleanField(default=False)
+
def consolidate_answer_data(self, user_answer):
question_data = {}
metadata = {}
@@ -280,9 +283,13 @@ class Question(models.Model):
metadata['language'] = self.language
metadata['partial_grading'] = self.partial_grading
files = FileUpload.objects.filter(question=self)
+ assignment_files = AssignmentUpload.objects.filter()
if files:
metadata['file_paths'] = [(file.file.path, file.extract)
for file in files]
+ if assignment_files:
+ metadata['assign_files'] = [(file.assignmentFile.path, False)
+ for file in assignment_files]
question_data['metadata'] = metadata
return json.dumps(question_data)
@@ -1201,7 +1208,7 @@ class AnswerPaper(models.Model):
###############################################################################
class AssignmentUpload(models.Model):
- user = models.ForeignKey(Profile)
+ user = models.ForeignKey(User)
assignmentQuestion = models.ForeignKey(Question)
assignmentFile = models.FileField(upload_to=get_assignment_dir)
diff --git a/yaksh/views.py b/yaksh/views.py
index 63653e6..4cdba5c 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -467,17 +467,24 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None):
elif current_question.type == 'mcc':
user_answer = request.POST.getlist('answer')
elif current_question.type == 'upload':
- assign = AssignmentUpload()
- assign.user = user.profile
- assign.assignmentQuestion = current_question
# if time-up at upload question then the form is submitted without
# validation
if 'assignment' in request.FILES:
- assign.assignmentFile = request.FILES['assignment']
- assign.save()
+ assignment_filename = request.FILES.getlist('assignment')
+ for fname in assignment_filename:
+ if AssignmentUpload.objects.filter(
+ assignmentFile__icontains=fname, user=user).exists():
+ assign_file = AssignmentUpload.objects.get(
+ assignmentFile__icontains=fname, user=user)
+ os.remove(assign_file.assignmentFile.path)
+ assign_file.delete()
+ AssignmentUpload.objects.create(user=user,
+ assignmentQuestion=current_question, assignmentFile=fname
+ )
user_answer = 'ASSIGNMENT UPLOADED'
- next_q = paper.add_completed_question(current_question.id)
- return show_question(request, next_q, paper)
+ if not current_question.grade_assignment_upload:
+ next_q = paper.add_completed_question(current_question.id)
+ return show_question(request, next_q, paper)
else:
user_code = request.POST.get('answer')
user_answer = snippet_code + "\n" + user_code if snippet_code else user_code
@@ -497,7 +504,9 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None):
if result.get('success'):
new_answer.marks = (current_question.points * result['weight'] /
current_question.get_maximum_test_case_weight()) \
- if current_question.partial_grading and current_question.type == 'code' else current_question.points
+ if current_question.partial_grading and \
+ current_question.type == 'code' or current_question.type == 'upload' \
+ else current_question.points
new_answer.correct = result.get('success')
error_message = None
new_answer.error = json.dumps(result.get('error'))
@@ -505,11 +514,14 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None):
else:
new_answer.marks = (current_question.points * result['weight'] /
current_question.get_maximum_test_case_weight()) \
- if current_question.partial_grading and current_question.type == 'code' else 0
+ if current_question.partial_grading and \
+ current_question.type == 'code' or current_question.type == 'upload' \
+ else 0
error_message = result.get('error') if current_question.type == 'code' \
- else None
+ or current_question.type == 'upload' else None
new_answer.error = json.dumps(result.get('error'))
next_question = current_question if current_question.type == 'code' \
+ or current_question.type == 'upload' \
else paper.add_completed_question(current_question.id)
new_answer.save()
paper.update_marks('inprogress')