Passed
Push — 1.11.x ( 056f3f...b39662 )
by
unknown
10:47 queued 14s
created

AssignExport::getData()   B

Complexity

Conditions 7
Paths 5

Size

Total Lines 44
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 32
c 1
b 0
f 0
dl 0
loc 44
rs 8.4746
cc 7
nc 5
nop 2
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace moodleexport;
6
7
use DocumentManager;
8
9
/**
10
 * Class AssignExport.
11
 *
12
 * Handles the export of assignments within a course.
13
 */
14
class AssignExport extends ActivityExport
15
{
16
    /**
17
     * Export all assign data into a single Moodle assign activity.
18
     *
19
     * @param int    $activityId The ID of the assign.
20
     * @param string $exportDir  The directory where the assign will be exported.
21
     * @param int    $moduleId   The ID of the module.
22
     * @param int    $sectionId  The ID of the section.
23
     */
24
    public function export($activityId, $exportDir, $moduleId, $sectionId): void
25
    {
26
        // Prepare the directory where the assign export will be saved
27
        $assignDir = $this->prepareActivityDirectory($exportDir, 'assign', $moduleId);
28
29
        // Retrieve assign data
30
        $assignData = $this->getData($activityId, $sectionId);
31
32
        // Generate XML files for the assign
33
        $this->createAssignXml($assignData, $assignDir);
34
        $this->createModuleXml($assignData, $assignDir);
35
        $this->createGradesXml($assignData, $assignDir);
36
        $this->createGradingXml($assignData, $assignDir);
37
        $this->createInforefXml($assignData, $assignDir);
38
        $this->createGradeHistoryXml($assignData, $assignDir);
39
        $this->createRolesXml($assignData, $assignDir);
40
        $this->createCommentsXml($assignData, $assignDir);
41
        $this->createCalendarXml($assignData, $assignDir);
42
        $this->createFiltersXml($assignData, $assignDir);
43
    }
44
45
    /**
46
     * Get all the data related to the assign activity.
47
     */
48
    public function getData(int $assignId, int $sectionId): ?array
49
    {
50
        $work = $this->course->resources[RESOURCE_WORK][$assignId];
51
52
        if (empty($work->params['id']) || empty($work->params['title'])) {
53
            return null;
54
        }
55
56
        $sentDate = !empty($work->params['sent_date']) ? strtotime($work->params['sent_date']) : time();
57
58
        $workFiles = getAllDocumentToWork($assignId, $this->course->info['real_id']);
59
        $files = [];
60
        if (!empty($workFiles)) {
61
            foreach ($workFiles as $file) {
62
                $docData = DocumentManager::get_document_data_by_id($file['document_id'], $this->course->info['code']);
63
                if (!empty($docData)) {
64
                    $files[] = [
65
                        'id' => $file['document_id'],
66
                        'contenthash' => hash('sha1', basename($docData['path'])),
67
                    ];
68
                }
69
            }
70
        }
71
72
        $adminData = MoodleExport::getAdminUserData();
73
        $adminId = $adminData['id'];
74
75
        return [
76
            'id' => (int) $work->params['id'],
77
            'moduleid' => (int) $work->params['id'],
78
            'modulename' => 'assign',
79
            'contextid' => $this->course->info['real_id'],
80
            'sectionid' => $sectionId,
81
            'sectionnumber' => 0,
82
            'name' => htmlspecialchars($work->params['title'], ENT_QUOTES),
83
            'intro' => htmlspecialchars($work->params['description'], ENT_QUOTES),
84
            'duedate' => $sentDate,
85
            'gradingduedate' => $sentDate + 7 * 86400,
86
            'allowsubmissionsfromdate' => $sentDate,
87
            'timemodified' => time(),
88
            'grade_item_id' => 0,
89
            'files' => $files,
90
            'users' => [$adminId],
91
            'area_id' => 0,
92
        ];
93
    }
94
95
    /**
96
     * Create the grades.xml file for the assign activity.
97
     */
98
    protected function createGradesXml(array $data, string $directory): void
99
    {
100
        $xmlContent = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
101
        $xmlContent .= '<activity_gradebook>'.PHP_EOL;
102
        $xmlContent .= '  <grade_items>'.PHP_EOL;
103
        $xmlContent .= '    <grade_item id="'.$data['grade_item_id'].'">'.PHP_EOL;
104
        $xmlContent .= '      <categoryid>1</categoryid>'.PHP_EOL;
105
        $xmlContent .= '      <itemname>'.htmlspecialchars($data['name']).'</itemname>'.PHP_EOL;
106
        $xmlContent .= '      <itemtype>mod</itemtype>'.PHP_EOL;
107
        $xmlContent .= '      <itemmodule>'.$data['modulename'].'</itemmodule>'.PHP_EOL;
108
        $xmlContent .= '      <iteminstance>'.$data['id'].'</iteminstance>'.PHP_EOL;
109
        $xmlContent .= '      <itemnumber>0</itemnumber>'.PHP_EOL;
110
        $xmlContent .= '      <iteminfo>$@NULL@$</iteminfo>'.PHP_EOL;
111
        $xmlContent .= '      <idnumber></idnumber>'.PHP_EOL;
112
        $xmlContent .= '      <calculation>$@NULL@$</calculation>'.PHP_EOL;
113
        $xmlContent .= '      <gradetype>1</gradetype>'.PHP_EOL;
114
        $xmlContent .= '      <grademax>100.00000</grademax>'.PHP_EOL;
115
        $xmlContent .= '      <grademin>0.00000</grademin>'.PHP_EOL;
116
        $xmlContent .= '      <scaleid>$@NULL@$</scaleid>'.PHP_EOL;
117
        $xmlContent .= '      <outcomeid>$@NULL@$</outcomeid>'.PHP_EOL;
118
        $xmlContent .= '      <gradepass>0.00000</gradepass>'.PHP_EOL;
119
        $xmlContent .= '      <multfactor>1.00000</multfactor>'.PHP_EOL;
120
        $xmlContent .= '      <plusfactor>0.00000</plusfactor>'.PHP_EOL;
121
        $xmlContent .= '      <aggregationcoef>0.00000</aggregationcoef>'.PHP_EOL;
122
        $xmlContent .= '      <aggregationcoef2>0.23810</aggregationcoef2>'.PHP_EOL;
123
        $xmlContent .= '      <weightoverride>0</weightoverride>'.PHP_EOL;
124
        $xmlContent .= '      <sortorder>5</sortorder>'.PHP_EOL;
125
        $xmlContent .= '      <display>0</display>'.PHP_EOL;
126
        $xmlContent .= '      <decimals>$@NULL@$</decimals>'.PHP_EOL;
127
        $xmlContent .= '      <hidden>0</hidden>'.PHP_EOL;
128
        $xmlContent .= '      <locked>0</locked>'.PHP_EOL;
129
        $xmlContent .= '      <locktime>0</locktime>'.PHP_EOL;
130
        $xmlContent .= '      <needsupdate>0</needsupdate>'.PHP_EOL;
131
        $xmlContent .= '      <timecreated>'.$data['timemodified'].'</timecreated>'.PHP_EOL;
132
        $xmlContent .= '      <timemodified>'.$data['timemodified'].'</timemodified>'.PHP_EOL;
133
        $xmlContent .= '      <grade_grades></grade_grades>'.PHP_EOL;
134
        $xmlContent .= '    </grade_item>'.PHP_EOL;
135
        $xmlContent .= '  </grade_items>'.PHP_EOL;
136
        $xmlContent .= '  <grade_letters></grade_letters>'.PHP_EOL;
137
        $xmlContent .= '</activity_gradebook>';
138
139
        $this->createXmlFile('grades', $xmlContent, $directory);
140
    }
141
142
    /**
143
     * Create the XML file for the assign activity.
144
     */
145
    private function createAssignXml(array $assignData, string $assignDir): void
146
    {
147
        $xmlContent = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
148
        $xmlContent .= '<activity id="'.$assignData['id'].'" moduleid="'.$assignData['moduleid'].'" modulename="assign" contextid="'.$assignData['contextid'].'">'.PHP_EOL;
149
        $xmlContent .= '  <assign id="'.$assignData['id'].'">'.PHP_EOL;
150
        $xmlContent .= '    <name>'.htmlspecialchars($assignData['name']).'</name>'.PHP_EOL;
151
        $xmlContent .= '    <intro><![CDATA['.$assignData['intro'].']]></intro>'.PHP_EOL;
152
        $xmlContent .= '    <introformat>1</introformat>'.PHP_EOL;
153
        $xmlContent .= '    <alwaysshowdescription>1</alwaysshowdescription>'.PHP_EOL;
154
        $xmlContent .= '    <submissiondrafts>0</submissiondrafts>'.PHP_EOL;
155
        $xmlContent .= '    <sendnotifications>0</sendnotifications>'.PHP_EOL;
156
        $xmlContent .= '    <sendlatenotifications>0</sendlatenotifications>'.PHP_EOL;
157
        $xmlContent .= '    <sendstudentnotifications>1</sendstudentnotifications>'.PHP_EOL;
158
        $xmlContent .= '    <duedate>'.$assignData['duedate'].'</duedate>'.PHP_EOL;
159
        $xmlContent .= '    <cutoffdate>0</cutoffdate>'.PHP_EOL;
160
        $xmlContent .= '    <gradingduedate>'.$assignData['gradingduedate'].'</gradingduedate>'.PHP_EOL;
161
        $xmlContent .= '    <allowsubmissionsfromdate>'.$assignData['allowsubmissionsfromdate'].'</allowsubmissionsfromdate>'.PHP_EOL;
162
        $xmlContent .= '    <grade>100</grade>'.PHP_EOL;
163
        $xmlContent .= '    <timemodified>'.$assignData['timemodified'].'</timemodified>'.PHP_EOL;
164
        $xmlContent .= '    <completionsubmit>1</completionsubmit>'.PHP_EOL;
165
        $xmlContent .= '    <requiresubmissionstatement>0</requiresubmissionstatement>'.PHP_EOL;
166
        $xmlContent .= '    <teamsubmission>0</teamsubmission>'.PHP_EOL;
167
        $xmlContent .= '    <requireallteammemberssubmit>0</requireallteammemberssubmit>'.PHP_EOL;
168
        $xmlContent .= '    <teamsubmissiongroupingid>0</teamsubmissiongroupingid>'.PHP_EOL;
169
        $xmlContent .= '    <blindmarking>0</blindmarking>'.PHP_EOL;
170
        $xmlContent .= '    <hidegrader>0</hidegrader>'.PHP_EOL;
171
        $xmlContent .= '    <revealidentities>0</revealidentities>'.PHP_EOL;
172
        $xmlContent .= '    <attemptreopenmethod>none</attemptreopenmethod>'.PHP_EOL;
173
        $xmlContent .= '    <maxattempts>1</maxattempts>'.PHP_EOL;
174
        $xmlContent .= '    <markingworkflow>0</markingworkflow>'.PHP_EOL;
175
        $xmlContent .= '    <markingallocation>0</markingallocation>'.PHP_EOL;
176
        $xmlContent .= '    <preventsubmissionnotingroup>0</preventsubmissionnotingroup>'.PHP_EOL;
177
        $xmlContent .= '    <userflags></userflags>'.PHP_EOL;
178
        $xmlContent .= '    <submissions></submissions>'.PHP_EOL;
179
        $xmlContent .= '    <grades></grades>'.PHP_EOL;
180
        $xmlContent .= '  </assign>'.PHP_EOL;
181
        $xmlContent .= '</activity>';
182
183
        $this->createXmlFile('assign', $xmlContent, $assignDir);
184
    }
185
186
    /**
187
     * Create the grading.xml file for the assign activity.
188
     */
189
    private function createGradingXml(array $data, string $assignDir): void
190
    {
191
        $xmlContent = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
192
        $xmlContent .= '<areas>'.PHP_EOL;
193
        $xmlContent .= '  <area id="'.$data['area_id'].'">'.PHP_EOL;
194
        $xmlContent .= '    <areaname>submissions</areaname>'.PHP_EOL;
195
        $xmlContent .= '    <activemethod>$@NULL@$</activemethod>'.PHP_EOL;
196
        $xmlContent .= '    <definitions></definitions>'.PHP_EOL;
197
        $xmlContent .= '  </area>'.PHP_EOL;
198
        $xmlContent .= '</areas>';
199
200
        $this->createXmlFile('grading', $xmlContent, $assignDir);
201
    }
202
}
203