summaryrefslogtreecommitdiff
path: root/exam/management/commands/dump_user_data.py
blob: ec016bbb7456b2e5942406d0ab7230ece977850f (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import sys

# Django imports.
from django.core.management.base import BaseCommand
from django.template import Template, Context

# Local imports.
from exam.views import get_user_data
from exam.models import User

data_template = Template('''\
===============================================================================
Data for {{ data.user.get_full_name.title }} ({{ data.user.username }})

Name: {{ data.user.get_full_name.title }}
Username: {{ data.user.username }}
{% if data.profile %}\
Roll number: {{ data.profile.roll_number }}
Position: {{ data.profile.position }}
Department: {{ data.profile.department }}
Institute: {{ data.profile.institute }}
{% endif %}\
Email: {{ data.user.email }}
Date joined: {{ data.user.date_joined }}
Last login: {{ data.user.last_login }} 
{% for paper in data.papers %}
Paper: {{ paper.quiz.description }}
---------------------------------------
Marks obtained: {{ paper.get_total_marks }}
Questions correctly answered: {{ paper.get_answered_str }}
Total attempts at questions: {{ paper.answers.count }}
Start time: {{ paper.start_time }}
User IP address: {{ paper.user_ip }}
{% if paper.answers.count %}
Answers
-------
{% for question, answers in paper.get_question_answers.items %}
Question: {{ question.id }}. {{ question.summary }} (Points: {{ question.points }})
{% if question.type == "mcq" %}\
###############################################################################
Choices: {% for option in question.options.strip.splitlines %} {{option}}, {% endfor %}
Student answer: {{ answers.0|safe }}
{% else %}{# non-mcq questions #}\
{% for answer in answers %}\
###############################################################################
{{ answer.answer.strip|safe }}
# Autocheck: {{ answer.error|safe }}
{% endfor %}{# for answer in answers #}\
{% endif %}\
{% with answers|last as answer %}\
Marks: {{answer.marks}}
{% endwith %}\
{% endfor %}{# for question, answers ... #}\

Teacher comments
-----------------
{{ paper.comments|default:"None" }}
{% endif %}{# if paper.answers.count #}\
{% endfor %}{# for paper in data.papers #}
''')


def dump_user_data(unames, stdout):
    '''Dump user data given usernames (a sequence) if none is given dump all
    their data.  The data is dumped to stdout.
    '''
    if not unames:
        try:
            users = User.objects.all()
        except User.DoesNotExist:
            pass
    else:
        users = []
        for uname in unames:
            try:
                user = User.objects.get(username__exact = uname)
            except User.DoesNotExist:
                stdout.write('User %s does not exist'%uname)
            else:
                users.append(user)

    for user in users:
        data = get_user_data(user.username)
        context = Context({'data': data})
        result = data_template.render(context)
        stdout.write(result.encode('ascii', 'xmlcharrefreplace'))

class Command(BaseCommand):
    args = '<username1> ... <usernamen>'
    help = '''Dumps all user data to stdout, optional usernames can be
              specified.  If none is specified all user data is dumped.
           '''
    
    def handle(self, *args, **options):
        """Handle the command."""
        # Dump data.
        dump_user_data(args, self.stdout)