MDL-32235 improving the allocation results rendering

The new renderable class workshop_allocation_result provides a cleaner
interface between the allocator's init() method and the allocation.php
script.
This commit is contained in:
David Mudrak
2012-04-13 04:49:45 +02:00
parent 0ee608e99d
commit 31cea236af
5 changed files with 168 additions and 81 deletions
+6 -5
View File
@@ -74,13 +74,14 @@ if (!empty($allocators)) {
$tabs[] = $row;
print_tabs($tabs, $currenttab, $inactive, $activated);
if (!empty($initresult)) {
echo $output->container_start('allocator-init-results');
echo $output->render(new workshop_allocation_init_result($initresult, $workshop->allocation_url($method)));
echo $output->container_end();
} else {
if (is_null($initresult->get_status()) or $initresult->get_status() == workshop_allocation_result::STATUS_VOID) {
echo $output->container_start('allocator-ui');
echo $allocator->ui();
echo $output->container_end();
} else {
echo $output->container_start('allocator-init-results');
echo $output->render($initresult);
echo $output->continue_button($workshop->allocation_url($method));
echo $output->container_end();
}
echo $output->footer();
+108 -3
View File
@@ -43,11 +43,10 @@ interface workshop_allocator {
*
* This method is called soon after the allocator is constructed and before any output
* is generated. Therefore it may process any data submitted and do other tasks.
* It must not produce any output. The returned value is processed by
* {@see workshop_allocation_init_result} class and rendered.
* It must not produce any output.
*
* @throws moodle_exception
* @return void|string
* @return workshop_allocation_result
*/
public function init();
@@ -71,3 +70,109 @@ interface workshop_allocator {
*/
public static function delete_instance($workshopid);
}
/**
* Stores the information about the allocation process
*
* Allocator's method init() returns instance of this class.
*/
class workshop_allocation_result implements renderable {
/** the init() called successfully but no actual allocation was done */
const STATUS_VOID = 0;
/** allocation was successfully executed */
const STATUS_EXECUTED = 1;
/** a serious error has occurred during the allocation (as a hole) */
const STATUS_FAILED = 2;
/** scheduled allocation was configured to be executed later */
const STATUS_SCHEDULED_ON = 3;
/** scheduled allocation was disabled */
const STATUS_SCHEDULED_OFF = 4;
/** @var workshop_allocator the instance of the allocator that produced this result */
protected $allocator;
/** @var null|int the status of the init() call */
protected $status = null;
/** @var null|string optional result message to display */
protected $message = null;
/** @var int the timestamp of when the allocation process started */
protected $timestart = null;
/** @var int the timestamp of when the final status was set */
protected $timeend = null;
/** @var array of log message objects, {@see self::log()} */
protected $logs = array();
/**
* Creates new instance of the object
*
* @param workshop_allocator $allocator
*/
public function __construct(workshop_allocator $allocator) {
$this->allocator = $allocator;
$this->timestart = time();
}
/**
* Sets the result status of the allocation
*
* @param int $status the status code, eg {@link self::STATUS_OK}
* @param string $message optional status message
*/
public function set_status($status, $message = null) {
$this->status = $status;
$this->message = is_null($message) ? $this->message : $message;
$this->timeend = time();
}
/**
* @return int|null the result status
*/
public function get_status() {
return $this->status;
}
/**
* @return string|null status message
*/
public function get_message() {
return $this->message;
}
/**
* Appends a new message to the log
*
* The available levels are
* ok - success, eg. new allocation was created
* info - informational message
* error - error message, eg. no more peers available
* debug - debugging info
*
* @param string $message message text to display
* @param string $type the type of the message
* @param int $indent eventual indentation level (the message is related to the previous one with the lower indent)
*/
public function log($message, $type = 'ok', $indent = 0) {
$log = new stdClass();
$log->message = $message;
$log->type = $type;
$log->indent = $indent;
$this->logs[] = $log;
}
/**
* Returns list of logged messages
*
* Each object in the list has public properties
* message string, text to display
* type string, the type of the message
* indent int, indentation level
*
* @see self::log()
* @return array of log objects
*/
public function get_logs() {
return $this->logs;
}
}
+1
View File
@@ -32,6 +32,7 @@ $string['allocatedetails'] = 'expected: {$a->expected}<br />submitted: {$a->subm
$string['allocation'] = 'Submission allocation';
$string['allocationdone'] = 'Allocation done';
$string['allocationerror'] = 'Allocation error';
$string['allocationscheduleconfigured'] = 'Scheduled allocation configured';
$string['allsubmissions'] = 'All submissions';
$string['alreadygraded'] = 'Already graded';
$string['areainstructauthors'] = 'Instructions for submission';
+2 -58
View File
@@ -44,9 +44,8 @@ require_once($CFG->libdir . '/filelib.php');
*/
class workshop {
/** return statuses of {@link add_allocation} to be passed to a workshop renderer method */
/** error status of the {@link self::add_allocation()} */
const ALLOCATION_EXISTS = -9999;
const ALLOCATION_ERROR = -9998;
/** the internal code of the workshop phases as are stored in the database */
const PHASE_SETUP = 10;
@@ -965,7 +964,7 @@ class workshop {
* @param int $reviewerid User ID
* @param int $weight of the new assessment, from 0 to 16
* @param bool $bulk repeated inserts into DB expected
* @return int ID of the new assessment or an error code
* @return int ID of the new assessment or an error code {@link self::ALLOCATION_EXISTS} if the allocation already exists
*/
public function add_allocation(stdclass $submission, $reviewerid, $weight=1, $bulk=false) {
global $DB;
@@ -3011,61 +3010,6 @@ class workshop_message implements renderable {
}
}
/**
* Renderable output of submissions allocation process
*/
class workshop_allocation_init_result implements renderable {
/** @var workshop_message */
protected $message;
/** @var array of steps */
protected $info = array();
/** @var moodle_url */
protected $continue;
/**
* Supplied argument can be either integer status code or an array of string messages. Messages
* in a array can have optional prefix or prefixes, using '::' as delimiter. Prefixes determine
* the type of the message and may influence its visualisation.
*
* @param mixed $result int|array returned by {@see workshop_allocator::init()}
* @param moodle_url to continue
*/
public function __construct($result, moodle_url $continue) {
if ($result === workshop::ALLOCATION_ERROR) {
$this->message = new workshop_message(get_string('allocationerror', 'workshop'), workshop_message::TYPE_ERROR);
} else {
$this->message = new workshop_message(get_string('allocationdone', 'workshop'), workshop_message::TYPE_OK);
if (is_array($result)) {
$this->info = $result;
}
}
$this->continue = $continue;
}
/**
* @return workshop_message instance to render
*/
public function get_message() {
return $this->message;
}
/**
* @return array of strings with allocation process details
*/
public function get_info() {
return $this->info;
}
/**
* @return moodle_url where the user shoudl continue
*/
public function get_continue_url() {
return $this->continue;
}
}
/**
* Renderable component containing all the data needed to display the grading report
+51 -15
View File
@@ -319,33 +319,69 @@ class mod_workshop_renderer extends plugin_renderer_base {
/**
* Renders the result of the submissions allocation process
*
* @param workshop_allocation_init_result
* @return string html to be echoed
* @param workshop_allocation_result $result as returned by the allocator's init() method
* @return string HTML to be echoed
*/
protected function render_workshop_allocation_init_result(workshop_allocation_init_result $result) {
protected function render_workshop_allocation_result(workshop_allocation_result $result) {
$status = $result->get_status();
if (is_null($status) or $status == workshop_allocation_result::STATUS_VOID) {
debugging('Attempt to render workshop_allocation_result with empty status', DEBUG_DEVELOPER);
return '';
}
switch ($status) {
case workshop_allocation_result::STATUS_FAILED:
if ($message = $result->get_message()) {
$message = new workshop_message($message, workshop_message::TYPE_ERROR);
} else {
$message = new workshop_message(get_string('allocationerror', 'workshop'), workshop_message::TYPE_ERROR);
}
break;
case workshop_allocation_result::STATUS_SCHEDULED_ON:
case workshop_allocation_result::STATUS_SCHEDULED_OFF:
if ($message = $result->get_message()) {
$message = new workshop_message($message, workshop_message::TYPE_INFO);
} else {
$message = new workshop_message(get_string('allocationscheduleconfigured', 'workshop'), workshop_message::TYPE_INFO);
}
break;
case workshop_allocation_result::STATUS_EXECUTED:
if ($message = $result->get_message()) {
$message = new workshop_message($message, workshop_message::TYPE_OK);
} else {
$message = new workshop_message(get_string('allocationdone', 'workshop'), workshop_message::TYPE_OK);
}
break;
default:
throw new coding_exception('Unknown allocation result status', $status);
}
// start with the message
$o = $this->render($result->get_message());
$o = $this->render($message);
// display the details about the process if available
$info = $result->get_info();
if (is_array($info) and !empty($info)) {
$logs = $result->get_logs();
if (is_array($logs) and !empty($logs)) {
$o .= html_writer::start_tag('ul', array('class' => 'allocation-init-results'));
foreach ($info as $message) {
$parts = explode('::', $message);
$text = array_pop($parts);
$class = implode(' ', $parts);
if (in_array('debug', $parts) && !debugging('', DEBUG_DEVELOPER)) {
// do not display allocation debugging messages
foreach ($logs as $log) {
if ($log->type == 'debug' and !debugging('', DEBUG_DEVELOPER)) {
// display allocation debugging messages for developers only
continue;
}
$o .= html_writer::tag('li', $text, array('class' => $class)) . "\n";
$class = $log->type;
if ($log->indent) {
$class .= ' indent';
}
$o .= html_writer::tag('li', $log->message, array('class' => $class)).PHP_EOL;
}
$o .= html_writer::end_tag('ul');
}
$o .= $this->output->continue_button($result->get_continue_url());
return $o;
}