summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrabhu Ramachandran2011-11-19 00:26:03 +0530
committerPrabhu Ramachandran2011-11-19 00:26:03 +0530
commit7e370f3017572fb202d48a9ca884bfd7d3880d63 (patch)
treeb86ee5cabab34fa3454689722998e510648f919d
parentf2c80147ff9e62d098b37355d211fe9cc04f60ca (diff)
downloadonline_test-7e370f3017572fb202d48a9ca884bfd7d3880d63.tar.gz
online_test-7e370f3017572fb202d48a9ca884bfd7d3880d63.tar.bz2
online_test-7e370f3017572fb202d48a9ca884bfd7d3880d63.zip
Adding load_questions to load from Python code.
This lets us load questions using Python syntax which is rather convenient.
-rw-r--r--exam/management/commands/load_questions.py45
-rw-r--r--sample_questions.py26
2 files changed, 71 insertions, 0 deletions
diff --git a/exam/management/commands/load_questions.py b/exam/management/commands/load_questions.py
new file mode 100644
index 0000000..3906056
--- /dev/null
+++ b/exam/management/commands/load_questions.py
@@ -0,0 +1,45 @@
+# System library imports.
+from os.path import basename
+
+# Django imports.
+from django.core.management.base import BaseCommand
+
+# Local imports.
+from exam.models import Question
+
+def clear_questions():
+ """Delete all questions from the database."""
+ for question in Question.objects.all():
+ question.delete()
+
+def load_questions(filename):
+ """Load questions from the given Python file. The Python file should
+ declare a list of name "questions" which define all the questions in pure
+ Python.
+ """
+ # Simply exec the given file and we are done.
+ exec(open(filename).read())
+
+ if 'questions' not in locals():
+ msg = 'No variable named "questions" with the Questions in file.'
+ raise NameError(msg)
+
+ for question in questions:
+ question.save()
+
+class Command(BaseCommand):
+ args = '<q_file1.py q_file2.py>'
+ help = '''loads the questions from given Python files which declare the
+ questions in a list called "questions".'''
+
+ def handle(self, *args, **options):
+ """Handle the command."""
+ # Delete existing stuff.
+ clear_questions()
+
+ # Load from files.
+ for fname in args:
+ self.stdout.write('Importing from {0} ... '.format(basename(fname)))
+ load_questions(fname)
+ self.stdout.write('Done\n')
+
diff --git a/sample_questions.py b/sample_questions.py
new file mode 100644
index 0000000..76d64c7
--- /dev/null
+++ b/sample_questions.py
@@ -0,0 +1,26 @@
+from exam.models import Question
+
+questions = [
+Question(
+ summary='Factorial',
+ points=2,
+ description='''
+Write a function called "fact" which takes a single integer argument (say "n")
+and returns the factorial of the number.
+For example fact(3) -> 6''',
+ test='''
+assert fact(0) == 1
+assert fact(5) == 120
+'''),
+
+Question(
+ summary='Simple function',
+ points=1,
+ description='''Create a simple function called "sqr" which takes a single
+argument and returns the square of the argument. For example sqr(3) -> 9.''',
+ test='''
+import math
+assert sqr(3) == 9
+assert abs(sqr(math.sqrt(2)) - 2.0) < 1e-14
+ '''),
+] \ No newline at end of file