diff options
author | Prabhu Ramachandran | 2011-11-19 00:26:03 +0530 |
---|---|---|
committer | Prabhu Ramachandran | 2011-11-19 00:26:03 +0530 |
commit | 7e370f3017572fb202d48a9ca884bfd7d3880d63 (patch) | |
tree | b86ee5cabab34fa3454689722998e510648f919d | |
parent | f2c80147ff9e62d098b37355d211fe9cc04f60ca (diff) | |
download | online_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.py | 45 | ||||
-rw-r--r-- | sample_questions.py | 26 |
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 |