Merge branch 'MDL-62944' of https://github.com/NeillM/moodle
authorDavid Monllao <davidm@moodle.com>
Tue, 4 Sep 2018 10:15:36 +0000 (12:15 +0200)
committerDavid Monllao <davidm@moodle.com>
Tue, 4 Sep 2018 10:15:36 +0000 (12:15 +0200)
36 files changed:
calendar/classes/external/event_exporter_base.php
calendar/lib.php
calendar/templates/event_item.mustache
completion/classes/api.php
completion/tests/behat/completion_no_calendar_capabilities.feature [new file with mode: 0644]
completion/tests/capabilities_test.php [new file with mode: 0644]
mod/assign/lib.php
mod/assign/locallib.php
mod/assign/tests/behat/assign_no_calendar_capabilities.feature [new file with mode: 0644]
mod/assign/tests/lib_test.php
mod/chat/lib.php
mod/chat/tests/behat/chat_no_calendar_capabilities.feature [new file with mode: 0644]
mod/chat/tests/lib_test.php
mod/choice/locallib.php
mod/choice/tests/behat/choice_no_calendar_capabilities.feature [new file with mode: 0644]
mod/choice/tests/lib_test.php
mod/data/edit.php
mod/data/export.php
mod/data/field.php
mod/data/locallib.php
mod/data/preset.php
mod/data/templates.php
mod/data/tests/behat/data_no_calendar_capabilities.feature [new file with mode: 0644]
mod/data/tests/lib_test.php
mod/feedback/lib.php
mod/feedback/tests/behat/feedback_no_calendar_capabilities.feature [new file with mode: 0644]
mod/feedback/tests/lib_test.php
mod/lesson/lib.php
mod/lesson/tests/behat/lesson_no_calendar_capabilities.feature [new file with mode: 0644]
mod/lesson/tests/lib_test.php
mod/quiz/lib.php
mod/quiz/tests/behat/quiz_no_calendar_capabilities.feature [new file with mode: 0644]
mod/quiz/tests/lib_test.php
mod/scorm/locallib.php
mod/scorm/tests/behat/scorm_no_calendar_capabilities.feature [new file with mode: 0644]
mod/scorm/tests/lib_test.php

index 770b5c7..d20cfb3 100644 (file)
@@ -255,6 +255,9 @@ class event_exporter_base extends exporter {
         $values['iscourseevent'] = false;
         $values['iscategoryevent'] = false;
         if ($moduleproxy = $event->get_course_module()) {
+            // We need a separate property to flag if an event is action event.
+            // That's required because canedit return true but action action events cannot be edited on the calendar UI.
+            // But they are considered editable because you can drag and drop the event on the month view.
             $values['isactionevent'] = true;
         } else if ($event->get_type() == 'course') {
             $values['iscourseevent'] = true;
index 3d8be58..2a0bc58 100644 (file)
@@ -426,11 +426,20 @@ class calendar_event {
      * Pass in a object containing the event properties and this function will
      * insert it into the database and deal with any associated files
      *
+     * Capability checking should be performed if the user is directly manipulating the event
+     * and no other capability has been tested. However if the event is not being manipulated
+     * directly by the user and another capability has been checked for them to do this then
+     * capabilites should not be checked.
+     *
+     * For example if a user is editing an event in the calendar the check should be true,
+     * but if you are updating an event in an activities settings are changed then the calendar
+     * capabilites should not be checked.
+     *
      * @see self::create()
      * @see self::update()
      *
      * @param \stdClass $data object of event
-     * @param bool $checkcapability if moodle should check calendar managing capability or not
+     * @param bool $checkcapability If Moodle should check the user can manage the calendar events for this call or not.
      * @return bool event updated
      */
     public function update($data, $checkcapability=true) {
@@ -914,10 +923,19 @@ class calendar_event {
     }
 
     /**
-     * Creates a new event and returns an event object
+     * Creates a new event and returns an event object.
+     *
+     * Capability checking should be performed if the user is directly creating the event
+     * and no other capability has been tested. However if the event is not being created
+     * directly by the user and another capability has been checked for them to do this then
+     * capabilites should not be checked.
+     *
+     * For example if a user is creating an event in the calendar the check should be true,
+     * but if you are creating an event in an activity when it is created then the calendar
+     * capabilites should not be checked.
      *
      * @param \stdClass|array $properties An object containing event properties
-     * @param bool $checkcapability Check caps or not
+     * @param bool $checkcapability If Moodle should check the user can manage the calendar events for this call or not.
      * @throws \coding_exception
      *
      * @return calendar_event|bool The event object or false if it failed
index 157a652..109d86c 100644 (file)
                             {{#pix}}t/delete, core, {{#str}}delete{{/str}}{{/pix}}
                         </a>
                     {{/candelete}}
-                    <a href="{{editurl}}" data-action="edit">
-                        {{#pix}}t/edit, core, {{#str}}edit{{/str}}{{/pix}}
-                    </a>
+                    {{^isactionevent}}
+                        <a href="{{editurl}}" data-action="edit">
+                            {{#pix}}t/edit, core, {{#str}}edit{{/str}}{{/pix}}
+                        </a>
+                    {{/isactionevent}}
                 {{/canedit}}
             </div>
             {{#icon}}<div class="d-inline-block mt-1 align-top">{{#pix}} {{key}}, {{component}}, {{alttext}} {{/pix}}</div>{{/icon}}
index f8040c5..b569e37 100644 (file)
@@ -94,7 +94,7 @@ class api {
                 $event->timeduration = 0;
 
                 $calendarevent = \calendar_event::load($event->id);
-                $calendarevent->update($event);
+                $calendarevent->update($event, false);
             } else {
                 // Calendar event is no longer needed.
                 $calendarevent = \calendar_event::load($event->id);
@@ -115,7 +115,7 @@ class api {
                 $event->visible = instance_is_visible($modulename, $instance);
                 $event->timeduration = 0;
 
-                \calendar_event::create($event);
+                \calendar_event::create($event, false);
             }
         }
 
diff --git a/completion/tests/behat/completion_no_calendar_capabilities.feature b/completion/tests/behat/completion_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..f690f76
--- /dev/null
@@ -0,0 +1,44 @@
+@core @core_completion
+Feature: Completion with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create activities with completion enabled without calendar capabilities
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode | enablecompletion |
+      | Course 1 | C1 | 0 | 1 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing completion date
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Forum" to section "1" and I fill the form with:
+      | Forum name | Test forum name |
+      | Description | Test forum description |
+      | Completion tracking | Show activity as complete when conditions are met |
+      | id_completionexpected_enabled | 1 |
+      | id_completionexpected_day | 1 |
+      | id_completionexpected_month | 1 |
+      | id_completionexpected_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test forum name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_completionexpected_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test forum name"
diff --git a/completion/tests/capabilities_test.php b/completion/tests/capabilities_test.php
new file mode 100644 (file)
index 0000000..5dd4239
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Tests that completion works without requiring unnecessary capabilities.
+ *
+ * @package    core_completion
+ * @copyright  2018 University of Nottingham
+ * @author     Neill Magill <neill.magill@nottingham.ac.uk>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Tests that completion works without requiring unnecessary capabilities.
+ *
+ * @package    core_completion
+ * @copyright  2018 University of Nottingham
+ * @author     Neill Magill <neill.magill@nottingham.ac.uk>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class core_completion_capabilities_testcase extends advanced_testcase {
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create activities.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course(['enablecompletion' => 1]);
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_forum');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $params = array(
+            'course' => $course->id,
+            'completionexpected' => time() + 2000,
+        );
+        $generator->create_instance($params);
+    }
+}
index ee78784..edc5c50 100644 (file)
@@ -345,7 +345,7 @@ function assign_update_events($assign, $override = null) {
                 unset($event->id);
             }
             $event->name      = $eventname.' ('.get_string('duedate', 'assign').')';
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 
index 7249f4d..a2dd3e4 100644 (file)
@@ -1331,9 +1331,9 @@ class assign {
             // Now process the event.
             if ($event->id) {
                 $calendarevent = calendar_event::load($event->id);
-                $calendarevent->update($event);
+                $calendarevent->update($event, false);
             } else {
-                calendar_event::create($event);
+                calendar_event::create($event, false);
             }
         } else {
             $DB->delete_records('event', array('modulename' => 'assign', 'instance' => $instance->id,
@@ -1352,9 +1352,9 @@ class assign {
             // Now process the event.
             if ($event->id) {
                 $calendarevent = calendar_event::load($event->id);
-                $calendarevent->update($event);
+                $calendarevent->update($event, false);
             } else {
-                calendar_event::create($event);
+                calendar_event::create($event, false);
             }
         } else {
             $DB->delete_records('event', array('modulename' => 'assign', 'instance' => $instance->id,
diff --git a/mod/assign/tests/behat/assign_no_calendar_capabilities.feature b/mod/assign/tests/behat/assign_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..e97a77d
--- /dev/null
@@ -0,0 +1,58 @@
+@mod @mod_assign
+Feature: Assignment with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create assignments even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing an assignment
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Assignment" to section "1" and I fill the form with:
+      | Assignment name | Test assignment name |
+      | Description | Test assignment description |
+      | id_allowsubmissionsfromdate_enabled | 1 |
+      | id_allowsubmissionsfromdate_day | 1 |
+      | id_allowsubmissionsfromdate_month | 1 |
+      | id_allowsubmissionsfromdate_year | 2017 |
+      | id_duedate_enabled | 1 |
+      | id_duedate_day | 1 |
+      | id_duedate_month | 2 |
+      | id_duedate_year | 2017 |
+      | id_cutoffdate_enabled | 1 |
+      | id_cutoffdate_day | 2 |
+      | id_cutoffdate_month | 2 |
+      | id_cutoffdate_year | 2017 |
+      | id_gradingduedate_enabled | 1 |
+      | id_gradingduedate_day | 1 |
+      | id_gradingduedate_month | 3 |
+      | id_gradingduedate_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test assignment name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_allowsubmissionsfromdate_year | 2018 |
+      | id_duedate_year | 2018 |
+      | id_cutoffdate_year | 2018 |
+      | id_gradingduedate_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test assignment name"
index 54054b3..759f534 100644 (file)
@@ -1472,4 +1472,29 @@ class mod_assign_lib_testcase extends advanced_testcase {
         // is changed.
         $this->assertNotEmpty($moduleupdatedevents);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create an assignment.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_assign');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $time = time();
+        $params = array(
+            'course' => $course->id,
+            'allowsubmissionsfromdate' => $time,
+            'duedate' => $time + 500,
+            'cutoffdate' => $time + 600,
+            'gradingduedate' => $time + 700,
+        );
+        $generator->create_instance($params);
+    }
 }
index 7e2aaad..774ebee 100644 (file)
@@ -134,7 +134,7 @@ function chat_add_instance($chat) {
         $event->timesort    = $chat->chattime;
         $event->timeduration = 0;
 
-        calendar_event::create($event);
+        calendar_event::create($event, false);
     }
 
     if (!empty($chat->completionexpected)) {
@@ -174,7 +174,7 @@ function chat_update_instance($chat) {
             $event->timesort    = $chat->chattime;
 
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Do not publish this event, so delete it.
             $calendarevent = calendar_event::load($event->id);
@@ -197,7 +197,7 @@ function chat_update_instance($chat) {
             $event->timesort    = $chat->chattime;
             $event->timeduration = 0;
 
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 
@@ -501,7 +501,7 @@ function chat_prepare_update_events($chat, $cm = null) {
     if ($event->id = $DB->get_field('event', 'id', array('modulename' => 'chat', 'instance' => $chat->id,
             'eventtype' => CHAT_EVENT_TYPE_CHATTIME))) {
         $calendarevent = calendar_event::load($event->id);
-        $calendarevent->update($event);
+        $calendarevent->update($event, false);
     } else if ($chat->schedule > 0) {
         // The chat is scheduled and the event should be published.
         $event->courseid    = $chat->course;
@@ -512,7 +512,7 @@ function chat_prepare_update_events($chat, $cm = null) {
         $event->eventtype   = CHAT_EVENT_TYPE_CHATTIME;
         $event->timeduration = 0;
         $event->visible = $cm->visible;
-        calendar_event::create($event);
+        calendar_event::create($event, false);
     }
 }
 
diff --git a/mod/chat/tests/behat/chat_no_calendar_capabilities.feature b/mod/chat/tests/behat/chat_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..a990349
--- /dev/null
@@ -0,0 +1,43 @@
+@mod @mod_chat
+Feature: Chat with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create chats even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing a chat
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Chat" to section "1" and I fill the form with:
+      | Name of this chat room | Test chat name |
+      | Description | Test chat description |
+      | Repeat/publish session times | No repeats - publish the specified time only |
+      | id_chattime_day | 1 |
+      | id_chattime_month | 1 |
+      | id_chattime_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test chat name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_chattime_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test chat name"
index fda8b4a..9df1d41 100644 (file)
@@ -363,4 +363,25 @@ class mod_chat_lib_testcase extends advanced_testcase {
 
         return calendar_event::create($event);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create an chat.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_chat');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $params = array(
+            'course' => $course->id,
+            'chattime' => time() + 500,
+        );
+        $generator->create_instance($params);
+    }
 }
index ab33373..b5cb29b 100644 (file)
@@ -58,7 +58,7 @@ function choice_set_events($choice) {
             $event->visible      = instance_is_visible('choice', $choice);
             $event->timeduration = 0;
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Calendar event is on longer needed.
             $calendarevent = calendar_event::load($event->id);
@@ -78,7 +78,7 @@ function choice_set_events($choice) {
             $event->timesort     = $choice->timeopen;
             $event->visible      = instance_is_visible('choice', $choice);
             $event->timeduration = 0;
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 
@@ -97,7 +97,7 @@ function choice_set_events($choice) {
             $event->visible      = instance_is_visible('choice', $choice);
             $event->timeduration = 0;
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Calendar event is on longer needed.
             $calendarevent = calendar_event::load($event->id);
@@ -117,7 +117,7 @@ function choice_set_events($choice) {
             $event->timesort     = $choice->timeclose;
             $event->visible      = instance_is_visible('choice', $choice);
             $event->timeduration = 0;
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 }
diff --git a/mod/choice/tests/behat/choice_no_calendar_capabilities.feature b/mod/choice/tests/behat/choice_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..0f4554c
--- /dev/null
@@ -0,0 +1,50 @@
+@mod @mod_choice
+Feature: Choice with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create choices even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing a choice
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Choice" to section "1" and I fill the form with:
+      | Choice name | Test choice name |
+      | Description | Test choice description |
+      | option[0] | Option 1 |
+      | option[1] | Option 2 |
+      | id_timeopen_enabled | 1 |
+      | id_timeopen_day | 1 |
+      | id_timeopen_month | 1 |
+      | id_timeopen_year | 2017 |
+      | id_timeclose_enabled | 1 |
+      | id_timeclose_day | 1 |
+      | id_timeclose_month | 2 |
+      | id_timeclose_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test choice name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_timeopen_year | 2018 |
+      | id_timeclose_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test choice name"
index eb452e1..72a32fe 100644 (file)
@@ -979,4 +979,27 @@ class mod_choice_lib_testcase extends externallib_advanced_testcase {
         $this->expectException('moodle_exception');
         choice_user_submit_response($optionids[1], $choicewithoptions, $user2->id, $course, $cm);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create an choice.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_choice');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $time = time();
+        $params = array(
+            'course' => $course->id,
+            'timeopen' => $time + 200,
+            'timeclose' => $time + 500,
+        );
+        $generator->create_instance($params);
+    }
 }
index 5c6a6bf..d7ec1db 100644 (file)
@@ -156,6 +156,7 @@ if ($rid) {
 
 $PAGE->set_title($data->name);
 $PAGE->set_heading($course->fullname);
+$PAGE->force_settings_menu(true);
 
 // Process incoming data for adding/updating records.
 
index b2444f3..e6d6e50 100644 (file)
@@ -84,6 +84,7 @@ if($mform->is_cancelled()) {
     // build header to match the rest of the UI
     $PAGE->set_title($data->name);
     $PAGE->set_heading($course->fullname);
+    $PAGE->force_settings_menu(true);
     echo $OUTPUT->header();
     echo $OUTPUT->heading(format_string($data->name), 2);
     echo $OUTPUT->box(format_module_intro('data', $data, $cm->id), 'generalbox', 'intro');
index d5040af..f014bb1 100644 (file)
@@ -241,6 +241,7 @@ foreach ($plugins as $plugin=>$fulldir){
 asort($menufield);    //sort in alphabetical order
 $PAGE->set_title(get_string('course') . ': ' . $course->fullname);
 $PAGE->set_heading($course->fullname);
+$PAGE->force_settings_menu(true);
 
 $PAGE->set_pagetype('mod-data-field-' . $newtype);
 if (($mode == 'new') && (!empty($newtype)) && confirm_sesskey()) {          ///  Adding a new field
index e2f6442..db8a779 100644 (file)
@@ -613,7 +613,7 @@ function data_set_events($data) {
             $event->visible      = instance_is_visible('data', $data);
             $event->timeduration = 0;
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Calendar event is on longer needed.
             $calendarevent = calendar_event::load($event->id);
@@ -633,7 +633,7 @@ function data_set_events($data) {
             $event->timesort     = $data->timeavailablefrom;
             $event->visible      = instance_is_visible('data', $data);
             $event->timeduration = 0;
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 
@@ -652,7 +652,7 @@ function data_set_events($data) {
             $event->visible      = instance_is_visible('data', $data);
             $event->timeduration = 0;
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Calendar event is on longer needed.
             $calendarevent = calendar_event::load($event->id);
@@ -672,7 +672,7 @@ function data_set_events($data) {
             $event->timesort     = $data->timeavailableto;
             $event->visible      = instance_is_visible('data', $data);
             $event->timeduration = 0;
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 }
index 5cb45e9..9a166b2 100644 (file)
@@ -51,6 +51,7 @@ require_capability('mod/data:managetemplates', $context);
 $PAGE->set_url(new moodle_url('/mod/data/preset.php', array('d'=>$data->id)));
 $PAGE->set_title(get_string('course') . ': ' . $course->fullname);
 $PAGE->set_heading($course->fullname);
+$PAGE->force_settings_menu(true);
 
 // fill in missing properties needed for updating of instance
 $data->course     = $cm->course;
index 8fa48c5..ce5af6c 100644 (file)
@@ -103,6 +103,7 @@ $PAGE->requires->js('/mod/data/data.js');
 $PAGE->set_title($data->name);
 $PAGE->set_heading($course->fullname);
 $PAGE->set_pagelayout('admin');
+$PAGE->force_settings_menu(true);
 echo $OUTPUT->header();
 echo $OUTPUT->heading(format_string($data->name), 2);
 echo $OUTPUT->box(format_module_intro('data', $data, $cm->id), 'generalbox', 'intro');
diff --git a/mod/data/tests/behat/data_no_calendar_capabilities.feature b/mod/data/tests/behat/data_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..98d7d49
--- /dev/null
@@ -0,0 +1,58 @@
+@mod @mod_data
+Feature: Database with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create databases even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing a database
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Database" to section "1" and I fill the form with:
+      | Name | Test database name |
+      | Description | Test database description |
+      | id_timeavailablefrom_enabled | 1 |
+      | id_timeavailablefrom_day | 1 |
+      | id_timeavailablefrom_month | 1 |
+      | id_timeavailablefrom_year | 2017 |
+      | id_timeavailableto_enabled | 1 |
+      | id_timeavailableto_day | 1 |
+      | id_timeavailableto_month | 4 |
+      | id_timeavailableto_year | 2017 |
+      | id_timeviewfrom_enabled | 1 |
+      | id_timeviewfrom_day | 1 |
+      | id_timeviewfrom_month | 3 |
+      | id_timeviewfrom_year | 2017 |
+      | id_timeviewto_enabled | 1 |
+      | id_timeviewto_day | 1 |
+      | id_timeviewto_month | 4 |
+      | id_timeviewto_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test database name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_timeavailablefrom_year | 2018 |
+      | id_timeavailableto_year | 2018 |
+      | id_timeviewfrom_year | 2018 |
+      | id_timeviewto_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test database name"
index 69e93f6..876550d 100644 (file)
@@ -1772,4 +1772,29 @@ class mod_data_lib_testcase extends advanced_testcase {
         $this->assertNull($min);
         $this->assertNull($max);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create an database.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_data');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $time = time();
+        $params = array(
+            'course' => $course->id,
+            'timeavailablefrom' => $time + 200,
+            'timeavailableto' => $time + 2000,
+            'timeviewfrom' => $time + 400,
+            'timeviewto' => $time + 2000,
+        );
+        $generator->create_instance($params);
+    }
 }
index 0b2d3e5..191602a 100644 (file)
@@ -826,7 +826,7 @@ function feedback_set_events($feedback) {
             // Calendar event exists so update it.
             $event->id = $eventid;
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Event doesn't exist so create one.
             $event->courseid     = $feedback->course;
@@ -835,7 +835,7 @@ function feedback_set_events($feedback) {
             $event->modulename   = 'feedback';
             $event->instance     = $feedback->id;
             $event->eventtype    = FEEDBACK_EVENT_TYPE_OPEN;
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     } else if ($eventid) {
         // Calendar event is on longer needed.
@@ -861,7 +861,7 @@ function feedback_set_events($feedback) {
             // Calendar event exists so update it.
             $event->id = $eventid;
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Event doesn't exist so create one.
             $event->courseid     = $feedback->course;
@@ -869,7 +869,7 @@ function feedback_set_events($feedback) {
             $event->userid       = 0;
             $event->modulename   = 'feedback';
             $event->instance     = $feedback->id;
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     } else if ($eventid) {
         // Calendar event is on longer needed.
diff --git a/mod/feedback/tests/behat/feedback_no_calendar_capabilities.feature b/mod/feedback/tests/behat/feedback_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..bf348ad
--- /dev/null
@@ -0,0 +1,48 @@
+@mod @mod_feedback
+Feature: Feedback with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create feedbacks even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing a feedback
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Feedback" to section "1" and I fill the form with:
+      | Name | Test feedback name |
+      | Description | Test feedback description |
+      | id_timeopen_enabled | 1 |
+      | id_timeopen_day | 1 |
+      | id_timeopen_month | 1 |
+      | id_timeopen_year | 2017 |
+      | id_timeclose_enabled | 1 |
+      | id_timeclose_day | 1 |
+      | id_timeclose_month | 2 |
+      | id_timeclose_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test feedback name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_timeopen_year | 2018 |
+      | id_timeclose_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test feedback name"
index 37cbf30..0990f40 100644 (file)
@@ -852,4 +852,27 @@ class mod_feedback_lib_testcase extends advanced_testcase {
         // was successfully modified.
         $this->assertNotEmpty($moduleupdatedevents);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create an feedback.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_feedback');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $time = time();
+        $params = array(
+            'course' => $course->id,
+            'timeopen' => $time + 200,
+            'timeclose' => $time + 2000,
+        );
+        $generator->create_instance($params);
+    }
 }
index fb55485..885e8ae 100644 (file)
@@ -217,7 +217,7 @@ function lesson_update_events($lesson, $override = null) {
                 }
                 $event->name = get_string('lessoneventopens', 'lesson', $eventname);
                 // The method calendar_event::create will reuse a db record if the id field is set.
-                calendar_event::create($event);
+                calendar_event::create($event, false);
             }
             if ($deadline && $addclose) {
                 if ($oldevent = array_shift($oldevents)) {
@@ -236,7 +236,7 @@ function lesson_update_events($lesson, $override = null) {
                         $event->priority = $closepriorities[$deadline];
                     }
                 }
-                calendar_event::create($event);
+                calendar_event::create($event, false);
             }
         }
     }
diff --git a/mod/lesson/tests/behat/lesson_no_calendar_capabilities.feature b/mod/lesson/tests/behat/lesson_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..80e5cf8
--- /dev/null
@@ -0,0 +1,48 @@
+@mod @mod_lesson
+Feature: Lesson with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create lessons even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing a lesson
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Lesson" to section "1" and I fill the form with:
+      | Name | Test lesson name |
+      | Description | Test lesson description |
+      | id_available_enabled | 1 |
+      | id_available_day | 1 |
+      | id_available_month | 1 |
+      | id_available_year | 2017 |
+      | id_deadline_enabled | 1 |
+      | id_deadline_day | 1 |
+      | id_deadline_month | 2 |
+      | id_deadline_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test lesson name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_available_year | 2018 |
+      | id_deadline_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test lesson name"
index a122c0f..049724f 100644 (file)
@@ -723,4 +723,27 @@ class mod_lesson_lib_testcase extends advanced_testcase {
         $this->assertNull($min);
         $this->assertNull($max);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create an lesson.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_lesson');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $time = time();
+        $params = array(
+            'course' => $course->id,
+            'available' => $time + 200,
+            'deadline' => $time + 2000,
+        );
+        $generator->create_instance($params);
+    }
 }
index a8caba4..9fd12e9 100644 (file)
@@ -1340,7 +1340,7 @@ function quiz_update_events($quiz, $override = null) {
                 }
                 $event->name = get_string('quizeventopens', 'quiz', $eventname);
                 // The method calendar_event::create will reuse a db record if the id field is set.
-                calendar_event::create($event);
+                calendar_event::create($event, false);
             }
             if ($timeclose && $addclose) {
                 if ($oldevent = array_shift($oldevents)) {
@@ -1359,7 +1359,7 @@ function quiz_update_events($quiz, $override = null) {
                         $event->priority = $closepriorities[$timeclose];
                     }
                 }
-                calendar_event::create($event);
+                calendar_event::create($event, false);
             }
         }
     }
diff --git a/mod/quiz/tests/behat/quiz_no_calendar_capabilities.feature b/mod/quiz/tests/behat/quiz_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..52b1f21
--- /dev/null
@@ -0,0 +1,48 @@
+@mod @mod_quiz
+Feature: Quiz with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create quiz even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  Scenario: Editing a quiz
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "Quiz" to section "1" and I fill the form with:
+      | Name | Test quiz name |
+      | Description | Test quiz description |
+      | id_timeopen_enabled | 1 |
+      | id_timeopen_day | 1 |
+      | id_timeopen_month | 1 |
+      | id_timeopen_year | 2017 |
+      | id_timeclose_enabled | 1 |
+      | id_timeclose_day | 1 |
+      | id_timeclose_month | 2 |
+      | id_timeclose_year | 2017 |
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test quiz name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_timeopen_year | 2018 |
+      | id_timeclose_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test quiz name"
index 8a54c36..65d8b56 100644 (file)
@@ -736,4 +736,27 @@ class mod_quiz_lib_testcase extends advanced_testcase {
         $this->assertEquals(mod_quiz_get_completion_active_rule_descriptions($moddefaults), $activeruledescriptions);
         $this->assertEquals(mod_quiz_get_completion_active_rule_descriptions(new stdClass()), []);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create a quiz.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_quiz');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $time = time();
+        $params = array(
+            'course' => $course->id,
+            'timeopen' => $time + 200,
+            'timeclose' => $time + 2000,
+        );
+        $generator->create_instance($params);
+    }
 }
index 27e4b94..cf61bb0 100644 (file)
@@ -2397,7 +2397,7 @@ function scorm_update_calendar(stdClass $scorm, $cmid) {
             $event->timeduration = 0;
 
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Calendar event is on longer needed.
             $calendarevent = calendar_event::load($event->id);
@@ -2418,7 +2418,7 @@ function scorm_update_calendar(stdClass $scorm, $cmid) {
             $event->visible = instance_is_visible('scorm', $scorm);
             $event->timeduration = 0;
 
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 
@@ -2438,7 +2438,7 @@ function scorm_update_calendar(stdClass $scorm, $cmid) {
             $event->timeduration = 0;
 
             $calendarevent = calendar_event::load($event->id);
-            $calendarevent->update($event);
+            $calendarevent->update($event, false);
         } else {
             // Calendar event is on longer needed.
             $calendarevent = calendar_event::load($event->id);
@@ -2459,7 +2459,7 @@ function scorm_update_calendar(stdClass $scorm, $cmid) {
             $event->visible = instance_is_visible('scorm', $scorm);
             $event->timeduration = 0;
 
-            calendar_event::create($event);
+            calendar_event::create($event, false);
         }
     }
 
diff --git a/mod/scorm/tests/behat/scorm_no_calendar_capabilities.feature b/mod/scorm/tests/behat/scorm_no_calendar_capabilities.feature
new file mode 100644 (file)
index 0000000..77cd7a0
--- /dev/null
@@ -0,0 +1,52 @@
+@mod @mod_scorm
+Feature: Scorm with no calendar capabilites
+  In order to allow work effectively
+  As a teacher
+  I need to be able to create SCORM activities even when I cannot edit calendar events
+
+  Background:
+    Given the following "courses" exist:
+      | fullname | shortname | category | groupmode |
+      | Course 1 | C1 | 0 | 1 |
+    And the following "users" exist:
+      | username | firstname | lastname | email |
+      | teacher1 | Teacher | 1 | teacher1@example.com |
+    And the following "course enrolments" exist:
+      | user | course | role |
+      | teacher1 | C1 | editingteacher |
+    And I log in as "admin"
+    And I am on "Course 1" course homepage
+    And I navigate to "Users > Permissions" in current page administration
+    And I override the system permissions of "Teacher" role with:
+      | capability | permission |
+      | moodle/calendar:manageentries | Prohibit |
+    And I log out
+
+  @javascript @_file_upload @_switch_iframe
+  Scenario: Editing a chat
+    Given I log in as "admin"
+    And I am on "Course 1" course homepage with editing mode on
+    When I add a "SCORM package" to section "1"
+    And I set the following fields to these values:
+      | Name | Test scorm name |
+      | Description | Test scorm description |
+      | id_timeopen_enabled | 1 |
+      | id_timeopen_day | 1 |
+      | id_timeopen_month | 1 |
+      | id_timeopen_year | 2017 |
+      | id_timeclose_enabled | 1 |
+      | id_timeclose_day | 1 |
+      | id_timeclose_month | 2 |
+      | id_timeclose_year | 2017 |
+    And I upload "mod/scorm/tests/packages/singlesco_scorm12.zip" file to "Package file" filemanager
+    And I click on "Save and display" "button"
+    And I log out
+    When I log in as "teacher1"
+    And I am on "Course 1" course homepage with editing mode on
+    And I follow "Test scorm name"
+    And I navigate to "Edit settings" in current page administration
+    And I set the following fields to these values:
+      | id_timeopen_year | 2018 |
+      | id_timeclose_year | 2018 |
+    And I press "Save and return to course"
+    Then I should see "Test scorm name"
index 0e98e3b..173e879 100644 (file)
@@ -736,4 +736,27 @@ class mod_scorm_lib_testcase extends externallib_advanced_testcase {
         $this->assertNull($min);
         $this->assertNull($max);
     }
+
+    /**
+     * A user who does not have capabilities to add events to the calendar should be able to create a SCORM.
+     */
+    public function test_creation_with_no_calendar_capabilities() {
+        $this->resetAfterTest();
+        $course = self::getDataGenerator()->create_course();
+        $context = context_course::instance($course->id);
+        $user = self::getDataGenerator()->create_and_enrol($course, 'editingteacher');
+        $roleid = self::getDataGenerator()->create_role();
+        self::getDataGenerator()->role_assign($roleid, $user->id, $context->id);
+        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context, true);
+        $generator = self::getDataGenerator()->get_plugin_generator('mod_scorm');
+        // Create an instance as a user without the calendar capabilities.
+        $this->setUser($user);
+        $time = time();
+        $params = array(
+            'course' => $course->id,
+            'timeopen' => $time + 200,
+            'timeclose' => $time + 2000,
+        );
+        $generator->create_instance($params);
+    }
 }