MDL-66818 mod_forum: hide portfolio export button based on caps
authorgthomas2 <brudinie@gmail.com>
Wed, 5 Feb 2020 14:47:43 +0000 (14:47 +0000)
committerSimey Lameze <simey@moodle.com>
Thu, 20 Aug 2020 00:05:00 +0000 (08:05 +0800)
lib/tests/behat/behat_forms.php
mod/forum/classes/local/renderers/discussion.php
mod/forum/tests/behat/portfolio_export.feature [new file with mode: 0644]

index 2532f94..25a1071 100644 (file)
@@ -56,6 +56,26 @@ class behat_forms extends behat_base {
         $this->execute('behat_general::i_click_on', [$button, 'button']);
     }
 
+    /**
+     * Ensure a button exists.
+     * @Then the button :button exists
+     * @param string $button
+     */
+    public function button_exists(string $button) {
+        $buttonnode = $this->find_button($button);
+        $this->ensure_node_is_visible($buttonnode);
+    }
+
+    /**
+     * Ensure that a button does not exist.
+     * @Then the button :button does not exist
+     * @param string $button
+     */
+    public function button_does_not_exist(string $button) {
+        $general = behat_context_helper::get('behat_general');
+        $general->should_not_exist($button, 'button');
+    }
+
     /**
      * Press button with specified id|name|title|alt|value and switch to main window.
      *
index 82ac800..d7fa820 100644 (file)
@@ -37,6 +37,7 @@ use mod_forum\local\factories\url as url_factory;
 use mod_forum\local\factories\vault as vault_factory;
 use mod_forum\local\managers\capability as capability_manager;
 use mod_forum\local\renderers\posts as posts_renderer;
+use forum_portfolio_caller;
 use core\output\notification;
 use context;
 use context_module;
@@ -52,6 +53,7 @@ use stdClass;
 use url_select;
 
 require_once($CFG->dirroot . '/mod/forum/lib.php');
+require_once($CFG->dirroot . '/mod/forum/locallib.php');
 
 /**
  * Discussion renderer class.
@@ -362,6 +364,15 @@ class discussion {
 
         require_once($CFG->libdir . '/portfoliolib.php');
         $discussion = $this->discussion;
+
+        // We use the portfolio caller to work out if user should be allowed to see this button.
+        $caller = new forum_portfolio_caller(['discussionid' => $discussion->get_id()]);
+        $caller->set_formats_from_button([]);
+        $caller->load_data();
+        if (!$caller->check_permissions()) {
+            return null;
+        }
+
         $button = new \portfolio_add_button();
         $button->set_callback_options('forum_portfolio_caller', ['discussionid' => $discussion->get_id()], 'mod_forum');
         $button = $button->to_html(PORTFOLIO_ADD_FULL_FORM, get_string('exportdiscussion', 'mod_forum'));
diff --git a/mod/forum/tests/behat/portfolio_export.feature b/mod/forum/tests/behat/portfolio_export.feature
new file mode 100644 (file)
index 0000000..f6e60d2
--- /dev/null
@@ -0,0 +1,44 @@
+@mod @mod_forum
+Feature: Ensure only users with appropriate permissions can export forum discussions.
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email                 |
+      | teacher1 | Teacher   | 1        | teacher1@example.com  |
+      | student1 | Student   | 1        | student1@example.com  |
+    And the following "courses" exist:
+      | fullname | shortname  | category  |
+      | Course 1 | C1         | 0         |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+      | student1 | C1 | student |
+  @javascript
+  Scenario: A teacher can export discussions to a portfolio.
+    Given the following "activities" exist:
+      | activity   | name                   | intro             | course | idnumber     | groupmode |
+      | forum      | Test forum 1           | Test forum 2      | C1     | forum        | 0         |
+    And I log in as "admin"
+    And the following config values are set as admin:
+      | enableportfolios | 1 |
+    And I navigate to "Plugins > Portfolios > Manage portfolios" in site administration
+    And I set portfolio instance "File download" to "Enabled and visible"
+    And I click on "Save" "button"
+    And I log out
+    And I log in as "student1"
+    And I am on "Course 1" course homepage
+    And I follow "Test forum 1"
+    And I add a new discussion to "Test forum 1" forum with:
+      | Subject | Discussion 1 |
+      | Message | Test post message |
+    And I reload the page
+    And I follow "Discussion 1"
+    And the button "Export whole discussion to portfolio" does not exist
+    And I log out
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I follow "Test forum 1"
+    And I follow "Discussion 1"
+    And the button "Export whole discussion to portfolio" exists
+    And I press "Export whole discussion to portfolio"
+    Then I should see "Exporting to portfolio"