04eba58f |
1 | <?PHP // $Id$ |
2 | |
b0e3a925 |
3 | require_once("$CFG->dirroot/files/mimetypes.php"); |
d699cd1e |
4 | |
b7b42874 |
5 | define("OFFLINE", "0"); |
6 | define("UPLOADSINGLE", "1"); |
7 | |
8 | $ASSIGNMENT_TYPE = array (OFFLINE => get_string("typeoffline", "assignment"), |
9 | UPLOADSINGLE => get_string("typeuploadsingle", "assignment") ); |
d699cd1e |
10 | |
11 | |
04eba58f |
12 | function assignment_add_instance($assignment) { |
13 | // Given an object containing all the necessary data, |
14 | // (defined by the form in mod.html) this function |
15 | // will create a new instance and return the id number |
16 | // of the new instance. |
17 | |
18 | $assignment->timemodified = time(); |
d699cd1e |
19 | |
20 | $assignment->timedue = make_timestamp($assignment->dueyear, $assignment->duemonth, $assignment->dueday, |
21 | $assignment->duehour, $assignment->dueminute); |
04eba58f |
22 | |
23 | return insert_record("assignment", $assignment); |
24 | } |
25 | |
26 | |
27 | function assignment_update_instance($assignment) { |
28 | // Given an object containing all the necessary data, |
29 | // (defined by the form in mod.html) this function |
30 | // will update an existing instance with new data. |
31 | |
32 | $assignment->timemodified = time(); |
d699cd1e |
33 | $assignment->timedue = make_timestamp($assignment->dueyear, $assignment->duemonth, $assignment->dueday, |
34 | $assignment->duehour, $assignment->dueminute); |
04eba58f |
35 | $assignment->id = $assignment->instance; |
36 | |
37 | return update_record("assignment", $assignment); |
38 | } |
39 | |
40 | |
41 | function assignment_delete_instance($id) { |
42 | // Given an ID of an instance of this module, |
43 | // this function will permanently delete the instance |
44 | // and any data that depends on it. |
45 | |
46 | if (! $assignment = get_record("assignment", "id", "$id")) { |
47 | return false; |
48 | } |
49 | |
50 | $result = true; |
51 | |
52 | if (! delete_records("assignment_submissions", "assignment", "$assignment->id")) { |
53 | $result = false; |
54 | } |
55 | |
56 | if (! delete_records("assignment", "id", "$assignment->id")) { |
57 | $result = false; |
58 | } |
59 | |
60 | return $result; |
61 | } |
62 | |
77db7e4c |
63 | function assignment_user_outline($course, $user, $mod, $assignment) { |
64 | if ($submission = assignment_get_submission($assignment, $user)) { |
98092498 |
65 | |
66 | if ($submission->grade) { |
67 | $result->info = get_string("grade").": $submission->grade"; |
77db7e4c |
68 | } |
77db7e4c |
69 | $result->time = $submission->timemodified; |
70 | return $result; |
71 | } |
72 | return NULL; |
73 | } |
74 | |
75 | function assignment_user_complete($course, $user, $mod, $assignment) { |
76 | if ($submission = assignment_get_submission($assignment, $user)) { |
77 | if ($basedir = assignment_file_area($assignment, $user)) { |
78 | if ($files = get_directory_list($basedir)) { |
79 | $countfiles = count($files)." ".get_string("uploadedfiles", "assignment"); |
80 | foreach ($files as $file) { |
81 | $countfiles .= "; $file"; |
82 | } |
83 | } |
84 | } |
85 | |
86 | print_simple_box_start(); |
87 | echo "<P><FONT SIZE=1>"; |
88 | echo get_string("lastmodified").": "; |
89 | echo userdate($submission->timemodified); |
90 | echo assignment_print_difference($assignment->timedue - $submission->timemodified); |
91 | echo "</FONT></P>"; |
92 | |
93 | assignment_print_user_files($assignment, $user); |
94 | |
95 | echo "<BR>"; |
96 | |
97 | assignment_print_feedback($course, $submission); |
98 | |
99 | print_simple_box_end(); |
100 | |
101 | } else { |
102 | print_string("notsubmittedyet", "assignment"); |
103 | } |
104 | } |
105 | |
106 | |
d699cd1e |
107 | function assignment_cron () { |
108 | // Function to be run periodically according to the moodle cron |
109 | // Finds all assignment notifications that have yet to be mailed out, and mails them |
110 | |
a16c2180 |
111 | global $CFG, $USER; |
d699cd1e |
112 | |
113 | $cutofftime = time() - $CFG->maxeditingtime; |
114 | |
9fa49e22 |
115 | if ($submissions = assignment_get_unmailed_submissions($cutofftime)) { |
d699cd1e |
116 | $timenow = time(); |
117 | |
118 | foreach ($submissions as $submission) { |
119 | |
120 | echo "Processing assignment submission $submission->id\n"; |
121 | |
ebc3bd2b |
122 | if (! $user = get_record("user", "id", "$submission->userid")) { |
123 | echo "Could not find user $post->userid\n"; |
d699cd1e |
124 | continue; |
125 | } |
126 | |
a5a4cd60 |
127 | $USER->lang = $user->lang; |
128 | |
d699cd1e |
129 | if (! $course = get_record("course", "id", "$submission->course")) { |
130 | echo "Could not find course $submission->course\n"; |
131 | continue; |
132 | } |
133 | |
134 | if (! isstudent($course->id, $user->id) and !isteacher($course->id, $user->id)) { |
b9287b2f |
135 | echo "$user->firstname $user->lastname not an active participant in $course->shortname\n"; |
136 | continue; |
d699cd1e |
137 | } |
138 | |
139 | if (! $teacher = get_record("user", "id", "$submission->teacher")) { |
140 | echo "Could not find teacher $submission->teacher\n"; |
141 | continue; |
142 | } |
143 | |
144 | if (! $mod = get_coursemodule_from_instance("assignment", $submission->assignment, $course->id)) { |
145 | echo "Could not find course module for assignment id $submission->assignment\n"; |
146 | continue; |
147 | } |
148 | |
149 | $strassignments = get_string("modulenameplural", "assignment"); |
150 | $strassignment = get_string("modulename", "assignment"); |
151 | |
152 | $postsubject = "$course->shortname: $strassignments: $submission->name"; |
153 | $posttext = "$course->shortname -> $strassignments -> $submission->name\n"; |
154 | $posttext .= "---------------------------------------------------------------------\n"; |
155 | $posttext .= "$teacher->firstname $teacher->lastname has posted some feedback on your\n"; |
156 | $posttext .= "assignment submission for '$submission->name'\n\n"; |
157 | $posttext .= "You can see it appended to your assignment submission:\n"; |
158 | $posttext .= " $CFG->wwwroot/mod/assignment/view.php?id=$mod->id\n"; |
159 | $posttext .= "---------------------------------------------------------------------\n"; |
160 | if ($user->mailformat == 1) { // HTML |
161 | $posthtml = "<P><FONT FACE=sans-serif>". |
162 | "<A HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</A> ->". |
163 | "<A HREF=\"$CFG->wwwroot/mod/assignment/index.php?id=$course->id\">$strassignments</A> ->". |
164 | "<A HREF=\"$CFG->wwwroot/mod/assignment/view.php?id=$mod->id\">$submission->name</A></FONT></P>"; |
165 | $posthtml .= "<HR><FONT FACE=sans-serif>"; |
166 | $posthtml .= "<P>$teacher->firstname $teacher->lastname has posted some feedback on your"; |
167 | $posthtml .= " assignment submission for '<B>$submission->name</B>'</P>"; |
168 | $posthtml .= "<P>You can see it <A HREF=\"$CFG->wwwroot/mod/assignment/view.php?id=$mod->id\">"; |
169 | $posthtml .= "appended to your assignment submission</A>.</P></FONT><HR>"; |
170 | } else { |
171 | $posthtml = ""; |
172 | } |
173 | |
174 | if (! email_to_user($user, $teacher, $postsubject, $posttext, $posthtml)) { |
175 | echo "Error: assignment cron: Could not send out mail for id $submission->id to user $user->id ($user->email)\n"; |
176 | } |
177 | if (! set_field("assignment_submissions", "mailed", "1", "id", "$submission->id")) { |
178 | echo "Could not update the mailed field for id $submission->id\n"; |
179 | } |
180 | } |
181 | } |
182 | |
183 | return true; |
184 | } |
185 | |
3446205d |
186 | function assignment_print_recent_activity(&$logs, $isteacher=false) { |
187 | global $CFG, $COURSE_TEACHER_COLOR; |
188 | |
189 | $content = false; |
190 | $assignments = NULL; |
191 | |
192 | foreach ($logs as $log) { |
193 | if ($log->module == "assignment" and $log->action == "upload") { |
9fa49e22 |
194 | $assignments[$log->info] = assignment_log_info($log); |
3446205d |
195 | $assignments[$log->info]->time = $log->time; |
196 | $assignments[$log->info]->url = $log->url; |
197 | } |
198 | } |
199 | |
200 | if ($assignments) { |
dcde9f02 |
201 | $strftimerecent = get_string("strftimerecent"); |
3446205d |
202 | $content = true; |
203 | print_headline(get_string("newsubmissions", "assignment").":"); |
204 | foreach ($assignments as $assignment) { |
dcde9f02 |
205 | $date = userdate($assignment->time, $strftimerecent); |
3446205d |
206 | echo "<P><FONT SIZE=1>$date - $assignment->firstname $assignment->lastname<BR>"; |
207 | echo "\"<A HREF=\"$CFG->wwwroot/mod/assignment/$assignment->url\">"; |
208 | echo "$assignment->name"; |
209 | echo "</A>\"</FONT></P>"; |
210 | } |
211 | } |
212 | |
213 | return $content; |
214 | } |
d699cd1e |
215 | |
d0ac6bc2 |
216 | function assignment_grades($assignmentid) { |
858deff0 |
217 | /// Must return an array of grades, indexed by user, and a max grade. |
d0ac6bc2 |
218 | |
9fa49e22 |
219 | $return->grades = get_records_menu("assignment_submissions", "assignment", |
ebc3bd2b |
220 | $assignmentid, "", "userid,grade"); |
858deff0 |
221 | $return->maxgrade = get_field("assignment", "grade", "id", "$assignmentid"); |
222 | return $return; |
d0ac6bc2 |
223 | } |
224 | |
9fa49e22 |
225 | /// SQL STATEMENTS ////////////////////////////////////////////////////////////////// |
226 | |
227 | function assignment_log_info($log) { |
228 | global $CFG; |
229 | return get_record_sql("SELECT a.name, u.firstname, u.lastname |
230 | FROM {$CFG->prefix}assignment a, |
231 | {$CFG->prefix}user u |
232 | WHERE a.id = '$log->info' |
ebc3bd2b |
233 | AND u.id = '$log->userid'"); |
9fa49e22 |
234 | } |
235 | |
000cc405 |
236 | function assignment_get_all_submissions($assignment, $sort="timemodified", $dir="DESC") { |
9fa49e22 |
237 | /// Return all assignment submissions by ENROLLED students |
238 | global $CFG; |
000cc405 |
239 | |
240 | if ($sort == "lastname" or $sort == "firstname") { |
241 | $sort = "u.$sort $dir"; |
242 | } else if (empty($sort)) { |
243 | $sort = "a.timemodified DESC"; |
244 | } else { |
245 | $sort = "a.$sort $dir"; |
246 | } |
9fa49e22 |
247 | return get_records_sql("SELECT a.* |
248 | FROM {$CFG->prefix}assignment_submissions a, |
000cc405 |
249 | {$CFG->prefix}user_students s, |
250 | {$CFG->prefix}user u |
ebc3bd2b |
251 | WHERE a.userid = s.userid |
000cc405 |
252 | AND u.id = a.userid |
9fa49e22 |
253 | AND s.course = '$assignment->course' |
254 | AND a.assignment = '$assignment->id' |
000cc405 |
255 | ORDER BY $sort"); |
9fa49e22 |
256 | } |
257 | |
258 | function assignment_get_users_done($assignment) { |
259 | /// Return list of users who have done an assignment |
260 | global $CFG; |
261 | return get_records_sql("SELECT u.* |
262 | FROM {$CFG->prefix}user u, |
263 | {$CFG->prefix}user_students s, |
264 | {$CFG->prefix}assignment_submissions a |
265 | WHERE s.course = '$assignment->course' |
ebc3bd2b |
266 | AND s.userid = u.id |
267 | AND u.id = a.userid |
9fa49e22 |
268 | AND a.assignment = '$assignment->id' |
269 | ORDER BY a.timemodified DESC"); |
270 | } |
271 | |
272 | function assignment_get_unmailed_submissions($cutofftime) { |
a2631c99 |
273 | /// Return list of marked submissions that have not been mailed out for currently enrolled students |
9fa49e22 |
274 | global $CFG; |
275 | return get_records_sql("SELECT s.*, a.course, a.name |
276 | FROM {$CFG->prefix}assignment_submissions s, |
a2631c99 |
277 | {$CFG->prefix}assignment a, |
278 | {$CFG->prefix}user_students us |
9fa49e22 |
279 | WHERE s.mailed = 0 |
280 | AND s.timemarked < $cutofftime |
281 | AND s.timemarked > 0 |
a2631c99 |
282 | AND s.assignment = a.id |
283 | AND s.userid = us.userid |
284 | AND a.course = us.course"); |
9fa49e22 |
285 | } |
286 | |
287 | |
d699cd1e |
288 | ////////////////////////////////////////////////////////////////////////////////////// |
289 | |
290 | function assignment_file_area_name($assignment, $user) { |
291 | // Creates a directory file name, suitable for make_upload_directory() |
ca4f8eb8 |
292 | global $CFG; |
293 | |
294 | return "$assignment->course/$CFG->moddata/assignment/$assignment->id/$user->id"; |
d699cd1e |
295 | } |
296 | |
297 | function assignment_file_area($assignment, $user) { |
298 | return make_upload_directory( assignment_file_area_name($assignment, $user) ); |
299 | } |
300 | |
301 | function assignment_get_submission($assignment, $user) { |
ebc3bd2b |
302 | return get_record("assignment_submissions", "assignment", $assignment->id, "userid", $user->id); |
d699cd1e |
303 | } |
304 | |
305 | function assignment_print_difference($time) { |
306 | if ($time < 0) { |
307 | $timetext = get_string("late", "assignment", format_time($time)); |
308 | return " (<FONT COLOR=RED>$timetext</FONT>)"; |
309 | } else { |
310 | $timetext = get_string("early", "assignment", format_time($time)); |
311 | return " ($timetext)"; |
312 | } |
313 | } |
314 | |
315 | function assignment_print_submission($assignment, $user, $submission, $teachers, $grades) { |
ce78926d |
316 | global $THEME, $USER; |
d699cd1e |
317 | |
b7b42874 |
318 | echo "\n<TABLE BORDER=1 CELLSPACING=0 valign=top cellpadding=10 align=center>"; |
d699cd1e |
319 | |
320 | echo "\n<TR>"; |
b7b42874 |
321 | if ($assignment->type == OFFLINE) { |
322 | echo "\n<TD BGCOLOR=\"$THEME->body\" WIDTH=35 VALIGN=TOP>"; |
323 | } else { |
324 | echo "\n<TD ROWSPAN=2 BGCOLOR=\"$THEME->body\" WIDTH=35 VALIGN=TOP>"; |
325 | } |
d699cd1e |
326 | print_user_picture($user->id, $assignment->course, $user->picture); |
327 | echo "</TD>"; |
b7b42874 |
328 | echo "<TD NOWRAP BGCOLOR=\"$THEME->cellheading\">$user->firstname $user->lastname"; |
329 | if ($submission->timemodified) { |
d699cd1e |
330 | echo " <FONT SIZE=1>".get_string("lastmodified").": "; |
331 | echo userdate($submission->timemodified); |
332 | echo assignment_print_difference($assignment->timedue - $submission->timemodified); |
333 | echo "</FONT>"; |
334 | } |
335 | echo "</TR>"; |
336 | |
b7b42874 |
337 | if ($assignment->type != OFFLINE) { |
338 | echo "\n<TR><TD BGCOLOR=\"$THEME->cellcontent\">"; |
ff446576 |
339 | if ($submission->timemodified) { |
b7b42874 |
340 | assignment_print_user_files($assignment, $user); |
341 | } else { |
342 | print_string("notsubmittedyet", "assignment"); |
d699cd1e |
343 | } |
d699cd1e |
344 | echo "</TD></TR>"; |
345 | } |
b7b42874 |
346 | |
347 | echo "\n<TR>"; |
348 | echo "<TD WIDTH=35 VALIGN=TOP>"; |
349 | if (!$submission->teacher) { |
350 | $submission->teacher = $USER->id; |
351 | } |
352 | print_user_picture($submission->teacher, $assignment->course, $teachers[$submission->teacher]->picture); |
353 | if ($submission->timemodified > $submission->timemarked) { |
354 | echo "<TD BGCOLOR=\"$THEME->cellheading2\">"; |
355 | } else { |
356 | echo "<TD BGCOLOR=\"$THEME->cellheading\">"; |
357 | } |
f830b324 |
358 | echo get_string("feedback", "assignment").":"; |
b7b42874 |
359 | choose_from_menu($grades, "g$submission->id", $submission->grade, get_string("grade")."..."); |
360 | if ($submission->timemarked) { |
361 | echo " <FONT SIZE=1>".userdate($submission->timemarked)."</FONT>"; |
362 | } |
363 | echo "<BR><TEXTAREA NAME=\"c$submission->id\" ROWS=6 COLS=60 WRAP=virtual>"; |
364 | p($submission->comment); |
365 | echo "</TEXTAREA><BR>"; |
366 | echo "</TD></TR>"; |
367 | |
d699cd1e |
368 | echo "</TABLE><BR CLEAR=ALL>\n"; |
369 | } |
370 | |
371 | function assignment_print_feedback($course, $submission) { |
372 | global $CFG, $THEME, $RATING; |
373 | |
374 | if (! $teacher = get_record("user", "id", $submission->teacher)) { |
375 | error("Weird assignment error"); |
376 | } |
377 | |
b0f01dff |
378 | echo "\n<TABLE BORDER=0 CELLPADDING=1 CELLSPACING=1 ALIGN=CENTER><TR><TD BGCOLOR=#888888>"; |
379 | echo "\n<TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0 VALIGN=TOP>"; |
d699cd1e |
380 | |
381 | echo "\n<TR>"; |
382 | echo "\n<TD ROWSPAN=3 BGCOLOR=\"$THEME->body\" WIDTH=35 VALIGN=TOP>"; |
383 | print_user_picture($teacher->id, $course->id, $teacher->picture); |
384 | echo "</TD>"; |
385 | echo "<TD NOWRAP WIDTH=100% BGCOLOR=\"$THEME->cellheading\">$teacher->firstname $teacher->lastname"; |
386 | echo " <FONT SIZE=2><I>".userdate($submission->timemarked)."</I>"; |
387 | echo "</TR>"; |
388 | |
389 | echo "\n<TR><TD WIDTH=100% BGCOLOR=\"$THEME->cellcontent\">"; |
390 | |
391 | echo "<P ALIGN=RIGHT><FONT SIZE=-1><I>"; |
392 | if ($submission->grade) { |
393 | echo get_string("grade").": $submission->grade"; |
394 | } else { |
395 | echo get_string("nograde"); |
396 | } |
397 | echo "</I></FONT></P>"; |
398 | |
399 | echo text_to_html($submission->comment); |
400 | echo "</TD></TR></TABLE>"; |
b0f01dff |
401 | echo "</TD></TR></TABLE>"; |
d699cd1e |
402 | } |
403 | |
404 | |
405 | function assignment_print_user_files($assignment, $user) { |
406 | // Arguments are objects |
407 | |
408 | global $CFG; |
409 | |
410 | $filearea = assignment_file_area_name($assignment, $user); |
411 | |
412 | if ($basedir = assignment_file_area($assignment, $user)) { |
413 | if ($files = get_directory_list($basedir)) { |
414 | foreach ($files as $file) { |
415 | $icon = mimeinfo("icon", $file); |
3f8247c2 |
416 | if ($CFG->slasharguments) { |
417 | $ffurl = "file.php/$filearea/$file"; |
418 | } else { |
419 | $ffurl = "file.php?file=/$filearea/$file"; |
420 | } |
421 | |
d699cd1e |
422 | echo "<IMG SRC=\"$CFG->wwwroot/files/pix/$icon\" HEIGHT=16 WIDTH=16 BORDER=0 ALT=\"File\">"; |
3f8247c2 |
423 | echo " <A TARGET=\"uploadedfile\" HREF=\"$CFG->wwwroot/$ffurl\">$file</A>"; |
d699cd1e |
424 | echo "<BR>"; |
425 | } |
426 | } |
427 | } |
428 | } |
429 | |
430 | function assignment_delete_user_files($assignment, $user, $exception) { |
431 | // Deletes all the user files in the assignment area for a user |
432 | // EXCEPT for any file named $exception |
433 | |
434 | if ($basedir = assignment_file_area($assignment, $user)) { |
435 | if ($files = get_directory_list($basedir)) { |
436 | foreach ($files as $file) { |
437 | if ($file != $exception) { |
438 | unlink("$basedir/$file"); |
439 | notify("Existing file '$file' has been deleted!"); |
440 | } |
441 | } |
442 | } |
443 | } |
444 | } |
445 | |
446 | function assignment_print_upload_form($assignment) { |
447 | // Arguments are objects |
448 | |
449 | echo "<DIV ALIGN=CENTER>"; |
450 | echo "<FORM ENCTYPE=\"multipart/form-data\" METHOD=\"POST\" ACTION=upload.php>"; |
ce78926d |
451 | echo " <INPUT TYPE=hidden NAME=MAX_FILE_SIZE value=\"$assignment->maxbytes\">"; |
d699cd1e |
452 | echo " <INPUT TYPE=hidden NAME=id VALUE=\"$assignment->id\">"; |
453 | echo " <INPUT NAME=\"newfile\" TYPE=\"file\" size=\"50\">"; |
454 | echo " <INPUT TYPE=submit NAME=save VALUE=\"".get_string("uploadthisfile")."\">"; |
455 | echo "</FORM>"; |
456 | echo "</DIV>"; |
457 | } |
04eba58f |
458 | |
459 | ?> |