Passed
Pull Request — 1.11.x (#5783)
by Yannick
08:32
created

AssignExport   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 180
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 8
eloc 126
c 1
b 0
f 0
dl 0
loc 180
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A createGradingXml() 0 12 1
A export() 0 19 1
A createAssignXml() 0 39 1
A getData() 0 38 4
A createGradesXml() 0 42 1
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
     * Create the XML file for the assign activity.
47
     */
48
    private function createAssignXml(array $assignData, string $assignDir): void
49
    {
50
        $xmlContent = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
51
        $xmlContent .= '<activity id="' . $assignData['id'] . '" moduleid="' . $assignData['moduleid'] . '" modulename="assign" contextid="' . $assignData['contextid'] . '">' . PHP_EOL;
52
        $xmlContent .= '  <assign id="' . $assignData['id'] . '">' . PHP_EOL;
53
        $xmlContent .= '    <name>' . htmlspecialchars($assignData['name']) . '</name>' . PHP_EOL;
54
        $xmlContent .= '    <intro><![CDATA[' . $assignData['intro'] . ']]></intro>' . PHP_EOL;
55
        $xmlContent .= '    <introformat>1</introformat>' . PHP_EOL;
56
        $xmlContent .= '    <alwaysshowdescription>1</alwaysshowdescription>' . PHP_EOL;
57
        $xmlContent .= '    <submissiondrafts>0</submissiondrafts>' . PHP_EOL;
58
        $xmlContent .= '    <sendnotifications>0</sendnotifications>' . PHP_EOL;
59
        $xmlContent .= '    <sendlatenotifications>0</sendlatenotifications>' . PHP_EOL;
60
        $xmlContent .= '    <sendstudentnotifications>1</sendstudentnotifications>' . PHP_EOL;
61
        $xmlContent .= '    <duedate>' . $assignData['duedate'] . '</duedate>' . PHP_EOL;
62
        $xmlContent .= '    <cutoffdate>0</cutoffdate>' . PHP_EOL;
63
        $xmlContent .= '    <gradingduedate>' . $assignData['gradingduedate'] . '</gradingduedate>' . PHP_EOL;
64
        $xmlContent .= '    <allowsubmissionsfromdate>' . $assignData['allowsubmissionsfromdate'] . '</allowsubmissionsfromdate>' . PHP_EOL;
65
        $xmlContent .= '    <grade>100</grade>' . PHP_EOL;
66
        $xmlContent .= '    <timemodified>' . $assignData['timemodified'] . '</timemodified>' . PHP_EOL;
67
        $xmlContent .= '    <completionsubmit>1</completionsubmit>' . PHP_EOL;
68
        $xmlContent .= '    <requiresubmissionstatement>0</requiresubmissionstatement>' . PHP_EOL;
69
        $xmlContent .= '    <teamsubmission>0</teamsubmission>' . PHP_EOL;
70
        $xmlContent .= '    <requireallteammemberssubmit>0</requireallteammemberssubmit>' . PHP_EOL;
71
        $xmlContent .= '    <teamsubmissiongroupingid>0</teamsubmissiongroupingid>' . PHP_EOL;
72
        $xmlContent .= '    <blindmarking>0</blindmarking>' . PHP_EOL;
73
        $xmlContent .= '    <hidegrader>0</hidegrader>' . PHP_EOL;
74
        $xmlContent .= '    <revealidentities>0</revealidentities>' . PHP_EOL;
75
        $xmlContent .= '    <attemptreopenmethod>none</attemptreopenmethod>' . PHP_EOL;
76
        $xmlContent .= '    <maxattempts>1</maxattempts>' . PHP_EOL;
77
        $xmlContent .= '    <markingworkflow>0</markingworkflow>' . PHP_EOL;
78
        $xmlContent .= '    <markingallocation>0</markingallocation>' . PHP_EOL;
79
        $xmlContent .= '    <preventsubmissionnotingroup>0</preventsubmissionnotingroup>' . PHP_EOL;
80
        $xmlContent .= '    <userflags></userflags>' . PHP_EOL;
81
        $xmlContent .= '    <submissions></submissions>' . PHP_EOL;
82
        $xmlContent .= '    <grades></grades>' . PHP_EOL;
83
        $xmlContent .= '  </assign>' . PHP_EOL;
84
        $xmlContent .= '</activity>';
85
86
        $this->createXmlFile('assign', $xmlContent, $assignDir);
87
    }
88
89
    /**
90
     * Create the grades.xml file for the assign activity.
91
     */
92
    protected function createGradesXml(array $data, string $directory): void
93
    {
94
        $xmlContent = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
95
        $xmlContent .= '<activity_gradebook>' . PHP_EOL;
96
        $xmlContent .= '  <grade_items>' . PHP_EOL;
97
        $xmlContent .= '    <grade_item id="' . $data['grade_item_id'] . '">' . PHP_EOL;
98
        $xmlContent .= '      <categoryid>1</categoryid>' . PHP_EOL;
99
        $xmlContent .= '      <itemname>' . htmlspecialchars($data['name']) . '</itemname>' . PHP_EOL;
100
        $xmlContent .= '      <itemtype>mod</itemtype>' . PHP_EOL;
101
        $xmlContent .= '      <itemmodule>'.$data['modulename'].'</itemmodule>' . PHP_EOL;
102
        $xmlContent .= '      <iteminstance>' . $data['id'] . '</iteminstance>' . PHP_EOL;
103
        $xmlContent .= '      <itemnumber>0</itemnumber>' . PHP_EOL;
104
        $xmlContent .= '      <iteminfo>$@NULL@$</iteminfo>' . PHP_EOL;
105
        $xmlContent .= '      <idnumber></idnumber>' . PHP_EOL;
106
        $xmlContent .= '      <calculation>$@NULL@$</calculation>' . PHP_EOL;
107
        $xmlContent .= '      <gradetype>1</gradetype>' . PHP_EOL;
108
        $xmlContent .= '      <grademax>100.00000</grademax>' . PHP_EOL;
109
        $xmlContent .= '      <grademin>0.00000</grademin>' . PHP_EOL;
110
        $xmlContent .= '      <scaleid>$@NULL@$</scaleid>' . PHP_EOL;
111
        $xmlContent .= '      <outcomeid>$@NULL@$</outcomeid>' . PHP_EOL;
112
        $xmlContent .= '      <gradepass>0.00000</gradepass>' . PHP_EOL;
113
        $xmlContent .= '      <multfactor>1.00000</multfactor>' . PHP_EOL;
114
        $xmlContent .= '      <plusfactor>0.00000</plusfactor>' . PHP_EOL;
115
        $xmlContent .= '      <aggregationcoef>0.00000</aggregationcoef>' . PHP_EOL;
116
        $xmlContent .= '      <aggregationcoef2>0.23810</aggregationcoef2>' . PHP_EOL;
117
        $xmlContent .= '      <weightoverride>0</weightoverride>' . PHP_EOL;
118
        $xmlContent .= '      <sortorder>5</sortorder>' . PHP_EOL;
119
        $xmlContent .= '      <display>0</display>' . PHP_EOL;
120
        $xmlContent .= '      <decimals>$@NULL@$</decimals>' . PHP_EOL;
121
        $xmlContent .= '      <hidden>0</hidden>' . PHP_EOL;
122
        $xmlContent .= '      <locked>0</locked>' . PHP_EOL;
123
        $xmlContent .= '      <locktime>0</locktime>' . PHP_EOL;
124
        $xmlContent .= '      <needsupdate>0</needsupdate>' . PHP_EOL;
125
        $xmlContent .= '      <timecreated>' . $data['timemodified'] . '</timecreated>' . PHP_EOL;
126
        $xmlContent .= '      <timemodified>' . $data['timemodified'] . '</timemodified>' . PHP_EOL;
127
        $xmlContent .= '      <grade_grades></grade_grades>' . PHP_EOL;
128
        $xmlContent .= '    </grade_item>' . PHP_EOL;
129
        $xmlContent .= '  </grade_items>' . PHP_EOL;
130
        $xmlContent .= '  <grade_letters></grade_letters>' . PHP_EOL;
131
        $xmlContent .= '</activity_gradebook>';
132
133
        $this->createXmlFile('grades', $xmlContent, $directory);
134
    }
135
136
    /**
137
     * Create the grading.xml file for the assign activity.
138
     */
139
    private function createGradingXml(array $data, string $assignDir): void
140
    {
141
        $xmlContent = '<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL;
142
        $xmlContent .= '<areas>' . PHP_EOL;
143
        $xmlContent .= '  <area id="'.$data['area_id'].'">' . PHP_EOL;
144
        $xmlContent .= '    <areaname>submissions</areaname>' . PHP_EOL;
145
        $xmlContent .= '    <activemethod>$@NULL@$</activemethod>' . PHP_EOL;
146
        $xmlContent .= '    <definitions></definitions>' . PHP_EOL;
147
        $xmlContent .= '  </area>' . PHP_EOL;
148
        $xmlContent .= '</areas>';
149
150
        $this->createXmlFile('grading', $xmlContent, $assignDir);
151
    }
152
153
    /**
154
     * Get all the data related to the assign activity.
155
     */
156
    public function getData(int $assignId, int $sectionId): ?array
157
    {
158
        $work = $this->course->resources[RESOURCE_WORK][$assignId];
159
160
        $workFiles = getAllDocumentToWork($assignId, $this->course->info['real_id']);
161
        $files = [];
162
        if (!empty($workFiles)) {
163
            foreach ($workFiles as $file) {
164
                $docData = DocumentManager::get_document_data_by_id($file['document_id'], $this->course->info['code']);
165
                if (!empty($docData)) {
166
                    $files[] = [
167
                        'id' => $file['document_id'],
168
                        'contenthash' => hash('sha1', basename($docData['path'])),
169
                    ];
170
                }
171
            }
172
        }
173
174
        $adminData = MoodleExport::getAdminUserData();
175
        $adminId = $adminData['id'];
176
177
        return [
178
            'id' => (int) $work->params['id'],
179
            'moduleid' => (int) $work->params['id'],
180
            'modulename' => 'assign',
181
            'contextid' => $this->course->info['real_id'],
182
            'sectionid' => $sectionId,
183
            'sectionnumber' => 0,
184
            'name' => htmlspecialchars($work->params['title']),
185
            'intro' => $work->params['description'],
186
            'duedate' => strtotime($work->params['sent_date']),
187
            'gradingduedate' => strtotime($work->params['sent_date']) + 86400 * 7,
188
            'allowsubmissionsfromdate' => strtotime($work->params['sent_date']),
189
            'timemodified' => time(),
190
            'grade_item_id' => 0,
191
            'files' => $files,
192
            'users' => [$adminId],
193
            'area_id' => 0
194
        ];
195
    }
196
}
197