Compare commits
297 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 382d80646b | |||
| 9d4c11199e | |||
| b99f854795 | |||
| 89ad5776d4 | |||
| 9bff4d35db | |||
| 47ccd6b3d7 | |||
| 7724705df1 | |||
| e767bf986d | |||
| 7747f5f717 | |||
| da84dd37f3 | |||
| 3c413110ff | |||
| 7ba4955f9d | |||
| 8c504c1f0e | |||
| dfe8919c6c | |||
| 5c2adb282f | |||
| bc9fc77b39 | |||
| 86c22b202d | |||
| 0ee30fc5b8 | |||
| f0e38c2ce6 | |||
| 5c86055249 | |||
| 4daa27678a | |||
| ec091d8198 | |||
| f342654ca7 | |||
| eb28fb4f3a | |||
| 3142206102 | |||
| a954d77d37 | |||
| 7bb24f9884 | |||
| 3b7c411dcf | |||
| d4b822cfb1 | |||
| f01632affa | |||
| 1dec402e96 | |||
| cbe5699193 | |||
| b8a545f8de | |||
| 93a1739f39 | |||
| 216b71f03e | |||
| f55a65b0bf | |||
| 567ab3d5d1 | |||
| ebbad9ca59 | |||
| b2d737b90d | |||
| db46fe6c59 | |||
| b31ba08ffa | |||
| 365ecbead3 | |||
| 51bde4b0dc | |||
| 72f8b25b24 | |||
| ce75268a2f | |||
| 2d6e97b5c2 | |||
| f14fa82b5b | |||
| 4fd4f002ee | |||
| 139f1a0ad8 | |||
| fa8fb6fbe1 | |||
| 27d127b9c5 | |||
| 1174a463f3 | |||
| 33d0756aac | |||
| 41d01a8f98 | |||
| 67889ed5be | |||
| 65c1213e00 | |||
| df4907d146 | |||
| 85d91d18b4 | |||
| b0dd37fa73 | |||
| 4f5fba677a | |||
| 95ac714f8f | |||
| 1ea01c9c50 | |||
| 94587407ec | |||
| f3076b17b4 | |||
| b54ac35cb3 | |||
| 8b3a8b9438 | |||
| e3e619e845 | |||
| c345c3a460 | |||
| 81b1e515f4 | |||
| 218d2c0eb3 | |||
| 81fcfc2065 | |||
| 5c18bd041a | |||
| ad1b3e2a11 | |||
| e647d73811 | |||
| 554826ec78 | |||
| d23c5c8c8d | |||
| 9ea5796a63 | |||
| 061fd45c33 | |||
| 178d87e0b6 | |||
| ebdec47991 | |||
| 18c4978bba | |||
| 383b1ae15d | |||
| b53f8c676c | |||
| 6cae543378 | |||
| 53a51dab0a | |||
| cf0374d303 | |||
| 3194244721 | |||
| b1b9ddc302 | |||
| 9e96e0b36f | |||
| 93b0e733cc | |||
| 16227d8ef3 | |||
| 2950f9fb91 | |||
| 872fe961f8 | |||
| d98c246599 | |||
| bc890913fe | |||
| 6739845c85 | |||
| aaa49aa835 | |||
| 8ed8c68dfb | |||
| 6a59a0b349 | |||
| 1cb6ac499a | |||
| 9a5709f474 | |||
| efa18040dc | |||
| f2aa7e7bd9 | |||
| fe404e039c | |||
| 2a8f372e1c | |||
| a9cca2b893 | |||
| ae77a3d6d1 | |||
| 85ac3cdbb0 | |||
| 809233d23f | |||
| 166a09028f | |||
| a34068d126 | |||
| 7d0051154e | |||
| d19d7309e6 | |||
| ecccb0d30c | |||
| 3ece99e9d0 | |||
| 283375144b | |||
| 6d9f6af6ef | |||
| 5056eeab3a | |||
| 99913f0b50 | |||
| 9b9c08cdbb | |||
| 4f3a6d382e | |||
| 47f7b1e386 | |||
| e50f5d51a5 | |||
| 0f8a2d6734 | |||
| c01cbb3e1a | |||
| 44465eddef | |||
| ded031cfc8 | |||
| 9a7adbcd32 | |||
| d3d1f84271 | |||
| 4039f94021 | |||
| 382274be5b | |||
| 9909401af4 | |||
| c3732af3f3 | |||
| 180e818331 | |||
| a94e86d9cc | |||
| 2779372c17 | |||
| 7159a9ab0c | |||
| 953b8cb7c8 | |||
| 8c1d988566 | |||
| f570ad59cf | |||
| 0138da3949 | |||
| e7975d1443 | |||
| 753cde3442 | |||
| 38dbbecc4d | |||
| 9b2faf2056 | |||
| af61aeda9b | |||
| 9abda98e48 | |||
| be0f46f922 | |||
| 75dcdc098e | |||
| 35720ce43b | |||
| 2e97e1fee1 | |||
| 4ead6b97f0 | |||
| 46b091a67e | |||
| b61f86a052 | |||
| 867824322f | |||
| 92f2b31f74 | |||
| 445312d685 | |||
| 59d7b59a0b | |||
| 54df1bdcf7 | |||
| 256cd103ba | |||
| 48d1f7267b | |||
| bf980316b0 | |||
| 88546dad6b | |||
| f32bd23f8f | |||
| e0339be416 | |||
| fefe867a72 | |||
| eb81e0b50a | |||
| a1468ef48b | |||
| 795e302ea4 | |||
| a6d9d5f7e4 | |||
| ff51028d8d | |||
| e43bea4883 | |||
| 3f80f680ad | |||
| 5f100892d0 | |||
| e561b3b818 | |||
| 6837221beb | |||
| 475c4d7ca8 | |||
| 95a2aa2e1c | |||
| a3ac5646e4 | |||
| 91a5c94a00 | |||
| 44019add1f | |||
| e938870101 | |||
| 98eb681cc0 | |||
| d414753678 | |||
| 451d540527 | |||
| aab5ef2cbc | |||
| 378b622a09 | |||
| 888adbee07 | |||
| 6e56027b5b | |||
| bc1ded6ef4 | |||
| ff0cc2dc3c | |||
| ec0a000564 | |||
| e596ea8ca5 | |||
| 10c227830e | |||
| 1b46b00f98 | |||
| 1f7044c5b9 | |||
| dfaf8c5ad8 | |||
| 61b4aaab0a | |||
| 9b59cfbb52 | |||
| 01d1a3300b | |||
| aa86e76af8 | |||
| de14b56501 | |||
| ef19640b64 | |||
| b2095de913 | |||
| bc4ad1c39e | |||
| d59e64b4f1 | |||
| 5e01d61014 | |||
| b2c13a1120 | |||
| a39a67a436 | |||
| 27cc73e9e2 | |||
| 278ff79d84 | |||
| a8afcb2e4a | |||
| 64224cb840 | |||
| b5f8d6b1a1 | |||
| 4709d5dfcb | |||
| 9f724212ee | |||
| c8d840561c | |||
| 8f7dc60ad2 | |||
| d0841d8c4a | |||
| 66f2486da2 | |||
| 64aaf5ff59 | |||
| d77bdd910c | |||
| 7cd6eefe28 | |||
| 7eb83278bb | |||
| 616a362577 | |||
| b09ac036dc | |||
| 2e40d98863 | |||
| cbadf3ac6b | |||
| c67965f6d7 | |||
| f61e80bd87 | |||
| c055478914 | |||
| d5ef4a3706 | |||
| bbd073a455 | |||
| 996a5331ab | |||
| 27891b6a0d | |||
| 5c65da3a2e | |||
| bd9348c532 | |||
| 3668f28734 | |||
| a2e4255a34 | |||
| 1912e615f7 | |||
| a1c33bf60f | |||
| c46180ef04 | |||
| 3529bdaa22 | |||
| b40e2262d3 | |||
| e2133abd7b | |||
| 10d22b709c | |||
| 03edf12b9c | |||
| 62a16f7ca0 | |||
| f1fcb8e252 | |||
| f7e12e6d14 | |||
| 922fa7a2f2 | |||
| 7055d71865 | |||
| 2084e35009 | |||
| 069cea91f6 | |||
| 06ecd3de42 | |||
| acb947d98a | |||
| d0f1a93260 | |||
| 2183bea2f8 | |||
| dda9cf907f | |||
| f9b568088e | |||
| 256a84657b | |||
| 4dde5d381e | |||
| bf56548d60 | |||
| 7aee70bd08 | |||
| 67405a0d68 | |||
| b8b55ad3f4 | |||
| bbf6676fb4 | |||
| af22f8a159 | |||
| 5ff9e45817 | |||
| 389ba35049 | |||
| be454c9310 | |||
| 4e285f7f45 | |||
| ea26ec7524 | |||
| c0ed242820 | |||
| 352c88f166 | |||
| 263be92760 | |||
| 8489c94238 | |||
| feed83488b | |||
| bfc7fd680e | |||
| ba84a7e3f4 | |||
| 14f7892048 | |||
| 3648a75ef1 | |||
| 627cfe2398 | |||
| 905626ba79 | |||
| d67e511a9a | |||
| e600e7c368 | |||
| 6967933d4a | |||
| 75a2731b32 | |||
| 73e226c971 | |||
| b53f9ed5f1 | |||
| be7a01b355 | |||
| dbade23e87 | |||
| 2e735a14f9 | |||
| 9ba2218a2a | |||
| dcf6ffd131 | |||
| aa7c4bed07 | |||
| 7d3472a753 |
@@ -0,0 +1,4 @@
|
||||
**/yui/build/** -diff
|
||||
**/amd/build/** -diff
|
||||
theme/bootstrapbase/style/editor.css -diff
|
||||
theme/bootstrapbase/style/moodle.css -diff
|
||||
@@ -1145,6 +1145,11 @@
|
||||
<ON_CHECK message="unsupporteddbtablerowformat" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="libcurlwarning" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
</CUSTOM_CHECKS>
|
||||
</MOODLE>
|
||||
<MOODLE version="2.8" requires="2.2">
|
||||
@@ -1418,6 +1423,11 @@
|
||||
<ON_CHECK message="unsupporteddbtablerowformat" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="libcurlwarning" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
</CUSTOM_CHECKS>
|
||||
</MOODLE>
|
||||
<MOODLE version="3.0" requires="2.2">
|
||||
@@ -1434,6 +1444,7 @@
|
||||
<VENDOR name="oracle" version="10.2" />
|
||||
</DATABASE>
|
||||
<PHP version="5.4.4" level="required">
|
||||
<RESTRICT function="restrict_php_version_71" message="unsupportedphpversion71" />
|
||||
</PHP>
|
||||
<PCREUNICODE level="optional">
|
||||
<FEEDBACK>
|
||||
@@ -1556,6 +1567,11 @@
|
||||
<ON_CHECK message="unsupporteddbtablerowformat" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="libcurlwarning" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
</CUSTOM_CHECKS>
|
||||
</MOODLE>
|
||||
<MOODLE version="3.1" requires="2.7">
|
||||
@@ -1572,6 +1588,7 @@
|
||||
<VENDOR name="oracle" version="10.2" />
|
||||
</DATABASE>
|
||||
<PHP version="5.4.4" level="required">
|
||||
<RESTRICT function="restrict_php_version_71" message="unsupportedphpversion71" />
|
||||
</PHP>
|
||||
<PCREUNICODE level="optional">
|
||||
<FEEDBACK>
|
||||
@@ -1647,6 +1664,8 @@
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="xml" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="xmlreader" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="intl" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="intlrecommended" />
|
||||
@@ -1694,6 +1713,161 @@
|
||||
<ON_CHECK message="unsupporteddbtablerowformat" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="libcurlwarning" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
</CUSTOM_CHECKS>
|
||||
</MOODLE>
|
||||
<MOODLE version="3.2" requires="2.7">
|
||||
<UNICODE level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="unicoderequired" />
|
||||
</FEEDBACK>
|
||||
</UNICODE>
|
||||
<DATABASE level="required">
|
||||
<VENDOR name="mariadb" version="5.5.31" />
|
||||
<VENDOR name="mysql" version="5.5.31" />
|
||||
<VENDOR name="postgres" version="9.1" />
|
||||
<VENDOR name="mssql" version="10.0" />
|
||||
<VENDOR name="oracle" version="10.2" />
|
||||
</DATABASE>
|
||||
<PHP version="5.6.5" level="required">
|
||||
</PHP>
|
||||
<PCREUNICODE level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="pcreunicodewarning" />
|
||||
</FEEDBACK>
|
||||
</PCREUNICODE>
|
||||
<PHP_EXTENSIONS>
|
||||
<PHP_EXTENSION name="iconv" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="iconvrequired" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="mbstring" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="mbstringrecommended" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="curl" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="curlrequired" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="openssl" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="opensslrecommended" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="tokenizer" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="tokenizerrecommended" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="xmlrpc" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="xmlrpcrecommended" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="soap" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="soaprecommended" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="ctype" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="ctyperequired" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="zip" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="ziprequired" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="zlib" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="gd" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="gdrequired" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="simplexml" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="simplexmlrequired" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="spl" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="splrequired" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="pcre" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="dom" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="xml" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="xmlreader" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="intl" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="intlrecommended" />
|
||||
</FEEDBACK>
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="json" level="required">
|
||||
</PHP_EXTENSION>
|
||||
<PHP_EXTENSION name="hash" level="required"/>
|
||||
</PHP_EXTENSIONS>
|
||||
<PHP_SETTINGS>
|
||||
<PHP_SETTING name="memory_limit" value="96M" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="settingmemorylimit" />
|
||||
</FEEDBACK>
|
||||
</PHP_SETTING>
|
||||
<PHP_SETTING name="file_uploads" value="1" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="settingfileuploads" />
|
||||
</FEEDBACK>
|
||||
</PHP_SETTING>
|
||||
<PHP_SETTING name="opcache.enable" value="1" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="opcacherecommended" />
|
||||
</FEEDBACK>
|
||||
</PHP_SETTING>
|
||||
</PHP_SETTINGS>
|
||||
<CUSTOM_CHECKS>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_storage_engine" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="unsupporteddbstorageengine" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="question/engine/upgrade/upgradelib.php" function="quiz_attempts_upgraded" level="required">
|
||||
<FEEDBACK>
|
||||
<ON_ERROR message="quizattemptsupgradedmessage" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_slasharguments" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="slashargumentswarning" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_database_tables_row_format" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="unsupporteddbtablerowformat" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_unoconv_version" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="unoconvwarning" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_libcurl_version" level="optional">
|
||||
<FEEDBACK>
|
||||
<ON_CHECK message="libcurlwarning" />
|
||||
</FEEDBACK>
|
||||
</CUSTOM_CHECK>
|
||||
</CUSTOM_CHECKS>
|
||||
</MOODLE>
|
||||
</COMPATIBILITY_MATRIX>
|
||||
|
||||
+5
-1
@@ -20,7 +20,11 @@ $adminroot = admin_get_root(); // need all settings
|
||||
$settingspage = $adminroot->locate($section, true);
|
||||
|
||||
if (empty($settingspage) or !($settingspage instanceof admin_settingpage)) {
|
||||
print_error('sectionerror', 'admin', "$CFG->wwwroot/$CFG->admin/");
|
||||
if (moodle_needs_upgrading()) {
|
||||
redirect(new moodle_url('/admin/index.php'));
|
||||
} else {
|
||||
print_error('sectionerror', 'admin', "$CFG->wwwroot/$CFG->admin/");
|
||||
}
|
||||
die;
|
||||
}
|
||||
|
||||
|
||||
@@ -18,11 +18,10 @@ $ADMIN->add('server', $temp);
|
||||
|
||||
// "supportcontact" settingpage
|
||||
$temp = new admin_settingpage('supportcontact', new lang_string('supportcontact','admin'));
|
||||
if (isloggedin()) {
|
||||
global $USER;
|
||||
$primaryadminemail = $USER->email;
|
||||
$primaryadminname = fullname($USER, true);
|
||||
|
||||
$primaryadmin = get_admin();
|
||||
if ($primaryadmin) {
|
||||
$primaryadminemail = $primaryadmin->email;
|
||||
$primaryadminname = fullname($primaryadmin, true);
|
||||
} else {
|
||||
// no defaults during installation - admin user must be created first
|
||||
$primaryadminemail = NULL;
|
||||
|
||||
@@ -27,7 +27,6 @@ Feature: An administrator can filter user accounts by role, cohort and other pro
|
||||
And I add "User Three (three@example.com)" user to "CH1" cohort members
|
||||
And I follow "Browse list of users"
|
||||
|
||||
@javascript
|
||||
Scenario: Filter user accounts by role and cohort
|
||||
When I set the following fields to these values:
|
||||
| courserole_rl | Student |
|
||||
@@ -51,7 +50,6 @@ Feature: An administrator can filter user accounts by role, cohort and other pro
|
||||
And I should see "User Three"
|
||||
And I should see "User Four"
|
||||
|
||||
@javascript
|
||||
Scenario: Filter user accounts by confirm and authentication method
|
||||
When I set the following fields to these values:
|
||||
| Confirmed | No |
|
||||
|
||||
@@ -120,8 +120,8 @@ $tags = '';
|
||||
|
||||
if ($options['profile']) {
|
||||
$profile = $options['profile'];
|
||||
if (!isset($CFG->behat_config[$profile])) {
|
||||
echo "Invalid profile passed: " . $profile;
|
||||
if (!isset($CFG->behat_config[$profile]) && !isset($CFG->behat_profiles[$profile])) {
|
||||
echo "Invalid profile passed: " . $profile . PHP_EOL;
|
||||
exit(1);
|
||||
}
|
||||
$extraopts[] = '--profile="' . $profile . '"';
|
||||
@@ -226,22 +226,27 @@ $exitcodes = print_combined_run_output($processes, $stoponfail);
|
||||
$time = round(microtime(true) - $time, 1);
|
||||
echo "Finished in " . gmdate("G\h i\m s\s", $time) . PHP_EOL . PHP_EOL;
|
||||
|
||||
ksort($exitcodes);
|
||||
|
||||
// Print exit info from each run.
|
||||
$status = false;
|
||||
// Status bits contains pass/fail status of parallel runs.
|
||||
$status = 0;
|
||||
$processcounter = 0;
|
||||
foreach ($exitcodes as $exitcode) {
|
||||
$status = (bool)$status || (bool)$exitcode;
|
||||
if ($exitcode) {
|
||||
$status |= (1 << $processcounter);
|
||||
}
|
||||
$processcounter++;
|
||||
}
|
||||
|
||||
// Run finished. Show exit code and output from individual process.
|
||||
$verbose = empty($options['verbose']) ? false : true;
|
||||
$verbose = $verbose || $status;
|
||||
$verbose = $verbose || !empty($status);
|
||||
|
||||
// Show exit code from each process, if any process failed.
|
||||
if ($verbose) {
|
||||
// Echo exit codes.
|
||||
echo "Exit codes for each behat run: " . PHP_EOL;
|
||||
ksort($exitcodes);
|
||||
foreach ($exitcodes as $run => $exitcode) {
|
||||
echo $run . ": " . $exitcode . PHP_EOL;
|
||||
}
|
||||
@@ -263,7 +268,7 @@ print_each_process_info($processes, $verbose);
|
||||
// Remove site symlink if necessary.
|
||||
behat_config_manager::drop_parallel_site_links();
|
||||
|
||||
exit((int) $status);
|
||||
exit($status);
|
||||
|
||||
/**
|
||||
* Signal handler for terminal exit.
|
||||
|
||||
@@ -173,6 +173,7 @@ if ($options['install']) {
|
||||
|
||||
// This is only displayed once for parallel install.
|
||||
if (empty($options['run'])) {
|
||||
|
||||
$runtestscommand = behat_command::get_behat_command(true, !empty($options['run']));
|
||||
|
||||
$runtestscommand .= ' --config ' . behat_config_manager::get_behat_cli_config_filepath();
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Display environment used for running behat.
|
||||
*
|
||||
* This file is used for behat testing to ensure cli and apache
|
||||
* version of environment is same.
|
||||
*
|
||||
* @package tool_behat
|
||||
* @copyright 2016 onwards Rajesh Taneja
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
require_once(__DIR__.'/../../../../../../config.php');
|
||||
|
||||
// Only continue for behat site.
|
||||
defined('BEHAT_SITE_RUNNING') || die();
|
||||
|
||||
require_once($CFG->libdir.'/behat/classes/util.php');
|
||||
echo json_encode(behat_util::get_environment(), true);
|
||||
@@ -52,8 +52,7 @@ class logstore_database_store_testcase extends advanced_testcase {
|
||||
$this->assertCount(0, $stores);
|
||||
|
||||
// Fake the settings, we will abuse the standard plugin table here...
|
||||
$parts = explode('_', get_class($DB));
|
||||
set_config('dbdriver', $parts[1] . '/' . $parts[0], 'logstore_database');
|
||||
set_config('dbdriver', $CFG->dblibrary . '/' . $CFG->dbtype, 'logstore_database');
|
||||
set_config('dbhost', $CFG->dbhost, 'logstore_database');
|
||||
set_config('dbuser', $CFG->dbuser, 'logstore_database');
|
||||
set_config('dbpass', $CFG->dbpass, 'logstore_database');
|
||||
|
||||
@@ -898,7 +898,7 @@ class manager {
|
||||
$userfrom->customheaders[] = 'In-Reply-To: ' . $messageid;
|
||||
|
||||
// The message will be sent from the intended user.
|
||||
$eventdata->userfrom = \core_user::get_noreply_user();
|
||||
$eventdata->userfrom = \core_user::get_support_user();
|
||||
$eventdata->userto = $USER;
|
||||
$eventdata->subject = $this->get_reply_subject($this->currentmessagedata->envelope->subject);
|
||||
$eventdata->fullmessage = get_string('invalidrecipientdescription', 'tool_messageinbound', $this->currentmessagedata);
|
||||
|
||||
@@ -140,6 +140,10 @@ class eventobservers {
|
||||
$subscriptions = subscription_manager::get_subscriptions_by_event($eventobj);
|
||||
$idstosend = array();
|
||||
foreach ($subscriptions as $subscription) {
|
||||
// Only proceed to fire events and notifications if the subscription is active.
|
||||
if (!subscription_manager::subscription_is_active($subscription)) {
|
||||
continue;
|
||||
}
|
||||
$starttime = $now - $subscription->timewindow;
|
||||
$starttime = ($starttime > $subscription->lastnotificationsent) ? $starttime : $subscription->lastnotificationsent;
|
||||
if ($subscription->courseid == 0) {
|
||||
|
||||
@@ -82,15 +82,16 @@ class notification_task extends \core\task\adhoc_task {
|
||||
|
||||
$template = $subscription->template;
|
||||
$template = $this->replace_placeholders($template, $subscription, $eventobj, $context);
|
||||
$htmlmessage = format_text($template, $subscription->templateformat, array('context' => $context));
|
||||
$msgdata = new \stdClass();
|
||||
$msgdata->component = 'tool_monitor'; // Your component name.
|
||||
$msgdata->name = 'notification'; // This is the message name from messages.php.
|
||||
$msgdata->userfrom = \core_user::get_noreply_user();
|
||||
$msgdata->userto = $user;
|
||||
$msgdata->subject = $subscription->get_name($context);
|
||||
$msgdata->fullmessage = format_text($template, $subscription->templateformat, array('context' => $context));
|
||||
$msgdata->fullmessageformat = $subscription->templateformat;
|
||||
$msgdata->fullmessagehtml = format_text($template, $subscription->templateformat, array('context' => $context));
|
||||
$msgdata->fullmessage = html_to_text($htmlmessage);
|
||||
$msgdata->fullmessageformat = FORMAT_PLAIN;
|
||||
$msgdata->fullmessagehtml = $htmlmessage;
|
||||
$msgdata->smallmessage = '';
|
||||
$msgdata->notification = 1; // This is only set to 0 for personal messages between users.
|
||||
|
||||
|
||||
@@ -55,17 +55,26 @@ class subscription {
|
||||
* Magic get method.
|
||||
*
|
||||
* @param string $prop property to get.
|
||||
*
|
||||
* @return mixed
|
||||
* @throws \coding_exception
|
||||
*/
|
||||
public function __get($prop) {
|
||||
if (property_exists($this->subscription, $prop)) {
|
||||
if (isset($this->subscription->$prop)) {
|
||||
return $this->subscription->$prop;
|
||||
}
|
||||
throw new \coding_exception('Property "' . $prop . '" doesn\'t exist');
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic isset method.
|
||||
*
|
||||
* @param string $prop the property to get.
|
||||
* @return bool true if the property is set, false otherwise.
|
||||
*/
|
||||
public function __isset($prop) {
|
||||
return property_exists($this->subscription, $prop);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a human readable name for instances associated with this subscription.
|
||||
*
|
||||
|
||||
@@ -35,6 +35,10 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class subscription_manager {
|
||||
|
||||
/** @const Period of time, in days, after which an inactive subscription will be removed completely.*/
|
||||
const INACTIVE_SUBSCRIPTION_LIFESPAN_IN_DAYS = 30;
|
||||
|
||||
/**
|
||||
* Subscribe a user to a given rule.
|
||||
*
|
||||
@@ -456,4 +460,78 @@ class subscription_manager {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Activates a group of subscriptions based on an input array of ids.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param array $ids of subscription ids.
|
||||
* @return bool true if the operation was successful, false otherwise.
|
||||
*/
|
||||
public static function activate_subscriptions(array $ids) {
|
||||
global $DB;
|
||||
if (!empty($ids)) {
|
||||
list($sql, $params) = $DB->get_in_or_equal($ids);
|
||||
$success = $DB->set_field_select('tool_monitor_subscriptions', 'inactivedate', '0', 'id ' . $sql, $params);
|
||||
return $success;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deactivates a group of subscriptions based on an input array of ids.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param array $ids of subscription ids.
|
||||
* @return bool true if the operation was successful, false otherwise.
|
||||
*/
|
||||
public static function deactivate_subscriptions(array $ids) {
|
||||
global $DB;
|
||||
if (!empty($ids)) {
|
||||
$inactivedate = time();
|
||||
list($sql, $params) = $DB->get_in_or_equal($ids);
|
||||
$success = $DB->set_field_select('tool_monitor_subscriptions', 'inactivedate', $inactivedate, 'id ' . $sql,
|
||||
$params);
|
||||
return $success;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes subscriptions which have been inactive for a period of time.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param int $userid if provided, only this user's stale subscriptions will be deleted.
|
||||
* @return bool true if the operation was successful, false otherwise.
|
||||
*/
|
||||
public static function delete_stale_subscriptions($userid = 0) {
|
||||
global $DB;
|
||||
// Get the expiry duration, in days.
|
||||
$cutofftime = strtotime("-" . self::INACTIVE_SUBSCRIPTION_LIFESPAN_IN_DAYS . " days", time());
|
||||
|
||||
if (!empty($userid)) {
|
||||
// Remove any stale subscriptions for the desired user only.
|
||||
$success = $DB->delete_records_select('tool_monitor_subscriptions',
|
||||
'userid = ? AND inactivedate < ? AND inactivedate <> 0',
|
||||
array($userid, $cutofftime));
|
||||
|
||||
} else {
|
||||
// Remove all stale subscriptions.
|
||||
$success = $DB->delete_records_select('tool_monitor_subscriptions',
|
||||
'inactivedate < ? AND inactivedate <> 0',
|
||||
array($cutofftime));
|
||||
}
|
||||
return $success;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a subscription is active.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param \tool_monitor\subscription $subscription instance.
|
||||
* @return bool true if the subscription is active, false otherwise.
|
||||
*/
|
||||
public static function subscription_is_active(subscription $subscription) {
|
||||
return empty($subscription->inactivedate);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,274 @@
|
||||
<?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/>.
|
||||
namespace tool_monitor\task;
|
||||
use tool_monitor\subscription;
|
||||
use tool_monitor\subscription_manager;
|
||||
|
||||
/**
|
||||
* Simple task class responsible for activating, deactivating and removing subscriptions.
|
||||
*
|
||||
* Activation/deactivation is managed by looking at the same access rules used to determine whether a user can
|
||||
* subscribe to the rule in the first place.
|
||||
*
|
||||
* Removal occurs when a subscription has been inactive for a period of time exceeding the lifespan, as set by
|
||||
* subscription_manager::get_inactive_subscription_lifespan().
|
||||
*
|
||||
* I.e.
|
||||
* - Activation: If a user can subscribe currently, then an existing subscription should be made active.
|
||||
* - Deactivation: If a user cannot subscribe currently, then an existing subscription should be made inactive.
|
||||
* - Removal: If a user has a subscription that has been inactive for longer than the prescribed period, then
|
||||
* delete the subscription entirely.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @package tool_monitor
|
||||
* @copyright 2016 Jake Dallimore <jrhdallimore@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class check_subscriptions extends \core\task\scheduled_task {
|
||||
|
||||
/** @var array 1d static cache, indexed by userid, storing whether or not the user has been fully set up.*/
|
||||
protected $userssetupcache = array();
|
||||
|
||||
/** @var array 2d static cache, indexed by courseid and userid, storing whether a user can access the course with
|
||||
* the 'tool/monitor:subscribe' capability.
|
||||
*/
|
||||
protected $courseaccesscache = array();
|
||||
|
||||
/**
|
||||
* Get a descriptive name for this task.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @return string name of the task.
|
||||
*/
|
||||
public function get_name() {
|
||||
return get_string('taskchecksubscriptions', 'tool_monitor');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks all course-level rule subscriptions and activates/deactivates based on current course access.
|
||||
*
|
||||
* The ordering of checks within the task is important for optimisation purposes. The aim is to be able to make a decision
|
||||
* about whether to activate/deactivate each subscription without making unnecessary checks. The ordering roughly follows the
|
||||
* context model, starting with system and user checks and moving down to course and course-module only when necessary.
|
||||
*
|
||||
* For example, if the user is suspended, then any active subscription is made inactive right away. I.e. there is no need to
|
||||
* check site-level, course-level or course-module-level permissions. Likewise, if a subscriptions is site-level, there is no
|
||||
* need to check course-level and course-module-level permissions.
|
||||
*
|
||||
* The task performs the following checks, in this order:
|
||||
* 1. Check for a suspended user, breaking if suspended.
|
||||
* 2. Check for an incomplete (not set up) user, breaking if not fully set up.
|
||||
* 3. Check for the required capability in the relevant context, breaking if the capability is not found.
|
||||
* 4. Check whether the subscription is site-context, breaking if true.
|
||||
* 5. Check whether the user has course access, breaking only if the subscription is not also course-module-level.
|
||||
* 6. Check whether the user has course-module access.
|
||||
*
|
||||
* @since 2.9.7
|
||||
*/
|
||||
public function execute() {
|
||||
global $DB;
|
||||
|
||||
if (!get_config('tool_monitor', 'enablemonitor')) {
|
||||
return; // The tool is disabled. Nothing to do.
|
||||
}
|
||||
|
||||
$toactivate = array(); // Store the ids of subscriptions to be activated upon completion.
|
||||
$todeactivate = array(); // Store the ids of subscriptions to be deactivated upon completion.
|
||||
|
||||
// Resultset rows are ordered by userid and courseid to work nicely with get_fast_modinfo() caching.
|
||||
$sql = "SELECT u.id AS userid, u.firstname AS userfirstname, u.lastname AS userlastname, u.suspended AS usersuspended,
|
||||
u.email AS useremail, c.visible as coursevisible, c.cacherev as coursecacherev, s.courseid AS subcourseid,
|
||||
s.userid AS subuserid, s.cmid AS subcmid, s.inactivedate AS subinactivedate, s.id AS subid
|
||||
FROM {user} u
|
||||
JOIN {tool_monitor_subscriptions} s ON (s.userid = u.id)
|
||||
LEFT JOIN {course} c ON (c.id = s.courseid)
|
||||
WHERE u.id = s.userid
|
||||
ORDER BY s.userid, s.courseid";
|
||||
$rs = $DB->get_recordset_sql($sql);
|
||||
|
||||
foreach ($rs as $row) {
|
||||
// Create skeleton records from the result. This should be enough to use in subsequent access calls and avoids DB hits.
|
||||
$sub = $this->get_subscription_from_rowdata($row);
|
||||
$sub = new subscription($sub);
|
||||
if (!isset($user) || $user->id != $sub->userid) {
|
||||
$user= $this->get_user_from_rowdata($row);
|
||||
}
|
||||
if ((!isset($course) || $course->id != $sub->courseid) && !empty($sub->courseid)) {
|
||||
$course = $this->get_course_from_rowdata($row);
|
||||
}
|
||||
|
||||
// The user is suspended at site level, so deactivate any active subscriptions.
|
||||
if ($user->suspended) {
|
||||
if (subscription_manager::subscription_is_active($sub)) {
|
||||
$todeactivate[] = $sub->id;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Is the user fully set up? As per require_login on the subscriptions page.
|
||||
if (!$this->is_user_setup($user)) {
|
||||
if (subscription_manager::subscription_is_active($sub)) {
|
||||
$todeactivate[] = $sub->id;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Determine the context, based on the subscription course id.
|
||||
$sitelevelsubscription = false;
|
||||
if (empty($sub->courseid)) {
|
||||
$context = \context_system::instance();
|
||||
$sitelevelsubscription = true;
|
||||
} else {
|
||||
$context = \context_course::instance($sub->courseid);
|
||||
}
|
||||
|
||||
// Check capability in the context.
|
||||
if (!has_capability('tool/monitor:subscribe', $context, $user)) {
|
||||
if (subscription_manager::subscription_is_active($sub)) {
|
||||
$todeactivate[] = $sub->id;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the subscription is site-level, then we've run all the checks required to make an access decision.
|
||||
if ($sitelevelsubscription) {
|
||||
if (!subscription_manager::subscription_is_active($sub)) {
|
||||
$toactivate[] = $sub->id;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check course access.
|
||||
if (!$this->user_can_access_course($user, $course, 'tool/monitor:subscribe')) {
|
||||
if (subscription_manager::subscription_is_active($sub)) {
|
||||
$todeactivate[] = $sub->id;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the subscription has no course module relationship.
|
||||
if (empty($sub->cmid)) {
|
||||
if (!subscription_manager::subscription_is_active($sub)) {
|
||||
$toactivate[] = $sub->id;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Otherwise, check the course module info. We use the same checks as on the subscription page.
|
||||
$modinfo = get_fast_modinfo($course, $sub->userid);
|
||||
$cm = $modinfo->get_cm($sub->cmid);
|
||||
if (!$cm || !$cm->uservisible || !$cm->available) {
|
||||
if (subscription_manager::subscription_is_active($sub)) {
|
||||
$todeactivate[] = $sub->id;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// The course module is available and visible, so make a decision.
|
||||
if (!subscription_manager::subscription_is_active($sub)) {
|
||||
$toactivate[] = $sub->id;
|
||||
}
|
||||
}
|
||||
$rs->close();
|
||||
|
||||
// Activate/deactivate/delete relevant subscriptions.
|
||||
subscription_manager::activate_subscriptions($toactivate);
|
||||
subscription_manager::deactivate_subscriptions($todeactivate);
|
||||
subscription_manager::delete_stale_subscriptions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether a user is fully set up, using cached results where possible.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param \stdClass $user the user record.
|
||||
* @return bool true if the user is fully set up, false otherwise.
|
||||
*/
|
||||
protected function is_user_setup($user) {
|
||||
if (!isset($this->userssetupcache[$user->id])) {
|
||||
$this->userssetupcache[$user->id] = !user_not_fully_set_up($user);
|
||||
}
|
||||
return $this->userssetupcache[$user->id];
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines a user's access to a course with a given capability, using cached results where possible.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param \stdClass $user the user record.
|
||||
* @param \stdClass $course the course record.
|
||||
* @param string $capability the capability to check.
|
||||
* @return bool true if the user can access the course with the specified capability, false otherwise.
|
||||
*/
|
||||
protected function user_can_access_course($user, $course, $capability) {
|
||||
if (!isset($this->courseaccesscache[$course->id][$user->id][$capability])) {
|
||||
$this->courseaccesscache[$course->id][$user->id][$capability] = can_access_course($course, $user, $capability, true);
|
||||
}
|
||||
return $this->courseaccesscache[$course->id][$user->id][$capability];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a partial subscription record, created from properties of the supplied recordset row object.
|
||||
* Intended to return a minimal record for specific use within this class and in subsequent access control calls only.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param \stdClass $rowdata the row object.
|
||||
* @return \stdClass a partial subscription record.
|
||||
*/
|
||||
protected function get_subscription_from_rowdata($rowdata) {
|
||||
$sub = new \stdClass();
|
||||
$sub->id = $rowdata->subid;
|
||||
$sub->userid = $rowdata->subuserid;
|
||||
$sub->courseid = $rowdata->subcourseid;
|
||||
$sub->cmid = $rowdata->subcmid;
|
||||
$sub->inactivedate = $rowdata->subinactivedate;
|
||||
return $sub;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a partial course record, created from properties of the supplied recordset row object.
|
||||
* Intended to return a minimal record for specific use within this class and in subsequent access control calls only.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param \stdClass $rowdata the row object.
|
||||
* @return \stdClass a partial course record.
|
||||
*/
|
||||
protected function get_course_from_rowdata($rowdata) {
|
||||
$course = new \stdClass();
|
||||
$course->id = $rowdata->subcourseid;
|
||||
$course->visible = $rowdata->coursevisible;
|
||||
$course->cacherev = $rowdata->coursecacherev;
|
||||
return $course;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a partial user record, created from properties of the supplied recordset row object.
|
||||
* Intended to return a minimal record for specific use within this class and in subsequent access control calls only.
|
||||
*
|
||||
* @since 2.9.7
|
||||
* @param \stdClass $rowdata the row object.
|
||||
* @return \stdClass a partial user record.
|
||||
*/
|
||||
protected function get_user_from_rowdata($rowdata) {
|
||||
$user = new \stdClass();
|
||||
$user->id = $rowdata->userid;
|
||||
$user->firstname = $rowdata->userfirstname;
|
||||
$user->lastname = $rowdata->userlastname;
|
||||
$user->email = $rowdata->useremail;
|
||||
$user->suspended = $rowdata->usersuspended;
|
||||
return $user;
|
||||
}
|
||||
}
|
||||
@@ -38,6 +38,7 @@
|
||||
<FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="User id of the subscriber"/>
|
||||
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Timestamp of when this subscription was created"/>
|
||||
<FIELD NAME="lastnotificationsent" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Timestamp of the time when a notification was last sent for this subscription."/>
|
||||
<FIELD NAME="inactivedate" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
</FIELDS>
|
||||
<KEYS>
|
||||
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
|
||||
|
||||
@@ -32,5 +32,14 @@ $tasks = array(
|
||||
'day' => '*',
|
||||
'dayofweek' => '*',
|
||||
'month' => '*'
|
||||
),
|
||||
array(
|
||||
'classname' => 'tool_monitor\task\check_subscriptions',
|
||||
'blocking' => 0,
|
||||
'minute' => 'R',
|
||||
'hour' => 'R',
|
||||
'day' => '*',
|
||||
'dayofweek' => '*',
|
||||
'month' => '*'
|
||||
)
|
||||
);
|
||||
|
||||
@@ -56,5 +56,20 @@ function xmldb_tool_monitor_upgrade($oldversion) {
|
||||
// Moodle v2.9.0 release upgrade line.
|
||||
// Put any upgrade step following this.
|
||||
|
||||
if ($oldversion < 2015051101) {
|
||||
|
||||
// Define field inactivedate to be added to tool_monitor_subscriptions.
|
||||
$table = new xmldb_table('tool_monitor_subscriptions');
|
||||
$field = new xmldb_field('inactivedate', XMLDB_TYPE_INTEGER, '10', null, true, null, 0, 'lastnotificationsent');
|
||||
|
||||
// Conditionally launch add field inactivedate.
|
||||
if (!$dbman->field_exists($table, $field)) {
|
||||
$dbman->add_field($table, $field);
|
||||
}
|
||||
|
||||
// Monitor savepoint reached.
|
||||
upgrade_plugin_savepoint(true, 2015051101, 'tool', 'monitor');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -99,4 +99,5 @@ $string['subhelp'] = 'Subscription details';
|
||||
$string['subhelp_help'] = 'This subscription listens for when the event \'{$a->eventname}\' has been triggered in \'{$a->moduleinstance}\' {$a->frequency} time(s) in {$a->minutes} minute(s).';
|
||||
$string['subscribeto'] = 'Subscribe to rule "{$a}"';
|
||||
$string['taskcleanevents'] = 'Removes any unnecessary event monitor events';
|
||||
$string['taskchecksubscriptions'] = 'Activate/deactivate invalid rule subscriptions';
|
||||
$string['unsubscribe'] = 'Unsubscribe';
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
@javascript @tool @tool_monitor
|
||||
@tool @tool_monitor
|
||||
Feature: Enable/disable managment of the event monitor
|
||||
In order to manage event monitoring
|
||||
As an admin
|
||||
I need to enable/disable it
|
||||
|
||||
@javascript
|
||||
Scenario: Tool is disabled by default.
|
||||
Given I log in as "admin"
|
||||
When I navigate to "Event monitoring rules" node in "Site administration > Reports"
|
||||
|
||||
@@ -467,7 +467,13 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$rulerecord->eventname = '\mod_book\event\course_module_viewed';
|
||||
$rulerecord->cmid = $book->cmid;
|
||||
$rulerecord->frequency = 1;
|
||||
$rulerecord->template = '{link} {modulelink} {rulename} {description} {eventname}';
|
||||
$rulerecord->template = '## {link} ##
|
||||
|
||||
* {modulelink}
|
||||
* __{rulename}__
|
||||
* {description}
|
||||
* {eventname}';
|
||||
$rulerecord->templateformat = FORMAT_MARKDOWN;
|
||||
|
||||
$rule = $toolgenerator->create_rule($rulerecord);
|
||||
|
||||
@@ -491,13 +497,21 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$msg = array_pop($msgs);
|
||||
|
||||
$modurl = new moodle_url('/mod/book/view.php', array('id' => $book->cmid));
|
||||
$expectedmsg = $event->get_url()->out() . ' ' .
|
||||
$modurl->out() . ' ' .
|
||||
$rule->get_name($context) . ' ' .
|
||||
$rule->get_description($context) . ' ' .
|
||||
$rule->get_event_name();
|
||||
|
||||
$this->assertEquals($expectedmsg, $msg->fullmessage);
|
||||
$this->assertContains('<h2>'.$event->get_url()->out().'</h2>', $msg->fullmessagehtml);
|
||||
$this->assertContains('<li>'.$modurl->out().'</li>', $msg->fullmessagehtml);
|
||||
$this->assertContains('<li><strong>'.$rule->get_name($context).'</strong></li>', $msg->fullmessagehtml);
|
||||
$this->assertContains('<li>'.$rule->get_description($context).'</li>', $msg->fullmessagehtml);
|
||||
$this->assertContains('<li>'.$rule->get_event_name().'</li>', $msg->fullmessagehtml);
|
||||
|
||||
$this->assertEquals(FORMAT_PLAIN, $msg->fullmessageformat);
|
||||
$this->assertNotContains('<h2>', $msg->fullmessage);
|
||||
$this->assertNotContains('##', $msg->fullmessage);
|
||||
$this->assertContains(strtoupper($event->get_url()->out()), $msg->fullmessage);
|
||||
$this->assertContains('* '.$modurl->out(), $msg->fullmessage);
|
||||
$this->assertContains('* '.strtoupper($rule->get_name($context)), $msg->fullmessage);
|
||||
$this->assertContains('* '.$rule->get_description($context), $msg->fullmessage);
|
||||
$this->assertContains('* '.$rule->get_event_name(), $msg->fullmessage);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
<?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/>.
|
||||
defined('MOODLE_INTERNAL') || exit();
|
||||
|
||||
/**
|
||||
* Unit tests for the subscription class.
|
||||
* @since 2.9.7
|
||||
*
|
||||
* @package tool_monitor
|
||||
* @category test
|
||||
* @copyright 2016 Jake Dallimore <jrhdallimore@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_monitor_subscription_testcase extends advanced_testcase {
|
||||
|
||||
/**
|
||||
* @var \tool_monitor\subscription $subscription object.
|
||||
*/
|
||||
private $subscription;
|
||||
|
||||
/**
|
||||
* Test set up.
|
||||
*/
|
||||
public function setUp() {
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
// Create the mock subscription.
|
||||
$sub = new stdClass();
|
||||
$sub->id = 100;
|
||||
$sub->name = 'My test rule';
|
||||
$sub->courseid = 20;
|
||||
$this->subscription = $this->getMock('\tool_monitor\subscription',null, array($sub));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for the magic __isset method.
|
||||
*/
|
||||
public function test_magic_isset() {
|
||||
$this->assertEquals(true, isset($this->subscription->name));
|
||||
$this->assertEquals(true, isset($this->subscription->courseid));
|
||||
$this->assertEquals(false, isset($this->subscription->ruleid));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for the magic __get method.
|
||||
*/
|
||||
public function test_magic_get() {
|
||||
$this->assertEquals(20, $this->subscription->courseid);
|
||||
$this->setExpectedException('coding_exception');
|
||||
$this->subscription->ruleid;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,364 @@
|
||||
<?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/>.
|
||||
defined('MOODLE_INTERNAL') || exit();
|
||||
|
||||
/**
|
||||
* Unit tests for the tool_monitor clean events task.
|
||||
* @since 2.9.7
|
||||
*
|
||||
* @package tool_monitor
|
||||
* @category test
|
||||
* @copyright 2016 Jake Dallimore <jrhdallimore@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_monitor_task_check_subscriptions_testcase extends advanced_testcase {
|
||||
|
||||
private $course;
|
||||
private $user;
|
||||
private $rule;
|
||||
private $subscription;
|
||||
private $teacherrole;
|
||||
private $studentrole;
|
||||
|
||||
/**
|
||||
* Test set up.
|
||||
*/
|
||||
public function setUp() {
|
||||
global $DB;
|
||||
set_config('enablemonitor', 1, 'tool_monitor');
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
// All tests defined herein need a user, course, rule and subscription, so set these up.
|
||||
$this->user = $this->getDataGenerator()->create_user();
|
||||
$this->course = $this->getDataGenerator()->create_course();
|
||||
|
||||
$rule = new stdClass();
|
||||
$rule->userid = 2; // Rule created by admin.
|
||||
$rule->courseid = $this->course->id;
|
||||
$rule->plugin = 'mod_book';
|
||||
$rule->eventname = '\mod_book\event\course_module_viewed';
|
||||
$rule->timewindow = 500;
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
$this->rule = $monitorgenerator->create_rule($rule);
|
||||
|
||||
$sub = new stdClass();
|
||||
$sub->courseid = $this->course->id;
|
||||
$sub->userid = $this->user->id;
|
||||
$sub->ruleid = $this->rule->id;
|
||||
$this->subscription = $monitorgenerator->create_subscription($sub);
|
||||
|
||||
// Also set up a student and a teacher role for use in some tests.
|
||||
$this->teacherrole = $DB->get_record('role', array('shortname' => 'teacher'));
|
||||
$this->studentrole = $DB->get_record('role', array('shortname' => 'student'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Reloads the subscription object from the DB.
|
||||
*
|
||||
* @return void.
|
||||
*/
|
||||
private function reload_subscription() {
|
||||
global $DB;
|
||||
$sub = $DB->get_record('tool_monitor_subscriptions', array('id' => $this->subscription->id));
|
||||
$this->subscription = new \tool_monitor\subscription($sub);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm the task is named correctly.
|
||||
*/
|
||||
public function test_task_name() {
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$this->assertEquals(get_string('taskchecksubscriptions', 'tool_monitor'), $task->get_name());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that site level subscriptions are activated and deactivated according to system capabilities.
|
||||
*/
|
||||
public function test_site_level_subscription() {
|
||||
// Create a site level subscription.
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
$sub = new stdClass();
|
||||
$sub->userid = $this->user->id;
|
||||
$sub->ruleid = $this->rule->id;
|
||||
$this->subscription = $monitorgenerator->create_subscription($sub);
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should be inactive as the user doesn't have the capability. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Now, assign the user as a teacher role at system context.
|
||||
$this->getDataGenerator()->role_assign($this->teacherrole->id, $this->user->id, context_system::instance());
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should be active now. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that if the module is disabled, no changes are made to active subscriptions.
|
||||
*/
|
||||
public function test_module_disabled() {
|
||||
set_config('enablemonitor', 0, 'tool_monitor');
|
||||
|
||||
// Subscription should be active to start with.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Run the task. Note, we never enrolled the user.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should still be active. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm an active, valid subscription stays active once the scheduled task is run.
|
||||
*/
|
||||
public function test_active_unaffected() {
|
||||
// Enrol the user as a teacher. This role should have the required capability.
|
||||
$this->getDataGenerator()->enrol_user($this->user->id, $this->course->id, $this->teacherrole->id);
|
||||
|
||||
// Subscription should be active to start with.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should still be active. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that a subscription for a user without an enrolment to the course is made inactive.
|
||||
*/
|
||||
public function test_course_enrolment() {
|
||||
// Subscription should be active until deactivated by the scheduled task. Remember, by default the test setup
|
||||
// doesn't enrol the user, so the first run of the task should deactivate it.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should NOT be active. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Enrol the user.
|
||||
$this->getDataGenerator()->enrol_user($this->user->id, $this->course->id, $this->teacherrole->id);
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// Subscription should now be active again.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that subscriptions for enrolled users without the required capability are made inactive.
|
||||
*/
|
||||
public function test_enrolled_user_with_no_capability() {
|
||||
// Enrol the user. By default, students won't have the required capability.
|
||||
$this->getDataGenerator()->enrol_user($this->user->id, $this->course->id, $this->studentrole->id);
|
||||
|
||||
// The subscription should be active to start with. Pass in the id only to refetch the data.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should NOT be active. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that subscriptions for users who fail can_access_course(), are deactivated.
|
||||
*/
|
||||
public function test_can_access_course() {
|
||||
// Enrol the user as a teacher. This role should have the required capability.
|
||||
$this->getDataGenerator()->enrol_user($this->user->id, $this->course->id, $this->teacherrole->id);
|
||||
|
||||
// Strip the ability to see hidden courses, so we'll fail the check_subscriptions->user_can_access_course call.
|
||||
$context = \context_course::instance($this->course->id);
|
||||
assign_capability('moodle/course:viewhiddencourses', CAP_PROHIBIT, $this->teacherrole->id, $context);
|
||||
|
||||
// Subscription should be active to start with.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Hide the course.
|
||||
course_change_visibility($this->course->id, false);
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should be inactive. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that subscriptions for enrolled users who don't have CM access, are deactivated.
|
||||
*/
|
||||
public function test_cm_access() {
|
||||
// Enrol the user as a student but grant to ability to subscribe. Students cannot view hidden activities.
|
||||
$context = \context_course::instance($this->course->id);
|
||||
assign_capability('tool/monitor:subscribe', CAP_ALLOW, $this->studentrole->id, $context);
|
||||
$this->getDataGenerator()->enrol_user($this->user->id, $this->course->id, $this->studentrole->id);
|
||||
|
||||
// Generate a course module.
|
||||
$book = $this->getDataGenerator()->create_module('book', array('course' => $this->course->id));
|
||||
|
||||
// And add a subscription to it.
|
||||
$sub = new stdClass();
|
||||
$sub->courseid = $this->course->id;
|
||||
$sub->userid = $this->user->id;
|
||||
$sub->ruleid = $this->rule->id;
|
||||
$sub->cmid = $book->cmid;
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
$this->subscription = $monitorgenerator->create_subscription($sub);
|
||||
|
||||
// The subscription should be active to start with. Pass in the id only to refetch the data.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should still be active. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Make the course module invisible, which should in turn make the subscription inactive.
|
||||
set_coursemodule_visible($book->cmid, false);
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should NOT be active. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Make the course module visible again.
|
||||
set_coursemodule_visible($book->cmid, true);
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should be active. Pass in the id only to refetch the data.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that long term inactive subscriptions are removed entirely.
|
||||
*/
|
||||
public function test_stale_subscription_removal() {
|
||||
global $DB;
|
||||
// Manually set the inactivedate to 1 day older than the limit allowed.
|
||||
$daysold = 1 + \tool_monitor\subscription_manager::INACTIVE_SUBSCRIPTION_LIFESPAN_IN_DAYS;
|
||||
|
||||
$inactivedate = strtotime("-$daysold days", time());
|
||||
$DB->set_field('tool_monitor_subscriptions', 'inactivedate', $inactivedate, array('id' => $this->subscription->id));
|
||||
|
||||
// Subscription should be inactive to start with.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// Subscription should now not exist at all.
|
||||
$this->assertEquals(false, $DB->record_exists('tool_monitor_subscriptions', array('id' => $this->subscription->id)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that subscriptions for a partially set up user are deactivated.
|
||||
*/
|
||||
public function test_user_not_fully_set_up() {
|
||||
global $DB;
|
||||
|
||||
// Enrol the user as a teacher.
|
||||
$this->getDataGenerator()->enrol_user($this->user->id, $this->course->id, $this->teacherrole->id);
|
||||
|
||||
// The subscription should be active to start.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Unset the user's email address, so we fail the check_subscriptions->is_user_setup() call.
|
||||
$DB->set_field('user', 'email', '', array('id' => $this->user->id));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should now be inactive.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to confirm that a suspended user's subscriptions are deactivated properly.
|
||||
*/
|
||||
public function test_suspended_user() {
|
||||
global $DB;
|
||||
|
||||
// Enrol the user as a teacher. This role should have the required capability.
|
||||
$this->getDataGenerator()->enrol_user($this->user->id, $this->course->id, $this->teacherrole->id);
|
||||
|
||||
// Subscription should be active to start with.
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Suspend the user.
|
||||
$DB->set_field('user', 'suspended', '1', array('id' => $this->user->id));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should now be inactive.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Unsuspend the user.
|
||||
$DB->set_field('user', 'suspended', '0', array('id' => $this->user->id));
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
$task->execute();
|
||||
|
||||
// The subscription should now be active again.
|
||||
$this->reload_subscription();
|
||||
$this->assertEquals(true, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,6 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die;
|
||||
|
||||
$plugin->version = 2015051100; // The current plugin version (Date: YYYYMMDDXX).
|
||||
$plugin->version = 2015051101; // The current plugin version (Date: YYYYMMDDXX).
|
||||
$plugin->requires = 2015050500; // Requires this Moodle version.
|
||||
$plugin->component = 'tool_monitor'; // Full name of the plugin (used for diagnostics).
|
||||
|
||||
@@ -567,8 +567,18 @@ if ($formdata = $mform2->is_cancelled()) {
|
||||
}
|
||||
if ($existinguser->$column !== $user->$column) {
|
||||
if ($column === 'email') {
|
||||
if ($DB->record_exists('user', array('email'=>$user->email))) {
|
||||
if ($noemailduplicates) {
|
||||
$select = $DB->sql_like('email', ':email', false, true, false, '|');
|
||||
$params = array('email' => $DB->sql_like_escape($user->email, '|'));
|
||||
if ($DB->record_exists_select('user', $select , $params)) {
|
||||
|
||||
$changeincase = core_text::strtolower($existinguser->$column) === core_text::strtolower(
|
||||
$user->$column);
|
||||
|
||||
if ($changeincase) {
|
||||
// If only case is different then switch to lower case and carry on.
|
||||
$user->$column = core_text::strtolower($user->$column);
|
||||
continue;
|
||||
} else if ($noemailduplicates) {
|
||||
$upt->track('email', $stremailduplicate, 'error');
|
||||
$upt->track('status', $strusernotupdated, 'error');
|
||||
$userserrors++;
|
||||
@@ -1177,7 +1187,10 @@ while ($linenum <= $previewrows and $fields = $cir->next()) {
|
||||
if (!validate_email($rowcols['email'])) {
|
||||
$rowcols['status'][] = get_string('invalidemail');
|
||||
}
|
||||
if ($DB->record_exists('user', array('email'=>$rowcols['email']))) {
|
||||
|
||||
$select = $DB->sql_like('email', ':email', false, true, false, '|');
|
||||
$params = array('email' => $DB->sql_like_escape($rowcols['email'], '|'));
|
||||
if ($DB->record_exists_select('user', $select , $params)) {
|
||||
$rowcols['status'][] = $stremailduplicate;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ $string['auth_dbname'] = 'Name of the database itself. Leave empty if using an O
|
||||
$string['auth_dbname_key'] = 'DB name';
|
||||
$string['auth_dbpass'] = 'Password matching the above username';
|
||||
$string['auth_dbpass_key'] = 'Password';
|
||||
$string['auth_dbpasstype'] = '<p>Specify the format that the password field is using. MD5 hashing is useful for connecting to other common web applications like PostNuke.</p> <p>Use \'internal\' if you want to the external DB to manage usernames & email addresses, but Moodle to manage passwords. If you use \'internal\', you <i>must</i> provide a populated email address field in the external DB, and you must execute both admin/cron.php and auth/db/cli/sync_users.php regularly. Moodle will send an email to new users with a temporary password.</p>';
|
||||
$string['auth_dbpasstype'] = '<p>Specify the format that the password field is using. MD5 hashing is useful for connecting to other common web applications like PostNuke.</p> <p>Use \'internal\' if you want the external database to manage usernames and email addresses, but Moodle to manage passwords. If you use \'internal\', you <i>must</i> provide a populated email address field in the external database, and you must execute both admin/cron.php and auth/db/cli/sync_users.php regularly. Moodle will send an email to new users with a temporary password.</p>';
|
||||
$string['auth_dbpasstype_key'] = 'Password format';
|
||||
$string['auth_dbreviveduser'] = 'Revived user {$a->name} id {$a->id}';
|
||||
$string['auth_dbrevivedusererror'] = 'Error reviving user {$a}';
|
||||
|
||||
@@ -438,7 +438,7 @@ class auth_db_testcase extends advanced_testcase {
|
||||
$user3->username = 'john%#&~%*_doe';
|
||||
$user3->email = ' john@testing.com ';
|
||||
$user3->deleted = 'no';
|
||||
$user3->description = '<b>A description <script>alert(123)</script>about myself.</b>';
|
||||
$user3->description = '<b>A description about myself.</b>';
|
||||
$user3cleaned = $auth->clean_data($user3);
|
||||
|
||||
// Expected results.
|
||||
|
||||
@@ -56,7 +56,7 @@ $string['auth_ldap_gracelogins_desc'] = 'Enable LDAP gracelogin support. After p
|
||||
$string['auth_ldap_gracelogins_key'] = 'Grace logins';
|
||||
$string['auth_ldap_groupecreators'] = 'List of groups or contexts whose members are allowed to create groups. Separate multiple groups with \';\'. Usually something like \'cn=teachers,ou=staff,o=myorg\'';
|
||||
$string['auth_ldap_groupecreators_key'] = 'Group creators';
|
||||
$string['auth_ldap_host_url'] = 'Specify LDAP host in URL-form like \'ldap://ldap.myorg.com/\' or \'ldaps://ldap.myorg.com/\' Separate multipleservers with \';\' to get failover support.';
|
||||
$string['auth_ldap_host_url'] = 'Specify LDAP host in URL-form like \'ldap://ldap.myorg.com/\' or \'ldaps://ldap.myorg.com/\'. Separate multiple servers with \';\' to get failover support.';
|
||||
$string['auth_ldap_host_url_key'] = 'Host URL';
|
||||
$string['auth_ldap_changepasswordurl_key'] = 'Password-change URL';
|
||||
$string['auth_ldap_ldap_encoding'] = 'Specify encoding used by LDAP server. Most probably utf-8, MS AD v2 uses default platform encoding such as cp1252, cp1250, etc.';
|
||||
|
||||
@@ -23,6 +23,7 @@ if (!is_enabled_auth('shibboleth')) {
|
||||
}
|
||||
|
||||
// Front channel logout.
|
||||
$inputstream = file_get_contents("php://input");
|
||||
if ($action == 'logout' && !empty($redirect)) {
|
||||
|
||||
if ($USER->auth == 'shibboleth') {
|
||||
@@ -32,7 +33,7 @@ if ($action == 'logout' && !empty($redirect)) {
|
||||
redirect($redirect);
|
||||
}
|
||||
|
||||
} else if (!empty($HTTP_RAW_POST_DATA)) {
|
||||
} else if (!empty($inputstream)) {
|
||||
|
||||
// Back channel logout.
|
||||
// Set SOAP header.
|
||||
|
||||
@@ -47,34 +47,15 @@ class behat_auth extends behat_base {
|
||||
* @Given /^I log in as "(?P<username_string>(?:[^"]|\\")*)"$/
|
||||
*/
|
||||
public function i_log_in_as($username) {
|
||||
// Visit login page.
|
||||
$this->getSession()->visit($this->locate_path('login/index.php'));
|
||||
|
||||
// Running this step using the API rather than a chained step because
|
||||
// we need to see if the 'Log in' link is available or we need to click
|
||||
// the dropdown to expand the navigation bar before.
|
||||
$this->getSession()->visit($this->locate_path('/'));
|
||||
// Enter username and password.
|
||||
$this->execute('behat_forms::i_set_the_field_to', array('Username', $this->escape($username)));
|
||||
$this->execute('behat_forms::i_set_the_field_to', array('Password', $this->escape($username)));
|
||||
|
||||
// Generic steps (we will prefix them later expanding the navigation dropdown if necessary).
|
||||
$steps = array(
|
||||
new Given('I click on "' . get_string('login') . '" "link" in the ".logininfo" "css_element"'),
|
||||
new Given('I set the field "' . get_string('username') . '" to "' . $this->escape($username) . '"'),
|
||||
new Given('I set the field "' . get_string('password') . '" to "'. $this->escape($username) . '"'),
|
||||
new Given('I press "' . get_string('login') . '"')
|
||||
);
|
||||
|
||||
// If Javascript is disabled we have enough with these steps.
|
||||
if (!$this->running_javascript()) {
|
||||
return $steps;
|
||||
}
|
||||
|
||||
// Wait for the homepage to be ready.
|
||||
$this->getSession()->wait(self::TIMEOUT * 1000, self::PAGE_READY_JS);
|
||||
|
||||
// If it is needed, it expands the navigation bar with the 'Log in' link.
|
||||
if ($clicknavbar = $this->get_expand_navbar_step()) {
|
||||
array_unshift($steps, $clicknavbar);
|
||||
}
|
||||
|
||||
return $steps;
|
||||
// Press log in button, no need to check for exceptions as it will checked after this step execution.
|
||||
$this->execute('behat_forms::press_button', get_string('login'));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -83,53 +64,16 @@ class behat_auth extends behat_base {
|
||||
* @Given /^I log out$/
|
||||
*/
|
||||
public function i_log_out() {
|
||||
|
||||
$steps = array(new When('I follow "' . get_string('logout') . '"'));
|
||||
|
||||
// No need to check anything else if we run without JS.
|
||||
if (!$this->running_javascript()) {
|
||||
return $steps;
|
||||
}
|
||||
|
||||
// There is no longer any need to worry about whether the navigation
|
||||
// bar needs to be expanded; user_menu now lives outside the
|
||||
// hamburger.
|
||||
|
||||
// However, the user menu *always* needs to be expanded.
|
||||
$xpath = "//div[@class='usermenu']//a[contains(concat(' ', @class, ' '), ' toggle-display ')]";
|
||||
array_unshift($steps, new When('I click on "'.$xpath.'" "xpath_element"'));
|
||||
|
||||
return $steps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a step to open the navigation bar if it is needed.
|
||||
*
|
||||
* The top log in and log out links are hidden when middle or small
|
||||
* size windows (or devices) are used. This step returns a step definition
|
||||
* clicking to expand the navbar if it is hidden.
|
||||
*
|
||||
* @return Given|bool A step definition or false if there is no need to show the navbar.
|
||||
*/
|
||||
protected function get_expand_navbar_step() {
|
||||
|
||||
// Checking if we need to click the navbar button to show the navigation menu, it
|
||||
// is hidden by default when using clean theme and a medium or small screen size.
|
||||
|
||||
// The DOM and the JS should be all ready and loaded. Running without spinning
|
||||
// as this is a widely used step and we can not spend time here trying to see
|
||||
// a DOM node that is not always there (at the moment clean is not even the
|
||||
// default theme...).
|
||||
$navbuttonjs = "return (
|
||||
Y.one('.btn-navbar') &&
|
||||
Y.one('.btn-navbar').getComputedStyle('display') !== 'none'
|
||||
)";
|
||||
|
||||
// Adding an extra click we need to show the 'Log in' link.
|
||||
if (!$this->getSession()->getDriver()->evaluateScript($navbuttonjs)) {
|
||||
return false;
|
||||
// However, the user menu *always* needs to be expanded. if running JS.
|
||||
if ($this->running_javascript()) {
|
||||
$xpath = "//div[@class='usermenu']//a[contains(concat(' ', @class, ' '), ' toggle-display ')]";
|
||||
$this->execute('behat_general::i_click_on', array($xpath, "xpath_element"));
|
||||
}
|
||||
|
||||
return new Given('I click on ".btn-navbar" "css_element"');
|
||||
// No need to check for exceptions as it will checked after this step execution.
|
||||
$this->execute('behat_general::click_link', get_string('logout'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1700,27 +1700,54 @@ class restore_course_structure_step extends restore_structure_step {
|
||||
*/
|
||||
public function process_course($data) {
|
||||
global $CFG, $DB;
|
||||
$context = context::instance_by_id($this->task->get_contextid());
|
||||
$userid = $this->task->get_userid();
|
||||
$target = $this->get_task()->get_target();
|
||||
$isnewcourse = $target != backup::TARGET_CURRENT_ADDING && $target != backup::TARGET_EXISTING_ADDING;
|
||||
|
||||
// When restoring to a new course we can set all the things except for the ID number.
|
||||
$canchangeidnumber = $isnewcourse || has_capability('moodle/course:changeidnumber', $context, $userid);
|
||||
$canchangeshortname = $isnewcourse || has_capability('moodle/course:changeshortname', $context, $userid);
|
||||
$canchangefullname = $isnewcourse || has_capability('moodle/course:changefullname', $context, $userid);
|
||||
$canchangesummary = $isnewcourse || has_capability('moodle/course:changesummary', $context, $userid);
|
||||
|
||||
$data = (object)$data;
|
||||
$data->id = $this->get_courseid();
|
||||
|
||||
$fullname = $this->get_setting_value('course_fullname');
|
||||
$shortname = $this->get_setting_value('course_shortname');
|
||||
$startdate = $this->get_setting_value('course_startdate');
|
||||
|
||||
// Calculate final course names, to avoid dupes
|
||||
// Calculate final course names, to avoid dupes.
|
||||
list($fullname, $shortname) = restore_dbops::calculate_course_names($this->get_courseid(), $fullname, $shortname);
|
||||
|
||||
// Need to change some fields before updating the course record
|
||||
$data->id = $this->get_courseid();
|
||||
$data->fullname = $fullname;
|
||||
$data->shortname= $shortname;
|
||||
if ($canchangefullname) {
|
||||
$data->fullname = $fullname;
|
||||
} else {
|
||||
unset($data->fullname);
|
||||
}
|
||||
|
||||
if ($canchangeshortname) {
|
||||
$data->shortname = $shortname;
|
||||
} else {
|
||||
unset($data->shortname);
|
||||
}
|
||||
|
||||
if (!$canchangesummary) {
|
||||
unset($data->summary);
|
||||
unset($data->summaryformat);
|
||||
}
|
||||
|
||||
// Only allow the idnumber to be set if the user has permission and the idnumber is not already in use by
|
||||
// another course on this site.
|
||||
$context = context::instance_by_id($this->task->get_contextid());
|
||||
if (!empty($data->idnumber) && has_capability('moodle/course:changeidnumber', $context, $this->task->get_userid()) &&
|
||||
$this->task->is_samesite() && !$DB->record_exists('course', array('idnumber' => $data->idnumber))) {
|
||||
if (!empty($data->idnumber) && $canchangeidnumber && $this->task->is_samesite()
|
||||
&& !$DB->record_exists('course', array('idnumber' => $data->idnumber))) {
|
||||
// Do not reset idnumber.
|
||||
|
||||
} else if (!$isnewcourse) {
|
||||
// Prevent override when restoring as merge.
|
||||
unset($data->idnumber);
|
||||
|
||||
} else {
|
||||
$data->idnumber = '';
|
||||
}
|
||||
|
||||
+2
-8
@@ -45,13 +45,7 @@ function core_badges_myprofile_navigation(\core_user\output\myprofile\tree $tree
|
||||
// Add category. This node should appear after 'contact' so that administration block appears towards the end. Refer MDL-49928.
|
||||
$category = new core_user\output\myprofile\category('badges', get_string('badges', 'badges'), 'contact');
|
||||
$tree->add_category($category);
|
||||
|
||||
// Determine context.
|
||||
if (isloggedin()) {
|
||||
$context = context_user::instance($USER->id);
|
||||
} else {
|
||||
$context = context_system::instance();
|
||||
}
|
||||
$context = context_user::instance($user->id);
|
||||
$courseid = empty($course) ? 0 : $course->id;
|
||||
|
||||
if ($USER->id == $user->id || has_capability('moodle/badges:viewotherbadges', $context)) {
|
||||
@@ -78,4 +72,4 @@ function core_badges_myprofile_navigation(\core_user\output\myprofile\tree $tree
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,222 @@
|
||||
@block @block_blog_menu
|
||||
Feature: Enable Block blog menu in an activity
|
||||
In order to enable the blog menu in an activity
|
||||
As a teacher
|
||||
I can add blog menu block to a course
|
||||
|
||||
Background:
|
||||
Given the following "users" exist:
|
||||
| username | firstname | lastname | email | idnumber |
|
||||
| teacher1 | Teacher | 1 | teacher1@example.com | T1 |
|
||||
| student1 | Student | 1 | student1@example.com | S1 |
|
||||
| student2 | Student | 2 | student2@example.com | S2 |
|
||||
And the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| student1 | C1 | student |
|
||||
| student2 | C1 | student |
|
||||
And I log in as "teacher1"
|
||||
And I follow "Course 1"
|
||||
And I turn editing mode on
|
||||
And I add a "Assignment" to section "1" and I fill the form with:
|
||||
| Assignment name | Test assignment 1 |
|
||||
| Description | Offline text |
|
||||
| assignsubmission_file_enabled | 0 |
|
||||
And I follow "Test assignment 1"
|
||||
And I add the "Blog menu" block
|
||||
And I log out
|
||||
|
||||
Scenario: Students use the blog menu block to post blogs
|
||||
Given I log in as "student1"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add a new entry"
|
||||
When I set the following fields to these values:
|
||||
| Entry title | S1 First Blog |
|
||||
| Blog entry body | This is my awesome blog! |
|
||||
And I press "Save changes"
|
||||
Then I should see "S1 First Blog"
|
||||
And I should see "This is my awesome blog!"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Blog entries"
|
||||
And I should see "S1 First Blog"
|
||||
And I should see "This is my awesome blog!"
|
||||
|
||||
Scenario: Students use the blog menu block to view their blogs about the activity
|
||||
Given I log in as "student1"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S1 First Blog |
|
||||
| Blog entry body | This is my awesome blog about this Assignment! |
|
||||
And I press "Save changes"
|
||||
And I should see "S1 First Blog"
|
||||
And I should see "This is my awesome blog about this Assignment!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I log out
|
||||
And I log in as "student2"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add a new entry"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 Second Blog |
|
||||
| Blog entry body | My unrelated blog! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 Second Blog"
|
||||
And I should see "My unrelated blog!"
|
||||
And I should not see "Associated Assignment: Test assignment 1"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 First Blog |
|
||||
| Blog entry body | My course blog is better! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 First Blog"
|
||||
And I should see "My course blog is better!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
When I follow "View my entries about this Assignment"
|
||||
Then I should see "S2 First Blog"
|
||||
And I should not see "S2 Second Blog"
|
||||
And I should not see "S1 First Blog"
|
||||
|
||||
Scenario: Students use the blog menu block to view all blogs about the assignment
|
||||
Given I log in as "student1"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S1 First Blog |
|
||||
| Blog entry body | This is my awesome blog about this Assignment! |
|
||||
And I press "Save changes"
|
||||
And I should see "S1 First Blog"
|
||||
And I should see "This is my awesome blog about this Assignment!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I log out
|
||||
And I log in as "student2"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add a new entry"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 Second Blog |
|
||||
| Blog entry body | My unrelated blog! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 Second Blog"
|
||||
And I should see "My unrelated blog!"
|
||||
And I should not see "Associated Assignment: Test assignment 1"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 First Blog |
|
||||
| Blog entry body | My course blog is better! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 First Blog"
|
||||
And I should see "My course blog is better!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
When I follow "View all entries about this Assignment"
|
||||
Then I should see "S1 First Blog"
|
||||
And I should see "S2 First Blog"
|
||||
And I should not see "S2 Second Blog"
|
||||
|
||||
Scenario: Students use the blog menu block to view all their blog entries
|
||||
Given I log in as "student1"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S1 First Blog |
|
||||
| Blog entry body | This is my awesome blog about this Assignment! |
|
||||
And I press "Save changes"
|
||||
And I should see "S1 First Blog"
|
||||
And I should see "This is my awesome blog about this Assignment!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I log out
|
||||
And I log in as "student2"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add a new entry"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 Second Blog |
|
||||
| Blog entry body | My unrelated blog! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 Second Blog"
|
||||
And I should see "My unrelated blog!"
|
||||
And I should not see "Associated Assignment: Test assignment 1"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 First Blog |
|
||||
| Blog entry body | My course blog is better! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 First Blog"
|
||||
And I should see "My course blog is better!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
When I follow "Blog entries"
|
||||
Then I should see "S2 First Blog"
|
||||
And I should see "S2 Second Blog"
|
||||
And I should not see "S1 First Blog"
|
||||
|
||||
Scenario: Teacher searches for student blogs
|
||||
Given I log in as "student1"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S1 First Blog |
|
||||
| Blog entry body | This is my awesome blog about this Assignment! |
|
||||
And I press "Save changes"
|
||||
And I should see "S1 First Blog"
|
||||
And I should see "This is my awesome blog about this Assignment!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I log out
|
||||
And I log in as "student2"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add a new entry"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 Second Blog |
|
||||
| Blog entry body | My unrelated blog! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 Second Blog"
|
||||
And I should see "My unrelated blog!"
|
||||
And I should not see "Associated Assignment: Test assignment 1"
|
||||
And I follow "Dashboard"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I follow "Add an entry about this Assignment"
|
||||
And I set the following fields to these values:
|
||||
| Entry title | S2 First Blog |
|
||||
| Blog entry body | My course blog is better! |
|
||||
And I press "Save changes"
|
||||
And I should see "S2 First Blog"
|
||||
And I should see "My course blog is better!"
|
||||
And I should see "Associated Assignment: Test assignment 1"
|
||||
And I log out
|
||||
When I log in as "teacher1"
|
||||
And I follow "Course 1"
|
||||
And I follow "Test assignment 1"
|
||||
And I set the field "blogsearchquery" to "First"
|
||||
And I press "Search"
|
||||
Then I should see "S1 First Blog"
|
||||
And I should see "S2 First Blog"
|
||||
And I should not see "S2 Second Blog"
|
||||
@@ -325,7 +325,7 @@ class block_course_overview_renderer extends plugin_renderer_base {
|
||||
* @return string html string for welcome area.
|
||||
*/
|
||||
public function welcome_area($msgcount) {
|
||||
global $USER;
|
||||
global $CFG, $USER;
|
||||
$output = $this->output->box_start('welcome_area');
|
||||
|
||||
$picture = $this->output->user_picture($USER, array('size' => 75, 'class' => 'welcome_userpicture'));
|
||||
@@ -334,16 +334,19 @@ class block_course_overview_renderer extends plugin_renderer_base {
|
||||
$output .= $this->output->box_start('welcome_message');
|
||||
$output .= $this->output->heading(get_string('welcome', 'block_course_overview', $USER->firstname));
|
||||
|
||||
$plural = 's';
|
||||
if ($msgcount > 0) {
|
||||
$output .= get_string('youhavemessages', 'block_course_overview', $msgcount);
|
||||
if ($msgcount == 1) {
|
||||
$plural = '';
|
||||
if (!empty($CFG->messaging)) {
|
||||
$plural = 's';
|
||||
if ($msgcount > 0) {
|
||||
$output .= get_string('youhavemessages', 'block_course_overview', $msgcount);
|
||||
if ($msgcount == 1) {
|
||||
$plural = '';
|
||||
}
|
||||
} else {
|
||||
$output .= get_string('youhavenomessages', 'block_course_overview');
|
||||
}
|
||||
} else {
|
||||
$output .= get_string('youhavenomessages', 'block_course_overview');
|
||||
$output .= html_writer::link(new moodle_url('/message/index.php'),
|
||||
get_string('message'.$plural, 'block_course_overview'));
|
||||
}
|
||||
$output .= html_writer::link(new moodle_url('/message/index.php'), get_string('message'.$plural, 'block_course_overview'));
|
||||
$output .= $this->output->box_end();
|
||||
$output .= $this->output->box('', 'flush');
|
||||
$output .= $this->output->box_end();
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
.block_navigation .block_tree .tree_item.hasicon .item-content-wrap {
|
||||
display: inline-block;
|
||||
white-space: normal;
|
||||
width: calc(100% - 21px);
|
||||
}
|
||||
|
||||
.block_navigation .block_tree ul {
|
||||
|
||||
+3
-3
@@ -524,9 +524,9 @@ BRANCH.prototype = {
|
||||
branchicon.setAttribute('title', icon.title);
|
||||
}
|
||||
if (icon.classes) {
|
||||
for (var i in icon.classes) {
|
||||
branchicon.addClass(icon.classes[i]);
|
||||
}
|
||||
icon.classes.forEach(function(element) {
|
||||
branchicon.addClass(element);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
File diff suppressed because one or more lines are too long
blocks/navigation/yui/build/moodle-block_navigation-navigation/moodle-block_navigation-navigation.js
Vendored
+3
-3
@@ -523,9 +523,9 @@ BRANCH.prototype = {
|
||||
branchicon.setAttribute('title', icon.title);
|
||||
}
|
||||
if (icon.classes) {
|
||||
for (var i in icon.classes) {
|
||||
branchicon.addClass(icon.classes[i]);
|
||||
}
|
||||
icon.classes.forEach(function(element) {
|
||||
branchicon.addClass(element);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -522,9 +522,9 @@ BRANCH.prototype = {
|
||||
branchicon.setAttribute('title', icon.title);
|
||||
}
|
||||
if (icon.classes) {
|
||||
for (var i in icon.classes) {
|
||||
branchicon.addClass(icon.classes[i]);
|
||||
}
|
||||
icon.classes.forEach(function(element) {
|
||||
branchicon.addClass(element);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+7
-3
@@ -63,9 +63,13 @@ if ($id) {
|
||||
|
||||
$sitecontext = context_system::instance();
|
||||
$usercontext = context_user::instance($userid);
|
||||
$PAGE->set_context($usercontext);
|
||||
$blognode = $PAGE->settingsnav->find('blogadd', null);
|
||||
$blognode->make_active();
|
||||
if ($modid) {
|
||||
$PAGE->set_context($sitecontext);
|
||||
} else {
|
||||
$PAGE->set_context($usercontext);
|
||||
$blognode = $PAGE->settingsnav->find('blogadd', null);
|
||||
$blognode->make_active();
|
||||
}
|
||||
|
||||
require_login($courseid);
|
||||
|
||||
|
||||
+1
-1
@@ -63,7 +63,7 @@ if ($entryid and !isset($userid)) {
|
||||
$userid = $entry->userid;
|
||||
}
|
||||
|
||||
if (isset($userid) && empty($courseid)) {
|
||||
if (isset($userid) && empty($courseid) && empty($modid)) {
|
||||
$context = context_user::instance($userid);
|
||||
} else if (!empty($courseid) && $courseid != SITEID) {
|
||||
$context = context_course::instance($courseid);
|
||||
|
||||
Vendored
+5
-1
@@ -330,7 +330,11 @@ class cache_config {
|
||||
if (!file_exists($cachefile)) {
|
||||
throw new cache_exception('Default cache config could not be found. It should have already been created by now.');
|
||||
}
|
||||
include($cachefile);
|
||||
|
||||
if (!include($cachefile)) {
|
||||
throw new cache_exception('Unable to load the cache configuration file');
|
||||
}
|
||||
|
||||
if (!is_array($configuration)) {
|
||||
throw new cache_exception('Invalid cache configuration file');
|
||||
}
|
||||
|
||||
@@ -96,6 +96,7 @@ class behat_calendar extends behat_base {
|
||||
$dayofmonth = "a[{$daycontains}]";
|
||||
return array(
|
||||
new Given('I hover "//' . $currentmonth . '/descendant::' . $daycell . '/' . $dayofmonth . '" "xpath_element"'),
|
||||
new Given('I wait until the page is ready'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
+13
-12
@@ -53,25 +53,26 @@ $time = optional_param('time', 0, PARAM_INT);
|
||||
|
||||
$url = new moodle_url('/calendar/view.php');
|
||||
|
||||
if ($courseid != SITEID) {
|
||||
$url->param('course', $courseid);
|
||||
}
|
||||
|
||||
if ($view !== 'upcoming') {
|
||||
$url->param('view', $view);
|
||||
}
|
||||
|
||||
// If a day, month and year were passed then convert it to a timestamp. If these were passed
|
||||
// then we can assume the day, month and year are passed as Gregorian, as no where in core
|
||||
// should we be passing these values rather than the time. This is done for BC.
|
||||
if (!empty($day) && !empty($mon) && !empty($year)) {
|
||||
if (checkdate($mon, $day, $year)) {
|
||||
$time = make_timestamp($year, $mon, $day);
|
||||
} else {
|
||||
$time = usergetmidnight(time());
|
||||
}
|
||||
} else if (empty($time)) {
|
||||
$time = usergetmidnight(time());
|
||||
}
|
||||
|
||||
if (empty($time)) {
|
||||
$time = time();
|
||||
}
|
||||
|
||||
if ($courseid != SITEID) {
|
||||
$url->param('course', $courseid);
|
||||
}
|
||||
|
||||
if ($view !== 'upcoming') {
|
||||
$time = usergetmidnight($time);
|
||||
$url->param('view', $view);
|
||||
}
|
||||
|
||||
$url->param('time', $time);
|
||||
|
||||
@@ -44,12 +44,11 @@ Feature: Access visible and hidden cohorts
|
||||
| user | course | role |
|
||||
| teacher | C1 | editingteacher |
|
||||
|
||||
@javascript
|
||||
Scenario: Teacher can see visible cohorts defined in the above contexts
|
||||
When I log in as "teacher"
|
||||
And I follow "Course 1"
|
||||
And I navigate to "Enrolment methods" node in "Course administration > Users"
|
||||
And I set the field "Add method" to "Cohort sync"
|
||||
And I select "Cohort sync" from the "Add method" singleselect
|
||||
Then the "Cohort" select box should contain "Cohort in category 1"
|
||||
And the "Cohort" select box should contain "System cohort"
|
||||
And the "Cohort" select box should not contain "Cohort hidden in category 1"
|
||||
@@ -71,13 +70,12 @@ Feature: Access visible and hidden cohorts
|
||||
And the "Select members from cohort" select box should not contain "Cohort empty in category 1"
|
||||
And the "Select members from cohort" select box should not contain "System empty cohort"
|
||||
|
||||
@javascript
|
||||
Scenario: System manager can see all cohorts defined in the above contexts
|
||||
When I log in as "user1"
|
||||
And I am on site homepage
|
||||
And I follow "Course 1"
|
||||
And I navigate to "Enrolment methods" node in "Course administration > Users"
|
||||
And I set the field "Add method" to "Cohort sync"
|
||||
And I select "Cohort sync" from the "Add method" singleselect
|
||||
Then the "Cohort" select box should contain "Cohort in category 1"
|
||||
And the "Cohort" select box should contain "System cohort"
|
||||
And the "Cohort" select box should contain "Cohort hidden in category 1"
|
||||
@@ -99,13 +97,12 @@ Feature: Access visible and hidden cohorts
|
||||
And the "Select members from cohort" select box should not contain "Cohort empty in category 1"
|
||||
And the "Select members from cohort" select box should not contain "System empty cohort"
|
||||
|
||||
@javascript
|
||||
Scenario: Category manager can see all cohorts defined in his category and visible cohorts defined above
|
||||
When I log in as "user2"
|
||||
And I am on site homepage
|
||||
And I follow "Course 1"
|
||||
And I navigate to "Enrolment methods" node in "Course administration > Users"
|
||||
And I set the field "Add method" to "Cohort sync"
|
||||
And I select "Cohort sync" from the "Add method" singleselect
|
||||
Then the "Cohort" select box should contain "Cohort in category 1"
|
||||
And the "Cohort" select box should contain "System cohort"
|
||||
And the "Cohort" select box should contain "Cohort hidden in category 1"
|
||||
|
||||
@@ -21,7 +21,6 @@ Feature: Add cohorts of users
|
||||
| Description | Test cohort description |
|
||||
And I press "Save changes"
|
||||
|
||||
@javascript
|
||||
Scenario: Add a cohort
|
||||
When I follow "Cohorts"
|
||||
Then I should see "Test cohort name"
|
||||
@@ -29,7 +28,6 @@ Feature: Add cohorts of users
|
||||
And I should see "Test cohort description"
|
||||
And I should see "Created manually"
|
||||
|
||||
@javascript
|
||||
Scenario: Add users to a cohort selecting them from the system users list
|
||||
When I add "First User (first@example.com)" user to "333" cohort members
|
||||
And I add "Second User (second@example.com)" user to "333" cohort members
|
||||
@@ -39,7 +37,6 @@ Feature: Add cohorts of users
|
||||
And the "Current users" select box should contain "Second User (second@example.com)"
|
||||
And the "Current users" select box should not contain "Forth User (forth@example.com)"
|
||||
|
||||
@javascript
|
||||
Scenario: Add users to a cohort using a bulk user action
|
||||
When I follow "Bulk user actions"
|
||||
And I set the field "Available" to "Third User"
|
||||
|
||||
@@ -59,29 +59,16 @@ class behat_cohort extends behat_base {
|
||||
if (!$this->getSession()->getPage()->find('css', 'input#cohort_search_q')) {
|
||||
|
||||
// With JS enabled we should expand a few tree nodes.
|
||||
if ($this->running_javascript()) {
|
||||
$parentnodes = get_string('administrationsite') . ' > ' .
|
||||
get_string('users', 'admin') . ' > ' .
|
||||
get_string('accounts', 'admin');
|
||||
$steps = array_merge(
|
||||
array(
|
||||
new Given('I am on homepage'),
|
||||
new Given('I navigate to "' . get_string('cohorts', 'cohort') . '" node in "' . $parentnodes . '"')
|
||||
),
|
||||
$steps
|
||||
);
|
||||
|
||||
} else {
|
||||
// JS disabled.
|
||||
$steps = array_merge(
|
||||
array(
|
||||
new Given('I am on homepage'),
|
||||
new Given('I follow "' . get_string('administrationsite') . '" node'),
|
||||
new Given('I follow "' . get_string('cohorts', 'cohort') . '"')
|
||||
),
|
||||
$steps
|
||||
);
|
||||
}
|
||||
$parentnodes = get_string('administrationsite') . ' > ' .
|
||||
get_string('users', 'admin') . ' > ' .
|
||||
get_string('accounts', 'admin');
|
||||
$steps = array_merge(
|
||||
array(
|
||||
new Given('I am on homepage'),
|
||||
new Given('I navigate to "' . get_string('cohorts', 'cohort') . '" node in "' . $parentnodes . '"')
|
||||
),
|
||||
$steps
|
||||
);
|
||||
}
|
||||
|
||||
return $steps;
|
||||
|
||||
@@ -27,7 +27,6 @@ Feature: View cohort list
|
||||
| user1 | manager | System | |
|
||||
| user2 | manager | Category | CAT1 |
|
||||
|
||||
@javascript
|
||||
Scenario: Admin can see system cohorts and all cohorts
|
||||
When I log in as "admin"
|
||||
And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
|
||||
@@ -40,7 +39,6 @@ Feature: View cohort list
|
||||
And I should see "Cohort in category 3"
|
||||
And I log out
|
||||
|
||||
@javascript
|
||||
Scenario: Manager can see system cohorts and all cohorts
|
||||
When I log in as "user1"
|
||||
And I navigate to "Cohorts" node in "Site administration > Users > Accounts"
|
||||
@@ -53,7 +51,6 @@ Feature: View cohort list
|
||||
And I should see "Cohort in category 3"
|
||||
And I log out
|
||||
|
||||
@javascript
|
||||
Scenario: Manager in category can see cohorts in the category
|
||||
When I log in as "user2"
|
||||
And I follow "Courses"
|
||||
|
||||
@@ -690,6 +690,20 @@ $CFG->admin = 'admin';
|
||||
// )
|
||||
// )
|
||||
// );
|
||||
// You can also use the following config to override default Moodle configuration for Behat.
|
||||
// This config is limited to default suite and will be supported in later versions.
|
||||
// It will have precedence over $CFG->behat_config.
|
||||
// $CFG->behat_profiles = array(
|
||||
// 'phantomjs' => array(
|
||||
// 'browser' => 'phantomjs',
|
||||
// 'tags' => '~@_file_upload&&~@_alert&&~@_bug_phantomjs',
|
||||
// 'wd_host' => 'http://127.0.0.1:4443/wd/hub',
|
||||
// 'capabilities' => array(
|
||||
// 'platform' => 'Linux',
|
||||
// 'version' => 2.1
|
||||
// )
|
||||
// ),
|
||||
// );
|
||||
//
|
||||
// You can force the browser session (not user's sessions) to restart after N seconds. This could
|
||||
// be useful if you are using a cloud-based service with time restrictions in the browser side.
|
||||
|
||||
@@ -3093,6 +3093,7 @@ class course_request {
|
||||
$data->visible = $courseconfig->visible;
|
||||
$data->visibleold = $data->visible;
|
||||
$data->lang = $courseconfig->lang;
|
||||
$data->enablecompletion = $courseconfig->enablecompletion;
|
||||
|
||||
$course = create_course($data);
|
||||
$context = context_course::instance($course->id, MUST_EXIST);
|
||||
|
||||
@@ -0,0 +1,324 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* Course restore tests.
|
||||
*
|
||||
* @package core_course
|
||||
* @copyright 2016 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
global $CFG;
|
||||
|
||||
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
|
||||
require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
|
||||
|
||||
/**
|
||||
* Course restore testcase.
|
||||
*
|
||||
* @package core_course
|
||||
* @copyright 2016 Frédéric Massart - FMCorz.net
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class core_restore_backup_testcase extends advanced_testcase {
|
||||
|
||||
/**
|
||||
* Backup a course and return its backup ID.
|
||||
*
|
||||
* @param int $courseid The course ID.
|
||||
* @param int $userid The user doing the backup.
|
||||
* @return string
|
||||
*/
|
||||
protected function backup_course($courseid, $userid = 2) {
|
||||
globaL $CFG;
|
||||
$packer = get_file_packer('application/vnd.moodle.backup');
|
||||
|
||||
$bc = new backup_controller(backup::TYPE_1COURSE, $courseid, backup::FORMAT_MOODLE, backup::INTERACTIVE_NO,
|
||||
backup::MODE_GENERAL, $userid);
|
||||
$bc->execute_plan();
|
||||
|
||||
$results = $bc->get_results();
|
||||
$results['backup_destination']->extract_to_pathname($packer, "$CFG->tempdir/backup/core_course_testcase");
|
||||
|
||||
$bc->destroy();
|
||||
unset($bc);
|
||||
return 'core_course_testcase';
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a role with capabilities and permissions.
|
||||
*
|
||||
* @param string|array $caps Capability names.
|
||||
* @param int $perm Constant CAP_* to apply to the capabilities.
|
||||
* @return int The new role ID.
|
||||
*/
|
||||
protected function create_role_with_caps($caps, $perm) {
|
||||
$caps = (array) $caps;
|
||||
$dg = $this->getDataGenerator();
|
||||
$roleid = $dg->create_role();
|
||||
foreach ($caps as $cap) {
|
||||
assign_capability($cap, $perm, $roleid, context_system::instance()->id, true);
|
||||
}
|
||||
accesslib_clear_all_caches_for_unit_testing();
|
||||
return $roleid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore a course.
|
||||
*
|
||||
* @param int $backupid The backup ID.
|
||||
* @param int $courseid The course ID to restore in, or 0.
|
||||
* @param int $userid The ID of the user performing the restore.
|
||||
* @return stdClass The updated course object.
|
||||
*/
|
||||
protected function restore_course($backupid, $courseid, $userid) {
|
||||
global $DB;
|
||||
|
||||
$target = backup::TARGET_CURRENT_ADDING;
|
||||
if (!$courseid) {
|
||||
$target = backup::TARGET_NEW_COURSE;
|
||||
$categoryid = $DB->get_field_sql("SELECT MIN(id) FROM {course_categories}");
|
||||
$courseid = restore_dbops::create_new_course('Tmp', 'tmp', $categoryid);
|
||||
}
|
||||
|
||||
$rc = new restore_controller($backupid, $courseid, backup::INTERACTIVE_NO, backup::MODE_GENERAL, $userid, $target);
|
||||
$target == backup::TARGET_NEW_COURSE ?: $rc->get_plan()->get_setting('overwrite_conf')->set_value(true);
|
||||
$rc->execute_precheck();
|
||||
$rc->execute_plan();
|
||||
|
||||
$course = $DB->get_record('course', array('id' => $rc->get_courseid()));
|
||||
|
||||
$rc->destroy();
|
||||
unset($rc);
|
||||
return $course;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore a course to an existing course.
|
||||
*
|
||||
* @param int $backupid The backup ID.
|
||||
* @param int $courseid The course ID to restore in.
|
||||
* @param int $userid The ID of the user performing the restore.
|
||||
* @return stdClass The updated course object.
|
||||
*/
|
||||
protected function restore_to_existing_course($backupid, $courseid, $userid = 2) {
|
||||
return $this->restore_course($backupid, $courseid, $userid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore a course to a new course.
|
||||
*
|
||||
* @param int $backupid The backup ID.
|
||||
* @param int $userid The ID of the user performing the restore.
|
||||
* @return stdClass The new course object.
|
||||
*/
|
||||
protected function restore_to_new_course($backupid, $userid = 2) {
|
||||
return $this->restore_course($backupid, 0, $userid);
|
||||
}
|
||||
|
||||
public function test_restore_existing_idnumber_in_new_course() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$dg = $this->getDataGenerator();
|
||||
$c1 = $dg->create_course(['idnumber' => 'ABC']);
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
$c2 = $this->restore_to_new_course($backupid);
|
||||
|
||||
// The ID number is set empty.
|
||||
$this->assertEquals('', $c2->idnumber);
|
||||
}
|
||||
|
||||
public function test_restore_non_existing_idnumber_in_new_course() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
|
||||
$dg = $this->getDataGenerator();
|
||||
$c1 = $dg->create_course(['idnumber' => 'ABC']);
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
|
||||
$c1->idnumber = 'BCD';
|
||||
$DB->update_record('course', $c1);
|
||||
|
||||
// The ID number changed.
|
||||
$c2 = $this->restore_to_new_course($backupid);
|
||||
$this->assertEquals('ABC', $c2->idnumber);
|
||||
}
|
||||
|
||||
public function test_restore_existing_idnumber_in_existing_course() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
|
||||
$dg = $this->getDataGenerator();
|
||||
$c1 = $dg->create_course(['idnumber' => 'ABC']);
|
||||
$c2 = $dg->create_course(['idnumber' => 'DEF']);
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
|
||||
// The ID number does not change.
|
||||
$c2 = $this->restore_to_existing_course($backupid, $c2->id);
|
||||
$this->assertEquals('DEF', $c2->idnumber);
|
||||
|
||||
$c1 = $DB->get_record('course', array('id' => $c1->id));
|
||||
$this->assertEquals('ABC', $c1->idnumber);
|
||||
}
|
||||
|
||||
public function test_restore_non_existing_idnumber_in_existing_course() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
|
||||
$dg = $this->getDataGenerator();
|
||||
$c1 = $dg->create_course(['idnumber' => 'ABC']);
|
||||
$c2 = $dg->create_course(['idnumber' => 'DEF']);
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
|
||||
$c1->idnumber = 'XXX';
|
||||
$DB->update_record('course', $c1);
|
||||
|
||||
// The ID number has changed.
|
||||
$c2 = $this->restore_to_existing_course($backupid, $c2->id);
|
||||
$this->assertEquals('ABC', $c2->idnumber);
|
||||
}
|
||||
|
||||
public function test_restore_idnumber_in_existing_course_without_permissions() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
$dg = $this->getDataGenerator();
|
||||
$u1 = $dg->create_user();
|
||||
|
||||
$managers = get_archetype_roles('manager');
|
||||
$manager = array_shift($managers);
|
||||
$roleid = $this->create_role_with_caps('moodle/course:changeidnumber', CAP_PROHIBIT);
|
||||
$dg->role_assign($manager->id, $u1->id);
|
||||
$dg->role_assign($roleid, $u1->id);
|
||||
|
||||
$c1 = $dg->create_course(['idnumber' => 'ABC']);
|
||||
$c2 = $dg->create_course(['idnumber' => 'DEF']);
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
|
||||
$c1->idnumber = 'XXX';
|
||||
$DB->update_record('course', $c1);
|
||||
|
||||
// The ID number does not change.
|
||||
$c2 = $this->restore_to_existing_course($backupid, $c2->id, $u1->id);
|
||||
$this->assertEquals('DEF', $c2->idnumber);
|
||||
}
|
||||
|
||||
public function test_restore_course_info_in_new_course() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
$dg = $this->getDataGenerator();
|
||||
|
||||
$c1 = $dg->create_course(['shortname' => 'SN', 'fullname' => 'FN', 'summary' => 'DESC', 'summaryformat' => FORMAT_MOODLE]);
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
|
||||
// The information is restored but adapted because names are already taken.
|
||||
$c2 = $this->restore_to_new_course($backupid);
|
||||
$this->assertEquals('SN_1', $c2->shortname);
|
||||
$this->assertEquals('FN copy 1', $c2->fullname);
|
||||
$this->assertEquals('DESC', $c2->summary);
|
||||
$this->assertEquals(FORMAT_MOODLE, $c2->summaryformat);
|
||||
}
|
||||
|
||||
public function test_restore_course_info_in_existing_course() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
$dg = $this->getDataGenerator();
|
||||
|
||||
$c1 = $dg->create_course(['shortname' => 'SN', 'fullname' => 'FN', 'summary' => 'DESC', 'summaryformat' => FORMAT_MOODLE]);
|
||||
$c2 = $dg->create_course(['shortname' => 'A', 'fullname' => 'B', 'summary' => 'C', 'summaryformat' => FORMAT_PLAIN]);
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
|
||||
// The information is restored but adapted because names are already taken.
|
||||
$c2 = $this->restore_to_existing_course($backupid, $c2->id);
|
||||
$this->assertEquals('SN_1', $c2->shortname);
|
||||
$this->assertEquals('FN copy 1', $c2->fullname);
|
||||
$this->assertEquals('DESC', $c2->summary);
|
||||
$this->assertEquals(FORMAT_MOODLE, $c2->summaryformat);
|
||||
}
|
||||
|
||||
public function test_restore_course_shortname_in_existing_course_without_permissions() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
$dg = $this->getDataGenerator();
|
||||
$u1 = $dg->create_user();
|
||||
|
||||
$managers = get_archetype_roles('manager');
|
||||
$manager = array_shift($managers);
|
||||
$roleid = $this->create_role_with_caps('moodle/course:changeshortname', CAP_PROHIBIT);
|
||||
$dg->role_assign($manager->id, $u1->id);
|
||||
$dg->role_assign($roleid, $u1->id);
|
||||
|
||||
$c1 = $dg->create_course(['shortname' => 'SN', 'fullname' => 'FN', 'summary' => 'DESC', 'summaryformat' => FORMAT_MOODLE]);
|
||||
$c2 = $dg->create_course(['shortname' => 'A1', 'fullname' => 'B1', 'summary' => 'C1', 'summaryformat' => FORMAT_PLAIN]);
|
||||
|
||||
// The shortname does not change.
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
$restored = $this->restore_to_existing_course($backupid, $c2->id, $u1->id);
|
||||
$this->assertEquals($c2->shortname, $restored->shortname);
|
||||
$this->assertEquals('FN copy 1', $restored->fullname);
|
||||
$this->assertEquals('DESC', $restored->summary);
|
||||
$this->assertEquals(FORMAT_MOODLE, $restored->summaryformat);
|
||||
}
|
||||
|
||||
public function test_restore_course_fullname_in_existing_course_without_permissions() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
$dg = $this->getDataGenerator();
|
||||
$u1 = $dg->create_user();
|
||||
|
||||
$managers = get_archetype_roles('manager');
|
||||
$manager = array_shift($managers);
|
||||
$roleid = $this->create_role_with_caps('moodle/course:changefullname', CAP_PROHIBIT);
|
||||
$dg->role_assign($manager->id, $u1->id);
|
||||
$dg->role_assign($roleid, $u1->id);
|
||||
|
||||
$c1 = $dg->create_course(['shortname' => 'SN', 'fullname' => 'FN', 'summary' => 'DESC', 'summaryformat' => FORMAT_MOODLE]);
|
||||
$c2 = $dg->create_course(['shortname' => 'A1', 'fullname' => 'B1', 'summary' => 'C1', 'summaryformat' => FORMAT_PLAIN]);
|
||||
|
||||
// The fullname does not change.
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
$restored = $this->restore_to_existing_course($backupid, $c2->id, $u1->id);
|
||||
$this->assertEquals('SN_1', $restored->shortname);
|
||||
$this->assertEquals($c2->fullname, $restored->fullname);
|
||||
$this->assertEquals('DESC', $restored->summary);
|
||||
$this->assertEquals(FORMAT_MOODLE, $restored->summaryformat);
|
||||
}
|
||||
|
||||
public function test_restore_course_summary_in_existing_course_without_permissions() {
|
||||
global $DB;
|
||||
$this->resetAfterTest();
|
||||
$dg = $this->getDataGenerator();
|
||||
$u1 = $dg->create_user();
|
||||
|
||||
$managers = get_archetype_roles('manager');
|
||||
$manager = array_shift($managers);
|
||||
$roleid = $this->create_role_with_caps('moodle/course:changesummary', CAP_PROHIBIT);
|
||||
$dg->role_assign($manager->id, $u1->id);
|
||||
$dg->role_assign($roleid, $u1->id);
|
||||
|
||||
$c1 = $dg->create_course(['shortname' => 'SN', 'fullname' => 'FN', 'summary' => 'DESC', 'summaryformat' => FORMAT_MOODLE]);
|
||||
$c2 = $dg->create_course(['shortname' => 'A1', 'fullname' => 'B1', 'summary' => 'C1', 'summaryformat' => FORMAT_PLAIN]);
|
||||
|
||||
// The summary and format do not change.
|
||||
$backupid = $this->backup_course($c1->id);
|
||||
$restored = $this->restore_to_existing_course($backupid, $c2->id, $u1->id);
|
||||
$this->assertEquals('SN_1', $restored->shortname);
|
||||
$this->assertEquals('FN copy 1', $restored->fullname);
|
||||
$this->assertEquals($c2->summary, $restored->summary);
|
||||
$this->assertEquals($c2->summaryformat, $restored->summaryformat);
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ class core_enrollib_testcase extends advanced_testcase {
|
||||
// Make sure sorting and columns work.
|
||||
|
||||
$basefields = array('id', 'category', 'sortorder', 'shortname', 'fullname', 'idnumber',
|
||||
'startdate', 'visible', 'groupmode', 'groupmodeforce');
|
||||
'startdate', 'visible', 'groupmode', 'groupmodeforce', 'defaultgroupingid');
|
||||
|
||||
$courses = enrol_get_all_users_courses($user2->id, true);
|
||||
$course = reset($courses);
|
||||
|
||||
@@ -91,7 +91,7 @@ switch ($action) {
|
||||
}
|
||||
|
||||
if ($errorstr) {
|
||||
$user = $DB->get_record('user', array('id' => $userid), 'id, firstname, lastname');
|
||||
$user = $DB->get_record('user', array('id' => $userid), 'id, ' . get_all_user_name_fields(true));
|
||||
$gradestr = new stdClass();
|
||||
$gradestr->username = fullname($user);
|
||||
$gradestr->itemname = $grade_item->get_name();
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* 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['thisdirection'] = 'ltr';
|
||||
$string['thislanguage'] = 'Breizh';
|
||||
@@ -32,20 +32,21 @@ defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['cannotcreatedboninstall'] = '<p>No és pot crear la base de dades.</p> <p>La base de dades especificada no existeix i l\'usuari que heu proporcionat no té permís per a crear-la.</p>
|
||||
<p>L\'administrador del lloc hauria de verificar la configuració de la base de dades.</p>';
|
||||
$string['cannotcreatelangdir'] = 'No s\'ha pogut crear el directori d\'idiomes.';
|
||||
$string['cannotcreatelangdir'] = 'No s\'ha pogut crear el directori d\'idiomes';
|
||||
$string['cannotcreatetempdir'] = 'No s\'ha pogut crear el directori temporal';
|
||||
$string['cannotdownloadcomponents'] = 'No s\'han pogut baixar components';
|
||||
$string['cannotdownloadzipfile'] = 'No s\'ha pogut baixar el fitxer zip';
|
||||
$string['cannotdownloadzipfile'] = 'No s\'ha pogut baixar el fitxer ZIP';
|
||||
$string['cannotfindcomponent'] = 'No s\'ha pogut trobar el component';
|
||||
$string['cannotsavemd5file'] = 'No s\'ha pogut desar el fitxer md5';
|
||||
$string['cannotsavezipfile'] = 'No s\'ha pogut desar el fitxer zip';
|
||||
$string['cannotsavezipfile'] = 'No s\'ha pogut desar el fitxer ZIP';
|
||||
$string['cannotunzipfile'] = 'No s\'ha pogut descomprimir el fitxer';
|
||||
$string['componentisuptodate'] = 'El component està al dia';
|
||||
$string['componentisuptodate'] = 'El component està actualitzat';
|
||||
$string['dmlexceptiononinstall'] = '<p>S\'ha produït un error de la base de dades [{$a->errorcode}].<br />{$a->debuginfo}</p>';
|
||||
$string['downloadedfilecheckfailed'] = 'Ha fallat la comprovació del fitxer baixat';
|
||||
$string['invalidmd5'] = 'L\'md5 no és vàlid. Torneu-ho a provar';
|
||||
$string['missingrequiredfield'] = 'Falta algun camp necessari';
|
||||
$string['remotedownloaderror'] = 'No s\'ha pogut baixar el component al vostre servidor. Verifiqueu els paràmetres de servidor intermediari. Es recomana l\'extensió cURL.<br /><br />Haureu de baixar manualment el fitxer <a href="{$a->url}">{$a->url}</a>, copiar-lo a la ubicació "{$a->dest}" del vostre servidor i descomprimir-lo allí.';
|
||||
$string['remotedownloaderror'] = '<p>No s\'ha pogut baixar el component al vostre servidor. Verifiqueu els paràmetres del servidor intermediari. Es recomana vivament l\'extensió cURL de PHP.</p>
|
||||
<p>Haureu de baixar manualment el fitxer <a href="{$a->url}">{$a->url}</a>, copiar-lo a la ubicació «{$a->dest}» del vostre servidor i descomprimir-lo allí.</p>';
|
||||
$string['wrongdestpath'] = 'El camí de destinació és erroni';
|
||||
$string['wrongsourcebase'] = 'L\'adreça (URL) base de la font és errònia';
|
||||
$string['wrongzipfilename'] = 'El nom del fitxer ZIP és erroni';
|
||||
|
||||
+10
-10
@@ -34,8 +34,8 @@ $string['admindirname'] = 'Directori d\'administració';
|
||||
$string['availablelangs'] = 'Llista d\'idiomes disponibles';
|
||||
$string['chooselanguagehead'] = 'Trieu un idioma';
|
||||
$string['chooselanguagesub'] = 'Trieu un idioma per a la instal·lació. S\'utilitzarà també com a idioma per defecte del lloc, tot i que després podeu canviar-lo.';
|
||||
$string['clialreadyconfigured'] = 'El fitxer config.php ja existeix, feu servir dmin/cli/install_database.php si voleu instal·lar aquest lloc web.';
|
||||
$string['clialreadyinstalled'] = 'El fitxer config.php ja existeix, feu servir admin/cli/upgrade.php si voleu actualitzar aquest lloc web.';
|
||||
$string['clialreadyconfigured'] = 'El fitxer config.php ja existeix, feu servir admin/cli/install_database.php si voleu instal·lar el Moodle en aquest lloc web.';
|
||||
$string['clialreadyinstalled'] = 'El fitxer de configuració config.php ja existeix. Feu servir admin/cli/upgrade.php si voleu actualitzar Moodle per a aquest lloc web.';
|
||||
$string['cliinstallheader'] = 'Programa d\'instal·lació de línia d\'ordres de Moodle {$a}';
|
||||
$string['databasehost'] = 'Servidor de base de dades:';
|
||||
$string['databasename'] = 'Nom de la base de dades:';
|
||||
@@ -67,14 +67,14 @@ $string['pathserrcreatedataroot'] = 'L\'instal·lador no pot crear el directori
|
||||
$string['pathshead'] = 'Confirmeu els camins';
|
||||
$string['pathsrodataroot'] = 'No es pot escriure en el directori dataroot.';
|
||||
$string['pathsroparentdataroot'] = 'No es pot escriure en el directori pare ({$a->parent}). L\'instal·lador no pot crear el directori ({$a->dataroot}).';
|
||||
$string['pathssubadmindir'] = 'Alguns serveis d\'allotjament web (pocs) utilitzen un URL especial /admin p. ex. per a accedir a un tauler de control o quelcom semblant. Malauradament això entra en conflicte amb la ubicació estàndard de les pàgines d\'administració de Moodle. Podeu arreglar aquest problema canviant el nom del directori d\'administració de Moodle en la vostra instal·lació i posant el nou nom aquí. Per exemple <em>moodleadmin</em>. Això modificarà els enllaços d\'administració de Moodle.';
|
||||
$string['pathssubdataroot'] = 'Necessiteu un espai on Moodle pugui desar els fitxers penjats. Aquest directori hauria de tenir permisos de lectura I ESCRIPTURA per a l\'usuari del servidor web (normalment \'nobody\' o \'apache\'), però no cal que sigui accessible directament via web. L\'instal·lador provarà de crear-lo si no existeix.';
|
||||
$string['pathssubadmindir'] = 'Alguns serveis d\'allotjament web (pocs) utilitzen /admin com a URL especial perquè accediu a un tauler de control o quelcom semblant. Malauradament, això entra en conflicte amb la ubicació estàndard de les pàgines d\'administració de Moodle. Podeu arreglar aquest problema canviant el nom del directori d\'administració de Moodle en la vostra instal·lació i posant el nou nom aquí. Per exemple: <em>moodleadmin</em>. Això arreglarà els enllaços d\'administració de Moodle.';
|
||||
$string['pathssubdataroot'] = '<p>Directori on el Moodle emmagatzemarà els materials pujats pels usuaris.</p>
|
||||
<p>Aquest directori hauria de tenir permisos de lectura i escriptura per a l\'usuari del servidor web (normalment \'www-data\', \'nobody\', or \'apache\').</p>
|
||||
<p>No ha de ser accessible directament via web.</p>
|
||||
<p>L\'instal·lador provarà de crear-lo si no existeix.</p>';
|
||||
$string['pathssubdirroot'] = 'Camí complet del directori d\'instal·lació de Moodle.';
|
||||
$string['pathssubwwwroot'] = 'L\'adreça web completa on s\'accedirà a Moodle.
|
||||
No és possible accedir a Moodle en diferents adreces.
|
||||
Si el vostre lloc té múltiples adreces públiques haureu de configurar redireccions permanents per a totes excepte aquesta.
|
||||
Si el vostre lloc és accessible tant des d\'Internet com des d\'una intranet, utilitzeu aquí l\'adreça pública i configureu el DNS de manera que els usuaris de la intranet puguin utilitzar també l\'adreça pública.
|
||||
Si l\'adreça no és correcta, canvieu l\'URL en el vostre navegador per reiniciar la instal·lació amb un altre valor.';
|
||||
$string['pathssubwwwroot'] = '<p>L\'adreça web completa on s\'accedirà a Moodle; per exemple, l\'adreça que els usuaris introduiran a la barra d\'adreces del navegador per accedir a Moodle.</p> <p> No és possible accedir a Moodle utilitzant diferents adreces. Si el vostre lloc és accessible a través de diferents adreces, trieu-ne la més fàcil i configureu una redirecció permanent per a cadascuna de les altres adreces.</p> <p>
|
||||
Si el vostre lloc és accessible tant des d\'Internet com des d\'una xarxa interna (anomenada de vegades intranet), utilitzeu l\'adreça pública aquí.</p> <p>Si l\'adreça actual no és correcta, canvieu l\'URL a la barra d\'adreces del navegador i reinicieu la instal·lació.';
|
||||
$string['pathsunsecuredataroot'] = 'La ubicació del dataroot no és segura.';
|
||||
$string['pathswrongadmindir'] = 'No existeix el directori d\'administració';
|
||||
$string['phpextension'] = 'Extensió PHP {$a}';
|
||||
@@ -84,7 +84,7 @@ $string['phpversionhelp'] = '<p>Moodle necessita una versió de PHP 4.3.0 o 5.1.
|
||||
<p>Us cal actualitzar el PHP o traslladar Moodle a un ordinador amb una versió de PHP més recent.<br />(Si esteu utilitzant la versió 5.0.x, alternativament també podríeu tornar enrere a la 4.4.x)</p>';
|
||||
$string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
|
||||
$string['welcomep20'] = 'Esteu veient aquesta pàgina perquè heu instal·lat amb èxit i heu executat el paquet <strong>{$a->packname} {$a->packversion}</strong>. Felicitacions.';
|
||||
$string['welcomep30'] = 'Aquesta versió de <strong>{$a->installername}</strong> inclou les aplicacions necessàries per crear un entorn en el qual funcioni <strong>Moodle</strong>:';
|
||||
$string['welcomep30'] = 'Aquesta versió de <strong>{$a->installername}</strong> inclou les aplicacions necessàries per crear un entorn en el qual funcioni <strong>Moodle</strong>, concretament:';
|
||||
$string['welcomep40'] = 'El paquet inclou també <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
|
||||
$string['welcomep50'] = 'L\'ús de totes les aplicacions d\'aquest paquet és governat per les seves llicències respectives. El paquet <strong>{$a->installername}</strong> complet és
|
||||
<a href="http://www.opensource.org/docs/definition_plain.html">codi font obert</a> i es distribueix
|
||||
|
||||
@@ -30,5 +30,6 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['parentlanguage'] = '';
|
||||
$string['thisdirection'] = 'ltr';
|
||||
$string['thislanguage'] = 'Català';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Idioma';
|
||||
$string['moodlelogo'] = 'Logotip de Moodle';
|
||||
$string['next'] = 'Següent';
|
||||
$string['previous'] = 'Anterior';
|
||||
$string['reload'] = 'Torna a carregar';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'زمان';
|
||||
$string['moodlelogo'] = 'لۆگۆی موودڵ';
|
||||
$string['next'] = 'دواتر';
|
||||
$string['previous'] = 'پێشوو';
|
||||
$string['reload'] = 'بارکردنەوە';
|
||||
|
||||
@@ -69,9 +69,15 @@ $string['pathshead'] = 'Potvrdit cesty';
|
||||
$string['pathsrodataroot'] = 'Do datového adresáře nelze zapisovat.';
|
||||
$string['pathsroparentdataroot'] = 'Do nadřazeného adresáře ({$a->parent}) nelze zapisovat. Datový adresář ({$a->dataroot}) nemůže být tímto průvodcem instalací vytvořen.';
|
||||
$string['pathssubadmindir'] = 'Na některých serverech je URL adresa /admin vyhrazena pro speciální účely (např. pro ovládací panel). Na takových serverech může dojít ke kolizi se standardním umístěním stránek pro správu Moodle. Máte-li tento problém, přejmenujte adresář <eM>admin</em> ve vaší instalaci Moodle a sem zadejte jeho nový název - například <em>moodleadmin</em>. Všechny generované odkazy na stránky správy Moodle budou používat tento nový název.';
|
||||
$string['pathssubdataroot'] = 'Moodle potřebuje prostor, kam si bude ukládat nahrané soubory a další údaje. K tomuto adresáři musí mít proces webového serveru právo ke čtení i k zápisu (webový server bývá většinou spouštěn pod uživatelem "www-data" nebo "apache"). Tento adresář ale zároveň nesmí být dostupný přímo přes webové rozhraní. Instalační skript se pokusí tento adresář vytvořit, pokud nebude existovat.';
|
||||
$string['pathssubdataroot'] = '<p>Moodle potřebuje prostor, kam si bude ukládat nahrané soubory a další údaje. .</p>
|
||||
<p>K tomuto adresáři musí mít proces webového serveru právo ke čtení i k zápisu (webový server bývá většinou spouštěn pod uživatelem "www-data" nebo "apache"). .</p>
|
||||
<p>Tento adresář ale zároveň nesmí být dostupný přímo přes webové rozhraní. .</p>
|
||||
<p>Instalační skript se pokusí tento adresář vytvořit, pokud nebude existovat..</p>';
|
||||
$string['pathssubdirroot'] = 'Absolutní cesta k adresáři s instalací Moodle';
|
||||
$string['pathssubwwwroot'] = 'Zadejte úplnou webovou adresu, na níž bude Moodle dostupný. Moodle potřebuje jedinečnou adresu, není možné jej provozovat na několika URL současně. Používáte-li několik veřejných domén, musíte si sami nastavit permanentní přesměrování na jednu z nich a tu pak použít. Pokud je váš server dostupný z vnější a z vnitřní sítě pod různými IP adresami, použijte jeho veřejnou adresu a nastavte si váš DNS server tak, že ji mohou používat i uživatelé z vnitřní sítě.';
|
||||
$string['pathssubwwwroot'] = '<p>Zadejte úplnou webovou adresu, na níž bude Moodle dostupný, t.j. adresa, kterou zadají uživatelé do adresního řádku svého prohlížeče, aby spustili Moodle.</p>
|
||||
<p>Moodle potřebuje jedinečnou adresu, není možné jej provozovat na několika URL současně. Používáte-li několik veřejných domén, musíte si sami nastavit permanentní přesměrování na jednu z nich a tu pak použít.</p>
|
||||
<p> Pokud je váš server dostupný z vnější a z vnitřní sítě pod různými IP adresami, použijte jeho veřejnou adresu a nastavte si váš DNS server tak, že ji mohou používat i uživatelé z vnitřní sítě.</p>
|
||||
<p>Pokud aktuální adresa není správná, změňte URL adresu v adresním řádku prohlížeče a spusťte instalaci.</p>';
|
||||
$string['pathsunsecuredataroot'] = 'Umístění datového adresáře není bezpečné';
|
||||
$string['pathswrongadmindir'] = 'Adresář pro správu serveru (admin) neexistuje';
|
||||
$string['phpextension'] = '{$a} PHP rozšíření';
|
||||
@@ -82,7 +88,7 @@ $string['phpversionhelp'] = '<p>Moodle vyžaduje PHP alespoň verze 4.3.0 nebo 5
|
||||
(U PHP 5.0.x můžete také přejít na nižší verzi 4.4.x )</p>';
|
||||
$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'] = '<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['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['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.';
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['cannotcreatedboninstall'] = '<p>Kan ikke oprette databasen.</p> <p>Den specificerede database eksisterer ikke og brugeren har ikke tilladelse til at oprette den.</p> <p>Administrator bør verificere databasekonfigurationen.</p>';
|
||||
$string['cannotcreatelangdir'] = 'Kan ikke oprette sprogmappe';
|
||||
$string['cannotcreatetempdir'] = 'Kan ikke oprette temp-mappe';
|
||||
$string['cannotdownloadcomponents'] = 'Kan ikke downloade komponenter';
|
||||
@@ -39,9 +40,11 @@ $string['cannotsavemd5file'] = 'Kan ikke gemme md5-fil';
|
||||
$string['cannotsavezipfile'] = 'Kan ikke gemme zip-fil';
|
||||
$string['cannotunzipfile'] = 'Kan ikke pakke filen ud';
|
||||
$string['componentisuptodate'] = 'Komponenten er ajour';
|
||||
$string['downloadedfilecheckfailed'] = 'Downloadet fil-tjek fejlede';
|
||||
$string['dmlexceptiononinstall'] = '<p>En databasefejl er opstået [{$a->errorcode}].<br />{$a->debuginfo}</p>';
|
||||
$string['downloadedfilecheckfailed'] = 'Downloadet fil-tjek mislykkedes';
|
||||
$string['invalidmd5'] = 'Tjekvariablen var forkert - prøv igen';
|
||||
$string['missingrequiredfield'] = 'Der mangler nogle obligatoriske felter';
|
||||
$string['remotedownloaderror'] = '<p>Download af komponenten til din server mislykkedes. Verificer proxy-indstillilngerne, udvidelsen PHP cURL anbefales kraftigt. </p> <p>Du skal downloade filen <a href="{$a->url}">{$a->url}</a> manuelt, kopiere den til "{$a->dest}" på din server og udpakke den der.</p>';
|
||||
$string['wrongdestpath'] = 'Forkert destinationssti';
|
||||
$string['wrongsourcebase'] = 'Forkert kilde-URL';
|
||||
$string['wrongzipfilename'] = 'Forkert zip-filnavn';
|
||||
|
||||
@@ -34,13 +34,15 @@ $string['admindirname'] = 'Admin-mappe';
|
||||
$string['availablelangs'] = 'Tilgængelige sprogpakker';
|
||||
$string['chooselanguagehead'] = 'Vælg et sprog';
|
||||
$string['chooselanguagesub'] = 'Vælg et sprog til brug under installationen. Dette sprog vil også blive brugt som standardsprog på webstedet, men det kan altid ændres til et andet sprog.';
|
||||
$string['clialreadyconfigured'] = 'Konfigurationsfilen config.php eksisterer allerede. Benyt venigst admin/cli/install_database.php til at installere Moodle for dette site.';
|
||||
$string['clialreadyinstalled'] = 'Filen config.php eksisterer allerede, brug venligst admin/cli/upgrade.php hvis du ønsker at opgradere dette websted.';
|
||||
$string['cliinstallheader'] = 'Moodle {$a} kommandolinje-installationsprogram';
|
||||
$string['databasehost'] = 'Databasevært';
|
||||
$string['databasename'] = 'Databasenavn';
|
||||
$string['databasetypehead'] = 'Vælg databasedriver';
|
||||
$string['dataroot'] = 'Datamappe';
|
||||
$string['dbprefix'] = 'Præfix for tabeller';
|
||||
$string['datarootpermission'] = 'Rettighed til datamapper';
|
||||
$string['dbprefix'] = 'Præfiks til tabeller';
|
||||
$string['dirroot'] = 'Moodle-mappe';
|
||||
$string['environmenthead'] = 'Kontrollerer din serveropsætning...';
|
||||
$string['environmentsub2'] = 'Hver version af Moodle har nogle minimumskrav til PHP-version og nogle obligatoriske PHP-extensions.
|
||||
@@ -70,13 +72,14 @@ $string['pathshead'] = 'Bekræft stier';
|
||||
$string['pathsrodataroot'] = 'Datamappen er skrivebeskyttet.';
|
||||
$string['pathsroparentdataroot'] = 'Den overordnede mappe ({$a->parent}) er skrivebeskyttet. Datamappen ({$a->dataroot}) kan ikke oprettes af installationsprogrammet.';
|
||||
$string['pathssubadmindir'] = 'Enkelte webhoteller bruger /admin som speciel URL til kontrolpanelet el. lign. Desværre konflikter det med Moodles standardplacering af admin-sider. Du kan klare dette ved at give admin-mappen et andet navn i din installation og skrive det her. Det kan f.eks. være <em>moodleadmin</em>. Det vil fikse admin-links i Moodle.';
|
||||
$string['pathssubdataroot'] = 'Du har brug for et sted, hvor Moodle kan gemme uploadede filer. Denne mappe skal kunne læses OG SKRIVES I af webserverbrugeren (oftest \'ingen\' eller \'apache\'), men må ikke være tilgængelig direkte via internettet. Installationsprogrammet vil forsøge at oprette mappen, hvis ikke den allerede eksisterer.';
|
||||
$string['pathssubdirroot'] = 'Den fulde sti til Moodleinstallationen.';
|
||||
$string['pathssubwwwroot'] = 'Moodles fulde web-adresse.
|
||||
Det er ikke muligt at komme ind på Moodle fra mere end en adresse.
|
||||
Hvis dit websted har flere offentlige adresser skal du opsætte permanent viderestilling til dem alle undtagen denne.
|
||||
Hvis dit websted er tilgængeligt fra både internet og intranet skal du bruge internetadressen her og opsætte din DNS sådan at intranet-brugerne kan bruge den offentlige adresse også.
|
||||
Hvis ikke adressen er korrekt må du ændre URL\'en i din browser og genstarte installationen med den rigtige adresse.';
|
||||
$string['pathssubdataroot'] = '<p>En mappe hvori Moodle kan gemme alle brugeres uploadede filer.</p>
|
||||
<p>Mappen skal både have læse- og skriveadgang Webserver-brugeren (som regel \'www-data\', \'nobody\', eller \'apache\') skal have både læse- og skriveadgang til den.</p>
|
||||
<p>Mappen må ikke have direkte adgang fra internettet.</p>
|
||||
<p>Installationsprogrammet vil forsøge at oprette mappen, hvis ikke den findes i forvejen.</p>';
|
||||
$string['pathssubdirroot'] = '<p>Den fulde sti til mappen med Moodles kode.</p>';
|
||||
$string['pathssubwwwroot'] = '<p>Moodles fulde web-adresse, dvs. den adresse brugere skal indtaste i browserens adressefelt for at få adgang til Moodle.</p>
|
||||
<p>Det er ikke muligt at komme ind på Moodle fra mere end en adresse. Er dit site tilgængeligt via flere adresser skal du vælge den letteste og opsætte en permanent viderestilling til hver af de andre adresser.</p> <p>Er dit site tilgængeligt fra både internettet og et internt netværk (ofte kaldet intranet), brug da den offentlige adresse her.</p>
|
||||
<p>Hvis ikke den aktuelle adresse er korrekt, skal du rette URL\'en i din browsers adressefelt og genstarte installationen.</p>';
|
||||
$string['pathsunsecuredataroot'] = 'Datamappen er ikke sikret';
|
||||
$string['pathswrongadmindir'] = 'Adminmappe eksisterer ikke';
|
||||
$string['phpextension'] = '{$a} PHP-extension';
|
||||
@@ -91,6 +94,6 @@ Tillykke med det!';
|
||||
$string['welcomep30'] = 'Denne udgave af <strong>{$a->installername}</strong> indeholder programmerne til at oprette et miljø, hvori <strong>Moodle</strong> vil operere, nemlig:';
|
||||
$string['welcomep40'] = 'Pakken indeholder også <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
|
||||
$string['welcomep50'] = 'Brugen af programmerne i denne pakke er styret af deres respektive licenser. Hele <strong>{$a->installername}</strong>-pakken er <a href="http://www.opensource.org/docs/definition_plain.html">open source</a> og distribueret under <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a>-licensen.';
|
||||
$string['welcomep60'] = 'De følgende sider vil hjælpe dig gennem nogle nemme trin til konfiguration og opsætning af <strong>Moodle</strong> på din computer. Du kan acceptere standardindstillingerne eller vælge at ændre dem så de bedre svarer til dine egne behov.';
|
||||
$string['welcomep60'] = 'De følgende sider vil hjælpe dig gennem nogle nemme trin til konfiguration og opsætning af <strong>Moodle</strong> på din computer. Du kan acceptere standardindstillingerne eller, hvis du foretrækker det, vælge at ændre dem så de bedre svarer til dine egne behov.';
|
||||
$string['welcomep70'] = 'Klik på "Næste" herunder for at forsætte opsætningen af <strong>Moodle</strong>.';
|
||||
$string['wwwroot'] = 'Webadresse';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Sprog';
|
||||
$string['moodlelogo'] = 'Moodlelogo';
|
||||
$string['next'] = 'Næste';
|
||||
$string['previous'] = 'Forrige';
|
||||
$string['reload'] = 'Genindlæs';
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* 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'] = 'da';
|
||||
$string['thisdirection'] = 'ltr';
|
||||
$string['thislanguage'] = 'Dansk Rum';
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'སྐད་ཡིག།';
|
||||
$string['moodlelogo'] = 'Moodle ལས་རྟགས།';
|
||||
$string['next'] = 'ཤུལ་མམ';
|
||||
$string['previous'] = 'ཧེ་མམ';
|
||||
$string['reload'] = 'ཡང་བསྐྱར་མངོན་གསལ་འབད';
|
||||
|
||||
@@ -90,7 +90,7 @@ $string['phpversionhelp'] = '<p>Moodle requiere al menos una versión de PHP 4.3
|
||||
<p>¡Debe actualizar PHP o trasladarse a otro servidor con una versión más reciente de PHP!<br />
|
||||
(En caso de 5.0.x podría también revertir a la versión 4.4.x)</p>';
|
||||
$string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
|
||||
$string['welcomep20'] = 'Si está viendo esta página es porque ha podido ejecutar el paquete <strong>{$a->packname} {$a->packversion}</strong> en su computadora. !Enhorabuena!';
|
||||
$string['welcomep20'] = 'Si está viendo esta página es porque ha podido instalar y ejecutar exitosamente el paquete <strong>{$a->packname} {$a->packversion}</strong> en su computadora. !Enhorabuena!';
|
||||
$string['welcomep30'] = 'Esta versión de <strong>{$a->installername}</strong> incluye las aplicaciones necesarias para que <strong>Moodle</strong> funcione en su computadora, principalmente:';
|
||||
$string['welcomep40'] = 'El paquete también incluye <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
|
||||
$string['welcomep50'] = 'El uso de todas las aplicaciones del paquete está gobernado por sus respectivas
|
||||
|
||||
@@ -30,4 +30,5 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['cannotfindcomponent'] = 'کامپوننت پیدا نشد';
|
||||
$string['missingrequiredfield'] = 'بعضی از فیلدهای ضروری خالی است';
|
||||
|
||||
@@ -34,6 +34,8 @@ $string['admindirname'] = 'دایرکتوری مدیر';
|
||||
$string['availablelangs'] = 'بستههای زبانی موجود';
|
||||
$string['chooselanguagehead'] = 'انتخاب زبان';
|
||||
$string['chooselanguagesub'] = 'لطفاً زبانی را به جهت استفاده در حین نصب انتخاب نمائید. زبان سایت و کاربر را در صفحهای دیگر میتوانید انتخاب کنید.';
|
||||
$string['databasehost'] = 'میزبان پایگاه داده';
|
||||
$string['databasename'] = 'نام پایگاه داده';
|
||||
$string['dataroot'] = 'دایرکتوری داده';
|
||||
$string['dbprefix'] = 'پیشوند جدولها';
|
||||
$string['dirroot'] = 'دایرکتوری مودل';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'زبان';
|
||||
$string['moodlelogo'] = 'لوگوی مودل';
|
||||
$string['next'] = 'ادامه';
|
||||
$string['previous'] = 'قبلی';
|
||||
$string['reload'] = 'بررسی مجدد';
|
||||
|
||||
@@ -40,5 +40,5 @@ $string['cliunknowoption'] = 'Options non reconnues :
|
||||
{$a}.
|
||||
Utilisez l\'option --help.';
|
||||
$string['cliyesnoprompt'] = 'Tapez y (pour oui) ou n (pour non)';
|
||||
$string['environmentrequireinstall'] = 'doit être installé et activé';
|
||||
$string['environmentrequireversion'] = 'la version {$a->needed} est requise ; vous utilisez actuellement la version {$a->current}';
|
||||
$string['environmentrequireinstall'] = 'L\'extension doit être installée et activée';
|
||||
$string['environmentrequireversion'] = 'La version {$a->needed} est requise ; vous utilisez actuellement la version {$a->current}';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Idioma';
|
||||
$string['moodlelogo'] = 'Logotipo de Moodle';
|
||||
$string['next'] = 'Seguinte';
|
||||
$string['previous'] = 'Anterior';
|
||||
$string['reload'] = 'Cargar de novo';
|
||||
|
||||
@@ -41,5 +41,5 @@ $string['cliunknowoption'] = 'אפשרויות לא מוכרות :
|
||||
{$a}
|
||||
אנא השתמש באפשרות העזרה.';
|
||||
$string['cliyesnoprompt'] = 'רשום y (שפרושו כן) או n (שפרושו לא)';
|
||||
$string['environmentrequireinstall'] = 'נדרש להתקין/לאפשר זאת';
|
||||
$string['environmentrequireversion'] = 'גירסת {$a->needed} נדרשת ואתה מריץ {$a->current}';
|
||||
$string['environmentrequireinstall'] = 'נדרש להתקין ולאפשר הרחבה זו';
|
||||
$string['environmentrequireversion'] = 'גירסה {$a->needed} נדרשת אך הגירסה הנוכחית היא {$a->current}';
|
||||
|
||||
@@ -86,10 +86,10 @@ $string['pathsunsecuredataroot'] = 'ספריית המידע (Data Directory) ל
|
||||
$string['pathswrongadmindir'] = 'ספריית ה-admin לא קיימת';
|
||||
$string['phpextension'] = 'הרחבת PHP {$a}';
|
||||
$string['phpversion'] = 'גירסת PHP';
|
||||
$string['phpversionhelp'] = '<p>גרסת PHP חייבת להיות לפחות 4.3.0 או 5.1.0 (בגרסאות 5.0.x קיימות מספר בעיות ידועות) </p>
|
||||
$string['phpversionhelp'] = '<p>גרסת PHP חייבת להיות לפחות 4.3.0 או 5.1.0 (בגרסאות 5.0 קיימות מספר בעיות ידועות) </p>
|
||||
<p> במערכת שלך פועלת כרגע גרסת {$a} </p>
|
||||
<p> אתה חייב לשדרג את גרסת ה-PHP שלך או לעבור למחשב מארח עם עם גירסת PHP חדשה! <br/>
|
||||
(במקרים של גרסת 5.0.x תוכל גם לרדת בגרסה ל- 4.4.x)
|
||||
(במקרים של גרסת 5.0 תוכל גם לרדת בגרסה ל- 4.4)
|
||||
</p>';
|
||||
$string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
|
||||
$string['welcomep20'] = 'הינך רואה את עמוד זה מפני שהתקנת והפעלת בהלכה את <strong>{$a->packname} {$a->packversion}</strong>
|
||||
|
||||
@@ -33,4 +33,4 @@ defined('MOODLE_INTERNAL') || die();
|
||||
$string['language'] = 'שפת ממשק';
|
||||
$string['next'] = 'הבא';
|
||||
$string['previous'] = 'קודם';
|
||||
$string['reload'] = 'טען מחדש';
|
||||
$string['reload'] = 'טעינה מחדש';
|
||||
|
||||
@@ -32,5 +32,8 @@ defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['clianswerno'] = 'ոչ';
|
||||
$string['cliansweryes'] = 'այո';
|
||||
$string['cliincorrectvalueerror'] = 'Սխալ, "{$a->value}"-ը ոչ ճիշտ արժեք է "{$a->option}"-ի համար';
|
||||
$string['cliincorrectvalueretry'] = 'Ոչ ճիշտ արժեք, կրկին փորձեք';
|
||||
$string['cliyesnoprompt'] = 'Մեքենագրեք y (նշանակում է այո) կամ n (նշանակում է ոչ):';
|
||||
$string['environmentrequireinstall'] = 'անհրաժեշտ է, որպեսզի տեղակայված և թույլատրված լինի';
|
||||
$string['environmentrequireversion'] = 'պահանջվում է {$a->needed} տարբերակը, դուք գործարկում եք՝ {$a->current}';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Լեզու';
|
||||
$string['moodlelogo'] = 'Moodle-ի լոգոտիպ';
|
||||
$string['next'] = 'Հաջորդը';
|
||||
$string['previous'] = 'Նախորդը';
|
||||
$string['reload'] = 'Վերաբեռնել';
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* 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['thislanguage'] = 'Taqbaylit';
|
||||
@@ -0,0 +1,33 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* 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['thislanguage'] = 'Malagasy';
|
||||
@@ -0,0 +1,34 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* 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'] = '';
|
||||
$string['thislanguage'] = 'Crnogorski';
|
||||
@@ -31,5 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Јазик';
|
||||
$string['moodlelogo'] = 'Moodle лого';
|
||||
$string['next'] = 'Следно';
|
||||
$string['previous'] = 'Претходно';
|
||||
$string['reload'] = 'Вчитај повторно';
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* 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['paths'] = 'ठेगानाहरु';
|
||||
@@ -0,0 +1,33 @@
|
||||
<?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/>.
|
||||
|
||||
/**
|
||||
* 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['next'] = 'अर्को';
|
||||
@@ -66,7 +66,9 @@ $string['pathshead'] = 'Bekreft stier';
|
||||
$string['pathsrodataroot'] = 'Dataroot katalog er ikke skrivbar.';
|
||||
$string['pathsroparentdataroot'] = 'Overordnet katalog ({$a->parent}) er ikke skrivbar. Datakatalogen ({$a->dataroot}) kan ikke opprettes av installasjonsprogrammet.';
|
||||
$string['pathssubadmindir'] = 'Noen ganske få webhoteller bruker /admin som en egen url for å få tilgang til et kontrollpanel. Dessverre kommer det i konflikt med standard lokalisering av Moodle sine admin-sider. Du kan fikse dette ved å endre navn på admin-mappen og deretter oppgi dette navnet her. F.eks. <em>moodleadmin</em>. Dette vil fikse adminlenkene i Moodle.';
|
||||
$string['pathssubdataroot'] = 'Du trenger et sted hvor Moodle kan lagre opplastede filer. Denne mappen må være med lese og skriverettigheter for webserver-brukeren (veldig ofte \'nobody\' eller \'apache\'), men denne mappen må IKKE være direkte tilgjengelig via web. Installasjonsprogrammet vil forsøke å opprette den om den ikke finnes fra før.';
|
||||
$string['pathssubdataroot'] = '<p>En mappe der Moodle vil lagre alle filer lastet opp av brukerne.</p>
|
||||
<p>Denne mappen må være med lese og skriverettigheter for webserver-brukeren (vanligvis \'www-data\', \'nobody\' eller \'apache\').</p>
|
||||
<p>Denne mappen må IKKE være direkte tilgjengelig via web.</p> <p>Installasjonsprogrammet vil forsøke å opprette den om den ikke finnes fra før.</p>';
|
||||
$string['pathssubdirroot'] = '<p>Full mappesti til moodleinstallasjonen.</p>';
|
||||
$string['pathssubwwwroot'] = '<p>Full webadresse til der hvor Moodle skal vises, altså den addressen som brukere skriver inn i adresselinjen i nettlseren sin.</p>
|
||||
<p>Det er ikke mulig å bruke Moodle med mer enn en adresse. Dersom portalen din har flere webadresser bør du oppgi den enkleste av de her, og bruke videresending for hver av de andre adressene.</p>
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['cannotcreatedboninstall'] = '<p>Impossible de crear la banca de donadas.</p>
|
||||
<p>La banca de donadas indicada existís pas e l\'utilizaire especificat a pas las autorizacions que permeton de crear una banca de donadas.</p>.
|
||||
<p>L\'administrator del site deu repassar la configuracion de la banca de donadas.</p>';
|
||||
$string['cannotcreatedboninstall'] = '<p>Impossible de crear la basa de donadas.</p>
|
||||
<p>La banca de donadas indicada existís pas e l\'utilizaire especificat a pas las autorizacions que permeton de crear una basa de donadas.</p>.
|
||||
<p>L\'administrator del site deu repassar la configuracion de la basa de donadas.</p>';
|
||||
$string['cannotcreatelangdir'] = 'Creacion del dorsièr lang impossible';
|
||||
$string['cannotcreatetempdir'] = 'Creacion del dorsièr temp impossibla';
|
||||
$string['cannotdownloadcomponents'] = 'Telecargament dels components impossible';
|
||||
@@ -42,12 +42,12 @@ $string['cannotsavemd5file'] = 'Enregistrament del fichièr md5 impossible';
|
||||
$string['cannotsavezipfile'] = 'Enregistrament del fichièr ZIP impossible';
|
||||
$string['cannotunzipfile'] = 'Descompression del fichièr ZIP impossibla';
|
||||
$string['componentisuptodate'] = 'Lo component es a jorn';
|
||||
$string['dmlexceptiononinstall'] = '<p>Una error de banca de donadas s\'es producha [{$a->errorcode}].<br />{$a->debuginfo}</p>';
|
||||
$string['dmlexceptiononinstall'] = '<p>Una error de basa de donadas s\'es produita [{$a->errorcode}].<br />{$a->debuginfo}</p>';
|
||||
$string['downloadedfilecheckfailed'] = 'La verificacion del fichièr telecargat a fracassat';
|
||||
$string['invalidmd5'] = 'Lo còde de contraròtle md5 es pas valid';
|
||||
$string['invalidmd5'] = 'Lo còdi de contraròtle md5 es pas valid';
|
||||
$string['missingrequiredfield'] = 'Un camp obligatòri es pas completat';
|
||||
$string['remotedownloaderror'] = '<p>Lo telecargament del component sus vòstre servidor a fracassat. Verificatz los reglatges de proxy. L\'extension cURL de PHP es bravament recomandada.</p>
|
||||
<p>Vos cal telecargar manualament lo fichièr <a href="{$a->url}">{$a->url}</a>, lo copiar sus vòstre servidor a l\'emplaçament « {$a->dest} » e lo descompressar a aqueste endrech.</p>';
|
||||
<p>Vos cal telecargar manualament lo fichièr <a href="{$a->url}">{$a->url}</a>, lo copiar sus vòstre servidor a l\'emplaçament « {$a->dest} » e lo descompressar a aqueste endreit.</p>';
|
||||
$string['wrongdestpath'] = 'Camin de destinacion incorrècte';
|
||||
$string['wrongsourcebase'] = 'Adreça URL de basa de la font incorrècta';
|
||||
$string['wrongzipfilename'] = 'Nom de fichièr ZIP incorrècte';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Lenga';
|
||||
$string['moodlelogo'] = 'Lògo Moodle';
|
||||
$string['next'] = 'Seguent';
|
||||
$string['previous'] = 'Precedent';
|
||||
$string['reload'] = 'Actualizar';
|
||||
|
||||
@@ -44,7 +44,7 @@ $string['dmlexceptiononinstall'] = '<p>Ocorreu um erro de base de dados [{$a->er
|
||||
$string['downloadedfilecheckfailed'] = 'A verificação do ficheiro descarregado falhou.';
|
||||
$string['invalidmd5'] = 'A variável de verificação está errada - tente novamente.';
|
||||
$string['missingrequiredfield'] = 'Um dos campos obrigatórios está em falta';
|
||||
$string['remotedownloaderror'] = 'O download do componente para o servidor falhou. Verifique as configurações do proxy. A instalação da extensão cURL do PHP é muito recomendada.<br /><br />Terá de fazer manualmente o download do ficheiro <a href="{$a->url}">{$a->url}</a>, copiá-lo para a pasta "{$a->dest}" no seu servidor e descompactá-lo';
|
||||
$string['remotedownloaderror'] = 'Não foi possível descarregar o componente para o servidor. Verifique as configurações do proxy. A instalação da extensão cURL do PHP é muito recomendada.<br /><br />Terá de descarregar manualmente o ficheiro <a href="{$a->url}">{$a->url}</a>, copiá-lo para a pasta "{$a->dest}" no seu servidor e descompactá-lo';
|
||||
$string['wrongdestpath'] = 'Caminho de destino errado';
|
||||
$string['wrongsourcebase'] = 'Base do URL de origem errada';
|
||||
$string['wrongzipfilename'] = 'Nome de ficheiro ZIP errado';
|
||||
|
||||
@@ -48,13 +48,13 @@ $string['environmenthead'] = 'A verificar sistema...';
|
||||
$string['environmentsub2'] = 'Cada nova versão do Moodle tem pré-requisitos mínimos relativamente à versão do PHP e extensões necessárias para o seu correto funcionamento. Estes pré-requisitos são verificados sempre que o Moodle é instalado ou atualizado. Contacte o administrador do servidor caso seja necessário atualizar a versão do PHP ou instalar novas extensões.';
|
||||
$string['errorsinenvironment'] = 'A verificação do sistema falhou!';
|
||||
$string['installation'] = 'Instalação';
|
||||
$string['langdownloaderror'] = 'Não foi possível instalar o idioma <b>{$a}</b> por falha no download. O processo de instalação continuará em Inglês.';
|
||||
$string['langdownloaderror'] = 'Não foi possível descarregar o idioma <b>{$a}</b> . O processo de instalação continuará em Inglês.';
|
||||
$string['memorylimithelp'] = '<p>O limite de memória para o PHP definido atualmente no servidor é <b>{$a}</b>.</p><p>Um número elevado de módulos em utilização ou de utilizadores registados pode fazer com que o Moodle apresente problemas de falta de memória.</p><p>É recomendado que o PHP seja configurado com um limite de memória de pelo menos 40MB. Esta configuração pode ser definida de diversas formas:</p><ol><li>Compilação do PHP com o parâmetro <b>--enable-memory-limit</b>. Esta definição permitirá ao próprio Moodle definir o valor a utilizar.</li><li>Alteração do parâmetro <b>memory_limit</b> no ficheiro de configuração do PHP para um valor igual ou superior a 40MB.</li><li>Criação de um ficheiro <b>.htaccess</b> na raiz da pasta do Moodle com a linha <b>php_value memory_limit 40M</b><p>ATENÇÃO: Em alguns servidores esta configuração impedirá o funcionamento de <b>todas</b> as páginas PHP. Nestes casos, não poderá ser utilizado o ficheiro <b>.htaccess</b>.</p></li></ol>';
|
||||
$string['paths'] = 'Caminhos';
|
||||
$string['pathserrcreatedataroot'] = 'O programa de instalação não conseguiu criar a pasta de dados <b>{$a->dataroot}</b>.';
|
||||
$string['pathshead'] = 'Confirmar caminhos';
|
||||
$string['pathsrodataroot'] = 'A pasta de dados não tem permissões de escrita.';
|
||||
$string['pathsroparentdataroot'] = 'A pasta pai <b>{$a->parent}</b> não tem permissões de escrita. O programa de instalação não conseguiu criar a pasta <b>{$a->dataroot}</b>.';
|
||||
$string['pathsroparentdataroot'] = 'A pasta ascendente <b>{$a->parent}</b> não tem permissões de escrita. O programa de instalação não conseguiu criar a pasta <b>{$a->dataroot}</b>.';
|
||||
$string['pathssubadmindir'] = 'Alguns servidores Web utilizam a pasta <strong>admin</strong> em URLs especiais de acesso a funcionalidades especiais, como é o caso de painéis de controlo. Algumas situações podem criar conflitos com a localização normal das páginas de administração do Moodle. Estes problemas podem ser resolvidos renomeando a pasta <strong>admin</strong> na instalação do Moodle e indicando aqui o novo nome a utilizar. Por exemplo:<br /><br /><b>moodleadmin</b><br /><br />Esta ação resolverá os problemas de acesso das hiperligações para as funcionalidades de administração do Moodle.';
|
||||
$string['pathssubdataroot'] = '<p>Uma diretoria em que o Moodle irá armazenar todo o conteúdo de ficheiros enviados pelos utilizadores.</p>
|
||||
<p>Esta diretoria deve ser legível e gravável pelo utilizador do servidor web (geralmente \'www-data\', \'nobody\', ou \'apache\').</p>
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Idioma';
|
||||
$string['moodlelogo'] = 'Logotipo Moodle';
|
||||
$string['moodlelogo'] = 'Logótipo Moodle';
|
||||
$string['next'] = 'Seguinte';
|
||||
$string['previous'] = 'Anterior';
|
||||
$string['reload'] = 'Recarregar';
|
||||
|
||||
@@ -34,7 +34,7 @@ $string['clianswerno'] = 'n';
|
||||
$string['cliansweryes'] = 's';
|
||||
$string['cliincorrectvalueerror'] = 'Erro, valor incorreto "{$a->value}" para "{$a->option}"';
|
||||
$string['cliincorrectvalueretry'] = 'Valor incorreto, por favor tente novamente';
|
||||
$string['clitypevalue'] = 'Digite o valor';
|
||||
$string['clitypevalue'] = 'digite o valor';
|
||||
$string['clitypevaluedefault'] = 'digite o valor, pressione Enter para utilizar o valor padrão ({$a})';
|
||||
$string['cliunknowoption'] = 'Opções não reconhecidas:
|
||||
{$a}
|
||||
|
||||
@@ -42,6 +42,7 @@ $string['cannotsavemd5file'] = 'Fişierul md5 nu poate fi salvat';
|
||||
$string['cannotsavezipfile'] = 'Arhiva ZIP nu poate fi salvată';
|
||||
$string['cannotunzipfile'] = 'Arhiva nu poate fi deschisă';
|
||||
$string['componentisuptodate'] = 'Componenta este actualizată';
|
||||
$string['dmlexceptiononinstall'] = '<p>A apărut o problemă la baza de date [{$a->errorcode}].<br />{$a->debuginfo}</p>';
|
||||
$string['downloadedfilecheckfailed'] = 'Verificarea fişierului descărcat a eşuat';
|
||||
$string['invalidmd5'] = 'md5 incorect';
|
||||
$string['missingrequiredfield'] = 'Lipseşte un câmp obligatoriu';
|
||||
|
||||
@@ -36,6 +36,7 @@ $string['chooselanguagehead'] = 'Selectare limbă';
|
||||
$string['chooselanguagesub'] = 'Vă rugăm selectaţi limba pentru interfaţa de instalare, limba selectată va fi folosită EXCLUSIV în cadrul procedurii de instalare. Ulterior veţi putea selecta limba în care doriţi să fie afişată interfaţa.';
|
||||
$string['clialreadyconfigured'] = 'Fișierul de configurare';
|
||||
$string['clialreadyinstalled'] = 'Fișierul de configurare config.php există deja. Vă rugăm să folosiți dmin/cli/install_database.php to pentru a upgrada Moodle pentru acest site.';
|
||||
$string['cliinstallheader'] = 'Program command line installation Moodle {$a}';
|
||||
$string['databasehost'] = 'Gazdă baza de date';
|
||||
$string['databasename'] = 'Nume baza de date';
|
||||
$string['databasetypehead'] = 'Alegere driver baza de date';
|
||||
@@ -44,9 +45,13 @@ $string['datarootpermission'] = 'Permisiuni directoare date';
|
||||
$string['dbprefix'] = 'Prefix tabele';
|
||||
$string['dirroot'] = 'Director Moodle';
|
||||
$string['environmenthead'] = 'Se verifică mediul...';
|
||||
$string['environmentsub2'] = 'Fiecare versiune Moodle are o anumită cerință minimă PHP și un număr de extensii PHP obligatorii.
|
||||
Verificarea completă a mediului se face înainte de fiecare instalare și upgrade. Vă rugăm să contactați administratorul serverului, dacă nu știți cum se instalează noua versiune sau dacă activați extensiile PHP.';
|
||||
$string['errorsinenvironment'] = 'Verificarea mediului eșuată!';
|
||||
$string['installation'] = 'Instalare';
|
||||
$string['langdownloaderror'] = 'Din păcate, limba "{$a}" nu a putut fi descărcată. Procesul de instalare va continua în limba engleză.';
|
||||
$string['paths'] = 'Căi';
|
||||
$string['pathserrcreatedataroot'] = 'Data directory ({$a->dataroot}) nu poate fi creat de către installer.';
|
||||
$string['pathshead'] = 'Confirmare căi';
|
||||
$string['pathsrodataroot'] = 'Directorul dataroot nu poate fi scris.';
|
||||
$string['pathssubdirroot'] = '<p>Calea completă către directorul care conține codul Moodle .</p>';
|
||||
@@ -54,5 +59,12 @@ $string['pathsunsecuredataroot'] = 'Locația dataroot nu este sigură';
|
||||
$string['pathswrongadmindir'] = 'Directorul admin nu există';
|
||||
$string['phpextension'] = 'extensie PHP {$a}';
|
||||
$string['phpversion'] = 'Versiune PHP';
|
||||
$string['phpversionhelp'] = '<p>Moodle necesită o versiune PHP de cel puțin 4.3.0 or 5.1.0 (5.0.x are un număr de probleme cunscute).</p>
|
||||
<p>Momentan rulați versiunea {$a}</p>
|
||||
<p>Trebuie să upgradați PHP sau să îl mutați pe o gazdă cu o nouă versiune de PHP!<br />
|
||||
(În cazul 5.0.x puteți, de asemenea, să downgradați la versiunea 4.4.x)</p>';
|
||||
$string['welcomep10'] = '{$a->installername} ({$a->installerversion})';
|
||||
$string['welcomep20'] = 'Vedeți această pagină deoarece ați instalat și lansat cu succes pachetul <strong>{$a->packname} {$a->packversion}</strong> în computerul dumneavoastră. Felicitări!';
|
||||
$string['welcomep40'] = 'Pachetul include și <strong>Moodle {$a->moodlerelease} ({$a->moodleversion})</strong>.';
|
||||
$string['welcomep70'] = 'Click pe butonul "Next" de mai jos pentru a continua setarea <strong>Moodle</strong>.';
|
||||
$string['wwwroot'] = 'Adresă Web';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Язык';
|
||||
$string['moodlelogo'] = 'Логотип Moodle';
|
||||
$string['next'] = 'Далее';
|
||||
$string['previous'] = 'Назад';
|
||||
$string['reload'] = 'Обновить';
|
||||
|
||||
@@ -40,6 +40,7 @@ $string['databasehost'] = 'Gostitelj podatkovne baze';
|
||||
$string['databasename'] = 'Ime podatkovne baze';
|
||||
$string['databasetypehead'] = 'Izberite gonilnik podatkovne baze';
|
||||
$string['dataroot'] = 'Imenik za podatke';
|
||||
$string['datarootpermission'] = 'Pravice za podatkovno mapo';
|
||||
$string['dbprefix'] = 'Predpona tabel';
|
||||
$string['dirroot'] = 'Imenik Moodle';
|
||||
$string['environmenthead'] = 'Preverjanje vašega okolja ...';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Jezik';
|
||||
$string['moodlelogo'] = 'Logotip Moodle';
|
||||
$string['next'] = 'Naslednje';
|
||||
$string['previous'] = 'Prejšnje';
|
||||
$string['reload'] = 'Osveži';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Språk';
|
||||
$string['moodlelogo'] = 'Moodie-logotyp';
|
||||
$string['next'] = 'Nästa';
|
||||
$string['previous'] = 'Tidigare';
|
||||
$string['reload'] = 'Uppdatera';
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['language'] = 'Мова інтерфейсу';
|
||||
$string['moodlelogo'] = 'Логотип Moodle';
|
||||
$string['next'] = 'Далі';
|
||||
$string['previous'] = 'Назад';
|
||||
$string['reload'] = 'Оновити';
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['cannotcreatedboninstall'] = '<p>无法建立数据库</p>
|
||||
<p>指定数据库不存在。使用者没有权限建立数据库</p>
|
||||
<p>网站管理员需查明数据库状态.</p>';
|
||||
$string['cannotcreatelangdir'] = '无法创建 lang 目录。';
|
||||
$string['cannotcreatetempdir'] = '无法创建 temp 目录。';
|
||||
$string['cannotdownloadcomponents'] = '无法下载组件';
|
||||
|
||||
+6
-4
@@ -293,8 +293,8 @@ $string['configproxyport'] = 'If this server needs to use a proxy computer, then
|
||||
$string['configproxytype'] = 'Type of web proxy (PHP5 and cURL extension required for SOCKS5 support).';
|
||||
$string['configproxyuser'] = 'Username needed to access internet through proxy if required, empty if none (PHP cURL extension required).';
|
||||
$string['configquarantinedir'] = 'If you want clam AV to move infected files to a quarantine directory, enter it here. It must be writable by the webserver. If you leave this blank, or if you enter a directory that doesn\'t exist or isn\'t writable, infected files will be deleted. Do not include a trailing slash.';
|
||||
$string['configrecaptchaprivatekey'] = 'String of characters used to communicate between your Moodle server and the recaptcha server. Obtain one for this site by visiting http://www.google.com/recaptcha';
|
||||
$string['configrecaptchapublickey'] = 'String of characters used to display the reCAPTCHA element in the signup form. Generated by http://www.google.com/recaptcha';
|
||||
$string['configrecaptchaprivatekey'] = 'String of characters (private key) used to communicate between your Moodle server and the recaptcha server. ReCAPTCHA keys can be obtained from <a target="_blank" href="https://www.google.com/recaptcha">Google reCAPTCHA</a>.';
|
||||
$string['configrecaptchapublickey'] = 'String of characters (public key) used to display the reCAPTCHA element in the signup form. ReCAPTCHA keys can be obtained from <a target="_blank" href="https://www.google.com/recaptcha">Google reCAPTCHA</a>.';
|
||||
$string['configrequestcategoryselection'] = 'Allow the selection of a category when requesting a course.';
|
||||
$string['configrequestedstudentname'] = 'Word for student used in requested courses';
|
||||
$string['configrequestedstudentsname'] = 'Word for students used in requested courses';
|
||||
@@ -612,6 +612,7 @@ $string['legacyfilesaddallowed'] = 'Allow adding to legacy course files';
|
||||
$string['legacyfilesaddallowed_help'] = 'If a course has legacy course files, allow new files and folders to be added to it.';
|
||||
$string['legacyfilesinnewcourses'] = 'Legacy course files in new courses';
|
||||
$string['legacyfilesinnewcourses_help'] = 'By default, legacy course files areas are available in upgraded courses only. Please note that some features such as activity backup and restore are not compatible with this setting.';
|
||||
$string['libcurlwarning'] = 'Libcurl with CURLOPT_PROTOCOL support has not been detected. It is recommended to have an up to date libcurl installation for security reasons.';
|
||||
$string['licensesettings'] = 'Licence settings';
|
||||
$string['linkadmincategories'] = 'Link admin categories';
|
||||
$string['linkadmincategories_help'] = 'If enabled admin setting categories will be displayed as links in the navigation and will lead to the admin category pages.';
|
||||
@@ -891,8 +892,8 @@ $string['questioncwqpfsok'] = 'Good. There are no \'random\' questions in your q
|
||||
$string['questiontype'] = 'Question type';
|
||||
$string['questiontypes'] = 'Question types';
|
||||
$string['quizattemptsupgradedmessage'] = 'In Moodle 2.1 there was a major upgrade to questions. It was possible to delay parts of the database upgrade to be run later. Before upgrading to Moodle 2.7, this upgrade must be completed.';
|
||||
$string['recaptchaprivatekey'] = 'ReCAPTCHA private key';
|
||||
$string['recaptchapublickey'] = 'ReCAPTCHA public key';
|
||||
$string['recaptchaprivatekey'] = 'ReCAPTCHA secret key';
|
||||
$string['recaptchapublickey'] = 'ReCAPTCHA site key';
|
||||
$string['register'] = 'Register your site';
|
||||
$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.';
|
||||
@@ -1072,6 +1073,7 @@ $string['unsupported'] = 'Unsupported';
|
||||
$string['unsupporteddbstorageengine'] = 'The database storage engine being used is no longer supported.';
|
||||
$string['unsupporteddbtablerowformat'] = 'Your database has tables using Antelope as the file format. You are recommended to convert the tables to the Barracuda file format. See the documentation <a href="https://docs.moodle.org/en/cli">Administration via command line</a> for details of a tool for converting InnoDB tables to Barracuda.';
|
||||
$string['unsupportedphpversion7'] = 'PHP version 7 is not supported.';
|
||||
$string['unsupportedphpversion71'] = 'PHP version 7.1 is not supported.';
|
||||
$string['unsuspenduser'] = 'Activate user account';
|
||||
$string['updateaccounts'] = 'Update existing accounts';
|
||||
$string['updatecomponent'] = 'Update component';
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ $string['getanimagecaptcha'] = 'Get an image CAPTCHA';
|
||||
$string['getanothercaptcha'] = 'Get another CAPTCHA';
|
||||
$string['guestloginbutton'] = 'Guest login button';
|
||||
$string['changepassword'] = 'Change password URL';
|
||||
$string['changepasswordhelp'] = 'Here you can specify a location at which your users can recover or change their username/password if they\'ve forgotten it. This will be provided to users as a button on the login page and their user page. If you leave this blank the button will not be printed.';
|
||||
$string['changepasswordhelp'] = 'URL of lost password recovery page, which will be sent to users in an email. Note that this setting will have no effect if a forgotten password URL is set in the authentication common settings.';
|
||||
$string['chooseauthmethod'] = 'Choose an authentication method';
|
||||
$string['chooseauthmethod_help'] = 'This setting determines the authentication method used when the user logs in. Only enabled authentication plugins should be chosen, otherwise the user will no longer be able to log in. To block the user from logging in, select "No login".';
|
||||
$string['incorrectpleasetryagain'] = 'Incorrect. Please try again.';
|
||||
|
||||
+1
-1
@@ -727,7 +727,7 @@ $string['uncategorised'] = 'Uncategorised';
|
||||
$string['unenrolledusersinimport'] = 'This import included the following grades for users not currently enrolled in this course: {$a}';
|
||||
$string['unchangedgrade'] = 'Grade unchanged';
|
||||
$string['unlimitedgrades'] = 'Unlimited grades';
|
||||
$string['unlimitedgrades_help'] = 'By default grades are limited by the maximum and minimum values of the grade item. Enabling this setting removes this limit, and allows grades of over 100% to be entered directly in the gradebook. It is recommended that this setting is enabled at an off-peak time, as all grades will be recalculated, which may result in a high server load.';
|
||||
$string['unlimitedgrades_help'] = 'By default, grades are limited by the maximum and minimum values of the grade item. Enabling this setting removes this limit, and allows grades of over 100% to be entered directly in the gradebook.';
|
||||
$string['unlock'] = 'Unlock';
|
||||
$string['unlockverbose'] = 'Unlock {$a->category} {$a->itemmodule} {$a->itemname}';
|
||||
$string['unused'] = 'Unused';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user