From 44f1b701dbc22d02974315d20193c025d79e706b Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 19 Jan 2016 10:01:48 +0100 Subject: [PATCH] MDL-52809 wiki: New WS mod_wiki_get_subwikis --- lib/db/services.php | 1 + mod/wiki/classes/external.php | 75 ++++++++++++++++++++ mod/wiki/db/services.php | 8 +++ mod/wiki/locallib.php | 124 ++++++++++++++++++++++++++++++++++ mod/wiki/version.php | 2 +- version.php | 2 +- 6 files changed, 210 insertions(+), 2 deletions(-) diff --git a/lib/db/services.php b/lib/db/services.php index 25c193e9586..1d6b56f511e 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -1303,6 +1303,7 @@ $services = array( 'mod_wiki_get_wikis_by_courses', 'mod_wiki_view_wiki', 'mod_wiki_view_page', + 'mod_wiki_get_subwikis', 'mod_glossary_view_glossary', 'mod_glossary_view_entry', 'mod_glossary_get_entries_by_letter', diff --git a/mod/wiki/classes/external.php b/mod/wiki/classes/external.php index 0ce1096dbbb..1aa157efae0 100644 --- a/mod/wiki/classes/external.php +++ b/mod/wiki/classes/external.php @@ -320,4 +320,79 @@ class mod_wiki_external extends external_api { ); } + /** + * Describes the parameters for get_subwikis. + * + * @return external_function_parameters + * @since Moodle 3.1 + */ + public static function get_subwikis_parameters() { + return new external_function_parameters ( + array( + 'wikiid' => new external_value(PARAM_INT, 'Wiki instance ID.') + ) + ); + } + + /** + * Returns the list of subwikis the user can see in a specific wiki. + * + * @param int $wikiid The wiki instance ID. + * @return array Containing a list of warnings and a list of subwikis. + * @since Moodle 3.1 + */ + public static function get_subwikis($wikiid) { + global $USER; + + $warnings = array(); + + $params = self::validate_parameters(self::get_subwikis_parameters(), array('wikiid' => $wikiid)); + + // Get wiki instance. + if (!$wiki = wiki_get_wiki($params['wikiid'])) { + throw new moodle_exception('incorrectwikiid', 'wiki'); + } + + // Validate context and capabilities. + list($course, $cm) = get_course_and_cm_from_instance($wiki, 'wiki'); + $context = context_module::instance($cm->id); + self::validate_context($context); + require_capability('mod/wiki:viewpage', $context); + + $returnedsubwikis = wiki_get_visible_subwikis($wiki, $cm, $context); + foreach ($returnedsubwikis as $subwiki) { + $subwiki->canedit = wiki_user_can_edit($subwiki); + } + + $result = array(); + $result['subwikis'] = $returnedsubwikis; + $result['warnings'] = $warnings; + return $result; + } + + /** + * Describes the get_subwikis return value. + * + * @return external_single_structure + * @since Moodle 3.1 + */ + public static function get_subwikis_returns() { + return new external_single_structure( + array( + 'subwikis' => new external_multiple_structure( + new external_single_structure( + array( + 'id' => new external_value(PARAM_INT, 'Subwiki ID.'), + 'wikiid' => new external_value(PARAM_INT, 'Wiki ID.'), + 'groupid' => new external_value(PARAM_RAW, 'Group ID.'), + 'userid' => new external_value(PARAM_INT, 'User ID.'), + 'canedit' => new external_value(PARAM_BOOL, 'True if user can edit the subwiki.'), + ), 'Subwikis' + ) + ), + 'warnings' => new external_warnings(), + ) + ); + } + } diff --git a/mod/wiki/db/services.php b/mod/wiki/db/services.php index 46cf320d97b..e0ff4702fca 100644 --- a/mod/wiki/db/services.php +++ b/mod/wiki/db/services.php @@ -49,5 +49,13 @@ $functions = array( 'description' => 'Trigger the page viewed event and update the module completion status.', 'type' => 'write', 'capabilities' => 'mod/wiki:viewpage' + ), + + 'mod_wiki_get_subwikis' => array( + 'classname' => 'mod_wiki_external', + 'methodname' => 'get_subwikis', + 'description' => 'Returns the list of subwikis the user can see in a specific wiki.', + 'type' => 'read', + 'capabilities' => 'mod/wiki:viewpage' ) ); diff --git a/mod/wiki/locallib.php b/mod/wiki/locallib.php index 2ddbb83d854..474246d1cdb 100644 --- a/mod/wiki/locallib.php +++ b/mod/wiki/locallib.php @@ -1562,3 +1562,127 @@ function wiki_get_updated_pages_by_subwiki($swid) { function wiki_can_create_pages($context, $user = null) { return has_capability('mod/wiki:createpage', $context, $user); } + +/** + * Get a sub wiki instance by wiki id, group id and user id. + * If the wiki doesn't exist in DB it will return an isntance with id -1. + * + * @param int $wikiid Wiki ID. + * @param int $groupid Group ID. + * @param int $userid User ID. + * @return object Subwiki instance. + * @since Moodle 3.1 + */ +function wiki_get_possible_subwiki_by_group($wikiid, $groupid, $userid = 0) { + if (!$subwiki = wiki_get_subwiki_by_group($wikiid, $groupid, $userid)) { + $subwiki = new stdClass(); + $subwiki->id = -1; + $subwiki->wikiid = $wikiid; + $subwiki->groupid = $groupid; + $subwiki->userid = $userid; + } + return $subwiki; +} + +/** + * Get all the possible subwikis visible to the user in a wiki. + * It will return all the subwikis that can be created in a wiki, even if they don't exist in DB yet. + * + * @param stdClass $wiki Wiki to get the subwikis from. + * @param cm_info|stdClass $cm Optional. The course module object. + * @param context_module $context Optional. Context of wiki module. + * @return array List of subwikis. + * @since Moodle 3.1 + */ +function wiki_get_visible_subwikis($wiki, $cm = null, $context = null) { + global $USER; + + $subwikis = array(); + + if (empty($wiki) or !is_object($wiki)) { + // Wiki not valid. + return $subwikis; + } + + if (empty($cm)) { + $cm = get_coursemodule_from_instance('wiki', $wiki->id); + } + if (empty($context)) { + $context = context_module::instance($cm->id); + } + + if (!has_capability('mod/wiki:viewpage', $context)) { + return $subwikis; + } + + $manage = has_capability('mod/wiki:managewiki', $context); + + if (!$groupmode = groups_get_activity_groupmode($cm)) { + // No groups. + if ($wiki->wikimode == 'collaborative') { + // Only 1 subwiki. + $subwikis[] = wiki_get_possible_subwiki_by_group($wiki->id, 0, 0); + } else if ($wiki->wikimode == 'individual') { + // There's 1 subwiki per user. + if ($manage) { + // User can view all subwikis. + $users = get_enrolled_users($context); + foreach ($users as $user) { + $subwikis[] = wiki_get_possible_subwiki_by_group($wiki->id, 0, $user->id); + } + } else { + // User can only see his subwiki. + $subwikis[] = wiki_get_possible_subwiki_by_group($wiki->id, 0, $USER->id); + } + } + } else { + if ($wiki->wikimode == 'collaborative') { + // 1 subwiki per group. + $aag = has_capability('moodle/site:accessallgroups', $context); + if ($aag || $groupmode == VISIBLEGROUPS) { + // User can see all groups. + $allowedgroups = groups_get_all_groups($cm->course, 0, $cm->groupingid); + $allparticipants = new stdClass(); + $allparticipants->id = 0; + array_unshift($allowedgroups, $allparticipants); // Add all participants. + } else { + // User can only see the groups he belongs to. + $allowedgroups = groups_get_all_groups($cm->course, $USER->id, $cm->groupingid); + } + + foreach ($allowedgroups as $group) { + $subwikis[] = wiki_get_possible_subwiki_by_group($wiki->id, $group->id, 0); + } + } else if ($wiki->wikimode == 'individual') { + // 1 subwiki per user and group. + + if ($manage || $groupmode == VISIBLEGROUPS) { + // User can view all subwikis. + $users = get_enrolled_users($context); + foreach ($users as $user) { + // Get all the groups this user belongs to. + $groups = groups_get_all_groups($cm->course, $user->id); + if (!empty($groups)) { + foreach ($groups as $group) { + $subwikis[] = wiki_get_possible_subwiki_by_group($wiki->id, $group->id, $user->id); + } + } else { + // User doesn't belong to any group, add it to group 0. + $subwikis[] = wiki_get_possible_subwiki_by_group($wiki->id, 0, $user->id); + } + } + } else { + // The user can only see the subwikis of the groups he belongs. + $allowedgroups = groups_get_all_groups($cm->course, $USER->id, $cm->groupingid); + foreach ($allowedgroups as $group) { + $users = groups_get_members($group->id); + foreach ($users as $user) { + $subwikis[] = wiki_get_possible_subwiki_by_group($wiki->id, $group->id, $user->id); + } + } + } + } + } + + return $subwikis; +} diff --git a/mod/wiki/version.php b/mod/wiki/version.php index d82e96b62f4..dc729d4c8da 100644 --- a/mod/wiki/version.php +++ b/mod/wiki/version.php @@ -33,7 +33,7 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2016011100; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2016011101; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2015111000; // Requires this Moodle version $plugin->component = 'mod_wiki'; // Full name of the plugin (used for diagnostics) $plugin->cron = 0; diff --git a/version.php b/version.php index 4f06df6ce28..3c3754637e4 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2016022500.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2016022500.01; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. -- 2.43.0