From d183140de807ba113228180bbbd6aeeff2a115ab Mon Sep 17 00:00:00 2001 From: David Mudrak Date: Mon, 4 Jan 2010 18:22:47 +0000 Subject: [PATCH] MDL-20058 workshop grading report fixes and small improvements --- mod/workshop/lang/en_utf8/workshop.php | 2 +- mod/workshop/locallib.php | 23 +++++--- mod/workshop/renderer.php | 80 +++++++++++++++++--------- mod/workshop/styles.php | 11 +++- mod/workshop/view.php | 60 +++++++++++++++++-- 5 files changed, 129 insertions(+), 47 deletions(-) diff --git a/mod/workshop/lang/en_utf8/workshop.php b/mod/workshop/lang/en_utf8/workshop.php index 44c733cdd2..f5bea340b8 100644 --- a/mod/workshop/lang/en_utf8/workshop.php +++ b/mod/workshop/lang/en_utf8/workshop.php @@ -62,7 +62,7 @@ $string['assignedassessmentsnone'] = 'You have no assigned submission to assess' $string['backtoeditform'] = 'Back to editing form'; $string['byfullname'] = 'by url}\">{$a->name}'; $string['calculatetotalgrades'] = 'Calculate total grades'; -$string['calculatetotalgradesdetails'] = 'expected: $a->expected
known: $a->known'; +$string['calculatetotalgradesdetails'] = 'expected: $a->expected
calculated: $a->known'; $string['configexamplesmode'] = 'Default mode of examples assessment in workshops'; $string['configgradedecimals'] = 'Default number of digits that should be shown after the decimal point when displaying grades.'; $string['configgrade'] = 'Default maximum grade for submission in workshops'; diff --git a/mod/workshop/locallib.php b/mod/workshop/locallib.php index 72e20125a4..3117dbd7da 100644 --- a/mod/workshop/locallib.php +++ b/mod/workshop/locallib.php @@ -931,7 +931,7 @@ class workshop { $task->completed = 'info'; $phase->tasks['totalgradesmissinginfo'] = $task; } - } else { + } elseif ($this->phase == self::PHASE_EVALUATION) { $task = new stdClass(); $task->title = get_string('evaluategradeswait', 'workshop'); $task->completed = 'info'; @@ -1069,16 +1069,17 @@ class workshop { // we will need to know the number of all records later for the pagination purposes $numofparticipants = count($participants); - // load all fields which can be used sorting and paginate the records + // load all fields which can be used for sorting and paginate the records list($participantids, $params) = $DB->get_in_or_equal(array_keys($participants), SQL_PARAMS_NAMED); - $params['workshopid'] = $this->id; + $params['workshopid1'] = $this->id; + $params['workshopid2'] = $this->id; $sqlsort = $sortby . ' ' . $sorthow . ',u.lastname,u.firstname,u.id'; $sql = "SELECT u.id AS userid,u.firstname,u.lastname,u.picture,u.imagealt, s.title AS submissiontitle, s.grade AS submissiongrade, ag.gradinggrade, ag.totalgrade FROM {user} u - LEFT JOIN {workshop_submissions} s ON (s.authorid = u.id) - LEFT JOIN {workshop_aggregations} ag ON (ag.userid = u.id AND ag.workshopid = s.workshopid) - WHERE s.workshopid = :workshopid AND s.example = 0 AND u.id $participantids + LEFT JOIN {workshop_submissions} s ON (s.authorid = u.id AND s.workshopid = :workshopid1 AND s.example = 0) + LEFT JOIN {workshop_aggregations} ag ON (ag.userid = u.id AND ag.workshopid = :workshopid2) + WHERE u.id $participantids ORDER BY $sqlsort"; $participants = $DB->get_records_sql($sql, $params, $page * $perpage, $perpage); @@ -1141,8 +1142,7 @@ class workshop { if ($participants) { list($participantids, $params) = $DB->get_in_or_equal(array_keys($participants), SQL_PARAMS_NAMED); $params['workshopid'] = $this->id; - $sql = "SELECT a.id AS assessmentid, a.submissionid, a.grade, a.gradinggrade, a.gradinggradeover, - u.id AS reviewerid, + $sql = "SELECT a.id AS assessmentid, a.submissionid, a.grade, a.gradinggrade, a.gradinggradeover, a.reviewerid, s.id AS submissionid, e.id AS authorid, e.lastname, e.firstname, e.picture, e.imagealt FROM {user} u @@ -1168,6 +1168,11 @@ class workshop { foreach ($participants as $participant) { // set up default (null) values + $grades[$participant->userid]->submissionid = null; + $grades[$participant->userid]->submissiontitle = null; + $grades[$participant->userid]->submissiongrade = null; + $grades[$participant->userid]->submissiongradeover = null; + $grades[$participant->userid]->submissiongradeoverby = null; $grades[$participant->userid]->reviewedby = array(); $grades[$participant->userid]->reviewerof = array(); } @@ -1253,7 +1258,7 @@ class workshop { * @return float suitable to be stored as numeric(10,5) */ public function raw_grade_value($value, $max) { - if (empty($value)) { + if (is_null($value)) { return null; } if ($max == 0 or $value < 0) { diff --git a/mod/workshop/renderer.php b/mod/workshop/renderer.php index bebcbc3a0f..d282336206 100644 --- a/mod/workshop/renderer.php +++ b/mod/workshop/renderer.php @@ -400,15 +400,13 @@ class moodle_mod_workshop_renderer extends moodle_renderer_base { * the [[nullgrade]] string shall be displayed). * * @param stdClass $data prepared by {@link workshop::prepare_grading_report()} - * @param bool $showauthornames - * @param bool $showreviewernames - * @param string $sortby - * @param string $sorthow + * @param stdClass $options display options object with properties ->showauthornames ->showreviewernames ->sortby ->sorthow + * ->showsubmissiongrade ->showgradinggrade ->showtotalgrade * @return string html code */ - public function grading_report(stdClass $data, $showauthornames, $showreviewernames, $sortby, $sorthow) { - $grades = $data->grades; - $userinfo = $data->userinfo; + public function grading_report(stdClass $data, stdClass $options) { + $grades = $data->grades; + $userinfo = $data->userinfo; if (empty($grades)) { return ''; @@ -417,26 +415,33 @@ class moodle_mod_workshop_renderer extends moodle_renderer_base { $table = new html_table(); $table->set_classes('grading-report'); - $sortbyfirstname = $this->sortable_heading(get_string('firstname'), 'firstname', $sortby, $sorthow); - $sortbylastname = $this->sortable_heading(get_string('lastname'), 'lastname', $sortby, $sorthow); + $sortbyfirstname = $this->sortable_heading(get_string('firstname'), 'firstname', $options->sortby, $options->sorthow); + $sortbylastname = $this->sortable_heading(get_string('lastname'), 'lastname', $options->sortby, $options->sorthow); if (self::fullname_format() == 'lf') { $sortbyname = $sortbylastname . ' / ' . $sortbyfirstname; } else { $sortbyname = $sortbyfirstname . ' / ' . $sortbylastname; } - $table->head = array( - $sortbyname, - $this->sortable_heading(get_string('submission', 'workshop'), 'submissiontitle', $sortby, $sorthow), - $this->sortable_heading(get_string('receivedgrades', 'workshop')), - $this->sortable_heading(get_string('submissiongradeof', 'workshop', $data->maxgrade), - 'submissiongrade', $sortby, $sorthow), - $this->sortable_heading(get_string('givengrades', 'workshop')), - $this->sortable_heading(get_string('gradinggradeof', 'workshop', $data->maxgradinggrade), - 'gradinggrade', $sortby, $sorthow), - $this->sortable_heading(get_string('totalgradeof', 'workshop', $data->maxtotalgrade), - 'totalgrade', $sortby, $sorthow), - ); + $table->head = array(); + $table->head[] = $sortbyname; + $table->head[] = $this->sortable_heading(get_string('submission', 'workshop'), 'submissiontitle', + $options->sortby, $options->sorthow); + $table->head[] = $this->sortable_heading(get_string('receivedgrades', 'workshop')); + if ($options->showsubmissiongrade) { + $table->head[] = $this->sortable_heading(get_string('submissiongradeof', 'workshop', $data->maxgrade), + 'submissiongrade', $options->sortby, $options->sorthow); + } + $table->head[] = $this->sortable_heading(get_string('givengrades', 'workshop')); + if ($options->showgradinggrade) { + $table->head[] = $this->sortable_heading(get_string('gradinggradeof', 'workshop', $data->maxgradinggrade), + 'gradinggrade', $options->sortby, $options->sorthow); + } + if ($options->showtotalgrade) { + $table->head[] = $this->sortable_heading(get_string('totalgradeof', 'workshop', $data->maxtotalgrade), + 'totalgrade', $options->sortby, $options->sorthow); + } + $table->rowclasses = array(); $table->colclasses = array(); $table->data = array(); @@ -471,6 +476,7 @@ class moodle_mod_workshop_renderer extends moodle_renderer_base { $cell = new html_table_cell(); $cell->text = $this->grading_report_participant($participant, $userinfo); $cell->rowspan = $numoftrs; + $cell->add_class('participant'); $row->cells[] = $cell; } // column #2 - submission - spans over all rows @@ -478,42 +484,59 @@ class moodle_mod_workshop_renderer extends moodle_renderer_base { $cell = new html_table_cell(); $cell->text = $this->grading_report_submission($participant); $cell->rowspan = $numoftrs; + $cell->add_class('submission'); $row->cells[] = $cell; } // column #3 - received grades if ($tr % $spanreceived == 0) { $idx = intval($tr / $spanreceived); + $assessment = self::array_nth($participant->reviewedby, $idx); $cell = new html_table_cell(); - $cell->text = $this->grading_report_assessment(self::array_nth($participant->reviewedby, $idx), - $showreviewernames, $userinfo, get_string('gradereceivedfrom', 'workshop')); + $cell->text = $this->grading_report_assessment($assessment, $options->showreviewernames, $userinfo, + get_string('gradereceivedfrom', 'workshop')); $cell->rowspan = $spanreceived; + $cell->add_class('receivedgrade'); + if (is_null($assessment) or is_null($assessment->grade)) { + $cell->add_class('null'); + } else { + $cell->add_class('notnull'); + } $row->cells[] = $cell; } // column #4 - total grade for submission - if ($tr == 0) { + if ($options->showsubmissiongrade and $tr == 0) { $cell = new html_table_cell(); $cell->text = $this->grading_report_grade($participant->submissiongrade, $participant->submissiongradeover); $cell->rowspan = $numoftrs; + $cell->add_class('submissiongrade'); $row->cells[] = $cell; } // column #5 - given grades if ($tr % $spangiven == 0) { $idx = intval($tr / $spangiven); + $assessment = self::array_nth($participant->reviewerof, $idx); $cell = new html_table_cell(); - $cell->text = $this->grading_report_assessment(self::array_nth($participant->reviewerof, $idx), - $showauthornames, $userinfo, get_string('gradegivento', 'workshop')); + $cell->text = $this->grading_report_assessment($assessment, $options->showauthornames, $userinfo, + get_string('gradegivento', 'workshop')); $cell->rowspan = $spangiven; + $cell->add_class('givengrade'); + if (is_null($assessment) or is_null($assessment->grade)) { + $cell->add_class('null'); + } else { + $cell->add_class('notnull'); + } $row->cells[] = $cell; } // column #6 - total grade for assessment - if ($tr == 0) { + if ($options->showgradinggrade and $tr == 0) { $cell = new html_table_cell(); $cell->text = $this->grading_report_grade($participant->gradinggrade); $cell->rowspan = $numoftrs; + $cell->add_class('gradinggrade'); $row->cells[] = $cell; } // column #7 - total grade for assessment - if ($tr == 0) { + if ($options->showtotalgrade and $tr == 0) { $cell = new html_table_cell(); if (is_null($participant->totalgrade)) { $cell->text = get_string('nullgrade', 'workshop'); @@ -522,6 +545,7 @@ class moodle_mod_workshop_renderer extends moodle_renderer_base { } $cell->text = $this->grading_report_grade($participant->totalgrade); $cell->rowspan = $numoftrs; + $cell->add_class('totalgrade'); $row->cells[] = $cell; } $table->data[] = $row; diff --git a/mod/workshop/styles.php b/mod/workshop/styles.php index da97b999f8..3aedbf7be0 100644 --- a/mod/workshop/styles.php +++ b/mod/workshop/styles.php @@ -443,14 +443,19 @@ white-space: nowrap; } -.mod-workshop .grading-report td.c3, -.mod-workshop .grading-report td.c5 { +.mod-workshop .grading-report .submissiongrade, +.mod-workshop .grading-report .gradinggrade { text-align: center; font-size: 160%; white-space: nowrap; } -.mod-workshop .grading-report td.c6 { +.mod-workshop .grading-report .givengrade.null .user, +.mod-workshop .grading-report .receivedgrade.null .user { + color: #ee0000; +} + +.mod-workshop .grading-report .totalgrade { text-align: center; font-size: 220%; } diff --git a/mod/workshop/view.php b/mod/workshop/view.php index ab4cb05fda..177ac37e3a 100644 --- a/mod/workshop/view.php +++ b/mod/workshop/view.php @@ -117,6 +117,41 @@ case workshop::PHASE_SUBMISSION: } break; case workshop::PHASE_ASSESSMENT: + if (has_capability('mod/workshop:viewallassessments', $PAGE->context)) { + $page = optional_param('page', 0, PARAM_INT); + $sortby = optional_param('sortby', 'lastname', PARAM_ALPHA); + $sorthow = optional_param('sorthow', 'ASC', PARAM_ALPHA); + $perpage = 10; // todo let the user modify this + $groups = ''; // todo let the user choose the group + $PAGE->set_url(new moodle_url($PAGE->url, compact('sortby', 'sorthow', 'page'))); + $data = $workshop->prepare_grading_report($USER->id, $groups, $page, $perpage, $sortby, $sorthow); + if ($data) { + $showauthornames = has_capability('mod/workshop:viewauthornames', $workshop->context); + $showreviewernames = has_capability('mod/workshop:viewreviewernames', $workshop->context); + + // prepare paging bar + $pagingbar = new moodle_paging_bar(); + $pagingbar->totalcount = $data->totalcount; + $pagingbar->page = $page; + $pagingbar->perpage = $perpage; + $pagingbar->baseurl = $PAGE->url; + $pagingbar->pagevar = 'page'; + + // grading report display options + $reportopts = new stdClass(); + $reportopts->showauthornames = $showauthornames; + $reportopts->showreviewernames = $showreviewernames; + $reportopts->sortby = $sortby; + $reportopts->sorthow = $sorthow; + $reportopts->showsubmissiongrade = false; + $reportopts->showgradinggrade = false; + $reportopts->showtotalgrade = false; + + echo $OUTPUT->paging_bar($pagingbar); + echo $wsoutput->grading_report($data, $reportopts); + echo $OUTPUT->paging_bar($pagingbar); + } + } if (trim(strip_tags($workshop->instructreviewers))) { $instructions = file_rewrite_pluginfile_urls($workshop->instructreviewers, 'pluginfile.php', $PAGE->context->id, 'workshop_instructreviewers', 0, workshop::instruction_editors_options($PAGE->context)); @@ -161,7 +196,7 @@ case workshop::PHASE_ASSESSMENT: } break; case workshop::PHASE_EVALUATION: - if (has_capability('mod/workshop:overridegrades', $PAGE->context)) { + if (has_capability('mod/workshop:viewallassessments', $PAGE->context)) { $page = optional_param('page', 0, PARAM_INT); $sortby = optional_param('sortby', 'lastname', PARAM_ALPHA); $sorthow = optional_param('sorthow', 'ASC', PARAM_ALPHA); @@ -173,10 +208,13 @@ case workshop::PHASE_EVALUATION: $showauthornames = has_capability('mod/workshop:viewauthornames', $workshop->context); $showreviewernames = has_capability('mod/workshop:viewreviewernames', $workshop->context); - // load the grading evaluator - $evaluator = $workshop->grading_evaluation_instance(); - $form = $evaluator->get_settings_form(new moodle_url($workshop->aggregate_url(), compact('sortby', 'sorthow', 'page'))); - $form->display(); + if (has_capability('mod/workshop:overridegrades', $PAGE->context)) { + // load the grading evaluator + $evaluator = $workshop->grading_evaluation_instance(); + $form = $evaluator->get_settings_form(new moodle_url($workshop->aggregate_url(), + compact('sortby', 'sorthow', 'page'))); + $form->display(); + } // prepare paging bar $pagingbar = new moodle_paging_bar(); @@ -186,8 +224,18 @@ case workshop::PHASE_EVALUATION: $pagingbar->baseurl = $PAGE->url; $pagingbar->pagevar = 'page'; + // grading report display options + $reportopts = new stdClass(); + $reportopts->showauthornames = $showauthornames; + $reportopts->showreviewernames = $showreviewernames; + $reportopts->sortby = $sortby; + $reportopts->sorthow = $sorthow; + $reportopts->showsubmissiongrade = true; + $reportopts->showgradinggrade = true; + $reportopts->showtotalgrade = true; + echo $OUTPUT->paging_bar($pagingbar); - echo $wsoutput->grading_report($data, $showauthornames, $showreviewernames, $sortby, $sorthow); + echo $wsoutput->grading_report($data, $reportopts); echo $OUTPUT->paging_bar($pagingbar); } } -- 2.39.5