mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 00:12:56 +02:00
Merge branch 'MDL-65633_master' of git://github.com/dmonllao/moodle
This commit is contained in:
commit
57d42d0598
@ -65,6 +65,15 @@ class edit_model extends \moodleform {
|
||||
$mform->addRule('target', get_string('required'), 'required', null, 'client');
|
||||
}
|
||||
|
||||
if (!empty($this->_customdata['targetname']) && !empty($this->_customdata['targetclass'])) {
|
||||
$mform->addElement('static', 'targetname', get_string('target', 'tool_analytics'), $this->_customdata['targetname']);
|
||||
$mform->addElement('hidden', 'target',
|
||||
\tool_analytics\output\helper::class_to_option($this->_customdata['targetclass']));
|
||||
// We won't update the model's target so no worries about its format (we can't use PARAM_ALPHANUMEXT
|
||||
// because of class_to_option).
|
||||
$mform->setType('target', PARAM_TEXT);
|
||||
}
|
||||
|
||||
// Indicators.
|
||||
if (!$this->_customdata['staticmodel']) {
|
||||
$indicators = array();
|
||||
@ -81,6 +90,13 @@ class edit_model extends \moodleform {
|
||||
}
|
||||
|
||||
// Time-splitting methods.
|
||||
if (!empty($this->_customdata['invalidcurrenttimesplitting'])) {
|
||||
$mform->addElement('html', $OUTPUT->notification(
|
||||
get_string('invalidcurrenttimesplitting', 'tool_analytics'),
|
||||
\core\output\notification::NOTIFY_WARNING)
|
||||
);
|
||||
}
|
||||
|
||||
$timesplittings = array('' => '');
|
||||
foreach ($this->_customdata['timesplittings'] as $classname => $timesplitting) {
|
||||
$optionname = \tool_analytics\output\helper::class_to_option($classname);
|
||||
@ -131,10 +147,17 @@ class edit_model extends \moodleform {
|
||||
$errors = parent::validation($data, $files);
|
||||
|
||||
if (!empty($data['timesplitting'])) {
|
||||
$realtimesplitting = \tool_analytics\output\helper::option_to_class($data['timesplitting']);
|
||||
if (\core_analytics\manager::is_valid($realtimesplitting, '\core_analytics\local\time_splitting\base') === false) {
|
||||
$timesplittingclass = \tool_analytics\output\helper::option_to_class($data['timesplitting']);
|
||||
if (\core_analytics\manager::is_valid($timesplittingclass, '\core_analytics\local\time_splitting\base') === false) {
|
||||
$errors['timesplitting'] = get_string('errorinvalidtimesplitting', 'analytics');
|
||||
}
|
||||
|
||||
$targetclass = \tool_analytics\output\helper::option_to_class($data['target']);
|
||||
$timesplitting = \core_analytics\manager::get_time_splitting($timesplittingclass);
|
||||
$target = \core_analytics\manager::get_target($targetclass);
|
||||
if (!$target->can_use_timesplitting($timesplitting)) {
|
||||
$errors['timesplitting'] = get_string('invalidtimesplitting', 'tool_analytics');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$this->_customdata['staticmodel']) {
|
||||
|
@ -97,16 +97,9 @@ class models_list implements \renderable, \templatable {
|
||||
}
|
||||
|
||||
// Evaluation options.
|
||||
$timesplittingmethods = [
|
||||
['id' => 'all', 'text' => get_string('alltimesplittingmethods', 'tool_analytics')],
|
||||
];
|
||||
foreach (\core_analytics\manager::get_time_splitting_methods_for_evaluation(true) as $timesplitting) {
|
||||
$timesplittingmethods[] = [
|
||||
'id' => \tool_analytics\output\helper::class_to_option($timesplitting->get_id()),
|
||||
'text' => $timesplitting->get_name()->out(),
|
||||
];
|
||||
}
|
||||
$timesplittingsforevaluation = \core_analytics\manager::get_time_splitting_methods_for_evaluation(true);
|
||||
|
||||
$misconfiguredmodels = [];
|
||||
$data->models = array();
|
||||
foreach ($this->models as $model) {
|
||||
$modeldata = $model->export($output);
|
||||
@ -123,6 +116,10 @@ class models_list implements \renderable, \templatable {
|
||||
describe its purpose.", DEBUG_DEVELOPER);
|
||||
}
|
||||
|
||||
if ($model->invalid_timesplitting_selected()) {
|
||||
$misconfiguredmodels[$model->get_id()] = $model->get_name();
|
||||
}
|
||||
|
||||
// Check if there is a help icon for the indicators to show.
|
||||
if (!empty($modeldata->indicators)) {
|
||||
$indicators = array();
|
||||
@ -216,7 +213,9 @@ class models_list implements \renderable, \templatable {
|
||||
|
||||
$actionid = 'evaluate-' . $model->get_id();
|
||||
|
||||
$modeltimesplittingmethods = $timesplittingmethods;
|
||||
// Evaluation options.
|
||||
$modeltimesplittingmethods = $this->timesplittings_options_for_evaluation($model, $timesplittingsforevaluation);
|
||||
|
||||
// Include the current time-splitting method as the default selection method the model already have one.
|
||||
if ($model->get_model_obj()->timesplitting) {
|
||||
$currenttimesplitting = ['id' => 'current', 'text' => get_string('currenttimesplitting', 'tool_analytics')];
|
||||
@ -334,10 +333,10 @@ class models_list implements \renderable, \templatable {
|
||||
$data->models[] = $modeldata;
|
||||
}
|
||||
|
||||
$data->warnings = [];
|
||||
$data->infos = [];
|
||||
if (!$onlycli) {
|
||||
$data->warnings = array(
|
||||
(object)array('message' => get_string('bettercli', 'tool_analytics'), 'closebutton' => true)
|
||||
);
|
||||
$data->warnings[] = (object)array('message' => get_string('bettercli', 'tool_analytics'), 'closebutton' => true);
|
||||
} else {
|
||||
$url = new \moodle_url('/admin/settings.php', array('section' => 'analyticssettings'),
|
||||
'id_s_analytics_onlycli');
|
||||
@ -346,12 +345,43 @@ class models_list implements \renderable, \templatable {
|
||||
if (is_siteadmin()) {
|
||||
$langstrid = 'clievaluationandpredictions';
|
||||
}
|
||||
$data->infos = array(
|
||||
(object)array('message' => get_string($langstrid, 'tool_analytics', $url->out()),
|
||||
'closebutton' => true)
|
||||
);
|
||||
$data->infos[] = (object)array('message' => get_string($langstrid, 'tool_analytics', $url->out()),
|
||||
'closebutton' => true);
|
||||
}
|
||||
|
||||
if ($misconfiguredmodels) {
|
||||
$warningstr = get_string('invalidtimesplittinginmodels', 'tool_analytics', implode(', ', $misconfiguredmodels));
|
||||
$data->warnings[] = (object)array('message' => $warningstr, 'closebutton' => true);
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of time splitting methods that are available for evaluation.
|
||||
*
|
||||
* @param \core_analytics\model $model
|
||||
* @param array $timesplittingsforevaluation
|
||||
* @return array
|
||||
*/
|
||||
private function timesplittings_options_for_evaluation(\core_analytics\model $model,
|
||||
array $timesplittingsforevaluation): array {
|
||||
|
||||
$modeltimesplittingmethods = [
|
||||
['id' => 'all', 'text' => get_string('alltimesplittingmethods', 'tool_analytics')],
|
||||
];
|
||||
$potentialtimesplittingmethods = $model->get_potential_timesplittings();
|
||||
foreach ($timesplittingsforevaluation as $timesplitting) {
|
||||
if (empty($potentialtimesplittingmethods[$timesplitting->get_id()])) {
|
||||
// This time-splitting method can not be used for this model.
|
||||
continue;
|
||||
}
|
||||
$modeltimesplittingmethods[] = [
|
||||
'id' => \tool_analytics\output\helper::class_to_option($timesplitting->get_id()),
|
||||
'text' => $timesplitting->get_name()->out(),
|
||||
];
|
||||
}
|
||||
|
||||
return $modeltimesplittingmethods;
|
||||
}
|
||||
}
|
||||
|
@ -98,7 +98,10 @@ $string['insights'] = 'Insights';
|
||||
$string['invalidanalysables'] = 'Invalid site elements';
|
||||
$string['invalidanalysablesinfo'] = 'This page lists analysable elements that can\'t be used by this prediction model. The listed elements can\'t be used either to train the prediction model nor can the prediction model obtain predictions for them.';
|
||||
$string['invalidanalysablestable'] = 'Invalid site analysable elements table';
|
||||
$string['invalidindicatorsremoved'] = 'A new model has been added. Indicators that do not work with the selected target have been automatically removed.';
|
||||
$string['invalidcurrenttimesplitting'] = 'The current analysis interval is invalid for the target of this model. Please select a different interval.';
|
||||
$string['invalidindicatorsremoved'] = 'A new model has been added. Indicators that don\'t work with the selected target have been automatically removed.';
|
||||
$string['invalidtimesplitting'] = 'The selected analysis interval is invalid for the selected target.';
|
||||
$string['invalidtimesplittinginmodels'] = 'The analysis interval used by some of the models is invalid. Please select a different interval for the following models: {$a}';
|
||||
$string['invalidprediction'] = 'Invalid to get predictions';
|
||||
$string['invalidtraining'] = 'Invalid to train the model';
|
||||
$string['loginfo'] = 'Log extra info';
|
||||
|
@ -113,12 +113,18 @@ switch ($action) {
|
||||
case 'edit':
|
||||
confirm_sesskey();
|
||||
|
||||
$invalidcurrenttimesplitting = $model->invalid_timesplitting_selected();
|
||||
$potentialtimesplittings = $model->get_potential_timesplittings();
|
||||
|
||||
$customdata = array(
|
||||
'id' => $model->get_id(),
|
||||
'trainedmodel' => $model->is_trained(),
|
||||
'staticmodel' => $model->is_static(),
|
||||
'invalidcurrenttimesplitting' => (!empty($invalidcurrenttimesplitting)),
|
||||
'targetclass' => $model->get_target()->get_id(),
|
||||
'targetname' => $model->get_target()->get_name(),
|
||||
'indicators' => $model->get_potential_indicators(),
|
||||
'timesplittings' => \core_analytics\manager::get_all_time_splittings(),
|
||||
'timesplittings' => $potentialtimesplittings,
|
||||
'predictionprocessors' => \core_analytics\manager::get_all_prediction_processors()
|
||||
);
|
||||
$mform = new \tool_analytics\output\form\edit_model(null, $customdata);
|
||||
|
@ -84,6 +84,16 @@ abstract class base extends \core_analytics\calculable {
|
||||
*/
|
||||
abstract protected function calculate_sample($sampleid, \core_analytics\analysable $analysable, $starttime = false, $endtime = false);
|
||||
|
||||
/**
|
||||
* Can the provided time-splitting method be used on this target?.
|
||||
*
|
||||
* Time-splitting methods not matching the target requirements will not be selectable by models based on this target.
|
||||
*
|
||||
* @param \core_analytics\local\time_splitting\base $timesplitting
|
||||
* @return bool
|
||||
*/
|
||||
abstract public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting): bool;
|
||||
|
||||
/**
|
||||
* Is this target generating insights?
|
||||
*
|
||||
|
@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2017 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
abstract class accumulative_parts extends base {
|
||||
abstract class accumulative_parts extends base implements before_now {
|
||||
|
||||
/**
|
||||
* The number of parts to split the analysable duration in.
|
||||
|
37
analytics/classes/local/time_splitting/after_now.php
Normal file
37
analytics/classes/local/time_splitting/after_now.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Interface for time-splitting methods whose ranges' times are after time().
|
||||
*
|
||||
* @package core_analytics
|
||||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core_analytics\local\time_splitting;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Interface for time-splitting methods whose ranges' times are after time().
|
||||
*
|
||||
* @package core_analytics
|
||||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
interface after_now {
|
||||
}
|
37
analytics/classes/local/time_splitting/before_now.php
Normal file
37
analytics/classes/local/time_splitting/before_now.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Interface for time-splitting methods whose ranges' times are before time().
|
||||
*
|
||||
* @package core_analytics
|
||||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core_analytics\local\time_splitting;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Interface for time-splitting methods whose ranges' times are before time().
|
||||
*
|
||||
* @package core_analytics
|
||||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
interface before_now {
|
||||
}
|
@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2017 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
abstract class equal_parts extends base {
|
||||
abstract class equal_parts extends base implements before_now {
|
||||
|
||||
/**
|
||||
* Returns the number of parts the analyser duration should be split in.
|
||||
|
@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
abstract class upcoming_periodic extends periodic {
|
||||
abstract class upcoming_periodic extends periodic implements after_now {
|
||||
|
||||
/**
|
||||
* The next range indicator calculations should be based on upcoming dates.
|
||||
|
@ -238,7 +238,7 @@ class model {
|
||||
$indicators = \core_analytics\manager::get_all_indicators();
|
||||
|
||||
if (empty($this->analyser)) {
|
||||
$this->init_analyser(array('evaluation' => true));
|
||||
$this->init_analyser(array('notimesplitting' => true));
|
||||
}
|
||||
|
||||
foreach ($indicators as $classname => $indicator) {
|
||||
@ -281,15 +281,24 @@ class model {
|
||||
throw new \moodle_exception('errornotarget', 'analytics');
|
||||
}
|
||||
|
||||
$potentialtimesplittings = $this->get_potential_timesplittings();
|
||||
|
||||
$timesplittings = array();
|
||||
if (empty($options['notimesplitting'])) {
|
||||
if (!empty($options['evaluation'])) {
|
||||
// The evaluation process will run using all available time splitting methods unless one is specified.
|
||||
if (!empty($options['timesplitting'])) {
|
||||
$timesplitting = \core_analytics\manager::get_time_splitting($options['timesplitting']);
|
||||
|
||||
if (empty($potentialtimesplittings[$timesplitting->get_id()])) {
|
||||
throw new \moodle_exception('errorcannotusetimesplitting', 'analytics');
|
||||
}
|
||||
$timesplittings = array($timesplitting->get_id() => $timesplitting);
|
||||
} else {
|
||||
$timesplittings = \core_analytics\manager::get_time_splitting_methods_for_evaluation();
|
||||
$timesplittingsforevaluation = \core_analytics\manager::get_time_splitting_methods_for_evaluation();
|
||||
|
||||
// They both have the same objects, using $potentialtimesplittings as its items are sorted.
|
||||
$timesplittings = array_intersect_key($potentialtimesplittings, $timesplittingsforevaluation);
|
||||
}
|
||||
} else {
|
||||
|
||||
@ -327,6 +336,27 @@ class model {
|
||||
return \core_analytics\manager::get_time_splitting($this->model->timesplitting);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time-splitting methods that can be used by this model.
|
||||
*
|
||||
* @return \core_analytics\local\time_splitting\base[]
|
||||
*/
|
||||
public function get_potential_timesplittings() {
|
||||
|
||||
$timesplittings = \core_analytics\manager::get_all_time_splittings();
|
||||
uasort($timesplittings, function($a, $b) {
|
||||
return strcasecmp($a->get_name(), $b->get_name());
|
||||
});
|
||||
|
||||
foreach ($timesplittings as $key => $timesplitting) {
|
||||
if (!$this->get_target()->can_use_timesplitting($timesplitting)) {
|
||||
unset($timesplittings[$key]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return $timesplittings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new model. Enables it if $timesplittingid is specified.
|
||||
*
|
||||
@ -1769,6 +1799,26 @@ class model {
|
||||
has_capability('moodle/analytics:managemodels', \context_system::instance()), $displayname, $this->model->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the time-splitting method used by this model is invalid for this model.
|
||||
* @return bool
|
||||
*/
|
||||
public function invalid_timesplitting_selected(): bool {
|
||||
$currenttimesplitting = $this->model->timesplitting;
|
||||
if (empty($currenttimesplitting)) {
|
||||
// Not set is different from invalid. This function is used to identify invalid
|
||||
// time-splittings.
|
||||
return false;
|
||||
}
|
||||
|
||||
$potentialtimesplittings = $this->get_potential_timesplittings();
|
||||
if ($currenttimesplitting && empty($potentialtimesplittings[$currenttimesplitting])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the id from {analytics_predictions} db table to the prediction \stdClass objects.
|
||||
*
|
||||
|
@ -61,6 +61,16 @@ class test_static_target_shortname extends test_target_shortname {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Everything yep, this is just for testing.
|
||||
*
|
||||
* @param \core_analytics\local\time_splitting\base $timesplitting
|
||||
* @return bool
|
||||
*/
|
||||
public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting): bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Different analyser just to test a different one.
|
||||
*
|
||||
|
@ -91,6 +91,16 @@ class test_target_shortname extends \core_analytics\local\target\binary {
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Only past stuff.
|
||||
*
|
||||
* @param \core_analytics\local\time_splitting\base $timesplitting
|
||||
* @return bool
|
||||
*/
|
||||
public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting): bool {
|
||||
return ($timesplitting instanceof \core_analytics\local\time_splitting\before_now);
|
||||
}
|
||||
|
||||
/**
|
||||
* is_valid_analysable
|
||||
*
|
||||
|
@ -65,6 +65,16 @@ class test_target_site_users extends \core_analytics\local\target\binary {
|
||||
return 'test_site_users_analyser';
|
||||
}
|
||||
|
||||
/**
|
||||
* Everything yep, this is just for testing.
|
||||
*
|
||||
* @param \core_analytics\local\time_splitting\base $timesplitting
|
||||
* @return bool
|
||||
*/
|
||||
public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting): bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* classes_description
|
||||
*
|
||||
|
@ -94,7 +94,7 @@ class analytics_model_testcase extends advanced_testcase {
|
||||
$coursetrain1 = $this->getDataGenerator()->create_course(array('visible' => 1));
|
||||
$coursetrain2 = $this->getDataGenerator()->create_course(array('visible' => 1));
|
||||
|
||||
$this->model->enable('\core\analytics\time_splitting\no_splitting');
|
||||
$this->model->enable('\core\analytics\time_splitting\single_range');
|
||||
|
||||
$this->model->train();
|
||||
$this->model->predict();
|
||||
@ -139,7 +139,7 @@ class analytics_model_testcase extends advanced_testcase {
|
||||
$coursetrain1 = $this->getDataGenerator()->create_course(array('visible' => 1));
|
||||
$coursetrain2 = $this->getDataGenerator()->create_course(array('visible' => 1));
|
||||
|
||||
$this->model->enable('\core\analytics\time_splitting\no_splitting');
|
||||
$this->model->enable('\core\analytics\time_splitting\single_range');
|
||||
|
||||
$this->model->train();
|
||||
$this->model->predict();
|
||||
@ -494,6 +494,17 @@ class analytics_model_testcase extends advanced_testcase {
|
||||
$this->assertEquals($data->name['value'], '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests model::get_potential_timesplittings()
|
||||
*/
|
||||
public function test_potential_timesplittings() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$this->assertArrayNotHasKey('\core\analytics\time_splitting\no_splitting', $this->model->get_potential_timesplittings());
|
||||
$this->assertArrayHasKey('\core\analytics\time_splitting\single_range', $this->model->get_potential_timesplittings());
|
||||
$this->assertArrayHasKey('\core\analytics\time_splitting\quarters', $this->model->get_potential_timesplittings());
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a model log record.
|
||||
*/
|
||||
|
@ -6,6 +6,8 @@ information provided here is intended especially for developers.
|
||||
* "Time-splitting method" have been replaced by "Analysis interval" for the language strings that are
|
||||
displayed in the Moodle UI. The name of several time-splitting methods have been updated according
|
||||
to the new description of the field.
|
||||
* A new target::can_use_timesplitting method must be implemented to discard time-splitting methods that can not
|
||||
be used on a target.
|
||||
|
||||
=== 3.7 ===
|
||||
|
||||
|
@ -50,6 +50,16 @@ abstract class course_enrolments extends \core_analytics\local\target\binary {
|
||||
return '\core\analytics\analyser\student_enrolments';
|
||||
}
|
||||
|
||||
/**
|
||||
* Only past stuff.
|
||||
*
|
||||
* @param \core_analytics\local\time_splitting\base $timesplitting
|
||||
* @return bool
|
||||
*/
|
||||
public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting): bool {
|
||||
return ($timesplitting instanceof \core_analytics\local\time_splitting\before_now);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwritten to show a simpler language string.
|
||||
*
|
||||
|
@ -44,6 +44,16 @@ class no_teaching extends \core_analytics\local\target\binary {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* It requires a specific time-splitting method.
|
||||
*
|
||||
* @param \core_analytics\local\time_splitting\base $timesplitting
|
||||
* @return bool
|
||||
*/
|
||||
public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting): bool {
|
||||
return (get_class($timesplitting) === \core\analytics\time_splitting\single_range::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name.
|
||||
*
|
||||
|
@ -37,6 +37,7 @@ $string['defaultpredictoroption'] = 'Default processor ({$a})';
|
||||
$string['disabledmodel'] = 'Disabled model';
|
||||
$string['erroralreadypredict'] = 'File {$a} has already been used to generate predictions.';
|
||||
$string['errorcannotreaddataset'] = 'Dataset file {$a} cannot be read.';
|
||||
$string['errorcannotusetimesplitting'] = 'The provided analysis interval can\'t be used on this model.';
|
||||
$string['errorcannotwritedataset'] = 'Dataset file {$a} cannot be written.';
|
||||
$string['errorexportmodelresult'] = 'The machine learning model cannot be exported.';
|
||||
$string['errorimport'] = 'Error importing the provided JSON file.';
|
||||
|
@ -33,7 +33,8 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2016 David Monllao {@link http://www.davidmonllao.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class single_range extends \core_analytics\local\time_splitting\base {
|
||||
class single_range extends \core_analytics\local\time_splitting\base
|
||||
implements \core_analytics\local\time_splitting\before_now {
|
||||
|
||||
/**
|
||||
* Returns a lang_string object representing the name for the time spliting method.
|
||||
|
@ -54,6 +54,16 @@ class upcoming_activities_due extends \core_analytics\local\target\binary {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only upcoming stuff.
|
||||
*
|
||||
* @param \core_analytics\local\time_splitting\base $timesplitting
|
||||
* @return bool
|
||||
*/
|
||||
public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting): bool {
|
||||
return ($timesplitting instanceof \core_analytics\local\time_splitting\after_now);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name.
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user