From 75af28c73fa19174cdd3f8a9ff1c77f10b7096af Mon Sep 17 00:00:00 2001 From: Simey Lameze Date: Tue, 6 Aug 2019 09:46:50 +0800 Subject: [PATCH] MDL-9469 mod_forum: add exportforum capability and checks Part of MDL-66075 --- mod/forum/classes/local/managers/capability.php | 10 ++++++++++ mod/forum/db/access.php | 11 +++++++++++ mod/forum/export.php | 3 +++ mod/forum/lang/en/forum.php | 1 + mod/forum/lib.php | 12 ++++++++++-- mod/forum/version.php | 2 +- 6 files changed, 36 insertions(+), 3 deletions(-) diff --git a/mod/forum/classes/local/managers/capability.php b/mod/forum/classes/local/managers/capability.php index ece049e94f0..b1fd17f886f 100644 --- a/mod/forum/classes/local/managers/capability.php +++ b/mod/forum/classes/local/managers/capability.php @@ -633,4 +633,14 @@ class capability { return $canstart; } + + /** + * Checks whether the user can export the whole forum (discussions and posts). + * + * @param stdClass $user The user object. + * @return bool True if the user can export the forum or false otherwise. + */ + public function can_export_forum(stdClass $user) : bool { + return has_capability('mod/forum:exportforum', $this->get_context(), $user); + } } diff --git a/mod/forum/db/access.php b/mod/forum/db/access.php index 3a5733c33df..0a9e7221fbf 100644 --- a/mod/forum/db/access.php +++ b/mod/forum/db/access.php @@ -328,6 +328,17 @@ $capabilities = array( 'manager' => CAP_ALLOW ) ), + 'mod/forum:exportforum' => array( + 'riskbitmask' => RISK_PERSONAL, + + 'captype' => 'read', + 'contextlevel' => CONTEXT_MODULE, + 'archetypes' => array( + 'teacher' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'manager' => CAP_ALLOW, + ) + ), 'mod/forum:exportpost' => array( 'riskbitmask' => RISK_PERSONAL, diff --git a/mod/forum/export.php b/mod/forum/export.php index 0650d57c2bc..8725fc72dbd 100644 --- a/mod/forum/export.php +++ b/mod/forum/export.php @@ -42,6 +42,9 @@ if (empty($forum)) { } $capabilitymanager = $managerfactory->get_capability_manager($forum); +if (!$capabilitymanager->can_export_forum($USER)) { + throw new moodle_exception('cannotexportforum', 'forum'); +} $course = $forum->get_course_record(); $coursemodule = $forum->get_course_module_record(); diff --git a/mod/forum/lang/en/forum.php b/mod/forum/lang/en/forum.php index ad44b4b6481..6f2a498793b 100644 --- a/mod/forum/lang/en/forum.php +++ b/mod/forum/lang/en/forum.php @@ -66,6 +66,7 @@ $string['cannotcreateinstanceforteacher'] = 'Could not create new course module $string['cannotdeletepost'] = 'You can\'t delete this post!'; $string['cannotdeletediscussioninsinglediscussion'] = 'You cannot delete the first post in a single discussion'; $string['cannoteditposts'] = 'You can\'t edit other people\'s posts!'; +$string['cannotexportforum'] = 'You cannot export this forum'; $string['cannotfinddiscussion'] = 'Could not find the discussion in this forum'; $string['cannotfindfirstpost'] = 'Could not find the first post in this forum'; $string['cannotfindorcreateforum'] = 'Could not find or create a main announcements forum for the site'; diff --git a/mod/forum/lib.php b/mod/forum/lib.php index b83c3f09c1f..8f086d08149 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -5245,6 +5245,11 @@ function forum_extend_settings_navigation(settings_navigation $settingsnav, navi $PAGE->cm->context = context_module::instance($PAGE->cm->instance); } + $vaultfactory = mod_forum\local\container::get_vault_factory(); + $managerfactory = mod_forum\local\container::get_manager_factory(); + $forumvault = $vaultfactory->get_forum_vault(); + $forumentity = $forumvault->get_from_id($forumobject->id); + $params = $PAGE->url->params(); if (!empty($params['d'])) { $discussionid = $params['d']; @@ -5380,8 +5385,11 @@ function forum_extend_settings_navigation(settings_navigation $settingsnav, navi $forumnode->add($string, $url, settings_navigation::TYPE_SETTING, null, null, new pix_icon('i/rss', '')); } - $url = new moodle_url('/mod/forum/export.php', ['id' => $forumobject->id]); - $forumnode->add(get_string('export', 'mod_forum'), $url, navigation_node::TYPE_SETTING); + $capabilitymanager = $managerfactory->get_capability_manager($forumentity); + if ($capabilitymanager->can_export_forum($USER)) { + $url = new moodle_url('/mod/forum/export.php', ['id' => $forumobject->id]); + $forumnode->add(get_string('export', 'mod_forum'), $url, navigation_node::TYPE_SETTING); + } } /** diff --git a/mod/forum/version.php b/mod/forum/version.php index 0e875b0e790..2777c1ffea8 100644 --- a/mod/forum/version.php +++ b/mod/forum/version.php @@ -24,6 +24,6 @@ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2019052000; // The current module version (Date: YYYYMMDDXX) +$plugin->version = 2019052001; // The current module version (Date: YYYYMMDDXX) $plugin->requires = 2019051100; // Requires this Moodle version $plugin->component = 'mod_forum'; // Full name of the plugin (used for diagnostics)