summaryrefslogtreecommitdiff
path: root/exam/management/commands/load_exam.py
blob: 5b8aa81edc3f767449547e3519c20204f20b9670 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# System library imports.
from os.path import basename

# Django imports.
from django.core.management.base import BaseCommand

# Local imports.
from exam.models import Question, Quiz

def clear_exam():
    """Delete all questions from the database."""
    for question in Question.objects.all():
        question.delete()
        
    for quiz in Quiz.objects.all():
        quiz.delete()

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.save()
        
    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')