MDL-51506 tool_lp: Migrating plan to new model API

This commit is contained in:
Frederic Massart
2016-04-18 10:58:34 +08:00
parent cda17bd961
commit 5af3778e13
4 changed files with 90 additions and 261 deletions
+7 -8
View File
@@ -1127,8 +1127,7 @@ class api {
$params['statusdraft'] = plan::STATUS_DRAFT;
}
$plans = new plan();
return $plans->get_records_select($select, $params, 'timemodified DESC');
return plan::get_records_select($select, $params, 'timemodified DESC');
}
/**
@@ -1163,7 +1162,7 @@ class api {
}
$plan = new plan(0, $record);
$id = $plan->create();
$plan->create();
return $plan;
}
@@ -1189,13 +1188,13 @@ class api {
throw new required_capability_exception($context, 'tool/lp:planmanageall', 'nopermissions', '');
}
$current = new plan($record->id);
$plan = new plan($record->id);
// We don't allow users without planmanage and without
// planmanageown to edit plans that other users modified.
if (!$manageplans && !$manageownplan && $USER->id != $current->get_usermodified()) {
if (!$manageplans && !$manageownplan && $USER->id != $plan->get_usermodified()) {
throw new \moodle_exception('erroreditingmodifiedplan', 'tool_lp');
} else if (!$manageplans && $USER->id != $current->get_userid()) {
} else if (!$manageplans && $USER->id != $plan->get_userid()) {
throw new required_capability_exception($context, 'tool/lp:planmanageall', 'nopermissions', '');
}
@@ -1204,7 +1203,7 @@ class api {
throw new required_capability_exception($context, 'tool/lp:planmanageown', 'nopermissions', '');
}
$plan = new plan($record->id, $record);
$plan->from_record($record);
return $plan->update();
}
@@ -1227,7 +1226,7 @@ class api {
}
// We require any of these capabilities to retrieve draft plans.
if ($plan->get_status() === plan::STATUS_DRAFT &&
if ($plan->get_status() == plan::STATUS_DRAFT &&
!has_any_capability(array('tool/lp:planmanageown', 'tool/lp:planmanageall', 'tool/lp:plancreatedraft'), $context)) {
// Exception about plancreatedraft as it is the one that is closer to basic users.
throw new required_capability_exception($context, 'tool/lp:plancreatedraft', 'nopermissions', '');
+12 -3
View File
@@ -3291,7 +3291,10 @@ class external extends external_api {
$params = (object) $params;
$result = api::create_plan($params);
return external_api::clean_returnvalue(self::create_plan_returns(), $result->to_record());
$record = $result->to_record();
$record->statusname = $result->get_statusname();
$record->usercanupdate = $result->can_update();
return external_api::clean_returnvalue(self::create_plan_returns(), $record);
}
/**
@@ -3404,7 +3407,10 @@ class external extends external_api {
$params = (object) $params;
$result = api::update_plan($params);
return external_api::clean_returnvalue(self::update_plan_returns(), $result->to_record());
$record = $result->to_record();
$record->statusname = $result->get_statusname();
$record->usercanupdate = $result->can_update();
return external_api::clean_returnvalue(self::update_plan_returns(), $record);
}
/**
@@ -3451,7 +3457,10 @@ class external extends external_api {
));
$result = api::read_plan($params['id']);
return external_api::clean_returnvalue(self::read_plan_returns(), $result->to_record());
$record = $result->to_record();
$record->statusname = $result->get_statusname();
$record->usercanupdate = $result->can_update();
return external_api::clean_returnvalue(self::read_plan_returns(), $record);
}
/**
+4 -1
View File
@@ -86,7 +86,10 @@ class plans_page implements renderable, templatable {
$data->plans = array();
if ($this->plans) {
foreach ($this->plans as $plan) {
$data->plans[] = $plan->to_record();
$record = $plan->to_record();
$record['statusname'] = $plan->get_statusname();
$record['usercanupdate'] = $plan->can_update();
$data->plans[] = $record;
}
}
+67 -249
View File
@@ -23,8 +23,9 @@
*/
namespace tool_lp;
use stdClass;
use context_user;
use dml_missing_record_exception;
use lang_string;
/**
* Class for loading/storing plans from the DB.
@@ -34,6 +35,8 @@ use context_user;
*/
class plan extends persistent {
const TABLE = 'tool_lp_plan';
/** Draft status */
const STATUS_DRAFT = 0;
@@ -43,174 +46,75 @@ class plan extends persistent {
/** Complete status */
const STATUS_COMPLETE = 2;
/** @var string $name Name */
private $name = '';
/** @var string $description Description for this learning plan */
private $description = '';
/** @var int $descriptionformat Format for the description */
private $descriptionformat = FORMAT_MOODLE;
/** @var int $userid */
private $userid = null;
/** @var bool $templateid */
private $templateid = null;
/** @var bool $status The plan status, one of the 3 \tool_lp\plan:STATUS_* constants */
private $status = null;
/** @var bool $duedate */
private $duedate = null;
/**
* Method that provides the table name matching this class.
* Return the definition of the properties of this model.
*
* @return string
* @return array
*/
public function get_table_name() {
return 'tool_lp_plan';
protected static function define_properties() {
return array(
'name' => array(
'type' => PARAM_TEXT,
),
'description' => array(
'type' => PARAM_TEXT,
'default' => ''
),
'descriptionformat' => array(
'choices' => array(FORMAT_HTML, FORMAT_MOODLE, FORMAT_PLAIN, FORMAT_MARKDOWN),
'type' => PARAM_INT,
'default' => FORMAT_HTML,
),
'userid' => array(
'type' => PARAM_INT,
),
'templateid' => array(
'type' => PARAM_INT,
'default' => null,
'null' => NULL_ALLOWED,
),
'status' => array(
'choices' => array(self::STATUS_DRAFT, self::STATUS_COMPLETE, self::STATUS_ACTIVE),
'type' => PARAM_INT,
'default' => self::STATUS_DRAFT,
),
'duedate' => array(
'type' => PARAM_INT,
'default' => 0,
),
);
}
/**
* Getter method.
* Whether the current user can update the learning plan.
*
* @return string
* @return bool|null
*/
public function get_name() {
return $this->name;
}
public function can_update() {
global $USER;
/**
* Setter method.
*
* @param string $value value of the field.
* @return string
*/
public function set_name($value) {
$this->name = $value;
}
/**
* Getter method.
*
* @return string
*/
public function get_description() {
return $this->description;
}
/**
* Setter method.
*
* @param string $value value of the field.
* @return string
*/
public function set_description($value) {
$this->description = $value;
}
/**
* Getter method.
*
* @return string
*/
public function get_descriptionformat() {
return $this->descriptionformat;
}
/**
* Setter method.
*
* @param int $value value of the field.
* @return string
*/
public function set_descriptionformat($value) {
$this->descriptionformat = $value;
}
/**
* Getter method.
*
* @return string
*/
public function get_userid() {
return $this->userid;
}
/**
* Setter method.
*
* @param int $value value of the field.
* @return string
*/
public function set_userid($value) {
$this->userid = $value;
}
/**
* Getter method.
*
* @return string
*/
public function get_templateid() {
return $this->templateid;
}
/**
* Setter method.
*
* @param int $value value of the field.
* @return string
*/
public function set_templateid($value) {
$this->templateid = $value;
}
/**
* Getter method.
*
* @return string
*/
public function get_status() {
if ($this->status === null) {
// Null if the record has not been filled.
if (!$userid = $this->get_userid()) {
return null;
}
return (int)$this->status;
$context = context_user::instance($userid);
// Not all users can edit all plans, the template should know about it.
if (has_capability('tool/lp:planmanageall', $context) ||
has_capability('tool/lp:planmanageown', $context)) {
return true;
}
// The user that created the template can also edit it if he was the last one that modified it. But
// can't do it if it is already completed.
if ($USER->id == $userid && $this->get_usermodified() == $USER->id && $this->get_status() != self::STATUS_COMPLETE) {
return true;
}
return false;
}
/**
* Setter method.
*
* @param string $value value of the field.
* @return string
*/
public function set_status($value) {
$this->status = $value;
}
/**
* Getter method.
*
* @return string
*/
public function get_duedate() {
return $this->duedate;
}
/**
* Setter method.
*
* @param string $value value of the field.
* @return string
*/
public function set_duedate($value) {
$this->duedate = $value;
}
// Extra methods.
/**
* Human readable status name.
*
@@ -239,105 +143,19 @@ class plan extends persistent {
}
/**
* Whether the current user can update the learning plan.
* Validate the template ID.
*
* @return bool
* @param mixed $value The value.
* @return true|lang_string
*/
public function get_usercanupdate() {
global $USER;
protected function validate_templateid($value) {
// Null if the record has not been filled.
if (!$userid = $this->get_userid()) {
return null;
// Checks that the template exists.
if (!empty($value) && !template::record_exists($value)) {
return new lang_string('invaliddata', 'error');
}
$context = context_user::instance($userid);
// Not all users can edit all plans, the template should know about it.
if (has_capability('tool/lp:planmanageall', $context) ||
has_capability('tool/lp:planmanageown', $context)) {
return true;
}
// The user that created the template can also edit it if he was the last one that modified it. But
// can't do it if it is already completed.
if ($USER->id == $userid && $this->get_usermodified() == $USER->id && $this->get_status() != self::STATUS_COMPLETE) {
return true;
}
return false;
return true;
}
/**
* Converts the object to a standard PHP object.
*
* If it is used to insert/update into DB the extra fields like statusname will be
* ignored, they are useful though when passing the object to templates.
*
* @return \stdClass
*/
public function to_record() {
$record = new stdClass();
$record->id = $this->get_id();
$record->name = $this->get_name();
$record->description = $this->get_description();
$record->descriptionformat = $this->get_descriptionformat();
$record->userid = $this->get_userid();
$record->templateid = $this->get_templateid();
$record->status = $this->get_status();
$record->duedate = $this->get_duedate();
$record->timecreated = $this->get_timecreated();
$record->timemodified = $this->get_timemodified();
$record->usermodified = $this->get_usermodified();
// Extra data.
$record->statusname = $this->get_statusname();
$record->usercanupdate = $this->get_usercanupdate();
return $record;
}
/**
* Get plan object from record.
*
* @param stdClass $record
* @return plan
*/
public function from_record($record) {
if (isset($record->id)) {
$this->set_id($record->id);
}
if (isset($record->name)) {
$this->set_name($record->name);
}
if (isset($record->description)) {
$this->set_description($record->description);
}
if (isset($record->descriptionformat)) {
$this->set_descriptionformat($record->descriptionformat);
}
if (isset($record->userid)) {
$this->set_userid($record->userid);
}
if (isset($record->templateid)) {
$this->set_templateid($record->templateid);
}
if (isset($record->status)) {
$this->set_status($record->status);
}
if (isset($record->duedate)) {
$this->set_duedate($record->duedate);
}
if (isset($record->timecreated)) {
$this->set_timecreated($record->timecreated);
}
if (isset($record->timemodified)) {
$this->set_timemodified($record->timemodified);
}
if (isset($record->usermodified)) {
$this->set_usermodified($record->usermodified);
}
}
}