[ Index ]

PHP Cross Reference of Moodle 1.9.3 [Build 15-Oct-2008]

title

Body

[close]

/mod/workshop/ -> lib.php (source)

   1  <?php  // $Id: lib.php,v 1.98.2.3 2008/07/24 21:58:09 skodak Exp $
   2  
   3  // workshop constants and standard Moodle functions plus the workshop functions 
   4  // called by the standard functions
   5  
   6  // see also locallib.php for other non-standard workshop functions
   7  
   8  require_once($CFG->libdir.'/filelib.php');
   9  
  10  /*** Constants **********************************/
  11  
  12  
  13  $WORKSHOP_EWEIGHTS = array(  0 => -4.0, 1 => -2.0, 2 => -1.5, 3 => -1.0, 4 => -0.75, 5 => -0.5,  6 => -0.25, 
  14                               7 => 0.0, 8 => 0.25, 9 => 0.5, 10 => 0.75, 11=> 1.0, 12 => 1.5, 13=> 2.0, 
  15                               14 => 4.0); 
  16  
  17  $WORKSHOP_FWEIGHTS = array(  0 => 0, 1 => 0.1, 2 => 0.25, 3 => 0.5, 4 => 0.75, 5 => 1.0,  6 => 1.5, 
  18                               7 => 2.0, 8 => 3.0, 9 => 5.0, 10 => 7.5, 11=> 10.0, 12=>50.0); 
  19  
  20  
  21  $WORKSHOP_ASSESSMENT_COMPS = array (
  22                            0 => array('name' => get_string('verylax', 'workshop'), 'value' => 1),
  23                            1 => array('name' => get_string('lax', 'workshop'), 'value' => 0.6),
  24                            2 => array('name' => get_string('fair', 'workshop'), 'value' => 0.4),
  25                            3 => array('name' => get_string('strict', 'workshop'), 'value' => 0.33),
  26                            4 => array('name' => get_string('verystrict', 'workshop'), 'value' => 0.2) );
  27  
  28  
  29  /*** Moodle 1.7 compatibility functions *****
  30   *
  31   ********************************************/
  32  function workshop_context($workshop) {
  33      //TODO: add some $cm caching if needed
  34      if (is_object($workshop)) {
  35          $workshop = $workshop->id;
  36      }
  37      if (! $cm = get_coursemodule_from_instance('workshop', $workshop)) {
  38          error('Course Module ID was incorrect');
  39      }
  40  
  41      return get_context_instance(CONTEXT_MODULE, $cm->id);
  42  }
  43  
  44  function workshop_is_teacher($workshop, $userid=NULL) {
  45      return has_capability('mod/workshop:manage', workshop_context($workshop), $userid);
  46  }
  47   
  48  function workshop_is_teacheredit($workshop, $userid=NULL) {
  49      return has_capability('mod/workshop:manage', workshop_context($workshop), $userid)
  50         and has_capability('moodle/site:accessallgroups', workshop_context($workshop), $userid);
  51  }
  52  
  53  function workshop_is_student($workshop, $userid=NULL) {
  54      return has_capability('mod/workshop:participate', workshop_context($workshop), $userid);
  55  }
  56  
  57  function workshop_get_students($workshop, $sort='u.lastaccess', $fields='u.*') {
  58      return $users = get_users_by_capability(workshop_context($workshop), 'mod/workshop:participate', $fields, $sort);
  59  }
  60  
  61  function workshop_get_teachers($workshop, $sort='u.lastaccess', $fields='u.*') {
  62      return $users = get_users_by_capability(workshop_context($workshop), 'mod/workshop:manage', $fields, $sort);
  63  }
  64  
  65  
  66  /*** Standard Moodle functions ******************
  67  workshop_add_instance($workshop) 
  68  workshop_check_dates($workshop)
  69  workshop_cron () 
  70  workshop_delete_instance($id) 
  71  workshop_grades($workshopid) 
  72  workshop_print_recent_activity(&$logs, $isteacher=false) 
  73  workshop_refresh_events($workshop) 
  74  workshop_update_instance($workshop) 
  75  workshop_user_complete($course, $user, $mod, $workshop) 
  76  workshop_user_outline($course, $user, $mod, $workshop) 
  77  **********************************************/
  78  
  79  ///////////////////////////////////////////////////////////////////////////////
  80  function workshop_add_instance($workshop) {
  81  // Given an object containing all the necessary data, 
  82  // (defined by the form in mod.html) this function 
  83  // will create a new instance and return the id number 
  84  // of the new instance.
  85  
  86      $workshop->timemodified = time();
  87  
  88      $workshop->submissionstart = make_timestamp($workshop->submissionstartyear, 
  89              $workshop->submissionstartmonth, $workshop->submissionstartday, $workshop->submissionstarthour, 
  90              $workshop->submissionstartminute);
  91  
  92      $workshop->assessmentstart = make_timestamp($workshop->assessmentstartyear, 
  93              $workshop->assessmentstartmonth, $workshop->assessmentstartday, $workshop->assessmentstarthour, 
  94              $workshop->assessmentstartminute);
  95  
  96      $workshop->submissionend = make_timestamp($workshop->submissionendyear, 
  97              $workshop->submissionendmonth, $workshop->submissionendday, $workshop->submissionendhour, 
  98              $workshop->submissionendminute);
  99  
 100      $workshop->assessmentend = make_timestamp($workshop->assessmentendyear, 
 101              $workshop->assessmentendmonth, $workshop->assessmentendday, $workshop->assessmentendhour, 
 102              $workshop->assessmentendminute);
 103  
 104      $workshop->releasegrades = make_timestamp($workshop->releaseyear, 
 105              $workshop->releasemonth, $workshop->releaseday, $workshop->releasehour, 
 106              $workshop->releaseminute);
 107      
 108      if (!workshop_check_dates($workshop)) {
 109          return get_string('invaliddates', 'workshop');
 110      }
 111  
 112      if ($returnid = insert_record("workshop", $workshop)) {
 113  
 114          $event = NULL;
 115          $event->name        = get_string('submissionstartevent','workshop', $workshop->name);
 116          $event->description = $workshop->description;
 117          $event->courseid    = $workshop->course;
 118          $event->groupid     = 0;
 119          $event->userid      = 0;
 120          $event->modulename  = 'workshop';
 121          $event->instance    = $returnid;
 122          $event->eventtype   = 'submissionstart';
 123          $event->timestart   = $workshop->submissionstart;
 124          $event->timeduration = 0;
 125          add_event($event);
 126  
 127          $event->name        = get_string('submissionendevent','workshop', $workshop->name);
 128          $event->eventtype   = 'submissionend';
 129          $event->timestart   = $workshop->submissionend;
 130          add_event($event);
 131  
 132          $event->name        = get_string('assessmentstartevent','workshop', $workshop->name);
 133          $event->eventtype   = 'assessmentstart';
 134          $event->timestart   = $workshop->assessmentstart;
 135          add_event($event);
 136  
 137          $event->name        = get_string('assessmentendevent','workshop', $workshop->name);
 138          $event->eventtype   = 'assessmentend';
 139          $event->timestart   = $workshop->assessmentend;
 140          add_event($event);
 141      }
 142  
 143      return $returnid;
 144  }
 145  
 146  ///////////////////////////////////////////////////////////////////////////////
 147  // returns true if the dates are valid, false otherwise
 148  function workshop_check_dates($workshop) {
 149      // allow submission and assessment to start on the same date and to end on the same date
 150      // but enforce non-empty submission period and non-empty assessment period.
 151      return ($workshop->submissionstart < $workshop->submissionend and
 152              $workshop->submissionstart <= $workshop->assessmentstart and
 153              $workshop->assessmentstart < $workshop->assessmentend and
 154              $workshop->submissionend <= $workshop->assessmentend);
 155  }
 156  
 157  
 158  ///////////////////////////////////////////////////////////////////////////////
 159  function workshop_cron () {
 160  // Function to be run periodically according to the moodle cron
 161  
 162      global $CFG, $USER;
 163      
 164      // if there any ungraded assessments run the grading routine
 165      if ($workshops = get_records("workshop")) {
 166          foreach ($workshops as $workshop) {
 167              // automatically grade assessments if workshop has examples and/or peer assessments
 168              if ($workshop->gradingstrategy and ($workshop->ntassessments or $workshop->nsassessments)) {
 169                  workshop_grade_assessments($workshop);
 170              }
 171          }
 172      }
 173      $timenow = time();
 174      
 175      // Find all workshop notifications that have yet to be mailed out, and mails them
 176      $cutofftime = $timenow - $CFG->maxeditingtime;
 177  
 178      // look for new assessments
 179      if ($assessments = workshop_get_unmailed_assessments($cutofftime)) {
 180          foreach ($assessments as $assessment) {
 181  
 182              echo "Processing workshop assessment $assessment->id\n";
 183              
 184              // only process the entry once
 185              if (! set_field("workshop_assessments", "mailed", "1", "id", "$assessment->id")) {
 186                  echo "Could not update the mailed field for id $assessment->id\n";
 187              }
 188              
 189              if (! $submission = get_record("workshop_submissions", "id", "$assessment->submissionid")) {
 190                  echo "Could not find submission $assessment->submissionid\n";
 191                  continue;
 192              }
 193              if (! $workshop = get_record("workshop", "id", $submission->workshopid)) {
 194                  echo "Could not find workshop id $submission->workshopid\n";
 195                  continue;
 196              }
 197              if (! $course = get_record("course", "id", $workshop->course)) {
 198                  error("Could not find course id $workshop->course");
 199                  continue;
 200              }
 201              if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) {
 202                  error("Course Module ID was incorrect");
 203                  continue;
 204              }
 205              if (! $submissionowner = get_record("user", "id", "$submission->userid")) {
 206                  echo "Could not find user $submission->userid\n";
 207                  continue;
 208              }
 209              if (! $assessmentowner = get_record("user", "id", "$assessment->userid")) {
 210                  echo "Could not find user $assessment->userid\n";
 211                  continue;
 212              }
 213              if (! workshop_is_student($workshop, $submissionowner->id) and !workshop_is_teacher($workshop, 
 214                          $submissionowner->id)) {
 215                  continue;  // Not an active participant
 216              }
 217              if (! workshop_is_student($workshop, $assessmentowner->id) and !workshop_is_teacher($workshop, 
 218                          $assessmentowner->id)) {
 219                  continue;  // Not an active participant
 220              }
 221              // don't sent self assessment
 222              if ($submissionowner->id == $assessmentowner->id) {
 223                  continue;
 224              }
 225              $strworkshops = get_string("modulenameplural", "workshop");
 226              $strworkshop  = get_string("modulename", "workshop");
 227      
 228              // it's an assessment, tell the submission owner
 229              $USER->lang = $submissionowner->lang;
 230              $sendto = $submissionowner;
 231              // "Your assignment \"$submission->title\" has been assessed by"
 232              if (workshop_is_student($workshop, $assessmentowner->id)) {
 233                  $msg = get_string("mail1", "workshop", $submission->title)." a $course->student.\n";
 234              }
 235              else {
 236                  $msg = get_string("mail1", "workshop", $submission->title).
 237                      " ".fullname($assessmentowner)."\n";
 238              }
 239              // "The comments and grade can be seen in the workshop assignment '$workshop->name'
 240              // I have taken the following line out because the info is repeated below.
 241              // $msg .= get_string("mail2", "workshop", $workshop->name)."\n\n";
 242      
 243              $postsubject = "$course->shortname: $strworkshops: ".format_string($workshop->name,true);
 244              $posttext  = "$course->shortname -> $strworkshops -> ".format_string($workshop->name,true)."\n";
 245              $posttext .= "---------------------------------------------------------------------\n";
 246              $posttext .= $msg;
 247              // "The comments and grade can be seen in ..."
 248              $posttext .= get_string("mail2", "workshop", 
 249                  format_string($workshop->name,true).",   $CFG->wwwroot/mod/workshop/view.php?id=$cm->id")."\n";
 250              $posttext .= "---------------------------------------------------------------------\n";
 251              if ($sendto->mailformat == 1) {  // HTML
 252                  $posthtml = "<p><font face=\"sans-serif\">".
 253                      "<a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</a> ->".
 254                      "<a href=\"$CFG->wwwroot/mod/workshop/index.php?id=$course->id\">$strworkshops</a> ->".
 255                      "<a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a></font></p>";
 256                  $posthtml .= "<hr><font face=\"sans-serif\">";
 257                  $posthtml .= "<p>$msg</p>";
 258                  $posthtml .= "<p>".get_string("mail2", "workshop",
 259                      " <a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a>")."</p></font><hr>";
 260              } else {
 261                  $posthtml = "";
 262              }
 263      
 264              if (!$teacher = get_teacher($course->id)) {
 265                  echo "Error: can not find teacher for course $course->id!\n";
 266              }
 267                  
 268              if (! email_to_user($sendto, $teacher, $postsubject, $posttext, $posthtml)) {
 269                  echo "Error: workshop cron: Could not send out mail for id $submission->id to 
 270                      user $sendto->id ($sendto->email)\n";
 271              }
 272          }
 273      }
 274          
 275      // look for new assessments of resubmissions
 276      if ($assessments = workshop_get_unmailed_resubmissions($cutofftime)) {
 277          $timenow = time();
 278  
 279          foreach ($assessments as $assessment) {
 280  
 281              echo "Processing workshop assessment $assessment->id\n";
 282              
 283              // only process the entry once
 284              if (! set_field("workshop_assessments", "mailed", "1", "id", "$assessment->id")) {
 285                  echo "Could not update the mailed field for id $assessment->id\n";
 286              }
 287              
 288              if (! $submission = get_record("workshop_submissions", "id", "$assessment->submissionid")) {
 289                  echo "Could not find submission $assessment->submissionid\n";
 290                  continue;
 291              }
 292              if (! $workshop = get_record("workshop", "id", $submission->workshopid)) {
 293                  echo "Could not find workshop id $submission->workshopid\n";
 294                  continue;
 295              }
 296              if (! $course = get_record("course", "id", $workshop->course)) {
 297                  error("Could not find course id $workshop->course");
 298                  continue;
 299              }
 300              if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) {
 301                  error("Course Module ID was incorrect");
 302                  continue;
 303              }
 304              if (! $submissionowner = get_record("user", "id", "$submission->userid")) {
 305                  echo "Could not find user $submission->userid\n";
 306                  continue;
 307              }
 308              if (! $assessmentowner = get_record("user", "id", "$assessment->userid")) {
 309                  echo "Could not find user $assessment->userid\n";
 310                  continue;
 311              }
 312              if (! workshop_is_student($workshop, $submissionowner->id) and !workshop_is_teacher($workshop, 
 313                          $submissionowner->id)) {
 314                  continue;  // Not an active participant
 315              }
 316              if (! workshop_is_student($workshop, $assessmentowner->id) and !workshop_is_teacher($workshop, 
 317                          $assessmentowner->id)) {
 318                  continue;  // Not an active participant
 319              }
 320      
 321              $strworkshops = get_string("modulenameplural", "workshop");
 322              $strworkshop  = get_string("modulename", "workshop");
 323      
 324              // it's a resubission assessment, tell the assessment owner to (re)assess
 325              $USER->lang = $assessmentowner->lang;
 326              $sendto = $assessmentowner;
 327              // "The assignment \"$submission->title\" is a revised piece of work. "
 328              $msg = get_string("mail8", "workshop", $submission->title)."\n";
 329              // "Please assess it in the workshop assignment '$workshop->name'
 330              // $msg .= get_string("mail9", "workshop", $workshop->name)."\n\n";
 331      
 332              $postsubject = "$course->shortname: $strworkshops: ".format_string($workshop->name,true);
 333              $posttext  = "$course->shortname -> $strworkshops -> ".format_string($workshop->name,true)."\n";
 334              $posttext .= "---------------------------------------------------------------------\n";
 335              $posttext .= $msg;
 336              // "Please assess it in ..."
 337              $posttext .= get_string("mail9", "workshop", 
 338                             format_string($workshop->name,true).", $CFG->wwwroot/mod/workshop/view.php?id=$cm->id")."\n";
 339              $posttext .= "---------------------------------------------------------------------\n";
 340              if ($sendto->mailformat == 1) {  // HTML
 341                  $posthtml = "<p><font face=\"sans-serif\">".
 342                    "<a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</a> ->".
 343                    "<a href=\"$CFG->wwwroot/mod/workshop/index.php?id=$course->id\">$strworkshops</a> ->".
 344                    "<a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a></font></p>";
 345                  $posthtml .= "<hr><font face=\"sans-serif\">";
 346                  $posthtml .= "<p>$msg</p>";
 347                  $posthtml .= "<p>".get_string("mail9", "workshop",
 348                    " <a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a>").'</p></font><hr>';
 349              } 
 350              else {
 351                $posthtml = "";
 352              }
 353      
 354              if (!$teacher = get_teacher($course->id)) {
 355                  echo "Error: can not find teacher for course $course->id!\n";
 356              }
 357                  
 358              if (! email_to_user($sendto, $teacher, $postsubject, $posttext, $posthtml)) {
 359                  echo "Error: workshop cron: Could not send out mail for id $submission->id to 
 360                      user $sendto->id ($sendto->email)\n";
 361              }
 362          }
 363      }
 364      
 365      // look for new comments
 366      if ($comments = workshop_get_unmailed_comments($cutofftime)) {
 367          $timenow = time();
 368  
 369          foreach ($comments as $comment) {
 370  
 371              echo "Processing workshop comment $comment->id\n";
 372              
 373              // only process the entry once
 374              if (! set_field("workshop_comments", "mailed", "1", "id", "$comment->id")) {
 375                  echo "Could not update the mailed field for comment id $comment->id\n";
 376              }
 377              
 378              if (! $assessment = get_record("workshop_assessments", "id", "$comment->assessmentid")) {
 379                  echo "Could not find assessment $comment->assessmentid\n";
 380                  continue;
 381              }
 382              if (! $submission = get_record("workshop_submissions", "id", "$assessment->submissionid")) {
 383                  echo "Could not find submission $assessment->submissionid\n";
 384                  continue;
 385              }
 386              if (! $workshop = get_record("workshop", "id", $submission->workshopid)) {
 387                  echo "Could not find workshop id $submission->workshopid\n";
 388                  continue;
 389              }
 390              if (! $course = get_record("course", "id", $workshop->course)) {
 391                  error("Could not find course id $workshop->course");
 392                  continue;
 393              }
 394              if (! $cm = get_coursemodule_from_instance("workshop", $workshop->id, $course->id)) {
 395                  error("Course Module ID was incorrect");
 396                  continue;
 397              }
 398              if (! $submissionowner = get_record("user", "id", "$submission->userid")) {
 399                  echo "Could not find user $submission->userid\n";
 400                  continue;
 401              }
 402              if (! $assessmentowner = get_record("user", "id", "$assessment->userid")) {
 403                  echo "Could not find user $assessment->userid\n";
 404                  continue;
 405              }
 406              if (! workshop_is_student($workshop, $submissionowner->id) and !workshop_is_teacher($workshop, 
 407                          $submissionowner->id)) {
 408                  continue;  // Not an active participant
 409              }
 410              if (! workshop_is_student($workshop, $assessmentowner->id) and !workshop_is_teacher($workshop, 
 411                          $assessmentowner->id)) {
 412                  continue;  // Not an active participant
 413              }
 414      
 415              $strworkshops = get_string("modulenameplural", "workshop");
 416              $strworkshop  = get_string("modulename", "workshop");
 417      
 418              // see if the submission owner needs to be told
 419              if ($comment->userid != $submission->userid) {
 420                  $USER->lang = $submissionowner->lang;
 421                  $sendto = $submissionowner;
 422                  // "A comment has been added to the assignment \"$submission->title\" by
 423                  if (workshop_is_student($workshop, $assessmentowner->id)) {
 424                      $msg = get_string("mail4", "workshop", $submission->title)." a $course->student.\n";
 425                  }
 426                  else {
 427                      $msg = get_string("mail4", "workshop", $submission->title)." ".fullname($assessmentowner)."\n";
 428                  }
 429                  // "The new comment can be seen in the workshop assignment '$workshop->name'
 430                  // $msg .= get_string("mail5", "workshop", $workshop->name)."\n\n";
 431      
 432                  $postsubject = "$course->shortname: $strworkshops: ".format_string($workshop->name,true);
 433                  $posttext  = "$course->shortname -> $strworkshops -> ".format_string($workshop->name,true)."\n";
 434                  $posttext .= "---------------------------------------------------------------------\n";
 435                  $posttext .= $msg;
 436                  // "The new comment can be seen in ..."
 437                  $posttext .= get_string("mail5", "workshop",
 438                      format_string($workshop->name,true).",   $CFG->wwwroot/mod/workshop/view.php?id=$cm->id")."\n";
 439                  $posttext .= "---------------------------------------------------------------------\n";
 440                  if ($sendto->mailformat == 1) {  // HTML
 441                      $posthtml = "<p><font face=\"sans-serif\">".
 442                      "<a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</a> ->".
 443                      "<a href=\"$CFG->wwwroot/mod/workshop/index.php?id=$course->id\">$strworkshops</a> ->".
 444                      "<a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a></font></p>";
 445                      $posthtml .= "<hr><font face=\"sans-serif\">";
 446                      $posthtml .= "<p>$msg</p>";
 447                      $posthtml .= "<p>".get_string("mail5", "workshop",
 448                          " <a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a>")
 449                          ."</p></font><hr>";
 450                  } 
 451                  else {
 452                      $posthtml = "";
 453                  }
 454      
 455                  if (!$teacher = get_teacher($course->id)) {
 456                      echo "Error: can not find teacher for course $course->id!\n";
 457                  }
 458                      
 459                  if (! email_to_user($sendto, $teacher, $postsubject, $posttext, $posthtml)) {
 460                      echo "Error: workshop cron: Could not send out mail for id $submission->id to user 
 461                          $sendto->id ($sendto->email)\n";
 462                  }
 463              }
 464              // see if the assessor needs to to told
 465              if ($comment->userid != $assessment->userid) {
 466                  $USER->lang = $assessmentowner->lang;
 467                  $sendto = $assessmentowner;
 468                  // "A comment has been added to the assignment \"$submission->title\" by
 469                  if (workshop_is_student($workshop, $submissionowner->id)) {
 470                      $msg = get_string("mail4", "workshop", $submission->title)." a $course->student.\n";
 471                  }
 472                  else {
 473                      $msg = get_string("mail4", "workshop", $submission->title).
 474                          " ".fullname($submissionowner)."\n";
 475                  }
 476                  // "The new comment can be seen in the workshop assignment '$workshop->name'
 477                  // $msg .= get_string("mail5", "workshop", $workshop->name)."\n\n";
 478      
 479                  $postsubject = "$course->shortname: $strworkshops: ".format_string($workshop->name,true);
 480                  $posttext  = "$course->shortname -> $strworkshops -> ".format_string($workshop->name,true)."\n";
 481                  $posttext .= "---------------------------------------------------------------------\n";
 482                  $posttext .= $msg;
 483                  // "The new comment can be seen in ..."
 484                  $posttext .= get_string("mail5", "workshop",
 485                      format_string($workshop->name,true).",  $CFG->wwwroot/mod/workshop/view.php?id=$cm->id")."\n";
 486                  $posttext .= "---------------------------------------------------------------------\n";
 487                  if ($sendto->mailformat == 1) {  // HTML
 488                      $posthtml = "<p><font face=\"sans-serif\">".
 489                      "<a href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</a> ->".
 490                      "<a href=\"$CFG->wwwroot/mod/workshop/index.php?id=$course->id\">$strworkshops</a> ->".
 491                      "<a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a></font></p>";
 492                      $posthtml .= "<hr><font face=\"sans-serif\">";
 493                      $posthtml .= "<p>$msg</p>";
 494                      $posthtml .= "<p>".get_string("mail5", "workshop",
 495                          " <a href=\"$CFG->wwwroot/mod/workshop/view.php?id=$cm->id\">".format_string($workshop->name,true)."</a>")
 496                          ."</p></font><hr>";
 497                  } 
 498                  else {
 499                      $posthtml = "";
 500                  }
 501      
 502                  if (!$teacher = get_teacher($course->id)) {
 503                      echo "Error: can not find teacher for course $course->id!\n";
 504                  }
 505                      
 506                  if (! email_to_user($sendto, $teacher, $postsubject, $posttext, $posthtml)) {
 507                      echo "Error: workshop cron: Could not send out mail for id $submission->id to user 
 508                          $sendto->id ($sendto->email)\n";
 509                  }
 510                  if (! set_field("workshop_comments", "mailed", "1", "id", "$comment->id")) {
 511                      echo "Could not update the mailed field for comment id $comment->id\n";
 512                  }
 513              }
 514          }
 515      }
 516      return true;
 517  }
 518  
 519  
 520  ///////////////////////////////////////////////////////////////////////////////
 521  function workshop_delete_instance($id) {
 522  // Given an ID of an instance of this module, 
 523  // this function will permanently delete the instance 
 524  // and any data that depends on it.  
 525  
 526      if (! $workshop = get_record("workshop", "id", "$id")) {
 527          return false;
 528      }
 529      
 530      // delete all the associated records in the workshop tables, start positive...
 531      $result = true;
 532  
 533      if (! delete_records("workshop_comments", "workshopid", "$workshop->id")) {
 534          $result = false;
 535      }
 536  
 537      if (! delete_records("workshop_stockcomments", "workshopid", "$workshop->id")) {
 538          $result = false;
 539      }
 540  
 541      if (! delete_records("workshop_grades", "workshopid", "$workshop->id")) {
 542          $result = false;
 543      }
 544  
 545      if (! delete_records("workshop_elements", "workshopid", "$workshop->id")) {
 546          $result = false;
 547      }
 548  
 549      if (! delete_records("workshop_assessments", "workshopid", "$workshop->id")) {
 550          $result = false;
 551      }
 552  
 553      if (! delete_records("workshop_submissions", "workshopid", "$workshop->id")) {
 554          $result = false;
 555      }
 556  
 557      if (! delete_records("workshop", "id", "$workshop->id")) {
 558          $result = false;
 559      }
 560  
 561      if (! delete_records('event', 'modulename', 'workshop', 'instance', $workshop->id)) {
 562          $result = false;    
 563      }   
 564  
 565      return $result;
 566  }
 567  
 568  
 569  ///////////////////////////////////////////////////////////////////////////////
 570  function workshop_grades($workshopid) {
 571  /// Must return an array of grades, indexed by user, and a max grade.
 572  /// only returns grades once assessment has started
 573  /// returns nothing if workshop is not graded
 574      global $CFG;
 575  
 576      $return = null;
 577      if ($workshop = get_record("workshop", "id", $workshopid)) {
 578          if (($workshop->assessmentstart < time()) and $workshop->gradingstrategy) {
 579              if ($students = workshop_get_students($workshop)) {
 580                  foreach ($students as $student) {
 581                      if ($workshop->wtype) {
 582                          $gradinggrade = workshop_gradinggrade($workshop, $student);
 583                      } else { // ignore grading grades for simple assignments
 584                          $gradinggrade = 0;
 585                      }
 586                      $bestgrade = 0;
 587                      if ($submissions = workshop_get_user_submissions($workshop, $student)) {
 588                          foreach ($submissions as $submission) {
 589                              if (!$submission->late) {
 590                                  $grade = workshop_submission_grade($workshop, $submission);
 591                              } else {
 592                                  $grade = 0.01;
 593                              }
 594                              if ($grade > $bestgrade) {
 595                                  $bestgrade = $grade;
 596                              }
 597                          }
 598                      }
 599                      $return->grades[$student->id] = $gradinggrade + $bestgrade;
 600                  }
 601              }
 602          }
 603          // set maximum grade if graded
 604          if ($workshop->gradingstrategy) {
 605              if ($workshop->wtype) {
 606                  $return->maxgrade = $workshop->grade + $workshop->gradinggrade;
 607              } else { // ignore grading grades for simple assignemnts
 608                  $return->maxgrade = $workshop->grade;
 609              }
 610          }
 611      }
 612      return $return;
 613  }
 614  
 615  //////////////////////////////////////////////////////////////////////////////////////
 616  function workshop_is_recent_activity($course, $isteacher, $timestart) {//jlw1 added for adding mark to courses with activity in My Moodle
 617      global $CFG;
 618  
 619      // have a look for agreed assessments for this user (agree) 
 620      $agreecontent = false;
 621      if (!$isteacher) { // teachers only need to see submissions
 622          if ($logs = workshop_get_agree_logs($course, $timestart)) {
 623              // got some, see if any belong to a visible module
 624              foreach ($logs as $log) {
 625                  // Create a temp valid module structure (only need courseid, moduleid)
 626                  $tempmod->course = $course->id;
 627                  $tempmod->id = $log->workshopid;
 628                  //Obtain the visible property from the instance
 629                  if (instance_is_visible("workshop",$tempmod)) {
 630                      $agreecontent = true;
 631                      break;
 632                  }
 633              }
 634          }
 635      }
 636      return false;
 637  }
 638  
 639  
 640  ///////////////////////////////////////////////////////////////////////////////
 641  //
 642  // NOTE: $isteacher usage should be converted to use roles.
 643  // TODO: Fix this function.
 644  //
 645  function workshop_print_recent_activity($course, $viewfullanmes, $timestart) {
 646      global $CFG;
 647  
 648      $isteacher = has_capability('mod/workshop:manage', get_context_instance(CONTEXT_COURSE, $course->id));
 649  
 650      $modinfo = get_fast_modinfo($course);
 651  
 652      // have a look for agreed assessments for this user (agree) 
 653      $agreecontent = false;
 654      if (!$isteacher) { // teachers only need to see submissions
 655          if ($logs = workshop_get_agree_logs($course, $timestart)) {
 656              $agreecontent = true;
 657              print_headline(get_string("workshopagreedassessments", "workshop").":");
 658              foreach ($logs as $log) {
 659                  if (!workshop_is_teacher($workshop, $log->userid)) {  // don't break anonymous rule
 660                      $log->firstname = $course->student;
 661                      $log->lastname = '';
 662                  }
 663                  print_recent_activity_note($log->time, $log, $log->name,
 664                                             $CFG->wwwroot.'/mod/workshop/'.$log->url);
 665              }
 666          }
 667      }
 668  
 669      // have a look for new assessments for this user (assess) 
 670      $assesscontent = false;
 671      if (!$isteacher) { // teachers only need to see submissions
 672          if ($logs = workshop_get_assess_logs($course, $timestart)) {
 673              // got some, see if any belong to a visible module
 674              foreach ($logs as $id=>$log) {
 675                  $cm = $modinfo->instances['workshop'][$log->workshopid];
 676                  if (!$cm->uservisible) {
 677                      unset($logs[$id]);
 678                      continue;
 679                  }
 680              }
 681              // if we got some "live" ones then output them
 682              if ($logs) {
 683                  $assesscontent = true;
 684                  print_headline(get_string("workshopassessments", "workshop").":");
 685                  foreach ($logs as $log) {
 686                      if (!workshop_is_teacher($tempmod->id, $log->userid)) {  // don't break anonymous rule
 687                          $log->firstname = $course->student;    // Keep anonymous
 688                          $log->lastname = '';
 689                      }
 690                      print_recent_activity_note($log->time, $log, $log->name,
 691                                                 $CFG->wwwroot.'/mod/workshop/'.$log->url);
 692                  }
 693              }
 694          }
 695      }
 696      // have a look for new comments for this user (comment) 
 697      $commentcontent = false;
 698      if (!$isteacher) { // teachers only need to see submissions
 699          if ($logs = workshop_get_comment_logs($course, $timestart)) {
 700              // got some, see if any belong to a visible module
 701              foreach ($logs as $id=>$log) {
 702                  $cm = $modinfo->instances['workshop'][$log->workshopid];
 703                  if (!$cm->uservisible) {
 704                      unset($logs[$id]);
 705                      continue;
 706                  }
 707              }
 708              // if we got some "live" ones then output them
 709              if ($logs) {
 710                  $commentcontent = true;
 711                  print_headline(get_string("workshopcomments", "workshop").":");
 712                  foreach ($logs as $log) {
 713                      $log->firstname = $course->student;    // Keep anonymous
 714                      $log->lastname = '';
 715                      print_recent_activity_note($log->time, $log, $log->name,
 716                                                 $CFG->wwwroot.'/mod/workshop/'.$log->url);
 717                  }
 718              }
 719          }
 720      }
 721  
 722      // have a look for new assessment gradings for this user (grade)
 723      $gradecontent = false;
 724      if ($logs = workshop_get_grade_logs($course, $timestart)) {
 725          // got some, see if any belong to a visible module
 726          foreach ($logs as $id=>$log) {
 727              $cm = $modinfo->instances['workshop'][$log->workshopid];
 728              if (!$cm->uservisible) {
 729                  unset($logs[$id]);
 730                  continue;
 731              }
 732          }
 733          // if we got some "live" ones then output them
 734          if ($logs) {
 735              $gradecontent = true;
 736              print_headline(get_string("workshopfeedback", "workshop").":");
 737              foreach ($logs as $log) {
 738                  $log->firstname = $course->teacher;    // Keep anonymous
 739                  $log->lastname = '';
 740                  print_recent_activity_note($log->time, $log, $log->name,
 741                                             $CFG->wwwroot.'/mod/workshop/'.$log->url);
 742              }
 743          }
 744      }
 745  
 746      // have a look for new submissions (only show to teachers) (submit)
 747      $submitcontent = false;
 748      if ($isteacher) {
 749          if ($logs = workshop_get_submit_logs($course, $timestart)) {
 750              // got some, see if any belong to a visible module
 751              foreach ($logs as $id=>$log) {
 752                  $cm = $modinfo->instances['workshop'][$log->workshopid];
 753                  if (!$cm->uservisible) {
 754                      unset($logs[$id]);
 755                      continue;
 756                  }
 757              }
 758              // if we got some "live" ones then output them
 759              if ($logs) {
 760                  $submitcontent = true;
 761                  print_headline(get_string("workshopsubmissions", "workshop").":");
 762                  foreach ($logs as $log) {
 763                      print_recent_activity_note($log->time, $log, $log->name,
 764                                                 $CFG->wwwroot.'/mod/workshop/'.$log->url);
 765                  }
 766              }
 767          }
 768      }
 769  
 770      return $agreecontent or $assesscontent or $commentcontent or $gradecontent or $submitcontent;
 771  }
 772  
 773  
 774  ///////////////////////////////////////////////////////////////////////////////
 775  function workshop_refresh_events($courseid = 0) {
 776  // This standard function will check all instances of this module
 777  // and make sure there are up-to-date events created for each of them.
 778  // If courseid = 0, then every workshop event in the site is checked, else
 779  // only workshop events belonging to the course specified are checked.
 780  // This function is used, in its new format, by restore_refresh_events()
 781  
 782      if ($courseid == 0) {
 783          if (! $workshops = get_records("workshop")) {
 784              return true;        
 785          }   
 786      } else {
 787          if (! $workshops = get_records("workshop", "course", $courseid)) {
 788              return true;
 789          }
 790      }
 791      $moduleid = get_field('modules', 'id', 'name', 'workshop');
 792      
 793      foreach ($workshops as $workshop) {
 794      
 795          $dates = array(
 796              'submissionstart' => $workshop->submissionstart,
 797              'submissionend' => $workshop->submissionend,
 798              'assessmentstart' => $workshop->assessmentstart,
 799              'assessmentend' => $workshop->assessmentend
 800          );
 801          
 802          foreach ($dates as $type => $date) {
 803          
 804              if ($date) {
 805                  if ($event = get_record('event', 'modulename', 'workshop', 'instance', $workshop->id, 'eventtype', $type)) {
 806                      $event->name        = addslashes(get_string($type.'event','workshop', $workshop->name));
 807                      $event->description = addslashes($workshop->description);
 808                      $event->eventtype   = $type;
 809                      $event->timestart   = $date;
 810                      update_event($event);
 811                  } else {
 812                      $event->courseid    = $workshop->course;
 813                      $event->modulename  = 'workshop';
 814                      $event->instance    = $workshop->id; 
 815                      $event->name        = addslashes(get_string($type.'event','workshop', $workshop->name));
 816                      $event->description = addslashes($workshop->description);
 817                      $event->eventtype   = $type;
 818                      $event->timestart   = $date;
 819                      $event->timeduration = 0;
 820                      $event->visible     = get_field('course_modules', 'visible', 'module', $moduleid, 'instance', $workshop->id); 
 821                      add_event($event);
 822                  }
 823              }
 824          }
 825      }
 826      return true;
 827  }   
 828  
 829  
 830  ///////////////////////////////////////////////////////////////////////////////
 831  function workshop_update_instance($workshop) {
 832  // Given an object containing all the necessary data, 
 833  // (defined by the form in mod.html) this function 
 834  // will update an existing instance with new data.
 835      global $CFG;
 836  
 837      $workshop->timemodified = time();
 838  
 839      $workshop->submissionstart = make_timestamp($workshop->submissionstartyear, 
 840              $workshop->submissionstartmonth, $workshop->submissionstartday, $workshop->submissionstarthour, 
 841              $workshop->submissionstartminute);
 842  
 843      $workshop->assessmentstart = make_timestamp($workshop->assessmentstartyear, 
 844              $workshop->assessmentstartmonth, $workshop->assessmentstartday, $workshop->assessmentstarthour, 
 845              $workshop->assessmentstartminute);
 846  
 847      $workshop->submissionend = make_timestamp($workshop->submissionendyear, 
 848              $workshop->submissionendmonth, $workshop->submissionendday, $workshop->submissionendhour, 
 849              $workshop->submissionendminute);
 850  
 851      $workshop->assessmentend = make_timestamp($workshop->assessmentendyear, 
 852              $workshop->assessmentendmonth, $workshop->assessmentendday, $workshop->assessmentendhour, 
 853              $workshop->assessmentendminute);
 854  
 855      $workshop->releasegrades = make_timestamp($workshop->releaseyear, 
 856              $workshop->releasemonth, $workshop->releaseday, $workshop->releasehour, 
 857              $workshop->releaseminute);
 858              
 859      if (!workshop_check_dates($workshop)) {
 860          return get_string('invaliddates', 'workshop');
 861      }
 862  
 863      // set the workshop's type
 864      $wtype = 0; // 3 phases, no grading grades
 865      if ($workshop->includeself or $workshop->ntassessments) $wtype = 1; // 3 phases with grading grades
 866      if ($workshop->nsassessments) $wtype = 2; // 5 phases with grading grades 
 867      $workshop->wtype = $wtype;
 868      
 869      // encode password if necessary
 870      if (!empty($workshop->password)) {
 871          $workshop->password = md5($workshop->password);
 872      } else {
 873          unset($workshop->password);
 874      }
 875  
 876      $workshop->id = $workshop->instance;
 877  
 878      if ($returnid = update_record("workshop", $workshop)) {
 879  
 880          $dates = array(
 881              'submissionstart' => $workshop->submissionstart,
 882              'submissionend' => $workshop->submissionend,
 883              'assessmentstart' => $workshop->assessmentstart,
 884              'assessmentend' => $workshop->assessmentend
 885          );
 886          $moduleid = get_field('modules', 'id', 'name', 'workshop');
 887          
 888          foreach ($dates as $type => $date) {
 889              if ($event = get_record('event', 'modulename', 'workshop', 'instance', $workshop->id, 'eventtype', $type)) {
 890                  $event->name        = get_string($type.'event','workshop', $workshop->name);
 891                  $event->description = $workshop->description;
 892                  $event->eventtype   = $type;
 893                  $event->timestart   = $date;
 894                  update_event($event);
 895              } else if ($date) {
 896                  $event = NULL;
 897                  $event->name        = get_string($type.'event','workshop', $workshop->name);
 898                  $event->description = $workshop->description;
 899                  $event->courseid    = $workshop->course;
 900                  $event->groupid     = 0;
 901                  $event->userid      = 0;
 902                  $event->modulename  = 'workshop';
 903                  $event->instance    = $workshop->instance;
 904                  $event->eventtype   = $type;
 905                  $event->timestart   = $date;
 906                  $event->timeduration = 0;
 907                  $event->visible     = get_field('course_modules', 'visible', 'module', $moduleid, 'instance', $workshop->id); 
 908                  add_event($event);
 909              }
 910          }
 911      }
 912  
 913      if (time() > $workshop->assessmentstart) {
 914          // regrade all the submissions...
 915          set_field("workshop_submissions", "nassessments", 0, "workshopid", $workshop->id);
 916          workshop_grade_assessments($workshop);
 917      }
 918  
 919      return $returnid;
 920  }
 921  
 922  ///////////////////////////////////////////////////////////////////////////////
 923  function workshop_user_complete($course, $user, $mod, $workshop) {
 924      if ($submission = workshop_get_student_submission($workshop, $user)) {
 925          if ($basedir = workshop_file_area($workshop, $user)) {
 926              if ($files = get_directory_list($basedir)) {
 927                  $countfiles = count($files).' '.get_string('submissions', 'workshop');
 928                  foreach ($files as $file) {
 929                      $countfiles .= "; $file";
 930                  }
 931              }
 932          }
 933  
 934          print_simple_box_start();
 935  
 936          echo $submission->description.'<br />';
 937  
 938          if (!empty($countfiles)) {
 939              echo $countfiles,'<br />';
 940          }
 941          
 942          workshop_print_feedback($course, $submission);
 943  
 944          print_simple_box_end();
 945  
 946      } else {
 947          print_string('notsubmittedyet', 'workshop');
 948      }
 949  }
 950  
 951  //////////////////////////////////////////////////////////////////////////////////////
 952  function workshop_print_feedback($course, $submission) {
 953      global $CFG, $RATING;
 954  
 955      if (! $feedbacks = get_records('workshop_assessments', 'submissionid', $submission->id)) {
 956          return;
 957      }
 958  
 959      $strgrade = get_string('grade');
 960      $strnograde = get_string('nograde');
 961  
 962      foreach ($feedbacks as $feedback) {
 963          if (! $user = get_record('user', 'id', $feedback->userid)) {
 964              /// Weird error but we'll just ignore it and continue with other feedback
 965              continue;
 966          }
 967  
 968          echo '<table cellspacing="0" class="workshop_feedbackbox">';
 969  
 970          echo '<tr>';
 971          echo '<td class="picture left">';
 972          print_user_picture($user->id, $course->id, $user->picture);
 973          echo '</td>';
 974          echo '<td><span class="author">'.fullname($user).'</span>';
 975          echo '<span class="time">'.userdate($feedback->timegraded).'</span>';
 976          echo '</tr>';
 977  
 978          echo '<tr><td class="left side">&nbsp;</td>';
 979          echo '<td class="content">';
 980  
 981          if ($feedback->grade) {
 982              echo $strgrade.': '.$feedback->grade;
 983          } else {
 984              echo $strnograde;
 985          }
 986  
 987          echo '<span class="comment">'.format_text($feedback->generalcomment).'</span>';
 988          echo '<span class="teachercomment">'.format_text($feedback->teachercomment).'</span>';
 989          echo '</td></tr></table>';
 990  
 991      }
 992  }
 993  
 994  
 995  
 996  
 997  ///////////////////////////////////////////////////////////////////////////////
 998  function workshop_user_outline($course, $user, $mod, $workshop) {
 999      if ($submissions = workshop_get_user_submissions($workshop, $user)) {
1000          $result->info = count($submissions)." ".get_string("submissions", "workshop");
1001          // workshop_get_user_submissions returns the newest one first
1002          foreach ($submissions as $submission) {
1003              $result->time = $submission->timecreated;
1004              break;
1005              }
1006          return $result;
1007      }
1008      return NULL;
1009  }
1010  
1011  //////////////////////////////////////////////////////////////////////////////////////
1012  function workshop_get_participants($workshopid) {      
1013  //Returns the users with data in one workshop
1014  //(users with records in workshop_submissions, workshop_assessments and workshop_comments, students)
1015  
1016      global $CFG;
1017  
1018      //Get students from workshop_submissions
1019      $st_submissions = get_records_sql("SELECT DISTINCT u.id, u.id
1020                                         FROM {$CFG->prefix}user u,
1021                                              {$CFG->prefix}workshop_submissions s
1022                                         WHERE s.workshopid = '$workshopid' and
1023                                               u.id = s.userid");
1024      //Get students from workshop_assessments
1025      $st_assessments = get_records_sql("SELECT DISTINCT u.id, u.id
1026                                   FROM {$CFG->prefix}user u,
1027                                        {$CFG->prefix}workshop_assessments a
1028                                   WHERE a.workshopid = '$workshopid' and
1029                                         u.id = a.userid");
1030  
1031      //Get students from workshop_comments
1032      $st_comments = get_records_sql("SELECT DISTINCT u.id, u.id
1033                                     FROM {$CFG->prefix}user u,
1034                                          {$CFG->prefix}workshop_comments c
1035                                     WHERE c.workshopid = '$workshopid' and
1036                                           u.id = c.userid");
1037  
1038      //Add st_assessments to st_submissions
1039      if ($st_assessments) {
1040          foreach ($st_assessments as $st_assessment) {
1041              $st_submissions[$st_assessment->id] = $st_assessment;
1042          }
1043      }
1044      //Add st_comments to st_submissions
1045      if ($st_comments) {
1046          foreach ($st_comments as $st_comment) {
1047              $st_submissions[$st_comment->id] = $st_comment;
1048          }
1049      }
1050      //Return st_submissions array (it contains an array of unique users)
1051      return ($st_submissions);
1052  }
1053  
1054  //////////////////////////////////////////////////////////////////////////////////////
1055  function workshop_get_recent_mod_activity(&$activities, &$index, $sincetime, $courseid, 
1056                                             $workshop="0", $user="", $groupid="") {
1057      // Returns all workshop posts since a given time.  If workshop is specified then
1058      // this restricts the results
1059  
1060      global $CFG;
1061  
1062      if ($workshop) {
1063          $workshopselect = " AND cm.id = '$workshop'";
1064      } else {
1065          $workshopselect = "";
1066      }
1067  
1068      if ($user) {
1069          $userselect = " AND u.id = '$user'";
1070      } else {
1071          $userselect = "";
1072      }
1073  
1074      $posts = get_records_sql("SELECT s.*, u.firstname, u.lastname,
1075              u.picture, cm.instance, w.name, cm.section, cm.groupmode,
1076              cm.course, cm.groupingid, cm.groupmembersonly
1077              FROM {$CFG->prefix}workshop_submissions s,
1078              {$CFG->prefix}user u,
1079              {$CFG->prefix}course_modules cm,
1080              {$CFG->prefix}workshop w
1081              WHERE s.timecreated  > '$sincetime' $workshopselect
1082              AND s.userid = u.id $userselect
1083              AND w.course = '$courseid' 
1084              AND cm.instance = w.id
1085              AND cm.course = w.course
1086              AND s.workshopid = w.id
1087              ORDER BY s.id");
1088  
1089  
1090      if (empty($posts)) {
1091          return;
1092      }
1093  
1094      foreach ($posts as $post) {
1095          if ((empty($groupid) || groups_is_member($groupid, $post->userid)) && groups_course_module_visible($post)) {
1096  
1097              $tmpactivity = new Object;
1098  
1099              $tmpactivity->type = "workshop";
1100              $tmpactivity->defaultindex = $index;
1101              $tmpactivity->instance = $post->instance;
1102              $tmpactivity->name = $post->name;
1103              $tmpactivity->section = $post->section;
1104  
1105              $tmpactivity->content->id = $post->id;
1106              $tmpactivity->content->title = $post->title;
1107  
1108              $tmpactivity->user->userid = $post->userid;
1109              $tmpactivity->user->fullname = fullname($post);
1110              $tmpactivity->user->picture = $post->picture;
1111  
1112              $tmpactivity->timestamp = $post->timecreated;
1113              $activities[] = $tmpactivity;
1114  
1115              $index++;
1116          }
1117      }
1118  
1119      return;
1120  }
1121  
1122  //////////////////////////////////////////////////////////////////////////////////////
1123  function workshop_print_recent_mod_activity($activity, $course, $detail=false) {
1124  
1125      global $CFG;
1126  
1127      echo '<table border="0" cellpadding="3" cellspacing="0">';
1128  
1129      if (!empty($activity->content->parent)) {
1130          $openformat = "<font size=\"2\"><i>";
1131          $closeformat = "</i></font>";
1132      } else {
1133          $openformat = "<b>";
1134          $closeformat = "</b>";
1135      }
1136  
1137      echo "<tr><td class=\"workshoppostpicture\" width=\"35\" valign=\"top\">";
1138      print_user_picture($activity->user->userid, $course, $activity->user->picture);
1139      echo "</td><td>$openformat";
1140  
1141      if ($detail) {
1142          echo "<img src=\"$CFG->modpixpath/$activity->type/icon.gif\" ".
1143              "class=\"icon\" alt=\"".strip_tags(format_string($activity->name,true))."\" />  ";
1144      }
1145      echo "<a href=\"$CFG->wwwroot/mod/workshop/view.php?" 
1146          . "#" . $activity->content->id . "\">".$activity->content->title;
1147  
1148      echo "</a>$closeformat";
1149  
1150      echo "<br /><font size=\"2\">";
1151      echo "<a href=\"$CFG->wwwroot/user/view.php?id=" . $activity->user->userid . "&amp;course=" . "$course\">"
1152          . $activity->user->fullname . "</a>";
1153      echo " - " . userdate($activity->timestamp) . "</font></td></tr>";
1154      echo "</table>";
1155  
1156      return;
1157  
1158  }
1159  
1160  
1161  //////////////////////////////////////////////////////////////////////////////////////
1162  // Non-standard workshop functions
1163  ///////////////////////////////////////////////////////////////////////////////////////////////
1164  function workshop_compare_assessments($workshop, $assessment1, $assessment2) {
1165      global $WORKSHOP_ASSESSMENT_COMPS, $WORKSHOP_EWEIGHTS;
1166      // first get the assignment elements for maxscores...
1167      $elementsraw = get_records("workshop_elements", "workshopid", $workshop->id, "elementno ASC");
1168      foreach ($elementsraw as $element) {
1169          $maxscore[] = $element->maxscore;   // to renumber index 0,1,2...
1170          $weight[] = $WORKSHOP_EWEIGHTS[$element->weight];   // get real value and renumber index 0,1,2...
1171      }
1172  
1173      $grades = array();
1174      for ($i = 0; $i < 2; $i++) {
1175          if ($i) {
1176              $rawgrades = get_records("workshop_grades", "assessmentid", $assessment1->id, "elementno ASC");
1177          } else {
1178              $rawgrades = get_records("workshop_grades", "assessmentid", $assessment2->id, "elementno ASC");
1179          }
1180          if ($rawgrades) {
1181              foreach ($rawgrades as $grade) {
1182                  $grades[$i][] = $grade->grade;
1183              }
1184          }
1185      }
1186      $sumdiffs = 0;
1187      $sumweights = 0;
1188      switch ($workshop->gradingstrategy) {
1189          case 1 : // accumulative grading and...
1190          case 4 : // ...rubic grading
1191              for ($i=0; $i < $workshop->nelements; $i++) {
1192                  $diff = ($grades[0][$i] - $grades[1][$i]) * $weight[$i] / $maxscore[$i];
1193                  $sumdiffs += $diff * $diff; // use squared distances
1194                  $sumweights += $weight[$i];
1195                  }
1196              break;
1197          case 2 :  // error banded grading
1198              // ignore maxscores here, the grades are either 0 or 1,
1199              for ($i=0; $i < $workshop->nelements; $i++) {
1200                  $diff = ($grades[0][$i] - $grades[1][$i]) * $weight[$i];
1201                  $sumdiffs += $diff * $diff; // use squared distances
1202                  $sumweights += $weight[$i];
1203                  }
1204              break;
1205          case 3 : // criterion grading
1206              // here we only need to look at the difference between the "zero" grade elements
1207              $diff = ($grades[0][0] - $grades[1][0]) / (count($elementsraw) - 1);
1208              $sumdiffs = $diff * $diff;
1209              $sumweights = 1;
1210              break;
1211      }            
1212      // convert to a sensible grade (always out of 100)
1213      $COMP = (object)$WORKSHOP_ASSESSMENT_COMPS[$workshop->assessmentcomps];
1214      $factor = $COMP->value;
1215      $gradinggrade = (($factor - ($sumdiffs / $sumweights)) / $factor) * 100;
1216      if ($gradinggrade < 0) {
1217          $gradinggrade = 0;
1218      }
1219      return $gradinggrade;
1220  }
1221  
1222  
1223  //////////////////////////////////////////////////////////////////////////////////////
1224  function workshop_count_assessments($submission) {
1225      // Return the (real) assessments for this submission, 
1226      $timenow = time();
1227     return count_records_select("workshop_assessments", 
1228             "submissionid = $submission->id AND timecreated < $timenow");
1229  }
1230  
1231  
1232  //////////////////////////////////////////////////////////////////////////////////////
1233  function workshop_count_ungraded_assessments($workshop) {
1234      // function returns the number of ungraded assessments by students
1235      global $CFG;
1236      
1237      $timenow = time();
1238      $n = 0;
1239      // get all the cold assessments that have not been graded
1240      if ($assessments = get_records_select("workshop_assessments", "workshopid = $workshop->id AND 
1241              (timecreated + $CFG->maxeditingtime) < $timenow AND timegraded = 0")) {
1242          foreach ($assessments as $assessment) {
1243              if (workshop_is_student($workshop, $assessment->userid)) {
1244                  $n++;
1245              }
1246          }
1247      }
1248      return $n;
1249  }
1250  
1251  
1252  //////////////////////////////////////////////////////////////////////////////////////
1253  function workshop_file_area($workshop, $submission) {
1254      return make_upload_directory( workshop_file_area_name($workshop, $submission) );
1255  }
1256  
1257  
1258  //////////////////////////////////////////////////////////////////////////////////////
1259  function workshop_file_area_name($workshop, $submission) {
1260  //  Creates a directory file name, suitable for make_upload_directory()
1261      global $CFG;
1262  
1263      return "$workshop->course/$CFG->moddata/workshop/$submission->id";
1264  }
1265  
1266  
1267  ///////////////////////////////////////////////////////////////////////////////////////////////
1268  function workshop_get_agree_logs($course, $timestart) {
1269      // get the "agree" entries for this user (the assessment owner) and add the first and last names 
1270      // the last two probably wont be used...
1271      global $CFG, $USER;
1272      if (empty($USER->id)) {
1273          return false;
1274      }
1275      
1276      $timethen = time() - $CFG->maxeditingtime;
1277      return get_records_sql("SELECT l.time, l.url, u.firstname, u.lastname, a.workshopid, a.userid, e.name
1278                               FROM {$CFG->prefix}log l,
1279                                  {$CFG->prefix}workshop e, 
1280                                  {$CFG->prefix}workshop_submissions s, 
1281                                  {$CFG->prefix}workshop_assessments a, 
1282                                  {$CFG->prefix}user u
1283                              WHERE l.time > $timestart AND l.time < $timethen 
1284                                  AND l.course = $course->id AND l.module = 'workshop' AND l.action = 'agree'
1285                                  AND a.id = l.info AND s.id = a.submissionid AND a.userid = $USER->id
1286                                  AND u.id = s.userid AND e.id = a.workshopid");
1287  }
1288  
1289  
1290  ///////////////////////////////////////////////////////////////////////////////////////////////
1291  function workshop_get_assess_logs($course, $timestart) {
1292      // get the "assess" entries for this user and add the first and last names...
1293      global $CFG, $USER;
1294      if (empty($USER->id)) {
1295          return false;
1296      }
1297      
1298      $timethen = time() - $CFG->maxeditingtime;
1299      return get_records_sql("SELECT l.time, l.url, u.firstname, u.lastname, a.workshopid, a.userid, e.name
1300                               FROM {$CFG->prefix}log l,
1301                                  {$CFG->prefix}workshop e, 
1302                                  {$CFG->prefix}workshop_submissions s, 
1303                                  {$CFG->prefix}workshop_assessments a, 
1304                                  {$CFG->prefix}user u
1305                              WHERE l.time > $timestart AND l.time < $timethen 
1306                                  AND l.course = $course->id AND l.module = 'workshop' AND l.action = 'assess'
1307                                  AND a.id = l.info AND s.id = a.submissionid AND s.userid = $USER->id
1308                                  AND u.id = a.userid AND e.id = a.workshopid");
1309  }
1310  
1311  
1312  //////////////////////////////////////////////////////////////////////////////////////
1313  function workshop_get_assessments($submission, $all = '', $order = '') {
1314      // Return assessments for this submission ordered oldest first, newest last
1315      // new assessments made within the editing time are NOT returned unless they
1316      // belong to the user or the second argument is set to ALL
1317      global $CFG, $USER;
1318  
1319      $timenow = time();
1320      if (!$order) {
1321          $order = "timecreated DESC";
1322      }
1323      if ($all != 'ALL') {
1324          return get_records_select("workshop_assessments", "(submissionid = $submission->id) AND 
1325              ((timecreated < $timenow - $CFG->maxeditingtime) or 
1326                  ((timecreated < $timenow) AND (userid = $USER->id)))", $order);
1327      } else {
1328          return get_records_select("workshop_assessments", "submissionid = $submission->id AND 
1329              (timecreated < $timenow)", $order);
1330      }
1331  }
1332  
1333  
1334  ///////////////////////////////////////////////////////////////////////////////////////////////
1335  function workshop_get_comment_logs($course, $timestart) {
1336      // get the "comment" entries for this user and add the first and last names (which may not be used)...
1337      global $CFG, $USER;
1338      if (empty($USER->id)) {
1339          return false;
1340      }
1341      
1342      $timethen = time() - $CFG->maxeditingtime;
1343      return get_records_sql("SELECT l.time, l.url, u.firstname, u.lastname, a.workshopid, e.name
1344                               FROM {$CFG->prefix}log l,
1345                                  {$CFG->prefix}workshop e, 
1346                                  {$CFG->prefix}workshop_submissions s, 
1347                                  {$CFG->prefix}workshop_assessments a, 
1348                                  {$CFG->prefix}workshop_comments c, 
1349                                  {$CFG->prefix}user u
1350                              WHERE l.time > $timestart AND l.time < $timethen 
1351                                  AND l.course = $course->id AND l.module = 'workshop' AND l.action = 'comment'
1352                                  AND c.id = l.info AND c.userid != $USER->id AND a.id = c.assessmentid
1353                                  AND s.id = a.submissionid AND (s.userid = $USER->id OR a.userid = $USER->id)
1354                                  AND u.id = a.userid AND e.id = a.workshopid");
1355  }
1356  
1357  
1358  ///////////////////////////////////////////////////////////////////////////////////////////////
1359  function workshop_get_grade_logs($course, $timestart) {
1360      // get the "grade" entries for this user and add the first and last names (of submission owner, 
1361      // better to get name of teacher...
1362      // ...but not available in assessment record...)
1363      global $CFG, $USER;
1364      if (empty($USER->id)) {
1365          return false;
1366      }
1367      
1368      $timethen = time() - $CFG->maxeditingtime;
1369      return get_records_sql("SELECT l.time, l.url, u.firstname, u.lastname, a.workshopid, e.name
1370                               FROM {$CFG->prefix}log l,
1371                                  {$CFG->prefix}workshop e, 
1372                                  {$CFG->prefix}workshop_submissions s, 
1373                                  {$CFG->prefix}workshop_assessments a, 
1374                                  {$CFG->prefix}user u
1375                              WHERE l.time > $timestart AND l.time < $timethen 
1376                                  AND l.course = $course->id AND l.module = 'workshop'    AND l.action = 'grade'
1377                                  AND a.id = l.info AND s.id = a.submissionid AND a.userid = $USER->id
1378                                  AND u.id = s.userid AND e.id = a.workshopid");
1379  }
1380  
1381  
1382  //////////////////////////////////////////////////////////////////////////////////////
1383  function workshop_get_student_submission($workshop, $user) {
1384  // Return a submission for a particular user
1385      global $CFG;
1386  
1387      $submission = get_record("workshop_submissions", "workshopid", $workshop->id, "userid", $user->id);
1388      if (!empty($submission->timecreated)) {
1389          return $submission;
1390      }
1391      return NULL;
1392  }
1393  
1394  
1395  //////////////////////////////////////////////////////////////////////////////////////
1396  function workshop_get_student_submissions($workshop, $order = "title") {
1397  // Return all  ENROLLED student submissions
1398      global $CFG;
1399      
1400      if ($order == "title") {
1401          $order = "s.title";
1402          }
1403      if ($order == "name") {
1404          $order = "a.lastname, a.firstname";
1405          }
1406      if ($order == "time") {
1407          $order = "s.timecreated ASC";
1408      }
1409  
1410      if (!$students = workshop_get_students($workshop)) {
1411          return false;
1412      }
1413      $list = "(";
1414      foreach ($students as $student) {
1415          $list .= "$student->id,";
1416      }
1417      $list = rtrim($list, ',').")";
1418  
1419      return get_records_sql("SELECT s.* FROM {$CFG->prefix}workshop_submissions s, {$CFG->prefix}user a 
1420                              WHERE s.userid IN $list
1421                                AND s.workshopid = $workshop->id
1422                                AND s.timecreated > 0
1423                                AND s.userid = a.id
1424                              ORDER BY $order");
1425  }
1426  
1427  
1428  ///////////////////////////////////////////////////////////////////////////////////////////////
1429  function workshop_get_submit_logs($course, $timestart) {
1430      // get the "submit" entries and add the first and last names...
1431      global $CFG, $USER;
1432      
1433      $timethen = time() - $CFG->maxeditingtime;
1434      return get_records_sql("SELECT l.time, l.url, u.firstname, u.lastname, l.info as workshopid, e.name
1435                               FROM {$CFG->prefix}log l,
1436                                  {$CFG->prefix}workshop e, 
1437                                  {$CFG->prefix}user u
1438                              WHERE l.time > $timestart AND l.time < $timethen 
1439                                  AND l.course = $course->id AND l.module = 'workshop'
1440                                  AND l.action = 'submit'
1441                                  AND e.id = l.info 
1442                                  AND u.id = l.userid");
1443  }
1444  
1445  
1446  //////////////////////////////////////////////////////////////////////////////////////
1447  function workshop_get_unmailed_assessments($cutofftime) {
1448      /// Return list of assessments that have not been mailed out
1449      global $CFG;
1450      return get_records_sql("SELECT a.*, g.course, g.name
1451                                FROM {$CFG->prefix}workshop_assessments a, {$CFG->prefix}workshop g
1452                               WHERE a.mailed = 0 
1453                                 AND a.timecreated < $cutofftime 
1454                                 AND g.id = a.workshopid
1455                                 AND g.releasegrades < $cutofftime");
1456  }
1457  
1458  
1459  //////////////////////////////////////////////////////////////////////////////////////
1460  function workshop_get_unmailed_comments($cutofftime) {
1461      /// Return list of comments that have not been mailed out
1462      global $CFG;
1463      return get_records_sql("SELECT c.*, g.course, g.name
1464                                FROM {$CFG->prefix}workshop_comments c, {$CFG->prefix}workshop g
1465                               WHERE c.mailed = 0 
1466                                 AND c.timecreated < $cutofftime 
1467                                 AND g.id = c.workshopid");
1468  }
1469  
1470  
1471  //////////////////////////////////////////////////////////////////////////////////////
1472  function workshop_get_unmailed_graded_assessments($cutofftime) {
1473      /// Return list of graded assessments that have not been mailed out
1474      global $CFG;
1475      return get_records_sql("SELECT a.*, g.course, g.name
1476                                FROM {$CFG->prefix}workshop_assessments a, {$CFG->prefix}workshop g
1477                               WHERE a.mailed = 0 
1478                                 AND a.timegraded < $cutofftime 
1479                                 AND a.timegraded > 0
1480                                 AND g.id = a.workshopid");
1481  }
1482  
1483  
1484  //////////////////////////////////////////////////////////////////////////////////////
1485  function workshop_get_unmailed_resubmissions($cutofftime) {
1486      /// Return list of assessments of resubmissions that have not been mailed out
1487      global $CFG;
1488      return get_records_sql("SELECT a.*, w.course, w.name
1489                                FROM {$CFG->prefix}workshop_assessments a, {$CFG->prefix}workshop w
1490                               WHERE a.mailed = 0 
1491                                 AND a.resubmission = 1
1492                                 AND w.id = a.workshopid");
1493  }
1494  
1495  
1496  //////////////////////////////////////////////////////////////////////////////////////
1497  function workshop_get_user_assessments($workshop, $user) {
1498  // Return all the  user's assessments, newest first, oldest last (hot, warm and cold ones)
1499      return get_records_select("workshop_assessments", "workshopid = $workshop->id AND userid = $user->id", 
1500                  "timecreated DESC");
1501  }
1502  
1503  
1504  //////////////////////////////////////////////////////////////////////////////////////
1505  function workshop_get_user_submissions($workshop, $user) {
1506      // return real submissions of user newest first, oldest last. Ignores the dummy submissions
1507      // which get created to hold the final grades for users that make no submissions
1508      return get_records_select("workshop_submissions", "workshopid = $workshop->id AND 
1509          userid = $user->id AND timecreated > 0", "timecreated DESC" );
1510  }
1511  
1512  
1513  //////////////////////////////////////////////////////////////////////////////////////
1514  function workshop_grade_assessments($workshop, $verbose=false) {
1515      global $WORKSHOP_EWEIGHTS;
1516      
1517      // timeout after 10 minutes
1518      @set_time_limit(600);
1519  
1520      $timenow = time();
1521      
1522      // set minumim value for the variance (of the elements)
1523      $minvar = 0.05;
1524  
1525      // check when the standard deviations were calculated
1526      $oldtotalassessments = get_field("workshop_elements", "totalassessments", "workshopid", $workshop->id, 
1527                  "elementno", 0);
1528      $totalassessments = count_records("workshop_assessments", "workshopid", $workshop->id);
1529      // calculate the std. devs every 10 assessments for low numbers of assessments, thereafter every 100 new assessments
1530      if ((($totalassessments < 100) and (($totalassessments - $oldtotalassessments) > 10)) or 
1531              (($totalassessments - $oldtotalassessments) > 100)) {
1532          // calculate the means for each submission using just the "good" assessments 
1533          if ($submissions = get_records("workshop_submissions", "workshopid", $workshop->id)) {
1534              foreach ($submissions as $submission) {
1535                  $nassessments[$submission->id] = 0;
1536                  if ($assessments = workshop_get_assessments($submission)) {
1537                      foreach ($assessments as $assessment) {
1538                          // test if assessment is "good", a teacher assessment always "good", but may be weighted out 
1539                          if (workshop_is_teacher($workshop, $assessment->userid)) {
1540                              if (!$workshop->teacherweight) {
1541                                  // drop teacher's assessment as weight is zero
1542                                  continue;
1543                              }
1544                          } elseif ((!$assessment->gradinggrade and $assessment->timegraded) or 
1545                                  ($workshop->agreeassessments and !$assessment->timeagreed)) {
1546                              // it's a duff assessment, or it's not been agreed
1547                              continue;
1548                          }
1549                          if (isset($num[$submission->id])) {
1550                              if (workshop_is_teacher($workshop, $assessment->userid)) {
1551                                  $num[$submission->id] += $workshop->teacherweight; // weight teacher's assessment
1552                              } else {
1553                                  $num[$submission->id]++; // number of assessments
1554                              }
1555                              $nassessments[$submission->id]++;
1556                          } else {
1557                              if (workshop_is_teacher($workshop, $assessment->userid)) {
1558                                  $num[$submission->id] = $workshop->teacherweight;
1559                              } else {
1560                                  $num[$submission->id] = 1;
1561                              }
1562                              $nassessments[$submission->id] = 1;
1563                          }
1564                          for ($i = 0; $i < $workshop->nelements; $i++) {
1565                              $grade =  get_field("workshop_grades", "grade",
1566                                      "assessmentid", $assessment->id, "elementno", $i);
1567                              if (isset($sum[$submission->id][$i])) {
1568                                  if (workshop_is_teacher($workshop, $assessment->userid)) {
1569                                      $sum[$submission->id][$i] += $workshop->teacherweight * $grade; // teacher's grade
1570                                  } else {
1571                                      $sum[$submission->id][$i] += $grade; // student's grade
1572                                  }
1573                              } else { 
1574                                  if (workshop_is_teacher($workshop, $assessment->userid)) {
1575                                      $sum[$submission->id][$i] = $workshop->teacherweight * $grade; // teacher's grade
1576                                  } else {
1577                                      $sum[$submission->id][$i] = $grade; // students's grade
1578                                  }
1579                              }
1580                          }
1581                      }
1582                  }
1583              }
1584  
1585              if (!isset($num)) { 
1586                  // no assessments yet
1587                  return;
1588              }
1589              reset($num);
1590              // calculate the means for each submission
1591              $total = 0;
1592              foreach ($num as $submissionid => $n) {
1593                  if ($n) { // stop division by zero
1594                      for ($i = 0; $i < $workshop->nelements; $i++) {
1595                          $mean[$submissionid][$i] = $sum[$submissionid][$i] / $n;
1596                          // echo "Submission: $submissionid; Element: $i; Mean: {$mean[$submissionid][$i]}<br />\n";
1597                      }
1598                      $total += $n; // weighted total
1599                  }
1600              }
1601              if ($verbose) {
1602                  echo "<p style=\"text-align:center\">".get_string("numberofsubmissions", "workshop", count($num))."<br />\n";
1603                  echo get_string("numberofassessmentsweighted", "workshop", $total)."</p>\n";
1604              }
1605  
1606              // now get an estimate of the standard deviation of each element in the assessment
1607              // this is just a rough measure, all assessments are included and teacher's assesments are not weighted
1608              $n = 0;
1609              for ($i = 0; $i < $workshop->nelements; $i++) {
1610                  $var[$i] = 0;
1611              }
1612              foreach ($submissions as $submission) {
1613                  if ($assessments = workshop_get_assessments($submission)) {
1614                      foreach ($assessments as