diff options
Diffstat (limited to 'testapp/yaksh/management/commands/load_exam.py')
-rw-r--r-- | testapp/yaksh/management/commands/load_exam.py | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/testapp/yaksh/management/commands/load_exam.py b/testapp/yaksh/management/commands/load_exam.py new file mode 100644 index 0000000..84bf762 --- /dev/null +++ b/testapp/yaksh/management/commands/load_exam.py @@ -0,0 +1,57 @@ +# System library imports. +from os.path import basename + +# Django imports. +from django.core.management.base import BaseCommand + +# Local imports. +from testapp.yaksh.models import Question, Quiz + +def clear_exam(): + """Deactivate all questions from the database.""" + for question in Question.objects.all(): + question.active = False + question.save() + + # Deactivate old quizzes. + for quiz in Quiz.objects.all(): + quiz.active = False + quiz.save() + +def load_exam(filename): + """Load questions and quiz from the given Python file. The Python file + should declare a list of name "questions" which define all the questions + in pure Python. It can optionally load a Quiz from an optional 'quiz' + object. + """ + # 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[0].save() + for tag in question[1]: + question[0].tags.add(tag) + + if 'quiz' in locals(): + quiz.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_exam() + + # Load from files. + for fname in args: + self.stdout.write('Importing from {0} ... '.format(basename(fname))) + load_exam(fname) + self.stdout.write('Done\n') + |