Merge branch 'MDL-65310-master' of https://github.com/tsmilan/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 10 Sep 2019 22:41:22 +0000 (00:41 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 10 Sep 2019 22:41:22 +0000 (00:41 +0200)
22 files changed:
analytics/tests/fixtures/test_indicator_multiclass.php [new file with mode: 0644]
analytics/tests/fixtures/test_target_shortname_multiclass.php [new file with mode: 0644]
analytics/tests/prediction_test.php
blocks/myoverview/lang/en/block_myoverview.php
blocks/myoverview/tests/behat/block_myoverview_adminsettings.feature
blocks/myoverview/tests/behat/block_myoverview_dashboard.feature
blocks/myoverview/tests/behat/block_myoverview_favourite.feature
blocks/myoverview/tests/behat/block_myoverview_hidden.feature
blocks/myoverview/tests/behat/block_myoverview_pagelimit_persistence.feature
blocks/myoverview/tests/behat/block_myoverview_progress.feature
blocks/myoverview/tests/privacy_test.php
blocks/myoverview/version.php
filter/mediaplugin/styles.css
lib/classes/requirejs.php
lib/db/install.xml
lib/db/upgrade.php
lib/mlbackend/php/classes/processor.php
lib/mlbackend/python/classes/processor.php
mod/assign/feedback/editpdf/styles.css
mod/assign/styles.css
mod/lesson/locallib.php
version.php

diff --git a/analytics/tests/fixtures/test_indicator_multiclass.php b/analytics/tests/fixtures/test_indicator_multiclass.php
new file mode 100644 (file)
index 0000000..64872a8
--- /dev/null
@@ -0,0 +1,92 @@
+<?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/>.
+
+/**
+ * Multiclass test indicator.
+ *
+ * @package   core_analytics
+ * @copyright 2019 Vlad Apetrei
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Multiclass test indicator.
+ *
+ * @package   core_analytics
+ * @copyright 2019 Vlad Apetrei
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class test_indicator_multiclass extends \core_analytics\local\indicator\linear {
+
+    /**
+     * Returns a lang_string object representing the name for the indicator.
+     *
+     * Used as column identificator.
+     *
+     * If there is a corresponding '_help' string this will be shown as well.
+     *
+     * @return \lang_string
+     */
+    public static function get_name() : \lang_string {
+        // Using a string that exists and contains a corresponding '_help' string.
+        return new \lang_string('allowstealthmodules');
+    }
+
+    /**
+     * include_averages
+     *
+     * @return bool
+     */
+    protected static function include_averages() {
+        return false;
+    }
+
+    /**
+     * required_sample_data
+     *
+     * @return string[]
+     */
+    public static function required_sample_data() {
+        return array('course');
+    }
+
+    /**
+     * calculate_sample
+     *
+     * @param int $sampleid
+     * @param string $samplesorigin
+     * @param int $starttime
+     * @param int $endtime
+     * @return float
+     */
+    protected function calculate_sample($sampleid, $samplesorigin, $starttime, $endtime) {
+
+        $course = $this->retrieve('course', $sampleid);
+
+        $firstchar = substr($course->fullname, 0, 1);
+        if ($firstchar === 'a') {
+            return 1;
+        } else if ($firstchar === 'b') {
+            return -1;
+        } else if ($firstchar === 'c') {
+            return 1;
+        } else {
+            return self::MAX_VALUE;
+        }
+    }
+}
diff --git a/analytics/tests/fixtures/test_target_shortname_multiclass.php b/analytics/tests/fixtures/test_target_shortname_multiclass.php
new file mode 100644 (file)
index 0000000..91c5e35
--- /dev/null
@@ -0,0 +1,211 @@
+<?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/>.
+
+/**
+ * Multi-class classifier target.
+ *
+ * @package   core_analytics
+ * @copyright 2019 Apetrei Vlad
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Multi-class classifier target.
+ *
+ * @package   core_analytics
+ * @copyright 2019 Apetrei Vlad
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class test_target_shortname_multiclass extends \core_analytics\local\target\discrete {
+
+    /**
+     * Returns a lang_string object representing the name for the indicator.
+     *
+     * Used as column identificator.
+     *
+     * If there is a corresponding '_help' string this will be shown as well.
+     *
+     * @return \lang_string
+     */
+    public static function get_name() : \lang_string {
+        // Using a string that exists and contains a corresponding '_help' string.
+        return new \lang_string('allowstealthmodules');
+    }
+
+    /**
+     * predictions
+     *
+     * @var array
+     */
+    protected $predictions = array();
+
+    /**
+     * is_linear
+     *
+     * @return bool
+     */
+    public function is_linear() {
+        return false;
+    }
+
+    /**
+     * Returns the target discrete values.
+     *
+     * Only useful for targets using discrete values, must be overwriten if it is the case.
+     *
+     * @return array
+     */
+    public static final function get_classes() {
+        return array(0, 1, 2);
+    }
+
+    /**
+     * Is the calculated value a positive outcome of this target?
+     *
+     * @param string $value
+     * @param string $ignoredsubtype
+     * @return int
+     */
+    public function get_calculation_outcome($value, $ignoredsubtype = false) {
+
+        if (!self::is_a_class($value)) {
+            throw new \moodle_exception('errorpredictionformat', 'analytics');
+        }
+
+        if (in_array($value, $this->ignored_predicted_classes(), false)) {
+            // Just in case, if it is ignored the prediction should not even be recorded but if it would, it is ignored now,
+            // which should mean that is it nothing serious.
+            return self::OUTCOME_VERY_POSITIVE;
+        }
+
+        // By default binaries are danger when prediction = 1.
+        if ($value) {
+            return self::OUTCOME_VERY_NEGATIVE;
+        }
+        return self::OUTCOME_VERY_POSITIVE;
+    }
+
+    /**
+     * get_analyser_class
+     *
+     * @return string
+     */
+    public function get_analyser_class() {
+        return '\core\analytics\analyser\site_courses';
+    }
+
+    /**
+     * We don't want to discard results.
+     * @return float
+     */
+    protected function min_prediction_score() {
+        return null;
+    }
+
+    /**
+     * We don't want to discard results.
+     * @return array
+     */
+    public function ignored_predicted_classes() {
+        return array();
+    }
+
+    /**
+     * is_valid_analysable
+     *
+     * @param \core_analytics\analysable $analysable
+     * @param bool $fortraining
+     * @return bool
+     */
+    public function is_valid_analysable(\core_analytics\analysable $analysable, $fortraining = true) {
+        // This is testing, let's make things easy.
+        return true;
+    }
+
+    /**
+     * is_valid_sample
+     *
+     * @param int $sampleid
+     * @param \core_analytics\analysable $analysable
+     * @param bool $fortraining
+     * @return bool
+     */
+    public function is_valid_sample($sampleid, \core_analytics\analysable $analysable, $fortraining = true) {
+        // We skip not-visible courses during training as a way to emulate the training data / prediction data difference.
+        // In normal circumstances is_valid_sample will return false when they receive a sample that can not be
+        // processed.
+        if (!$fortraining) {
+            return true;
+        }
+
+        $sample = $this->retrieve('course', $sampleid);
+        if ($sample->visible == 0) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * classes_description
+     *
+     * @return string[]
+     */
+    protected static function classes_description() {
+        return array(
+            get_string('first class'),
+            get_string('second class'),
+            get_string('third class')
+        );
+    }
+
+    /**
+     * calculate_sample
+     *
+     * @param int $sampleid
+     * @param \core_analytics\analysable $analysable
+     * @param int $starttime
+     * @param int $endtime
+     * @return float
+     */
+    protected function calculate_sample($sampleid, \core_analytics\analysable $analysable, $starttime = false, $endtime = false) {
+
+        $sample = $this->retrieve('course', $sampleid);
+
+        $firstchar = substr($sample->shortname, 0, 1);
+        switch ($firstchar) {
+            case 'a':
+                return 0;
+            case 'b':
+                return 1;
+            case 'c':
+                return 2;
+        }
+    }
+
+    /**
+     * Can the provided time-splitting method be used on this target?.
+     *
+     * Time-splitting methods not matching the target requirements will not be selectable by models based on this target.
+     *
+     * @param \core_analytics\local\time_splitting\base $timesplitting
+     * @return bool
+     */
+    public function can_use_timesplitting(\core_analytics\local\time_splitting\base $timesplitting):bool {
+        return true;
+    }
+}
index 7fbbdc6..c3aeab3 100644 (file)
@@ -30,7 +30,9 @@ require_once(__DIR__ . '/fixtures/test_indicator_min.php');
 require_once(__DIR__ . '/fixtures/test_indicator_null.php');
 require_once(__DIR__ . '/fixtures/test_indicator_fullname.php');
 require_once(__DIR__ . '/fixtures/test_indicator_random.php');
+require_once(__DIR__ . '/fixtures/test_indicator_multiclass.php');
 require_once(__DIR__ . '/fixtures/test_target_shortname.php');
+require_once(__DIR__ . '/fixtures/test_target_shortname_multiclass.php');
 require_once(__DIR__ . '/fixtures/test_static_target_shortname.php');
 
 require_once(__DIR__ . '/../../course/lib.php');
@@ -433,6 +435,70 @@ class core_analytics_prediction_testcase extends advanced_testcase {
         return $this->add_prediction_processors($cases);
     }
 
+    /**
+     * Tests correct multi-classification.
+     *
+     * @dataProvider provider_test_multi_classifier
+     * @param string $timesplittingid
+     * @param string $predictionsprocessorclass
+     * @throws coding_exception
+     * @throws moodle_exception
+     */
+    public function test_ml_multi_classifier($timesplittingid, $predictionsprocessorclass) {
+        global $DB;
+
+        $this->resetAfterTest(true);
+        $this->setAdminuser();
+        set_config('enabled_stores', 'logstore_standard', 'tool_log');
+
+        $predictionsprocessor = \core_analytics\manager::get_predictions_processor($predictionsprocessorclass, false);
+        if ($predictionsprocessor->is_ready() !== true) {
+            $this->markTestSkipped('Skipping ' . $predictionsprocessorclass . ' as the predictor is not ready.');
+        }
+        // Generate training courses.
+        $ncourses = 5;
+        $this->generate_courses_multiclass($ncourses);
+        $model = $this->add_multiclass_model();
+        $model->update(true, false, $timesplittingid, get_class($predictionsprocessor));
+        $results = $model->train();
+
+        $params = [
+            'startdate' => mktime(0, 0, 0, 10, 24, 2015),
+            'enddate' => mktime(0, 0, 0, 2, 24, 2016),
+        ];
+        $courseparams = $params + array('shortname' => 'aaaaaa', 'fullname' => 'aaaaaa', 'visible' => 0);
+        $course1 = $this->getDataGenerator()->create_course($courseparams);
+        $courseparams = $params + array('shortname' => 'bbbbbb', 'fullname' => 'bbbbbb', 'visible' => 0);
+        $course2 = $this->getDataGenerator()->create_course($courseparams);
+        $courseparams = $params + array('shortname' => 'cccccc', 'fullname' => 'cccccc', 'visible' => 0);
+        $course3 = $this->getDataGenerator()->create_course($courseparams);
+
+        // They will not be skipped for prediction though.
+        $result = $model->predict();
+        // The $course1 predictions should be 0 == 'a', $course2 should be 1 == 'b' and $course3 should be 2 == 'c'.
+        $correct = array($course1->id => 0, $course2->id => 1, $course3->id => 2);
+        foreach ($result->predictions as $uniquesampleid => $predictiondata) {
+            list($sampleid, $rangeindex) = $model->get_time_splitting()->infer_sample_info($uniquesampleid);
+
+            // The range index is not important here, both ranges prediction will be the same.
+            $this->assertEquals($correct[$sampleid], $predictiondata->prediction);
+        }
+    }
+
+    /**
+     * Provider for the multi_classification test.
+     *
+     * @return array
+     */
+    public function provider_test_multi_classifier() {
+        $cases = array(
+            'notimesplitting' => array('\core\analytics\time_splitting\no_splitting'),
+        );
+
+        // Add all system prediction processors.
+        return $this->add_prediction_processors($cases);
+    }
+
     /**
      * Basic test to check that prediction processors work as expected.
      *
@@ -670,7 +736,6 @@ class core_analytics_prediction_testcase extends advanced_testcase {
      * @return \core_analytics\model
      */
     protected function add_perfect_model($targetclass = 'test_target_shortname') {
-
         $target = \core_analytics\manager::get_target($targetclass);
         $indicators = array('test_indicator_max', 'test_indicator_min', 'test_indicator_fullname');
         foreach ($indicators as $key => $indicator) {
@@ -683,6 +748,25 @@ class core_analytics_prediction_testcase extends advanced_testcase {
         return new \core_analytics\model($model->get_id());
     }
 
+    /**
+     * Generates model for multi-classification
+     *
+     * @param string $targetclass
+     * @return \core_analytics\model
+     * @throws coding_exception
+     * @throws moodle_exception
+     */
+    public function add_multiclass_model($targetclass = 'test_target_shortname_multiclass') {
+        $target = \core_analytics\manager::get_target($targetclass);
+        $indicators = array('test_indicator_fullname', 'test_indicator_multiclass');
+        foreach ($indicators as $key => $indicator) {
+            $indicators[$key] = \core_analytics\manager::get_indicator($indicator);
+        }
+
+        $model = \core_analytics\model::create($target, $indicators);
+        return new \core_analytics\model($model->get_id());
+    }
+
     /**
      * Generates $ncourses courses
      *
@@ -709,6 +793,37 @@ class core_analytics_prediction_testcase extends advanced_testcase {
         }
     }
 
+    /**
+     * Generates ncourses for multi-classification
+     *
+     * @param int $ncourses The number of courses to be generated.
+     * @param array $params Course params
+     * @return null
+     */
+    protected function generate_courses_multiclass($ncourses, array $params = []) {
+
+        $params = $params + [
+                'startdate' => mktime(0, 0, 0, 10, 24, 2015),
+                'enddate' => mktime(0, 0, 0, 2, 24, 2016),
+            ];
+
+        for ($i = 0; $i < $ncourses; $i++) {
+            $name = 'a' . random_string(10);
+            $courseparams = array('shortname' => $name, 'fullname' => $name) + $params;
+            $this->getDataGenerator()->create_course($courseparams);
+        }
+        for ($i = 0; $i < $ncourses; $i++) {
+            $name = 'b' . random_string(10);
+            $courseparams = array('shortname' => $name, 'fullname' => $name) + $params;
+            $this->getDataGenerator()->create_course($courseparams);
+        }
+        for ($i = 0; $i < $ncourses; $i++) {
+            $name = 'c' . random_string(10);
+            $courseparams = array('shortname' => $name, 'fullname' => $name) + $params;
+            $this->getDataGenerator()->create_course($courseparams);
+        }
+    }
+
     /**
      * add_prediction_processors
      *
index 3c7226a..e95ce8c 100644 (file)
  */
 
 $string['allincludinghidden'] = 'All';
-$string['all'] = 'All (except hidden)';
+$string['all'] = 'All (except removed from view)';
 $string['addtofavourites'] = 'Star this course';
 $string['aria:addtofavourites'] = 'Star for';
-$string['aria:allcoursesincludinghidden'] = 'All courses';
-$string['aria:allcourses'] = 'All courses except hidden courses';
+$string['aria:allcoursesincludinghidden'] = 'Show all courses';
+$string['aria:allcourses'] = 'Show all courses except courses removed from view';
 $string['aria:card'] = 'Switch to card view';
 $string['aria:controls'] = 'Course overview controls';
 $string['aria:courseactions'] = 'Actions for current course';
@@ -70,13 +70,13 @@ $string['privacy:metadata:overviewpagingpreference'] = 'The Course overview bloc
 $string['removefromfavourites'] = 'Unstar this course';
 $string['summary'] = 'Summary';
 $string['title'] = 'Course name';
-$string['aria:hidecourse'] = 'Hide {$a} from view';
-$string['aria:showcourse'] = 'Show {$a} in view';
-$string['aria:hiddencourses'] = 'Show hidden courses';
-$string['hidden'] = 'Hidden courses';
-$string['hidecourse'] = 'Hide from view';
-$string['hiddencourses'] = 'Hidden';
-$string['show'] = 'Show this course';
+$string['aria:hidecourse'] = 'Remove {$a} from view';
+$string['aria:showcourse'] = 'Restore {$a} to view';
+$string['aria:hiddencourses'] = 'Show courses removed from view';
+$string['hidden'] = 'Courses removed from view';
+$string['hidecourse'] = 'Remove from view';
+$string['hiddencourses'] = 'Removed from view';
+$string['show'] = 'Restore to view';
 $string['privacy:request:preference:set'] = 'The value of the setting \'{$a->name}\' was \'{$a->value}\'';
 
 // Deprecated since Moodle 3.6.
index 5e69256..e9356fa 100644 (file)
@@ -33,10 +33,9 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    # We have to check for the data attribute instead of the list element text as we would get false positives from the "All (except hidden)" element otherwise
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    # We have to check for the data attribute instead of the list element text as we would get false positives from the "All (except removed from view)" element otherwise
     Then "[data-value='allincludinghidden']" "css_element" should exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Disable 'All' course filter option
     Given I log in as "admin"
@@ -45,33 +44,30 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    # We have to check for the data attribute instead of the list element text as we would get false negatives "All (except hidden)" element otherwise
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    # We have to check for the data attribute instead of the list element text as we would get false negatives "All (except removed from view)" element otherwise
     Then "[data-value='allincludinghidden']" "css_element" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
-  Scenario: Enable 'All (except hidden)' course filter option
+  Scenario: Enable 'All (except removed from view)' course filter option
     Given I log in as "admin"
     And I navigate to "Plugins > Blocks > Course overview" in site administration
-    And I set the field "All (except hidden)" to "1"
+    And I set the field "All (except removed from view)" to "1"
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    Then "All (except hidden)" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    Then "All (except removed from view)" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
 
-  Scenario: Disable 'All (except hidden)' course filter option
+  Scenario: Disable 'All (except removed from view)' course filter option
     Given I log in as "admin"
     And I navigate to "Plugins > Blocks > Course overview" in site administration
-    And I set the field "All (except hidden)" to "0"
+    And I set the field "All (except removed from view)" to "0"
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    # 'All (except hidden)' option has been disabled, so the button is falling back to the 'In progress' option which is the next enabled option.
+    # 'All (except removed from view)' option has been disabled, so the button is falling back to the 'In progress' option which is the next enabled option.
     And I click on "In progress" "button" in the "Course overview" "block"
-    Then "All (except hidden)" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
+    Then "All (except removed from view)" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
 
   Scenario: Enable 'In progress' course filter option
     Given I log in as "admin"
@@ -80,9 +76,8 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "In progress" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Disable 'In progress' course filter option
     Given I log in as "admin"
@@ -91,9 +86,8 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "In progress" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Enable 'Future' course filter option
     Given I log in as "admin"
@@ -102,9 +96,8 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "Future" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Disable 'Future' course filter option
     Given I log in as "admin"
@@ -113,9 +106,8 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "Future" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Enable 'Past' course filter option
     Given I log in as "admin"
@@ -124,9 +116,8 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "Past" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Disable 'Past' course filter option
     Given I log in as "admin"
@@ -135,9 +126,8 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "Past" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Enable 'Starred' course filter option
     Given I log in as "admin"
@@ -146,9 +136,8 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "Starred" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
   Scenario: Disable 'Starred' course filter option
     Given I log in as "admin"
@@ -157,42 +146,39 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then "Starred" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
 
-  Scenario: Enable 'Hidden' course filter option
+  Scenario: Enable 'Removed courses' course filter option
     Given I log in as "admin"
     And I navigate to "Plugins > Blocks > Course overview" in site administration
-    And I set the field "Hidden" to "1"
+    And I set the field "Removed from view" to "1"
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    Then "Hidden" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    Then "Removed from view" "list_item" should exist in the ".block_myoverview .dropdown-menu" "css_element"
 
-  Scenario: Disable 'Hidden' course filter option
+  Scenario: Disable 'Removed courses' course filter option
     Given I log in as "admin"
     And I navigate to "Plugins > Blocks > Course overview" in site administration
-    And I set the field "Hidden" to "0"
+    And I set the field "Removed from view" to "0"
     And I press "Save"
     And I log out
     Then I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    Then "Hidden" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
-    And I log out
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    Then "Removed from view" "list_item" should not exist in the ".block_myoverview .dropdown-menu" "css_element"
 
   Scenario: Disable all course filter options
     Given I log in as "admin"
     And I navigate to "Plugins > Blocks > Course overview" in site administration
     And I set the field "All" to "0"
-    And I set the field "All (except hidden)" to "0"
+    And I set the field "All (except removed from view)" to "0"
     And I set the field "In progress" to "0"
     And I set the field "Future" to "0"
     And I set the field "Past" to "0"
     And I set the field "Starred" to "0"
-    And I set the field "Hidden" to "0"
+    And I set the field "Removed from view" to "0"
     And I press "Save"
     And I log out
     And I log in as "student1"
@@ -202,18 +188,17 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I should see "Course 3" in the "Course overview" "block"
     And I should see "Course 4" in the "Course overview" "block"
     And I should see "Course 5" in the "Course overview" "block"
-    And I log out
 
   Scenario: Disable all but one course filter option
     Given I log in as "admin"
     And I navigate to "Plugins > Blocks > Course overview" in site administration
     And I set the field "All" to "0"
-    And I set the field "All (except hidden)" to "0"
+    And I set the field "All (except removed from view)" to "0"
     And I set the field "In progress" to "1"
     And I set the field "Future" to "0"
     And I set the field "Past" to "0"
     And I set the field "Starred" to "0"
-    And I set the field "Hidden" to "0"
+    And I set the field "Removed from view" to "0"
     And I press "Save"
     And I log out
     And I log in as "student1"
@@ -223,4 +208,3 @@ Feature: The my overview block allows admins to easily configure the students' c
     And I should see "Course 4" in the "Course overview" "block"
     And I should not see "Course 1" in the "Course overview" "block"
     And I should not see "Course 5" in the "Course overview" "block"
-    And I log out
index 9101de8..8ee515c 100644 (file)
@@ -28,66 +28,61 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View past courses
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "Past" "link" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     And I should not see "Course 2" in the "Course overview" "block"
     And I should not see "Course 3" in the "Course overview" "block"
     And I should not see "Course 4" in the "Course overview" "block"
     And I should not see "Course 5" in the "Course overview" "block"
-    And I log out
 
   Scenario: View future courses
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "Future" "link" in the "Course overview" "block"
     Then I should see "Course 5" in the "Course overview" "block"
     And I should not see "Course 1" in the "Course overview" "block"
     And I should not see "Course 2" in the "Course overview" "block"
     And I should not see "Course 3" in the "Course overview" "block"
     And I should not see "Course 4" in the "Course overview" "block"
-    And I log out
 
   Scenario: View inprogress courses
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "In progress" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     Then I should see "Course 3" in the "Course overview" "block"
     Then I should see "Course 4" in the "Course overview" "block"
     And I should not see "Course 1" in the "Course overview" "block"
     And I should not see "Course 5" in the "Course overview" "block"
-    And I log out
 
-  Scenario: View all (except hidden) courses
+  Scenario: View all (except removed) courses
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     Then I should see "Course 3" in the "Course overview" "block"
     Then I should see "Course 4" in the "Course overview" "block"
     Then I should see "Course 5" in the "Course overview" "block"
-    And I log out
 
-  Scenario: View all (including hidden) courses
+  Scenario: View all (including removed) courses
     Given the following config values are set as admin:
       | config                            | value | plugin           |
       | displaygroupingallincludinghidden | 1     | block_myoverview |
     And I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except hidden)" element instead
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except removed from view)" element instead
     When I click on "[data-value='allincludinghidden']" "css_element" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     Then I should see "Course 3" in the "Course overview" "block"
     Then I should see "Course 4" in the "Course overview" "block"
     Then I should see "Course 5" in the "Course overview" "block"
-    And I log out
 
   Scenario: View inprogress courses - test persistence
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     And I click on "In progress" "link" in the "Course overview" "block"
     And I reload the page
     Then I should see "In progress" in the "Course overview" "block"
@@ -96,24 +91,22 @@ Feature: The my overview block allows users to easily access their courses
     Then I should see "Course 4" in the "Course overview" "block"
     And I should not see "Course 1" in the "Course overview" "block"
     And I should not see "Course 5" in the "Course overview" "block"
-    And I log out
 
-  Scenario: View all (except hidden) courses - w/ persistence
+  Scenario: View all (except removed) courses - w/ persistence
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     And I reload the page
-    Then I should see "All (except hidden)" in the "Course overview" "block"
+    Then I should see "All (except removed from view)" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
     Then I should see "Course 3" in the "Course overview" "block"
     Then I should see "Course 4" in the "Course overview" "block"
     Then I should see "Course 5" in the "Course overview" "block"
-    And I log out
 
   Scenario: View past courses - w/ persistence
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "Past" "link" in the "Course overview" "block"
     And I reload the page
     Then I should see "Past" in the "Course overview" "block"
@@ -122,11 +115,10 @@ Feature: The my overview block allows users to easily access their courses
     And I should not see "Course 3" in the "Course overview" "block"
     And I should not see "Course 4" in the "Course overview" "block"
     And I should not see "Course 5" in the "Course overview" "block"
-    And I log out
 
   Scenario: View future courses - w/ persistence
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "Future" "link" in the "Course overview" "block"
     And I reload the page
     Then I should see "Future" in the "Course overview" "block"
@@ -135,7 +127,6 @@ Feature: The my overview block allows users to easily access their courses
     And I should not see "Course 2" in the "Course overview" "block"
     And I should not see "Course 3" in the "Course overview" "block"
     And I should not see "Course 4" in the "Course overview" "block"
-    And I log out
 
   Scenario: List display  persistence
     Given I log in as "student1"
@@ -179,77 +170,72 @@ Feature: The my overview block allows users to easily access their courses
 
   Scenario: View inprogress courses with hide persistent functionality
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "In progress" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I reload the page
     Then I should see "Course 3" in the "Course overview" "block"
     Then I should see "Course 4" in the "Course overview" "block"
     And I should not see "Course 2" in the "Course overview" "block"
     And I should not see "Course 1" in the "Course overview" "block"
     And I should not see "Course 5" in the "Course overview" "block"
-    And I log out
 
   Scenario: View past courses with hide persistent functionality
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "Past" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 1')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 1')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 1')]" "xpath_element"
     And I reload the page
     Then I should not see "Course 1" in the "Course overview" "block"
     And I should not see "Course 2" in the "Course overview" "block"
     And I should not see "Course 3" in the "Course overview" "block"
     And I should not see "Course 4" in the "Course overview" "block"
     And I should not see "Course 5" in the "Course overview" "block"
-    And I log out
 
   Scenario: View future courses with hide persistent functionality
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     When I click on "Future" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
     And I reload the page
     Then I should not see "Course 5" in the "Course overview" "block"
     And I should not see "Course 1" in the "Course overview" "block"
     And I should not see "Course 2" in the "Course overview" "block"
     And I should not see "Course 3" in the "Course overview" "block"
     And I should not see "Course 4" in the "Course overview" "block"
-    And I log out
 
   Scenario: View all (except hidden) courses with hide persistent functionality
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
     And I reload the page
     Then I should not see "Course 5" in the "Course overview" "block"
     And I should see "Course 1" in the "Course overview" "block"
     And I should see "Course 2" in the "Course overview" "block"
     And I should see "Course 3" in the "Course overview" "block"
     And I should see "Course 4" in the "Course overview" "block"
-    And I log out
 
-  Scenario: View all (including hidden) courses with hide persistent functionality
+  Scenario: View all (including removed) courses with hide persistent functionality
     Given the following config values are set as admin:
       | config                            | value | plugin           |
       | displaygroupingallincludinghidden | 1     | block_myoverview |
     And I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except hidden)" element instead
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except removed from view)" element instead
     When I click on "[data-value='allincludinghidden']" "css_element" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 5')]" "xpath_element"
     And I reload the page
     Then I should see "Course 5" in the "Course overview" "block"
     And I should see "Course 1" in the "Course overview" "block"
     And I should see "Course 2" in the "Course overview" "block"
     And I should see "Course 3" in the "Course overview" "block"
     And I should see "Course 4" in the "Course overview" "block"
-    And I log out
 
   Scenario: Show course category in cards display
     Given I log in as "student1"
index 9752f6f..fbf5756 100644 (file)
@@ -32,7 +32,6 @@ Feature: The my overview block allows users to favourite their courses
     And "//div[@class='card dashboard-card' and contains(.,'Course 2')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should not exist
     And "//div[@class='card dashboard-card' and contains(.,'Course 1')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should exist
     And "//div[@class='card dashboard-card' and contains(.,'Course 3')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should exist
-    And I log out
 
   Scenario: Star a course and switch display to list
     Given I log in as "student1"
@@ -46,7 +45,6 @@ Feature: The my overview block allows users to favourite their courses
     And "//li[contains(concat(' ', normalize-space(@class), ' '), 'list-group-item') and contains(.,'Course 5')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should not exist
     And "//li[contains(concat(' ', normalize-space(@class), ' '), 'list-group-item') and contains(.,'Course 1')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should exist
     And "//li[contains(concat(' ', normalize-space(@class), ' '), 'list-group-item') and contains(.,'Course 3')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should exist
-    And I log out
 
   Scenario: Star a course and switch display to summary
     Given I log in as "student1"
@@ -60,4 +58,3 @@ Feature: The my overview block allows users to favourite their courses
     And "//div[contains(concat(' ', normalize-space(@class), ' '), 'course-summaryitem') and contains(.,'Course 5')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should not exist
     And "//div[contains(concat(' ', normalize-space(@class), ' '), 'course-summaryitem') and contains(.,'Course 1')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should exist
     And "//div[contains(concat(' ', normalize-space(@class), ' '), 'course-summaryitem') and contains(.,'Course 3')]//span[@data-region='is-favourite' and @aria-hidden='true']" "xpath_element" should exist
-    And I log out
index e494c75..3c4a12d 100644 (file)
@@ -25,97 +25,91 @@ Feature: The my overview block allows users to hide their courses
 
   Scenario: Test hide toggle functionality
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I reload the page
     Then I should not see "Course 2" in the "Course overview" "block"
-    And I log out
 
   Scenario: Test hide toggle functionality w/ favorites
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Star this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     When I reload the page
     Then I should not see "Course 2" in the "Course overview" "block"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     And I click on "Starred" "link" in the "Course overview" "block"
     Then I should not see "Course 2" in the "Course overview" "block"
     And I click on "Starred" "button" in the "Course overview" "block"
-    And I click on "Hidden" "link" in the "Course overview" "block"
+    And I click on "Removed from view" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
-    And I log out
 
   Scenario: Test show toggle functionality
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    When I click on "All (except hidden)" "button" in the "Course overview" "block"
-    And I click on "Hidden" "link" in the "Course overview" "block"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    When I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    And I click on "Removed from view" "link" in the "Course overview" "block"
     When I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Show this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Restore to view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I reload the page
-    And I click on "Hidden" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "Removed from view" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
-    And I log out
 
   Scenario: Test show toggle functionality w/ favorites
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on "Star this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    And I click on "Hidden" "link" in the "Course overview" "block"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    And I click on "Removed from view" "link" in the "Course overview" "block"
     And I should see "Course 2" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Show this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Restore to view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     When I reload the page
     Then I should not see "Course 2" in the "Course overview" "block"
-    And I click on "Hidden" "button" in the "Course overview" "block"
-    And I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "Removed from view" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     And I click on "Starred" "link" in the "Course overview" "block"
     Then I should see "Course 2" in the "Course overview" "block"
-    And I log out
 
-  Scenario: Test a course is hidden directly with "All (except hidden)" courses
+  Scenario: Test a course is hidden directly with "All (except removed from view)" courses
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     Then I should not see "Course 2" in the "Course overview" "block"
-    And I log out
 
-  Scenario: Test a course is never hidden with "All (including hidden)" courses
+  Scenario: Test a course is never hidden with "All (including removed)" courses
     Given the following config values are set as admin:
       | config                            | value | plugin           |
       | displaygroupingallincludinghidden | 1     | block_myoverview |
     And I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     # We have to click on the data attribute instead of the button element text as we might risk to click on the false positive "All (except hidden)" element instead
     When I click on "[data-value='allincludinghidden']" "css_element" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Hide from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Remove from view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     Then I should see "Course 2" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I should not see "Hide from view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I should see "Show this course" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I click on "Show this course" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I should not see "Remove from view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I should see "Restore to view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I click on "Restore to view" "link" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
     Then I should see "Course 2" in the "Course overview" "block"
     And I click on ".coursemenubtn" "css_element" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I should see "Hide from view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I should not see "Show this course" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
-    And I log out
\ No newline at end of file
+    And I should see "Remove from view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
+    And I should not see "Restore to view" in the "//div[@class='card dashboard-card' and contains(.,'Course 2')]" "xpath_element"
index 84f2e4e..a192c3d 100644 (file)
@@ -44,14 +44,12 @@ Feature: The my overview block allows users to persistence of their page limits
     And I reload the page
     Then I should see "Course 13"
     And I should see "All" in the "[data-action='limit-toggle']" "css_element"
-    And I log out
 
   Scenario: Toggle the page limit between grouping changes
     Given I log in as "student1"
     When I click on "[data-toggle='dropdown']" "css_element" in the "Course overview" "block"
     And I click on "All" "link"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     And I click on "In progress" "link" in the "Course overview" "block"
     Then I should see "Course 13"
     And I should see "All" in the "[data-action='limit-toggle']" "css_element"
-    And I log out
index 3c2c1c9..17ecfb6 100644 (file)
@@ -22,10 +22,9 @@ Feature: Course overview block show users their progress on courses
 
   Scenario: Course progress percentage should not be displayed if completion is not enabled
     Given I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
-    When I click on "All (except hidden)" "link" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
+    When I click on "All (except removed from view)" "link" in the "Course overview" "block"
     Then I should not see "0%" in the "Course overview" "block"
-    And I log out
 
   Scenario: User complete activity and verify his progress
     Given I log in as "teacher1"
@@ -38,12 +37,11 @@ Feature: Course overview block show users their progress on courses
     And I press "Save and return to course"
     And I log out
     When I log in as "student1"
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     Then I should see "Course 1" in the "Course overview" "block"
     And I should see "0%" in the "Course overview" "block"
     And I am on "Course 1" course homepage
     And I follow "Test choice 1"
     And I follow "Dashboard" in the user menu
-    And I click on "All (except hidden)" "button" in the "Course overview" "block"
+    And I click on "All (except removed from view)" "button" in the "Course overview" "block"
     And I should see "100%" in the "Course overview" "block"
-    And I log out
index 12a7387..6dc9b94 100644 (file)
@@ -77,6 +77,8 @@ class block_myoverview_privacy_testcase extends \core_privacy\tests\provider_tes
             array('block_myoverview_user_grouping_preference', 'inprogress', ''),
             array('block_myoverview_user_grouping_preference', 'future', ''),
             array('block_myoverview_user_grouping_preference', 'past', ''),
+            array('block_myoverview_user_grouping_preference', 'hidden', ''),
+            array('block_myoverview_user_grouping_preference', 'favourites', ''),
             array('block_myoverview_user_view_preference', 'card', ''),
             array('block_myoverview_user_view_preference', 'list', ''),
             array('block_myoverview_user_view_preference', 'summary', ''),
index 6b5751d..7c42d39 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019070401;         // The current plugin version (Date: YYYYMMDDXX).
+$plugin->version   = 2019090500;         // The current plugin version (Date: YYYYMMDDXX).
 $plugin->requires  = 2019051100;         // Requires this Moodle version.
 $plugin->component = 'block_myoverview'; // Full name of the plugin (used for diagnostics).
index 9a17d5b..c6ec054 100644 (file)
     margin: auto;
 }
 
+/* This is needed to display videos in an adequate size and without too much space
+   withing the specific mod assign table views. */
+.path-mod-assign .gradingtable .mediaplugin,
+.path-mod-assign .submissionsummarytable .mediaplugin {
+    width: 400px;
+    height: auto;
+}
+
 /* Make media plugin behave properly in mod summaries and labels */
 .mod-indent-outer .mediaplugin {
     display: table-cell;
index 4f45dac..91f062f 100644 (file)
@@ -121,7 +121,7 @@ class core_requirejs {
                 $extension = $item->getExtension();
                 if ($extension === 'js') {
                     $filename = substr($item->getRealpath(), strlen($srcdir) + 1);
-                    $filename = str_replace('.min', '', $filename);
+                    $filename = preg_replace('/(\.min)?\.js$/', '', $filename);
                     // We skip lazy loaded modules unless specifically requested.
                     if ($includelazy || strpos($filename, '-lazy') === false) {
                         $modulename = $component . '/' . $filename;
index a7f8386..b762bfc 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="lib/db" VERSION="20190717" COMMENT="XMLDB file for core Moodle tables"
+<XMLDB PATH="lib/db" VERSION="20190905" COMMENT="XMLDB file for core Moodle tables"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
 >
       </KEYS>
       <INDEXES>
         <INDEX NAME="modelid-action" UNIQUE="false" FIELDS="modelid, action"/>
+        <INDEX NAME="analysableid" UNIQUE="false" FIELDS="analysableid"/>
       </INDEXES>
     </TABLE>
     <TABLE NAME="search_index_requests" COMMENT="Records requests for (re)indexing of specific contexts. Entries will be removed from this table when indexing of that context is complete. (This table is not used for normal time-based indexing of new content.)">
       </INDEXES>
     </TABLE>
   </TABLES>
-</XMLDB>
+</XMLDB>
\ No newline at end of file
index 1aa73b8..e27c049 100644 (file)
@@ -3536,5 +3536,20 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2019083000.04);
     }
 
+    if ($oldversion < 2019090500.01) {
+
+        // Define index analysableid (not unique) to be added to analytics_used_analysables.
+        $table = new xmldb_table('analytics_used_analysables');
+        $index = new xmldb_index('analysableid', XMLDB_INDEX_NOTUNIQUE, ['analysableid']);
+
+        // Conditionally launch add index analysableid.
+        if (!$dbman->index_exists($table, $index)) {
+            $dbman->add_index($table, $index);
+        }
+
+        // Main savepoint reached.
+        upgrade_main_savepoint(true, 2019090500.01);
+    }
+
     return true;
 }
index b9b122c..503f9a6 100644 (file)
@@ -132,8 +132,7 @@ class processor implements \core_analytics\classifier, \core_analytics\regressor
             $nsamples = count($samples);
             if ($nsamples === self::BATCH_SIZE) {
                 // Training it batches to avoid running out of memory.
-
-                $classifier->partialTrain($samples, $targets, array(0, 1));
+                $classifier->partialTrain($samples, $targets, json_decode($metadata['targetclasses']));
                 $samples = array();
                 $targets = array();
             }
@@ -152,7 +151,7 @@ class processor implements \core_analytics\classifier, \core_analytics\regressor
 
         // Train the remaining samples.
         if ($samples) {
-            $classifier->partialTrain($samples, $targets, array(0, 1));
+            $classifier->partialTrain($samples, $targets, json_decode($metadata['targetclasses']));
         }
 
         $resultobj = new \stdClass();
index 31cb592..364c457 100644 (file)
@@ -38,7 +38,7 @@ class processor implements  \core_analytics\classifier, \core_analytics\regresso
     /**
      * The required version of the python package that performs all calculations.
      */
-    const REQUIRED_PIP_PACKAGE_VERSION = '2.0.0';
+    const REQUIRED_PIP_PACKAGE_VERSION = '2.1.0';
 
     /**
      * The path to the Python bin.
index 2a73724..95eb850 100644 (file)
     -webkit-box-shadow: none;
 }
 
+.assignfeedback_editpdf_widget .toolbar > button.rotateleftbutton {
+    /*rtl:raw:
+    border-right: 1px solid #ccc;
+    border-left: 0;
+    */
+    /*rtl:ignore*/
+    float: left;
+}
+
+.assignfeedback_editpdf_widget .toolbar > button.rotaterightbutton {
+    /*rtl:ignore*/
+    float: right;
+}
+
 .assignfeedback_editpdf_widget .toolbar {
     float: left;
 }
index 0c5d724..7d89414 100644 (file)
     background-color: #fc9;
 }
 
+.path-mod-assign .gradingtable .commentscontainer .comment-ctrl .comment-area textarea {
+    resize: both;
+}
+
 .path-mod-assign td.submissioneditable {
     color: red;
 }
index 812c5c8..7ce6b74 100644 (file)
@@ -4549,7 +4549,7 @@ abstract class lesson_page extends lesson_base {
                     $this->answers[$i]->responseformat = $properties->response_editor[$i]['format'];
                 }
 
-                if (isset($this->answers[$i]->answer) && $this->answers[$i]->answer != '') {
+                if ($this->answers[$i]->answer !== null && $this->answers[$i]->answer !== '') {
                     if (isset($properties->jumpto[$i])) {
                         $this->answers[$i]->jumpto = $properties->jumpto[$i];
                     }
index 7c57773..0768951 100644 (file)
@@ -29,7 +29,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2019090500.00;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2019090500.01;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.