diff --git a/classes/aggregator.php b/classes/aggregator.php index 4afc621..a079aec 100644 --- a/classes/aggregator.php +++ b/classes/aggregator.php @@ -194,7 +194,7 @@ abstract class aggregator { /** * Webservice structure for basic aggregator info * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ public static function basic_structure($value = VALUE_REQUIRED) { return new \external_single_structure([ diff --git a/classes/badgeinfo.php b/classes/badgeinfo.php index a5e50db..f5b35f2 100644 --- a/classes/badgeinfo.php +++ b/classes/badgeinfo.php @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . /** - * + * Handle badge information * @package local_treestudyplan * @copyright 2023 P.M. Kuipers * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -24,10 +24,22 @@ namespace local_treestudyplan; defined('MOODLE_INTERNAL') || die(); require_once($CFG->libdir.'/externallib.php'); +use \core_badges\badge; +/** + * Handle badge information in the same style as the other classes + */ class badgeinfo { - private $badge; // Holds database record. + /** + * Holds database record + * @var \core_badges\badge + */ + private $badge; + /** + * Maps badge status to strings + * @var array + */ private const STATUSINFO = [ BADGE_STATUS_INACTIVE => 'inactive', BADGE_STATUS_ACTIVE => 'active', @@ -35,6 +47,11 @@ class badgeinfo { BADGE_STATUS_ACTIVE_LOCKED => 'active', BADGE_STATUS_ARCHIVED => 'archived', ]; + + /** + * Maps badge status to locked or not + * @var array + */ private const LOCKEDINFO = [ BADGE_STATUS_INACTIVE => 0, BADGE_STATUS_ACTIVE => 0, @@ -43,8 +60,11 @@ class badgeinfo { BADGE_STATUS_ARCHIVED => 1, // We don't want to edit archived badges anyway.... . ]; - public function __construct(\core_badges\badge $badge) { - global $DB; + /** + * Construct new badgeinfo object + * @param badge $badge Badge object to use + */ + public function __construct(badge $badge) { $this->badge = $badge; } @@ -56,12 +76,22 @@ class badgeinfo { return $this->badge->name; } + /** + * Get the badge id from the badge name + * @param string $name Badge name + * @return int Badge id + */ public static function id_from_name($name) { global $DB; return $DB->get_field("badge", "id", ['name' => $name]); } + /** + * Check if a given badge exists + * @param int $id Badge id + * @return bool + */ public static function exists($id) { global $DB; return is_numeric($id) && $DB->record_exists('badge', array('id' => $id)); @@ -92,6 +122,7 @@ class badgeinfo { /** * Webservice model for editor info + * @param int[] $studentlist List of user id's to use for checking issueing progress within a study plan * @return array Webservice data model */ public function editor_model(array $studentlist = null) { @@ -197,6 +228,11 @@ class badgeinfo { return $badge; } + /** + * Count how many of the students in the array have this badge issued + * @param int[] $studentids List of user id's to check + * @return int + */ public function count_issued(array $studentids) { $issuecount = 0; diff --git a/classes/contextinfo.php b/classes/contextinfo.php index 5ffb405..9f42535 100644 --- a/classes/contextinfo.php +++ b/classes/contextinfo.php @@ -41,7 +41,7 @@ class contextinfo { /** * Describe the result for the webservice model * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ public static function structure($value = VALUE_REQUIRED) { return new \external_single_structure([ diff --git a/classes/courseinfo.php b/classes/courseinfo.php index 42c37a3..fea7c67 100644 --- a/classes/courseinfo.php +++ b/classes/courseinfo.php @@ -236,7 +236,7 @@ class courseinfo { /** * Webservice structure for basic info * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ public static function simple_structure($value = VALUE_REQUIRED) { return new \external_single_structure([ diff --git a/classes/gradeinfo.php b/classes/gradeinfo.php index bfabf58..a9d1f1b 100644 --- a/classes/gradeinfo.php +++ b/classes/gradeinfo.php @@ -145,7 +145,7 @@ class gradeinfo { /** * Get a specific course context from grade item id * @param int $id Grade item id - * @return context_course + * @return \context_course * @throws InvalidArgumentException if grade id is not found */ public static function get_coursecontext_by_id($id) : \context_course { @@ -251,7 +251,7 @@ class gradeinfo { /** * Webservice structure for editor info * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ /** * Webservice structure for editor info @@ -305,7 +305,7 @@ class gradeinfo { /** * Webservice structure for user info * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ /** * Webservice structure for userinfo diff --git a/classes/period.php b/classes/period.php index 735a976..e32fdd3 100644 --- a/classes/period.php +++ b/classes/period.php @@ -35,7 +35,7 @@ class period { * Holds database record * @var stdClass */ - private $r; // Holds database record. + private $r; /** @var int */ private $id; /** @var studyplanpage */ @@ -46,6 +46,11 @@ class period { } // Cache constructors to avoid multiple creation events in one session. + /** + * Find record in database and return management object + * @param int $id Id of database record + * @return self + */ public static function find_by_id($id): self { if (!array_key_exists($id, self::$cache)) { self::$cache[$id] = new self($id); @@ -123,6 +128,10 @@ class period { return self::$pagecache[$page->id()]; } + /** + * Construct new instance from DB record + * @param int $id Id of database record + */ private function __construct($id) { global $DB; $this->id = $id; @@ -166,10 +175,18 @@ class period { return $this->r->period; } + /** + * Start date + * @return \DateTime + */ public function startdate() { return new \DateTime($this->r->startdate); } + /** + * End date + * @return \DateTime + */ public function enddate() { if ($this->r->enddate && strlen($this->r->enddate) > 0) { return new \DateTime($this->r->enddate); diff --git a/classes/studentstudyplanservice.php b/classes/studentstudyplanservice.php index b4f1524..34aa37d 100644 --- a/classes/studentstudyplanservice.php +++ b/classes/studentstudyplanservice.php @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . /** - * + * Webservice class for retrieving student studyplans * @package local_treestudyplan * @copyright 2023 P.M. Kuipers * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -28,8 +28,14 @@ require_once($CFG->libdir.'/externallib.php'); use \local_treestudyplan\local\helpers\webservicehelper; require_once($CFG->libdir.'/badgeslib.php'); - +/** + * Webservice class for retrieving student studyplans + */ class studentstudyplanservice extends \external_api { + /** + * Capability required to view studyplans of other users + * @var string + */ const CAP_VIEWOTHER = "local/treestudyplan:viewuserreports"; /************************ * * @@ -57,7 +63,12 @@ class studentstudyplanservice extends \external_api { ); } - private static function list_user_studyplans($userid) { + /** + * Return overview of the studyplans for a specific user + * @param int $userid ID of user to check specific info for + * @return array + */ + public static function list_user_studyplans($userid) { global $CFG, $DB; $list = []; @@ -96,6 +107,12 @@ class studentstudyplanservice extends \external_api { studyplan::user_structure() ); } + + /** + * Get the full studyplans for a specific user + * @param int $userid ID of user to check specific info for + * @return array + */ public static function get_user_studyplans($userid) { global $CFG, $DB; @@ -136,6 +153,13 @@ class studentstudyplanservice extends \external_api { public static function get_user_studyplan_returns() { return studyplan::user_structure(); } + + /** + * Get a specific studyplan for a given user + * @param int $userid ID of user to check specific info for + * @param int $studyplanid ID of studyplan to view + * @return array + */ public static function get_user_studyplan($userid, $studyplanid) { global $CFG, $DB; @@ -174,6 +198,12 @@ class studentstudyplanservice extends \external_api { studyplan::user_structure() ); } + + /** + * Get studyplan based on invite key + * @param int $invitekey Invitation key + * @return array + */ public static function get_invited_studyplan($invitekey) { global $CFG, $DB; @@ -224,7 +254,11 @@ class studentstudyplanservice extends \external_api { ); } - private static function list_own_studyplans() { + /** + * Return overview of the studyplans the current user is linked to + * @return array + */ + public static function list_own_studyplans() { global $CFG, $DB, $USER; $userid = $USER->id; @@ -262,6 +296,11 @@ class studentstudyplanservice extends \external_api { ); } + /** + * Get all studyplans for current user or a specific one + * @param int $id Optional id of specific studyplan + * @return array + */ public static function get_own_studyplan($id = null) { global $USER; @@ -314,6 +353,11 @@ class studentstudyplanservice extends \external_api { ); } + /** + * Get all or one studyplan the current user is teaching in + * @param int $id Optional specific id of studyplan + * @return array + */ public static function get_teaching_studyplans($id = null) { global $CFG, $DB, $USER; $userid = $USER->id; diff --git a/classes/studyitem.php b/classes/studyitem.php index e6e58b6..136958f 100644 --- a/classes/studyitem.php +++ b/classes/studyitem.php @@ -42,14 +42,14 @@ class studyitem { * Holds database record * @var stdClass */ - private $r; // Holds database record. + private $r; /** @var int */ private $id; private $courseinfo = null; private $studyline; - /** @var aggragator[] */ - /** @var aggragator */ + /** @var aggregator[] */ + /** @var aggregator */ private $aggregator; @@ -69,6 +69,11 @@ class studyitem { return $this->r->conditions; } + /** + * Find record in database and return management object + * @param int $id Id of database record + * @return self + */ public static function find_by_id($id): self { if (!array_key_exists($id, self::$studyitemcache)) { self::$studyitemcache[$id] = new self($id); @@ -315,12 +320,16 @@ class studyitem { global $DB; foreach ($resequence as $sq) { - $DB->update_record(self::TABLE, [ - 'id' => $sq['id'], - 'line_id' => $sq['line_id'], - 'slot' => $sq['slot'], - 'layer' => $sq['layer'], - ]); + // Only change line_id if new line is within the same studyplan page + if ( studyitem::find_by_id($sq['id'])->studyline()->page()->id() == + studyline::find_by_id($sq['line_id'])->page()->id() ) { + $DB->update_record(self::TABLE, [ + 'id' => $sq['id'], + 'line_id' => $sq['line_id'], + 'slot' => $sq['slot'], + 'layer' => $sq['layer'], + ]); + } } return success::success(); diff --git a/classes/studyitemconnection.php b/classes/studyitemconnection.php index 86bb89a..3ce01fe 100644 --- a/classes/studyitemconnection.php +++ b/classes/studyitemconnection.php @@ -55,7 +55,7 @@ class studyitemconnection { /** * Webservice structure for basic info * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ public static function structure($value = VALUE_REQUIRED) { return new \external_single_structure([ diff --git a/classes/studyline.php b/classes/studyline.php index d650750..de1de40 100644 --- a/classes/studyline.php +++ b/classes/studyline.php @@ -51,7 +51,7 @@ class studyline { * Holds database record * @var stdClass */ - private $r; // Holds database record. + private $r; /** @var int */ private $id; /** @var studyplanpage */ @@ -76,6 +76,11 @@ class studyline { return $this->page; } + /** + * Find record in database and return management object + * @param int $id Id of database record + * @return self + */ public static function find_by_id($id): self { if (!array_key_exists($id, self::$studylinecache)) { self::$studylinecache[$id] = new self($id); @@ -83,6 +88,10 @@ class studyline { return self::$studylinecache[$id]; } + /** + * Construct new instance from DB record + * @param int $id Id of database record + */ private function __construct($id) { global $DB; $this->id = $id; diff --git a/classes/studyplan.php b/classes/studyplan.php index 4bca67b..3ec054f 100644 --- a/classes/studyplan.php +++ b/classes/studyplan.php @@ -35,10 +35,10 @@ class studyplan { * Holds database record * @var stdClass */ - private $r; // Holds database record. + private $r; /** @var int */ private $id; - /** @var aggragator */ + /** @var aggregator */ private $aggregator; private $context = null; // Hold context object once retrieved. private $linkeduserids = null; // Cache lookup of linked users (saves queries). @@ -50,6 +50,11 @@ class studyplan { } // Cache constructors to avoid multiple creation events in one session. + /** + * Find record in database and return management object + * @param int $id Id of database record + * @return self + */ public static function find_by_id($id): self { if (!array_key_exists($id, self::$studyplancache)) { self::$studyplancache[$id] = new self($id); @@ -57,6 +62,10 @@ class studyplan { return self::$studyplancache[$id]; } + /** + * Construct new instance from DB record + * @param int $id Id of database record + */ private function __construct($id) { global $DB; $this->id = $id; @@ -119,7 +128,7 @@ class studyplan { /** * Webservice structure for basic info * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ public static function simple_structure($value = VALUE_REQUIRED) { return new \external_single_structure([ @@ -546,6 +555,10 @@ class studyplan { return $newplan; } + /** + * Description of export structure for webservices + * @return \external_description + */ public static function export_structure() { return new \external_single_structure([ "format" => new \external_value(PARAM_TEXT, 'format of studyplan export'), diff --git a/classes/studyplanpage.php b/classes/studyplanpage.php index 2eb5434..3be1d30 100644 --- a/classes/studyplanpage.php +++ b/classes/studyplanpage.php @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . /** - * + * Studyplan page management class * @package local_treestudyplan * @copyright 2023 P.M. Kuipers * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -24,11 +24,18 @@ namespace local_treestudyplan; defined('MOODLE_INTERNAL') || die(); require_once($CFG->libdir.'/externallib.php'); - +/** + * Studyplan page management class + */ class studyplanpage { - /** @var string */ + /** + * Database table this class models for + * @var string */ const TABLE = "local_treestudyplan_page"; + /** + * Cache for finding previously loaded pages + * @var array */ private static $cache = []; /** @@ -41,11 +48,19 @@ class studyplanpage { /** @var studyplan*/ private $studyplan; - public function aggregator() { + /** + * Get aggregator for the studyplan (page) + * @return aggregator + */ + public function aggregator() : aggregator { return $this->studyplan->aggregator(); } - // Cache constructors to avoid multiple creation events in one session. + /** + * Find record in database and return management object + * @param int $id Id of database record + * @return self + */ public static function find_by_id($id): self { if (!array_key_exists($id, self::$cache)) { self::$cache[$id] = new self($id); @@ -53,6 +68,10 @@ class studyplanpage { return self::$cache[$id]; } + /** + * Construct new instance from DB record + * @param int $id Id of database record + */ private function __construct($id) { global $DB; $this->id = $id; @@ -68,6 +87,9 @@ class studyplanpage { return $this->id; } + /** + * Find studyplan for this page + */ public function studyplan() : studyplan { return $this->studyplan; } @@ -80,6 +102,9 @@ class studyplanpage { return $this->r->shortname; } + /** + * Numer of periods for this page + */ public function periods() { return $this->r->periods; } @@ -92,10 +117,18 @@ class studyplanpage { return $this->r->fullname; } + /** + * Start date + * @return \DateTime + */ public function startdate() { return new \DateTime($this->r->startdate); } + /** + * End date + * @return \DateTime + */ public function enddate() { if ($this->r->enddate && strlen($this->r->enddate) > 0) { return new \DateTime($this->r->enddate); @@ -109,7 +142,7 @@ class studyplanpage { /** * Webservice structure for basic info * @param int $value Webservice requirement constant - * @return external_single_structure Webservice output structure + * @return \external_description Webservice output structure */ public static function simple_structure($value = VALUE_REQUIRED) { return new \external_single_structure([ @@ -186,6 +219,11 @@ class studyplanpage { return $model; } + /** + * Add new study plan page + * @param mixed $fields Parameter for new study plan page + * @return self + */ public static function add($fields) { global $CFG, $DB; @@ -210,6 +248,11 @@ class studyplanpage { return self::find_by_id($id); // Make sure the new page is immediately cached. } + /** + * Edit studyplan page + * @param mixed $fields Parameters to change + * @return self + */ public function edit($fields) { global $DB; $editable = ['fullname', 'shortname', 'description', 'periods', 'startdate', 'enddate']; @@ -230,6 +273,11 @@ class studyplanpage { return $this; } + /** + * Delete study plan page + * @param bool $force Force deletion even if not empty + * @return success + */ public function delete($force = false) { global $DB; @@ -293,6 +341,11 @@ class studyplanpage { return $model; } + /** + * Find list of pages belonging to a specified study plan + * @param studyplan $plan Studyplan to search pages for + * @return self[] + */ public static function find_studyplan_children(studyplan $plan) { global $DB; $list = []; @@ -304,13 +357,24 @@ class studyplanpage { return $list; } - public static function duplicate_page($pageid, $name, $shortname) { + /** + * Duplicate a studyplan page + * @param int $pageid Id of the page to copy + * @param studyplan $newstudyplan Studyplan to copy the page into + * @return self + */ + public static function duplicate_page(int $pageid, studyplan $newstudyplan) { $ori = self::find_by_id($pageid); - $new = $ori->duplicate($name, $shortname); - return $new->simple_model(); + $new = $ori->duplicate($newstudyplan); + return $new; } - public function duplicate($newstudyplan) { + /** + * Duplicate this studyplan page + * @param studyplan $newstudyplan Studyplan to copy the page into + * @return self + */ + public function duplicate(studyplan $newstudyplan) { // First duplicate the studyplan structure. $new = self::add([ 'studyplan_id' => $newstudyplan->id(), @@ -345,6 +409,10 @@ class studyplanpage { return $new; } + /** + * Description of export structure for webservices + * @return \external_description + */ public static function export_structure() { return new \external_single_structure([ "format" => new \external_value(PARAM_TEXT, 'format of studyplan export'), @@ -352,6 +420,10 @@ class studyplanpage { ], 'Exported studyplan'); } + /** + * Export this page into a json model + * @return array + */ public function export_page() { $model = $this->export_model(); $json = json_encode([ @@ -362,6 +434,10 @@ class studyplanpage { return [ "format" => "application/json", "content" => $json]; } + /** + * Export this page into a csv model + * @return array + */ public function export_page_csv() { $plist = period::find_for_page($this); @@ -436,6 +512,10 @@ class studyplanpage { return [ "format" => "text/csv", "content" => $csv]; } + /** + * Export this page's studylines into a json model + * @return array + */ public function export_studylines() { $model = $this->export_studylines_model(); $json = json_encode([ @@ -446,6 +526,10 @@ class studyplanpage { return [ "format" => "application/json", "content" => $json]; } + /** + * Export this pages periods into a json model + * @return array + */ public function export_periods() { $model = period::page_model($this); $json = json_encode([ @@ -474,6 +558,10 @@ class studyplanpage { return $model; } + /** + * Export this pages periods into an array before serialization + * @return array + */ public function export_studylines_model() { $children = studyline::find_page_children($this); $lines = []; @@ -483,6 +571,11 @@ class studyplanpage { return $lines; } + /** + * Import periods from file contents + * @param string $content String + * @param string $format Format description + */ public function import_periods($content, $format = "application/json") { if ($format != "application/json") { return false; @@ -497,6 +590,11 @@ class studyplanpage { } } + /** + * Import studylines from file contents + * @param string $content String + * @param string $format Format description + */ public function import_studylines($content, $format = "application/json") { if ($format != "application/json") { return false; @@ -513,6 +611,11 @@ class studyplanpage { } } + /** + * Find a studyline in this page by its shortname + * @param string $shortname + * @return studyline|null + */ protected function find_studyline_by_shortname($shortname) { $children = studyline::find_page_children($this); foreach ($children as $l) { @@ -523,6 +626,10 @@ class studyplanpage { return null; } + /** + * Import periods from decoded array model + * @param array $model Decoded array + */ public function import_periods_model($model) { $periods = period::find_for_page($this); foreach ($model as $pmodel) { @@ -533,6 +640,10 @@ class studyplanpage { } } + /** + * Import studylines from decoded array model + * @param array $model Decoded array + */ public function import_studylines_model($model) { // First attempt to map each studyline model to an existing or new line. $linemap = []; diff --git a/classes/studyplanservice.php b/classes/studyplanservice.php index c2c1f9c..193cd61 100644 --- a/classes/studyplanservice.php +++ b/classes/studyplanservice.php @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . /** - * + * Webservice class for managing studyplans * @package local_treestudyplan * @copyright 2023 P.M. Kuipers * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later @@ -30,9 +30,19 @@ require_once($CFG->libdir.'/badgeslib.php'); require_once($CFG->libdir.'/gradelib.php'); require_once($CFG->dirroot.'/course/modlib.php'); +/** + * Webservice class for managing studyplans + */ class studyplanservice extends \external_api { - + /** + * Capability required to edit study plans + * @var string + */ const CAP_EDIT = "local/treestudyplan:editstudyplan"; + /** + * Capability required to view studyplans (for other users) + * @var string + */ const CAP_VIEW = "local/treestudyplan:viewuserreports"; /************************ @@ -59,6 +69,11 @@ class studyplanservice extends \external_api { return new \external_multiple_structure( studyplan::simple_structure() ); } + /** + * Get overview of all studyplans in a given context + * @param int $contextid Id of context to view (defaults to systemcontext) + * @return array + */ public static function list_studyplans($contextid = 0) { global $CFG, $DB; @@ -100,6 +115,11 @@ class studyplanservice extends \external_api { return studyplan::editor_structure(); } + /** + * Get editor model for specific studyplan + * @param int $id Id of studyplan + * @return array + */ public static function get_studyplan_map($id) { if (isset($id) && $id > 0) { $studyplan = studyplan::find_by_id($id); @@ -134,6 +154,11 @@ class studyplanservice extends \external_api { return new \external_multiple_structure( studyline::editor_structure() ); } + /** + * Get editor model for specific study line + * @param int $id ID of study line + * @return array + */ public static function get_studyline_map($id) { $o = studyline::find_by_id($id); @@ -174,6 +199,20 @@ class studyplanservice extends \external_api { return studyplan::simple_structure(); } + /** + * Add a new studyplan in a given context + * @param mixed $name + * @param mixed $shortname + * @param mixed $idnumber + * @param mixed $description + * @param mixed $periods + * @param mixed $startdate + * @param mixed $enddate + * @param string $aggregation + * @param string $aggregationconfig + * @param int $contextid + * @return array + */ public static function add_studyplan($name, $shortname, $idnumber, $description, $periods, $startdate, $enddate, $aggregation = "bistate", $aggregationconfig = '', $contextid = 0) { // Check if we have the proper rights for the requested context. @@ -229,6 +268,21 @@ class studyplanservice extends \external_api { return studyplan::simple_structure(); } + /** + * Edit studyplan parameters + * @param mixed $id + * @param mixed $name + * @param mixed $shortname + * @param mixed $idnumber + * @param mixed $description + * @param mixed $periods + * @param mixed $startdate + * @param mixed $enddate + * @param string $aggregation + * @param string $aggregationconfig + * @param int $contextid + * @return array + */ public static function edit_studyplan($id, $name, $shortname, $idnumber, $description, $periods, $startdate, $enddate, $aggregation = "bistate", $aggregationconfig = '', $contextid = 0) { // Validate access in the intended context. @@ -279,6 +333,12 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Delete a studyplan + * @param mixed $id Id of the studyplan + * @param bool $force Force deletion, even though studyplan is not empty + * @return array Succes/fail model + */ public static function delete_studyplan($id, $force = false) { $o = studyplan::find_by_id($id); // Validate if the requesting user has the right to edit the plan in it's current context. @@ -314,6 +374,15 @@ class studyplanservice extends \external_api { return studyline::editor_structure(); } + /** + * Add a new study line + * @param mixed $pageid + * @param mixed $name + * @param mixed $shortname + * @param mixed $color + * @param mixed $sequence + * @return array + */ public static function add_studyline($pageid, $name, $shortname, $color, $sequence) { // Validate if the requesting user has the right to edit the plan in it's current context. $page = studyplanpage::find_by_id($pageid); @@ -356,6 +425,14 @@ class studyplanservice extends \external_api { return studyline::editor_structure(); } + /** + * Edit studyline parameters + * @param mixed $id + * @param mixed $name + * @param mixed $shortname + * @param mixed $color + * @return [type] + */ public static function edit_studyline($id, $name, $shortname, $color) { $o = studyline::find_by_id($id); // Validate if the requesting user has the right to edit the plan in it's current context. @@ -393,12 +470,17 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Delete a study line + * @param mixed $id Id of the studyline + * @return array Success/fail model + * + */ public static function delete_studyline($id) { $o = studyline::find_by_id($id); // Validate if the requesting user has the right to edit the plan in it's current context. webservicehelper::require_capabilities(self::CAP_EDIT, $o->context()); return $o->delete()->model(); - } /************************ @@ -430,6 +512,11 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Reorder study lines + * @param int[] $resequence New order of study lines by id + * @return [type] + */ public static function reorder_studylines($resequence) { // Validate if the requesting user has the right to edit the lines in it's current context. foreach ($resequence as $sq) { @@ -468,6 +555,11 @@ class studyplanservice extends \external_api { return studyitem::editor_structure(); } + /** + * Get editor model for study item + * @param mixed $id ID of study item + * @return array + */ public static function get_studyitem($id) { $o = studyitem::find_by_id($id); webservicehelper::require_capabilities([self::CAP_EDIT, self::CAP_VIEW], $o->context()); @@ -509,6 +601,15 @@ class studyplanservice extends \external_api { return studyitem::editor_structure(); } + /** + * Add a new study item + * @param int $lineid + * @param string $type + * @param array $details + * @param int $slot + * @param int $layer + * @return array + */ public static function add_studyitem($lineid, $type, $details, $slot = -1, $layer = 0) { webservicehelper::require_capabilities(self::CAP_EDIT, studyline::find_by_id($lineid)->context()); @@ -551,6 +652,13 @@ class studyplanservice extends \external_api { return studyitem::editor_structure(); } + /** + * Edit study item paremeters + * @param mixed $id Id of studt item + * @param mixed $conditions Conditions related to item (filters only) + * @param bool $continuationid Link to previous filter item to copy result from (not used) + * @return array + */ public static function edit_studyitem($id, $conditions, $continuationid = false) { $o = studyitem::find_by_id($id); @@ -599,6 +707,11 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Reposition study items in line, layer and/or slot + * @param mixed $resequence Array of item info [id, line_id, slot, layer] + * @return array Success/fail model + */ public static function reorder_studyitems($resequence) { // Check for permissions to modify the studyplan. foreach ($resequence as $sq) { @@ -632,6 +745,11 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Delete a studyitem + * @param mixed $id Id of study item to delete + * @return array Success/fail model + */ public static function delete_studyitem($id) { $o = studyitem::find_by_id($id); webservicehelper::require_capabilities(self::CAP_EDIT, $o->context()); @@ -664,6 +782,12 @@ class studyplanservice extends \external_api { return studyitemconnection::structure(); } + /** + * Connect two studylines + * @param mixed $fromid Originating item + * @param mixed $toid Target item + * @return array Success/fail model + */ public static function connect_studyitems($fromid, $toid) { // Validate permissions. webservicehelper::require_capabilities(self::CAP_EDIT, studyitem::find_by_id($fromid)->context()); @@ -698,6 +822,12 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Disconnect two studylines + * @param mixed $fromid Originating item + * @param mixed $toid Target item + * @return array Success/fail model + */ public static function disconnect_studyitems($fromid, $toid) { // Validate permissions. webservicehelper::require_capabilities(self::CAP_EDIT, studyitem::find_by_id($fromid)->context()); @@ -727,6 +857,10 @@ class studyplanservice extends \external_api { return new \external_multiple_structure(badgeinfo::editor_structure()); } + /** + * List all available badges to drag into a studyplan page + * @return array + */ public static function list_badges() { $systemcontext = webservicehelper::system_context(); @@ -770,6 +904,16 @@ class studyplanservice extends \external_api { return success::structure(); } + + /** + * Mark a gradable item for inclusion in the studyplan + * @param mixed $gradeid Id of gradable + * @param mixed $itemid Id of study item + * @param bool $include Include grade or not + * @param bool $required Mark grade as required or not + * @return array Success/Fail model + * + */ public static function include_grade($gradeid, $itemid, $include, $required = false) { global $USER; @@ -810,6 +954,10 @@ class studyplanservice extends \external_api { return aggregator::list_structure(); } + /** + * List available aggregators + * @return array + */ public static function list_aggregators() { return aggregator::list_model(); @@ -847,7 +995,13 @@ class studyplanservice extends \external_api { ])); } - public static function force_studyplan_scale($studyplanid, $scaleid) { + /** + * Force all gradables in the studyplan to the same scale item + * @param int $studyplanid Id of studyplan + * @param int $scaleid Id of scale to use + * @return array + */ + public static function force_studyplan_scale($studyplanid, $scaleid) { global $DB; $dbman = $DB->get_manager(); @@ -967,6 +1121,10 @@ class studyplanservice extends \external_api { ])); } + /** + * List available scales + * @return array + */ public static function list_scales() { global $DB; $list = []; @@ -1007,6 +1165,11 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Disable automatic end date for all courses in a study plan + * @param int $studyplanid Id of the studyplan + * @return array Success/fail model + */ public static function disable_autoenddate($studyplanid) { global $DB; @@ -1060,6 +1223,13 @@ class studyplanservice extends \external_api { return studyplan::simple_structure(); } + /** + * Duplicate a studyplan into a new one + * @param mixed $studyplanid Id of the plan to duplicate + * @param mixed $name New fullname + * @param mixed $shortname New shortname + * @return array + */ public static function duplicate_plan($studyplanid, $name, $shortname) { // Validate permissions. webservicehelper::require_capabilities(self::CAP_EDIT, studyplan::find_by_id($studyplanid)->context()); @@ -1092,6 +1262,13 @@ class studyplanservice extends \external_api { return studyplan::export_structure(); } + + /** + * Export studyplan + * @param mixed $studyplanid Id of studyplan to export + * @param string $format Export format [csv, json (default)] + * @return array + */ public static function export_plan($studyplanid, $format = "json") { try { // Validate permissions. @@ -1127,9 +1304,12 @@ class studyplanservice extends \external_api { return studyplan::export_structure(); } + /** + * Export studylines for a studyplan + * @param mixed $studyplanid Id of the studyplan to export the studylines for + * @return array + */ public static function export_studylines($studyplanid) { - $systemcontext = webservicehelper::system_context(); - try { webservicehelper::require_capabilities(self::CAP_EDIT, studyplan::find_by_id($studyplanid)->context()); $plan = studyplan::find_by_id($studyplanid); @@ -1165,6 +1345,13 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Import studyplan from file + * @param string $content Content of file + * @param string $format Format of file + * @param int $contextid ID of context to import to + * @return array Success/fail model + */ public static function import_plan($content, $format = "application/json", $contextid = 1) { try { @@ -1199,8 +1386,14 @@ class studyplanservice extends \external_api { return success::structure(); } + /** + * Import studylines into existing studtplan + * @param int $studyplanid ID of studyplan to import to + * @param string $content Content of file + * @param string $format Format of file + * @return array Success/fail model + */ public static function import_studylines($studyplanid, $content, $format = "application/json") { - try { $plan = studyplan::find_by_id($studyplanid); // Validate import context. @@ -1241,7 +1434,13 @@ class studyplanservice extends \external_api { return success::structure(); } - /** DEPRECATED, will remove hacked edit form in the future */ + /** + * Submit hacked course activity edit form to edit just name and description + * @deprecated will remove hacked edit form in the future + * @param mixed $cmid + * @param mixed $formdata + * @return array Success/fail structure + */ public static function submit_cm_editform($cmid, $formdata) { global $CFG; global $DB; @@ -1329,6 +1528,15 @@ class studyplanservice extends \external_api { return period::structure(); } + /** + * Edit period information + * @param mixed $id + * @param mixed $fullname + * @param mixed $shortname + * @param mixed $startdate + * @param mixed $enddate + * @return array + */ public static function edit_period($id, $fullname, $shortname, $startdate, $enddate) { $p = period::find_by_id($id); @@ -1370,6 +1578,13 @@ class studyplanservice extends \external_api { return courseinfo::editor_structure(); } + /** + * Match course start/end to period start/end times + * @param mixed $periodid + * @param mixed $courseid + * @param int $span + * @return array + */ public static function course_period_timing($periodid, $courseid, $span = 1) { global $DB; $period = period::find_by_id($periodid); @@ -1442,6 +1657,12 @@ class studyplanservice extends \external_api { return studyitem::editor_structure(); } + /** + * Set studyitem span to one or more periods + * @param mixed $id + * @param null $span + * @return array + */ public static function set_studyitem_span($id, $span = null) { $o = studyitem::find_by_id($id); webservicehelper::require_capabilities(self::CAP_EDIT, $o->context()); diff --git a/classes/success.php b/classes/success.php index b9d801d..d4d0158 100644 --- a/classes/success.php +++ b/classes/success.php @@ -68,7 +68,7 @@ class success { /** * Describe the result for the webservice model - * @return external_single_structure + * @return \external_description */ public static function structure() { return new \external_single_structure([