Select Git revision
-
Tim Fechner authored
still no 'per field' error handling, but coming soon!
Tim Fechner authoredstill no 'per field' error handling, but coming soon!
To learn more about this project, read the wiki.
delayed_courses_table.php 9.74 KiB
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Table listing all delayed courses
*
* @package tool_lifecycle
* @copyright 2019 Justus Dieckmann WWU
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_lifecycle\local\table;
defined('MOODLE_INTERNAL') || die;
require_once($CFG->libdir . '/tablelib.php');
/**
* Table listing all delayed courses
*
* @package tool_lifecycle
* @copyright 2019 Justus Dieckmann WWU
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class delayed_courses_table extends \table_sql {
/** @var null|int|string $workflow workflow to filter for. Might be workflowid or "global" to filter for global delays. */
private $workflow;
/**
* Constructor for delayed_courses_table.
*
* @param object|null $filterdata filterdata from moodle form.
* @throws \coding_exception
*/
public function __construct($filterdata) {
parent::__construct('tool_lifecycle-delayed-courses');
$fields = 'c.id as courseid, c.fullname as coursefullname, cat.name as category, ';
$selectseperatedelays = true;
$selectglobaldelays = true;
$workflowfilterid = null;
if ($filterdata && $filterdata->workflow) {
if ($filterdata->workflow == 'global') {
$selectseperatedelays = false;
$this->workflow = 'global';
} else if (is_number($filterdata->workflow)) {
$selectglobaldelays = false;
$workflowfilterid = $filterdata->workflow;
$this->workflow = $filterdata->workflow;
} else {
throw new \coding_exception('workflow has to be "global" or a int value');
}
}
if ($selectseperatedelays) {
$fields .= 'wfdelay.workflowid, wfdelay.workflow, wfdelay.workflowdelay, wfdelay.workflowcount, ';
} else {
$fields .= 'null as workflowid, null as workflow, null AS workflowdelay, null AS workflowcount, ';
}
if ($selectglobaldelays) {
$fields .= 'd.delayeduntil AS globaldelay';
} else {
$fields .= 'null AS globaldelay';
}
$params = [];
$where = ["TRUE"];
if ($selectglobaldelays && !$selectseperatedelays) {
$from = '{tool_lifecycle_delayed} d ' .
'JOIN {course} c ON c.id = d.courseid ' .
'JOIN {course_categories} cat ON c.category = cat.id';
} else {
$from = '{course} c ' .
// For every course, add information about delays per workflow.
'LEFT JOIN (' .
'SELECT dw.courseid, dw.workflowid, w.title as workflow, ' .
'dw.delayeduntil as workflowdelay,maxtable.wfcount as workflowcount ' .
'FROM ( ' .
'SELECT courseid, MAX(dw.id) AS maxid, COUNT(*) AS wfcount ' .
'FROM {tool_lifecycle_delayed_workf} dw ' .
'JOIN {tool_lifecycle_workflow} w ON dw.workflowid = w.id ' . // To make sure no outdated delays are counted.
'WHERE dw.delayeduntil >= :time ' .
'AND w.timeactive IS NOT NULL ';
$params['time'] = time();
if ($workflowfilterid) {
$from .= 'AND w.id = :workflowid';
$params['workflowid'] = $workflowfilterid;
}
$from .= 'GROUP BY courseid ' .
') maxtable ' .
'JOIN {tool_lifecycle_delayed_workf} dw ON maxtable.maxid = dw.id ' .
'JOIN {tool_lifecycle_workflow} w ON dw.workflowid = w.id ' .
') wfdelay ON wfdelay.courseid = c.id ';
if ($selectglobaldelays) {
// For every course, add information about global delay.
$from .= 'LEFT JOIN (' .
'SELECT * FROM {tool_lifecycle_delayed} d ' .
'WHERE d.delayeduntil > :time2 ' .
') d ON c.id = d.courseid ';
$params['time2'] = time();
// Only include course in resultset, if it has a delay of some kind (global or per wf).
$where[] = 'COALESCE(wfdelay.courseid, d.courseid) IS NOT NULL';
} else {
$where[] = 'wfdelay.courseid IS NOT NULL';
}
$from .= 'JOIN {course_categories} cat ON c.category = cat.id';
}
if ($filterdata && $filterdata->category) {
$where[] = 'cat.id = :catid ';
$params['catid'] = $filterdata->category;
}
if ($filterdata && $filterdata->coursename) {
global $DB;
$where[] = 'c.fullname LIKE :cname';
$params['cname'] = '%' . $DB->sql_like_escape($filterdata->coursename) . '%';
}
$where = join(" AND ", $where);
$this->set_sql($fields, $from, $where, $params);
$this->column_nosort = ['workflow', 'tools'];
$this->define_columns(['coursefullname', 'category', 'workflow', 'tools']);
$this->define_headers([
get_string('coursename', 'tool_lifecycle'),
get_string('category'),
get_string('delays', 'tool_lifecycle'),
get_string('tools', 'tool_lifecycle')
]);
}
/**
* Render workflow column
*
* @param object $row
* @return string
* @throws \coding_exception
* @throws \dml_exception
*/
public function col_workflow($row) {
if ($row->globaldelay >= time()) {
if ($row->workflowcount == 1) {
$text = get_string('delayed_globally_and_seperately_for_one', 'tool_lifecycle');
} else if ($row->workflowcount > 1) {
$text = get_string('delayed_globally_and_seperately', 'tool_lifecycle', $row->workflowcount);
} else {
$dateformat = get_string('strftimedatetimeshort', 'core_langconfig');
$date = userdate($row->globaldelay, $dateformat);
$text = get_string('delayed_globally', 'tool_lifecycle', $date);
}
} else {
if ($row->workflowcount <= 0) {
$text = '';
} else if ($row->workflowcount == 1) {
$dateformat = get_string('strftimedatetimeshort', 'core_langconfig');
$date = userdate($row->workflowdelay, $dateformat);
$text = get_string('delayed_for_workflow_until', 'tool_lifecycle',
array('name' => $row->workflow, 'date' => $date));
} else {
$text = get_string('delayed_for_workflows', 'tool_lifecycle', $row->workflowcount);
}
}
return \html_writer::start_span('tool_lifecycle-hint', array('title' => $this->get_mouseover($row))) .
$text .
\html_writer::end_span();
}
/**
* Returns mouseover text for Delaystatus.
*
* @param object $row the dataset row
* @return string the mouseover text
* @throws \coding_exception
* @throws \dml_exception
*/
private function get_mouseover($row) {
global $DB;
$text = '';
$dateformat = get_string('strftimedatetimeshort', 'core_langconfig');
if ($row->globaldelay >= time()) {
$date = userdate($row->globaldelay, $dateformat);
$text .= get_string('globally_until_date', 'tool_lifecycle', $date) . ' ';
}
if ($row->workflowcount == 1) {
$date = userdate($row->workflowdelay, $dateformat);
$text .= get_string('name_until_date', 'tool_lifecycle',
array('name' => $row->workflow, 'date' => $date)) . ' ';
} else if ($row->workflowcount > 1) {
$sql = 'SELECT dw.id, dw.delayeduntil, w.title
FROM {tool_lifecycle_delayed_workf} dw
JOIN {tool_lifecycle_workflow} w ON dw.workflowid = w.id
WHERE dw.courseid = :courseid
AND w.timeactive IS NOT NULL';
$records = $DB->get_records_sql($sql, ['courseid' => $row->courseid]);
foreach ($records as $record) {
$date = userdate($record->delayeduntil, $dateformat);
$text .= get_string('name_until_date', 'tool_lifecycle',
array('name' => $record->title, 'date' => $date)) . ' ';
}
}
return $text;
}
/**
* Render tools column.
*
* @param object $row Row data.
* @return string pluginname of the subplugin
* @throws \coding_exception
* @throws \moodle_exception
*/
public function col_tools($row) {
global $PAGE, $OUTPUT;
$params = array(
'action' => 'delete',
'cid' => $row->courseid,
'sesskey' => sesskey()
);
if ($this->workflow) {
$params['workflow'] = $this->workflow;
}
$button = new \single_button(new \moodle_url($PAGE->url, $params),
get_string('delete_delay', 'tool_lifecycle'));
return $OUTPUT->render($button);
}
}