Merge branch 'MDL-66489-master' of git://github.com/rezaies/moodle
authorAndrew Nicols <andrew@nicols.co.uk>
Wed, 11 Sep 2019 23:05:50 +0000 (07:05 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Wed, 11 Sep 2019 23:05:50 +0000 (07:05 +0800)
180 files changed:
.eslintrc
.jshintignore [new file with mode: 0644]
.nvmrc [new file with mode: 0644]
Gruntfile.js
admin/classes/form/purge_caches.php
admin/settings/appearance.php
admin/settings/subsystems.php
admin/tool/behat/tests/behat/edit_permissions.feature
admin/tool/capability/renderer.php
admin/tool/messageinbound/lang/en/tool_messageinbound.php
admin/tool/mobile/classes/external.php
admin/tool/mobile/lang/en/tool_mobile.php
admin/tool/mobile/launch.php
admin/tool/mobile/settings.php
admin/tool/mobile/tests/externallib_test.php
admin/tool/mobile/tests/fixtures/output/mobile.php
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
babel-plugin-add-module-to-define.js
backup/util/checks/backup_check.class.php
backup/util/checks/restore_check.class.php
backup/util/ui/renderer.php
backup/util/ui/tests/behat/restore_moodle2_courses.feature
blocks/community/block_community.php [deleted file]
blocks/community/classes/privacy/provider.php [deleted file]
blocks/community/communitycourse.php [deleted file]
blocks/community/db/access.php [deleted file]
blocks/community/db/install.xml [deleted file]
blocks/community/db/upgrade.php [deleted file]
blocks/community/forms.php [deleted file]
blocks/community/lang/en/block_community.php [deleted file]
blocks/community/locallib.php [deleted file]
blocks/community/renderer.php [deleted file]
blocks/community/styles.css [deleted file]
blocks/community/tests/privacy_test.php [deleted file]
blocks/community/yui/comments/comments.js [deleted file]
blocks/community/yui/imagegallery/imagegallery.js [deleted file]
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
blocks/site_main_menu/tests/behat/behat_block_site_main_menu.php
blocks/social_activities/tests/behat/behat_block_social_activities.php
blocks/timeline/amd/build/event_list.min.js
blocks/timeline/amd/build/event_list.min.js.map
blocks/timeline/amd/src/event_list.js
blocks/upgrade.txt
calendar/externallib.php
calendar/lib.php
config-dist.php
course/amd/build/repository.min.js
course/amd/build/repository.min.js.map
course/amd/src/repository.js
course/edit.php
course/format/singleactivity/lib.php
course/format/singleactivity/tests/behat/create_course.feature [new file with mode: 0644]
course/lib.php
course/publish/backup.php [deleted file]
course/publish/forms.php [deleted file]
course/publish/hubselector.php [deleted file]
course/publish/index.php [deleted file]
course/publish/metadata.php [deleted file]
course/renderer.php
course/tests/behat/behat_course.php
course/tests/behat/course_creation.feature
course/tests/courselib_test.php
course/tests/externallib_test.php
filter/mediaplugin/styles.css
grade/tests/behat/grade_to_pass.feature
group/overview.php
install/lang/cs/install.php
install/lang/de_wp/langconfig.php
install/lang/ro_wp/moodle.php
install/lang/zh_cn_wp/langconfig.php [moved from blocks/community/version.php with 55% similarity]
install/lang/zh_tw_wp/langconfig.php [moved from course/publish/lib.php with 54% similarity]
lang/en/admin.php
lang/en/analytics.php
lang/en/backup.php
lang/en/badges.php
lang/en/calendar.php
lang/en/completion.php
lang/en/deprecated.txt
lang/en/error.php
lang/en/hub.php
lang/en/langconfig.php
lang/en/message.php
lang/en/moodle.php
lang/en/my.php
lang/en/role.php
lib/amd/build/pubsub.min.js
lib/amd/build/pubsub.min.js.map
lib/amd/build/templates.min.js
lib/amd/build/templates.min.js.map
lib/amd/src/pubsub.js
lib/amd/src/templates.js
lib/behat/behat_base.php
lib/behat/classes/behat_selectors.php
lib/classes/hub/api.php
lib/classes/hub/course_publication_form.php [deleted file]
lib/classes/hub/publication.php [deleted file]
lib/classes/hub/registration.php
lib/classes/output/mustache_engine.php [new file with mode: 0644]
lib/classes/output/mustache_helper_collection.php [new file with mode: 0644]
lib/classes/plugin_manager.php
lib/classes/requirejs.php
lib/csslib.php
lib/db/access.php
lib/db/install.php
lib/db/install.xml
lib/db/upgrade.php
lib/dml/pgsql_native_moodle_database.php
lib/editor/atto/lang/en/editor_atto.php
lib/form/amd/build/submit.min.js [new file with mode: 0644]
lib/form/amd/build/submit.min.js.map [new file with mode: 0644]
lib/form/amd/src/submit.js [new file with mode: 0644]
lib/form/templates/element-submit-inline.mustache
lib/form/templates/element-submit.mustache
lib/mlbackend/php/classes/processor.php
lib/mlbackend/python/classes/processor.php
lib/moodlelib.php
lib/navigationlib.php
lib/outputrenderers.php
lib/outputrequirementslib.php
lib/setup.php
lib/tests/behat/behat_general.php
lib/tests/behat/behat_permissions.php
lib/tests/calendar_cron_task_test.php
lib/tests/core_renderer_template_exploit_test.php [new file with mode: 0644]
lib/tests/output_mustache_helper_collection_test.php [new file with mode: 0644]
lib/upgrade.txt
message/amd/build/message_drawer.min.js
message/amd/build/message_drawer.min.js.map
message/amd/src/message_drawer.js
message/templates/message_drawer.mustache
message/templates/message_drawer_view_conversation_body_day.mustache
message/templates/message_drawer_view_conversation_body_message.mustache
message/tests/behat/behat_message.php
message/tests/behat/block_user.feature
mod/assign/feedback/editpdf/styles.css
mod/assign/lang/en/assign.php
mod/assign/locallib.php
mod/assign/styles.css
mod/assign/tests/behat/relative_dates.feature
mod/assign/tests/events_test.php
mod/data/field.php
mod/feedback/feedback.js [deleted file]
mod/feedback/lang/en/feedback.php
mod/feedback/show_nonrespondents.php
mod/forum/classes/subscriptions.php
mod/forum/subscribe.php
mod/forum/tests/subscriptions_test.php
mod/glossary/editcategories.html
mod/glossary/editcategories.php
mod/lesson/locallib.php
mod/quiz/lang/en/quiz.php
mod/scorm/classes/external.php
mod/scorm/tests/externallib_test.php
npm-shrinkwrap.json
package.json
question/type/ddimageortext/styles.css
question/type/ddwtos/styles.css
rating/classes/external.php
theme/boost/scss/moodle/message.scss
theme/boost/style/moodle.css
theme/classic/style/moodle.css
theme/styles.php
theme/styles_debug.php
theme/upgrade.txt
user/selector/module.js
user/tests/behat/set_default_homepage.feature
version.php
webservice/externallib.php
webservice/tests/externallib_test.php
webservice/upgrade.txt

index 2388717..e44591a 100644 (file)
--- a/.eslintrc
+++ b/.eslintrc
       }
     },
     {
-      files: ["**/amd/src/*.js", "**/amd/src/**/*.js"],
+      files: ["**/amd/src/*.js", "**/amd/src/**/*.js", "Gruntfile*.js", "babel-plugin-add-module-to-define.js"],
       // We support es6 now. Woot!
       env: {
         es6: true
diff --git a/.jshintignore b/.jshintignore
new file mode 100644 (file)
index 0000000..5e61b7c
--- /dev/null
@@ -0,0 +1,2 @@
+**/amd/**
+/*.js
diff --git a/.nvmrc b/.nvmrc
new file mode 100644 (file)
index 0000000..7796292
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+v8.16.1
index 771bed1..bd41cf3 100644 (file)
@@ -24,6 +24,7 @@
  * Grunt configuration
  */
 
+/* eslint-env node */
 module.exports = function(grunt) {
     var path = require('path'),
         tasks = {},
@@ -575,6 +576,7 @@ module.exports = function(grunt) {
                 };
 
                 if (relativePath) {
+                    /* eslint-disable camelcase */
                     sub.relative_root = relativePath;
                 }
 
index 3151445..ce44d1e 100644 (file)
@@ -50,6 +50,7 @@ class purge_caches extends \moodleform {
             $mform->createElement('advcheckbox', 'theme', '', get_string('purgethemecache', 'admin')),
             $mform->createElement('advcheckbox', 'lang', '', get_string('purgelangcache', 'admin')),
             $mform->createElement('advcheckbox', 'js', '', get_string('purgejscache', 'admin')),
+            $mform->createElement('advcheckbox', 'template', '', get_string('purgetemplates', 'admin')),
             $mform->createElement('advcheckbox', 'filter', '', get_string('purgefiltercache', 'admin')),
             $mform->createElement('advcheckbox', 'muc', '', get_string('purgemuc', 'admin')),
             $mform->createElement('advcheckbox', 'other', '', get_string('purgeothercaches', 'admin'))
index 4730c32..dc924f7 100644 (file)
@@ -275,4 +275,10 @@ preferences,moodle|/user/preferences.php|t/preferences',
     $temp->add(new admin_setting_configtextarea('additionalhtmlfooter', new lang_string('additionalhtmlfooter', 'admin'), new lang_string('additionalhtmlfooter_desc', 'admin'), '', PARAM_RAW));
     $ADMIN->add('appearance', $temp);
 
+    $setting = new admin_setting_configcheckbox('cachetemplates', new lang_string('cachetemplates', 'admin'),
+        new lang_string('cachetemplates_help', 'admin'), 1);
+    $setting->set_updatedcallback('template_reset_all_caches');
+    $temp = new admin_settingpage('templates', new lang_string('templates', 'admin'));
+    $temp->add($setting);
+    $ADMIN->add('appearance', $temp);
 } // end of speedup
index e5c660b..de5f75b 100644 (file)
@@ -48,7 +48,4 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
 
     $optionalsubsystems->add(new admin_setting_configcheckbox('allowstealth', new lang_string('allowstealthmodules'),
         new lang_string('allowstealthmodules_help'), 0, 1, 0));
-
-    $optionalsubsystems->add(new admin_setting_configcheckbox('enablecoursepublishing',
-        new lang_string('enablecoursepublishing', 'hub'), new lang_string('enablecoursepublishing_help', 'hub'), 0));
 }
index 5de8e0a..e3ffc92 100644 (file)
@@ -20,12 +20,12 @@ Feature: Edit capabilities
     And I set the following system permissions of "Teacher" role:
       | capability | permission |
       | block/mnet_hosts:myaddinstance | Allow |
-      | moodle/community:add | Inherit |
+      | moodle/site:messageanyuser | Inherit |
       | moodle/grade:managesharedforms | Prevent |
       | moodle/course:request | Prohibit |
     When I follow "Edit Teacher role"
     Then "block/mnet_hosts:myaddinstance" capability has "Allow" permission
-    And "moodle/community:add" capability has "Not set" permission
+    And "moodle/site:messageanyuser" capability has "Not set" permission
     And "moodle/grade:managesharedforms" capability has "Prevent" permission
     And "moodle/course:request" capability has "Prohibit" permission
 
index dde7c3e..30a9628 100644 (file)
@@ -114,15 +114,17 @@ class tool_capability_renderer extends plugin_renderer_base {
         }
 
         // Start the list item, and print the context name as a link to the place to make changes.
-        if ($contextid == context_system::instance()->id) {
+        $context = context::instance_by_id($contextid);
+
+        if ($context instanceof context_system) {
             $url = new moodle_url('/admin/roles/manage.php');
-            $title = get_string('changeroles', 'tool_capability');
         } else {
-            $url = new moodle_url('/admin/roles/override.php', array('contextid' => $contextid));
-            $title = get_string('changeoverrides', 'tool_capability');
+            $url = new moodle_url('/admin/roles/permissions.php', ['contextid' => $contextid]);
         }
-        $context = context::instance_by_id($contextid);
-        $html = $this->output->heading(html_writer::link($url, $context->get_context_name(), array('title' => $title)), 3);
+
+        $title = get_string('permissionsincontext', 'core_role', $context->get_context_name());
+
+        $html = $this->output->heading(html_writer::link($url, $title), 3);
         $html .= html_writer::table($table);
         // If there are any child contexts, print them recursively.
         if (!empty($contexts[$contextid]->children)) {
@@ -133,4 +135,4 @@ class tool_capability_renderer extends plugin_renderer_base {
         return $html;
     }
 
-}
\ No newline at end of file
+}
index 1711f5e..8daab15 100644 (file)
@@ -105,7 +105,7 @@ $string['requirevalidation'] = 'Validate sender address';
 $string['name'] = 'Name';
 $string['ssl'] = 'SSL (Auto-detect SSL version)';
 $string['sslv2'] = 'SSLv2 (Force SSL Version 2)';
-$string['sslv3'] = 'SSLv2 (Force SSL Version 3)';
+$string['sslv3'] = 'SSLv3 (Force SSL Version 3)';
 $string['taskcleanup'] = 'Cleanup of unverified incoming email';
 $string['taskpickup'] = 'Incoming email pickup';
 $string['tls'] = 'TLS (TLS; started via protocol-level negotiation over unencrypted channel; RECOMMENDED way of initiating secure connection)';
index e9d1c67..73c81ff 100644 (file)
@@ -369,12 +369,12 @@ class external extends external_api {
 
     /**
      * Returns a piece of content to be displayed in the Mobile app, it usually returns a template, javascript and
-     * other structured data that will be used to render a view in the Mobile app..
+     * other structured data that will be used to render a view in the Mobile app.
      *
      * Callbacks (placed in \$component\output\mobile) that are called by this web service are responsible for doing the
      * appropriate security checks to access the information to be returned.
      *
-     * @param string $component fame of the component.
+     * @param string $component name of the component.
      * @param string $method function method name in class \$component\output\mobile.
      * @param array $args optional arguments for the method.
      * @return array HTML, JavaScript and other required data and information to create a view in the app.
@@ -423,6 +423,7 @@ class external extends external_api {
             'otherdata'  => $otherdata,
             'files'      => !empty($result['files']) ? $result['files'] : array(),
             'restrict'   => !empty($result['restrict']) ? $result['restrict'] : array(),
+            'disabled'   => !empty($result['disabled']) ? true : false,
         );
     }
 
@@ -465,7 +466,8 @@ class external extends external_api {
                         ),
                     ),
                     'Restrict this content to certain users or courses.'
-                )
+                ),
+                'disabled' => new external_value(PARAM_BOOL, 'Whether we consider this disabled or not.', VALUE_OPTIONAL),
             )
         );
     }
index 0b6ba81..b02ff9e 100644 (file)
@@ -58,7 +58,7 @@ $string['downloadcourse'] = 'Download course';
 $string['downloadcourses'] = 'Download courses';
 $string['enablesmartappbanners'] = 'Enable App Banners';
 $string['enablesmartappbanners_desc'] = 'If enabled, a banner promoting the mobile app will be displayed when accessing the site using a mobile browser.';
-$string['forcedurlscheme'] = 'If you want to allow only your custom branded app to be opened via a browser window, then specify its URL scheme here; otherwise leave the field empty.';
+$string['forcedurlscheme'] = 'If you want to allow only your custom branded app to be opened via a browser window, then specify its URL scheme here. If you want to allow only the official app, then set the default value. Leave the field empty if you want to allow any app.';
 $string['forcedurlscheme_key'] = 'URL scheme';
 $string['forcelogout'] = 'Force log out';
 $string['forcelogout_desc'] = 'If enabled, the app option \'Change site\' is replaced by \'Log out\'. This results in the user being completely logged out. They must then re-enter their password the next time they wish to access the site.';
@@ -82,7 +82,7 @@ $string['mobileappearance'] = 'Mobile appearance';
 $string['mobileauthentication'] = 'Mobile authentication';
 $string['mobilecssurl'] = 'CSS';
 $string['mobilefeatures'] = 'Mobile features';
-$string['mobilenotificationsdisabledwarning'] = 'Mobile notifications are not enabled. They should be enabled in Manage message outputs.';
+$string['mobilenotificationsdisabledwarning'] = 'Mobile notifications are not enabled. They should be enabled in Notification settings.';
 $string['mobilesettings'] = 'Mobile settings';
 $string['offlineuse'] = 'Offline use';
 $string['pluginname'] = 'Moodle app tools';
index 1e74e37..2c5fc18 100644 (file)
@@ -30,7 +30,7 @@ require_once($CFG->libdir . '/externallib.php');
 
 $serviceshortname  = required_param('service',  PARAM_ALPHANUMEXT);
 $passport          = required_param('passport',  PARAM_RAW);    // Passport send from the app to validate the response URL.
-$urlscheme         = optional_param('urlscheme', 'moodlemobile', PARAM_NOTAGS); // The URL scheme the app supports.
+$urlscheme         = optional_param('urlscheme', 'moodlemobile', PARAM_ALPHANUM); // The URL scheme the app supports.
 $confirmed         = optional_param('confirmed', false, PARAM_BOOL);  // If we are being redirected after user confirmation.
 $oauthsso          = optional_param('oauthsso', 0, PARAM_INT); // Id of the OpenID issuer (for OAuth direct SSO).
 
index 5a313ed..b5033d8 100644 (file)
@@ -63,7 +63,7 @@ if ($hassiteconfig) {
 
         $temp->add(new admin_setting_configtext('tool_mobile/forcedurlscheme',
                     new lang_string('forcedurlscheme_key', 'tool_mobile'),
-                    new lang_string('forcedurlscheme', 'tool_mobile'), '', PARAM_NOTAGS));
+                    new lang_string('forcedurlscheme', 'tool_mobile'), 'moodlemobile', PARAM_ALPHANUM));
 
         $ADMIN->add('mobileapp', $temp);
 
index 6bfea7f..955fbb9 100644 (file)
@@ -371,6 +371,19 @@ class tool_mobile_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals(array(1, 2), $result['restrict']['users']);
         $this->assertEquals(array(3, 4), $result['restrict']['courses']);
         $this->assertEmpty($result['files']);
+        $this->assertFalse($result['disabled']);
+    }
+
+    /**
+     * Test get_content disabled.
+     */
+    public function test_get_content_disabled() {
+
+        $paramval = 16;
+        $result = external::get_content('tool_mobile', 'test_view_disabled',
+            array(array('name' => 'param1', 'value' => $paramval)));
+        $result = external_api::clean_returnvalue(external::get_content_returns(), $result);
+        $this->assertTrue($result['disabled']);
     }
 
     /**
index d803743..451b00f 100644 (file)
@@ -38,7 +38,6 @@ class mobile {
     /**
      * Returns a test view.
      * @param  array $args Arguments from tool_mobile_get_content WS
-     *
      * @return array       HTML, javascript and otherdata
      */
     public static function test_view($args) {
@@ -57,4 +56,27 @@ class mobile {
             'files' => array()
         );
     }
+
+    /**
+     * Returns a test view disabled.
+     * @param  array $args Arguments from tool_mobile_get_content WS
+     * @return array       HTML, javascript and otherdata
+     */
+    public static function test_view_disabled($args) {
+        $args = (object) $args;
+
+        return array(
+            'templates' => array(
+                array(
+                    'id' => 'main',
+                    'html' => 'The HTML code',
+                ),
+            ),
+            'javascript' => 'alert();',
+            'otherdata' => array('otherdata1' => $args->param1),
+            'restrict' => array('users' => array(1, 2), 'courses' => array(3, 4)),
+            'files' => array(),
+            'disabled' => true,
+        );
+    }
 }
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 133df3f..cdbd8a7 100644 (file)
@@ -33,8 +33,9 @@
  */
 
 "use strict";
+/* eslint-env node */
 
-module.exports = ({ template, types }) => {
+module.exports = ({template, types}) => {
     const fs = require('fs');
     const path = require('path');
     const glob = require('glob');
@@ -120,15 +121,20 @@ module.exports = ({ template, types }) => {
         throw new Error('Unable to find module name for ' + searchFileName);
     }
 
-    // This is heavily inspired by the babel-plugin-add-module-exports plugin.
-    // See: https://github.com/59naga/babel-plugin-add-module-exports
-    //
-    // This is used when we detect a module using "export default Foo;" to make
-    // sure the transpiled code just returns Foo directly rather than an object
-    // with the default property (i.e. {default: Foo}).
-    //
-    // Note: This means that we can't support modules that combine named exports
-    // with a default export.
+    /**
+     * This is heavily inspired by the babel-plugin-add-module-exports plugin.
+     * See: https://github.com/59naga/babel-plugin-add-module-exports
+     *
+     * This is used when we detect a module using "export default Foo;" to make
+     * sure the transpiled code just returns Foo directly rather than an object
+     * with the default property (i.e. {default: Foo}).
+     *
+     * Note: This means that we can't support modules that combine named exports
+     * with a default export.
+     *
+     * @param {String} path
+     * @param {String} exportObjectName
+     */
     function addModuleExportsDefaults(path, exportObjectName) {
         const rootPath = path.findParent(path => {
             return path.key === 'body' || !path.parentPath;
@@ -136,7 +142,7 @@ module.exports = ({ template, types }) => {
 
         // HACK: `path.node.body.push` instead of path.pushContainer(due doesn't work in Plugin.post).
         // This is hardcoded to work specifically with AMD.
-        rootPath.node.body.push(template(`return ${exportObjectName}.default`)())
+        rootPath.node.body.push(template(`return ${exportObjectName}.default`)());
     }
 
     return {
@@ -174,9 +180,9 @@ module.exports = ({ template, types }) => {
 
                             // Check for any Object.defineProperty('exports', 'default') calls.
                             if (!this.addedReturnForDefaultExport && path.get('callee').matchesPattern('Object.defineProperty')) {
-                                const [identifier, prop] = path.get('arguments')
-                                const objectName = identifier.get('name').node
-                                const propertyName = prop.get('value').node
+                                const [identifier, prop] = path.get('arguments');
+                                const objectName = identifier.get('name').node;
+                                const propertyName = prop.get('value').node;
 
                                 if ((objectName === 'exports' || objectName === '_exports') && propertyName === 'default') {
                                     addModuleExportsDefaults(path, objectName);
index 164da0b..7cd4c14 100644 (file)
@@ -128,15 +128,6 @@ abstract class backup_check {
         // Now, if backup mode is hub or import, check userid has permissions for those modes
         // other modes will perform common checks only (backupxxxx capabilities in $typecapstocheck)
         switch ($mode) {
-            case backup::MODE_HUB:
-                if (!has_capability('moodle/backup:backuptargethub', $coursectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->courseid = $courseid;
-                    $a->capability = 'moodle/backup:backuptargethub';
-                    throw new backup_controller_exception('backup_user_missing_capability', $a);
-                }
-                break;
             case backup::MODE_IMPORT:
                 if (!has_capability('moodle/backup:backuptargetimport', $coursectx, $userid)) {
                     $a = new stdclass();
index ee2b6cd..35fe2d9 100644 (file)
@@ -90,15 +90,6 @@ abstract class restore_check {
         // Now, if restore mode is hub or import, check userid has permissions for those modes
         // other modes will perform common checks only (restorexxxx capabilities in $typecapstocheck)
         switch ($mode) {
-            case backup::MODE_HUB:
-                if (!has_capability('moodle/restore:restoretargethub', $coursectx, $userid)) {
-                    $a = new stdclass();
-                    $a->userid = $userid;
-                    $a->courseid = $courseid;
-                    $a->capability = 'moodle/restore:restoretargethub';
-                    throw new restore_controller_exception('restore_user_missing_capability', $a);
-                }
-                break;
             case backup::MODE_IMPORT:
                 if (!has_capability('moodle/restore:restoretargetimport', $coursectx, $userid)) {
                     $a = new stdclass();
index a46499f..43e9dd7 100644 (file)
@@ -404,8 +404,10 @@ class core_backup_renderer extends plugin_renderer_base {
         $html .= $this->output->heading(get_string('importdatafrom'), 2, array('class' => 'header'));
         $html .= $this->backup_detail_pair(get_string('selectacourse', 'backup'), $this->render($courses));
         $attrs = array('type' => 'submit', 'value' => get_string('continue'), 'class' => 'btn btn-primary');
+        $html .= html_writer::start_tag('div', array('class' => 'mt-3'));
         $html .= $this->backup_detail_pair('', html_writer::empty_tag('input', $attrs));
         $html .= html_writer::end_tag('div');
+        $html .= html_writer::end_tag('div');
         $html .= html_writer::end_tag('form');
         $html .= html_writer::end_tag('div');
         return $html;
@@ -787,7 +789,7 @@ class core_backup_renderer extends plugin_renderer_base {
         if ($component->get_count() === 0) {
             $output .= $this->output->notification(get_string('nomatchingcourses', 'backup'));
 
-            $output .= html_writer::start_tag('div', array('class' => 'ics-search'));
+            $output .= html_writer::start_tag('div', array('class' => 'ics-search form-inline'));
             $attrs = array(
                 'type' => 'text',
                 'name' => restore_course_search::$VAR_SEARCH,
@@ -799,7 +801,7 @@ class core_backup_renderer extends plugin_renderer_base {
                 'type' => 'submit',
                 'name' => 'searchcourses',
                 'value' => get_string('search'),
-                'class' => 'btn btn-secondary'
+                'class' => 'btn btn-secondary ml-1'
             );
             $output .= html_writer::empty_tag('input', $attrs);
             $output .= html_writer::end_tag('div');
@@ -845,7 +847,7 @@ class core_backup_renderer extends plugin_renderer_base {
         $output .= html_writer::table($table);
         $output .= html_writer::end_tag('div');
 
-        $output .= html_writer::start_tag('div', array('class' => 'ics-search'));
+        $output .= html_writer::start_tag('div', array('class' => 'ics-search form-inline'));
         $attrs = array(
             'type' => 'text',
             'name' => restore_course_search::$VAR_SEARCH,
@@ -856,7 +858,7 @@ class core_backup_renderer extends plugin_renderer_base {
             'type' => 'submit',
             'name' => 'searchcourses',
             'value' => get_string('search'),
-            'class' => 'btn btn-secondary'
+            'class' => 'btn btn-secondary ml-1'
         );
         $output .= html_writer::empty_tag('input', $attrs);
         $output .= html_writer::end_tag('div');
index bd24b15..d1bae45 100644 (file)
@@ -20,7 +20,7 @@ Feature: Restore Moodle 2 course backups
     And I add a "Forum" to section "1" and I fill the form with:
       | Forum name | Test forum name |
       | Description | Test forum description |
-    And I add the "Community finder" block
+    And I add the "Activities" block
 
   @javascript
   Scenario: Restore a course in another existing course
@@ -28,7 +28,7 @@ Feature: Restore Moodle 2 course backups
       | Confirmation | Filename | test_backup.mbz |
     And I restore "test_backup.mbz" backup into "Course 2" course using this options:
     Then I should see "Course 2"
-    And I should see "Community finder" in the "Community finder" "block"
+    And I should see "Activities" in the "Activities" "block"
     And I should see "Test forum name"
 
   @javascript
@@ -38,7 +38,7 @@ Feature: Restore Moodle 2 course backups
     And I restore "test_backup.mbz" backup into a new course using this options:
       | Schema | Course name | Course 1 restored in a new course |
     Then I should see "Course 1 restored in a new course"
-    And I should see "Community finder" in the "Community finder" "block"
+    And I should see "Activities" in the "Activities" "block"
     And I should see "Test forum name"
     And I should see "Topic 15"
     And I should not see "Topic 16"
@@ -72,7 +72,7 @@ Feature: Restore Moodle 2 course backups
     Then I should see "Course 1"
     And I should not see "Section 3"
     And I should not see "Test forum post backup name"
-    And I should see "Community finder" in the "Community finder" "block"
+    And I should see "Activities" in the "Activities" "block"
     And I should see "Test forum name"
 
   @javascript
diff --git a/blocks/community/block_community.php b/blocks/community/block_community.php
deleted file mode 100644 (file)
index fc345ca..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-<?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/>.
-
-/**
- * @package block_community
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- *
- * The community block
- */
-
-class block_community extends block_list {
-
-    function init() {
-        $this->title = get_string('pluginname', 'block_community');
-    }
-
-    function user_can_addto($page) {
-        // Don't allow people to add the block if they can't even use it
-        if (!has_capability('moodle/community:add', $page->context)) {
-            return false;
-        }
-
-        return parent::user_can_addto($page);
-    }
-
-    function user_can_edit() {
-        // Don't allow people to edit the block if they can't even use it
-        if (!has_capability('moodle/community:add',
-                        context::instance_by_id($this->instance->parentcontextid))) {
-            return false;
-        }
-        return parent::user_can_edit();
-    }
-
-    function get_content() {
-        global $CFG, $OUTPUT, $USER;
-
-        $coursecontext = context::instance_by_id($this->instance->parentcontextid);
-
-        if (!has_capability('moodle/community:add', $coursecontext)
-                or $this->content !== NULL) {
-            return $this->content;
-        }
-
-        $this->content = new stdClass();
-        $this->content->items = array();
-        $this->content->icons = array();
-        $this->content->footer = '';
-
-        if (!isloggedin()) {
-            return $this->content;
-        }
-
-        $icon = $OUTPUT->pix_icon('i/group', get_string('group'));
-        $addcourseurl = new moodle_url('/blocks/community/communitycourse.php',
-                        array('add' => true, 'courseid' => $this->page->course->id));
-        $searchlink = html_writer::tag('a', $icon . get_string('addcourse', 'block_community'),
-                        array('href' => $addcourseurl->out(false)));
-        $this->content->items[] = $searchlink;
-
-        require_once($CFG->dirroot . '/blocks/community/locallib.php');
-        $communitymanager = new block_community_manager();
-        $courses = $communitymanager->block_community_get_courses($USER->id);
-        if ($courses) {
-            $this->content->items[] = html_writer::empty_tag('hr');
-            $this->content->icons[] = '';
-            $this->content->items[] = get_string('mycommunities', 'block_community');
-            $this->content->icons[] = '';
-            foreach ($courses as $course) {
-                //delete link
-                $deleteicon = $OUTPUT->pix_icon('t/delete', get_string('removecommunitycourse', 'block_community'));
-                $deleteurl = new moodle_url('/blocks/community/communitycourse.php',
-                                array('remove' => true,
-                                    'courseid' => $this->page->course->id,
-                                    'communityid' => $course->id, 'sesskey' => sesskey()));
-                $deleteatag = html_writer::tag('a', $deleteicon, array('href' => $deleteurl));
-
-                $courselink = html_writer::tag('a', $course->coursename,
-                                array('href' => $course->courseurl));
-                $this->content->items[] = $courselink . ' ' . $deleteatag;
-                $this->content->icons[] = '';
-            }
-        }
-
-        return $this->content;
-    }
-
-}
-
diff --git a/blocks/community/classes/privacy/provider.php b/blocks/community/classes/privacy/provider.php
deleted file mode 100644 (file)
index dd32b8f..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-<?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/>.
-
-/**
- * Privacy Subsystem implementation for block_community.
- *
- * @package    block_community
- * @copyright  2018 Zig Tan <zig@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-namespace block_community\privacy;
-
-defined('MOODLE_INTERNAL') || die();
-
-use core_privacy\local\request\approved_contextlist;
-use core_privacy\local\request\contextlist;
-use core_privacy\local\request\writer;
-use core_privacy\local\request\deletion_criteria;
-use core_privacy\local\metadata\collection;
-use core_privacy\local\request\userlist;
-use core_privacy\local\request\approved_userlist;
-
-/**
- * Privacy Subsystem implementation for block_community.
- *
- * @copyright  2018 Zig Tan <zig@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class provider implements
-        \core_privacy\local\metadata\provider,
-        \core_privacy\local\request\core_userlist_provider,
-        \core_privacy\local\request\plugin\provider {
-
-    /**
-     * Returns information about how block_community stores its data.
-     *
-     * @param   collection     $collection The initialised collection to add items to.
-     * @return  collection     A listing of user data stored through this system.
-     */
-    public static function get_metadata(collection $collection) : collection {
-        $collection->add_database_table(
-            'block_community',
-            [
-                'coursename' => 'privacy:metadata:block_community:coursename',
-                'coursedescription' => 'privacy:metadata:block_community:coursedescription',
-                'courseurl' => 'privacy:metadata:block_community:courseurl',
-                'imageurl' => 'privacy:metadata:block_community:imageurl',
-                'userid' => 'privacy:metadata:block_community:userid',
-            ],
-            'privacy:metadata:block_community'
-        );
-
-        return $collection;
-    }
-
-    /**
-     * Get the list of contexts that contain user information for the specified user.
-     *
-     * @param   int         $userid     The user to search.
-     * @return  contextlist   $contextlist  The contextlist containing the list of contexts used in this plugin.
-     */
-    public static function get_contexts_for_userid(int $userid) : contextlist {
-        $contextlist = new \core_privacy\local\request\contextlist();
-
-        // The block_community data is associated at the user context level, so retrieve the user's context id.
-        $sql = "SELECT c.id
-                  FROM {block_community} bc
-                  JOIN {context} c ON c.instanceid = bc.userid AND c.contextlevel = :contextuser
-                 WHERE bc.userid = :userid
-              GROUP BY c.id";
-
-        $params = [
-            'contextuser'   => CONTEXT_USER,
-            'userid'        => $userid
-        ];
-
-        $contextlist->add_from_sql($sql, $params);
-
-        return $contextlist;
-    }
-
-    /**
-     * Get the list of users within a specific context.
-     *
-     * @param userlist $userlist The userlist containing the list of users who have data in this context/plugin combination.
-     */
-    public static function get_users_in_context(userlist $userlist) {
-        $context = $userlist->get_context();
-
-        if (!$context instanceof \context_user) {
-            return;
-        }
-
-        $sql = "SELECT userid
-                  FROM {block_community}
-                 WHERE userid = ?";
-        $params = [$context->instanceid];
-        $userlist->add_from_sql('userid', $sql, $params);
-    }
-
-    /**
-     * Export all user data for the specified user using the User context level.
-     *
-     * @param   approved_contextlist    $contextlist    The approved contexts to export information for.
-     */
-    public static function export_user_data(approved_contextlist $contextlist) {
-        global $DB;
-
-        // If the user has block_community data, then only the User context should be present so get the first context.
-        $contexts = $contextlist->get_contexts();
-        if (count($contexts) == 0) {
-            return;
-        }
-        $context = reset($contexts);
-
-        // Sanity check that context is at the User context level, then get the userid.
-        if ($context->contextlevel !== CONTEXT_USER) {
-            return;
-        }
-        $userid = $context->instanceid;
-
-        // The block_community data export is organised in: {User Context}/Community Finder/My communities/data.json.
-        $subcontext = [
-            get_string('pluginname', 'block_community'),
-            get_string('mycommunities', 'block_community')
-        ];
-
-        $sql = "SELECT bc.id as id,
-                       bc.coursename as name,
-                       bc.coursedescription as description,
-                       bc.courseurl as url,
-                       bc.imageurl as imageurl
-                  FROM {block_community} bc
-                 WHERE bc.userid = :userid
-              ORDER BY bc.coursename";
-
-        $params = [
-            'userid' => $userid
-        ];
-
-        $communities = $DB->get_records_sql($sql, $params);
-
-        $data = (object) [
-            'communities' => $communities
-        ];
-
-        writer::with_context($context)->export_data($subcontext, $data);
-    }
-
-    /**
-     * Delete all data for all users in the specified context.
-     *
-     * @param   context $context   The specific context to delete data for.
-     */
-    public static function delete_data_for_all_users_in_context(\context $context) {
-        global $DB;
-
-        // Sanity check that context is at the User context level, then get the userid.
-        if ($context->contextlevel !== CONTEXT_USER) {
-            return;
-        }
-        $userid = $context->instanceid;
-
-        $DB->delete_records('block_community', ['userid' => $userid]);
-    }
-
-    /**
-     * Delete multiple users within a single context.
-     *
-     * @param approved_userlist $userlist The approved context and user information to delete information for.
-     */
-    public static function delete_data_for_users(approved_userlist $userlist) {
-        global $DB;
-
-        $context = $userlist->get_context();
-
-        if ($context instanceof \context_user) {
-            $DB->delete_records('block_community', ['userid' => $context->instanceid]);
-        }
-    }
-
-    /**
-     * Delete all user data for the specified user.
-     *
-     * @param   approved_contextlist $contextlist  The approved contexts and user information to delete information for.
-     */
-    public static function delete_data_for_user(approved_contextlist $contextlist) {
-        global $DB;
-
-        // If the user has block_community data, then only the User context should be present so get the first context.
-        $contexts = $contextlist->get_contexts();
-        if (count($contexts) == 0) {
-            return;
-        }
-        $context = reset($contexts);
-
-        // Sanity check that context is at the User context level, then get the userid.
-        if ($context->contextlevel !== CONTEXT_USER) {
-            return;
-        }
-        $userid = $context->instanceid;
-
-        $DB->delete_records('block_community', ['userid' => $userid]);
-    }
-
-}
diff --git a/blocks/community/communitycourse.php b/blocks/community/communitycourse.php
deleted file mode 100644 (file)
index 67f024b..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-<?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/>.
-
-/**
- * Controller for various actions of the block.
- *
- * This page display the community course search form.
- * It also handles adding a course to the community block.
- * It also handles downloading a course template.
- *
- * @package    block_community
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- */
-
-require('../../config.php');
-require_once($CFG->dirroot . '/blocks/community/locallib.php');
-require_once($CFG->dirroot . '/blocks/community/forms.php');
-
-require_login();
-$courseid = required_param('courseid', PARAM_INT); //if no courseid is given
-$parentcourse = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
-
-$context = context_course::instance($courseid);
-$PAGE->set_course($parentcourse);
-$PAGE->set_url('/blocks/community/communitycourse.php');
-$PAGE->set_heading($SITE->fullname);
-$PAGE->set_pagelayout('incourse');
-$PAGE->set_title(get_string('searchcourse', 'block_community'));
-$PAGE->navbar->add(get_string('searchcourse', 'block_community'));
-
-$search = optional_param('search', null, PARAM_TEXT);
-
-//if no capability to search course, display an error message
-require_capability('moodle/community:add', $context);
-$usercandownload = has_capability('moodle/community:download', $context);
-
-$communitymanager = new block_community_manager();
-$renderer = $PAGE->get_renderer('block_community');
-
-/// Check if the page has been called with trust argument
-$add = optional_param('add', -1, PARAM_INT);
-$confirm = optional_param('confirmed', false, PARAM_INT);
-if ($add != -1 and $confirm and confirm_sesskey()) {
-    $course = new stdClass();
-    $course->name = optional_param('coursefullname', '', PARAM_TEXT);
-    $course->description = optional_param('coursedescription', '', PARAM_TEXT);
-    $course->url = optional_param('courseurl', '', PARAM_URL);
-    $course->imageurl = optional_param('courseimageurl', '', PARAM_URL);
-    $communitymanager->block_community_add_course($course, $USER->id);
-    echo $OUTPUT->header();
-    echo $renderer->save_link_success(
-            new moodle_url('/course/view.php', array('id' => $courseid)));
-    echo $OUTPUT->footer();
-    die();
-}
-
-/// Delete temp file when cancel restore
-$cancelrestore = optional_param('cancelrestore', false, PARAM_INT);
-if ($usercandownload and $cancelrestore and confirm_sesskey()) {
-    $filename = optional_param('filename', '', PARAM_ALPHANUMEXT);
-    //delete temp file
-    $backuptempdir = make_backup_temp_directory('');
-    unlink($backuptempdir . '/' . $filename . ".mbz");
-}
-
-/// Download
-$download = optional_param('download', -1, PARAM_INT);
-$downloadcourseid = optional_param('downloadcourseid', '', PARAM_INT);
-$coursefullname = optional_param('coursefullname', '', PARAM_ALPHANUMEXT);
-$backupsize = optional_param('backupsize', 0, PARAM_INT);
-if ($usercandownload and $download != -1 and !empty($downloadcourseid) and confirm_sesskey()) {
-    //OUTPUT: display restore choice page
-    echo $OUTPUT->header();
-    echo $OUTPUT->heading(get_string('downloadingcourse', 'block_community'), 3, 'main');
-    $sizeinfo = new stdClass();
-    $sizeinfo->total = number_format($backupsize / 1000000, 2);
-    echo html_writer::tag('div', get_string('downloadingsize', 'block_community', $sizeinfo),
-            array('class' => 'textinfo'));
-    if (ob_get_level()) {
-        ob_flush();
-    }
-    flush();
-    list($privatefilename, $tmpfilename) = \core\hub\publication::download_course_backup($downloadcourseid, $coursefullname);
-    echo html_writer::tag('div', get_string('downloaded', 'block_community'),
-            array('class' => 'textinfo'));
-    echo $OUTPUT->notification(get_string('downloadconfirmed', 'block_community',
-                    $privatefilename), 'notifysuccess');
-    echo $renderer->restore_confirmation_box($tmpfilename, $context);
-    echo $OUTPUT->footer();
-    die();
-}
-
-/// Remove community
-$remove = optional_param('remove', '', PARAM_INT);
-$communityid = optional_param('communityid', '', PARAM_INT);
-if ($remove != -1 and !empty($communityid) and confirm_sesskey()) {
-    $communitymanager->block_community_remove_course($communityid, $USER->id);
-    echo $OUTPUT->header();
-    echo $renderer->remove_success(new moodle_url('/course/view.php', array('id' => $courseid)));
-    echo $OUTPUT->footer();
-    die();
-}
-
-//Get form default/current values
-$fromformdata['coverage'] = optional_param('coverage', 'all', PARAM_TEXT);
-$fromformdata['licence'] = optional_param('licence', 'all', PARAM_ALPHANUMEXT);
-$fromformdata['subject'] = optional_param('subject', 'all', PARAM_ALPHANUMEXT);
-$fromformdata['audience'] = optional_param('audience', 'all', PARAM_ALPHANUMEXT);
-$fromformdata['language'] = optional_param('language', current_language(), PARAM_ALPHANUMEXT);
-$fromformdata['educationallevel'] = optional_param('educationallevel', 'all', PARAM_ALPHANUMEXT);
-$fromformdata['downloadable'] = optional_param('downloadable', $usercandownload, PARAM_ALPHANUM);
-$fromformdata['orderby'] = optional_param('orderby', 'newest', PARAM_ALPHA);
-$fromformdata['search'] = $search;
-$fromformdata['courseid'] = $courseid;
-$hubselectorform = new community_hub_search_form('', $fromformdata);
-$hubselectorform->set_data($fromformdata);
-
-//Retrieve courses by web service
-$courses = null;
-if (optional_param('executesearch', 0, PARAM_INT) and confirm_sesskey()) {
-    $downloadable = optional_param('downloadable', false, PARAM_INT);
-
-    $options = new stdClass();
-    if (!empty($fromformdata['coverage'])) {
-        $options->coverage = $fromformdata['coverage'];
-    }
-    if ($fromformdata['licence'] != 'all') {
-        $options->licenceshortname = $fromformdata['licence'];
-    }
-    if ($fromformdata['subject'] != 'all') {
-        $options->subject = $fromformdata['subject'];
-    }
-    if ($fromformdata['audience'] != 'all') {
-        $options->audience = $fromformdata['audience'];
-    }
-    if ($fromformdata['educationallevel'] != 'all') {
-        $options->educationallevel = $fromformdata['educationallevel'];
-    }
-    if ($fromformdata['language'] != 'all') {
-        $options->language = $fromformdata['language'];
-    }
-
-    $options->orderby = $fromformdata['orderby'];
-
-    //the range of course requested
-    $options->givememore = optional_param('givememore', 0, PARAM_INT);
-
-    list($courses, $coursetotal) = \core\hub\publication::search($search, $downloadable, $options);
-}
-
-// OUTPUT
-echo $OUTPUT->header();
-echo $OUTPUT->heading(get_string('searchcommunitycourse', 'block_community'), 3, 'main');
-echo $renderer->moodlenet_info();
-
-$hubselectorform->display();
-if (!empty($errormessage)) {
-    echo $errormessage;
-}
-
-//load javascript
-$commentedcourseids = array(); //result courses with comments only
-$courseids = array(); //all result courses
-$courseimagenumbers = array(); //number of screenshots of all courses (must be exact same order than $courseids)
-if (!empty($courses)) {
-    foreach ($courses as $course) {
-        if (!empty($course['comments'])) {
-            $commentedcourseids[] = $course['id'];
-        }
-        $courseids[] = $course['id'];
-        $courseimagenumbers[] = $course['screenshots'];
-    }
-}
-$PAGE->requires->yui_module('moodle-block_community-comments', 'M.blocks_community.init_comments',
-        array(array('commentids' => $commentedcourseids, 'closeButtonTitle' => get_string('close', 'editor'))));
-$PAGE->requires->yui_module('moodle-block_community-imagegallery', 'M.blocks_community.init_imagegallery',
-        array(array('imageids' => $courseids, 'imagenumbers' => $courseimagenumbers,
-                'huburl' => HUB_MOODLEORGHUBURL, 'closeButtonTitle' => get_string('close', 'editor'))));
-
-echo highlight($search, $renderer->course_list($courses, null, $courseid));
-
-//display givememore/Next link if more course can be displayed
-if (!empty($courses)) {
-    if (($options->givememore + count($courses)) < $coursetotal) {
-        $fromformdata['givememore'] = count($courses) + $options->givememore;
-        $fromformdata['executesearch'] = true;
-        $fromformdata['sesskey'] = sesskey();
-        echo $renderer->next_button($fromformdata);
-    }
-}
-
-echo $OUTPUT->footer();
diff --git a/blocks/community/db/access.php b/blocks/community/db/access.php
deleted file mode 100644 (file)
index 1ec36ed..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?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/>.
-
-/**
- * Community block caps.
- *
- * @package    block_community
- * @copyright  Mark Nelson <markn@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-$capabilities = array(
-
-    'block/community:myaddinstance' => array(
-        'captype' => 'write',
-        'contextlevel' => CONTEXT_SYSTEM,
-        'archetypes' => array(
-            'user' => CAP_ALLOW
-        ),
-
-        'clonepermissionsfrom' => 'moodle/my:manageblocks'
-    ),
-
-    'block/community:addinstance' => array(
-        'riskbitmask' => RISK_SPAM | RISK_XSS,
-
-        'captype' => 'write',
-        'contextlevel' => CONTEXT_BLOCK,
-        'archetypes' => array(
-            'editingteacher' => CAP_ALLOW,
-            'manager' => CAP_ALLOW
-        ),
-
-        'clonepermissionsfrom' => 'moodle/site:manageblocks'
-    ),
-);
diff --git a/blocks/community/db/install.xml b/blocks/community/db/install.xml
deleted file mode 100644 (file)
index 58705d7..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="blocks/community/db" VERSION="20120122" COMMENT="XMLDB file for Moodle blocks/community"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
->
-  <TABLES>
-    <TABLE NAME="block_community" COMMENT="Community block">
-      <FIELDS>
-        <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
-        <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
-        <FIELD NAME="coursename" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
-        <FIELD NAME="coursedescription" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false"/>
-        <FIELD NAME="courseurl" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
-        <FIELD NAME="imageurl" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
-      </FIELDS>
-      <KEYS>
-        <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
-      </KEYS>
-    </TABLE>
-  </TABLES>
-</XMLDB>
\ No newline at end of file
diff --git a/blocks/community/db/upgrade.php b/blocks/community/db/upgrade.php
deleted file mode 100644 (file)
index 1a593de..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?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/>.
-
-/**
- * This file keeps track of upgrades to the community block
- *
- * Sometimes, changes between versions involve alterations to database structures
- * and other major things that may break installations.
- *
- * The upgrade function in this file will attempt to perform all the necessary
- * actions to upgrade your older installation to the current version.
- *
- * If there's something it cannot do itself, it will tell you what you need to do.
- *
- * The commands in here will all be database-neutral, using the methods of
- * database_manager class
- *
- * Please do not forget to use upgrade_set_timeout()
- * before any action that may take longer time to finish.
- *
- * @since Moodle 2.0
- * @package block_community
- * @copyright 2010 Jerome Mouneyrac
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-/**
- *
- * @param int $oldversion
- */
-function xmldb_block_community_upgrade($oldversion) {
-    global $CFG;
-
-    // Automatically generated Moodle v3.3.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Automatically generated Moodle v3.4.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Automatically generated Moodle v3.5.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Automatically generated Moodle v3.6.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    // Automatically generated Moodle v3.7.0 release upgrade line.
-    // Put any upgrade step following this.
-
-    return true;
-}
diff --git a/blocks/community/forms.php b/blocks/community/forms.php
deleted file mode 100644 (file)
index 8142b5c..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-// This file is part of Moodle - http://moodle.org/                      //
-// Moodle - Modular Object-Oriented Dynamic Learning Environment         //
-//                                                                       //
-// 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/>.       //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-
-/**
- * Form for community search
- *
- * @package    block_community
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- */
-
-require_once($CFG->libdir . '/formslib.php');
-
-class community_hub_search_form extends moodleform {
-
-    public function definition() {
-        global $CFG;
-        $mform = & $this->_form;
-
-        //set default value
-        $search = $this->_customdata['search'];
-        if (isset($this->_customdata['coverage'])) {
-            $coverage = $this->_customdata['coverage'];
-        } else {
-            $coverage = 'all';
-        }
-        if (isset($this->_customdata['licence'])) {
-            $licence = $this->_customdata['licence'];
-        } else {
-            $licence = 'all';
-        }
-        if (isset($this->_customdata['subject'])) {
-            $subject = $this->_customdata['subject'];
-        } else {
-            $subject = 'all';
-        }
-        if (isset($this->_customdata['audience'])) {
-            $audience = $this->_customdata['audience'];
-        } else {
-            $audience = 'all';
-        }
-        if (isset($this->_customdata['language'])) {
-            $language = $this->_customdata['language'];
-        } else {
-            $language = current_language();
-        }
-        if (isset($this->_customdata['educationallevel'])) {
-            $educationallevel = $this->_customdata['educationallevel'];
-        } else {
-            $educationallevel = 'all';
-        }
-        if (isset($this->_customdata['downloadable'])) {
-            $downloadable = $this->_customdata['downloadable'];
-        } else {
-            $downloadable = 1;
-        }
-        if (isset($this->_customdata['orderby'])) {
-            $orderby = $this->_customdata['orderby'];
-        } else {
-            $orderby = 'newest';
-        }
-
-        $mform->addElement('header', 'site', get_string('search', 'block_community'));
-
-        //add the course id (of the context)
-        $mform->addElement('hidden', 'courseid', $this->_customdata['courseid']);
-        $mform->setType('courseid', PARAM_INT);
-        $mform->addElement('hidden', 'executesearch', 1);
-        $mform->setType('executesearch', PARAM_INT);
-
-        // Display enrol/download select box if the USER has the download capability on the course.
-        if (has_capability('moodle/community:download',
-                        context_course::instance($this->_customdata['courseid']))) {
-            $options = array(0 => get_string('enrollable', 'block_community'),
-                1 => get_string('downloadable', 'block_community'));
-            $mform->addElement('select', 'downloadable', get_string('enroldownload', 'block_community'),
-                    $options);
-            $mform->addHelpButton('downloadable', 'enroldownload', 'block_community');
-
-            $mform->setDefault('downloadable', $downloadable);
-        } else {
-            $mform->addElement('hidden', 'downloadable', 0);
-        }
-        $mform->setType('downloadable', PARAM_INT);
-
-        $options = \core\hub\publication::audience_options(true);
-        $mform->addElement('select', 'audience', get_string('audience', 'block_community'), $options);
-        $mform->setDefault('audience', $audience);
-        unset($options);
-        $mform->addHelpButton('audience', 'audience', 'block_community');
-
-        $options = \core\hub\publication::educational_level_options(true);
-        $mform->addElement('select', 'educationallevel',
-                get_string('educationallevel', 'block_community'), $options);
-        $mform->setDefault('educationallevel', $educationallevel);
-        unset($options);
-        $mform->addHelpButton('educationallevel', 'educationallevel', 'block_community');
-
-        $options = \core\hub\publication::get_sorted_subjects();
-        $mform->addElement('searchableselector', 'subject', get_string('subject', 'block_community'),
-                $options, array('id' => 'communitysubject'));
-        $mform->setDefault('subject', $subject);
-        unset($options);
-        $mform->addHelpButton('subject', 'subject', 'block_community');
-
-        require_once($CFG->libdir . "/licenselib.php");
-        $licensemanager = new license_manager();
-        $licences = $licensemanager->get_licenses();
-        $options = array();
-        $options['all'] = get_string('any');
-        foreach ($licences as $license) {
-            $options[$license->shortname] = get_string($license->shortname, 'license');
-        }
-        $mform->addElement('select', 'licence', get_string('licence', 'block_community'), $options);
-        unset($options);
-        $mform->addHelpButton('licence', 'licence', 'block_community');
-        $mform->setDefault('licence', $licence);
-
-        $languages = get_string_manager()->get_list_of_languages();
-        core_collator::asort($languages);
-        $languages = array_merge(array('all' => get_string('any')), $languages);
-        $mform->addElement('select', 'language', get_string('language'), $languages);
-
-        $mform->setDefault('language', $language);
-        $mform->addHelpButton('language', 'language', 'block_community');
-
-        $mform->addElement('select', 'orderby', get_string('orderby', 'block_community'),
-            array('newest' => get_string('orderbynewest', 'block_community'),
-                'eldest' => get_string('orderbyeldest', 'block_community'),
-                'fullname' => get_string('orderbyname', 'block_community'),
-                'publisher' => get_string('orderbypublisher', 'block_community'),
-                'ratingaverage' => get_string('orderbyratingaverage', 'block_community')));
-
-        $mform->setDefault('orderby', $orderby);
-        $mform->addHelpButton('orderby', 'orderby', 'block_community');
-        $mform->setType('orderby', PARAM_ALPHA);
-
-        $mform->setAdvanced('audience');
-        $mform->setAdvanced('educationallevel');
-        $mform->setAdvanced('subject');
-        $mform->setAdvanced('licence');
-        $mform->setAdvanced('language');
-        $mform->setAdvanced('orderby');
-
-        $mform->addElement('text', 'search', get_string('keywords', 'block_community'),
-            array('size' => 30));
-        $mform->addHelpButton('search', 'keywords', 'block_community');
-        $mform->setType('search', PARAM_NOTAGS);
-
-        $mform->addElement('submit', 'submitbutton', get_string('search', 'block_community'));
-
-    }
-
-}
diff --git a/blocks/community/lang/en/block_community.php b/blocks/community/lang/en/block_community.php
deleted file mode 100644 (file)
index 73e65d4..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?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/>.
-
-/**
- * Strings for component 'block_community', language 'en', branch 'MOODLE_20_STABLE'
- *
- * @package   block_community
- * @author    Jerome Mouneyrac <jerome@mouneyrac.com>
- * @copyright 1999 onwards Martin Dougiamas  {@link http://moodle.com}
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-$string['activities'] = 'Activities';
-$string['add'] = 'Add';
-$string['addedtoblock'] = 'A link to this course has been added in your community finder block';
-$string['addtocommunityblock'] = 'Save a link to this course';
-$string['addcommunitycourse'] = 'Add community course';
-$string['additionalcoursedesc'] = '{$a->lang} Creator: {$a->creatorname} - Publisher: {$a->publishername} - Subject: {$a->subject}
-    - Audience: {$a->audience} - Educational level: {$a->educationallevel} - License: {$a->license}';
-$string['addcourse'] = 'Search';
-$string['audience'] = 'Designed for';
-$string['audience_help'] = 'What kind of course are you looking for?  As well as traditional courses intended for students, you might search for communities of Educators or Moodle Administrators';
-$string['blocks'] = 'Blocks';
-$string['cannotselecttopsubject'] = 'Cannot select a top subject level';
-$string['comments'] = 'Comments ({$a})';
-$string['community:addinstance'] = 'Add a new community finder block';
-$string['community:myaddinstance'] = 'Add a new community finder block to Dashboard';
-$string['contentinfo'] = 'Subject: {$a->subject} - Audience: {$a->audience} - Educational level: {$a->educationallevel}';
-$string['continue'] = 'Continue';
-$string['contributors'] = ' - Contributors: {$a}';
-$string['coursedesc'] = 'Description';
-$string['courselang'] = 'Language';
-$string['coursename'] = 'Name';
-$string['courses'] = 'Courses';
-$string['coverage'] = 'Tags: {$a}';
-$string['donotrestore'] = 'No';
-$string['dorestore'] = 'Yes';
-$string['download'] = 'Download';
-$string['downloadable'] = 'courses I can download';
-$string['downloadablecourses'] = 'Downloadable courses';
-$string['downloadconfirmed'] = 'The backup has been saved in your private files {$a}';
-$string['downloaded'] = '...finished.';
-$string['downloadingcourse'] = 'Downloading course';
-$string['downloadingsize'] = 'Please wait the course file is downloading ({$a->total}Mb)...';
-$string['downloadtemplate'] = 'Create course from template';
-$string['educationallevel'] = 'Educational level';
-$string['educationallevel_help'] = 'What educational level are you searching for?  In the case of communities of educators, this level describes the level they are teaching.';
-$string['enroldownload'] = 'Find';
-$string['enroldownload_help'] = 'Some courses listed in the selected hub are being advertised so that people can come and participate in them on the original site.
-
-Others are course templates provided for you to download and use on your own Moodle site.';
-$string['enrollable'] = 'courses I can enrol in';
-$string['enrollablecourses'] = 'Enrollable courses';
-$string['errorcourselisting'] = 'An error occurred when retrieving the course listing from the selected hub, please try again later. ({$a})';
-$string['errorhublisting'] = 'An error occurred when retrieving the hub listing from Moodle.org, please try again later. ({$a})';
-$string['fileinfo'] = 'Language: {$a->lang} - License: {$a->license} -  Time updated: {$a->timeupdated}';
-$string['hideall'] = 'Hide hubs';
-$string['hub'] = 'hub';
-$string['hubnottrusted'] = 'Not trusted';
-$string['hubtrusted'] = 'This hub is trusted by Moodle.org';
-$string['install'] = 'Install';
-$string['keywords'] = 'Keywords';
-$string['keywords_help'] = 'You can search for courses containing specific text in the name, description and other fields of the database.';
-$string['langdesc'] = 'Language: {$a} - ';
-$string['language'] = 'Language';
-$string['language_help'] = 'You can search for courses written in a specific language.';
-$string['licence'] = 'License';
-$string['licence_help'] = 'You can search for courses that are licensed in a particular way.';
-$string['moredetails'] = 'More details';
-$string['mycommunities'] = 'My communities:';
-$string['next'] = 'Next >>>';
-$string['nocomments'] = 'No comments';
-$string['nocourse'] = 'No courses found';
-$string['noratings'] = 'No ratings';
-$string['operation'] = 'Operation';
-$string['orderby'] = 'Sort by';
-$string['orderby_help'] = 'The order the search results are displayed.';
-$string['orderbynewest'] = 'Newest';
-$string['orderbyeldest'] = 'Oldest';
-$string['orderbyname'] = 'Name';
-$string['orderbypublisher'] = 'Publisher';
-$string['orderbyratingaverage'] = 'Rating';
-$string['outcomes'] = 'Outcomes: {$a}';
-$string['pluginname'] = 'Community finder';
-$string['privacy:metadata:block_community'] = 'The Community block stores links to shared community courses users can enrol in.';
-$string['privacy:metadata:block_community:coursename'] = 'The name of the linked community course.';
-$string['privacy:metadata:block_community:coursedescription'] = 'The description of the linked community course.';
-$string['privacy:metadata:block_community:courseurl'] = 'The course URL of the linked community course.';
-$string['privacy:metadata:block_community:imageurl'] = 'The image URL of the linked community course.';
-$string['privacy:metadata:block_community:userid'] = 'The ID of the user who created the linked community course.';
-$string['rateandcomment'] = 'Rate and comment';
-$string['rating'] = 'Rating';
-$string['removecommunitycourse'] = 'Remove community course';
-$string['restorecourse'] = 'Restore course';
-$string['restorecourseinfo'] = 'Restore the course?';
-$string['screenshots'] = 'Screenshots';
-$string['search'] = 'Search';
-$string['searchcommunitycourse'] = 'Search for community course';
-$string['searchcourse'] = 'Search for community course';
-$string['selecthub'] = 'Select hub';
-$string['selecthub_help'] = 'Select hub where to search the courses.';
-$string['sites'] = 'Sites';
-$string['showall'] = 'Show all hubs';
-$string['subject'] = 'Subject';
-$string['subject_help'] = 'To narrow your search to courses about a particular subject, choose one from this list.';
-$string['userinfo'] = 'Creator: {$a->creatorname} - Publisher: {$a->publishername}';
-$string['visitdemo'] = 'Visit demo';
-$string['visitsite'] = 'Visit site';
diff --git a/blocks/community/locallib.php b/blocks/community/locallib.php
deleted file mode 100644 (file)
index d975078..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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/>.
-
-/**
- * Community library
- *
- * @package    block_community
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- *
- *
- */
-
-class block_community_manager {
-
-    /**
-     * Add a community course
-     * @param object $course
-     * @param integer $userid
-     * @return id of course or false if already added
-     */
-    public function block_community_add_course($course, $userid) {
-        global $DB;
-
-        $community = $this->block_community_get_course($course->url, $userid);
-
-        if (empty($community)) {
-            $community = new stdClass();
-            $community->userid = $userid;
-            $community->coursename = $course->name;
-            $community->coursedescription = $course->description;
-            $community->courseurl = $course->url;
-            $community->imageurl = $course->imageurl;
-            return $DB->insert_record('block_community', $community);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Return all community courses of a user
-     * @param integer $userid
-     * @return array of course
-     */
-    public function block_community_get_courses($userid) {
-        global $DB;
-        return $DB->get_records('block_community', array('userid' => $userid), 'coursename');
-    }
-
-    /**
-     * Return a community courses of a user
-     * @param integer $userid
-     * @param integer $userid
-     * @return array of course
-     */
-    public function block_community_get_course($courseurl, $userid) {
-        global $DB;
-        return $DB->get_record('block_community',
-                array('courseurl' => $courseurl, 'userid' => $userid));
-    }
-
-    /**
-     * Delete a community course
-     * @param integer $communityid
-     * @param integer $userid
-     * @return bool true
-     */
-    public function block_community_remove_course($communityid, $userid) {
-        global $DB, $USER;
-        return $DB->delete_records('block_community',
-                array('userid' => $userid, 'id' => $communityid));
-    }
-
-}
diff --git a/blocks/community/renderer.php b/blocks/community/renderer.php
deleted file mode 100644 (file)
index f415204..0000000
+++ /dev/null
@@ -1,400 +0,0 @@
-<?php
-
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-// This file is part of Moodle - http://moodle.org/                      //
-// Moodle - Modular Object-Oriented Dynamic Learning Environment         //
-//                                                                       //
-// 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/>.       //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-
-/**
- * Block community renderer.
- * @package   block_community
- * @copyright 2010 Moodle Pty Ltd (http://moodle.com)
- * @author    Jerome Mouneyrac
- * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class block_community_renderer extends plugin_renderer_base {
-
-    public function restore_confirmation_box($filename, $context) {
-        $restoreurl = new moodle_url('/backup/restore.php',
-                        array('filename' => $filename . ".mbz", 'contextid' => $context->id));
-        $searchurl = new moodle_url('/blocks/community/communitycourse.php',
-                        array('add' => 1, 'courseid' => $context->instanceid,
-                            'cancelrestore' => 1, 'sesskey' => sesskey(),
-                            'filename' => $filename));
-        $formrestore = new single_button($restoreurl,
-                        get_string('dorestore', 'block_community'));
-        $formsearch = new single_button($searchurl,
-                        get_string('donotrestore', 'block_community'));
-        return $this->output->confirm(get_string('restorecourseinfo', 'block_community'),
-                $formrestore, $formsearch);
-    }
-
-    /**
-     * Display remove community success message and a button to be redirected to te referer page
-     * @param moodle_url $url the page to be redirected to
-     * @return string html
-     */
-    public function remove_success(moodle_url $url) {
-        $html = $this->output->notification(get_string('communityremoved', 'hub'),
-                    'notifysuccess');
-        $continuebutton = new single_button($url,
-                        get_string('continue', 'block_community'));
-        $html .= html_writer::tag('div', $this->output->render($continuebutton),
-                array('class' => 'continuebutton'));
-        return $html;
-    }
-
-    /**
-     * Display add community course success message and a button to be redirected to te referer page
-     * @param moodle_url $url the page to be redirected to
-     * @return string html
-     */
-    public function save_link_success(moodle_url $url) {
-        $html = $this->output->notification(get_string('addedtoblock', 'block_community'),
-                    'notifysuccess');
-        $continuebutton = new single_button($url,
-                        get_string('continue', 'block_community'));
-        $html .= html_writer::tag('div', $this->output->render($continuebutton),
-                array('class' => 'continuebutton'));
-        return $html;
-    }
-
-    /**
-     * The 'Next'/'more course result' link for a courses search
-     * @param array $data - the form parameter to execute the search on more result
-     * @return string html code
-     */
-    public function next_button($data) {
-        $nextlink = html_writer::tag('a', get_string('next', 'block_community'),
-                array('href' => new moodle_url('', $data)));
-        return html_writer::tag('div', $nextlink, array( 'class' => 'nextlink'));
-    }
-
-    /**
-     * Displays information about moodle.net above course search form
-     *
-     * @return string
-     */
-    public function moodlenet_info() {
-        if (!$info = \core\hub\registration::get_moodlenet_info()) {
-            return '';
-        }
-
-        $image = html_writer::div(html_writer::img($info['imgurl'], $info['name']), 'hubimage');
-
-        $namelink = html_writer::link($info['url'], html_writer::tag('h2', $info['name']), array('class' => 'hubtitlelink'));
-        $description = clean_param($info['description'], PARAM_TEXT);
-        $descriptiontext = html_writer::div(format_text($description, FORMAT_PLAIN), 'hubdescription');
-
-        $additionaldesc = get_string('enrollablecourses', 'block_community') . ': ' . $info['enrollablecourses'] . ' - ' .
-            get_string('downloadablecourses', 'block_community') . ': ' . $info['downloadablecourses'];
-        $stats = html_writer::div(html_writer::tag('div', $additionaldesc), 'hubstats');
-
-        $text = html_writer::div($descriptiontext . $stats, 'hubtext');
-
-        $imgandtext = html_writer::div($image . $text, 'hubimgandtext');
-
-        $fulldesc = html_writer::div($namelink . $imgandtext, 'hubmainhmtl clearfix');
-
-        return html_writer::div($fulldesc, 'formlisting');
-    }
-
-    /**
-     * Display a list of courses
-     * @param array $courses
-     * @param mixed $unused parameter is not used
-     * @param int $contextcourseid context course id
-     * @return string
-     */
-    public function course_list($courses, $unused, $contextcourseid) {
-        global $CFG;
-
-        $renderedhtml = '';
-
-        if (empty($courses)) {
-            if (isset($courses)) {
-                $renderedhtml .= get_string('nocourse', 'block_community');
-            }
-        } else {
-            $courseiteration = 0;
-            foreach ($courses as $course) {
-                $course = (object) $course;
-                $courseiteration = $courseiteration + 1;
-
-                //create visit link html
-                if (!empty($course->courseurl)) {
-                    $courseurl = new moodle_url($course->courseurl);
-                    $linktext = get_string('visitsite', 'block_community');
-                } else {
-                    $courseurl = new moodle_url($course->demourl);
-                    $linktext = get_string('visitdemo', 'block_community');
-                }
-
-                $visitlinkhtml = html_writer::tag('a', $linktext,
-                                array('href' => $courseurl, 'class' => 'hubcoursedownload',
-                                    'onclick' => 'this.target="_blank"'));
-
-                //create title html
-                $coursename = html_writer::tag('h3', $course->fullname,
-                                array('class' => 'hubcoursetitle'));
-                $coursenamehtml = html_writer::tag('div', $coursename,
-                        array('class' => 'hubcoursetitlepanel'));
-
-                // create screenshots html
-                $screenshothtml = '';
-                if (!empty($course->screenshotbaseurl)) {
-                    $screenshothtml = html_writer::empty_tag('img',
-                        array('src' => $course->screenshotbaseurl, 'alt' => $course->fullname));
-                }
-                $coursescreenshot = html_writer::tag('div', $screenshothtml,
-                                array('class' => 'coursescreenshot',
-                                    'id' => 'image-' . $course->id));
-
-                //create description html
-                $deschtml = html_writer::tag('div', $course->description,
-                                array('class' => 'hubcoursedescription'));
-
-                //create users related information html
-                $courseuserinfo = get_string('userinfo', 'block_community', $course);
-                if ($course->contributornames) {
-                    $courseuserinfo .= ' - ' . get_string('contributors', 'block_community',
-                                    $course->contributornames);
-                }
-                $courseuserinfohtml = html_writer::tag('div', $courseuserinfo,
-                                array('class' => 'hubcourseuserinfo'));
-
-                //create course content related information html
-                $course->subject = (get_string_manager()->string_exists($course->subject, 'edufields')) ?
-                        get_string($course->subject, 'edufields') : get_string('none');
-                $course->audience = get_string('audience' . $course->audience, 'hub');
-                $course->educationallevel = get_string('edulevel' . $course->educationallevel, 'hub');
-                $coursecontentinfo = '';
-                if (empty($course->coverage)) {
-                    $course->coverage = '';
-                } else {
-                    $coursecontentinfo .= get_string('coverage', 'block_community', $course->coverage);
-                    $coursecontentinfo .= ' - ';
-                }
-                $coursecontentinfo .= get_string('contentinfo', 'block_community', $course);
-                $coursecontentinfohtml = html_writer::tag('div', $coursecontentinfo,
-                                array('class' => 'hubcoursecontentinfo'));
-
-                ///create course file related information html
-                //language
-                if (!empty($course->language)) {
-                    $languages = get_string_manager()->get_list_of_languages();
-                    $course->lang = $languages[$course->language];
-                } else {
-                    $course->lang = '';
-                }
-                //licence
-                require_once($CFG->libdir . "/licenselib.php");
-                $licensemanager = new license_manager();
-                $licenses = $licensemanager->get_licenses();
-                foreach ($licenses as $license) {
-                    if ($license->shortname == $course->licenceshortname) {
-                        $course->license = $license->fullname;
-                    }
-                }
-                $course->timeupdated = userdate($course->timemodified);
-                $coursefileinfo = get_string('fileinfo', 'block_community', $course);
-                $coursefileinfohtml = html_writer::tag('div', $coursefileinfo,
-                                array('class' => 'hubcoursefileinfo'));
-
-
-
-                //Create course content html
-                $blocks = core_component::get_plugin_list('block');
-                $activities = core_component::get_plugin_list('mod');
-                if (!empty($course->contents)) {
-                    $activitieshtml = '';
-                    $blockhtml = '';
-                    foreach ($course->contents as $content) {
-                        $content = (object) $content;
-                        if ($content->moduletype == 'block') {
-                            if (!empty($blockhtml)) {
-                                $blockhtml .= ' - ';
-                            }
-                            if (array_key_exists($content->modulename, $blocks)) {
-                                $blockname = get_string('pluginname', 'block_' . $content->modulename);
-                            } else {
-                                $blockname = $content->modulename;
-                            }
-                            $blockhtml .= $blockname . " (" . $content->contentcount . ")";
-                        } else {
-                            if (!empty($activitieshtml)) {
-                                $activitieshtml .= ' - ';
-                            }
-                            if (array_key_exists($content->modulename, $activities)) {
-                                $activityname = get_string('modulename', $content->modulename);
-                            } else {
-                                $activityname = $content->modulename;
-                            }
-                            $activitieshtml .= $activityname . " (" . $content->contentcount . ")";
-                        }
-                    }
-
-                    $blocksandactivities = html_writer::tag('div',
-                                    get_string('activities', 'block_community') . " : " . $activitieshtml);
-
-                    //Uncomment following lines to display blocks information
-//                    $blocksandactivities .= html_writer::tag('span',
-//                                    get_string('blocks', 'block_community') . " : " . $blockhtml);
-                }
-
-                //Create outcomes html
-                $outcomes= '';
-                if (!empty($course->outcomes)) {
-                    foreach ($course->outcomes as $outcome) {
-                        if (!empty($outcomes)) {
-                            $outcomes .= ', ';
-                        }
-                        $outcomes .= $outcome['fullname'];
-                    }
-                    $outcomes = get_string('outcomes', 'block_community',
-                            $outcomes);
-                }
-                $outcomeshtml = html_writer::tag('div', $outcomes, array('class' => 'hubcourseoutcomes'));
-
-                //create additional information html
-                $additionaldesc = $courseuserinfohtml . $coursecontentinfohtml
-                        . $coursefileinfohtml . $blocksandactivities . $outcomeshtml;
-                $additionaldeschtml = html_writer::tag('div', $additionaldesc,
-                                array('class' => 'additionaldesc'));
-
-                //Create add button html
-                $addbuttonhtml = "";
-                if ($course->enrollable) {
-                    $params = array('sesskey' => sesskey(), 'add' => 1, 'confirmed' => 1,
-                        'coursefullname' => $course->fullname, 'courseurl' => $courseurl,
-                        'coursedescription' => $course->description,
-                        'courseid' => $contextcourseid);
-                    $addurl = new moodle_url("/blocks/community/communitycourse.php", $params);
-                    $addbuttonhtml = html_writer::tag('a',
-                                    get_string('addtocommunityblock', 'block_community'),
-                                    array('href' => $addurl, 'class' => 'centeredbutton, hubcoursedownload'));
-                }
-
-                //create download button html
-                $downloadbuttonhtml = "";
-                if (!$course->enrollable) {
-                    $params = array('sesskey' => sesskey(), 'download' => 1, 'confirmed' => 1,
-                        'remotemoodleurl' => $CFG->wwwroot, 'courseid' => $contextcourseid,
-                        'downloadcourseid' => $course->id,
-                        'coursefullname' => $course->fullname, 'backupsize' => $course->backupsize);
-                    $downloadurl = new moodle_url("/blocks/community/communitycourse.php", $params);
-                    $downloadbuttonhtml = html_writer::tag('a', get_string('install', 'block_community'),
-                                    array('href' => $downloadurl, 'class' => 'centeredbutton, hubcoursedownload'));
-                }
-
-                //Create rating html
-                $rating = html_writer::tag('div', get_string('noratings', 'block_community'),
-                                array('class' => 'norating'));
-                if (!empty($course->rating)) {
-                    $course->rating = (object) $course->rating;
-                    if ($course->rating->count > 0) {
-
-                        //calculate size of the rating star
-                        $starimagesize = 20; //in px
-                        $numberofstars = 5;
-                        $size = ($course->rating->aggregate / $course->rating->scaleid)
-                                * $numberofstars * $starimagesize;
-                        $rating = html_writer::tag('li', '',
-                                        array('class' => 'current-rating',
-                                            'style' => 'width:' . $size . 'px;'));
-
-                        $rating = html_writer::tag('ul', $rating,
-                                        array('class' => 'star-rating clearfix'));
-                        $rating .= html_writer::tag('div', ' (' . $course->rating->count . ')',
-                                        array('class' => 'ratingcount clearfix'));
-                    }
-                }
-
-
-                //Create comments html
-                $coursecomments = html_writer::tag('div', get_string('nocomments', 'block_community'),
-                                array('class' => 'nocomments'));
-                $commentcount = 0;
-                if (!empty($course->comments)) {
-                    //display only if there is some comment if there is some comment
-                    $commentcount = count($course->comments);
-                    $coursecomments = html_writer::tag('div',
-                                    get_string('comments', 'block_community', $commentcount),
-                                    array('class' => 'commenttitle'));
-
-                    foreach ($course->comments as $comment) {
-                        $commentator = html_writer::tag('div',
-                                        $comment['commentator'],
-                                        array('class' => 'hubcommentator'));
-                        $commentdate = html_writer::tag('div',
-                                        ' - ' . userdate($comment['date'], '%e/%m/%y'),
-                                        array('class' => 'hubcommentdate clearfix'));
-
-                        $commenttext = html_writer::tag('div',
-                                        $comment['comment'],
-                                        array('class' => 'hubcommenttext'));
-
-                        $coursecomments .= html_writer::tag('div',
-                                        $commentator . $commentdate . $commenttext,
-                                        array('class' => 'hubcomment'));
-                    }
-                    $coursecommenticon = html_writer::tag('div',
-                                    get_string('comments', 'block_community', $commentcount),
-                                    array('class' => 'hubcoursecomments',
-                                        'id' => 'comments-' . $course->id));
-                    $coursecomments = $coursecommenticon . html_writer::tag('div',
-                                    $coursecomments,
-                                    array('class' => 'yui3-overlay-loading',
-                                        'id' => 'commentoverlay-' . $course->id));
-                }
-
-                //link rate and comment
-                $rateandcomment = html_writer::tag('div',
-                                html_writer::link($course->commenturl, get_string('rateandcomment', 'block_community'),
-                                            ['onclick' => 'this.target="_blank"']),
-                                array('class' => 'hubrateandcomment'));
-
-                //the main DIV tags
-                $buttonsdiv = html_writer::tag('div',
-                                $addbuttonhtml . $downloadbuttonhtml . $visitlinkhtml,
-                                array('class' => 'courseoperations'));
-                $screenshotbuttonsdiv = html_writer::tag('div',
-                                $coursescreenshot . $buttonsdiv,
-                                array('class' => 'courselinks'));
-
-                $coursedescdiv = html_writer::tag('div',
-                                $deschtml . $additionaldeschtml
-                                . $rating . $coursecomments . $rateandcomment,
-                                array('class' => 'coursedescription'));
-                $coursehtml =
-                        $coursenamehtml . html_writer::tag('div',
-                                $coursedescdiv . $screenshotbuttonsdiv,
-                                array('class' => 'hubcourseinfo clearfix'));
-
-                $renderedhtml .=html_writer::tag('div', $coursehtml,
-                                array('class' => 'fullhubcourse clearfix'));
-            }
-
-            $renderedhtml = html_writer::tag('div', $renderedhtml,
-                            array('class' => 'hubcourseresult'));
-        }
-
-        return $renderedhtml;
-    }
-
-}
diff --git a/blocks/community/styles.css b/blocks/community/styles.css
deleted file mode 100644 (file)
index f9ecac8..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-/** General display rules **/
-
-/* HUB SELECTOR */
-#page-blocks-community-communitycourse .hubscreenshot {
-    float: left;
-}
-
-#page-blocks-community-communitycourse .hubtitlelink {
-    color: #999;
-}
-
-#page-blocks-community-communitycourse .hubsmalllogo {
-    padding-left: 3px;
-    padding-right: 7px;
-    float: left;
-}
-
-#page-blocks-community-communitycourse .hubtext {
-    display: block;
-    width: 68%;
-    padding-left: 165px;
-}
-
-#page-blocks-community-communitycourse .hubimage {
-    float: left;
-    display: block;
-    width: 100px;
-}
-
-#page-blocks-community-communitycourse .hubstats {
-    padding-top: 10px;
-}
-
-#page-blocks-community-communitycourse .hubstats .iconhelp {
-    float: left;
-    padding-right: 3px;
-}
-
-#page-blocks-community-communitycourse .hubadditionaldesc {
-    color: #666;
-    font-size: 90%;
-    display: block;
-}
-
-#page-blocks-community-communitycourse .hubscreenshot {
-    margin-right: 10px;
-}
-
-#page-blocks-community-communitycourse .hubtrusted {
-    display: inline;
-}
-
-#page-blocks-community-communitycourse .trustedtr {
-    background-color: #ffe1c3;
-}
-
-#page-blocks-community-communitycourse .prioritisetr {
-    background-color: #ffd4ff;
-}
-
-#page-blocks-community-communitycourse .blockdescription {
-    font-size: 80%;
-    color: #555;
-}
-
-#page-blocks-community-communitycourse .trusted {
-    font-size: 90%;
-    color: #063;
-    font-weight: normal;
-    font-style: italic;
-}
-
-/* COURSES RESULT */
-#page-blocks-community-communitycourse .additionaldesc {
-    font-size: 80%;
-    color: #8b8989;
-}
-
-#page-blocks-community-communitycourse .comment-link {
-    font-size: 80%;
-    color: #555;
-}
-
-#page-blocks-community-communitycourse .coursescreenshot {
-    text-align: center;
-    cursor: pointer;
-}
-
-#page-blocks-community-communitycourse .hubcourseinfo {
-    margin-left: 15px;
-}
-
-#page-blocks-community-communitycourse .pagingbar {
-    text-align: center;
-}
-
-#page-blocks-community-communitycourse .coursecomment {
-    float: right;
-}
-
-#page-blocks-community-communitycourse .courseoperations {
-    margin-top: 9px;
-    text-align: center;
-}
-
-#page-blocks-community-communitycourse .hubcoursedownload:hover {
-    background-color: #cdc9c9;
-}
-
-#page-blocks-community-communitycourse .courselinks {
-    float: right;
-    width: 180px;
-}
-
-#page-blocks-community-communitycourse .ratingaggregate {
-    float: left;
-    padding-right: 4px;
-}
-
-#page-blocks-community-communitycourse .hubcourserating {
-    padding-top: 3px;
-    font-size: 80%;
-    color: #555;
-}
-
-#page-blocks-community-communitycourse .coursedescription {
-    width: 70%;
-    float: left;
-}
-
-#page-blocks-community-communitycourse .fullhubcourse {
-    margin-bottom: 20px;
-}
-
-#page-blocks-community-communitycourse .hubcoursetitlepanel {
-    margin-bottom: 6px;
-}
-
-#page-blocks-community-communitycourse .hubcourseresult {
-    background: none repeat scroll 0 0 #fff;
-    clear: both;
-    margin: 30px auto 0;
-    z-index: 90;
-    width: 95%;
-    padding: 10px 10px 10px 10px;
-    border-style: solid;
-    border-width: 1px;
-}
-
-#page-blocks-community-communitycourse .hubcoursetitle {
-    -webkit-box-shadow: rgba(0, 0, 0, 0.546875) 0 0 4px;
-    -moz-box-shadow: rgba(0, 0, 0, 0.546875) 0 0 4px;
-    background: #8b8989;
-    left: -15px;
-    position: relative;
-    z-index: 0;
-    border: 0;
-    margin: 0;
-    outline: 0;
-    padding: 0;
-    vertical-align: baseline;
-    color: #fff;
-    padding-top: 6px;
-    padding-bottom: 6px;
-    text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
-    text-align: left;
-    font-style: italic;
-    font-weight: normal;
-    line-height: 1.2em;
-    font-size: 140%;
-    width: 102%;
-    text-indent: 15px;
-}
-
-#page-blocks-community-communitycourse .hubcoursedownload {
-    display: inline-block;
-    padding: 5px 8px 6px;
-    color: black;
-    text-decoration: none;
-    -moz-border-radius: 6px;
-    -webkit-border-radius: 6px;
-    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
-    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
-    border-bottom: 1px solid rgba(0, 0, 0, 0.25);
-    position: relative;
-    cursor: pointer;
-    background-color: #eee9e9;
-    margin-left: 6px;
-    font-size: 95%;
-    margin-bottom: 9px;
-}
-
-/*  STAR RATING  */
-#page-blocks-community-communitycourse .ratingcount {
-    color: #8b8989;
-    font-size: 80%;
-    vertical-align: top;
-}
-
-#page-blocks-community-communitycourse .norating {
-    font-weight: bold;
-    color: #8b8989;
-    font-size: 80%;
-}
-
-#page-blocks-community-communitycourse .star-rating {
-    list-style: none;
-    margin: 4px 0 4px;
-    padding: 0;
-    width: 100px;
-    height: 20px;
-    position: relative;
-    background: url([[pix:i/star-rating]]) top left repeat-x;
-    float: left;
-}
-
-#page-blocks-community-communitycourse .star-rating li {
-    padding: 0;
-    margin: 0;
-    height: 20px;
-    width: 20px;
-    float: left;
-}
-
-#page-blocks-community-communitycourse .star-rating li.current-rating {
-    background: url([[pix:i/star-rating]]) left bottom;
-    position: absolute;
-    height: 20px;
-    display: block;
-    text-indent: -9000px;
-    z-index: 1;
-}
-
-/* COMMENTS */
-#page-blocks-community-communitycourse .nocomments {
-    font-weight: bold;
-    color: #8b8989;
-    font-size: 80%;
-}
-
-#page-blocks-community-communitycourse .hubcommentator {
-    float: left;
-    font-weight: bold;
-}
-
-#page-blocks-community-communitycourse .hubcommentdate {
-    font-weight: bold;
-}
-
-#page-blocks-community-communitycourse .hubcommenttext {
-    margin-bottom: 10px;
-}
-
-#page-blocks-community-communitycourse .hubnoscriptcoursecomments {
-    margin-left: 5px;
-}
-
-#page-blocks-community-communitycourse .yui3-overlay-loading {
-    /* Hide overlay markup while loading, if js is enabled */
-    top: -1000em;
-    left: -1000em;
-    position: absolute;
-    z-index: 1000;
-}
-
-#page-blocks-community-communitycourse .hubcoursecomments {
-    /* comment button */
-    display: inline-block;
-    padding: 3px 3px 3px 3px;
-    color: white;
-    text-decoration: none;
-    -moz-border-radius: 6px;
-    -webkit-border-radius: 6px;
-    position: relative;
-    cursor: pointer;
-    background-color: #8b8989;
-    margin-left: 0;
-    font-size: 80%;
-    margin-top: 15px;
-}
-
-#page-blocks-community-communitycourse .hubrateandcomment {
-    font-size: 80%;
-}
-
-#page-blocks-community-communitycourse .nextlink {
-    text-align: center;
-    margin-top: 6px;
-}
-
-#page-blocks-community-communitycourse .textinfo {
-    text-align: center;
-}
-
-#ss-mask {
-    z-index: 10;
-    position: fixed;
-    top: 0;
-    left: 0;
-    bottom: 0;
-    right: 0;
-    opacity: 0.35;
-    filter: alpha(opacity=35);
-    background: #000;
-}
-
-.hiddenoverlay {
-    display: none;
-    text-align: center;
-}
-
-.imagearrow {
-    font-size: 120%;
-    display: inline;
-    cursor: pointer;
-}
-
-.imagetitle {
-    display: inline;
-    cursor: pointer;
-}
-
-#page-blocks-community-communitycourse .moodle-dialogue-base .moodle-dialogue {
-    -moz-border-radius: 12px 12px 12px 12px;
-    -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
-    -webkit-border-radius: 12px 12px 12px 12px;
-    -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
-    border-width: 0 0 0 0;
-}
-
-#page-blocks-community-communitycourse .moodle-dialogue-base .moodle-dialogue-wrap {
-    -moz-border-radius: 12px 12px 0 0;
-    -webkit-border-radius: 12px 12px 0 0;
-    background-color: #fff;
-    border: 1px solid #555;
-}
-
-#page-blocks-community-communitycourse .moodle-dialogue-base .moodle-dialogue-hd {
-    -moz-border-radius: 12px 12px 0 0;
-    -webkit-border-radius: 12px 12px 0 0;
-    background-color: #f6f6f6;
-    border: 1px solid #ccc;
-    overflow: auto;
-    padding: 7px 6px;
-}
-
-#page-blocks-community-communitycourse .moodle-dialogue-base .moodle-dialogue-bd {
-    padding: 0;
-    margin-bottom: -5px;
-}
-
-#page-blocks-community-communitycourse .moodle-dialogue-base .closebutton {
-    margin-top: 4px;
-    margin-right: 4px;
-}
diff --git a/blocks/community/tests/privacy_test.php b/blocks/community/tests/privacy_test.php
deleted file mode 100644 (file)
index fce8b29..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-<?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/>.
-
-/**
- * Unit tests for the block_community implementation of the privacy API.
- *
- * @package    block_community
- * @category   test
- * @copyright  2018 Zig Tan <zig@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-use \core_privacy\local\metadata\collection;
-use \core_privacy\local\request\writer;
-use \core_privacy\local\request\approved_contextlist;
-use \block_community\privacy\provider;
-use \core_privacy\local\request\approved_userlist;
-
-/**
- * Unit tests for the block_community implementation of the privacy API.
- *
- * @copyright  2018 Zig Tan <zig@moodle.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class block_community_privacy_testcase extends \core_privacy\tests\provider_testcase {
-
-    /**
-     * Overriding setUp() function to always reset after tests.
-     */
-    public function setUp() {
-        $this->resetAfterTest(true);
-    }
-
-    /**
-     * Test for provider::get_metadata().
-     */
-    public function test_get_metadata() {
-        $collection = new collection('block_community');
-        $newcollection = provider::get_metadata($collection);
-        $itemcollection = $newcollection->get_collection();
-        $this->assertCount(1, $itemcollection);
-
-        $table = reset($itemcollection);
-        $this->assertEquals('block_community', $table->get_name());
-
-        $privacyfields = $table->get_privacy_fields();
-        $this->assertArrayHasKey('userid', $privacyfields);
-        $this->assertArrayHasKey('coursename', $privacyfields);
-        $this->assertArrayHasKey('coursedescription', $privacyfields);
-        $this->assertArrayHasKey('courseurl', $privacyfields);
-        $this->assertArrayHasKey('imageurl', $privacyfields);
-
-        $this->assertEquals('privacy:metadata:block_community', $table->get_summary());
-    }
-
-    /**
-     * Test for provider::get_contexts_for_userid().
-     */
-    public function test_get_contexts_for_userid() {
-        global $DB;
-
-        // Test setup.
-        $teacher = $this->getDataGenerator()->create_user();
-        $this->setUser($teacher);
-
-        // Add two community links for the User.
-        $community = (object)[
-            'userid' => $teacher->id,
-            'coursename' => 'Dummy Community Course Name - 1',
-            'coursedescription' => 'Dummy Community Course Description - 1',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-1',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        $community = (object)[
-            'userid' => $teacher->id,
-            'coursename' => 'Dummy Community Course Name - 2',
-            'coursedescription' => 'Dummy Community Course Description - 2',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-2',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        // Test the User's retrieved contextlist contains only one context.
-        $contextlist = provider::get_contexts_for_userid($teacher->id);
-        $contexts = $contextlist->get_contexts();
-        $this->assertCount(1, $contexts);
-
-        // Test the User's contexts equal the User's own context.
-        $context = reset($contexts);
-        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
-        $this->assertEquals($teacher->id, $context->instanceid);
-    }
-
-    /**
-     * Test for provider::export_user_data().
-     */
-    public function test_export_user_data() {
-        global $DB;
-
-        // Test setup.
-        $teacher = $this->getDataGenerator()->create_user();
-        $this->setUser($teacher);
-
-        // Add 3 community links for the User.
-        $nocommunities = 3;
-        for ($c = 0; $c < $nocommunities; $c++) {
-            $community = (object)[
-                'userid' => $teacher->id,
-                'coursename' => 'Dummy Community Course Name - ' . $c,
-                'coursedescription' => 'Dummy Community Course Description - ' . $c,
-                'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-' . $c,
-                'imageurl' => ''
-            ];
-            $DB->insert_record('block_community', $community);
-        }
-
-        // Test the created block_community records matches the test number of communities specified.
-        $communities = $DB->get_records('block_community', ['userid' => $teacher->id]);
-        $this->assertCount($nocommunities, $communities);
-
-        // Test the User's retrieved contextlist contains only one context.
-        $contextlist = provider::get_contexts_for_userid($teacher->id);
-        $contexts = $contextlist->get_contexts();
-        $this->assertCount(1, $contexts);
-
-        // Test the User's contexts equal the User's own context.
-        $context = reset($contexts);
-        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
-        $this->assertEquals($teacher->id, $context->instanceid);
-
-        $approvedcontextlist = new approved_contextlist($teacher, 'block_community', $contextlist->get_contextids());
-
-        // Retrieve Calendar Event and Subscriptions data only for this user.
-        provider::export_user_data($approvedcontextlist);
-
-        // Test the block_community data is exported at the User context level.
-        $user = $approvedcontextlist->get_user();
-        $contextuser = context_user::instance($user->id);
-        $writer = writer::with_context($contextuser);
-        $this->assertTrue($writer->has_any_data());
-    }
-
-    /**
-     * Test for provider::delete_data_for_all_users_in_context().
-     */
-    public function test_delete_data_for_all_users_in_context() {
-        global $DB;
-
-        // Test setup.
-        $teacher = $this->getDataGenerator()->create_user();
-        $this->setUser($teacher);
-
-        // Add a community link for the User.
-        $community = (object)[
-            'userid' => $teacher->id,
-            'coursename' => 'Dummy Community Course Name',
-            'coursedescription' => 'Dummy Community Course Description',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        // Test the User's retrieved contextlist contains only one context.
-        $contextlist = provider::get_contexts_for_userid($teacher->id);
-        $contexts = $contextlist->get_contexts();
-        $this->assertCount(1, $contexts);
-
-        // Test the User's contexts equal the User's own context.
-        $context = reset($contexts);
-        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
-        $this->assertEquals($teacher->id, $context->instanceid);
-
-        // Test delete all users content by context.
-        provider::delete_data_for_all_users_in_context($context);
-        $blockcommunity = $DB->get_records('block_community', ['userid' => $teacher->id]);
-        $this->assertCount(0, $blockcommunity);
-    }
-
-    /**
-     * Test for provider::delete_data_for_user().
-     */
-    public function test_delete_data_for_user() {
-        global $DB;
-
-        // Test setup.
-        $teacher1 = $this->getDataGenerator()->create_user();
-        $teacher2 = $this->getDataGenerator()->create_user();
-        $this->setUser($teacher1);
-
-        // Add 3 community links for Teacher 1.
-        $nocommunities = 3;
-        for ($c = 0; $c < $nocommunities; $c++) {
-            $community = (object)[
-                'userid' => $teacher1->id,
-                'coursename' => 'Dummy Community Course Name - ' . $c,
-                'coursedescription' => 'Dummy Community Course Description - ' . $c,
-                'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-' . $c,
-                'imageurl' => ''
-            ];
-            $DB->insert_record('block_community', $community);
-        }
-
-        // Add 1 community link for Teacher 2.
-        $community = (object)[
-            'userid' => $teacher2->id,
-            'coursename' => 'Dummy Community Course Name - Blah',
-            'coursedescription' => 'Dummy Community Course Description - Blah',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-Blah',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        // Test the created block_community records for Teacher 1 equals test number of communities specified.
-        $communities = $DB->get_records('block_community', ['userid' => $teacher1->id]);
-        $this->assertCount($nocommunities, $communities);
-
-        // Test the created block_community records for Teacher 2 equals 1.
-        $communities = $DB->get_records('block_community', ['userid' => $teacher2->id]);
-        $this->assertCount(1, $communities);
-
-        // Test the deletion of block_community records for Teacher 1 results in zero records.
-        $contextlist = provider::get_contexts_for_userid($teacher1->id);
-        $contexts = $contextlist->get_contexts();
-        $this->assertCount(1, $contexts);
-
-        // Test the User's contexts equal the User's own context.
-        $context = reset($contexts);
-        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
-        $this->assertEquals($teacher1->id, $context->instanceid);
-
-        $approvedcontextlist = new approved_contextlist($teacher1, 'block_community', $contextlist->get_contextids());
-        provider::delete_data_for_user($approvedcontextlist);
-        $communities = $DB->get_records('block_community', ['userid' => $teacher1->id]);
-        $this->assertCount(0, $communities);
-
-
-        // Test that Teacher 2's single block_community record still exists.
-        $contextlist = provider::get_contexts_for_userid($teacher2->id);
-        $contexts = $contextlist->get_contexts();
-        $this->assertCount(1, $contexts);
-
-        // Test the User's contexts equal the User's own context.
-        $context = reset($contexts);
-        $this->assertEquals(CONTEXT_USER, $context->contextlevel);
-        $this->assertEquals($teacher2->id, $context->instanceid);
-
-        $communities = $DB->get_records('block_community', ['userid' => $teacher2->id]);
-        $this->assertCount(1, $communities);
-    }
-
-    /**
-     * Test that only users within a course context are fetched.
-     */
-    public function test_get_users_in_context() {
-        global $DB;
-
-        $component = 'block_community';
-
-        // Create a user.
-        $teacher = $this->getDataGenerator()->create_user();
-        $teacherctx = \context_user::instance($teacher->id);
-
-        $userlist = new \core_privacy\local\request\userlist($teacherctx, $component);
-        provider::get_users_in_context($userlist);
-        $this->assertCount(0, $userlist);
-
-        $this->setUser($teacher);
-        // Add two community links for the user.
-        $community = (object)[
-            'userid' => $teacher->id,
-            'coursename' => 'Dummy Community Course Name - 1',
-            'coursedescription' => 'Dummy Community Course Description - 1',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-1',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        $community = (object)[
-            'userid' => $teacher->id,
-            'coursename' => 'Dummy Community Course Name - 2',
-            'coursedescription' => 'Dummy Community Course Description - 2',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-2',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        // The list of users within the user context should contain user.
-        provider::get_users_in_context($userlist);
-        $this->assertCount(1, $userlist);
-        $expected = [$teacher->id];
-        $actual = $userlist->get_userids();
-        $this->assertEquals($expected, $actual);
-
-        // The list of users within the system context should be empty.
-        $systemctx = \context_system::instance();
-        $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
-        provider::get_users_in_context($userlist2);
-        $this->assertCount(0, $userlist2);
-    }
-
-    /**
-     * Test that data for users in approved userlist is deleted.
-     */
-    public function test_delete_data_for_users() {
-        global $DB;
-
-        $component = 'block_community';
-
-        // Create user1.
-        $user1 = $this->getDataGenerator()->create_user();
-        $userctx1 = \context_user::instance($user1->id);
-        // Create user2.
-        $user2 = $this->getDataGenerator()->create_user();
-        $userctx2 = \context_user::instance($user2->id);
-
-        $this->setUser($user1);
-        // Add a community link for user1.
-        $community = (object)[
-            'userid' => $user1->id,
-            'coursename' => 'Dummy Community Course Name - 1',
-            'coursedescription' => 'Dummy Community Course Description - 1',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-1',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        // Add a community link for user1.
-        $community = (object)[
-            'userid' => $user1->id,
-            'coursename' => 'Dummy Community Course Name - 2',
-            'coursedescription' => 'Dummy Community Course Description - 2',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-2',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        $this->setUser($user2);
-        // Add a community link for user2.
-        $community = (object)[
-            'userid' => $user2->id,
-            'coursename' => 'Dummy Community Course Name - 3',
-            'coursedescription' => 'Dummy Community Course Description - 3',
-            'courseurl' => 'https://moodle.org/community_courses/Dummy_Community_Course-3',
-            'imageurl' => ''
-        ];
-        $DB->insert_record('block_community', $community);
-
-        $userlist1 = new \core_privacy\local\request\userlist($userctx1, $component);
-        provider::get_users_in_context($userlist1);
-        $this->assertCount(1, $userlist1);
-
-        $userlist2 = new \core_privacy\local\request\userlist($userctx2, $component);
-        provider::get_users_in_context($userlist2);
-        $this->assertCount(1, $userlist2);
-
-        // Convert $userlist1 into an approved_contextlist.
-        $approvedlist1 = new approved_userlist($userctx1, $component, $userlist1->get_userids());
-        // Delete using delete_data_for_user.
-        provider::delete_data_for_users($approvedlist1);
-
-        // Re-fetch users in userctx1.
-        $userlist1 = new \core_privacy\local\request\userlist($userctx1, $component);
-        provider::get_users_in_context($userlist1);
-        // The user data in userctx1 should be deleted.
-        $this->assertCount(0, $userlist1);
-
-        // Re-fetch users in userctx2.
-        $userlist2 = new \core_privacy\local\request\userlist($userctx2, $component);
-        provider::get_users_in_context($userlist2);
-        // The user data in userctx2 should be still present.
-        $this->assertCount(1, $userlist2);
-
-        // Convert $userlist2 into an approved_contextlist in the system context.
-        $systemcontext = \context_system::instance();
-        $approvedlist2 = new approved_userlist($systemcontext, $component, $userlist2->get_userids());
-        // Delete using delete_data_for_user.
-        provider::delete_data_for_users($approvedlist2);
-        // Re-fetch users in userctx2.
-        $userlist2 = new \core_privacy\local\request\userlist($userctx2, $component);
-        provider::get_users_in_context($userlist2);
-        // The user data in systemcontext should not be deleted.
-        $this->assertCount(1, $userlist2);
-    }
-}
diff --git a/blocks/community/yui/comments/comments.js b/blocks/community/yui/comments/comments.js
deleted file mode 100644 (file)
index e720c18..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-YUI.add('moodle-block_community-comments', function(Y) {
-
-    var COMMENTSNAME = 'blocks_community_comments';
-
-    var COMMENTS = function() {
-        COMMENTS.superclass.constructor.apply(this, arguments);
-    };
-
-    Y.extend(COMMENTS, Y.Base, {
-
-        event:null,
-        panelevent: null,
-        panels: [], //all the comment boxes
-
-        initializer : function(params) {
-
-            //attach a show event on the div with id = comments
-            for (var i=0;i<this.get('commentids').length;i++)
-            {
-                var commentid = this.get('commentids')[i];
-                this.panels[commentid] = new M.core.dialogue({
-                    headerContent:Y.Node.create('<h1>')
-                        .append(Y.one('#commentoverlay-'+commentid+' .commenttitle').get('innerHTML')),
-                    bodyContent:Y.one('#commentoverlay-'+commentid).get('innerHTML'),
-                    visible: false, //by default it is not displayed
-                    modal: false,
-                    zIndex:100,
-                    closeButtonTitle: this.get('closeButtonTitle')
-                });
-
-                this.panels[commentid].get('contentBox').one('.commenttitle').remove();
-                this.panels[commentid].render();
-                this.panels[commentid].hide();
-
-                Y.one('#comments-'+commentid).on('click', this.show, this, commentid);
-            }
-
-        },
-
-        show : function (e, commentid) {
-
-            // Hide all panels.
-            for (var i=0;i<this.get('commentids').length;i++)
-            {
-                this.hide(e, this.get('commentids')[i]);
-            }
-
-            this.panels[commentid].show(); //show the panel
-
-            e.halt(); // we are going to attach a new 'hide panel' event to the body,
-            // because javascript always propagate event to parent tag,
-            // we need to tell Yahoo to stop to call the event on parent tag
-            // otherwise the hide event will be call right away.
-
-            // We add a new event on the body in order to hide the panel for the next click.
-            this.event = Y.one(document.body).on('click', this.hide, this, commentid);
-            // We add a new event on the panel in order to hide the panel for the next click (touch device).
-            this.panelevent = Y.one("#commentoverlay-"+commentid).on('click', this.hide, this, commentid);
-
-            // Focus on the close button
-            this.panels[commentid].get('buttons').header[0].focus();
-        },
-
-        hide : function (e, commentid) {
-            this.panels[commentid].hide(); //hide the panel
-            if (this.event != null) {
-                this.event.detach(); //we need to detach the body hide event
-            //Note: it would work without but create js warning everytime
-            //we click on the body
-            }
-            if (this.panelevent != null) {
-                this.panelevent.detach(); //we need to detach the panel hide event
-            //Note: it would work without but create js warning everytime
-            //we click on the body
-            }
-
-        }
-
-    }, {
-        NAME : COMMENTSNAME,
-        ATTRS : {
-            commentids: {},
-            closeButtonTitle : {
-                validator : Y.Lang.isString,
-                value : 'Close'
-            }
-        }
-    });
-
-    M.blocks_community = M.blocks_community || {};
-    M.blocks_community.init_comments = function(params) {
-        return new COMMENTS(params);
-    }
-
-}, '@VERSION@', {
-    requires:['base', 'moodle-core-notification']
-});
diff --git a/blocks/community/yui/imagegallery/imagegallery.js b/blocks/community/yui/imagegallery/imagegallery.js
deleted file mode 100644 (file)
index b48a204..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-YUI.add('moodle-block_community-imagegallery', function(Y) {
-
-    var IMAGEGALLERYNAME = 'blocks_community_imagegallery';
-
-    var IMAGEGALLERY = function() {
-        IMAGEGALLERY.superclass.constructor.apply(this, arguments);
-    };
-
-    Y.extend(IMAGEGALLERY, Y.Base, {
-
-        event:null,
-        previousevent:null,
-        nextevent:null,
-        panelevent:null,
-        panel:null, //all the images boxes
-        imageidnumbers: [],
-        imageloadingevent: null,
-        loadingimage: null,
-
-        initializer : function(params) {
-
-            //create the loading image
-            var objBody = Y.one(document.body);
-            this.loadingimage = Y.Node.create('<div id="hubloadingimage" class="hiddenoverlay">'
-                +'<img src=\'' + M.cfg.wwwroot +'/pix/i/loading.gif\'>'
-                +'</div>');
-            objBody.append(this.loadingimage);
-
-            // Create the div for panel.
-            var objBody = Y.one(document.body);
-            var paneltitle = Y.Node.create('<div id="imagetitleoverlay" class="hiddenoverlay"></div>');
-            objBody.append(paneltitle);
-            var panel = Y.Node.create('<div id="imageoverlay" class="hiddenoverlay"></div>');
-            objBody.append(panel);
-
-            /// Create the panel.
-            this.panel = new M.core.dialogue({
-                headerContent:Y.one('#imagetitleoverlay').get('innerHTML'),
-                bodyContent:Y.one('#imageoverlay').get('innerHTML'),
-                visible: false, //by default it is not displayed
-                modal: false,
-                zIndex:100
-            });
-
-            this.panel.render();
-            this.panel.hide();
-
-            //attach a show event on the image divs (<tag id='image-X'>)
-            for (var i=0;i<this.get('imageids').length;i++)
-            {
-                var imageid = this.get('imageids')[i];
-                this.imageidnumbers[imageid] = this.get('imagenumbers')[i];
-                Y.one('#image-'+imageid).on('click', this.show, this, imageid, 1);
-            }
-
-        },
-
-        show : function (e, imageid, screennumber) {
-
-            if (this.imageloadingevent != null) {
-                this.imageloadingevent.detach();
-            }
-
-            var url = this.get('huburl') + "/local/hub/webservice/download.php?courseid="
-            + imageid + "&filetype=screenshot&imagewidth=original&screenshotnumber=" + screennumber;
-
-            /// set the mask
-            if (this.get('maskNode')) {
-                this.get('maskNode').remove();
-            }
-            var objBody = Y.one(document.body);
-            var mask = Y.Node.create('<div id="ss-mask"><!-- --></div>');
-            objBody.prepend(mask);
-            this.set('maskNode', Y.one('#ss-mask'));
-
-            //display loading image
-            Y.one('#hubloadingimage').setStyle('display', 'block');
-            Y.one('#hubloadingimage').setStyle("position", 'fixed');
-            Y.one('#hubloadingimage').setStyle("top", '50%');
-            Y.one('#hubloadingimage').setStyle("left", '50%');
-
-            var windowheight = e.target.get('winHeight');
-            var windowwidth = e.target.get('winWidth');
-
-            var maxheight = windowheight - 150;
-
-            //load the title + link to next image
-            var paneltitle = Y.one('#imagetitleoverlay');
-            var previousimagelink = "<div id=\"previousarrow\" class=\"imagearrow\">←</div>";
-            var nextimagelink = "<div id=\"nextarrow\" class=\"imagearrow\">→</div>";
-
-            // Need to load the images in the panel.
-            var panel = Y.one('#imageoverlay');
-            panel.setContent('');
-
-            panel.append(Y.Node.create('<div style="text-align:center"><img id=\"imagetodisplay\" src="' + url
-                + '" style="max-height:' + maxheight + 'px;"></div>'));
-            this.panel.destroy();
-            this.panel = new M.core.dialogue({
-                headerContent:previousimagelink + '<div id=\"imagenumber\" class=\"imagetitle\"><h1> Image '
-                + screennumber + ' / ' + this.imageidnumbers[imageid] + ' </h1></div>' + nextimagelink,
-                bodyContent:Y.one('#imageoverlay').get('innerHTML'),
-                visible: false, //by default it is not displayed
-                modal: false,
-                zIndex:100,
-                closeButtonTitle: this.get('closeButtonTitle')
-            });
-            this.panel.render();
-            this.panel.hide(); //show the panel
-            this.panel.set("centered", true);
-
-            e.halt(); // we are going to attach a new 'hide panel' event to the body,
-            // because javascript always propagate event to parent tag,
-            // we need to tell Yahoo to stop to call the event on parent tag
-            // otherwise the hide event will be call right away.
-
-            //once the image is loaded, update display
-            this.imageloadingevent = Y.one('#imagetodisplay').on('load', function(e, url){
-                //hide the loading image
-                Y.one('#hubloadingimage').setStyle('display', 'none');
-
-                //display the screenshot
-                var screenshot = new Image();
-                screenshot.src = url;
-
-                var panelwidth = windowwidth - 100;
-                if(panelwidth > screenshot.width) {
-                    panelwidth = screenshot.width;
-                }
-
-                this.panel.set('width', panelwidth);
-                this.panel.set("centered", true);
-                this.panel.show();
-
-                // Focus on the close button
-                this.panel.get('buttons').header[0].focus();
-
-            }, this, url);
-
-            var previousnumber = screennumber - 1;
-            var nextnumber = screennumber + 1;
-            if (previousnumber == 0) {
-                previousnumber = this.imageidnumbers[imageid];
-            }
-            if (nextnumber > this.imageidnumbers[imageid]) {
-                nextnumber = 1;
-            }
-
-            Y.one('#previousarrow').on('click', this.show, this, imageid, previousnumber);
-            Y.one('#nextarrow').on('click', this.show, this, imageid, nextnumber);
-            Y.one('#imagenumber').on('click', this.show, this, imageid, nextnumber);
-
-            // We add a new event on the body in order to hide the panel for the next click.
-            this.event = Y.one(document.body).on('click', this.hide, this);
-            // We add a new event on the panel in order to hide the panel for the next click (touch device).
-            this.panelevent = Y.one("#imageoverlay").on('click', this.hide, this);
-
-            this.panel.on('visibleChange',function(e){
-                if(e.newVal == 0){
-                    this.get('maskNode').remove()
-                }
-            }, this);
-        },
-
-        hide : function (e) {
-
-            // remove the mask
-            this.get('maskNode').remove();
-
-            //hide the loading image
-            Y.one('#hubloadingimage').setStyle('display', 'none');
-
-            this.panel.hide(); //hide the panel
-            if (this.event != null) {
-                this.event.detach(); //we need to detach the body hide event
-            //Note: it would work without but create js warning everytime
-            //we click on the body
-            }
-            if (this.panelevent != null) {
-                this.panelevent.detach(); //we need to detach the panel hide event
-            //Note: it would work without but create js warning everytime
-            //we click on the body
-            }
-        }
-
-    }, {
-        NAME : IMAGEGALLERYNAME,
-        ATTRS : {
-            imageids: {},
-            imagenumbers: {},
-            huburl: {},
-            closeButtonTitle : {
-                validator : Y.Lang.isString,
-                value : 'Close'
-            }
-        }
-    });
-
-    M.blocks_community = M.blocks_community || {};
-    M.blocks_community.init_imagegallery = function(params) {
-        return new IMAGEGALLERY(params);
-    }
-
-}, '@VERSION@', {
-    requires:['base','node', 'moodle-core-notification']
-});
index 8fe7076..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';
@@ -57,8 +57,8 @@ $string['favourites'] = 'Starred';
 $string['future'] = 'Future';
 $string['inprogress'] = 'In progress';
 $string['lastaccessed'] = 'Last accessed';
-$string['layouts'] = 'Available Layouts';
-$string['layouts_help'] = 'The layouts which are available for selection by users';
+$string['layouts'] = 'Available layouts';
+$string['layouts_help'] = 'Course overview layouts which are available for selection by users. If none are selected, the card layout will be used.';
 $string['list'] = 'List';
 $string['myoverview:myaddinstance'] = 'Add a new course overview block to Dashboard';
 $string['past'] = 'Past';
@@ -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 f523116..b80713c 100644 (file)
@@ -114,12 +114,8 @@ class behat_block_site_main_menu extends behat_base {
     protected function get_site_menu_activity_element($element, $selectortype, $activityname) {
         $activitynode = $this->get_site_menu_activity_node($activityname);
 
-        // Transforming to Behat selector/locator.
-        list($selector, $locator) = $this->transform_selector($selectortype, $element);
-        $exception = new ElementNotFoundException($this->getSession(), '"' . $element . '" "' .
-            $selectortype . '" in "' . $activityname . '" ');
-
-        return $this->find($selector, $locator, $exception, $activitynode);
+        $exception = new ElementNotFoundException($this->getSession(), "'{$element}' '{$selectortype}' in '${activityname}'");
+        return $this->find($selectortype, $element, $exception, $activitynode);
     }
 
     /**
index 2fe5526..8c4f836 100644 (file)
@@ -114,12 +114,8 @@ class behat_block_social_activities extends behat_base {
     protected function get_social_block_activity_element($element, $selectortype, $activityname) {
         $activitynode = $this->get_social_block_activity_node($activityname);
 
-        // Transforming to Behat selector/locator.
-        list($selector, $locator) = $this->transform_selector($selectortype, $element);
-        $exception = new ElementNotFoundException($this->getSession(), '"' . $element . '" "' .
-            $selectortype . '" in "' . $activityname . '" ');
-
-        return $this->find($selector, $locator, $exception, $activitynode);
+        $exception = new ElementNotFoundException($this->getSession(), "'{$element}' '{$selectortype}' in '${activityname}'");
+        return $this->find($selectortype, $element, $exception, $activitynode);
     }
 
     /**
index 5989f59..22c0b2e 100644 (file)
Binary files a/blocks/timeline/amd/build/event_list.min.js and b/blocks/timeline/amd/build/event_list.min.js differ
index c65cadb..52c0abd 100644 (file)
Binary files a/blocks/timeline/amd/build/event_list.min.js.map and b/blocks/timeline/amd/build/event_list.min.js.map differ
index 9699ed1..3545cbf 100644 (file)
@@ -265,7 +265,10 @@ function(
                 return [];
             }
 
-            var calendarEvents = result.events;
+            var calendarEvents = result.events.filter(function(event) {
+                // Do not include events that does not have a due date.
+                return event.eventtype != "open" && event.eventtype != "opensubmission";
+            });
             // We expect to receive limit + 1 events back from the server.
             // Any less means there are no more events to load.
             var loadedAll = calendarEvents.length <= limit;
index 258de45..0f370ee 100644 (file)
@@ -1,6 +1,9 @@
 This files describes API changes in /blocks/* - activity modules,
 information provided here is intended especially for developers.
 
+=== 3.8 ===
+* Block block_community is no longer a part of core.
+
 === 3.7 ===
 * The block:addinstance capability is no longer required if the block can only be added to a dashboard.
 
index 2704bc4..4bc9388 100644 (file)
@@ -676,7 +676,7 @@ class core_calendar_external extends external_api {
     }
 
     /**
-     * Delete Calendar events.
+     * Create calendar events.
      *
      * @param array $events A list of events to create.
      * @return array array of events created.
index e1a850f..608bb6e 100644 (file)
@@ -104,6 +104,11 @@ define('CALENDAR_IMPORT_FROM_FILE', 0);
  */
 define('CALENDAR_IMPORT_FROM_URL',  1);
 
+/**
+ * CALENDAR_IMPORT_EVENT_UPDATED_SKIPPED - imported event was skipped
+ */
+define('CALENDAR_IMPORT_EVENT_SKIPPED',  -1);
+
 /**
  * CALENDAR_IMPORT_EVENT_UPDATED - imported event was updated
  */
@@ -2865,11 +2870,23 @@ function calendar_add_icalendar_event($event, $unused = null, $subscriptionid, $
 
     if ($updaterecord = $DB->get_record('event', array('uuid' => $eventrecord->uuid,
         'subscriptionid' => $eventrecord->subscriptionid))) {
-        $eventrecord->id = $updaterecord->id;
-        $return = CALENDAR_IMPORT_EVENT_UPDATED; // Update.
+
+        // Compare iCal event data against the moodle event to see if something has changed.
+        $result = array_diff((array) $eventrecord, (array) $updaterecord);
+
+        // Unset timemodified field because it's always going to be different.
+        unset($result['timemodified']);
+
+        if (count($result)) {
+            $eventrecord->id = $updaterecord->id;
+            $return = CALENDAR_IMPORT_EVENT_UPDATED; // Update.
+        } else {
+            return CALENDAR_IMPORT_EVENT_SKIPPED;
+        }
     } else {
         $return = CALENDAR_IMPORT_EVENT_INSERTED; // Insert.
     }
+
     if ($createdevent = \calendar_event::create($eventrecord, false)) {
         if (!empty($event->properties['RRULE'])) {
             // Repeating events.
@@ -3003,18 +3020,13 @@ function calendar_import_icalendar_events($ical, $unused = null, $subscriptionid
     $return = '';
     $eventcount = 0;
     $updatecount = 0;
+    $skippedcount = 0;
 
     // Large calendars take a while...
     if (!CLI_SCRIPT) {
         \core_php_time_limit::raise(300);
     }
 
-    // Mark all events in a subscription with a zero timestamp.
-    if (!empty($subscriptionid)) {
-        $sql = "UPDATE {event} SET timemodified = :time WHERE subscriptionid = :id";
-        $DB->execute($sql, array('time' => 0, 'id' => $subscriptionid));
-    }
-
     // Grab the timezone from the iCalendar file to be used later.
     if (isset($ical->properties['X-WR-TIMEZONE'][0]->value)) {
         $timezone = $ical->properties['X-WR-TIMEZONE'][0]->value;
@@ -3022,8 +3034,9 @@ function calendar_import_icalendar_events($ical, $unused = null, $subscriptionid
         $timezone = 'UTC';
     }
 
-    $return = '';
+    $icaluuids = [];
     foreach ($ical->components['VEVENT'] as $event) {
+        $icaluuids[] = $event->properties['UID'][0]->value;
         $res = calendar_add_icalendar_event($event, null, $subscriptionid, $timezone);
         switch ($res) {
             case CALENDAR_IMPORT_EVENT_UPDATED:
@@ -3032,6 +3045,9 @@ function calendar_import_icalendar_events($ical, $unused = null, $subscriptionid
             case CALENDAR_IMPORT_EVENT_INSERTED:
                 $eventcount++;
                 break;
+            case CALENDAR_IMPORT_EVENT_SKIPPED:
+                $skippedcount++;
+                break;
             case 0:
                 $return .= '<p>' . get_string('erroraddingevent', 'calendar') . ': ';
                 if (empty($event->properties['SUMMARY'])) {
@@ -3044,18 +3060,27 @@ function calendar_import_icalendar_events($ical, $unused = null, $subscriptionid
         }
     }
 
-    $return .= "<p>" . get_string('eventsimported', 'calendar', $eventcount) . "</p> ";
-    $return .= "<p>" . get_string('eventsupdated', 'calendar', $updatecount) . "</p>";
-
-    // Delete remaining zero-marked events since they're not in remote calendar.
     if (!empty($subscriptionid)) {
-        $deletecount = $DB->count_records('event', array('timemodified' => 0, 'subscriptionid' => $subscriptionid));
-        if (!empty($deletecount)) {
-            $DB->delete_records('event', array('timemodified' => 0, 'subscriptionid' => $subscriptionid));
-            $return .= "<p> " . get_string('eventsdeleted', 'calendar') . ": {$deletecount} </p>\n";
+        $eventsuuids = $DB->get_records_menu('event', ['subscriptionid' => $subscriptionid], '', 'id, uuid');
+
+        $icaleventscount = count($icaluuids);
+        $tobedeleted = [];
+        if (count($eventsuuids) > $icaleventscount) {
+            foreach ($eventsuuids as $eventid => $eventuuid) {
+                if (!in_array($eventuuid, $icaluuids)) {
+                    $tobedeleted[] = $eventid;
+                }
+            }
+            if (!empty($tobedeleted)) {
+                $DB->delete_records_list('event', 'id', $tobedeleted);
+                $return .= "<p> " . get_string('eventsdeleted', 'calendar') . ": " . count($tobedeleted) . "</p> ";
+            }
         }
     }
 
+    $return .= "<p>" . get_string('eventsimported', 'calendar', $eventcount) . "</p> ";
+    $return .= "<p>" . get_string('eventsskipped', 'calendar', $skippedcount) . "</p> ";
+    $return .= "<p>" . get_string('eventsupdated', 'calendar', $updatecount) . "</p>";
     return $return;
 }
 
index 5e4ae97..cf3118a 100644 (file)
@@ -654,6 +654,9 @@ $CFG->admin = 'admin';
 // Prevent JS caching
 // $CFG->cachejs = false; // NOT FOR PRODUCTION SERVERS!
 //
+// Prevent Template caching
+// $CFG->cachetemplates = false; // NOT FOR PRODUCTION SERVERS!
+//
 // Restrict which YUI logging statements are shown in the browser console.
 // For details see the upstream documentation:
 //   http://yuilibrary.com/yui/docs/api/classes/config.html#property_logInclude
index 4fc5fff..3c301ff 100644 (file)
Binary files a/course/amd/build/repository.min.js and b/course/amd/build/repository.min.js differ
index 11f07a1..21f6694 100644 (file)
Binary files a/course/amd/build/repository.min.js.map and b/course/amd/build/repository.min.js.map differ
index 98b67d5..6340eab 100644 (file)
@@ -71,7 +71,7 @@ define(['jquery', 'core/ajax'], function($, Ajax) {
         var args = {};
 
         if (typeof userid !== 'undefined') {
-            args.limit = limit;
+            args.userid = userid;
         }
 
         if (typeof limit !== 'undefined') {
index 81626d8..2072fe0 100644 (file)
@@ -166,7 +166,11 @@ if ($editform->is_cancelled()) {
 
         if (!empty($CFG->creatornewroleid) and !is_viewing($context, NULL, 'moodle/role:assign') and !is_enrolled($context, NULL, 'moodle/role:assign')) {
             // Deal with course creators - enrol them internally with default role.
-            enrol_try_internal_enrol($course->id, $USER->id, $CFG->creatornewroleid);
+            if (user_can_assign($context, $CFG->creatornewroleid)) {
+                enrol_try_internal_enrol($course->id, $USER->id, $CFG->creatornewroleid);
+            } else {
+                enrol_try_internal_enrol($course->id, $USER->id);
+            }
         }
 
         // The URL to take them to if they chose save and display.
index 50fa91a..5db9dea 100644 (file)
@@ -36,6 +36,9 @@ class format_singleactivity extends format_base {
     /** @var cm_info the current activity. Use get_activity() to retrieve it. */
     private $activity = false;
 
+    /** @var int The category ID guessed from the form data. */
+    private $categoryid = false;
+
     /**
      * The URL to use for the specified course
      *
@@ -145,6 +148,30 @@ class format_singleactivity extends format_base {
      */
     public function course_format_options($foreditform = false) {
         static $courseformatoptions = false;
+
+        $fetchtypes = $courseformatoptions === false;
+        $fetchtypes = $fetchtypes || ($foreditform && !isset($courseformatoptions['activitytype']['label']));
+
+        if ($fetchtypes) {
+            $availabletypes = $this->get_supported_activities();
+            if ($this->course) {
+                // The course exists. Test against the course.
+                $testcontext = context_course::instance($this->course->id);
+            } else if ($this->categoryid) {
+                // The course does not exist yet, but we have a category ID that we can test against.
+                $testcontext = context_coursecat::instance($this->categoryid);
+            } else {
+                // The course does not exist, and we somehow do not have a category. Test capabilities against the system context.
+                $testcontext = context_system::instance();
+            }
+            foreach (array_keys($availabletypes) as $activity) {
+                $capability = "mod/{$activity}:addinstance";
+                if (!has_capability($capability, $testcontext)) {
+                    unset($availabletypes[$activity]);
+                }
+            }
+        }
+
         if ($courseformatoptions === false) {
             $config = get_config('format_singleactivity');
             $courseformatoptions = array(
@@ -153,9 +180,13 @@ class format_singleactivity extends format_base {
                     'type' => PARAM_TEXT,
                 ),
             );
+
+            if (!empty($availabletypes) && !isset($availabletypes[$config->activitytype])) {
+                $courseformatoptions['activitytype']['default'] = array_keys($availabletypes)[0];
+            }
         }
+
         if ($foreditform && !isset($courseformatoptions['activitytype']['label'])) {
-            $availabletypes = $this->get_supported_activities();
             $courseformatoptionsedit = array(
                 'activitytype' => array(
                     'label' => new lang_string('activitytype', 'format_singleactivity'),
@@ -183,6 +214,11 @@ class format_singleactivity extends format_base {
      */
     public function create_edit_form_elements(&$mform, $forsection = false) {
         global $PAGE;
+
+        if (!$this->course && $submitvalues = $mform->getSubmitValues()) {
+            $this->categoryid = $submitvalues['category'];
+        }
+
         $elements = parent::create_edit_form_elements($mform, $forsection);
         if (!$forsection && ($course = $PAGE->course) && !empty($course->format) &&
                 $course->format !== 'site' && $course->format !== 'singleactivity') {
diff --git a/course/format/singleactivity/tests/behat/create_course.feature b/course/format/singleactivity/tests/behat/create_course.feature
new file mode 100644 (file)
index 0000000..6eee07f
--- /dev/null
@@ -0,0 +1,38 @@
+@format @format_singleactivity
+Feature: Courses can be created in Single Activity mode
+  In order to create a single activity course
+  As a manager
+  I need to create courses and set default values on them
+
+  Scenario: Create a course as a custom course creator
+    Given the following "users" exist:
+      | username  | firstname | lastname | email          |
+      | kevin  | Kevin   | the        | kevin@example.com |
+    And the following "roles" exist:
+      | shortname | name    | archetype |
+      | creator   | Creator |           |
+    And the following "system role assigns" exist:
+      | user   | role    | contextlevel |
+      | kevin  | creator | System       |
+    And I log in as "admin"
+    And I set the following system permissions of "Creator" role:
+      | capability | permission |
+      | moodle/course:create | Allow |
+      | moodle/course:update | Allow |
+      | moodle/course:manageactivities | Allow |
+      | moodle/course:viewparticipants | Allow |
+      | moodle/role:assign | Allow |
+      | mod/quiz:addinstance | Allow |
+    And I log out
+    And I log in as "kevin"
+    And I am on site homepage
+    When I press "Add a new course"
+    And I set the following fields to these values:
+      | Course full name  | My first course |
+      | Course short name | myfirstcourse |
+      | Format | Single activity format |
+    And I press "Update format"
+    Then I should see "Quiz" in the "Type of activity" "field"
+    And I should not see "Forum" in the "Type of activity" "field"
+    And I press "Save and display"
+    And I should see "Adding a new Quiz"
index 3eec792..205472d 100644 (file)
@@ -4045,7 +4045,6 @@ function course_get_user_administration_options($course, $context) {
         $options->outcomes = !empty($CFG->enableoutcomes) && has_capability('moodle/course:update', $context);
         $options->badges = !empty($CFG->enablebadges);
         $options->import = has_capability('moodle/restore:restoretargetimport', $context);
-        $options->publish = !empty($CFG->enablecoursepublishing) && has_capability('moodle/course:publish', $context);
         $options->reset = has_capability('moodle/course:reset', $context);
         $options->roles = has_capability('moodle/role:switchroles', $context);
     } else {
diff --git a/course/publish/backup.php b/course/publish/backup.php
deleted file mode 100644 (file)
index f9f9d7a..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-// This file is part of Moodle - http://moodle.org/                      //
-// Moodle - Modular Object-Oriented Dynamic Learning Environment         //
-//                                                                       //
-// 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/>.       //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-
-/**
- * This page display the publication backup form
- *
- * @package    course
- * @subpackage publish
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- */
-
-define('NO_OUTPUT_BUFFERING', true);
-
-require_once('../../config.php');
-require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
-require_once($CFG->dirroot . '/backup/moodle2/backup_plan_builder.class.php');
-require_once($CFG->libdir . '/filelib.php');
-
-
-//retrieve initial page parameters
-$id = required_param('id', PARAM_INT);
-$hubcourseid = required_param('hubcourseid', PARAM_INT);
-
-//some permissions and parameters checking
-$course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST);
-require_login($course);
-
-$context = context_course::instance($course->id);
-if (empty($CFG->enablecoursepublishing) || !has_capability('moodle/course:publish', $context) || !confirm_sesskey()) {
-    throw new moodle_exception('nopermission');
-}
-
-//page settings
-$PAGE->set_url('/course/publish/backup.php');
-$PAGE->set_pagelayout('incourse');
-$PAGE->set_title(get_string('course') . ': ' . $course->fullname);
-$PAGE->set_heading($course->fullname);
-
-//BEGIN backup processing
-$backupid = optional_param('backup', false, PARAM_ALPHANUM);
-if (!($bc = backup_ui::load_controller($backupid))) {
-    $bc = new backup_controller(backup::TYPE_1COURSE, $id, backup::FORMAT_MOODLE,
-                    backup::INTERACTIVE_YES, backup::MODE_HUB, $USER->id);
-}
-$backup = new backup_ui($bc,
-        array('id' => $id, 'hubcourseid' => $hubcourseid, 'huburl' => HUB_MOODLEORGHUBURL, 'hubname' => 'Moodle.net'));
-$backup->process();
-if ($backup->get_stage() == backup_ui::STAGE_FINAL) {
-    $backup->execute();
-} else {
-    $backup->save_controller();
-}
-
-if ($backup->get_stage() !== backup_ui::STAGE_COMPLETE) {
-    $renderer = $PAGE->get_renderer('core', 'backup');
-    echo $OUTPUT->header();
-    echo $OUTPUT->heading(get_string('publishcourseon', 'hub', 'Moodle.net'), 3, 'main');
-    if ($backup->enforce_changed_dependencies()) {
-        debugging('Your settings have been altered due to unmet dependencies', DEBUG_DEVELOPER);
-    }
-    echo $renderer->progress_bar($backup->get_progress_bar());
-    echo $backup->display($renderer);
-    echo $OUTPUT->footer();
-    die();
-}
-
-//$backupfile = $backup->get_stage_results();
-$backupfile = $bc->get_results();
-$backupfile = $backupfile['backup_destination'];
-//END backup processing
-
-//display the sending file page
-echo $OUTPUT->header();
-echo $OUTPUT->heading(get_string('sendingcourse', 'hub'), 3, 'main');
-$renderer = $PAGE->get_renderer('core', 'course');
-echo $renderer->sendingbackupinfo($backupfile);
-if (ob_get_level()) {
-    ob_flush();
-}
-flush();
-
-//send backup file to the hub
-\core\hub\publication::upload_course_backup($hubcourseid, $backupfile);
-
-//delete the temp backup file from user_tohub aera
-$backupfile->delete();
-$bc->destroy();
-
-//Output sending success
-echo $renderer->sentbackupinfo($id, HUB_MOODLEORGHUBURL, 'Moodle.net');
-
-echo $OUTPUT->footer();
diff --git a/course/publish/forms.php b/course/publish/forms.php
deleted file mode 100644 (file)
index 288475e..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-// This file is part of Moodle - http://moodle.org/                      //
-// Moodle - Modular Object-Oriented Dynamic Learning Environment         //
-//                                                                       //
-// 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/>.       //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-
-/**
- * @package    course
- * @subpackage publish
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- *
- * The forms used for course publication
- */
-
-defined('MOODLE_INTERNAL') || die();
-
-debugging('Support for alternative hubs has been removed from Moodle in 3.4. For communication with moodle.net ' .
-    'see lib/classes/hub/ .', DEBUG_DEVELOPER);
diff --git a/course/publish/hubselector.php b/course/publish/hubselector.php
deleted file mode 100644 (file)
index e731d4d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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/>.
-
-/*
- * @package    course
- * @subpackage publish
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- *
- * On this page the user selects where he wants to publish the course
-*/
-
-require('../../config.php');
-
-$id = required_param('id', PARAM_INT);
-redirect(new moodle_url('/course/publish/index.php', ['id' => $id]));
\ No newline at end of file
diff --git a/course/publish/index.php b/course/publish/index.php
deleted file mode 100644 (file)
index 7bff473..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-<?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/>.
-
-/*
- * @package    course
- * @subpackage publish
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- *
- * The user selects if he wants to publish the course on Moodle.org hub or
- * on a specific hub. The site must be registered on a hub to be able to
- * publish a course on it.
-*/
-
-require('../../config.php');
-
-$courseid = required_param('id', PARAM_INT); // Course id.
-$publicationid = optional_param('publicationid', 0, PARAM_INT); // Id of course publication to unpublish.
-
-require_login($courseid);
-$shortname = format_string($COURSE->shortname);
-
-$PAGE->set_url('/course/publish/index.php', array('id' => $courseid));
-$PAGE->set_pagelayout('incourse');
-$PAGE->set_title(get_string('publish', 'core_hub') . ': ' . $COURSE->fullname);
-$PAGE->set_heading($COURSE->fullname);
-
-$context = context_course::instance($courseid);
-if (empty($CFG->enablecoursepublishing) || !has_capability('moodle/course:publish', $context)) {
-    throw new moodle_exception('nopermission');
-}
-
-// If the site is not registered display an error page.
-if (!\core\hub\registration::is_registered()) {
-    echo $OUTPUT->header();
-    echo $OUTPUT->heading(get_string('publishcourseon', 'hub', 'Moodle.net'), 3, 'main');
-    echo $OUTPUT->box(get_string('notregisteredonhub', 'hub'));
-    if (has_capability('moodle/site:config', context_system::instance())) {
-        echo $OUTPUT->single_button(new moodle_url('/admin/registration/index.php'), get_string('register', 'admin'));
-    }
-    echo $OUTPUT->footer();
-    die();
-}
-
-// When hub listing status is requested update statuses of all published courses.
-$updatestatusid = optional_param('updatestatusid', false, PARAM_INT);
-if (!empty($updatestatusid) && confirm_sesskey()) {
-    if (core\hub\publication::get_publication($updatestatusid, $courseid)) {
-        core\hub\publication::request_status_update();
-        redirect($PAGE->url);
-    }
-}
-
-$renderer = $PAGE->get_renderer('core', 'course');
-
-// Unpublish course.
-if ($publication = \core\hub\publication::get_publication($publicationid, $courseid)) {
-    $confirm = optional_param('confirm', 0, PARAM_BOOL);
-    if ($confirm && confirm_sesskey()) {
-        \core\hub\publication::unpublish($publication);
-    } else {
-        // Display confirmation page for unpublishing.
-        $publication = \core\hub\publication::get_publication($publicationid, $courseid, MUST_EXIST);
-        $publication->courseshortname = format_string($COURSE->shortname);
-        echo $OUTPUT->header();
-        echo $OUTPUT->heading(get_string('unpublishcourse', 'hub', $shortname), 3, 'main');
-        echo $renderer->confirmunpublishing($publication);
-        echo $OUTPUT->footer();
-        die();
-    }
-}
-
-// List current publications and "Publish" buttons.
-echo $OUTPUT->header();
-
-echo $OUTPUT->heading(get_string('publishcourse', 'hub', $shortname), 3, 'main');
-echo $renderer->publicationselector($courseid);
-
-$publications = \core\hub\publication::get_course_publications($courseid);
-if (!empty($publications)) {
-    echo $OUTPUT->heading(get_string('publishedon', 'hub'), 3, 'main');
-    echo $renderer->registeredonhublisting($courseid, $publications);
-}
-
-echo $OUTPUT->footer();
diff --git a/course/publish/metadata.php b/course/publish/metadata.php
deleted file mode 100644 (file)
index 3042864..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-
-///////////////////////////////////////////////////////////////////////////
-//                                                                       //
-// This file is part of Moodle - http://moodle.org/                      //
-// Moodle - Modular Object-Oriented Dynamic Learning Environment         //
-//                                                                       //
-// 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/>.       //
-//                                                                       //
-///////////////////////////////////////////////////////////////////////////
-
-/*
- * @package    course
- * @subpackage publish
- * @author     Jerome Mouneyrac <jerome@mouneyrac.com>
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
- * @copyright  (C) 1999 onwards Martin Dougiamas  http://dougiamas.com
- *
- * This page display the publication metadata form
- */
-
-require_once('../../config.php');
-require_once($CFG->libdir . '/filelib.php');
-
-
-//check user access capability to this page
-$id = required_param('id', PARAM_INT);
-
-$course = $DB->get_record('course', array('id' => $id), '*', MUST_EXIST);
-require_login($course);
-
-//page settings
-$PAGE->set_url('/course/publish/metadata.php', array('id' => $course->id));
-$PAGE->set_pagelayout('incourse');
-$PAGE->set_title(get_string('course') . ': ' . $course->fullname);
-$PAGE->set_heading($course->fullname);
-
-$context = context_course::instance($course->id);
-if (empty($CFG->enablecoursepublishing) || !has_capability('moodle/course:publish', $context)) {
-    throw new moodle_exception('nopermission');
-}
-
-// Retrieve hub name and hub url.
-require_sesskey();
-
-// Set the publication form.
-$advertise = optional_param('advertise', false, PARAM_BOOL);
-$publicationid = optional_param('publicationid', false, PARAM_INT);
-$formparams = array('course' => $course, 'advertise' => $advertise);
-if ($publicationid) {
-    $publication = \core\hub\publication::get_publication($publicationid, $course->id, MUST_EXIST);
-    $formparams['publication'] = $publication;
-    $advertise = $formparams['advertise'] = $publication->enrollable;
-}
-$share = !$advertise;
-$coursepublicationform = new \core\hub\course_publication_form('', $formparams);
-$fromform = $coursepublicationform->get_data();
-
-if (!empty($fromform)) {
-
-    // Retrieve the course information.
-    $courseinfo = new stdClass();
-    $courseinfo->fullname = $fromform->name;
-    $courseinfo->shortname = $fromform->courseshortname;
-    $courseinfo->description = $fromform->description;
-    $courseinfo->language = $fromform->language;
-    $courseinfo->publishername = $fromform->publishername;
-    $courseinfo->publisheremail = $fromform->publisheremail;
-    $courseinfo->contributornames = $fromform->contributornames;
-    $courseinfo->coverage = $fromform->coverage;
-    $courseinfo->creatorname = $fromform->creatorname;
-    $courseinfo->licenceshortname = $fromform->licence;
-    $courseinfo->subject = $fromform->subject;
-    $courseinfo->audience = $fromform->audience;
-    $courseinfo->educationallevel = $fromform->educationallevel;
-    $creatornotes = $fromform->creatornotes;
-    $courseinfo->creatornotes = $creatornotes['text'];
-    $courseinfo->creatornotesformat = $creatornotes['format'];
-    $courseinfo->sitecourseid = $id;
-    if (!empty($fromform->deletescreenshots)) {
-        $courseinfo->deletescreenshots = $fromform->deletescreenshots;
-    }
-    if ($share) {
-        $courseinfo->demourl = $fromform->demourl;
-        $courseinfo->enrollable = false;
-    } else {
-        $courseinfo->courseurl = $fromform->courseurl;
-        $courseinfo->enrollable = true;
-    }
-
-    // Retrieve the outcomes of this course.
-    require_once($CFG->libdir . '/grade/grade_outcome.php');
-    $outcomes = grade_outcome::fetch_all_available($id);
-    if (!empty($outcomes)) {
-        foreach ($outcomes as $outcome) {
-            $sentoutcome = new stdClass();
-            $sentoutcome->fullname = $outcome->fullname;
-            $courseinfo->outcomes[] = $sentoutcome;
-        }
-    }
-
-    // Retrieve the content information from the course.
-    $coursecontext = context_course::instance($course->id);
-    $courseblocks = \core\hub\publication::get_block_instances_by_context($coursecontext->id);
-
-    if (!empty($courseblocks)) {
-        $blockname = '';
-        foreach ($courseblocks as $courseblock) {
-            if ($courseblock->blockname != $blockname) {
-                if (!empty($blockname)) {
-                    $courseinfo->contents[] = $content;
-                }
-
-                $blockname = $courseblock->blockname;
-                $content = new stdClass();
-                $content->moduletype = 'block';
-                $content->modulename = $courseblock->blockname;
-                $content->contentcount = 1;
-            } else {
-                $content->contentcount = $content->contentcount + 1;
-            }
-        }
-        $courseinfo->contents[] = $content;
-    }
-
-    $activities = get_fast_modinfo($course, $USER->id);
-    foreach ($activities->instances as $activityname => $activitydetails) {
-        $content = new stdClass();
-        $content->moduletype = 'activity';
-        $content->modulename = $activityname;
-        $content->contentcount = count($activities->instances[$activityname]);
-        $courseinfo->contents[] = $content;
-    }
-
-    // Save into screenshots field the references to the screenshot content hash
-    // (it will be like a unique id from the hub perspective).
-    if (!empty($fromform->deletescreenshots) or $share) {
-        $courseinfo->screenshots = 0;
-    } else {
-        $courseinfo->screenshots = $fromform->existingscreenshotnumber;
-    }
-    $files = [];
-    if (!empty($fromform->screenshots)) {
-        $fs = get_file_storage();
-        $files = $fs->get_area_files(context_user::instance($USER->id)->id, 'user', 'draft', $fromform->screenshots,
-            'filepath, filename', false);
-        $files = array_filter($files, function(stored_file $file) {
-            return $file->is_valid_image();
-        });
-        $courseinfo->screenshots += count($files);
-    }
-
-    // PUBLISH ACTION.
-    $hubcourseid = \core\hub\publication::publish_course($courseinfo, $files);
-
-    // Redirect to the backup process page.
-    if ($share) {
-        $params = array('sesskey' => sesskey(), 'id' => $id, 'hubcourseid' => $hubcourseid);
-        $backupprocessurl = new moodle_url("/course/publish/backup.php", $params);
-        redirect($backupprocessurl);
-    } else {
-        // Redirect to the index publis page.
-        redirect(new moodle_url('/course/publish/index.php', ['id' => $id]),
-            get_string('coursepublished', 'hub', 'Moodle.net'), null, \core\output\notification::NOTIFY_SUCCESS);
-    }
-}
-
-// OUTPUT SECTION.
-
-echo $OUTPUT->header();
-echo $OUTPUT->heading(get_string('publishcourseon', 'hub', 'Moodle.net'), 3, 'main');
-
-// Display hub information (logo, name, description).
-$renderer = $PAGE->get_renderer('core', 'course');
-if ($hubinfo = \core\hub\registration::get_moodlenet_info()) {
-    echo $renderer->hubinfo($hubinfo);
-}
-
-// Display metadata form.
-$coursepublicationform->display();
-echo $OUTPUT->footer();
index ba33b06..51b5254 100644 (file)
@@ -2106,128 +2106,6 @@ class core_course_renderer extends plugin_renderer_base {
         return $this->output->render_from_template('core_course/activity_navigation', $data);
     }
 
-    /**
-     * Display the selector to advertise or publish a course
-     * @param int $courseid
-     */
-    public function publicationselector($courseid) {
-        $text = '';
-
-        $advertiseurl = new moodle_url("/course/publish/metadata.php",
-            array('sesskey' => sesskey(), 'id' => $courseid, 'advertise' => true));
-        $advertisebutton = new single_button($advertiseurl, get_string('advertise', 'hub'));
-        $text .= $this->output->render($advertisebutton);
-        $text .= html_writer::tag('div', get_string('advertisepublication_help', 'hub'),
-            array('class' => 'publishhelp'));
-
-        $text .= html_writer::empty_tag('br');  // TODO Delete.
-
-        $uploadurl = new moodle_url("/course/publish/metadata.php",
-            array('sesskey' => sesskey(), 'id' => $courseid, 'share' => true));
-        $uploadbutton = new single_button($uploadurl, get_string('share', 'hub'));
-        $text .= $this->output->render($uploadbutton);
-        $text .= html_writer::tag('div', get_string('sharepublication_help', 'hub'),
-            array('class' => 'publishhelp'));
-
-        return $text;
-    }
-
-    /**
-     * Display the listing of hub where a course is registered on
-     * @param int $courseid
-     * @param array $publications
-     */
-    public function registeredonhublisting($courseid, $publications) {
-        global $CFG;
-        $table = new html_table();
-        $table->head = array(get_string('type', 'hub'),
-            get_string('date'), get_string('status', 'hub'), get_string('operation', 'hub'));
-        $table->size = array('20%', '30%', '%20', '%25');
-
-        $brtag = html_writer::empty_tag('br');
-
-        foreach ($publications as $publication) {
-
-            $params = array('id' => $publication->courseid, 'publicationid' => $publication->id);
-            $cancelurl = new moodle_url("/course/publish/index.php", $params);
-            $cancelbutton = new single_button($cancelurl, get_string('removefromhub', 'hub'));
-            $cancelbutton->class = 'centeredbutton';
-            $cancelbuttonhtml = $this->output->render($cancelbutton);
-
-            if ($publication->enrollable) {
-                $params = array('sesskey' => sesskey(), 'id' => $publication->courseid, 'publicationid' => $publication->id);
-                $updateurl = new moodle_url("/course/publish/metadata.php", $params);
-                $updatebutton = new single_button($updateurl, get_string('update', 'hub'));
-                $updatebutton->class = 'centeredbutton';
-                $updatebuttonhtml = $this->output->render($updatebutton);
-
-                $operations = $updatebuttonhtml . $brtag . $cancelbuttonhtml;
-            } else {
-                $operations = $cancelbuttonhtml;
-            }
-
-            // If the publication check time if bigger than May 2010, it has been checked.
-            if ($publication->timechecked > 1273127954) {
-                if ($publication->status == 0) {
-                    $status = get_string('statusunpublished', 'hub');
-                } else {
-                    $status = get_string('statuspublished', 'hub');
-                    if (!empty($publication->link)) {
-                        $status = html_writer::link($publication->link, $status);
-                    }
-                }
-
-                $status .= $brtag . html_writer::tag('a', get_string('updatestatus', 'hub'),
-                        array('href' => $CFG->wwwroot . '/course/publish/index.php?id='
-                            . $courseid . "&updatestatusid=" . $publication->id
-                            . "&sesskey=" . sesskey())) .
-                    $brtag . get_string('lasttimechecked', 'hub') . ": "
-                    . format_time(time() - $publication->timechecked);
-            } else {
-                $status = get_string('neverchecked', 'hub') . $brtag
-                    . html_writer::tag('a', get_string('updatestatus', 'hub'),
-                        array('href' => $CFG->wwwroot . '/course/publish/index.php?id='
-                            . $courseid . "&updatestatusid=" . $publication->id
-                            . "&sesskey=" . sesskey()));
-            }
-            // Add button cells.
-            $cells = array($publication->enrollable ?
-                get_string('advertised', 'hub') : get_string('shared', 'hub'),
-                userdate($publication->timepublished,
-                    get_string('strftimedatetimeshort')), $status, $operations);
-            $row = new html_table_row($cells);
-            $table->data[] = $row;
-        }
-
-        $contenthtml = html_writer::table($table);
-
-        return $contenthtml;
-    }
-
-    /**
-     * Display unpublishing confirmation page
-     * @param stdClass $publication
-     *      $publication->courseshortname
-     *      $publication->courseid
-     *      $publication->hubname
-     *      $publication->huburl
-     *      $publication->id
-     */
-    public function confirmunpublishing($publication) {
-        $optionsyes = array('sesskey' => sesskey(), 'id' => $publication->courseid,
-            'hubcourseid' => $publication->hubcourseid,
-            'cancel' => true, 'publicationid' => $publication->id, 'confirm' => true);
-        $optionsno = array('sesskey' => sesskey(), 'id' => $publication->courseid);
-        $publication->hubname = html_writer::tag('a', 'Moodle.net',
-            array('href' => HUB_MOODLEORGHUBURL));
-        $formcontinue = new single_button(new moodle_url("/course/publish/index.php",
-            $optionsyes), get_string('unpublish', 'hub'), 'post');
-        $formcancel = new single_button(new moodle_url("/course/publish/index.php",
-            $optionsno), get_string('cancel'), 'get');
-        return $this->output->confirm(get_string('unpublishconfirmation', 'hub', $publication),
-            $formcontinue, $formcancel);
-    }
-
     /**
      * Display waiting information about backup size during uploading backup process
      * @param object $backupfile the backup stored_file
@@ -2241,23 +2119,6 @@ class core_course_renderer extends plugin_renderer_base {
         return $html;
     }
 
-    /**
-     * Display upload successfull message and a button to the publish index page
-     * @param int $id the course id
-     * @return $html string
-     */
-    public function sentbackupinfo($id) {
-        $html = html_writer::tag('div', get_string('sent', 'hub'),
-            array('class' => 'courseuploadtextinfo'));
-        $publishindexurl = new moodle_url('/course/publish/index.php',
-            array('sesskey' => sesskey(), 'id' => $id,
-                'published' => true));
-        $continue = $this->output->render(
-            new single_button($publishindexurl, get_string('continue')));
-        $html .= html_writer::tag('div', $continue, array('class' => 'sharecoursecontinue'));
-        return $html;
-    }
-
     /**
      * Hub information (logo - name - description - link)
      * @param object $hubinfo
index 3546584..16fa6e3 100644 (file)
@@ -1144,11 +1144,8 @@ class behat_course extends behat_base {
     protected function get_activity_element($element, $selectortype, $activityname) {
         $activitynode = $this->get_activity_node($activityname);
 
-        // Transforming to Behat selector/locator.
-        list($selector, $locator) = $this->transform_selector($selectortype, $element);
-        $exception = new ElementNotFoundException($this->getSession(), '"' . $element . '" "' . $selectortype . '" in "' . $activityname . '" ');
-
-        return $this->find($selector, $locator, $exception, $activitynode);
+        $exception = new ElementNotFoundException($this->getSession(), "'{$element}' '{$selectortype}' in '${activityname}'");
+        return $this->find($selectortype, $element, $exception, $activitynode);
     }
 
     /**
index 2596eb2..8571b97 100644 (file)
@@ -68,3 +68,48 @@ Feature: Managers can create courses
       | id_enddate_day | 24 |
       | id_enddate_month | October |
       | id_enddate_year | 2016 |
+
+  Scenario: Create a course as a custom course creator
+    Given the following "users" exist:
+      | username  | firstname | lastname | email          |
+      | kevin  | Kevin   | the        | kevin@example.com |
+    And the following "roles" exist:
+      | shortname | name    | archetype |
+      | creator   | Creator |           |
+    And the following "system role assigns" exist:
+      | user   | role    | contextlevel |
+      | kevin  | creator | System       |
+    And I log in as "admin"
+    And I set the following system permissions of "Creator" role:
+      | capability | permission |
+      | moodle/course:create | Allow |
+      | moodle/course:manageactivities | Allow |
+      | moodle/course:viewparticipants | Allow |
+      | moodle/role:assign | Allow |
+    And I log out
+    And I log in as "kevin"
+    And I am on site homepage
+    When I press "Add a new course"
+    And I set the following fields to these values:
+      | Course full name  | My first course |
+      | Course short name | myfirstcourse |
+    And I press "Save and display"
+    And I follow "Participants"
+    Then I should see "Kevin the"
+    And I should not see "Teacher"
+    And I log out
+    Given I log in as "admin"
+    And I define the allowed role assignments for the "Creator" role as:
+      | Teacher | Assignable |
+    And I log out
+    And I log in as "kevin"
+    And I am on site homepage
+    And I turn editing mode on
+    When I press "Add a new course"
+    And I set the following fields to these values:
+      | Course full name  | My second course |
+      | Course short name | mysecondcourse |
+    And I press "Save and display"
+    And I follow "Participants"
+    Then I should see "Kevin the"
+    And I should see "Teacher"
index 7f5482f..1b0a8ac 100644 (file)
@@ -3307,7 +3307,6 @@ class core_course_courselib_testcase extends advanced_testcase {
         $this->assertFalse($adminoptions->outcomes);
         $this->assertTrue($adminoptions->badges);
         $this->assertTrue($adminoptions->import);
-        $this->assertFalse($adminoptions->publish);
         $this->assertTrue($adminoptions->reset);
         $this->assertTrue($adminoptions->roles);
     }
@@ -3339,7 +3338,6 @@ class core_course_courselib_testcase extends advanced_testcase {
         $this->assertFalse($adminoptions->outcomes);
         $this->assertTrue($adminoptions->badges);
         $this->assertFalse($adminoptions->import);
-        $this->assertFalse($adminoptions->publish);
         $this->assertFalse($adminoptions->reset);
         $this->assertFalse($adminoptions->roles);
 
index 803ed5e..ab857e9 100644 (file)
@@ -2296,12 +2296,11 @@ class core_course_externallib_testcase extends externallib_advanced_testcase {
                 $this->assertFalse($adminoptions->outcomes);
                 $this->assertFalse($adminoptions->badges);
                 $this->assertFalse($adminoptions->import);
-                $this->assertFalse($adminoptions->publish);
                 $this->assertFalse($adminoptions->reset);
                 $this->assertFalse($adminoptions->roles);
                 $this->assertFalse($adminoptions->editcompletion);
             } else {
-                $this->assertCount(15, $course['options']);
+                $this->assertCount(14, $course['options']);
                 $this->assertFalse($adminoptions->update);
                 $this->assertFalse($adminoptions->filters);
                 $this->assertFalse($adminoptions->reports);
@@ -2313,7 +2312,6 @@ class core_course_externallib_testcase extends externallib_advanced_testcase {
                 $this->assertFalse($adminoptions->outcomes);
                 $this->assertTrue($adminoptions->badges);
                 $this->assertFalse($adminoptions->import);
-                $this->assertFalse($adminoptions->publish);
                 $this->assertFalse($adminoptions->reset);
                 $this->assertFalse($adminoptions->roles);
                 $this->assertFalse($adminoptions->editcompletion);
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 a59f0fc..e257fd9 100644 (file)
@@ -195,9 +195,9 @@ Feature: We can set the grade to pass value
     And I add a "Forum" to section "1" and I fill the form with:
       | Forum name     | Test Forum 1    |
       | Description    | Test               |
-      | Aggregate type | Average of ratings |
-      | Grade to pass  | 90                 |
-      | scale[modgrade_point] | 60 |
+      | Ratings > Aggregate type | Average of ratings |
+      | Ratings > scale[modgrade_point] | 60 |
+      | Grade > Grade to pass  | 90                 |
     Then I should see "The grade to pass can not be greater than the maximum possible grade 60"
 
   Scenario: Set a valid grade to pass for forum activity
@@ -205,8 +205,8 @@ Feature: We can set the grade to pass value
     And I add a "Forum" to section "1" and I fill the form with:
       | Forum name     | Test Forum 1    |
       | Description    | Test               |
-      | Aggregate type | Average of ratings |
-      | Grade to pass  | 90                 |
+      | Ratings > Aggregate type | Average of ratings |
+      | Grade > Grade to pass  | 90                 |
     And I navigate to "View > Grader report" in the course gradebook
     And I turn editing mode on
     And I click on "Edit  forum Test Forum 1" "link"
index de91486..785cc63 100644 (file)
@@ -69,6 +69,10 @@ $strnotingroup       = get_string('notingrouplist', 'group');
 $strnogroup          = get_string('nogroup', 'group');
 $strnogrouping       = get_string('nogrouping', 'group');
 
+// This can show all users and all groups in a course.
+// This is lots of data so allow this script more resources.
+raise_memory_limit(MEMORY_EXTRA);
+
 // Get all groupings and sort them by formatted name.
 $groupings = $DB->get_records('groupings', array('courseid'=>$courseid), 'name');
 foreach ($groupings as $gid => $grouping) {
index e03e3b2..90bc3bf 100644 (file)
@@ -89,7 +89,7 @@ $string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
 $string['welcomep20'] = 'Podařilo se vám úspěšně nainstalovat a spustit balíček <strong>{$a->packname} {$a->packversion}</strong>. Gratulujeme!';
 $string['welcomep30'] = 'Tato verze <strong>{$a->installername}</strong> obsahuje aplikace k vytvoření prostředí, ve kterém bude provozován váš <strong>Moodle</strong>. Jmenovitě se jedná o:';
 $string['welcomep40'] = 'Balíček rovněž obsahuje <strong>Moodle ve verzi {$a->moodlerelease} ({$a->moodleversion})</strong>.';
-$string['welcomep50'] = 'Použití všech aplikací v tomto balíčku je vázáno jejich příslušnými licencemi. Kompletní balíček <strong>{$a->installername}</strong> je software s <a href="http://www.opensource.org/docs/definition_plain.html"> otevřeným kódem (open source)</a> a je šířen pod licencí <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a>.';
+$string['welcomep50'] = 'Použití všech aplikací v tomto balíčku je vázáno jejich příslušnými licencemi. Kompletní balíček <strong>{$a->installername}</strong> je software s <a href="https://www.opensource.org/docs/definition_plain.html"> otevřeným kódem (open source)</a> a je šířen pod licencí <a href="https://www.gnu.org/copyleft/gpl.html">GPL</a>.';
 $string['welcomep60'] = 'Následující stránky vás v několik jednoduchých krocích nastavením <strong>Moodlu</strong> na vašem počítači. Můžete přijmout výchozí nastavení, nebo si je upravit podle svých potřeb.';
 $string['welcomep70'] = 'Stisknutím níže uvedeného tlačítka "Další" pokračujte v nastavení vaší instalace Moodlu.';
 $string['wwwroot'] = 'Webová adresa';
index 5b94472..9071adb 100644 (file)
@@ -31,4 +31,4 @@
 defined('MOODLE_INTERNAL') || die();
 
 $string['parentlanguage'] = 'de';
-$string['thislanguage'] = 'Deutsch für Arbeitsplatz';
+$string['thislanguage'] = 'Deutsch';
index c248e34..8a40f61 100644 (file)
@@ -30,6 +30,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
+$string['language'] = 'Limbă';
 $string['moodlelogo'] = 'Logo Moodle';
 $string['next'] = 'Următoarea';
 $string['previous'] = 'Anterior';
similarity index 55%
rename from blocks/community/version.php
rename to install/lang/zh_cn_wp/langconfig.php
index c7034eb..1b91c76 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Version details
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
  *
- * @package    block_community
- * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
- * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2019052000;        // The current plugin version (Date: YYYYMMDDXX)
-$plugin->requires  = 2019051100;        // Requires this Moodle version
-$plugin->component = 'block_community'; // Full name of the plugin (used for diagnostics)
+$string['parentlanguage'] = 'zh_cn';
+$string['thislanguage'] = 'Workplace 简体中文版';
similarity index 54%
rename from course/publish/lib.php
rename to install/lang/zh_tw_wp/langconfig.php
index 72330f6..a00ce56 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 // This file is part of Moodle - http://moodle.org/
 //
 // Moodle is free software: you can redistribute it and/or modify
 // You should have received a copy of the GNU General Public License
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
+/**
+ * Automatically generated strings for Moodle installer
+ *
+ * Do not edit this file manually! It contains just a subset of strings
+ * needed during the very first steps of installation. This file was
+ * generated automatically by export-installer.php (which is part of AMOS
+ * {@link http://docs.moodle.org/dev/Languages/AMOS}) using the
+ * list of strings defined in /install/stringnames.txt.
+ *
+ * @package   installer
+ * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
 defined('MOODLE_INTERNAL') || die();
+
+$string['parentlanguage'] = 'zh_tw';
+$string['thislanguage'] = 'Workplace 繁體中文版';
index fa8f10f..39e30aa 100644 (file)
@@ -104,6 +104,8 @@ $string['bookmarkdeleted'] = 'Bookmark deleted.';
 $string['bookmarkthispage'] = 'Bookmark this page';
 $string['cachejs'] = 'Cache Javascript';
 $string['cachejs_help'] = 'Javascript caching and compression greatly improves page loading performance. it is strongly recommended for production sites. Developers will probably want to disable this feature.';
+$string['cachetemplates'] = 'Cache Templates';
+$string['cachetemplates_help'] = 'Template caching will improve page loading performance and is strongly recommended for production sites. Developers will probably want to disable this feature.';
 $string['calendarexportsalt'] = 'Calendar export salt';
 $string['calendarsettings'] = 'Calendar';
 $string['calendartype'] = 'Calendar type';
@@ -200,7 +202,7 @@ $string['configdebug'] = 'If you turn this on, then PHP\'s error_reporting will
 $string['configdebugdisplay'] = 'Set to on, the error reporting will go to the HTML page. This is practical, but breaks XHTML, JS, cookies and HTTP headers in general. Set to off, it will send the output to your server logs, allowing better debugging. The PHP setting error_log controls which log this goes to.';
 $string['configdebugpageinfo'] = 'Enable if you want page information printed in page footer.';
 $string['configdebugvalidators'] = 'Enable if you want to have links to external validator servers in page footer. You may need to create new user with username <em>w3cvalidator</em>, and enable guest access. These changes may allow unauthorized access to server, do not enable on production sites!';
-$string['configdefaulthomepage'] = 'This determines the home page for logged in users';
+$string['configdefaulthomepage'] = 'This determines the first link in the navigation for logged-in users.';
 $string['configdefaultrequestcategory'] = 'Courses requested by users will be automatically placed in this category.';
 $string['configdefaultrequestedcategory'] = 'Default category to put courses that were requested into, if they\'re approved.';
 $string['configdefaultuserroleid'] = 'All logged in users will be given the capabilities of the role you specify here, at the site level, in ADDITION to any other roles they may have been given.  The default is the Authenticated user role.  Note that this will not conflict with other roles they have unless you prohibit capabilities, it just ensures that all users have capabilities that are not assignable at the course level (eg post blog entries, manage own calendar, etc).';
@@ -455,7 +457,7 @@ $string['debugvalidators'] = 'Show validator links';
 $string['defaultcity'] = 'Default city';
 $string['defaultcity_help'] = 'A city entered here will be the default city when creating new user accounts.';
 $string['defaultformatnotset'] = 'Error determining default course format. Please check site settings.';
-$string['defaulthomepage'] = 'Default home page for users';
+$string['defaulthomepage'] = 'Home page for users';
 $string['defaultrequestcategory'] = 'Default category for course requests';
 $string['defaultsettinginfo'] = 'Default: {$a}';
 $string['defaultuserroleid'] = 'Default role for all users';
@@ -563,8 +565,8 @@ $string['experimentalsettings'] = 'Experimental settings';
 $string['extendedusernamechars'] = 'Allow extended characters in usernames';
 $string['extramemorylimit'] = 'Extra PHP memory limit';
 $string['fatalsessionautostart'] = '<p>Serious configuration error detected, please notify server administrator.</p><p> To operate properly, Moodle requires that administrator changes PHP settings.</p><p><code>session.auto_start</code> must be set to <code>off</code>.</p><p>This setting is controlled by editing <code>php.ini</code>, Apache/IIS <br />configuration or <code>.htaccess</code> file on the server.</p>';
-$string['filescleanupperiod'] = 'Clean trash pool files';
-$string['filescleanupperiod_help'] = 'How often trash files are removed. These are files that are associated with a context that no longer exists';
+$string['filescleanupperiod'] = 'Clean up trash pool files';
+$string['filescleanupperiod_help'] = 'How often trash pool files are deleted. These are files that are associated with a context that no longer exists, for example when a course is deleted. Please note: This setting can result in missing files in a course which is backed up, deleted and then restored if the setting \'Include files\' (backup_auto_files) in \'Automated backup settings\' is disabled.';
 $string['fileconversioncleanuptask'] = 'Cleanup of temporary records for file conversions.';
 $string['filecreated'] = 'New file created';
 $string['filesizeunits'] = 'file size units';
@@ -1008,7 +1010,7 @@ $string['quizattemptsupgradedmessage'] = 'In Moodle 2.1 there was a major upgrad
 $string['recaptchaprivatekey'] = 'ReCAPTCHA secret key';
 $string['recaptchapublickey'] = 'ReCAPTCHA site key';
 $string['register'] = 'Register your site';
-$string['registermoodlenet'] = '<p>We\'d love to stay in touch and provide you with important things for your Moodle site!</p><p>By registering:</p><ul><li>You\'ll be one of the first to find out about important notifications such as security alerts and new Moodle releases.</li><li>You can access and activate mobile push notifications from your Moodle site through our free <a href="https://download.moodle.org/mobile/">Moodle app</a>.</li><li>You are contributing to our <a href="https://moodle.net/stats/">Moodle statistics</a> of the worldwide community, which help us improve Moodle and our community sites.</li><li>If you wish, your site can be included in the <a href="https://moodle.net/sites/">list of registered Moodle sites</a> in your country.</li></ul>';
+$string['registermoodlenet'] = '<p>We\'d love to stay in touch and provide you with important things for your Moodle site!</p><p>By registering:</p><ul><li>You can subscribe to receive notifications of new Moodle releases, security alerts and other important news.</li><li>You can access and activate mobile push notifications from your Moodle site through our free <a href="https://download.moodle.org/mobile/">Moodle app</a>.</li><li>You are contributing to our <a href="https://moodle.net/stats/">Moodle statistics</a> of the worldwide community, which help us improve Moodle and our community sites.</li><li>If you wish, your site can be included in the <a href="https://moodle.net/sites/">list of registered Moodle sites</a> in your country.</li></ul>';
 $string['registermoodleorg'] = 'When you register your site';
 $string['registermoodleorgli1'] = 'You are added to a low-volume mailing list for important notifications such as security alerts and new releases of Moodle.';
 $string['registermoodleorgli2'] = 'Statistics about your site will be added to the {$a} of the worldwide Moodle community.';
@@ -1041,6 +1043,7 @@ $string['purgemuc'] = 'All MUC caches';
 $string['purgeothercaches'] = 'All file and miscellaneous caches';
 $string['purgeselectedcaches'] = 'Purge selected caches';
 $string['purgeselectedcachesfinished'] = 'The selected caches were purged.';
+$string['purgetemplates'] = 'Templates';
 $string['purgethemecache'] = 'Themes';
 $string['requestcategoryselection'] = 'Enable category selection';
 $string['restorecourse'] = 'Restore course';
@@ -1264,6 +1267,7 @@ $string['taskstatscron'] = 'Background processing for statistics';
 $string['tasktagcron'] = 'Background processing for tags';
 $string['tasktempfilecleanup'] = 'Delete stale temp files';
 $string['tempdatafoldercleanup'] = 'Clean up temporary data files older than';
+$string['templates'] = 'Templates';
 $string['testoutgoingmailconf'] = 'Test outgoing mail configuration';
 $string['testoutgoingmaildetail'] = 'Note: Before testing, please save your configuration.<br />{$a}';
 $string['testoutgoingmailconf_message'] = 'This is a test message to confirm that you have successfully configured your site\'s outgoing mail.';
@@ -1302,6 +1306,7 @@ $string['unbookmarkthispage'] = 'Unbookmark this page';
 $string['unicoderequired'] = 'It is required that you store all your data in Unicode format (UTF-8). New installations must be performed into databases that have their default character set as Unicode.  If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).';
 $string['uninstallplugin'] = 'Uninstall';
 $string['unlockaccount'] = 'Unlock account';
+$string['unoconvwarning'] = 'The version of unoconv you have installed is not supported.';
 $string['unsettheme'] = 'Unset theme';
 $string['unsupported'] = 'Unsupported';
 $string['unsupporteddbfileformat'] = 'Your database uses Antelope as the file format. Full UTF-8 support in MySQL and MariaDB requires the Barracuda file format. Please switch to the Barracuda file format. See the documentation <a href="https://docs.moodle.org/en/admin/environment/custom check/mysql full unicode support">MySQL full unicode support</a> for details.';
@@ -1391,8 +1396,8 @@ $string['usermanagement'] = 'User management';
 $string['userpreference'] = 'User preference';
 $string['userpolicies'] = 'User policies';
 $string['users'] = 'Users';
-$string['userquota'] = 'User quota';
-$string['userquota_desc'] = 'The maximum number of bytes that a user can store in their own private file area.';
+$string['userquota'] = 'Private files space';
+$string['userquota_desc'] = 'The maximum amount of data that each user can store in their private files area.';
 $string['usesitenameforsitepages'] = 'Use site name for site pages';
 $string['usetags'] = 'Enable tags functionality';
 $string['validateemptylineerror'] = 'Empty lines are not valid';
index cbeceea..ff7e173 100644 (file)
@@ -97,8 +97,8 @@ $string['noevaluationbasedassumptions'] = 'Models based on assumptions cannot be
 $string['nodata'] = 'No data to analyse';
 $string['noinsightsmodel'] = 'This model does not generate insights';
 $string['noinsights'] = 'No insights reported';
-$string['nonewdata'] = 'No new data available. It will be analysed after the next analysis interval.';
-$string['nonewranges'] = 'No new predictions yet. It will be analysed after the next analysis interval.';
+$string['nonewdata'] = 'No new data available. The model will be analysed after the next analysis interval.';
+$string['nonewranges'] = 'No new predictions yet. The model will be analysed after the next analysis interval.';
 $string['nopredictionsyet'] = 'No predictions available yet';
 $string['noranges'] = 'No predictions yet';
 $string['notrainingbasedassumptions'] = 'Models based on assumptions do not need training';
index 9cfe05e..0c08c50 100644 (file)
@@ -127,7 +127,7 @@ $string['configgeneralblocks'] = 'Sets the default for including blocks in a bac
 $string['configgeneralcalendarevents'] = 'Sets the default for including calendar events in a backup.';
 $string['configgeneralcomments'] = 'Sets the default for including comments in a backup.';
 $string['configgeneralcompetencies'] = 'Sets the default for including competencies in a backup.';
-$string['configgeneralfiles'] = 'Sets the default for including files in a backup.';
+$string['configgeneralfiles'] = 'Sets the default for including files in a backup. Please note: Disabling this setting will result in a backup which only includes references to files. This is not a problem if the backup is restored on the same site and the files have not been deleted according to the setting \'Clean up trash pool files\' (filescleanupperiod).';
 $string['configgeneralfilters'] = 'Sets the default for including filters in a backup.';
 $string['configgeneralhistories'] = 'Sets the default for including user history within a backup.';
 $string['configgenerallogs'] = 'If enabled logs will be included in backups by default.';
index 7b54068..6ff0088 100644 (file)
@@ -111,7 +111,7 @@ $string['backpackemail_help'] = 'The email address associated with your backpack
 $string['backpackemailverificationpending'] = 'Verification pending';
 $string['backpackemailverifyemailbody'] = 'Hi,
 
-A new connection to your OpenBadges backpack has been requested from \'{$a->sitename}\' using your email address.
+A new connection to your badges backpack has been requested from \'{$a->sitename}\' using your email address.
 
 To confirm and activate the connection to your backpack, please go to
 
@@ -121,7 +121,7 @@ In most mail programs, this should appear as a blue link which you can just clic
 
 If you need help, please contact the site administrator,
 {$a->admin}';
-$string['backpackemailverifyemailsubject'] = '{$a}: OpenBadges Backpack email verification';
+$string['backpackemailverifyemailsubject'] = '{$a}: Badges backpack email verification';
&nb