Can now count a search of users
[moodle.git] / mod / assignment / lib.php
1 <?PHP  // $Id$
3 require_once("$CFG->dirroot/files/mimetypes.php");
5 define("OFFLINE",      "0");
6 define("UPLOADSINGLE", "1");
8 $ASSIGNMENT_TYPE = array (OFFLINE       => get_string("typeoffline",      "assignment"),
9                           UPLOADSINGLE  => get_string("typeuploadsingle", "assignment") );
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.
18     $assignment->timemodified = time();
19     
20     $assignment->timedue = make_timestamp($assignment->dueyear, $assignment->duemonth, $assignment->dueday, 
21                                           $assignment->duehour, $assignment->dueminute);
23     return insert_record("assignment", $assignment);
24 }
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.
32     $assignment->timemodified = time();
33     $assignment->timedue = make_timestamp($assignment->dueyear, $assignment->duemonth, $assignment->dueday, 
34                                           $assignment->duehour, $assignment->dueminute);
35     $assignment->id = $assignment->instance;
37     return update_record("assignment", $assignment);
38 }
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.  
46     if (! $assignment = get_record("assignment", "id", "$id")) {
47         return false;
48     }
50     $result = true;
52     if (! delete_records("assignment_submissions", "assignment", "$assignment->id")) {
53         $result = false;
54     }
56     if (! delete_records("assignment", "id", "$assignment->id")) {
57         $result = false;
58     }
60     return $result;
61 }
63 function assignment_user_outline($course, $user, $mod, $assignment) {
64     if ($submission = assignment_get_submission($assignment, $user)) {
65         
66         if ($submission->grade) {
67             $result->info = get_string("grade").": $submission->grade";
68         }
69         $result->time = $submission->timemodified;
70         return $result;
71     }
72     return NULL;
73 }
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         }
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>";
93         assignment_print_user_files($assignment, $user);
95         echo "<BR>";
97         assignment_print_feedback($course, $submission);
99         print_simple_box_end();
101     } else {
102         print_string("notsubmittedyet", "assignment");
103     }
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
111     global $CFG, $USER;
113     $cutofftime = time() - $CFG->maxeditingtime;
115     if ($submissions = assignment_get_unmailed_submissions($cutofftime)) {
116         $timenow = time();
118         foreach ($submissions as $submission) {
120             echo "Processing assignment submission $submission->id\n";
122             if (! $user = get_record("user", "id", "$submission->userid")) {
123                 echo "Could not find user $post->userid\n";
124                 continue;
125             }
127             $USER->lang = $user->lang;
129             if (! $course = get_record("course", "id", "$submission->course")) {
130                 echo "Could not find course $submission->course\n";
131                 continue;
132             }
134             if (! isstudent($course->id, $user->id) and !isteacher($course->id, $user->id)) {
135                 echo "$user->firstname $user->lastname not an active participant in $course->shortname\n";
136                 continue;
137             }
139             if (! $teacher = get_record("user", "id", "$submission->teacher")) {
140                 echo "Could not find teacher $submission->teacher\n";
141                 continue;
142             }
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             }
149             $strassignments = get_string("modulenameplural", "assignment");
150             $strassignment  = get_string("modulename", "assignment");
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             }
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     }
183     return true;
186 function assignment_print_recent_activity(&$logs, $isteacher=false) {
187     global $CFG, $COURSE_TEACHER_COLOR;
189     $content = false;
190     $assignments = NULL;
192     foreach ($logs as $log) {
193         if ($log->module == "assignment" and $log->action == "upload") {
194             $assignments[$log->info] = assignment_log_info($log);
195             $assignments[$log->info]->time = $log->time;
196             $assignments[$log->info]->url  = $log->url;
197         }
198     }
200     if ($assignments) {
201         $strftimerecent = get_string("strftimerecent");
202         $content = true;
203         print_headline(get_string("newsubmissions", "assignment").":");
204         foreach ($assignments as $assignment) {
205             $date = userdate($assignment->time, $strftimerecent);
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;
216 function assignment_grades($assignmentid) {
217 /// Must return an array of grades, indexed by user, and a max grade.
219     $return->grades = get_records_menu("assignment_submissions", "assignment", 
220                                        $assignmentid, "", "userid,grade");
221     $return->maxgrade = get_field("assignment", "grade", "id", "$assignmentid");
222     return $return;
225 /// SQL STATEMENTS //////////////////////////////////////////////////////////////////
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' 
233                               AND u.id = '$log->userid'");
236 function assignment_get_all_submissions($assignment) {
237 /// Return all assignment submissions by ENROLLED students
238     global $CFG;
239     return get_records_sql("SELECT a.* 
240                               FROM {$CFG->prefix}assignment_submissions a, 
241                                    {$CFG->prefix}user_students s
242                              WHERE a.userid = s.userid
243                                AND s.course = '$assignment->course'
244                                AND a.assignment = '$assignment->id' 
245                           ORDER BY a.timemodified DESC");
248 function assignment_get_users_done($assignment) {
249 /// Return list of users who have done an assignment
250     global $CFG;
251     return get_records_sql("SELECT u.* 
252                               FROM {$CFG->prefix}user u, 
253                                    {$CFG->prefix}user_students s, 
254                                    {$CFG->prefix}assignment_submissions a
255                              WHERE s.course = '$assignment->course' 
256                                AND s.userid = u.id
257                                AND u.id = a.userid 
258                                AND a.assignment = '$assignment->id'
259                           ORDER BY a.timemodified DESC");
262 function assignment_get_unmailed_submissions($cutofftime) {
263 /// Return list of marked submissions that have not been mailed out for currently enrolled students
264     global $CFG;
265     return get_records_sql("SELECT s.*, a.course, a.name
266                               FROM {$CFG->prefix}assignment_submissions s, 
267                                    {$CFG->prefix}assignment a,
268                                    {$CFG->prefix}user_students us
269                              WHERE s.mailed = 0 
270                                AND s.timemarked < $cutofftime 
271                                AND s.timemarked > 0
272                                AND s.assignment = a.id
273                                AND s.userid = us.userid
274                                AND a.course = us.course");
278 //////////////////////////////////////////////////////////////////////////////////////
280 function assignment_file_area_name($assignment, $user) {
281 //  Creates a directory file name, suitable for make_upload_directory()
282     global $CFG;
284     return "$assignment->course/$CFG->moddata/assignment/$assignment->id/$user->id";
287 function assignment_file_area($assignment, $user) {
288     return make_upload_directory( assignment_file_area_name($assignment, $user) );
291 function assignment_get_submission($assignment, $user) {
292     return get_record("assignment_submissions", "assignment", $assignment->id, "userid", $user->id);
295 function assignment_print_difference($time) {
296     if ($time < 0) {
297         $timetext = get_string("late", "assignment", format_time($time));
298         return " (<FONT COLOR=RED>$timetext</FONT>)";
299     } else {
300         $timetext = get_string("early", "assignment", format_time($time));
301         return " ($timetext)";
302     }
305 function assignment_print_submission($assignment, $user, $submission, $teachers, $grades) {
306     global $THEME, $USER;
308     echo "\n<TABLE BORDER=1 CELLSPACING=0 valign=top cellpadding=10 align=center>";
310     echo "\n<TR>";
311     if ($assignment->type == OFFLINE) {
312         echo "\n<TD BGCOLOR=\"$THEME->body\" WIDTH=35 VALIGN=TOP>";
313     } else {
314         echo "\n<TD ROWSPAN=2 BGCOLOR=\"$THEME->body\" WIDTH=35 VALIGN=TOP>";
315     }
316     print_user_picture($user->id, $assignment->course, $user->picture);
317     echo "</TD>";
318     echo "<TD NOWRAP BGCOLOR=\"$THEME->cellheading\">$user->firstname $user->lastname";
319     if ($submission->timemodified) {
320         echo "&nbsp;&nbsp;<FONT SIZE=1>".get_string("lastmodified").": ";
321         echo userdate($submission->timemodified);
322         echo assignment_print_difference($assignment->timedue - $submission->timemodified);
323         echo "</FONT>";
324     }
325     echo "</TR>";
327     if ($assignment->type != OFFLINE) {
328         echo "\n<TR><TD BGCOLOR=\"$THEME->cellcontent\">";
329         if ($submission->timemodified) {
330             assignment_print_user_files($assignment, $user);
331         } else {
332             print_string("notsubmittedyet", "assignment");
333         }
334         echo "</TD></TR>";
335     }
337     echo "\n<TR>";
338     echo "<TD WIDTH=35 VALIGN=TOP>";
339     if (!$submission->teacher) {
340         $submission->teacher = $USER->id;
341     }
342     print_user_picture($submission->teacher, $assignment->course, $teachers[$submission->teacher]->picture);
343     if ($submission->timemodified > $submission->timemarked) {
344         echo "<TD BGCOLOR=\"$THEME->cellheading2\">";
345     } else {
346         echo "<TD BGCOLOR=\"$THEME->cellheading\">";
347     }
348     echo get_string("feedback", "assignment").":";
349     choose_from_menu($grades, "g$submission->id", $submission->grade, get_string("grade")."...");
350     if ($submission->timemarked) {
351         echo "&nbsp;&nbsp;<FONT SIZE=1>".userdate($submission->timemarked)."</FONT>";
352     }
353     echo "<BR><TEXTAREA NAME=\"c$submission->id\" ROWS=6 COLS=60 WRAP=virtual>";
354     p($submission->comment);
355     echo "</TEXTAREA><BR>";
356     echo "</TD></TR>";
357    
358     echo "</TABLE><BR CLEAR=ALL>\n";
361 function assignment_print_feedback($course, $submission) {
362     global $CFG, $THEME, $RATING;
364     if (! $teacher = get_record("user", "id", $submission->teacher)) {
365         error("Weird assignment error");
366     }
368     echo "\n<TABLE BORDER=0 CELLPADDING=1 CELLSPACING=1 ALIGN=CENTER><TR><TD BGCOLOR=#888888>";
369     echo "\n<TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0 VALIGN=TOP>";
371     echo "\n<TR>";
372     echo "\n<TD ROWSPAN=3 BGCOLOR=\"$THEME->body\" WIDTH=35 VALIGN=TOP>";
373     print_user_picture($teacher->id, $course->id, $teacher->picture);
374     echo "</TD>";
375     echo "<TD NOWRAP WIDTH=100% BGCOLOR=\"$THEME->cellheading\">$teacher->firstname $teacher->lastname";
376     echo "&nbsp;&nbsp;<FONT SIZE=2><I>".userdate($submission->timemarked)."</I>";
377     echo "</TR>";
379     echo "\n<TR><TD WIDTH=100% BGCOLOR=\"$THEME->cellcontent\">";
381     echo "<P ALIGN=RIGHT><FONT SIZE=-1><I>";
382     if ($submission->grade) {
383         echo get_string("grade").": $submission->grade";
384     } else {
385         echo get_string("nograde");
386     }
387     echo "</I></FONT></P>";
389     echo text_to_html($submission->comment);
390     echo "</TD></TR></TABLE>";
391     echo "</TD></TR></TABLE>";
395 function assignment_print_user_files($assignment, $user) {
396 // Arguments are objects
398     global $CFG;
400     $filearea = assignment_file_area_name($assignment, $user);
402     if ($basedir = assignment_file_area($assignment, $user)) {
403         if ($files = get_directory_list($basedir)) {
404             foreach ($files as $file) {
405                 $icon = mimeinfo("icon", $file);
406                 if ($CFG->slasharguments) {
407                     $ffurl = "file.php/$filearea/$file";
408                 } else {
409                     $ffurl = "file.php?file=/$filearea/$file";
410                 }
412                 echo "<IMG SRC=\"$CFG->wwwroot/files/pix/$icon\" HEIGHT=16 WIDTH=16 BORDER=0 ALT=\"File\">";
413                 echo "&nbsp;<A TARGET=\"uploadedfile\" HREF=\"$CFG->wwwroot/$ffurl\">$file</A>";
414                 echo "<BR>";
415             }
416         }
417     }
420 function assignment_delete_user_files($assignment, $user, $exception) {
421 // Deletes all the user files in the assignment area for a user
422 // EXCEPT for any file named $exception
424     if ($basedir = assignment_file_area($assignment, $user)) {
425         if ($files = get_directory_list($basedir)) {
426             foreach ($files as $file) {
427                 if ($file != $exception) {
428                     unlink("$basedir/$file");
429                     notify("Existing file '$file' has been deleted!");
430                 }
431             }
432         }
433     }
436 function assignment_print_upload_form($assignment) {
437 // Arguments are objects
439     echo "<DIV ALIGN=CENTER>";
440     echo "<FORM ENCTYPE=\"multipart/form-data\" METHOD=\"POST\" ACTION=upload.php>";
441     echo " <INPUT TYPE=hidden NAME=MAX_FILE_SIZE value=\"$assignment->maxbytes\">";
442     echo " <INPUT TYPE=hidden NAME=id VALUE=\"$assignment->id\">";
443     echo " <INPUT NAME=\"newfile\" TYPE=\"file\" size=\"50\">";
444     echo " <INPUT TYPE=submit NAME=save VALUE=\"".get_string("uploadthisfile")."\">";
445     echo "</FORM>";
446     echo "</DIV>";
449 ?>