From 7e370f3017572fb202d48a9ca884bfd7d3880d63 Mon Sep 17 00:00:00 2001 From: Prabhu Ramachandran Date: Sat, 19 Nov 2011 00:26:03 +0530 Subject: Adding load_questions to load from Python code. This lets us load questions using Python syntax which is rather convenient. --- exam/management/commands/load_questions.py | 45 ++++++++++++++++++++++++++++++ sample_questions.py | 26 +++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 exam/management/commands/load_questions.py create mode 100644 sample_questions.py 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 = '' + 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 -- cgit