summaryrefslogtreecommitdiff
path: root/exam/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'exam/models.py')
-rw-r--r--exam/models.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/exam/models.py b/exam/models.py
new file mode 100644
index 0000000..247b362
--- /dev/null
+++ b/exam/models.py
@@ -0,0 +1,102 @@
+from django.db import models
+from django.contrib.auth.models import User
+
+# Create your models here.
+
+class Profile(models.Model):
+ """Profile for a user to store roll number etc."""
+ user = models.ForeignKey(User)
+ roll_number = models.CharField(max_length=20)
+
+class Question(models.Model):
+ """A question in the database."""
+ # An optional one-line summary of the question.
+ summary = models.CharField(max_length=256)
+ # The question text.
+ question = models.TextField()
+
+ # Number of points for the question.
+ points = models.IntegerField()
+
+ # Test cases for the question in the form of code that is run.
+ # This is simple Python code.
+ test = models.TextField()
+
+ def __unicode__(self):
+ return self.summary
+
+
+class Answer(models.Model):
+ """Answers submitted by users.
+ """
+ question = models.ForeignKey(Question)
+ # The last answer submitted by the user.
+ answer = models.TextField()
+ attempts = models.IntegerField()
+
+ # Is the question correct.
+ correct = models.BooleanField()
+ # Marks obtained.
+ marks = models.IntegerField()
+
+ def __unicode__(self):
+ return self.answer
+
+class Quiz(models.Model):
+ """A quiz for a student.
+ """
+ user = models.ForeignKey(User)
+ user_ip = models.CharField(max_length=15)
+ key = models.CharField(max_length=10)
+ questions = models.CharField(max_length=128)
+ questions_answered = models.CharField(max_length=128)
+
+ def current_question(self):
+ """Returns the current active question to display."""
+ qs = self.questions.split('|')
+ if len(qs) > 0:
+ return qs[0]
+ else:
+ return ''
+
+ def questions_left(self):
+ """Returns the number of questions left."""
+ qs = self.questions
+ if len(qs) == 0:
+ return 0
+ else:
+ return qs.count('|') + 1
+
+ def answered_question(self, question_id):
+ """Removes the question from the list of questions and returns
+ the next."""
+ qa = self.questions_answered
+ if len(qa) > 0:
+ self.questions_answered = '|'.join([qa, str(question_id)])
+ else:
+ self.questions_answered = str(question_id)
+ qs = self.questions.split('|')
+ qs.remove(unicode(question_id))
+ self.questions = '|'.join(qs)
+ self.save()
+ if len(qs) == 0:
+ return ''
+ else:
+ return qs[0]
+
+ def skip(self):
+ """Skip the current question and return the next available question."""
+ qs = self.questions.split('|')
+ if len(qs) == 0:
+ return ''
+ else:
+ # Put head at the end.
+ head = qs.pop(0)
+ qs.append(head)
+ self.questions = '|'.join(qs)
+ self.save()
+ return qs[0]
+
+ def __unicode__(self):
+ u = self.user
+ return u'Quiz for {0} {1}'.format(u.first_name, u.last_name)