AutorÃa | Ultima modificación | Ver Log |
<?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/>.
namespace gradepenalty_duedate;
use context;
use context_system;
use core\lang_string;
use core\persistent;
/**
* To create/load/update/delete penalty rules.
*
* @package gradepenalty_duedate
* @copyright 2024 Catalyst IT Australia Pty Ltd
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class penalty_rule extends persistent {
/** The table name this persistent object maps to. */
const TABLE = 'gradepenalty_duedate_rule';
/**
* Return the definition of the properties of this model.
*/
protected static function define_properties(): array {
return [
'contextid' => [
'type' => PARAM_INT,
'null' => NULL_NOT_ALLOWED,
],
'overdueby' => [
'type' => PARAM_INT,
'null' => NULL_NOT_ALLOWED,
],
'penalty' => [
'type' => PARAM_FLOAT,
'null' => NULL_NOT_ALLOWED,
],
'sortorder' => [
'type' => PARAM_INT,
'null' => NULL_NOT_ALLOWED,
'default' => 0,
],
];
}
/**
* Validate the overdueby before saving.
*
* @param int $value overdueby value.
* @return true|lang_string error message if overdueby is invalid.
*/
protected function validate_overdueby($value): bool|lang_string {
if ($value < constants::OVERDUEBY_MIN) {
return new lang_string('error_overdueby_minvalue', 'gradepenalty_duedate', constants::OVERDUEBY_MIN);
}
return true;
}
/**
* Validate the penalty before saving.
*
* @param int $value penalty value.
* @return true|lang_string error message if penalty is invalid.
*/
protected function validate_penalty($value): bool|lang_string {
if ($value < constants::PENALTY_MIN) {
return new lang_string('error_penalty_minvalue', 'gradepenalty_duedate', constants::PENALTY_MIN);
} else if ($value > constants::PENALTY_MAX) {
return new lang_string('error_penalty_maxvalue', 'gradepenalty_duedate', constants::PENALTY_MAX);
}
return true;
}
/**
* Get the penalty rules for a context.
* If not found, it will get the rules from the parent context.
*
* @param int $contextid context id
* @return array penalty_rule records.
*/
public static function get_rules(int $contextid): array {
$rules = [];
$currentcontext = context::instance_by_id($contextid);
while (empty($rules) && $currentcontext) {
$rules = self::get_records(['contextid' => $currentcontext->id], 'sortorder');
$currentcontext = $currentcontext->get_parent_context();
}
return $rules;
}
/**
* Reset rules for a context.
* Delete all rules for the context.
*
* @param int $contextid context id.
* @return void
*/
public static function reset_rules(int $contextid): void {
// Get rules for the context.
$rules = self::get_records(['contextid' => $contextid]);
// Delete all rules.
foreach ($rules as $rule) {
$rule->delete();
}
// Check if it is system context, create a default rule.
if ($contextid == context_system::instance()->id) {
$rule = new penalty_rule();
$rule->set('contextid', $contextid);
$rule->set('overdueby', 1);
$rule->set('penalty', 0);
$rule->set('sortorder', 0);
$rule->save();
}
}
/**
* Check if rules are overridden in a context.
*
* @param int $contextid context id.
* @return bool true if rules are overridden.
*/
public static function is_overridden(int $contextid): bool {
// Exclude system context.
if ($contextid == context_system::instance()->id) {
return false;
}
$rules = self::get_records(['contextid' => $contextid]);
// If there is no rules in parent contexts, still consider they are overridden.
return count($rules) > 0;
}
/**
* Check if the rules are inherited from the parent context.
*
* @param int $contextid context id.
* @return bool true if rules are inherited.
*/
public static function is_inherited(int $contextid): bool {
// Exclude system context.
if ($contextid == context_system::instance()->id) {
return false;
}
$rules = self::get_records(['contextid' => $contextid]);
$parentrules = self::get_rules($contextid);
return count($rules) == 0 && count($parentrules) > 0;
}
}