Passed
Push — master ( a505d5...8178ea )
by Peter
01:25
created

createSubmissionFile()   A

Complexity

Conditions 2

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 23
rs 9.0856
cc 2
1
import datetime
2
import json
3
4
from django.core.management.base import BaseCommand
5
from django.contrib.auth.models import User
6
from opensubmit.models import Course, Assignment, Grading, GradingScheme, Submission, SubmissionFile, SubmissionTestResult, TestMachine
7
from opensubmit import settings
8
from django.utils import timezone
9
from django.core.files import File as DjangoFile
10
from tempfile import NamedTemporaryFile
11
12
# test machine
13
machine = TestMachine(
14
    last_contact=datetime.datetime.now(),
15
    host='UUID4711',
16
    config=json.dumps([["Operating system", "Plan 9"], ]))
17
machine.save()
18
19
def createSubmissionFile():
20
    with NamedTemporaryFile(mode="wt", delete=False, prefix=settings.MEDIA_ROOT) as tmpfile:
21
        # Submission file
22
        tmpfile.write("The quick brown fox jumps over the lazy dog.")
23
        tmpfile.close()
24
        sf = SubmissionFile(attachment=DjangoFile(tmpfile.name))
25
        sf.save()
26
        # os.remove(tmpfile.name)
27
        # Test results
28
        val_result = SubmissionTestResult()
29
        val_result.submission_file = sf
30
        val_result.kind = SubmissionTestResult.VALIDITY_TEST
31
        val_result.result = "Validation test result for student"
32
        val_result.result_tutor = "Validation test result for tutor"
33
        val_result.machine = machine
34
        val_result.save()
35
        full_result = SubmissionTestResult()
36
        full_result.submission_file = sf
37
        full_result.kind = SubmissionTestResult.FULL_TEST
38
        full_result.result_tutor = "Full test result for tutor"
39
        full_result.machine = machine
40
        full_result.save()
41
        return sf
42
43
44
class Command(BaseCommand):
45
    help = 'Creates demo data in the installation'
46
47
    def handle(self, *args, **options):
48
49
        print("Adding demo data ...")
50
51
        # create demo users
52
        users = {}
53
        for name in ['demo_student', 'demo_cheater', 'demo_tutor', 'demo_owner']:
54
            user = User.objects.filter(username=name).delete()
55
            user = User.objects.create_user(username=name,
56
                                            email='[email protected]',
57
                                            password=name,
58
                                            first_name=name,
59
                                            last_name=name)
60
            users[name] = user
61
62
        # create demo grading
63
        Grading.objects.filter(title='passed (demo)').delete()
64
        passGrade = Grading(title='passed (demo)', means_passed=True)
65
        passGrade.save()
66
        Grading.objects.filter(title='failed (demo)').delete()
67
        failGrade = Grading(title='failed (demo)', means_passed=False)
68
        failGrade.save()
69
        GradingScheme.objects.filter(
70
            title='Pass/Fail Grading Scheme (Demo)').delete()
71
        passFailGrading = GradingScheme(
72
            title='Pass/Fail Grading Scheme (Demo)')
73
        passFailGrading.save()
74
        passFailGrading.gradings.add(passGrade)
75
        passFailGrading.gradings.add(failGrade)
76
        passFailGrading.save()
77
78
        # create demo course
79
        Course.objects.filter(title='Demo Course').delete()
80
        course = Course(
81
            title='Demo Course',
82
            active=True,
83
            owner=users['demo_owner'],
84
            homepage="http://www.open-submit.org"
85
        )
86
        course.save()
87
        course.tutors.add(users['demo_tutor'])
88
        course.participants.add(users['demo_student'].profile)
89
        course.participants.add(users['demo_cheater'].profile)
90
91
        today = timezone.now()
92
        last_week = today - datetime.timedelta(weeks=1)
93
        tomorrow = today + datetime.timedelta(days=1)
94
        next_week = today + datetime.timedelta(weeks=1)
95
96
        # create demo assignment
97
        ass1 = Assignment(
98
            title='Demo A1: Graded group work with deadline',
99
            course=course,
100
            download='http://example.org/assignments1.pdf',
101
            gradingScheme=passFailGrading,
102
            publish_at=last_week,
103
            soft_deadline=tomorrow,
104
            hard_deadline=next_week,
105
            has_attachment=True,
106
            max_authors=3
107
        )
108
        ass1.save()
109
110
        # create demo assignment without grading
111
        ass2 = Assignment(
112
            title='Demo A2: Non-graded group work with deadline',
113
            course=course,
114
            download='http://example.org/assignments2.pdf',
115
            gradingScheme=None,
116
            publish_at=last_week,
117
            soft_deadline=tomorrow,
118
            hard_deadline=next_week,
119
            has_attachment=True,
120
            max_authors=3
121
        )
122
        ass2.save()
123
124
        # create demo assignment without deadlines
125
        ass3 = Assignment(
126
            title='Demo A3: Graded group work without deadline, only notes',
127
            course=course,
128
            download='http://example.org/assignments1.pdf',
129
            gradingScheme=passFailGrading,
130
            publish_at=last_week,
131
            soft_deadline=None,
132
            hard_deadline=None,
133
            has_attachment=False,
134
            max_authors=3
135
        )
136
        ass3.save()
137
138
        # create demo assignment without deadlines
139
        ass4 = Assignment(
140
            title='Demo A4: Graded group work with deadline being over',
141
            course=course,
142
            download='http://example.org/assignments1.pdf',
143
            gradingScheme=passFailGrading,
144
            publish_at=last_week,
145
            soft_deadline=last_week,
146
            hard_deadline=last_week,
147
            has_attachment=False,
148
            max_authors=3
149
        )
150
        ass4.save()
151
152
        # create demo submission
153
        Submission(
154
            assignment=ass1,
155
            submitter=users['demo_student'],
156
            notes="Demo submission for A1.",
157
            state=Submission.SUBMITTED_TESTED,
158
            file_upload=createSubmissionFile()
159
        ).save()
160
161
        # create cheater submission in course 1
162
        Submission(
163
            assignment=ass1,
164
            submitter=users['demo_cheater'],
165
            notes="Demo duplicate submission for A1.",
166
            state=Submission.SUBMITTED_TESTED,
167
            file_upload=createSubmissionFile()
168
        ).save()
169