Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.

Differences Between: [Versions 310 and 311] [Versions 311 and 400] [Versions 311 and 401] [Versions 311 and 402] [Versions 311 and 403] [Versions 39 and 311]

   1  <?php
   2  
   3  // This file is part of Moodle - http://moodle.org/
   4  //
   5  // Moodle is free software: you can redistribute it and/or modify
   6  // it under the terms of the GNU General Public License as published by
   7  // the Free Software Foundation, either version 3 of the License, or
   8  // (at your option) any later version.
   9  //
  10  // Moodle is distributed in the hope that it will be useful,
  11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  // GNU General Public License for more details.
  14  //
  15  // You should have received a copy of the GNU General Public License
  16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  17  
  18  /**
  19   * Prints a particular instance of workshop
  20   *
  21   * You can have a rather longer description of the file as well,
  22   * if you like, and it can span multiple lines.
  23   *
  24   * @package    mod_workshop
  25   * @copyright  2009 David Mudrak <david.mudrak@gmail.com>
  26   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  27   */
  28  
  29  require(__DIR__.'/../../config.php');
  30  require_once (__DIR__.'/locallib.php');
  31  
  32  $id         = optional_param('id', 0, PARAM_INT); // course_module ID, or
  33  $w          = optional_param('w', 0, PARAM_INT);  // workshop instance ID
  34  $editmode   = optional_param('editmode', null, PARAM_BOOL);
  35  $page       = optional_param('page', 0, PARAM_INT);
  36  $perpage    = optional_param('perpage', null, PARAM_INT);
  37  $sortby     = optional_param('sortby', 'lastname', PARAM_ALPHA);
  38  $sorthow    = optional_param('sorthow', 'ASC', PARAM_ALPHA);
  39  $eval       = optional_param('eval', null, PARAM_PLUGIN);
  40  
  41  if ($id) {
  42      $cm             = get_coursemodule_from_id('workshop', $id, 0, false, MUST_EXIST);
  43      $course         = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
  44      $workshoprecord = $DB->get_record('workshop', array('id' => $cm->instance), '*', MUST_EXIST);
  45  } else {
  46      $workshoprecord = $DB->get_record('workshop', array('id' => $w), '*', MUST_EXIST);
  47      $course         = $DB->get_record('course', array('id' => $workshoprecord->course), '*', MUST_EXIST);
  48      $cm             = get_coursemodule_from_instance('workshop', $workshoprecord->id, $course->id, false, MUST_EXIST);
  49  }
  50  
  51  require_login($course, true, $cm);
  52  require_capability('mod/workshop:view', $PAGE->context);
  53  
  54  $workshop = new workshop($workshoprecord, $cm, $course);
  55  
  56  $PAGE->set_url($workshop->view_url());
  57  
  58  // Mark viewed.
  59  $workshop->set_module_viewed();
  60  
  61  // If the phase is to be switched, do it asap. This just has to happen after triggering
  62  // the event so that the scheduled allocator had a chance to allocate submissions.
  63  if ($workshop->phase == workshop::PHASE_SUBMISSION and $workshop->phaseswitchassessment
  64          and $workshop->submissionend > 0 and $workshop->submissionend < time()) {
  65      $workshop->switch_phase(workshop::PHASE_ASSESSMENT);
  66      // Disable the automatic switching now so that it is not executed again by accident
  67      // if the teacher changes the phase back to the submission one.
  68      $DB->set_field('workshop', 'phaseswitchassessment', 0, array('id' => $workshop->id));
  69      $workshop->phaseswitchassessment = 0;
  70  }
  71  
  72  if (!is_null($editmode) && $PAGE->user_allowed_editing()) {
  73      $USER->editing = $editmode;
  74  }
  75  
  76  $userplan = new workshop_user_plan($workshop, $USER->id);
  77  
  78  foreach ($userplan->phases as $phase) {
  79      if ($phase->active) {
  80          $currentphasetitle = $phase->title;
  81      }
  82  }
  83  
  84  $PAGE->set_title($workshop->name . " (" . $currentphasetitle . ")");
  85  $PAGE->set_heading($course->fullname);
  86  
  87  if ($perpage and $perpage > 0 and $perpage <= 1000) {
  88      require_sesskey();
  89      set_user_preference('workshop_perpage', $perpage);
  90      redirect($PAGE->url);
  91  }
  92  
  93  if ($eval) {
  94      require_sesskey();
  95      require_capability('mod/workshop:overridegrades', $workshop->context);
  96      $workshop->set_grading_evaluation_method($eval);
  97      redirect($PAGE->url);
  98  }
  99  
 100  $output = $PAGE->get_renderer('mod_workshop');
 101  
 102  /// Output starts here
 103  
 104  echo $output->header();
 105  echo $output->heading_with_help(format_string($workshop->name), 'userplan', 'workshop');
 106  
 107  // Display any activity information (eg completion requirements / dates).
 108  $cminfo = cm_info::create($cm);
 109  $completiondetails = \core_completion\cm_completion_details::get_instance($cminfo, $USER->id);
 110  $activitydates = \core\activity_dates::get_dates_for_module($cminfo, $USER->id);
 111  echo $output->activity_information($cminfo, $completiondetails, $activitydates);
 112  
 113  echo $output->heading(format_string($currentphasetitle), 3, null, 'mod_workshop-userplanheading');
 114  echo $output->render($userplan);
 115  
 116  switch ($workshop->phase) {
 117  case workshop::PHASE_SETUP:
 118      if (trim($workshop->intro)) {
 119          print_collapsible_region_start('', 'workshop-viewlet-intro', get_string('introduction', 'workshop'),
 120                  'workshop-viewlet-intro-collapsed');
 121          echo $output->box(format_module_intro('workshop', $workshop, $workshop->cm->id), 'generalbox');
 122          print_collapsible_region_end();
 123      }
 124      if ($workshop->useexamples and has_capability('mod/workshop:manageexamples', $PAGE->context)) {
 125          print_collapsible_region_start('', 'workshop-viewlet-allexamples', get_string('examplesubmissions', 'workshop'),
 126                  'workshop-viewlet-allexamples-collapsed');
 127          echo $output->box_start('generalbox examples');
 128          if ($workshop->grading_strategy_instance()->form_ready()) {
 129              if (! $examples = $workshop->get_examples_for_manager()) {
 130                  echo $output->container(get_string('noexamples', 'workshop'), 'noexamples');
 131              }
 132              foreach ($examples as $example) {
 133                  $summary = $workshop->prepare_example_summary($example);
 134                  $summary->editable = true;
 135                  echo $output->render($summary);
 136              }
 137              $aurl = new moodle_url($workshop->exsubmission_url(0), array('edit' => 'on'));
 138              echo $output->single_button($aurl, get_string('exampleadd', 'workshop'), 'get');
 139          } else {
 140              echo $output->container(get_string('noexamplesformready', 'workshop'));
 141          }
 142          echo $output->box_end();
 143          print_collapsible_region_end();
 144      }
 145      break;
 146  case workshop::PHASE_SUBMISSION:
 147      if (trim($workshop->instructauthors)) {
 148          $instructions = file_rewrite_pluginfile_urls($workshop->instructauthors, 'pluginfile.php', $PAGE->context->id,
 149              'mod_workshop', 'instructauthors', null, workshop::instruction_editors_options($PAGE->context));
 150          print_collapsible_region_start('', 'workshop-viewlet-instructauthors', get_string('instructauthors', 'workshop'),
 151                  'workshop-viewlet-instructauthors-collapsed');
 152          echo $output->box(format_text($instructions, $workshop->instructauthorsformat, array('overflowdiv'=>true)), array('generalbox', 'instructions'));
 153          print_collapsible_region_end();
 154      }
 155  
 156      // does the user have to assess examples before submitting their own work?
 157      $examplesmust = ($workshop->useexamples and $workshop->examplesmode == workshop::EXAMPLES_BEFORE_SUBMISSION);
 158  
 159      // is the assessment of example submissions considered finished?
 160      $examplesdone = has_capability('mod/workshop:manageexamples', $workshop->context);
 161      if ($workshop->assessing_examples_allowed()
 162              and has_capability('mod/workshop:submit', $workshop->context)
 163                      and ! has_capability('mod/workshop:manageexamples', $workshop->context)) {
 164          $examples = $userplan->get_examples();
 165          $total = count($examples);
 166          $left = 0;
 167          // make sure the current user has all examples allocated
 168          foreach ($examples as $exampleid => $example) {
 169              if (is_null($example->assessmentid)) {
 170                  $examples[$exampleid]->assessmentid = $workshop->add_allocation($example, $USER->id, 0);
 171              }
 172              if (is_null($example->grade)) {
 173                  $left++;
 174              }
 175          }
 176          if ($left > 0 and $workshop->examplesmode != workshop::EXAMPLES_VOLUNTARY) {
 177              $examplesdone = false;
 178          } else {
 179              $examplesdone = true;
 180          }
 181          print_collapsible_region_start('', 'workshop-viewlet-examples', get_string('exampleassessments', 'workshop'),
 182                  'workshop-viewlet-examples-collapsed', $examplesdone);
 183          echo $output->box_start('generalbox exampleassessments');
 184          if ($total == 0) {
 185              echo $output->heading(get_string('noexamples', 'workshop'), 3);
 186          } else {
 187              foreach ($examples as $example) {
 188                  $summary = $workshop->prepare_example_summary($example);
 189                  echo $output->render($summary);
 190              }
 191          }
 192          echo $output->box_end();
 193          print_collapsible_region_end();
 194      }
 195  
 196      if (has_capability('mod/workshop:submit', $PAGE->context) and (!$examplesmust or $examplesdone)) {
 197          print_collapsible_region_start('', 'workshop-viewlet-ownsubmission', get_string('yoursubmission', 'workshop'),
 198                  'workshop-viewlet-ownsubmission-collapsed');
 199          echo $output->box_start('generalbox ownsubmission');
 200          if ($submission = $workshop->get_submission_by_author($USER->id)) {
 201              echo $output->render($workshop->prepare_submission_summary($submission, true));
 202              if ($workshop->modifying_submission_allowed($USER->id)) {
 203                  $btnurl = new moodle_url($workshop->submission_url(), array('edit' => 'on'));
 204                  $btntxt = get_string('editsubmission', 'workshop');
 205              }
 206          } else {
 207              echo $output->container(get_string('noyoursubmission', 'workshop'));
 208              if ($workshop->creating_submission_allowed($USER->id)) {
 209                  $btnurl = new moodle_url($workshop->submission_url(), array('edit' => 'on'));
 210                  $btntxt = get_string('createsubmission', 'workshop');
 211              }
 212          }
 213          if (!empty($btnurl)) {
 214              echo $output->single_button($btnurl, $btntxt, 'get');
 215          }
 216          echo $output->box_end();
 217          print_collapsible_region_end();
 218      }
 219  
 220      if (has_capability('mod/workshop:viewallsubmissions', $PAGE->context)) {
 221          $groupmode = groups_get_activity_groupmode($workshop->cm);
 222          $groupid = groups_get_activity_group($workshop->cm, true);
 223  
 224          if ($groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $workshop->context)) {
 225              $allowedgroups = groups_get_activity_allowed_groups($workshop->cm);
 226              if (empty($allowedgroups)) {
 227                  echo $output->container(get_string('groupnoallowed', 'mod_workshop'), 'groupwidget error');
 228                  break;
 229              }
 230              if (! in_array($groupid, array_keys($allowedgroups))) {
 231                  echo $output->container(get_string('groupnotamember', 'core_group'), 'groupwidget error');
 232                  break;
 233              }
 234          }
 235  
 236          print_collapsible_region_start('', 'workshop-viewlet-allsubmissions', get_string('submissionsreport', 'workshop'),
 237                  'workshop-viewlet-allsubmissions-collapsed');
 238  
 239          $perpage = get_user_preferences('workshop_perpage', 10);
 240          $data = $workshop->prepare_grading_report_data($USER->id, $groupid, $page, $perpage, $sortby, $sorthow);
 241          if ($data) {
 242              $countparticipants = $workshop->count_participants();
 243              $countsubmissions = $workshop->count_submissions(array_keys($data->grades), $groupid);
 244              $a = new stdClass();
 245              $a->submitted = $countsubmissions;
 246              $a->notsubmitted = $data->totalcount - $countsubmissions;
 247  
 248              echo html_writer::tag('div', get_string('submittednotsubmitted', 'workshop', $a));
 249  
 250              echo $output->container(groups_print_activity_menu($workshop->cm, $PAGE->url, true), 'groupwidget');
 251  
 252              // Prepare the paging bar.
 253              $baseurl = new moodle_url($PAGE->url, array('sortby' => $sortby, 'sorthow' => $sorthow));
 254              $pagingbar = new paging_bar($data->totalcount, $page, $perpage, $baseurl, 'page');
 255  
 256              // Populate the display options for the submissions report.
 257              $reportopts                     = new stdclass();
 258              $reportopts->showauthornames     = has_capability('mod/workshop:viewauthornames', $workshop->context);
 259              $reportopts->showreviewernames   = has_capability('mod/workshop:viewreviewernames', $workshop->context);
 260              $reportopts->sortby              = $sortby;
 261              $reportopts->sorthow             = $sorthow;
 262              $reportopts->showsubmissiongrade = false;
 263              $reportopts->showgradinggrade    = false;
 264              $reportopts->workshopphase       = $workshop->phase;
 265  
 266              echo $output->render($pagingbar);
 267              echo $output->render(new workshop_grading_report($data, $reportopts));
 268              echo $output->render($pagingbar);
 269              echo $output->perpage_selector($perpage);
 270          } else {
 271              echo html_writer::tag('div', get_string('nothingfound', 'workshop'), array('class' => 'nothingfound'));
 272          }
 273          print_collapsible_region_end();
 274      }
 275      break;
 276  
 277  case workshop::PHASE_ASSESSMENT:
 278  
 279      $ownsubmissionexists = null;
 280      if (has_capability('mod/workshop:submit', $PAGE->context)) {
 281          if ($ownsubmission = $workshop->get_submission_by_author($USER->id)) {
 282              print_collapsible_region_start('', 'workshop-viewlet-ownsubmission', get_string('yoursubmission', 'workshop'),
 283                      'workshop-viewlet-ownsubmission-collapsed', true);
 284              echo $output->box_start('generalbox ownsubmission');
 285              echo $output->render($workshop->prepare_submission_summary($ownsubmission, true));
 286              $ownsubmissionexists = true;
 287          } else {
 288              print_collapsible_region_start('', 'workshop-viewlet-ownsubmission', get_string('yoursubmission', 'workshop'),
 289                      'workshop-viewlet-ownsubmission-collapsed');
 290              echo $output->box_start('generalbox ownsubmission');
 291              echo $output->container(get_string('noyoursubmission', 'workshop'));
 292              $ownsubmissionexists = false;
 293              if ($workshop->creating_submission_allowed($USER->id)) {
 294                  $btnurl = new moodle_url($workshop->submission_url(), array('edit' => 'on'));
 295                  $btntxt = get_string('createsubmission', 'workshop');
 296              }
 297          }
 298          if (!empty($btnurl)) {
 299              echo $output->single_button($btnurl, $btntxt, 'get');
 300          }
 301          echo $output->box_end();
 302          print_collapsible_region_end();
 303      }
 304  
 305      if (has_capability('mod/workshop:viewallassessments', $PAGE->context)) {
 306          $perpage = get_user_preferences('workshop_perpage', 10);
 307          $groupid = groups_get_activity_group($workshop->cm, true);
 308          $data = $workshop->prepare_grading_report_data($USER->id, $groupid, $page, $perpage, $sortby, $sorthow);
 309          if ($data) {
 310              $showauthornames    = has_capability('mod/workshop:viewauthornames', $workshop->context);
 311              $showreviewernames  = has_capability('mod/workshop:viewreviewernames', $workshop->context);
 312  
 313              // prepare paging bar
 314              $baseurl = new moodle_url($PAGE->url, array('sortby' => $sortby, 'sorthow' => $sorthow));
 315              $pagingbar = new paging_bar($data->totalcount, $page, $perpage, $baseurl, 'page');
 316  
 317              // grading report display options
 318              $reportopts                         = new stdclass();
 319              $reportopts->showauthornames        = $showauthornames;
 320              $reportopts->showreviewernames      = $showreviewernames;
 321              $reportopts->sortby                 = $sortby;
 322              $reportopts->sorthow                = $sorthow;
 323              $reportopts->showsubmissiongrade    = false;
 324              $reportopts->showgradinggrade       = false;
 325              $reportopts->workshopphase          = $workshop->phase;
 326  
 327              print_collapsible_region_start('', 'workshop-viewlet-gradereport', get_string('gradesreport', 'workshop'),
 328                      'workshop-viewlet-gradereport-collapsed');
 329              echo $output->box_start('generalbox gradesreport');
 330              echo $output->container(groups_print_activity_menu($workshop->cm, $PAGE->url, true), 'groupwidget');
 331              echo $output->render($pagingbar);
 332              echo $output->render(new workshop_grading_report($data, $reportopts));
 333              echo $output->render($pagingbar);
 334              echo $output->perpage_selector($perpage);
 335              echo $output->box_end();
 336              print_collapsible_region_end();
 337          }
 338      }
 339      if (trim($workshop->instructreviewers)) {
 340          $instructions = file_rewrite_pluginfile_urls($workshop->instructreviewers, 'pluginfile.php', $PAGE->context->id,
 341              'mod_workshop', 'instructreviewers', null, workshop::instruction_editors_options($PAGE->context));
 342          print_collapsible_region_start('', 'workshop-viewlet-instructreviewers', get_string('instructreviewers', 'workshop'),
 343                  'workshop-viewlet-instructreviewers-collapsed');
 344          echo $output->box(format_text($instructions, $workshop->instructreviewersformat, array('overflowdiv'=>true)), array('generalbox', 'instructions'));
 345          print_collapsible_region_end();
 346      }
 347  
 348      // does the user have to assess examples before assessing other's work?
 349      $examplesmust = ($workshop->useexamples and $workshop->examplesmode == workshop::EXAMPLES_BEFORE_ASSESSMENT);
 350  
 351      // is the assessment of example submissions considered finished?
 352      $examplesdone = has_capability('mod/workshop:manageexamples', $workshop->context);
 353  
 354      // can the examples be assessed?
 355      $examplesavailable = true;
 356  
 357      if (!$examplesdone and $examplesmust and ($ownsubmissionexists === false)) {
 358          print_collapsible_region_start('', 'workshop-viewlet-examplesfail', get_string('exampleassessments', 'workshop'),
 359                  'workshop-viewlet-examplesfail-collapsed');
 360          echo $output->box(get_string('exampleneedsubmission', 'workshop'));
 361          print_collapsible_region_end();
 362          $examplesavailable = false;
 363      }
 364  
 365      if ($workshop->assessing_examples_allowed()
 366              and has_capability('mod/workshop:submit', $workshop->context)
 367                  and ! has_capability('mod/workshop:manageexamples', $workshop->context)
 368                      and $examplesavailable) {
 369          $examples = $userplan->get_examples();
 370          $total = count($examples);
 371          $left = 0;
 372          // make sure the current user has all examples allocated
 373          foreach ($examples as $exampleid => $example) {
 374              if (is_null($example->assessmentid)) {
 375                  $examples[$exampleid]->assessmentid = $workshop->add_allocation($example, $USER->id, 0);
 376              }
 377              if (is_null($example->grade)) {
 378                  $left++;
 379              }
 380          }
 381          if ($left > 0 and $workshop->examplesmode != workshop::EXAMPLES_VOLUNTARY) {
 382              $examplesdone = false;
 383          } else {
 384              $examplesdone = true;
 385          }
 386          print_collapsible_region_start('', 'workshop-viewlet-examples', get_string('exampleassessments', 'workshop'),
 387                  'workshop-viewlet-examples-collapsed', $examplesdone);
 388          echo $output->box_start('generalbox exampleassessments');
 389          if ($total == 0) {
 390              echo $output->heading(get_string('noexamples', 'workshop'), 3);
 391          } else {
 392              foreach ($examples as $example) {
 393                  $summary = $workshop->prepare_example_summary($example);
 394                  echo $output->render($summary);
 395              }
 396          }
 397          echo $output->box_end();
 398          print_collapsible_region_end();
 399      }
 400      if (!$examplesmust or $examplesdone) {
 401          print_collapsible_region_start('', 'workshop-viewlet-assignedassessments', get_string('assignedassessments', 'workshop'),
 402                  'workshop-viewlet-assignedassessments-collapsed');
 403          if (! $assessments = $workshop->get_assessments_by_reviewer($USER->id)) {
 404              echo $output->box_start('generalbox assessment-none');
 405              echo $output->notification(get_string('assignedassessmentsnone', 'workshop'));
 406              echo $output->box_end();
 407          } else {
 408              $shownames = has_capability('mod/workshop:viewauthornames', $PAGE->context);
 409              foreach ($assessments as $assessment) {
 410                  $submission                     = new stdClass();
 411                  $submission->id                 = $assessment->submissionid;
 412                  $submission->title              = $assessment->submissiontitle;
 413                  $submission->timecreated        = $assessment->submissioncreated;
 414                  $submission->timemodified       = $assessment->submissionmodified;
 415                  $userpicturefields = explode(',', implode(',', \core_user\fields::get_picture_fields()));
 416                  foreach ($userpicturefields as $userpicturefield) {
 417                      $prefixedusernamefield = 'author' . $userpicturefield;
 418                      $submission->$prefixedusernamefield = $assessment->$prefixedusernamefield;
 419                  }
 420  
 421                  // transform the submission object into renderable component
 422                  $submission = $workshop->prepare_submission_summary($submission, $shownames);
 423  
 424                  if (is_null($assessment->grade)) {
 425                      $submission->status = 'notgraded';
 426                      $class = ' notgraded';
 427                      $buttontext = get_string('assess', 'workshop');
 428                  } else {
 429                      $submission->status = 'graded';
 430                      $class = ' graded';
 431                      $buttontext = get_string('reassess', 'workshop');
 432                  }
 433  
 434                  echo $output->box_start('generalbox assessment-summary' . $class);
 435                  echo $output->render($submission);
 436                  $aurl = $workshop->assess_url($assessment->id);
 437                  echo $output->single_button($aurl, $buttontext, 'get');
 438                  echo $output->box_end();
 439              }
 440          }
 441          print_collapsible_region_end();
 442      }
 443      break;
 444  case workshop::PHASE_EVALUATION:
 445      if (has_capability('mod/workshop:viewallassessments', $PAGE->context)) {
 446          $perpage = get_user_preferences('workshop_perpage', 10);
 447          $groupid = groups_get_activity_group($workshop->cm, true);
 448          $data = $workshop->prepare_grading_report_data($USER->id, $groupid, $page, $perpage, $sortby, $sorthow);
 449          if ($data) {
 450              $showauthornames    = has_capability('mod/workshop:viewauthornames', $workshop->context);
 451              $showreviewernames  = has_capability('mod/workshop:viewreviewernames', $workshop->context);
 452  
 453              if (has_capability('mod/workshop:overridegrades', $PAGE->context)) {
 454                  // Print a drop-down selector to change the current evaluation method.
 455                  $selector = new single_select($PAGE->url, 'eval', workshop::available_evaluators_list(),
 456                      $workshop->evaluation, false, 'evaluationmethodchooser');
 457                  $selector->set_label(get_string('evaluationmethod', 'mod_workshop'));
 458                  $selector->set_help_icon('evaluationmethod', 'mod_workshop');
 459                  $selector->method = 'post';
 460                  echo $output->render($selector);
 461                  // load the grading evaluator
 462                  $evaluator = $workshop->grading_evaluation_instance();
 463                  $form = $evaluator->get_settings_form(new moodle_url($workshop->aggregate_url(),
 464                          compact('sortby', 'sorthow', 'page')));
 465                  $form->display();
 466              }
 467  
 468              // prepare paging bar
 469              $baseurl = new moodle_url($PAGE->url, array('sortby' => $sortby, 'sorthow' => $sorthow));
 470              $pagingbar = new paging_bar($data->totalcount, $page, $perpage, $baseurl, 'page');
 471  
 472              // grading report display options
 473              $reportopts                         = new stdclass();
 474              $reportopts->showauthornames        = $showauthornames;
 475              $reportopts->showreviewernames      = $showreviewernames;
 476              $reportopts->sortby                 = $sortby;
 477              $reportopts->sorthow                = $sorthow;
 478              $reportopts->showsubmissiongrade    = true;
 479              $reportopts->showgradinggrade       = true;
 480              $reportopts->workshopphase          = $workshop->phase;
 481  
 482              print_collapsible_region_start('', 'workshop-viewlet-gradereport', get_string('gradesreport', 'workshop'),
 483                      'workshop-viewlet-gradereport-collapsed');
 484              echo $output->box_start('generalbox gradesreport');
 485              echo $output->container(groups_print_activity_menu($workshop->cm, $PAGE->url, true), 'groupwidget');
 486              echo $output->render($pagingbar);
 487              echo $output->render(new workshop_grading_report($data, $reportopts));
 488              echo $output->render($pagingbar);
 489              echo $output->perpage_selector($perpage);
 490              echo $output->box_end();
 491              print_collapsible_region_end();
 492          }
 493      }
 494      if (has_capability('mod/workshop:overridegrades', $workshop->context)) {
 495          print_collapsible_region_start('', 'workshop-viewlet-cleargrades', get_string('toolbox', 'workshop'),
 496                  'workshop-viewlet-cleargrades-collapsed', true);
 497          echo $output->box_start('generalbox toolbox');
 498  
 499          // Clear aggregated grades
 500          $url = new moodle_url($workshop->toolbox_url('clearaggregatedgrades'));
 501          $btn = new single_button($url, get_string('clearaggregatedgrades', 'workshop'), 'post');
 502          $btn->add_confirm_action(get_string('clearaggregatedgradesconfirm', 'workshop'));
 503          echo $output->container_start('toolboxaction');
 504          echo $output->render($btn);
 505          echo $output->help_icon('clearaggregatedgrades', 'workshop');
 506          echo $output->container_end();
 507          // Clear assessments
 508          $url = new moodle_url($workshop->toolbox_url('clearassessments'));
 509          $btn = new single_button($url, get_string('clearassessments', 'workshop'), 'post');
 510          $btn->add_confirm_action(get_string('clearassessmentsconfirm', 'workshop'));
 511          echo $output->container_start('toolboxaction');
 512          echo $output->render($btn);
 513          echo $output->help_icon('clearassessments', 'workshop');
 514  
 515          echo $OUTPUT->pix_icon('i/risk_dataloss', get_string('riskdatalossshort', 'admin'));
 516          echo $output->container_end();
 517  
 518          echo $output->box_end();
 519          print_collapsible_region_end();
 520      }
 521      if (has_capability('mod/workshop:submit', $PAGE->context)) {
 522          print_collapsible_region_start('', 'workshop-viewlet-ownsubmission', get_string('yoursubmission', 'workshop'),
 523                  'workshop-viewlet-ownsubmission-collapsed');
 524          echo $output->box_start('generalbox ownsubmission');
 525          if ($submission = $workshop->get_submission_by_author($USER->id)) {
 526              echo $output->render($workshop->prepare_submission_summary($submission, true));
 527          } else {
 528              echo $output->container(get_string('noyoursubmission', 'workshop'));
 529          }
 530          echo $output->box_end();
 531          print_collapsible_region_end();
 532      }
 533      if ($assessments = $workshop->get_assessments_by_reviewer($USER->id)) {
 534          print_collapsible_region_start('', 'workshop-viewlet-assignedassessments', get_string('assignedassessments', 'workshop'),
 535                  'workshop-viewlet-assignedassessments-collapsed');
 536          $shownames = has_capability('mod/workshop:viewauthornames', $PAGE->context);
 537          foreach ($assessments as $assessment) {
 538              $submission                     = new stdclass();
 539              $submission->id                 = $assessment->submissionid;
 540              $submission->title              = $assessment->submissiontitle;
 541              $submission->timecreated        = $assessment->submissioncreated;
 542              $submission->timemodified       = $assessment->submissionmodified;
 543              $userpicturefields = explode(',', implode(',', \core_user\fields::get_picture_fields()));
 544              foreach ($userpicturefields as $userpicturefield) {
 545                  $prefixedusernamefield = 'author' . $userpicturefield;
 546                  $submission->$prefixedusernamefield = $assessment->$prefixedusernamefield;
 547              }
 548  
 549              if (is_null($assessment->grade)) {
 550                  $class = ' notgraded';
 551                  $submission->status = 'notgraded';
 552                  $buttontext = get_string('assess', 'workshop');
 553              } else {
 554                  $class = ' graded';
 555                  $submission->status = 'graded';
 556                  $buttontext = get_string('reassess', 'workshop');
 557              }
 558              echo $output->box_start('generalbox assessment-summary' . $class);
 559              echo $output->render($workshop->prepare_submission_summary($submission, $shownames));
 560              echo $output->box_end();
 561          }
 562          print_collapsible_region_end();
 563      }
 564      break;
 565  case workshop::PHASE_CLOSED:
 566      if (trim($workshop->conclusion)) {
 567          $conclusion = file_rewrite_pluginfile_urls($workshop->conclusion, 'pluginfile.php', $workshop->context->id,
 568              'mod_workshop', 'conclusion', null, workshop::instruction_editors_options($workshop->context));
 569          print_collapsible_region_start('', 'workshop-viewlet-conclusion', get_string('conclusion', 'workshop'),
 570                  'workshop-viewlet-conclusion-collapsed');
 571          echo $output->box(format_text($conclusion, $workshop->conclusionformat, array('overflowdiv'=>true)), array('generalbox', 'conclusion'));
 572          print_collapsible_region_end();
 573      }
 574      $finalgrades = $workshop->get_gradebook_grades($USER->id);
 575      if (!empty($finalgrades)) {
 576          print_collapsible_region_start('', 'workshop-viewlet-yourgrades', get_string('yourgrades', 'workshop'),
 577                  'workshop-viewlet-yourgrades-collapsed');
 578          echo $output->box_start('generalbox grades-yourgrades');
 579          echo $output->render($finalgrades);
 580          echo $output->box_end();
 581          print_collapsible_region_end();
 582      }
 583      if (has_capability('mod/workshop:viewallassessments', $PAGE->context)) {
 584          $perpage = get_user_preferences('workshop_perpage', 10);
 585          $groupid = groups_get_activity_group($workshop->cm, true);
 586          $data = $workshop->prepare_grading_report_data($USER->id, $groupid, $page, $perpage, $sortby, $sorthow);
 587          if ($data) {
 588              $showauthornames    = has_capability('mod/workshop:viewauthornames', $workshop->context);
 589              $showreviewernames  = has_capability('mod/workshop:viewreviewernames', $workshop->context);
 590  
 591              // prepare paging bar
 592              $baseurl = new moodle_url($PAGE->url, array('sortby' => $sortby, 'sorthow' => $sorthow));
 593              $pagingbar = new paging_bar($data->totalcount, $page, $perpage, $baseurl, 'page');
 594  
 595              // grading report display options
 596              $reportopts                         = new stdclass();
 597              $reportopts->showauthornames        = $showauthornames;
 598              $reportopts->showreviewernames      = $showreviewernames;
 599              $reportopts->sortby                 = $sortby;
 600              $reportopts->sorthow                = $sorthow;
 601              $reportopts->showsubmissiongrade    = true;
 602              $reportopts->showgradinggrade       = true;
 603              $reportopts->workshopphase          = $workshop->phase;
 604  
 605              print_collapsible_region_start('', 'workshop-viewlet-gradereport', get_string('gradesreport', 'workshop'),
 606                      'workshop-viewlet-gradereport-collapsed');
 607              echo $output->box_start('generalbox gradesreport');
 608              echo $output->container(groups_print_activity_menu($workshop->cm, $PAGE->url, true), 'groupwidget');
 609              echo $output->render($pagingbar);
 610              echo $output->render(new workshop_grading_report($data, $reportopts));
 611              echo $output->render($pagingbar);
 612              echo $output->perpage_selector($perpage);
 613              echo $output->box_end();
 614              print_collapsible_region_end();
 615          }
 616      }
 617      if (has_capability('mod/workshop:submit', $PAGE->context)) {
 618          print_collapsible_region_start('', 'workshop-viewlet-ownsubmission',
 619              get_string('yoursubmissionwithassessments', 'workshop'), 'workshop-viewlet-ownsubmission-collapsed');
 620          echo $output->box_start('generalbox ownsubmission');
 621          if ($submission = $workshop->get_submission_by_author($USER->id)) {
 622              echo $output->render($workshop->prepare_submission_summary($submission, true));
 623          } else {
 624              echo $output->container(get_string('noyoursubmission', 'workshop'));
 625          }
 626          echo $output->box_end();
 627  
 628          if (!empty($submission->gradeoverby) and strlen(trim($submission->feedbackauthor)) > 0) {
 629              echo $output->render(new workshop_feedback_author($submission));
 630          }
 631  
 632          print_collapsible_region_end();
 633      }
 634      if (has_capability('mod/workshop:viewpublishedsubmissions', $workshop->context)) {
 635          $shownames = has_capability('mod/workshop:viewauthorpublished', $workshop->context);
 636          if ($submissions = $workshop->get_published_submissions()) {
 637              print_collapsible_region_start('', 'workshop-viewlet-publicsubmissions', get_string('publishedsubmissions', 'workshop'),
 638                      'workshop-viewlet-publicsubmissions-collapsed');
 639              foreach ($submissions as $submission) {
 640                  echo $output->box_start('generalbox submission-summary');
 641                  echo $output->render($workshop->prepare_submission_summary($submission, $shownames));
 642                  echo $output->box_end();
 643              }
 644              print_collapsible_region_end();
 645          }
 646      }
 647      if ($assessments = $workshop->get_assessments_by_reviewer($USER->id)) {
 648          print_collapsible_region_start('', 'workshop-viewlet-assignedassessments', get_string('assignedassessments', 'workshop'),
 649                  'workshop-viewlet-assignedassessments-collapsed');
 650          $shownames = has_capability('mod/workshop:viewauthornames', $PAGE->context);
 651          foreach ($assessments as $assessment) {
 652              $submission                     = new stdclass();
 653              $submission->id                 = $assessment->submissionid;
 654              $submission->title              = $assessment->submissiontitle;
 655              $submission->timecreated        = $assessment->submissioncreated;
 656              $submission->timemodified       = $assessment->submissionmodified;
 657              $userpicturefields = explode(',', implode(',', \core_user\fields::get_picture_fields()));
 658              foreach ($userpicturefields as $userpicturefield) {
 659                  $prefixedusernamefield = 'author' . $userpicturefield;
 660                  $submission->$prefixedusernamefield = $assessment->$prefixedusernamefield;
 661              }
 662  
 663              if (is_null($assessment->grade)) {
 664                  $class = ' notgraded';
 665                  $submission->status = 'notgraded';
 666                  $buttontext = get_string('assess', 'workshop');
 667              } else {
 668                  $class = ' graded';
 669                  $submission->status = 'graded';
 670                  $buttontext = get_string('reassess', 'workshop');
 671              }
 672              echo $output->box_start('generalbox assessment-summary' . $class);
 673              echo $output->render($workshop->prepare_submission_summary($submission, $shownames));
 674              echo $output->box_end();
 675  
 676              if (strlen(trim($assessment->feedbackreviewer)) > 0) {
 677                  echo $output->render(new workshop_feedback_reviewer($assessment));
 678              }
 679          }
 680          print_collapsible_region_end();
 681      }
 682      break;
 683  default:
 684  }
 685  $PAGE->requires->js_call_amd('mod_workshop/workshopview', 'init');
 686  echo $output->footer();