Compare commits

..

757 Commits

Author SHA1 Message Date
Jun Pataleta 6d7dbaa685 Moodle release 3.11.6 2022-03-12 12:39:27 +08:00
Jun Pataleta 05d7ba80e0 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-03-12 12:39:25 +08:00
AMOS bot cdd969bc64 Automatically generated installer lang files 2022-03-12 00:07:30 +00:00
Ilya Tregubov 4f5ad93e83 weekly release 3.11.5+ 2022-03-11 16:19:50 +06:00
Jun Pataleta c8f275ceb0 Merge branch 'MDL-71305-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2022-03-11 11:50:53 +08:00
Jun Pataleta 87bb565607 Merge branch 'MDL-73895-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-03-11 11:17:18 +08:00
Víctor Déniz 333811ca7b MDL-54724 qtype_multianswer: fix version.php 2022-03-10 23:54:07 +00:00
Víctor Déniz b052925815 Merge branch 'MDL-54724-311' of https://github.com/cameron1729/moodle into MOODLE_311_STABLE 2022-03-10 23:28:57 +00:00
Paul Holden f29ee3a772 MDL-67802 core: load only those properties defined within persistent.
This is a backport of the patch from MDL-71086.
2022-03-10 21:40:42 +01:00
Sara Arjona a059ee52a4 Merge branch 'MDL-73760_311' of https://github.com/mkassaei/moodle into MOODLE_311_STABLE 2022-03-10 13:17:31 +01:00
Sara Arjona 1e8a05b13a Merge branch 'MDL-74123_h5p_duplicate_file_311' of https://github.com/davosmith/moodle into MOODLE_311_STABLE 2022-03-10 08:41:01 +01:00
Jake Dallimore 263e28634f Merge branch 'MDL-73899-311' of https://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2022-03-10 15:34:45 +08:00
Jun Pataleta e40b7928c9 Merge branch 'MDL-73520-M311_replace-deprecated-php_errormsg-with-error_get_last' of https://github.com/ziegenberg/moodle into MOODLE_311_STABLE 2022-03-10 12:28:20 +08:00
Ilya Tregubov f783ae12d9 Merge branch 'MDL-67428-filter-context-311' of https://github.com/Peterburnett/moodle into MOODLE_311_STABLE 2022-03-10 09:14:18 +06:00
Shamim Rezaie 730e131ad5 Merge branch 'MOODLE_311_STABLE_MDL-67802_2' of https://github.com/mattporritt/moodle into MOODLE_311_STABLE 2022-03-10 08:57:34 +11:00
Sara Arjona 951465e810 Merge branch 'MDL-74104-311' of https://github.com/ferranrecio/moodle into MOODLE_311_STABLE 2022-03-09 18:23:19 +01:00
Eloy Lafuente (stronk7) fd9fbe61da Merge branch 'MDL-73737-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-03-09 16:54:22 +01:00
Sara Arjona ed07b798e9 Merge branch 'MDL-73586_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-03-09 16:26:20 +01:00
Sara Arjona d4308f1113 Merge branch 'MDL-71807_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-03-09 16:22:10 +01:00
Davo Smith a1fa5e7178 MDL-74123 h5p: delete any existing files when downloading new files 2022-03-09 13:36:07 +00:00
Ferran Recio a484fcb09d MDL-74104 mod_folder: fix recent activity with forcedownload links
The folder module has a setting to force the download links. However,
the recent activity block ignored this setting until now.
2022-03-09 14:06:35 +01:00
Sara Arjona a17a59c8fe Merge branch 'MDL-73923-M311_tool_task_cronrunning-has-very-tight-limits-on-checking-cron-interval-and-expected-frequency' of https://github.com/ziegenberg/moodle into MOODLE_311_STABLE 2022-03-09 13:52:58 +01:00
Sara Arjona cf7429e55e Merge branch 'MDL-73993-MOODLE_311' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2022-03-09 13:24:37 +01:00
Sara Arjona 38a6eb9739 Merge branch 'MDL-73779_dynreg_sup_msgs_311' of https://github.com/cengage/moodle into MOODLE_311_STABLE 2022-03-09 13:11:17 +01:00
Amaia Anabitarte cdc78a16a5 MDL-74075 core_badges: Check accepted criterias 2022-03-09 12:31:33 +01:00
Matt Porritt 6a4801b152 MDL-67802 Authentication: Allow disabling email verification for OAuth
Allow email account verification to be disabled for any Oauth2 provider.
Also add clear indications to administrators of the danger of doing do,
this is done by an additional form checkbox.
This patch also reverts MDL-66598
2022-03-09 01:16:16 +00:00
Sara Arjona 4c00836de9 Merge branch 'MDL-73846-MOODLE_311' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2022-03-08 16:34:46 +01:00
Eloy Lafuente (stronk7) e66a822d8a MDL-73586 phpunit: Simply, remove the setting
It's not available since PHP 7.0, so no use at all.
2022-03-08 14:56:05 +01:00
Eloy Lafuente (stronk7) 9f905c73fd MDL-73586 mod_wiki: Removed php init param for php80 and up
For PHP 8 and up, the 'mbstring.func_overload' doesn't exist
anymore, so skip any check/condition based on it.

The patch has been done that way, so it's easier to remove
the whole block of code once PHP 8.0 becomes our min supported
PHP version.

The change is self-coveres (changes the external and its own tests).
2022-03-08 14:55:58 +01:00
Eloy Lafuente (stronk7) 8a6a7d7e36 MDL-73586 mustache.php: Removed php init param for php80 and up
The 'mbstring.func_overload' php init setting was removed for
php80 (it was deprecated since php72). So it won't evaluate to
true ever, so the whole block can be put under php version condition.

Note that this is already fixed upsteam, for commit:
https://github.com/bobthecow/mustache.php/commit/e7165a33b282ab4d20b3863825caadb46313d62b

And it has been released with version 2.14.1 of the library, so, once
we upgrade to it, the fix will be incorporated.
2022-03-08 14:13:37 +01:00
Michael Hawkins a2d230777f MDL-74074 badges: Ensure profile criteria exists before completion check 2022-03-08 12:04:53 +00:00
Daniel Ziegenberg 3fe211d602 MDL-73520 adodb: Remove usage of $php_errormsg from DB2 driver
This applies #791 from upstream libraries: https://github.com/ADOdb/ADOdb/issues/791

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-03-08 11:21:25 +01:00
Daniel Ziegenberg 865cd7235e MDL-73520 general: replace deprecated php_errormsg with error_get_last()
For a better PHP8 compatibility this commit replaces the deprecated $php_errormsg
with error_get_last().

The PHP 8.0 migration guide (https://www.php.net/manual/de/migration80.incompatible.php) says:
    The track_errors ini directive has been removed.
    This means that php_errormsg is no longer available.
    The error_get_last() function may be used instead.
Also the documentation on $php_errormsg (https://www.php.net/manual/en/reserved.variables.phperrormsg.php) says:
    This feature has been DEPRECATED as of PHP 7.2.0.
    Relying on this feature is highly discouraged.
    Use error_get_last() instead.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-03-08 11:18:21 +01:00
Eloy Lafuente (stronk7) 2b61c1b77c MDL-71807 cleanup: Replace deprecated codingStandardsIgnore annotations
The PHP_CodeSniffer @codingStandardsIgnore annotations are deprecated
and, since version 3.x, the new // phpcs:ignore comments should be used
instead.

This commits just reviews all the uses in core, replacing them for
the better new candidate, or removing when no longer needed.
2022-03-08 10:49:01 +01:00
Paul Holden c653a49fe3 MDL-72972 tool_uploaduser: observe capability to delete users. 2022-03-08 10:04:21 +01:00
cescobedo 15c282d1e5 MDL-71722 h5plib_v124: Add required changes after lib upgrade 2022-03-08 10:04:21 +01:00
cescobedo d8ce474882 MDL-71722 h5plib_v124: Upgrade ckeditor to 4.17.1 2022-03-08 10:04:21 +01:00
Ilya Tregubov 9fc9168f1c MDL-71703 lib: update phpmailer to 6.5.3 2022-03-08 10:04:21 +01:00
Eloy Lafuente (stronk7) bb864ee2e1 weekly release 3.11.5+ 2022-03-08 10:01:56 +01:00
Jun Pataleta d96a108ea0 Merge branch 'MDL-72646-font-mimetype-311' of https://github.com/doctorlard/moodle into MOODLE_311_STABLE 2022-03-08 12:18:00 +08:00
Ilya Tregubov 9c6d7dbf7b Merge branch 'MDL-66940-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-03-08 05:01:56 +02:00
Shamim Rezaie 8c1587e612 MDL-71305 core_question: Use toggle button for flag question element 2022-03-08 13:44:01 +11:00
Mikhail Golenkov 3679e8d579 MDL-73846 assignfeedback_editpdf: Add limit for convert_submissions task 2022-03-08 12:38:35 +11:00
Shamim Rezaie e0dcb76a41 MDL-71305 core_question: Remove duplicate strings 2022-03-07 11:38:17 +11:00
Sara Arjona 90290e5957 MDL-66940 badges: Create page to display badges info
The OBv2.0 specification includes a field "Criteria" for
BadgeClass. Until now, this field was filled using the
URL of the badge assertion, but that is causing some issues
in Badgr because it linked to the badge assertion of the
first user sending this badge to the Badgr backpack (so then,
the following users linked to the first user assertion page
too).

This patch adds a new page, badgeclass.php which will be
used from now to display any badge information which is
not related to any assertion (like happens with the criteria
in BadgeClass).
2022-03-04 17:16:21 +01:00
Sara Arjona 64b9992366 MDL-66940 badges: simplify external badges page
This is a backport from MDL-72141.

Apart from reorganising the information displayed in the external badges
page, this information has been moved to reuse the template created in
MDL-71937, to make it easier to modify and maintain.
2022-03-04 17:16:21 +01:00
Sara Arjona 3c18fd4e3d MDL-66940 badges: simplify badges page
This is a backport of MDL-71937.

Apart from reorganising the information displayed in the badges page,
this information has been moved to a template in order to make it
easier to modify and maintain.
2022-03-04 17:16:21 +01:00
Shamim Rezaie 523ee08608 Merge branch 'MDL-73824_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-03-05 00:40:40 +11:00
Eloy Lafuente (stronk7) e650d04b34 Merge branch 'MDL-73954_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2022-03-04 14:20:52 +01:00
Tim Hunt bb228c82c1 MDL-73954 quiz: fix decimal places for the percentage on review page 2022-03-04 11:54:42 +00:00
Eloy Lafuente (stronk7) cdfae47f94 Merge branch 'MDL-74042-311' of https://github.com/jleyva/moodle into MOODLE_311_STABLE 2022-03-04 12:20:08 +01:00
Mahmoud Kassaei 93052dde8d MDL-73760 Quiz: Manual grading report does not handle separate groups
when the user is not in any group
2022-03-04 11:05:55 +00:00
Eloy Lafuente (stronk7) c2e5f45769 MDL-73824 test: Cover all the changed code with special decsep tests
Various tests have been added to cover the points fixed in the previous
commit, using a localised decimal separator (#). Using the same
numbering, here there are the details:

A. grade/report/singleview/tests/behat/singleview.feature
   grade/tests/behat/grade_category_validation.feature

B. grade/tests/behat/grade_override_letter.feature

C. (done within various scenarios)

D. grade/report/singleview/tests/behat/singleview.feature

E. admin/tool/behat/tests/behat_form_text_test.php

F. grade/tests/behat/grade_to_pass.feature
   mod/lesson/tests/behat/lesson_informations_at_end.feature

G. quiz/tests/behat/preview.feature

H. mod/quiz/tests/behat/info_page.feature

I. question/type/ddimageortext/tests/behat/edit.feature
2022-03-04 10:23:35 +01:00
Eloy Lafuente (stronk7) c6691f7ef7 MDL-73824 gradebook: Add support for localised floats where missing
It has been detected, thanks to php80 specially, that there are
various places in core where support for localised floats is
missing. Before php80, some locale-dependent conversions were
performed by PHP, allowing things to work. But with php80 all
those comparisons are now locale-independent. See:

https://wiki.php.net/rfc/locale_independent_float_to_string

That implies that we now need to, always, unformat floats to
be internally the correct (decimal point as separator) in
order to compare it.

While this was visited in the php80 epic (MDL-70745), nothing
was found, all automated tests were passing ok. Problem is that
we run behat tests with en-AU laguage that has the decimal point
separator.

So, in this issue we are fixing all the problems detected by
running those Behat tests using localised (comma) decimal
separator.

Note that there may be other places still causing problems, but
it's really hard to find them programmatically, so we'll have to
wait for real use reports / issues and go fixing them while they
happen.

Back to this commit, this is the list of changes performed (note that
in the next commit, we'll be adding scenarios explicitly using
a localised decimal separator to ensure that they work ok).

A. Changes to various grade forms to ensure that, on their validation
  floats are unformatted properly. Also, changed the corresponding
  form element from current text/PARAM_RAW to proper float ones that
  take care of the conversion in a number of places (but when disabled,
  that's the reason we still have to unformat in validation.
  This includes the following forms:
    - edit_category_form
    - edit_item_form
  (this is the original problem reported that cause all the research
  to be performed against full behat runs)

B. Changes to edit_letter_form, so it uses a proper PARAM_LOCALISEDFLOAT
  (note this is the type of change that surely should be used for all
  the rest of /grade/edit/tree form, including those in the previous
  point).

C. Changes to the grade_item behat generator, so it's able to work with
  localised floats, un-formatting them when needed.
  At lib/behat/classes/behat_core_generator.php

D. Fix problem passing localised floats to scales, not displaying
  properly. At grade/report/singleview/classes/local/ui/finalgrade.php

E. Change the behat text matcher in order to allow comparison of
  localised floats when they are the current ones. Before this change
  the matches was using soft/lazy comparison, so '50' and '50.0000'
  match. Now, when the comma (for example) is used (and only then),
  '50' and '50,000' will also match. This comparison is in use in a
  bunch of tests and makes sense to make it localisation-aware.
  At grade/report/singleview/classes/local/ui/finalgrade.php

F. Fix a couple of number_format() uses in lesson, because they are
  not localised-aware. Switched to format_float(). At mod/lesson/locallib.php

G. Change the quiz_contains_the_following_questions() step to accept
  localised maxmark expectations. At mod/quiz/tests/behat/behat_mod_quiz.php

H. Change the quiz generator so it accepts localised gradepass.
  At mod/quiz/tests/generator/lib.php

I. Change the edit question form to show proper localised penalties,
  previously it was always showing point-decimal ones. Of course,
  leaving the values of the select element unmodified (internal floats).
  Related, also change a couple of tests to, instead of try to match the
  value (always internal floats), match the description (now localised),
  so we can test them with different separators. At:
    - question/type/ddimageortext/tests/behat/backup_and_restore.feature
    - question/type/ddmarker/tests/behat/backup_and_restore.feature
    - question/type/edit_question_form.php
2022-03-04 10:23:35 +01:00
Jun Pataleta 7139d3404f Merge branch 'MDL-73799_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-03-04 14:47:33 +08:00
Jun Pataleta 0cdd0b34f6 Merge branch 'MDL-73785_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-03-04 14:36:41 +08:00
Peter Spicer 1c3084df01 MDL-67428 navigation: Apply navigation text filters at system context
On some larger sites, processing the navigation with format_string will
habitually load all the contexts for navigation which can take 400+ DB
queries. Explicitly tying all those format_string calls to the system
context reduces this overhead to a single DB query that probably has
already been run on the page previously.

Co-authored-by: Peter Burnett <peterburnett@catalyst-au.net>
2022-03-04 14:38:39 +10:00
Eloy Lafuente (stronk7) 95430c15f9 Merge branch 'MDL-64770-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-03-03 23:20:45 +01:00
Sara Arjona 5d9b0a171b Merge branch 'MDL-72915-311' of https://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2022-03-03 17:31:17 +01:00
Paul Holden 14403a8cb8 MDL-73737 report_loglive: ensure action link popups work post-AJAX. 2022-03-03 14:02:35 +00:00
Daniel Ziegenberg 5971de4590 MDL-73923 tool_task: make a more relaxed check on cron run interval
Prior to this change, the tool_task_cronrunning check had very tight
limits for checking the last cron interval and comparing it to the
expected frequency. When a cron job should take 1:00 min and the last
run was 1:02 min it complained that there was 1:02 between the last two
runs of the cron maintenance script and it should run every 1:00.

This change makes the check a bit more relaxed and adds an additional
minute on top of the expectedfrequency to give the cron job some time.

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2022-03-03 14:28:03 +01:00
Eloy Lafuente (stronk7) 950c3a59cc MDL-73799 phpunit: Move some test names, as agreed in the issue
- behaviourtype_test => behaviour_type_test (10)
- questiontype_test => question_type_test (16)
- upgradelibnewqe_test => upgrade_old_attempt_data_test (13)
2022-03-03 12:22:42 +01:00
Eloy Lafuente (stronk7) 960cfda886 MDL-73799 phpunit: various question & quiz testcase names
To all the walkthrough, questiontype, question, upgradelibnewqe,
behaviourtype_test and edit_form testcase classes::

- Namespaced with component[\level2-API]
- Moved to level2-API subdirectory when required.
- Fixed incorrect use statements with leading backslash.
- Remove file phpdoc block
- Remove MOODLE_INTERNAL if not needed.
- Changed code to point to global scope when needed.
- Fix some relative paths and comments here and there.
- All them passing individually.
- Complete runs passing too.

Special mention to:
- When belonging to other component and being valid api:
  - form related tests have been moved to tests/form subdir.
2022-03-03 12:22:42 +01:00
Eloy Lafuente (stronk7) eb0c520ad6 MDL-73785 phpunit: Move more tests to use correct names and namespaces
Applied the following changes to various testcase classes:

- Namespaced with component[\level2-API]
- Moved to level2-API subdirectory when required.
- Fixed incorrect use statements with leading backslash.
- Remove file phpdoc block
- Remove MOODLE_INTERNAL if not needed.
- Changed code to point to global scope when needed.
- Fix some relative paths and comments here and there.
- All them passing individually.
- Complete runs passing too.

Special mention to:

- When belonging to other components and being valid api:
  - analytics related tests have been moved to tests/analytics subdir.
  - backup & restore related tests have been moved to tests/backup subdir.
  - events related tests have been moved to tests/event subdir.
  - privacy related tests have been moved to tests/privacy.
  - task related tests have been moved to tests/task subdir.
- Some simple renames, not including the component part anymore (not
  needed now that they are namespaced):
  - some xxxlib_test.php have been renamed lib_test.php
    (when they where testing the corresponding lib.php).
  - cache stores tests have been all renamed store_test, originally
    each one had its own name (file_test, apcu_test, redis_test...)
  - assign feedback tests have been all renamed feedback_test, originally
    each one had its own name (file_test, editpdf_test...)
2022-03-03 12:19:38 +01:00
Jun Pataleta 646c691107 weekly release 3.11.5+ 2022-03-03 17:51:32 +08:00
Jun Pataleta 23fb69bbe3 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-03-03 17:51:28 +08:00
Mikhail Golenkov 498c78e23a MDL-73993 phpdoc: get_module_types_names returns lang_string objects 2022-03-03 10:43:41 +11:00
Cameron Ball 83b7836068 MDL-54724 qtype_multianswer: Better handle corrupted questions
When questions are deleted, we now check if the parent is in use before deletion.

Prior to this, it would be possible for multianswer questions to reference
questions that have been deleted. This results in fatal errors when the quiz
is viewed.

This patch uses a dummy 'subquestion_replacement' to handle this case and
display some information to the end user about what has happened so that
they may take action to repair the corrupted question.

As a result of the bug described above, the sequence column of
mdl_question_multianswer can contiain references to questions that no
longer exist, and these IDs can make their way in to backups.

When this happens, the backups cannot be restored. To avoid this,
this patch skips trying to restore those questions that reference
question IDs that no longer exist (as there is no way to recover them).
2022-03-02 18:46:21 +08:00
Juan Leyva 2cae00d9d3 MDL-74042 vimeo: Support security hash for restricted videos 2022-03-01 13:33:09 +01:00
AMOS bot d7de09d272 Automatically generated installer lang files 2022-03-01 00:07:35 +00:00
Paul Holden 28761c2eba MDL-64770 tool_uploaduser: validate unique field values in upload.
If a custom user profile field is set to be unique, then we should
ensure that is respected in the entirety of the uploaded data.
2022-02-28 14:53:13 +00:00
Andrew Nicols 48a9189c12 Merge branch 'MDL-73582-311-nocache' of https://github.com/vmdef/moodle into MOODLE_311_STABLE 2022-02-28 13:03:38 +08:00
AMOS bot 5b5c4361ee Automatically generated installer lang files 2022-02-26 00:07:38 +00:00
Ilya Tregubov 33b053ede8 weekly release 3.11.5+ 2022-02-25 19:23:40 +02:00
Ilya Tregubov 5c762b40bf Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-02-25 19:23:36 +02:00
Andrew Nicols ca0bf01e23 Merge branch 'MDL-70792-311-2' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2022-02-25 11:52:32 +08:00
Jun Pataleta 1bd98e1641 MDL-70792 theme_boost: Remove default outline on focused menu items
* Remove default browser outline in :focus-visible pseudo-class for
  links within .dropdown-item elements.
2022-02-24 18:26:14 +08:00
Jun Pataleta ef132f0ab4 MDL-70792 output: Menu items should have -1 tab index
* As per WAI ARIA Authoring Practices 1.1 guidelines for menus,
menu items should have a tab index of -1. Navigation between menu items
is done via arrow keys.

See https://www.w3.org/TR/wai-aria-practices-1.1/#menu
2022-02-24 18:26:14 +08:00
Jun Pataleta 62a90218e1 MDL-70792 aria: Dropdown menu keyboard interaction fixes
* Move the focus to the last menu item when the menu is displayed by
pressing the Up arrow key.
* When the menu is open and Tab/Shift-Tab is pressed, focus on the
next/previous focusable element on the DOM instead of focusing back on
the menu trigger.
* Combine event handling for the dropdown menu trigger.
2022-02-24 18:26:14 +08:00
Jun Pataleta 360b0271a5 Merge branch 'MDL-73915-311-terser' of https://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2022-02-24 17:02:19 +08:00
AMOS bot fe8d169b36 Automatically generated installer lang files 2022-02-24 00:07:35 +00:00
Mathew May b3c3f4e0ba MDL-70792 aria: Only set focus on items when triggered by keypress 2022-02-23 22:42:37 +08:00
Andrew Nicols 6fc3618bd5 MDL-73915 js: Switch amd minification to terser
Unfortunately the babel minify-mangle plugin seems to be abandoned and
in certain circumstances can be very buggy. The only safe options are to
disable it, or to switch to a different minification library.

Not minifying our javascript is not ideal, so this commit updates the
javascript tasks to use a rollup, combined with babel, and terser.

Babel still converts code from ES/UMD/AMD to AMD modules with the
relevant browser support, whilst terser minifies the code.

The rollup bundler handles tracking and creation of sourcemaps, and
supports better parallelisation of the tasks.

Since the upgrade to Node LTS/Gallium requires an upgrade to @babel/core
and eslint, which change the built files anyway, this seems like the
ideal time to make this change.
2022-02-23 08:51:44 +08:00
Andrew Nicols 034ffb924b MDL-73915 js: Upgrade babel and eslint 2022-02-23 08:51:44 +08:00
Andrew Nicols 3ee0da8f17 MDL-73915 js: Upgrade packages 2022-02-23 08:51:44 +08:00
Andrew Nicols a6f5c43c9f MDL-73915 js: Switch to nodejs lts/gallium 2022-02-23 08:51:43 +08:00
Andrew Nicols c2f8050802 MDL-73915 js: Upgrade node-sass 2022-02-23 08:51:43 +08:00
Andrew Nicols e3c9bab5e5 MDL-73899 behat: Fix coding style issues to change third-party status
This commit removes the moodle-behat-extension from the list of
third-party libraries.

In order to do this properly, all pending coding-style issues are fixed.
In addition the following niceties have also been included:
* convert long form array() syntax to short form
* alphabetically sort class imports (use)
* remove unused class imports
* correct documentation
* Normalise whitespace in concat operators
* Remove unnecessary file docblocks
2022-02-23 08:19:30 +08:00
Eloy Lafuente (stronk7) 383a8f5fc7 Merge branch 'MDL-73450-311_auroramysql_fix' of https://github.com/Limekiller/moodle into MOODLE_311_STABLE 2022-02-22 19:40:38 +01:00
Sara Arjona c1441da84a weekly release 3.11.5+ 2022-02-22 11:12:51 +01:00
Sara Arjona 18eee87ae9 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-02-22 11:12:48 +01:00
Sara Arjona cbd3fd7d9c Merge branch 'MDL-73905_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-21 16:40:39 +01:00
Sara Arjona 729ca7f2f8 Merge branch 'MDL-73872-311' of https://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2022-02-21 16:32:09 +01:00
Sara Arjona 7a87dac5cd Merge branch 'MDL-73883-311' of https://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2022-02-21 15:35:19 +01:00
Eloy Lafuente (stronk7) 0196f5326f Merge branch 'MDL-73812-311-enfix' of https://github.com/vmdef/moodle into MOODLE_311_STABLE 2022-02-21 09:15:04 +01:00
AMOS bot 2b0be5b36c Automatically generated installer lang files 2022-02-21 00:07:36 +00:00
Luca Bösch 6513f39863 MDL-73872 admin: align 'Save changes' and 'Cancel' 2022-02-18 18:36:07 +01:00
Víctor Déniz 2407b79b8b MDL-73812 lang: Replace modified strings in tests 2022-02-18 16:22:41 +00:00
Helen Foster a77a75fe72 MDL-73812 lang: Import fixed English strings (en_fix) 2022-02-18 16:22:41 +00:00
Eloy Lafuente (stronk7) ea801b6374 MDL-73905 core: fix coding_exception missing namespace
This was leading to exception:

Class 'core\message\coding_exception' not found

Surely we weren't facing this before MDL-67853, but it seems that
now we are hitting it sometimes (being investigated @ MDL-73747).

So, just ensure the proper \coding_exception is used.
2022-02-18 15:45:18 +01:00
Sara Arjona 554911ee4e weekly release 3.11.5+ 2022-02-18 15:03:40 +01:00
Sara Arjona 7052e98f2c Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-02-18 15:03:37 +01:00
Ilya Tregubov 6701dbec13 Merge branch 'MDL-72734-311-fix' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-02-18 13:53:19 +02:00
Paul Holden bd56366374 MDL-72734 tool_task: replace usage of non-existing method.
The method `$task->can_run()` exists only in the master branch,
replace usage with implementation appropriate for 311.
2022-02-18 11:35:18 +00:00
Andrew Nicols 3310bf9924 Merge branch 'MDL-72734-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-02-18 10:56:05 +02:00
Andrew Nicols 21e61a347e Merge branch 'MDL-73748-311-check_for_updates' of https://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2022-02-18 10:56:05 +02:00
Andrew Nicols 134a7ca404 Merge branch 'MDL-73636-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-02-18 10:56:04 +02:00
AMOS bot 7b519f1c20 Automatically generated installer lang files 2022-02-17 00:07:31 +00:00
Víctor Déniz 65b49f5be6 MDL-73582 registration: Add endpoint to provide version to linkchecker 2022-02-16 20:42:04 +00:00
Ilya Tregubov 171c9cc802 Merge branch 'MDL-73868-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-02-16 13:06:45 +02:00
Sara Arjona 4e4f395994 Merge branch 'MDL-72762_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-16 11:50:16 +01:00
Paul Holden 1755da1e81 MDL-73895 message: hide empty component notification categories.
If a component has no available notification types (because they're
disabled), then it (the component) should be hidden entirely from
the user notification preferences page.
2022-02-16 10:31:00 +00:00
Jun Pataleta c3facdf7dc Merge branch 'MDL-73827-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-02-16 16:52:16 +08:00
Jonathan Harker 0b79f9fdf1 MDL-72646 theme: update font download MIME types, RFC-8081 2022-02-16 19:12:44 +13:00
Sara Arjona 3b2234ee76 Merge branch 'MDL-73834_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-15 17:18:46 +01:00
Eloy Lafuente (stronk7) b57b50cc0c MDL-73834 mod_lti: Don't load external artifacts, original behaviour
Summary:

- With PHP7, libxml_disable_entity_loader() was making those
  flags futile, and the DTDs were not being requested ever.
- With PHP8, the flags get precedence and requests for the
  DTD have started to happen.
- Those requests are not served by W3C (1 minute time-out).
- Those DTDs aren't used by anything in code (no entity
  replacement, no validation...)

Hence:
- Remove the flags so it will work the same in PHP7 and PHP8.
- Just to double ensure we don't want any remote loading
  to happen ever, add explicitly the LIBXML_NONET flag.
2022-02-15 09:41:47 +01:00
Andrew Nicols 781c3438c2 MDL-73883 behat: Display actual step during testing
Because of the way in which we check for exceptions, we always show the
following string during behat pretty output:

    behat_hooks::i_look_for_exceptions()

We can easily modify this to only show this value when the
i_look_for_exceptions() test itself fails, but otherwise to show the
actual step that is run.
2022-02-15 15:01:20 +08:00
Jun Pataleta e8721581cd Merge branch 'MDL-73805-311' of https://github.com/bmbrands/moodle into MOODLE_311_STABLE 2022-02-15 12:18:24 +08:00
Jun Pataleta ef6a2e594f Merge branch 'MDL-73826_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-15 11:52:01 +08:00
Sara Arjona 3b32118506 MDL-73868 oauth2: Remove multiple slashes in image URL
There is an issue with the current Badgr manifest because the image
URL contains double slash which is causing an error when storing it
in the database (https://api.test.badgr.com/static//images/logo.png).
This issue parses image URL and removes multiple slashes in URL.
2022-02-14 11:43:23 +01:00
Paul Holden 77857ced5a MDL-72734 tool_task: consistent checks for running tasks from web. 2022-02-14 09:21:50 +00:00
Paul Holden 48a0d87f2f MDL-73636 course: use formatted name in exported activity data. 2022-02-14 09:19:09 +00:00
Eloy Lafuente (stronk7) d6984b7616 MDL-72762 backup: Accept empty and whitespace-only UI labels.
This was causing problems when sections or activity names where
set to be empty or whitespace-only, with the PARAM_CLEANHTML
leading to exception.

Now they are supported and handled like &nbsp; (0xc2a0) to
allow the process to continue.

Added a few extra tests to confirm the behaviour.
2022-02-11 23:50:41 +01:00
Eloy Lafuente (stronk7) ad1c072d04 MDL-73826 phpunit: Allow curl mock responses to handle empty strings
Before this commit, is_empty() was being applied before returning
the mock response. But we want to be able to mock the empty response
for some tests, hence moving the condition to null/isset, that is
the value that array_pop() returns where there aren't more elements
in the array.

With that change performed, we can test lti_load_cartridge() with
empty responses, hence adding a new test for that.
2022-02-11 23:50:12 +01:00
Eloy Lafuente (stronk7) e6aeab1fc0 MDL-73826 mod_lti: Fix for Windows/PHP8 with empty curl responses
Sometimes (detected with Windows, when running @ GHA), both the
response and the error of a curl request to non-existing URL
returns the empty string.

In that case, we cannot call to DOMDocument::loadXML() because the
1st param cannot be empty. So here, whenever that happens, we are
throwing the moodle_exception earlier, instead of waiting for the
XML errors to be processed later.
2022-02-11 23:50:12 +01:00
Sara Arjona 6994e82281 weekly release 3.11.5+ 2022-02-11 15:55:21 +01:00
Sara Arjona eb5efbd0ca Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-02-11 15:55:17 +01:00
Limekiller d130a9d0b7 MDL-73450 installation: Support Aurora MySQL >= 8.0.0 2022-02-10 15:13:54 -05:00
Ilya Tregubov b9e8a9af10 Merge branch 'MDL-73764_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-10 14:19:21 +02:00
Sara Arjona 3bb11e2ab4 MDL-73827 lib: Fix URL blocked error for userinfo endpoint
When the oAuth2 issuer hasn't any userinfo endpoint, a call to
$this->get(false) was done, which was returning "The URL is
blocked".
This is a regression from MDL-70649, which added some cURL security
checks.
2022-02-10 10:44:08 +01:00
AMOS bot 9ce0d04ceb Automatically generated installer lang files 2022-02-10 00:07:49 +00:00
Shamim Rezaie 75968fb87e Merge branch 'MDL-73772-311' of https://github.com/aanabit/moodle into MOODLE_311_STABLE 2022-02-10 09:42:46 +11:00
Amaia Anabitarte a268911ffe MDL-73772 reports: Fix Activity completion report with no group select 2022-02-09 13:19:57 +01:00
Huong Nguyen 5707de083a MDL-72915 qtype_ddimageortext: Fix eventHandler for Unlimited items
Sometimes, for the question that has a lot of input groups and unlimited draggable items,
the 'clone' process takes longer than usual, so the questionManager.init() method
will not add the eventHandler for the cloned drag.
We should make sure to bind the eventHandler for the cloned too
2022-02-09 16:26:39 +07:00
AMOS bot 8d97af30c0 Automatically generated installer lang files 2022-02-09 00:07:34 +00:00
Eloy Lafuente (stronk7) bcb55ea61a MDL-73764 behat: Verify the report works and all files in core are ok 2022-02-08 19:25:09 +01:00
Eloy Lafuente (stronk7) 6af84076b0 MDL-73764 tool_xmldb: Regenerate all the files detected by the report
Note that, instead of going one by one to them from the XMLDB Editor
(load, makes some tiny change, save, revert the change, save), the
report includes a commented line that, once uncommented, does regenerate
the file while reporting.

I've left it there as a commodity for the developer.
2022-02-08 19:25:09 +01:00
Eloy Lafuente (stronk7) efd150059b MDL-73764 tool_xmldb: New report to show all xml files needing reconcile
People uses to edit the install.xml files manually, here and there. That
uses to come with small mistakes, like wrong white-space indentation,
some attributes out of order...

While none of them are critical, they add a lot of noise when somebody
is correctly editing a file with the XMLDB Editor because it, correctly,
overwrites the whole file and then diffs show a lot of unrelated changes.

So, this report will inform us about any file needing to be regenerated
because it has been manually edited (in a different way than the way
the editor has).

Note that the report is very basic, with minimal ouput, manually
generating the HTML, like the rest of the XMLDB Editor actions do. We
are not using renderers neither templates here.

Also note that it includes a commented line of code that, once
uncommented, enables the report to, also, fix the wrong files. Useful
for developers.
2022-02-08 19:25:09 +01:00
Ilya Tregubov e91a1432d1 weekly release 3.11.5+ 2022-02-08 14:54:07 +02:00
Bas Brands 7c9b0751f8 MDL-73805 theme_boost: remove left icon margin
The icon margin added in MDL-73543 is causing multiple alignment issues. The alignment issue it needed to fix is done for the recently accessed course block
only.
2022-02-08 13:07:16 +01:00
Jun Pataleta 66396cf4a5 Merge branch 'MDL-72246-311-2' of https://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2022-02-08 11:37:08 +08:00
Andrew Nicols 0f0b8bbf68 MDL-72246 core_completion: Only fetch other completion data on requested
Prior to this patch, the code was fetching all completion data for all
activities in a course, even when the activity was not requested. This
leads to recursion issues as the data has not been added to the cache
before this operation occurs.

To handle this situation, only the requested CM is fetched in full, and
a boolean flag is used to store whether the full data has been fetched.

When returning a partially fetched value from the cache, the flag is
used to determine whether more data must be fetched, and the cache
updated.

The flag is filtered out before the value is returned.

Note: Many of the tests were updated as these were inspecting private
features of the API which should not really be tested.
2022-02-08 11:35:23 +08:00
Andrew Nicols 1142892aca MDL-72246 core_completion: Test coverage improvements for completion 2022-02-08 11:22:25 +08:00
Andrew Nicols 1330fadb00 MDL-72246 core_completion: Stop testing the inner workings of get_data() 2022-02-08 11:22:24 +08:00
Andrew Nicols 3d7e4f8900 Merge branch 'MDL-73716_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-08 11:00:22 +08:00
Eloy Lafuente (stronk7) 27ec971d45 MDL-73716 phpunit: remove old simpletest static members
And replace them by phpunit @covers annotations including
all the classes declared or extended in the removed members.

It's not awesome coverage, but better than nothing.
2022-02-07 10:44:49 +01:00
Andrew Nicols 261f79884f Merge branch 'MDL-73659_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-07 13:34:39 +08:00
David Mudrák 20797726bb MDL-73748 admin: Check for available updates daily on random time
It's been a mistake to make every Moodle site out there to check for
available update every two hours, on the hour. We are experiencing
server load peaks that are harder and harder to deal with.

The patch addresses this by (1) checking for available updates just once
a day and (2) distributing the checking times randomly around the clock.
2022-02-06 21:54:17 +01:00
Eloy Lafuente (stronk7) f92877a5a3 MDL-73659 phpunit: restore_date, api, rule, plugin, manager & helper
All restore_date_test, api_test, rule_test, plugin_test,
manager_test, helper_test testcase classes:

- Namespaced with component[\level2-API]
- Moved to level2-API subdirectory when required.
- Fixed incorrect use statements with leading backslash.
- Remove file phpdoc block
- Remove MOODLE_INTERNAL if not needed.
- Changed code to point to global scope when needed.
- Fix some relative paths and comments here and there.
- All them passing individually.
- Complete runs passing too.

Special mention to:

- All restore_date_test cases have been put under xxx\backup
  level 2 (valid API) namespace.
2022-02-05 00:03:40 +01:00
Claude Vervoort 8b5e15ef5b MDL-73779 mod_lti: dynreg fix messages supported 2022-02-04 15:43:42 -05:00
Sara Arjona 62fe7519b8 weekly release 3.11.5+ 2022-02-04 18:18:30 +01:00
Víctor Déniz 579498f9fa Merge branch 'MDL-73514_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-03 22:20:07 +00:00
Víctor Déniz b447e683f7 Merge branch 'MDL-73517_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-03 22:03:51 +00:00
Eloy Lafuente (stronk7) 4b9d3d514d Merge branch 'MDL-73765-311-twenty-three-minutes' of https://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2022-02-03 22:27:32 +01:00
David Mudrák 30aa6960fc MDL-73765 task: Fix calculation of random minute in the task schedule
The random minute was incorrectly set to a random value from the range
0 - 23 instead of 0 - 59 due to this copy & paste mistake.
2022-02-03 19:17:42 +01:00
Ilya Tregubov 072f686193 Merge branch 'MDL-73543-311' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2022-02-03 10:53:21 +02:00
Jun Pataleta 3e4dd17c54 Merge branch 'MDL-73711_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-02-03 11:14:39 +08:00
Simey Lameze a1059b10c1 MDL-73543 theme: add left margin to move block icon 2022-02-02 19:12:45 +08:00
Eloy Lafuente (stronk7) 19c1c5fea6 Merge branch 'MDL-73075-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-02-02 11:12:55 +01:00
Paul Holden 29936a7238 MDL-73075 lang: move deprecated strings to correct component.
Fix deprecated version. See original change from f9e1c258 for context.
2022-02-02 10:02:40 +00:00
Eloy Lafuente (stronk7) 8f46c10cb8 weekly release 3.11.5+ 2022-02-01 19:51:04 +01:00
Eloy Lafuente (stronk7) b9348695f6 MDL-73711 behat: Bump to Behat 3.10.x
Generated with php73, following the instructions at:

https://docs.moodle.org/dev/Composer

Note this also comes with a minor PHPUnit bump to 9.5.13.
2022-01-29 16:11:37 +01:00
AMOS bot b2c031f401 Automatically generated installer lang files 2022-01-29 00:07:30 +00:00
Eloy Lafuente (stronk7) 071ea825b7 MDL-73517 mnet: add some openssl missing parameters
Since php80 the 5th parameter (cypher) in the following functions:
  - openssl_seal
  - openssl_open
is mandatory, hence:
  - adding it.
  - with value 'RC4' to keep BC.
2022-01-28 20:10:58 +01:00
Eloy Lafuente (stronk7) 5e8812bfc5 MDL-73514 mnet: fix promiscuous mode and php80 support 2022-01-28 20:10:45 +01:00
Ilya Tregubov 0b00e04cf3 weekly release 3.11.5+ 2022-01-28 20:16:59 +02:00
Ilya Tregubov a0386b12ad Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-01-28 20:16:58 +02:00
Shamim Rezaie 75df86e057 Merge branch 'MDL-72852-311-fix' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-01-28 14:59:06 +11:00
Eloy Lafuente (stronk7) 3fc51cf8b4 Merge branch 'MDL-72937-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-28 00:26:17 +01:00
Eloy Lafuente (stronk7) 42bcaa8aa7 Merge branch 'MDL-73588-311-curlfile' of https://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2022-01-27 12:17:49 +01:00
Shamim Rezaie 46cbfbfb21 Merge branch 'MDL-73500_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-27 11:38:13 +11:00
Sara Arjona 26ac673e3e MDL-72852 badges: Improve performance to display Badges nav
The course_get_user_navigation_options() is called on each request
from the add_course_essentials() method, to initialise the basic
navigation options that are available or not for the current user.
This information is not always displayed in boost (for
instance, in a module page), but it might be required by some blocks,
like Navigation.
However, this block is hidden by default in boost since MDL-73347,
so at any point we should check if it's possible to change the way
this navigations options is loaded, to only get this information
when it's strictly required.
2022-01-26 10:36:19 +01:00
Eloy Lafuente (stronk7) fc2020f573 Merge branch 'MDL-72626-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-01-26 10:16:36 +01:00
AMOS bot 957ac32358 Automatically generated installer lang files 2022-01-26 00:07:36 +00:00
Sara Arjona 838b33b9ab MDL-72626 lib: Set Moodle files after RTLCSS upgrade 2022-01-25 09:22:00 +01:00
Sara Arjona 36b4656906 MDL-72626 lib: Upgrade RTLCSS to 1.0.1 2022-01-25 09:22:00 +01:00
Shamim Rezaie e44f94b493 Merge branch 'MDL-72852-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-01-25 13:34:30 +11:00
Frode Petterson acbfa890f6 MDL-73588 curl: Fix expected CURLOPT_FILE behavior
After cbf9dfb the CURLOPT_FILE no longer behaves as expected. All
redirect responses are appended to the same stream resource.  This fix
reverts back to the old behavior by setting the stream pointer back to
the beginning for each subsequent redirect.
2022-01-24 16:55:37 +01:00
Sara Arjona d9bde2ab22 MDL-72852 navigation: Do not display badges when empty
If there are no course badges, students shouldn't have a link to a
page saying there are no badges available.

This patch is for displaying the Badges in the secondary navigation
only if the user can manage badges or there is, at least, one
badge available to the current user.
2022-01-24 15:32:08 +01:00
Andrew Nicols 1dd52d7b47 Merge branch 'MDL-73625-311' of https://github.com/jleyva/moodle into MOODLE_311_STABLE 2022-01-24 11:09:26 +08:00
Jake Dallimore 4eda8d0571 Merge branch 'MDL-73485_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-24 10:46:40 +08:00
Paul Holden 4b919b20bc MDL-72937 user: restrict Moodlenet profile field length. 2022-01-23 23:00:53 +00:00
Eloy Lafuente (stronk7) 9835d6920f MDL-73485 phpunit: externallib, generator and filter tescase names
All externallib_test, generator_test and filter_test classes:

- Namespaced with component[\level2-API]
- Moved to level2-API subdirectory when required.
- Fixed incorrect use statements with leading backslash.
- Changed code to point to global scope when needed.
- Fix some relative paths and comments here and there.
- All them passing individually.
- Complete runs passing too.

Special mention to tests under testing/tests:

1) The core_testing component doesn't exist.
2) But testing/tests are allowed because there is a suite pointing to it (phpunit.xml).
3) So, the only possible namespace for them is "core".
4) And to avoid problems with other core testcases (under lib/tests)
   they have been renamed to have testing_xxxx as prefix.

Finally, also modified calendar/tests/event/events_test.php because it uses
some renamed (core_calendar_externallib_testcase => \core_calendar\externallib_test)
classes.
2022-01-21 19:48:30 +01:00
Eloy Lafuente (stronk7) 517e301d5a MDL-73500 general: Remove php < 73 conditional code
This commit removes code that only was being executed by php < 73
and it's 100% safe to do so because Moodle 3.11 and up require
php 73, hence it was not executed ever.

Removed code includes:
- ldap_control_paged_result and ldap_control_paged_result_response
  (that were deprecated in php 73 and have been removed in php 80).
- conditional code in the session manager, where some hacks were
  needed for php < 73. Note that this removes the private function
  append_samesite_cookie_attribute() completely because it was
  doinf nothing (first line was returning for php < 73).
- Also removed the old session.hash_function ini setting because
  it was removed in php 71.

Kept code includes:
- The environmental check_igbinary322_version test has not been
  removed because it doesn't hurt (always returns "ok" for php 73
  sites) and doing it would involve to backport the environment.xml
  file to 39 and 310. Instead, a note has been added to MDL-71747
  in order to get rid of that check for 4.1 and up.
2022-01-21 19:48:01 +01:00
Sara Arjona 1bd5d40c8f weekly release 3.11.5+ 2022-01-21 15:00:49 +01:00
Sara Arjona 00ebf601ff Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-01-21 15:00:45 +01:00
Jun Pataleta 8d8b24a320 Merge branch 'MDL-73021-311' of git://github.com/andelacruz/moodle into MOODLE_311_STABLE 2022-01-21 11:21:59 +08:00
AMOS bot 04c907d433 Automatically generated installer lang files 2022-01-21 00:07:39 +00:00
Sara Arjona 573de6d923 Merge branch 'MDL-73603-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-20 17:23:50 +01:00
Juan Leyva 158518c79e MDL-73625 tool_mobile: Adapt mobile settings for 4.0 2022-01-20 16:30:00 +01:00
Sara Arjona 42e9f29f8a Merge branch 'MDL-73600-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-20 15:22:16 +01:00
Jun Pataleta 4eebc40ec3 Merge branch 'MDL-73523_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-20 21:52:57 +08:00
Eloy Lafuente (stronk7) 32d68836a4 MDL-73523 libraries: openssl_free_xxx() methods are deprecated in php80
So we are putting them under a standard PHP_MAJOR_VERSION < 8 condition.

Also, added TODO comments to remember to delete that block of code when
php80 becomes the minimum required versions in the future (Moodle 4.3?).

When possible, an issue has been created upstream, else a comment in
readme_moodle files has been added.

Finally, when the keys being freed were class or object attributes, also
nullify them (but when the calls were part of destructor methods).
2022-01-20 14:48:50 +01:00
AMOS bot ae8b4733fd Automatically generated installer lang files 2022-01-19 00:07:36 +00:00
Daniel Neis Araujo 21865b22e7 MDL-69965 moodlenet: show moodlenet in profile only if it is enabled
Amended to use plain get_config() condition.
2022-01-18 23:28:40 +01:00
Eloy Lafuente (stronk7) 1fcccd8722 Merge branch 'MDL-73561-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-01-18 23:09:36 +01:00
Sara Arjona 0f6643a972 weekly release 3.11.5+ 2022-01-18 12:27:03 +01:00
Jun Pataleta 6c8fd471b4 Merge branch 'MDL-69966-311' of https://github.com/danielneis/moodle into MOODLE_311_STABLE 2022-01-18 10:53:58 +08:00
Jun Pataleta b5dd9b2e8a Merge branch 'MDL-73563-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-18 10:43:54 +08:00
Andrew Nicols c95fad5c21 Merge branch 'MDL-73476_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-18 09:31:08 +08:00
Paul Holden 0b73fde437 MDL-73603 webservice: fix user retrieval in token form callback. 2022-01-17 21:52:40 +00:00
Víctor Déniz 36100ed441 Merge branch 'MDL-73584-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2022-01-17 18:54:38 +00:00
Daniel Neis Araujo 48fac357b6 MDL-69966 quiz: start attempt button should be a primary button 2022-01-17 13:54:01 -03:00
Paul Holden 76756f1e10 MDL-73600 user: remove references to deleted user fields/strings.
Since f9e1c258 they are no longer valid.
2022-01-17 16:03:46 +00:00
Bas Brands f2b9070a2c MDL-73486 block_privatefiles: prevent stylelint warnings 2022-01-17 16:32:29 +01:00
Sara Arjona edfcc33471 MDL-73584 lib: Remove role menubar from Actions menu
The menubar role defined in the "menubar d-flex" element is not
required and it's causing the following error "Required ARIA children
role not present: group, menuitemradio, menuitem, menuitemcheckbox".
2022-01-17 12:51:20 +01:00
Sara Arjona 9d49d402eb Merge branch 'MDL-72412-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2022-01-17 08:28:55 +01:00
Eloy Lafuente (stronk7) a59bec2a6f Moodle release 3.11.5 2022-01-15 12:14:25 +01:00
Eloy Lafuente (stronk7) f773514761 MDL-73476 phpunit: events, external and search tescase names
All events_test, external_test and search_test classes:

- Namespaced with component[\level2-API]
- Moved to level2-API subdirectory when required.
- Fixed incorrect use statements with leading backslash.
- Changed code to point to global scope when needed.
- Fix some relative paths and comments here and there.
- All them passing individually.
- Complete runs passing too.

Special mention to lib/external/tests/external_test.php:
- external is not a valid component
- hence, its only valid namespace is "core"
- also, it's testing lib/external/externallib.php
- hence, the file (and class) have been renamed to external_externallib_test.php
  (to avoid conflicts with other external_test that may exist in core)
2022-01-14 16:19:51 +01:00
Sara Arjona 62f859ed24 weekly release 3.11.4+ 2022-01-14 11:14:04 +01:00
Sara Arjona 4b4508fd8b Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-01-14 11:14:01 +01:00
Jun Pataleta c31822a6b4 MDL-72412 core: Add the image role to informative icon fonts 2022-01-14 10:33:30 +08:00
Andrew Nicols 8c2057e569 Merge branch 'MDL-73575-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-14 09:36:47 +08:00
Paul Holden f84ab6c2e4 MDL-73563 course: add vertical space above category action buttons. 2022-01-13 23:14:20 +00:00
Eloy Lafuente (stronk7) 5c42461b50 Merge branch 'MDL-69624-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-13 23:25:00 +01:00
Eloy Lafuente (stronk7) cc4940d794 Merge branch 'MDL-73004-311_access_unit_tests' of https://github.com/brickfield/moodle into MOODLE_311_STABLE 2022-01-13 19:23:29 +01:00
Mike Churchward 29bfe17f2c MDL-73004 tool_brickfield: Fix unit tests for question areas.
Search array of areas for expected question components, rather than assume an array position.
2022-01-13 11:58:28 -05:00
Paul Holden 06abb64d09 MDL-69624 question: add missing test required library. 2022-01-13 15:10:17 +00:00
Paul Holden df608012a7 MDL-73575 webservice: ensure configured protocols are non-empty. 2022-01-13 12:32:48 +00:00
Sara Arjona 817212be50 MDL-73561 grade: Use proper alert for success message 2022-01-13 09:22:33 +01:00
Víctor Déniz 04be2d16f7 Merge branch 'MDL-73418_311' of https://github.com/ja9837/moodle into MOODLE_311_STABLE 2022-01-12 22:25:16 +00:00
Eloy Lafuente (stronk7) 50c8887deb Merge branch 'MDL-73564-311' of https://github.com/marinaglancy/moodle into MOODLE_311_STABLE 2022-01-12 18:31:20 +01:00
Paul Holden beb47bcab8 MDL-72772 gradereport_overview: account for users with parent roles. 2022-01-12 14:19:27 +01:00
Marina Glancy d240de81d1 MDL-73564 webservice: make sure to require webservice lib once 2022-01-12 13:20:18 +01:00
Ilya Tregubov ff840af0b7 Merge branch 'MDL-71949-fix-backup-log-311' of https://github.com/matthewhilton/moodle into MOODLE_311_STABLE 2022-01-12 11:52:06 +02:00
Eloy Lafuente (stronk7) d721f94f2b Merge branch 'MDL-70348-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-12 10:17:41 +01:00
Sara Arjona cb13d527cd Merge branch 'MDL-71461-311' of https://github.com/dravek/moodle into MOODLE_311_STABLE 2022-01-12 09:58:29 +01:00
Sara Arjona d661ace551 Merge branch 'MDL-72771_311' of https://github.com/reskit/moodle into MOODLE_311_STABLE 2022-01-12 09:41:10 +01:00
Shamim Rezaie 6ff9b28f66 Merge branch 'MDL-72880-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-12 19:21:45 +11:00
Paul Holden e414f5b771 MDL-72772 gradereport_overview: access checks for viewing grades. 2022-01-12 13:43:58 +08:00
Andrew Nicols 7ecb4daee6 Merge branch 'MDL-73526_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-12 10:21:34 +08:00
AMOS bot b3f1550b40 Automatically generated installer lang files 2022-01-12 00:07:39 +00:00
Eloy Lafuente (stronk7) 17c70ff8a6 MDL-73526 mod_wiki: Remove unused nwiki diff processor
It never has been used in core since it was introduced in 2011
by MDL-22112, because the ouwiki_diff_html() is used unconditionally
for all wiki formats (html, creole or nwiki).

So, removing it to avoid any current (php80) or future incidence
with it.
2022-01-11 17:27:51 +01:00
Paul Holden eda7d884ba MDL-72367 badges: require sesskey to remove badge alignment. 2022-01-11 14:34:17 +01:00
Paul Holden b09d50dd4a MDL-72573 mod_h5pactivity: tighter validation of external sort param.
Restrict external method $sortorder parameter to limited subset of
values.
2022-01-11 14:34:17 +01:00
Dongsheng Cai a0b04d09a7 MDL-71239 calendar: disallow manager role users edit user events 2022-01-11 14:34:17 +01:00
Jun Pataleta bb9cd179ed weekly release 3.11.4+ 2022-01-11 21:30:11 +08:00
Jun Pataleta 4cc87b1326 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2022-01-11 21:30:05 +08:00
David Matamoros f682557e5f MDL-71461 core_customfield: Add missing library in textarea export value 2022-01-11 11:19:57 +01:00
Jun Pataleta 1303c0fb82 Merge branch 'MDL-69061-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2022-01-11 11:56:47 +08:00
Adam Pawełczak c343287349 MDL-69061 core: Fix admin path replacement with path to $CFG->admin 2022-01-11 11:34:09 +08:00
AMOS bot 7d872ea52a Automatically generated installer lang files 2022-01-11 00:07:31 +00:00
Víctor Déniz 62bb90821e Merge branch 'MDL-73414-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-10 23:21:22 +00:00
Jun Pataleta 62dc08644a Merge branch 'MDL-73502_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-10 15:10:41 +08:00
AMOS bot 68639cb426 Automatically generated installer lang files 2022-01-08 00:07:28 +00:00
Marc Català d98bf4c5ff MDL-72771 core_course: Set module visibility after moving it
Move a module to another section needs to update its visibility after
placing it into the new section. Otherwise an invalid database state
prevents the system to move any module with a completion rule
involving grades.
2022-01-07 14:27:24 +01:00
Paul Holden a35f4515bd MDL-72880 badges: change badge exporter issuername field to text.
This matches it's type in the settings pages, and also the type
of the site name used as the default for the setting. It's content
will now be automatically filtered by the external exporter class.
2022-01-07 09:12:02 +00:00
Ilya Tregubov c261edf5c7 Merge branch 'MDL-73427-311' of https://github.com/cameron1729/moodle into MOODLE_311_STABLE 2022-01-07 09:45:08 +02:00
Shamim Rezaie 4ce7448979 Merge branch 'MDL-73272/3.11' of https://github.com/skodak/moodle into MOODLE_311_STABLE 2022-01-07 17:45:48 +11:00
AMOS bot 2e814c9d0a Automatically generated installer lang files 2022-01-07 00:07:37 +00:00
Eloy Lafuente (stronk7) 5ef22c2458 MDL-73502 libraries: Avoid uses of get_magic_quotes_xxx() functions
They were deprecated in PHP 7.4 (warning) and have been removed in
PHP 8.0 (error). Plus they were returning false since ages ago (PHP
5.x).

Hence, adding conditional check to see if they are available (h5p
editor) or removing the unreachable code-block when they evaluated
to true.

Also, modified the corresponding moodle_readme files to document
the change.
2022-01-07 00:40:53 +01:00
Ilya Tregubov d6688ad206 weekly release 3.11.4+ 2022-01-06 20:50:51 +02:00
Jun Pataleta a569efe93d Merge branch 'MDL-69700-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-06 12:00:40 +08:00
Cameron Ball 9393fe3643 MDL-73427 core: Remove $SESSION->fromurl 2022-01-06 10:43:12 +08:00
Jun Pataleta ca560fd8b5 Merge branch 'MDL-73497_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-06 10:25:12 +08:00
Paul Holden 678c8d5c84 MDL-73497 libraries: upgrade to version 3.3.0 of Spout. 2022-01-05 13:11:45 +01:00
Jun Pataleta 96f7dba2c0 Merge branch 'MDL-68773-clear-adhoc-tasks-311' of https://github.com/Peterburnett/moodle into MOODLE_311_STABLE 2022-01-05 18:46:47 +08:00
Paul Holden c96d32990d MDL-69700 tests: clarify expected exceptions in unit tests.
Resolves some leftovers from MDL-67673, see d95c3787.
2022-01-05 08:45:31 +00:00
Jun Pataleta 9e7a680127 Merge branch 'MDL-73425-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2022-01-05 12:53:39 +08:00
Ilya Tregubov 79957c645f Merge branch 'MDL-73255-311' of https://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2022-01-04 16:19:03 +02:00
Jun Pataleta 42361660e3 Merge branch 'MDL-73352_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2022-01-04 21:26:03 +08:00
Peter Burnett 54c42455ad MDL-68773 backup: Allow completed async backup + restore tasks to clear 2022-01-04 10:58:30 +10:00
Petr Skoda b5d9af91dc MDL-73272 behat: move behat extension to core 2021-12-31 09:55:07 +13:00
Eloy Lafuente (stronk7) 6dd561a11c MDL-73352 phpunit: lib_test and locallib_test testcase names
All lib_test and locallib_test classes:

- Namespaced with component (and API whenever makes sense).
- Fixed incorrect use statements with leading backslash.
- Changed code to point to global scope when needed or add new uses.
- All them passing individually.
- Complete runs passing too.

Special mention to tests under login/tests:

1) The core_login component doesn't exist.
2) But login/tests are allowed because there is a suite pointing to it (phpunit.xml).
3) So, the only possible namespace for them is "core".
4) And to avoid problems with other core testcases (under lib/tests)
   they have been renamed to have login_xxxx as prefix.
2021-12-30 16:21:48 +01:00
Sara Arjona 3105d5bc9f weekly release 3.11.4+ 2021-12-30 11:24:10 +01:00
Sara Arjona e08e3de631 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-12-30 11:24:06 +01:00
AMOS bot 700562d609 Automatically generated installer lang files 2021-12-30 00:07:25 +00:00
Sara Arjona f97dd08bbc Merge branch 'MDL-73086-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-29 16:18:14 +01:00
Sara Arjona 4599bb5251 Merge branch 'MDL-73295-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-29 15:36:14 +01:00
Sara Arjona 6f35469598 Merge branch 'MDL-72716-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-29 15:01:46 +01:00
Paul Holden 180389d33f MDL-72716 blocks: fix external fetching of available blocks.
Pass `$PAGE->subpage` value in AJAX request, which is required on
some pages (e.g. user dashboard) for loading existing blocks.
2021-12-29 10:46:59 +00:00
Paul Holden 00b78393b3 MDL-73414 webservice: don't disable all WS when disabling mobile. 2021-12-29 10:36:57 +00:00
Paul Holden 7cf0235ef7 MDL-73086 user: account for mixed casing of profile field shortname.
Custom profile fields allow for shortnames containing mixed character
casing, which should also be supported within the user fields API
when retrieving said custom fields.

Given that the DML libs convert all selected columns to lowercased
equivalent, we need to do the same when requesting custom fields to
ensure calling code doesn't try to access `->profile_field_Foo`
property when the DB returns `->profile_field_foo` instead.
2021-12-29 10:21:37 +00:00
Paul Holden af9f840e8d MDL-73295 webservice: only pass around sesskey for tokens as needed. 2021-12-29 09:59:49 +00:00
Sara Arjona 4e2cfa0fe0 Merge branch 'MDL-73402-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-29 10:08:04 +01:00
Sara Arjona 2d05bbbf4c Merge branch 'MDL-72375-completion-id-311' of https://github.com/Peterburnett/moodle into MOODLE_311_STABLE 2021-12-29 09:48:29 +01:00
Eloy Lafuente (stronk7) 43066fb582 Merge branch 'MDL-73420-311' of https://github.com/marinaglancy/moodle into MOODLE_311_STABLE 2021-12-29 09:05:36 +01:00
Sara Arjona 97e28f897e Merge branch 'MDL-73237-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-28 15:58:35 +01:00
Sara Arjona 84ea58618b Merge branch 'MDL-73207-cronspec-MOODLE_311_STABLE' of https://github.com/brendanheywood/moodle into MOODLE_311_STABLE 2021-12-28 15:43:20 +01:00
Sara Arjona 79c65ea145 Merge branch 'MDL-73189-311' of https://github.com/nguyenphuctien/moodle into MOODLE_311_STABLE 2021-12-28 11:42:03 +01:00
AMOS bot 9697eb3054 Automatically generated installer lang files 2021-12-28 00:07:24 +00:00
Víctor Déniz 5488ffe860 Merge branch 'MDL-73269/3.11' of https://github.com/skodak/moodle into MOODLE_311_STABLE 2021-12-27 15:25:56 +00:00
AMOS bot 9c501dc357 Automatically generated installer lang files 2021-12-27 00:07:27 +00:00
AMOS bot 3e2c0af7ad Automatically generated installer lang files 2021-12-26 00:07:24 +00:00
Josh.Aston 0020e31d55 MDL-73418 Quiz: Continue the last attempt > Continue your attempt 2021-12-23 16:04:48 +00:00
Sara Arjona f04d0ddc8f weekly release 3.11.4+ 2021-12-23 16:29:41 +01:00
Sara Arjona ca8f1866fb Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-12-23 16:29:38 +01:00
Jun Pataleta 4b39124bf8 Merge branch 'MDL-72701-311' of https://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-12-23 12:10:53 +08:00
Andrew Nicols f6f9359c13 MDL-73255 user: Ensure that invalid filters are not left
When there is no group but a default groupmode is set, the group
configuration is provided but the group data is not present. This
resulted in a JS error and an invalid filter line was left in place.

This change conditionally checks the data-filter-type-class value of the
filterDataNode so that no JS error is produced if the filterDataNode
does not exist and therefore removes the empty filter row.
2021-12-23 11:02:10 +08:00
AMOS bot 529150a7d8 Automatically generated installer lang files 2021-12-23 00:07:26 +00:00
Petr Skoda 56f79b2da5 MDL-73269 dev: add requirements to composer.json 2021-12-23 07:21:47 +13:00
Sara Arjona 9394ec0f27 Merge branch 'MDL-73405_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-12-22 17:20:49 +01:00
Sara Arjona c6f4cac946 Merge branch 'MDL-73380-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-22 16:59:13 +01:00
Sara Arjona 21a59229a9 Merge branch 'MDL-73256-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-22 16:39:49 +01:00
Sara Arjona 36765f08a9 Merge branch 'MDL-69023-M311_mod-lti-conflicts-with-text-alignment-in-chat-messages' of https://github.com/ziegenberg/moodle into MOODLE_311_STABLE 2021-12-22 16:28:05 +01:00
Jun Pataleta acb63ae043 Merge branch 'MDL-73046-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-12-22 18:50:54 +08:00
Frederik Milling Pytlick 343d3f42d4 MDL-73046 media_html5video: Fixed .mov files
.mov files will now have the mimetype 'video/mp4' instead of 'video/quicktime'. (Only if the user's browser is chromium-based)
2021-12-22 18:45:48 +08:00
Shamim Rezaie 51ebf938b7 Merge branch 'MDL-73348_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-12-22 21:20:15 +11:00
Angelia Dela Cruz cf7238ac5e MDL-73021 behat: Use assign generators
Replace steps that manually add assignment instances via the UI
and use Behat generators. This improves the speed of Behat test
runs.
2021-12-22 15:12:52 +08:00
AMOS bot 7295679d8f Automatically generated installer lang files 2021-12-22 00:07:29 +00:00
Andrew Nicols f58768ee9e MDL-72701 unit tests: Fix broken @covers annotations 2021-12-21 09:24:06 +08:00
Matthew Hilton 90d21c6351 MDL-71949 backup: Fix userid and add backup ID to logging 2021-12-21 11:18:31 +10:00
AMOS bot c8da07ae5f Automatically generated installer lang files 2021-12-21 00:07:26 +00:00
Paul Holden b8d2dfc18d MDL-73425 phpunit: document expected class and filename layout. 2021-12-20 18:55:32 +00:00
Marina Glancy 363cf89cee MDL-73420 core: make static cache compatible with PHP8.1 2021-12-20 17:07:23 +01:00
Shamim Rezaie fe8e792113 Merge branch 'MDL-73175-311' of https://github.com/NoelDeMartin/moodle into MOODLE_311_STABLE 2021-12-20 11:00:21 +11:00
Eloy Lafuente (stronk7) e14c046a17 MDL-73405 libraries: php80 compatibility fix to Horde Imap Client
The fix is already available upstream for versions 2.30.4 and up
See https://github.com/horde/Imap_Client/pull/13
2021-12-19 12:26:53 +01:00
Eloy Lafuente (stronk7) d02364e83b MDL-73405 phpunit: dataset fixes
This was detected when working in the renaming of test names:
- Fix file name, it was incorrectly named .test.php, now _test.php.
- Add namespace and rename testcase name to match file name.
- Fix php80 deprecation message about optional and required params
  order.
2021-12-19 12:26:53 +01:00
AMOS bot ebc715ceb2 Automatically generated installer lang files 2021-12-19 00:07:25 +00:00
Eloy Lafuente (stronk7) eac985d755 MDL-73348 phpunit: normalize all privacy provider tests
As far as now all them have correct privacy level2 namespace:
- Move them to "privacy" subdir.
- Rename the files to "provider_test.php", this includes old
  privacy_test.php and privacy_provider_test.php files
- Rename the testcase to provider_test too (to match file name)

Also, change some relative paths and comments to point to new
locations.
2021-12-17 14:21:09 +01:00
Eloy Lafuente (stronk7) d6e00bc466 MDL-73348 phpunit: privacy and privacy_provider testcase names
All privacy_test and privacy_provider_test classes:

- Namespaced with component\privacy.
- Fixed incorrect use statements with leading backslash.
- Changed code to point to global scope when needed.
- Renamed a few files to make all be privacy_test or privacy_provider_test.php
- All them passing individually.
- Complete runs passing too.
2021-12-17 14:21:09 +01:00
Paul Holden a8a8555b4f MDL-73402 block_admin_bookmarks: slightly relax section cleaning.
Allow '/' character in external page names.
2021-12-17 11:59:21 +00:00
Eloy Lafuente (stronk7) fd3e2cd428 weekly release 3.11.4+ 2021-12-17 11:47:55 +01:00
Noel De Martin d71c1a0776 MDL-73175 mod_glossary: Add behat generators 2021-12-17 07:51:37 +01:00
Paul Holden 25210e010a MDL-70348 core: fix upgrade note referring to $CFG->localrequestdir.
The change in 9fabe1dd referred to incorrect config property.
2021-12-15 08:56:46 +00:00
AMOS bot d332c8e507 Automatically generated installer lang files 2021-12-15 00:07:27 +00:00
Paul Holden 4a3290f39d MDL-73380 mod_workshop: add lang string for phase auto switch event. 2021-12-14 21:53:41 +00:00
Ilya Tregubov 696857a008 weekly release 3.11.4+ 2021-12-14 17:42:58 +02:00
Ilya Tregubov f6f44d8360 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-12-14 17:42:56 +02:00
Tien Nguyen cff5ca7c2d MDL-73189 File upload: Fix bug can upload more than maximum no. of files 2021-12-14 15:08:16 +07:00
Víctor Déniz d494218b19 Merge branch 'MDL-73039-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-13 19:31:05 +00:00
Sara Arjona 06eb4fd769 Merge branch 'MDL-69467-311' of https://github.com/sebastianberm/moodle into MOODLE_311_STABLE 2021-12-13 17:34:45 +01:00
Paul Holden 900d4a8039 MDL-73039 course: remove double encoding of course/site for download. 2021-12-13 10:09:10 +00:00
Peter Burnett 0773b6d88a MDL-72375 completion: Remove id from custom rules
The id stored in the default custom rules was the courseid, and would
incorrectly be applied to new activities as the activity id.
2021-12-13 11:52:32 +10:00
AMOS bot 94c4ff2443 Automatically generated installer lang files 2021-12-13 00:07:26 +00:00
AMOS bot 6a959efde8 Automatically generated installer lang files 2021-12-12 00:07:23 +00:00
AMOS bot eee9636851 Automatically generated installer lang files 2021-12-11 00:07:27 +00:00
Ilya Tregubov 0ae57526db Merge branch 'MDL-73278_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-12-10 18:51:59 +02:00
Sebastian Berm b8335d5474 MDL-69467 core_h5p: User uniqueness by id instead of email 2021-12-10 14:37:54 +01:00
Ilya Tregubov b47dec983c weekly release 3.11.4+ 2021-12-10 15:14:37 +02:00
Ilya Tregubov e032566df0 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-12-10 15:14:34 +02:00
AMOS bot c9e2652fa7 Automatically generated installer lang files 2021-12-10 00:07:24 +00:00
Eloy Lafuente (stronk7) cdf933d5c2 Merge branch 'MDL-73201-311-enfix' of https://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-12-09 23:18:16 +01:00
David Mudrák f52d41eeef MDL-73201 lang: Use changed strings in tests, too 2021-12-09 19:58:35 +01:00
Helen Foster a63c76ec70 MDL-73201 lang: Import fixed English strings (en_fix) 2021-12-09 19:58:34 +01:00
Sara Arjona 27f6b7542e Merge branch 'MDL-61554-311' of https://github.com/nwp90/moodle into MOODLE_311_STABLE 2021-12-09 17:51:06 +01:00
Eloy Lafuente (stronk7) 935742572d MDL-73278 phpunit: Add missing payment subsystem and fix dataprovider
While testing the changed unit tests one by one, the
payment/tests/helper_test.php was failing because of a mismatch
between the dataProvider data and the param type.

That made me think why that error was not popping in complete runs
and the answer is that the new (3.10) subsystem is not in the
phpunit.xml.dist file.

Hence, adding it and fixing the dataProvider mismatch.

Finally, it has been detected that some old ICU versions (< 62)
have an incorrect behaviour, not adding the required non-breaking
white-space between the currency abbreviation and the value. So
we are skipping some payment tests if that's found.
2021-12-09 10:36:51 +01:00
AMOS bot 513534f7af Automatically generated installer lang files 2021-12-09 00:07:21 +00:00
Daniel Ziegenberg dba6833aa2 MDL-69023 mod_lti: remove superfluous css rule
The mod_lti css rule .path-mod-lti .message conflicts with text
alignment in chats in message an can be removed. The last occurrence
of the css class "message" was deleted from the mod_lti code in 2011
with 036e84c389 (see MDL-30354).

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2021-12-08 19:38:26 +01:00
Eloy Lafuente (stronk7) 3a08925b79 MDL-73278 phpunit: Fix namespaces for the renamed classes
Within the renamed classes in the previous commit, there were a
few incorrect namespace, this commit fixes all them to be
correct component[\api] ones.

Also fix a few incorrect leading backslashes in namespace/use
statements. And tests extending renamed tests.
2021-12-07 23:54:34 +01:00
Eloy Lafuente (stronk7) 2c30590d5d MDL-73278 phpunit: Rename already namespaced classes to match file name
These are the only cases 100% safe to apply the renaming of the
testcase class names to match the file names.

All other cases are not safe, because they are missing namespace
and may enter into name conflicts. Adding namespaces is not as
simple as imagined because it implies to, also, add a good number
of modifications to core. See the issue for more details.
2021-12-07 23:54:34 +01:00
Ilya Tregubov 059e523871 weekly release 3.11.4+ 2021-12-07 14:59:41 +02:00
Ilya Tregubov 9da96dbd6a Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-12-07 14:59:39 +02:00
Andrew Nicols 5dc1b69ef7 Merge branch 'MDL-72796_M311_fix-retry-delay-for-redis-session-cache' of https://github.com/ziegenberg/moodle into MOODLE_311_STABLE 2021-12-07 10:52:06 +08:00
Jun Pataleta 1d16b4b752 Merge branch 'MDL-73202-311' of https://github.com/NoelDeMartin/moodle into MOODLE_311_STABLE 2021-12-07 10:38:33 +08:00
AMOS bot 8dd9f8482a Automatically generated installer lang files 2021-12-07 00:07:27 +00:00
Nick Phillips c27559d6b2 MDL-61554 calendar: Set $PAGE context in calendar export. 2021-12-07 12:23:32 +13:00
Paul Holden ecde575d00 MDL-73237 check: detect same role overrides in different contexts.
Prevents DML debugging from duplicate values in first field, also
fixes `context` class namespace and removes undefined `localrole`
property of $role object.
2021-12-06 16:23:22 +00:00
Paul Holden edd6f7f401 MDL-73256 tool_oauth2: save requireconfirmation property on create. 2021-12-06 14:28:30 +00:00
Jun Pataleta 092cc5ec3f Merge branch 'MDL-72870-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-06 18:43:14 +08:00
Jun Pataleta 2027f4011a Merge branch 'MDL-73153-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-12-06 17:43:22 +08:00
Brendan Heywood 8bd98c3bd8 MDL-73207 cron: Fixed cronspec field order bug 2021-12-06 17:54:26 +11:00
Shamim Rezaie 6cd7435119 Merge branch 'MDL-73245-311' of https://github.com/cameron1729/moodle into MOODLE_311_STABLE 2021-12-06 17:08:29 +11:00
Cameron Ball 98775c265b MDL-73245 cache: Fix bug with session lock debugging
When session lock debugging and read only sessions deubgging are both
enabled, session lock debugging becomes moot. This patch causes
the session lock deubgging code to exit early if read only sessions
debugging is enabled.
2021-12-06 12:16:19 +08:00
Daniel Ziegenberg 0ad2a91cdd MDL-72796 caching: fix retry delay for redis session cache
The random retry delay for redis session cache was calculated as
rand(100000, 500000) giving an effective retry delay of 100 seconds
to 500 seconds. That's off by a factor of a thousand! Using Redis as a
session cache and when the connection hangs, you can get random
"cannot obtain session lock" errors because it's waiting up to
500 seconds (or about 8.33 minutes) for a Redis connection.
This sets the delay to the originally intended 100ms to 500ms.
(see MDL-59866).

Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
2021-12-05 17:09:32 +01:00
Eloy Lafuente (stronk7) 09b004629f Merge branch 'MDL-73253-311' of https://github.com/vmdef/moodle into MOODLE_311_STABLE 2021-12-03 18:52:29 +01:00
Víctor Déniz 29994e98de MDL-73253 ci: use setup-node action in GHA 2021-12-03 15:44:58 +00:00
Sara Arjona 0b626ac5e0 weekly release 3.11.4+ 2021-12-03 10:26:32 +01:00
Jun Pataleta 5f28929d64 Merge branch 'MDL-72789-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-03 12:16:48 +08:00
Shamim Rezaie a96887e70a Merge branch 'MDL-68944-311' of https://github.com/juancs/moodle into MOODLE_311_STABLE 2021-12-03 14:54:27 +11:00
Andrew Nicols 24ffb2cf6f Merge branch 'MDL-73195-311' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2021-12-03 10:14:35 +08:00
Andrew Nicols df0d1ea93a Merge branch 'MDL-72846-311' of https://github.com/NoelDeMartin/moodle into MOODLE_311_STABLE 2021-12-03 08:29:49 +08:00
Eloy Lafuente (stronk7) 3982b8da9d Merge branch 'MDL-72728-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-02 18:57:10 +01:00
Noel De Martin 312c646c48 MDL-72846 testing: Add default block generators 2021-12-02 14:57:51 +01:00
Jun Pataleta 9097a7f414 Merge branch 'MDL-72785-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-02 17:06:15 +08:00
Simey Lameze fda79a220b MDL-73195 mod_url: prevent invalid urls from breaking the course 2021-12-02 16:58:15 +08:00
Andrew Nicols ff396418f7 MDL-73155 qtype_essay: Coding style fix 2021-12-02 14:43:25 +08:00
Andrew Nicols a6e991c75a Merge branch 'MDL-73155_311' of https://github.com/mkassaei/moodle into MOODLE_311_STABLE 2021-12-02 14:43:01 +08:00
Jun Pataleta 8c4cf07c54 Merge branch 'MDL-73142-311' of https://github.com/susyzan/moodle into MOODLE_311_STABLE 2021-12-02 14:30:25 +08:00
Andrew Nicols 3e141207a0 Merge branch 'MDL-73176-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-02 12:09:44 +08:00
Andrew Nicols 28150789b8 Merge branch 'mdl-68199-fix-311' of https://github.com/jaypha/moodle into MOODLE_311_STABLE 2021-12-02 11:55:32 +08:00
Andrew Nicols a71a1a67be Merge branch 'MDL-73205-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-02 11:45:49 +08:00
Andrew Nicols 0c0feb164f Merge branch 'MDL-73070_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2021-12-02 11:24:29 +08:00
Jason den Dulk bbee1d9e21 MDL-68199 setup: Fix invalid parameters to make_request_directory()
Removed invalid parameters from calls to make_request_directory()

Removing these parameters should have no effect on behaviour.
2021-12-02 07:44:46 +11:00
Eloy Lafuente (stronk7) 248edcf1b0 Merge branch 'MDL-70894-MOODLE_311_STABLE' of https://github.com/yankudriavtsev/moodle into MOODLE_311_STABLE 2021-12-01 19:10:53 +01:00
Eloy Lafuente (stronk7) eff3041098 Merge branch 'MDL-72791-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-12-01 17:13:38 +01:00
Sara Arjona ff285b448f Merge branch 'MDL-73140_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2021-12-01 12:29:53 +01:00
Shamim Rezaie 4307c81b65 Merge branch 'MOODLE_311_STABLE_MDL-59115' of https://github.com/mattporritt/moodle into MOODLE_311_STABLE 2021-12-01 14:53:57 +11:00
Matt Porritt 05127e02e7 MDL-59115 auth_oauth2: Set all mapped field of user
On account creation by Oauth2 all configured mapped user
fields are now saved in the user profile on user creation.

Co-Authored-By: SKOLL Learning Technologies
2021-12-01 03:14:48 +00:00
Paul Holden c092ab42af MDL-72870 mod_quiz: fix attempt navigation button alignment. 2021-11-30 23:21:50 +00:00
Paul Holden 0d99e663aa MDL-73176 forms: escape selector for active autocomplete element. 2021-11-30 20:08:45 +00:00
Eloy Lafuente (stronk7) 4f270213e7 weekly release 3.11.4+ 2021-11-30 19:01:13 +01:00
Eloy Lafuente (stronk7) f1f026cacf Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-30 19:01:09 +01:00
Noel De Martin 2d5cdf107c MDL-73202 mod_forum: Add behat generators 2021-11-30 10:07:44 +01:00
Eloy Lafuente (stronk7) fa8cf48660 Merge branch 'MDL-73074-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-29 23:15:03 +01:00
Paul Holden b005d5d510 MDL-73205 forms: handle AJAX error in dynamic/modal form submission. 2021-11-29 18:36:38 +00:00
Paul Holden 4d08b631f7 MDL-72789 report_eventlist: improve filtering of report by component.
Instead of performing partial matching on the event component, which
could return false positives, do an exact match.
2021-11-29 09:20:18 +00:00
Jun Pataleta 66c48b3358 Merge branch 'MDL-70274-311-2' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-29 12:17:18 +08:00
Simey Lameze 228232965b MDL-70274 core: fix Validate HTML and WCAG Check links 2021-11-29 12:11:33 +08:00
AMOS bot 8ed983a254 Automatically generated installer lang files 2021-11-27 00:07:35 +00:00
Paul Holden e61a1e9ec3 MDL-72728 behat: switch import course steps to native execute method.
The previous iteration using the behat_form_field class directly
didn't explicitly require the file that defines this class, and in
Goutte runs this led to fatal errors (class not found).
2021-11-26 19:07:46 +00:00
Sara Arjona 2fd9b4b822 weekly release 3.11.4+ 2021-11-26 15:25:53 +01:00
Sara Arjona 340196b809 NOBUG: Fixed SVG browser compatibility 2021-11-26 15:25:51 +01:00
Sara Arjona 480b9726f6 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-26 15:25:50 +01:00
Mahmoud Kassaei 1ed929a22b MDL-73155 qtype_essay: Errors when Allow attachments is reset to 'No' 2021-11-26 13:55:46 +00:00
Jun Pataleta b1b607f273 Merge branch 'MDL-72443-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-25 17:32:01 +08:00
Juan Segarra Montesinos a00045a050 MDL-68944 mod_workshop: Workshop skips scheduled allocation 2021-11-25 09:48:10 +01:00
AMOS bot f4985556b3 Automatically generated installer lang files 2021-11-25 00:07:24 +00:00
Eloy Lafuente (stronk7) c29478fdc6 Merge branch 'MDL-73054-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-24 23:57:08 +01:00
Eloy Lafuente (stronk7) 250f6a1b0f Merge branch 'MDL-72988-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-24 23:49:52 +01:00
Susanna Zanatta 10eac8c81e MDL-73142 filepicker: improved contrast in allowed file types list
Changed bootstrap class from text-muted to text-dark to bring the
contrast of listed file extensions above the Level AA pass mark.
2021-11-24 16:31:04 +00:00
Sara Arjona 9a21803f8f MDL-73153 badges: get image when it has more data
In some cases, image might have more fields rather than the URL.
This patch is for taking them into account and displaying the image
and also these information properly.
2021-11-24 10:28:07 +01:00
Yan Kudriavtsev 7b3767ec20 MDL-70894 enrol: Fixed return type for count_enrolled_users 2021-11-24 00:04:09 +02:00
Paul Holden 258208056c MDL-72785 course: remove double validation during category deletion.
Fixes issue from 0645319e that meant the category "Move into" field
was required even when user selected to "Delete all content".
2021-11-23 12:29:42 +00:00
Tim Hunt d40a865a2b MDL-73070 Behat: stop using no-longer-existant classes in behat_hooks 2021-11-23 10:59:26 +00:00
Ilya Tregubov 318dbbcb88 weekly release 3.11.4+ 2021-11-23 11:18:57 +02:00
Eloy Lafuente (stronk7) f94adf67d5 Merge branch 'MDL-73128-311' of https://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-11-23 11:37:29 +08:00
Ilya Tregubov 6be3a43c3c Merge branch 'MDL-72967-311' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-23 11:37:28 +08:00
Eloy Lafuente (stronk7) d31534bb87 Merge branch 'MDL-73095_311_v3' of https://github.com/TomoTsuyuki/moodle into MOODLE_311_STABLE
Added one extra TEXT column so we have it covered too.
2021-11-23 11:37:28 +08:00
Tim Hunt 42055d95cd MDL-73140 grade history: fix badly formatted lists 2021-11-22 23:51:05 +00:00
Paul Holden b6d4db166b MDL-73054 repository_googledocs: avoid $OUTPUT use in data provider. 2021-11-22 22:32:59 +00:00
Paul Holden 6eb8fe2896 MDL-73054 filter_emoticon: re-factor test data providers.
PHPUnit test dataProvider methods should not modify global state,
such as initializing $OUTPUT, as they can cause failures in
unrelated tests at a distance.
2021-11-22 22:32:48 +00:00
Sara Arjona 7ea7a17fb4 MDL-73128 badges: Fix warning with external badges 2021-11-22 16:32:03 +01:00
Paul Holden 3de2b5527f MDL-73074 forms: ensure autocomplete element is enhanced only once. 2021-11-22 10:25:25 +00:00
Eloy Lafuente (stronk7) bd9c2a4bc2 weekly release 3.11.4+ 2021-11-19 19:15:26 +01:00
Eloy Lafuente (stronk7) 8cb8e0d232 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-19 19:15:21 +01:00
Paul Holden ed5f906fbb MDL-72988 mod_lti: improved handling of missing tool endpoint. 2021-11-19 08:28:55 +00:00
Tomo Tsuyuki bbbfa6457f MDL-73095 core_ddl: Fix binary type field check 2021-11-19 12:48:34 +11:00
AMOS bot d0aa76458d Automatically generated installer lang files 2021-11-19 00:07:25 +00:00
Eloy Lafuente (stronk7) 2f7e8aee5a Merge branch 'MDL-71882-311' of https://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-11-18 23:34:16 +01:00
Sara Arjona 8770bc0898 Merge branch 'MDL-70721-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-11-18 15:22:35 +01:00
Shamim Rezaie a4e8329337 Merge branch 'MDL-72887-M311' of https://github.com/michael-milette/moodle into MOODLE_311_STABLE 2021-11-18 22:37:36 +11:00
Michael Milette 0d0833980a MDL-72887 search: Tooltip added to navbar search icon. 2021-11-18 00:57:37 -05:00
AMOS bot c3db183b64 Automatically generated installer lang files 2021-11-18 00:07:23 +00:00
Jun Pataleta cc049c74c3 Merge branch 'MDL-72925_311_v2' of https://github.com/TomoTsuyuki/moodle into MOODLE_311_STABLE 2021-11-17 16:05:56 +08:00
Ilya Tregubov 7664fd2dc6 Merge branch 'MDL-69496_311' of https://github.com/1JackBlack1/moodle into MOODLE_311_STABLE 2021-11-17 09:02:23 +02:00
Andrew Nicols 5aedafd786 MDL-71882 grunt: Replace module names
When a third-party AMD module is provided with an included name we must
replace it with a name that we are able to use.

The structure of an AMD module define function is:

    [name], [dependencies], [callback]
    String, Array,          Function

Each of these is (strangely) optional.

We know that the name is the only String and will always be the first,
and we can use AST to remove a provided name before adding the
Moodle-specific name.

This should be a safe change and not lead to any changes in built code,
but will make it easier to include third-party code.

An additional logging line is also included to inform developers that a
change was made.
2021-11-17 09:20:41 +08:00
AMOS bot 317c441994 Automatically generated installer lang files 2021-11-17 00:07:28 +00:00
PraiseSatan 4124e8b4bb MDL-69496 quiz: Only validate completion if unlocked
Quiz completion settings are only validated if they are unlocked.
Undefined behaviour in the forms API results in the completion
settings 'require passing grade' and 'completion attempts exhausted'
not being sent to the process options function if completion
settings are locked. This resulted in the completion attempts
exhausted setting being disabled whenever the quiz was saved
as it did not detect the require passing grade setting.
This changes the behaviour so that validation is only performed
if the completion settings are unlocked.
A behat test is included to ensure the setting does not change.
2021-11-17 09:02:51 +11:00
Eloy Lafuente (stronk7) ba28c8f782 weekly release 3.11.4+ 2021-11-16 13:59:57 +01:00
Eloy Lafuente (stronk7) dd78b8f983 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-16 13:59:52 +01:00
Tomo Tsuyuki ff274fa59d MDL-72925 mod_forum: Filter discussion when grading 2021-11-16 15:24:50 +11:00
Jun Pataleta 4203758fa8 Merge branch 'MDL-72966-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-11-16 11:38:55 +08:00
Faisal Kaleem d0c0a787dd MDL-72967 lib: fix typo in excellib insert_bitmap() method 2021-11-16 10:33:31 +08:00
AMOS bot b884ed5941 Automatically generated installer lang files 2021-11-16 00:07:24 +00:00
Shamim Rezaie bb1be809d1 MDL-70721 output: Remove redundant title
The format_string() function does half html escaping. It escapes < and >
characters, but does not escape ". Therefore, it put us in a situation
where neither {{}}, nor {{{}}} are suitable in templates. If we use {{}}
for an attribute (like title or aria-label), then < and > characters
will be double escaped. On the other hand, if we use {{{}}} there, a
double quote character will break HTML when it is used in an attribute.
Therefore, neither {{}}, nore {{{}}} are usable in html attributes.

Moreover, The title attribute here was redundant because it had the same
value as the link's text.
2021-11-16 10:09:11 +11:00
Shamim Rezaie c587c353c5 MDL-70721 output: remove {{#quote}} wherever it was misused
Also use the new {{#cleanstr}} helper where it was more appropriate
than the {{#str} helper.
2021-11-16 10:09:10 +11:00
Eloy Lafuente (stronk7) 4e66f86add Merge branch 'MDL-72096-311' of https://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-11-15 19:13:09 +01:00
Eloy Lafuente (stronk7) c107be7b61 Merge branch 'MDL-72908-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-15 18:58:59 +01:00
Paul Holden 23b87ccdd7 MDL-72908 admin: correctly distinguish purging all/selected caches. 2021-11-15 12:20:03 +00:00
Michael Hawkins d5038f41fe MDL-72096 core: Add safe ORDER BY helpers for db sorting from user input
The new get_safe_orderby() and get_safe_orderby_multiple() methods
provide a centralised safe way for user submitted sorting values to be
incorporated into SQL ORDER BY. They do this by removing the need for
user submitted data to pass in any SQL and not allowing arbitrary
column values, instead using string keys which map to a predefined
list of allowed sortable columns.
2021-11-15 19:47:49 +08:00
Shamim Rezaie 3c9e9efc97 MDL-70721 core: a new mustache helper to clean string after get_string 2021-11-15 22:16:05 +11:00
Thong Bui 6eb4b2d437 MDL-72966 File upload: Uncaught Error from JS when uploading the file 2021-11-15 07:33:28 +07:00
PraiseSatan 8bfe7b0759 MDL-69496 form: Check if element has attributes
Checks if a form element has attributes before
trying to get the default value. This fixes
an error when trying to get the default value
for a frozen group which does not have the
attributes array.
2021-11-15 09:41:54 +11:00
Paul Holden ec0558f5ba MDL-72791 customfield: correct access checks for course search data. 2021-11-12 15:08:49 +00:00
Paul Holden 0efdee5e6e MDL-72443 files: support svg preview as with other image types. 2021-11-12 15:07:09 +00:00
Eloy Lafuente (stronk7) 5d7fa92613 weekly release 3.11.4+ 2021-11-12 13:40:33 +01:00
Eloy Lafuente (stronk7) fc47a37c54 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-12 13:40:29 +01:00
Jun Pataleta 4d15d33bee Merge branch 'MDL-61671-311' of git://github.com/jleyva/moodle into MOODLE_311_STABLE 2021-11-12 10:49:08 +08:00
Shamim Rezaie 8f22de6a46 Merge branch 'MDL-60850-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-11-12 13:00:27 +11:00
Jun Pataleta a33234adf2 MDL-60850 mod_lti: Centre-align tool configure form elements 2021-11-12 09:41:49 +08:00
Jun Pataleta 5186a0bef8 Merge branch 'MDL-72982-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-11-11 23:01:23 +08:00
Luuk Verhoeven c8a93bcabe MDL-72982 tool_dataprivacy: add class name to email table 2021-11-11 22:59:05 +08:00
Sara Arjona 2a31eb2aba Merge branch 'MDL-71751-311' of https://github.com/nguyenphuctien/moodle into MOODLE_311_STABLE 2021-11-11 12:44:33 +01:00
Andrew Nicols 0b18f96813 MDL-71751 js: Do not stop propagation on drop, and handle it properly 2021-11-11 15:57:26 +07:00
Jun Pataleta 41624e65d6 Merge branch 'MDL-72552-311' of https://github.com/spvickers/moodle into MOODLE_311_STABLE 2021-11-11 11:42:21 +08:00
Andrew Nicols 34e1739a71 Merge branch 'MDL-73026-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-11-11 11:01:51 +08:00
Eloy Lafuente (stronk7) 8aab9fc84e Merge branch 'MDL-72696-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-10 19:21:06 +01:00
Jun Pataleta b68667b9c2 Merge branch 'MDL-72992-311' of git://github.com/cameron1729/moodle into MOODLE_311_STABLE 2021-11-10 18:38:11 +08:00
Juan Leyva b8c4c7694b MDL-61671 tool_mobile: Improve certificate checks
Support different curl implementations and skip last certificate checks in some cases.
2021-11-09 17:06:20 +01:00
AMOS bot 793359862b Automatically generated installer lang files 2021-11-09 00:07:27 +00:00
Sara Arjona 55aa143507 Merge branch 'MDL-72994-311' of https://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2021-11-08 16:38:06 +01:00
Sara Arjona 5cb47da3f1 Merge branch 'MDL-72950_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-11-08 15:33:53 +01:00
Jun Pataleta 528f17d06e MDL-73026 theme: Override Bootstrap modal styles for close button
* Adjust the margins to accommodate the button outline so that it
doesn't look clipped.
* Inherit the opacity when the button receives focus to improve the
focus outline's contrast.
2021-11-08 21:44:35 +08:00
Paul Holden 7b22dff89a MDL-72696 behat: support inplace editable fields of type select.
If an inplace editable field is using the "select" type, we should
treat it as a select field when setting it's value during scenarios.
2021-11-08 13:12:25 +00:00
Eloy Lafuente (stronk7) da0f55caa1 MDL-72950 phpunit: Remove skipped tests now that the issue is fixed.
The problem (coincidence of contexts) was detected when running
oracle phpunit tests, so we skipped the tests as part of MDL-72743.

Now, with the problem fixed (previous commit), we can bring back
that test.
2021-11-06 11:06:36 +01:00
Eloy Lafuente (stronk7) 0de172734c MDL-72950 restore: Avoid qcat conflicts with matching contexts
Though it's really rare for this to happen (it only was discovered
when running unit tests with Oracle), it's possible to get
problems restoring courses when context ids in the backup file
do match existing contexts in the restore target site in certain
ways (see the issue for more information).

This change just ensures that every call to the method (that
happens 4 times, for sys, coursecat, course and module levels):

prechek_precheck_qbanks_by_level()

Is processed always for that level. Before the patch it was
possible (hardly but possible) to return question categories
belonging to another level when some qcats contexts were matching
between the backup file and the target site.
2021-11-06 11:06:35 +01:00
Eloy Lafuente (stronk7) e1ad263f90 Moodle release 3.11.4 2021-11-06 10:34:18 +01:00
Luca Bösch 708c3d4b90 MDL-72994 themes: Align Roles column in additional roles. 2021-11-05 23:59:21 +01:00
Ilya Tregubov 107dc9be23 weekly release 3.11.3+ 2021-11-05 19:18:33 +02:00
Ilya Tregubov 59f7f1c961 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-05 19:18:30 +02:00
Huong Nguyen 7293a38647 MDL-71918 Calendar: Improve capability checks when fetching events 2021-11-05 13:15:41 +08:00
Jun Pataleta 91a51bbf24 Merge branch 'MDL-72667-311-fix' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-05 12:44:47 +08:00
Simey Lameze 05f4ac39fa MDL-72667 assign: change overdue message to darker red 2021-11-05 12:42:11 +08:00
Jun Pataleta fa9632cb54 Merge branch 'MDL-72679-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-11-05 12:40:55 +08:00
Andrew Nicols d905332e97 Merge branch 'MDL-72990-311' of https://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-11-05 11:58:29 +08:00
Andrew Nicols ceba19a45c Merge branch 'MDL-71439_311' of https://github.com/mdjnelson/moodle into MOODLE_311_STABLE 2021-11-05 11:32:59 +08:00
Jun Pataleta 3dcfe5a4c0 Merge branch 'MDL-72688-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-11-05 11:23:43 +08:00
Víctor Déniz ddc368559d Merge branch 'MDL-72945-311' of git://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-11-05 01:47:46 +00:00
Shamim Rezaie a7889e19ee MDL-72688 contentbank: Some accessibility improvements described below
- Label the table/list with aria-label
- Hide sort buttons from screen-readers and use aria-sort instead
- Remove the redundant title from decorative thumbnails
2021-11-05 12:46:05 +11:00
Shamim Rezaie eaaf4e9486 MDL-72688 contentbank: Add and maintain appropriate aria roles
Also moved header text into the sorting button as per the example at
https://dequeuniversity.com/library/aria/table-sortable
2021-11-05 12:46:05 +11:00
Víctor Déniz adc358399e Merge branch 'MDL-72969-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-05 01:19:37 +00:00
AMOS bot 55a21bfe31 Automatically generated installer lang files 2021-11-05 00:07:25 +00:00
Jun Pataleta 1cdea1f1ea Merge branch 'MDL-72667-311' of https://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-04 22:05:57 +08:00
Simey Lameze 7909173f5d MDL-72667 message: fix contrast issue in the drawer 2021-11-04 21:14:21 +08:00
Simey Lameze bf711cc097 MDL-72667 notifications: improve colour contrast 2021-11-04 21:06:01 +08:00
Simey Lameze 162751f709 MDL-72667 lesson: improve colour contrast of correct text 2021-11-04 21:04:44 +08:00
Simey Lameze 93dc1eb447 MDL-72667 assign: improve contrast of not graded text 2021-11-04 21:04:44 +08:00
Jun Pataleta e2e6731171 Merge branch 'MDL-72672-311' of https://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-11-04 18:23:00 +08:00
Simey Lameze 8c59e41bfa MDL-72672 lesson: make edit collapsed table responsive 2021-11-04 18:20:35 +08:00
Simey Lameze b1f87d5ef0 MDL-72672 lesson: make detailed stats table responsive 2021-11-04 18:20:35 +08:00
Simey Lameze b874c56751 MDL-72672 lesson: make attempts table responsive 2021-11-04 18:20:34 +08:00
Simey Lameze 4c4abafedc MDL-72672 lesson: add label for true/false checkboxes 2021-11-04 18:20:33 +08:00
Simey Lameze 36e2b9cd95 MDL-72672 lesson: add label for multichoice checkboxes 2021-11-04 18:20:32 +08:00
Simey Lameze 214c3994df MDL-72672 lesson: remove unnecessary nowrap
This commit also remove some deprecated table properties as well.
2021-11-04 18:20:31 +08:00
Simey Lameze 7e69d60652 MDL-72672 mod_lesson: add aria-label to actions select element 2021-11-04 18:20:30 +08:00
Sara Arjona cbc7cdb686 Merge branch 'MDL-72949-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-11-04 10:33:29 +01:00
Cameron Ball f372737b2f MDL-72992 assign: Allow gradebook to override feedback when empty 2021-11-04 15:47:21 +08:00
Nathan Nguyen 41868f952b MDL-72679 qtype_ddmarker: Fix incorrect positions in multiple viewportss
Co-authored-by: Huong Nguyen <huongnv13@gmail.com>
2021-11-04 14:42:50 +07:00
Jun Pataleta 70bb50e3b7 Merge branch 'MDL-72668-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-11-04 12:04:01 +08:00
Shamim Rezaie c6f3ea3932 MDL-72990 badges: Use imagecaption as alternative text for badge image 2021-11-04 15:03:32 +11:00
Shamim Rezaie d0d82e9f34 MDL-72668 block_badges: Add alt attribute to badge images 2021-11-04 14:17:36 +11:00
Shamim Rezaie ced90c8a18 MDL-72668 core: Highlight the focused tree item in a tree. 2021-11-04 14:17:35 +11:00
Shamim Rezaie 6e5c04f6c5 MDL-72668 block_private_files: Switched from YUI to core/tree AMD 2021-11-04 14:17:33 +11:00
Víctor Déniz 99c7eacdeb Merge branch 'MDL-72895-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-04 01:47:38 +00:00
Paul Holden 7012c95569 MDL-70823 qtype_ddwtos: new method for safer feedback unserializing. 2021-11-03 16:57:15 +01:00
Paul Holden cdc80e6bfd MDL-70823 mod: safely parse module display options array. 2021-11-03 16:57:15 +01:00
Paul Holden 294fa223c9 MDL-70823 blocks: safer unserializing during block restore. 2021-11-03 16:57:15 +01:00
Paul Holden f8fed9810a MDL-70823 core: safer alternative for unserializing objects. 2021-11-03 16:57:14 +01:00
sangnguyena d01f8ac051 MDL-72949 WS: Return coursegraceperiod setting in tool_mobile_get_config 2021-11-03 16:12:13 +07:00
Ilya Tregubov 0316f650ed Merge branch 'MOODLE_311_MDL-72953' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2021-11-03 10:34:47 +02:00
Andrew Nicols e504d7159c MDL-72894 courseexport: Whitespace fix 2021-11-03 16:11:27 +08:00
Andrew Nicols 98a784483a Merge branch 'MDL-72894-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-03 16:11:23 +08:00
Sara Arjona 72a7266a87 Merge branch 'MDL-72977-311' of https://github.com/juancs/moodle into MOODLE_311_STABLE 2021-11-03 09:04:00 +01:00
Ilya Tregubov 3cb24afce3 Merge branch 'MDL-71872-311' of https://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-11-03 09:27:24 +02:00
Jun Pataleta 7bf69ea780 Merge branch 'MDL-72687-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-11-03 11:57:17 +08:00
Mikhail Golenkov 7552335ccf MDL-72953 core_lang: Add string for new timezone Pacific/Kanton 2021-11-03 11:43:14 +11:00
AMOS bot af5e30b2b2 Automatically generated installer lang files 2021-11-03 00:07:26 +00:00
Paul Holden 1cdacd7771 MDL-72370 badges: require sesskey to remove related badge. 2021-11-02 18:04:15 +01:00
Ilya Tregubov fa363b52eb MDL-70887 mlbackend_python: Update to latest version. 2021-11-02 18:04:15 +01:00
Simey Lameze 2a22a20251 MDL-72571 tool_filetypes: change extension param to PARAM_ALPHANUMEXT 2021-11-02 18:04:15 +01:00
Sara Arjona 5ce9c733ce Merge branch 'MDL-72857-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-02 18:01:06 +01:00
Eloy Lafuente (stronk7) 8ecf433c53 weekly release 3.11.3+ 2021-11-02 14:07:54 +01:00
Eloy Lafuente (stronk7) a4aefa9c98 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-11-02 14:07:49 +01:00
Juan Segarra Montesinos 40124ef728 MDL-72977 qtype_essay: Honor Information for graders text format. 2021-11-02 12:21:38 +01:00
Simey Lameze 66cf7b94db MDL-72687 assign: move labels for toggle zoom icons to the <a> 2021-11-02 13:55:25 +08:00
Simey Lameze 04e8993910 MDL-72687 assign: move labels for collapse buttons to the button 2021-11-02 13:55:25 +08:00
Simey Lameze 96ea7a04ed MDL-72687 assign: remove title attr from view all submissions link 2021-11-02 13:55:25 +08:00
Simey Lameze 7137b20762 MDL-72687 assign: move label from the edit settings icon to <a> 2021-11-02 13:55:25 +08:00
Simey Lameze 6cb38c56fa MDL-72687 assign: remove presentation role from profile image 2021-11-02 13:55:25 +08:00
Simey Lameze f619fb8df4 MDL-72687 assign: fix email and due date cut off whem zooming 2021-11-02 13:55:25 +08:00
Simey Lameze 994952712c MDL-72687 assign: fix colour picker broken aria menu 2021-11-02 13:55:25 +08:00
Simey Lameze 77a84ad325 MDL-72687 assign: fix stamp picker broken aria menu 2021-11-02 13:55:25 +08:00
Simey Lameze ea35916f09 MDL-72687 assign: fix change filter element tab navigation 2021-11-02 13:55:24 +08:00
Simey Lameze 380b565487 MDL-72687 assign: use correct aria role for toolbar 2021-11-02 13:55:24 +08:00
Simey Lameze fe7b49250d MDL-72687 assign: add missing label to change user element 2021-11-02 13:55:24 +08:00
Simey Lameze e0077b7175 MDL-72687 assign: display a more friendly link when not graded 2021-11-02 13:55:24 +08:00
Simey Lameze 210c80e48e MDL-72687 assign: add missing aria-label to prev/next arrows 2021-11-02 13:55:24 +08:00
Simey Lameze 6f1773b841 MDL-72687 form: only add legend tag if a label is set 2021-11-02 13:55:24 +08:00
Andrew Nicols eb6a7272f9 Merge branch 'MDL-72884-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-11-02 11:34:07 +08:00
Andrew Nicols 63f865a594 Merge branch 'MDL-72767-m311' of https://github.com/NeillM/moodle into MOODLE_311_STABLE 2021-11-02 11:28:43 +08:00
AMOS bot 1808fd1d22 Automatically generated installer lang files 2021-11-02 00:07:26 +00:00
Paul Holden 78f2c07d30 MDL-72969 output: correct ansi colour format codes for check results. 2021-11-01 17:12:05 +00:00
Huong Nguyen 521591639c MDL-71872 Questions: The placeholder disappears when double-clicking 2021-11-01 17:30:23 +07:00
Paul Holden 40451d3a90 MDL-72857 badges: filter site/course name when showing issued badge. 2021-11-01 10:20:52 +00:00
Neill Magill 137a1ef570 MDL-72767 forum: Stop duplicate digests being created
This change is to stop there being a possibility of 2 digests tasks
being created for a user on the day that MDL-72767 is applied.
2021-11-01 08:50:29 +00:00
Neill Magill 29f8071c3b MDL-72767 forum: Ensure digests are sent
Before this change if a new post was made after the digest time but
before todays daily digest had been sent the run time on the digest
would be set to the next day resulting in no digest being sent to
the user.

By adding the server midnight to the custom data on the task we
ensure that in this case a new adhoc task is created for the next
day leaving the current one to get processed.

Server midnight is used so that if the digest time setting is
changed we would not get two tasks queued for the same day.
2021-11-01 08:50:28 +00:00
Neill Magill 23f8a8b2d5 MDL-72767 forum: Fix PHPDoc 2021-11-01 08:50:28 +00:00
Andrew Nicols fcbb050b48 Merge branch 'MDL-72921_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-11-01 08:55:32 +08:00
AMOS bot 3dd0115779 Automatically generated installer lang files 2021-10-30 00:07:25 +00:00
Eloy Lafuente (stronk7) b97643453d MDL-72921 generators: exported users now match the plan size definition
Before this patch the exported users (to csv file that jmeter consumes)
were all the enrolled users in the test course. And that's ok when the
number of users enrolled match the number of concurrent threads planned
for a jmeter plan (each thread is a user).

But when both numbers don't match, that can lead to the jmeter plan
not behaving as expected, because it iterates over the excessive users
in the file, leading to some users having run 5 loops, others 4...

The only way to make results more consistent is to, always, ensure that
the number of users exported for the plan match the plan size and not
the site size.

And that's what this issue exactly does, restrict the export to the
number of threads that the plan will have. So every user always runs
the very same number of loops.
2021-10-29 18:03:44 +02:00
Eloy Lafuente (stronk7) ee1c3d9837 weekly release 3.11.3+ 2021-10-29 17:10:11 +02:00
Eloy Lafuente (stronk7) f8c673b03c Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-29 17:10:07 +02:00
Eloy Lafuente (stronk7) acf393873e MDL-72743 phpunit: Skip test until MDL-72950 is fixed
It's good to keep the test because it's not easy to
reproduce the issue to be fixed. Part of the fix will
be to remove this skip.
2021-10-29 13:59:38 +02:00
Huong Nguyen 3cef1996eb MDL-72895 Assignment: Fix colour contrast for grading navigation 2021-10-29 18:53:13 +08:00
Shamim Rezaie 3c1f14fb22 Merge branch 'MDL-72874-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-10-29 03:34:47 +11:00
Shamim Rezaie 82e055104c Merge branch 'MDL-72924-fix-component-initialisation-for-performance-checks-MOODLE_311_STABLE' of https://github.com/keevan/moodle into MOODLE_311_STABLE 2021-10-29 02:57:01 +11:00
Sara Arjona 3fa45f00c6 MDL-72945 badges: use default issuer contact
The defaultissuercontact was ignored if the sitebackpack email was set
to empty string..
2021-10-28 17:47:20 +02:00
Víctor Déniz fab5e031f9 Merge branch 'MDL-72912_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2021-10-28 15:45:28 +01:00
Víctor Déniz 9afd3da2b3 Merge branch 'MDL-72901_311' of https://github.com/timhunt/moodle into MOODLE_311_STABLE 2021-10-28 13:49:10 +01:00
Ilya Tregubov fb800de092 Merge branch 'MDL-72670-311' of git://github.com/cameron1729/moodle into MOODLE_311_STABLE 2021-10-28 13:14:53 +02:00
Eloy Lafuente (stronk7) 0a8666b01a MDL-72743 tests: tidy up the new test with NS/name/covers
Ideally any new test should be using a class name matching
the file name, and to use namespace when clearly belonging to
a component (sub-namespace also allowed for better accuracy).

And, also, adding a @covers label to indicate which class
(preferred, method is also possible) is being covered with the test.
2021-10-28 13:11:37 +02:00
Eloy Lafuente (stronk7) 48c3f683a6 Merge branch 'MDL-72743-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-28 13:11:27 +02:00
Andrew Nicols 256242cfd7 Merge branch 'MDL-72871_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-28 14:16:10 +08:00
Jun Pataleta 8850a21f66 Merge branch 'MDL-72316-311-2' of git://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-10-28 13:50:27 +08:00
Michael Hawkins 0f6ab8bf12 MDL-72316 filelib: Add ability for modules to directly load SVG images
This also implements the functionality for SCORM packages, which may
have SVG images embedded within their content which require loading
directly (and are only created by users with appropriate risk flag).
2021-10-28 12:58:41 +08:00
Kevin Pham c21d587016 MDL-72924 check: Fix component initialisation for performance checks 2021-10-28 14:25:48 +11:00
Eloy Lafuente (stronk7) 7165c2ac74 Merge branch 'MDL-72879-311-enfix' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-10-27 22:12:24 +02:00
Jun Pataleta 0421a9aba5 Merge branch 'MDL-72669-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-10-27 15:07:38 +08:00
Mark Nelson 53a4d06a8d MDL-71439 core_grades: return a blank mustache template for letters 2021-10-27 12:20:21 +08:00
Mark Nelson 6070bbb37b MDL-71439 mod_forum: display user grade from web service 2021-10-27 12:20:21 +08:00
Mark Nelson f13e3235c4 MDL-71439 core_grades: return result of new method in web services 2021-10-27 12:20:21 +08:00
Mark Nelson 20b3b4c38d MDL-71439 core_grades: add new method 'get_formatted_grade_for_user' 2021-10-27 12:20:21 +08:00
Mark Nelson 641b5a27ab MDL-71439 core_grades: fixed undefined class issues 2021-10-27 12:20:21 +08:00
Mark Nelson ea996d378b MDL-71439 core_grades: remove returning null when not possible
The method explicitly declares 'stdClass' as the return type.
2021-10-27 12:20:21 +08:00
AMOS bot f4f8118ad6 Automatically generated installer lang files 2021-10-27 00:07:26 +00:00
Eloy Lafuente (stronk7) dd89bfab41 MDL-72871 cleanup: Remove incorrect whitespace from codebase
Differences can be checked with git diff --ignore-all-space and
that will show that the only non-whitespace change is in a test
in the git lib/tests/html2text_test.php file. In that case the
whitespace has been replaced by a quoted string (of whitespaces)
keeping the test 100% equivalent and workarrounding the whitespace.
2021-10-26 17:19:17 +02:00
Stephen Vickers 38882aa139 MDL-72552 mod_lti: Add context_memberships_v2_url custom parameter 2021-10-26 15:49:25 +01:00
Víctor Déniz b8e5f7b428 weekly release 3.11.3+ 2021-10-26 13:44:06 +01:00
Víctor Déniz bb033deac1 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-26 13:44:00 +01:00
Tim Hunt 90d04a010b MDL-72912 questions: fix type of question_display_options::$context 2021-10-26 08:06:19 +01:00
Helen Foster 6509786f2b MDL-72879 lang: Import fixed English strings (en_fix) 2021-10-25 20:57:04 +02:00
Paul Holden 2a6554678e MDL-72894 course: format name and summary data for download.
The names and summaries of course elements (i.e. the course
itself, plus sections and modules) included when downloading
it's content are now passed through appropriate methods to
format their values.
2021-10-25 08:08:01 +01:00
Andrew Nicols 8bd492084d Merge branch 'MDL-71750-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-10-25 13:58:27 +08:00
AMOS bot ba376027e8 Automatically generated installer lang files 2021-10-24 00:07:27 +00:00
Tim Hunt f89a6106fa MDL-72901 question: add missing {$a} in string attemptfinishedsubmitting 2021-10-22 23:15:58 +01:00
Ilya Tregubov fa492071fe weekly release 3.11.3+ 2021-10-22 12:49:04 +02:00
Shamim Rezaie 6215cbba29 MDL-72669 qtype_multianswer: Replace empty option with NBSP 2021-10-22 16:02:19 +11:00
Víctor Déniz 9b67243b6b Merge branch 'MDL-72607-MOODLE-311-STABLE_fix_media_vimeo_url_parser' of https://github.com/praxisdigital/moodle into MOODLE_311_STABLE 2021-10-22 00:02:32 +01:00
Paul Holden 544ee202ca MDL-72884 atto_image: improve svg support in editor dialogue.
Where the dimensions of an image are not present, we should use
sensible defaults so that the dialogue is still usable.
2021-10-21 23:58:32 +01:00
Paul Holden fe3441d95f MDL-72743 mod_quiz: verify user mapping prior to restoring attempts. 2021-10-21 08:26:41 +01:00
Eloy Lafuente (stronk7) d524f2eadc Merge branch 'MDL-72013-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-10-21 09:23:04 +02:00
Andrew Nicols 8159824033 Merge branch 'MDL-72507-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-10-21 12:57:36 +08:00
Andrew Nicols babe07eec3 MDL-72874 behat: Allow behat window sizes to be modified during run
In some situations it is useful to modify the requested screensize by a
modifier. This allows for failing tests to be rerun at a different
screensize, where the original screensize triggered a failure for some
size-related reason.
2021-10-21 10:26:01 +08:00
Andrew Nicols e88926fb4f MDL-72013 js: Configure eslint-jsdoc plugin
This change adds configuration for the eslint-jsdoc plugin in order to
detect the following errors with jsdoc blocks:
* missing params
* params in incorrect order
* params with no type defined
* properties incorrectly defined
* incorrect use of @package
* incorrect values for @access

In addition, warnings will be thrown where indentation is incorrect.
2021-10-21 08:52:57 +08:00
Andrew Nicols 0d6e90470b MDL-72013 js: Add eslint-jsdoc plugin 2021-10-21 08:52:57 +08:00
Andrew Nicols a5c1b7924d MDL-72013 js: Fix jsdocs to meet stricter eslint 2021-10-21 08:52:57 +08:00
Ilya Tregubov be58e75573 Merge branch 'MDL-72639-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-20 13:01:01 +02:00
Eloy Lafuente (stronk7) ff37cc27be Merge branch 'MDL-72849-m311' of https://github.com/sammarshallou/moodle into MOODLE_311_STABLE 2021-10-19 22:17:15 +02:00
sam marshall b449a10a09 MDL-72849 tool_behat: Use of xpath name() not compatible with Firefox
The xpath name() function returns upper-case e.g. 'IMG' in Firefox and
lower-case e.g. 'img' in Chrome.
2021-10-19 13:49:52 +01:00
Ilya Tregubov 68cd3002ce Merge branch 'MDL-71270-311' of git://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-10-19 14:45:30 +02:00
Eloy Lafuente (stronk7) 261bc97b3e weekly release 3.11.3+ 2021-10-19 12:51:49 +02:00
Eloy Lafuente (stronk7) 4ef90e61e9 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-19 12:51:44 +02:00
Andrew Nicols b71cc1f99d MDL-71785 mod_quiz: Correct string as per reviewer feedback 2021-10-19 11:20:26 +08:00
Andrew Nicols 932c5faef9 Merge branch 'MDL-71785_311' of https://github.com/StudiUM/moodle into MOODLE_311_STABLE 2021-10-19 11:20:24 +08:00
Sara Arjona 49285bf337 Merge branch 'MDL-72590-311' of git://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2021-10-18 17:38:38 +02:00
Luca Bösch e8f4b6ff60 MDL-72590 enrol: Course in success message after unenroll passes filter 2021-10-18 16:38:02 +02:00
Sara Arjona 8639d45416 Merge branch 'MDL-72064-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-10-18 12:59:44 +02:00
Michael Hawkins 800d0e7ad4 MDL-71270 core: Updated security.txt expiry 2021-10-18 17:14:07 +08:00
Sam Møller 81c0b420c6 MDL-72607 media_vimeo: Fix vimeo URL parser
Fix vimeo URL parser to support the new vimeo URL format with privacy
settings (the video with password or domain restricted setting).
For example "https://vimeo.com/123456789/2bffff0000" the plugin must
parse the URL "https://player.vimeo.com/video/123456789?h=2bffff0000"
to the iframe source to make it compatible with the new vimeo URL
format.
See more about vimeo video privacy settings at
https://vimeo.com/blog/post/video-privacy-explained/
2021-10-18 08:52:38 +02:00
Andrew Nicols 5d54d89044 Merge branch 'MDL-65943-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-10-18 14:04:41 +08:00
Huong Nguyen ed3f7bb078 MDL-65943 media_videojs: add videojs-ogvjs plugin
VideoJS now support to play Ogg Vorbis/Opus/Theora and WebM VP8/VP9/AV1 video on:
 - Safari on Mac OS
 - Safari on iPhone OS
 - Safari on iPad OS
2021-10-18 11:39:59 +07:00
AMOS bot b881fff43f Automatically generated installer lang files 2021-10-16 00:07:33 +00:00
Shamim Rezaie ea0487cdef weekly release 3.11.3+ 2021-10-16 00:29:22 +11:00
Shamim Rezaie 44749626b0 Merge branch 'MDL-71344-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-10-15 14:24:56 +11:00
Jun Pataleta 9b83cae1b5 Merge branch 'MDL-72623_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-15 09:47:21 +08:00
Jun Pataleta cc4e898144 Merge branch 'MDL-72807_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-15 09:08:21 +08:00
Eloy Lafuente (stronk7) 1114a3755a Merge branch 'MDL-26633-311-workshopnumofreviews' of git://github.com/mudrd8mz/moodle into MOODLE_311_STABLE 2021-10-14 22:40:52 +02:00
Eloy Lafuente (stronk7) 95694f0965 Merge branch 'MDL-68325-311' of git://github.com/odeialba/moodle into MOODLE_311_STABLE 2021-10-14 22:19:31 +02:00
Eloy Lafuente (stronk7) 5912b69773 Merge branch 'MDL-72464-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-14 22:02:15 +02:00
Eloy Lafuente (stronk7) de1f45f535 MDL-72807 behat: Add a few more @skip_chrome_zerosize tags
This is the 3rd round adding the tags to some scenarios
detected to be failing with zerosize problems lately.

Note that @ MDL-71108, the final solution will happen, say
switching to own webdriver till the upstream one is fixed
or whatever. Our @skip_chrome_zerosize solution is just a
workaround to have all those scenarios detected and ignored
by normal runs.
2021-10-14 16:16:52 +02:00
Eloy Lafuente (stronk7) 4c3a318ffa MDL-72623 nodejs: Bump from v14.15.0 to v14.18.0
Without modifying any installed package or dependency
because, after trying to do so, the updated stuff is huge
and leads to some JS validation / minimisation problems.
2021-10-13 09:49:53 +02:00
Andrew Nicols 65ad94b87c weekly release 3.11.3+ 2021-10-13 09:40:48 +08:00
Andrew Nicols 74a41120d6 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-13 09:40:45 +08:00
AMOS bot 35ea0a22e3 Automatically generated installer lang files 2021-10-13 00:07:24 +00:00
Víctor Déniz 318637c781 Merge branch 'MDL-72498-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-12 15:34:11 +08:00
Huong Nguyen 06858a584a MDL-71344 questions: Improve event handler for Drag n Drop family 2021-10-11 11:05:14 +07:00
Andrew Nicols 6f4d296da2 Merge branch 'MDL-66203-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-10-11 08:36:54 +08:00
Paul Holden b413ff4684 MDL-72639 admin: consistent primary buttons during site upgrade. 2021-10-10 20:43:18 +01:00
Paul Holden 72b8b2e858 MDL-72498 report_eventlist: use core component API for event list.
The previous method of hardcoded filepaths, specifically for events
belonging to core, meant that any events belongs to core subsystems
were omitted (core_customfield, core_h5p, core_payment, etc).
2021-10-10 20:41:43 +01:00
Paul Holden c250f825ed MDL-72464 webservice: fix detection of non-expiring external tokens. 2021-10-10 20:40:38 +01:00
David Mudrák a2a309f9a0 MDL-26633 workshop: Allow to randomly allocate more than 30 reviews
For classes with many students, there may be valid cases for having more
than 30 reviews per submission / reviewer.

The patch changes the type of the input field so that it can freely
editable to any integer value.
2021-10-08 17:10:36 +02:00
Sara Arjona 0850628c6c weekly release 3.11.3+ 2021-10-08 12:43:20 +02:00
Sara Arjona 2082bc6a89 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-08 12:43:16 +02:00
Cameron Ball 2de9208ce8 MDL-72670 session: Correct read only debugging logic
Prior to this patch the debugging mode (when enabled) would trigger
on everywhere, regardless of whether or not READ_ONLY_SESSION is defined.

This patch modifies that behaviour so that the debugging only kicks in
if READ_ONLY_SESSION is defined and set to true.
2021-10-08 15:12:03 +08:00
AMOS bot 31f3479fbf Automatically generated installer lang files 2021-10-08 00:07:26 +00:00
Víctor Déniz 221ed2ac87 Merge branch 'MOODLE_311_MDL-64576' of https://github.com/golenkovm/moodle into MOODLE_311_STABLE 2021-10-07 22:29:50 +01:00
Eloy Lafuente (stronk7) 2266158778 Merge branch 'MDL-71306-311' of https://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-07 23:10:08 +02:00
Eloy Lafuente (stronk7) e0c0c1dd17 Merge branch 'MDL-72674-311' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-10-07 22:54:00 +02:00
Eloy Lafuente (stronk7) bc7c322c62 Merge branch 'MDL-72309-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-07 22:42:57 +02:00
Eloy Lafuente (stronk7) c44a461146 Merge branch 'MDL-72635-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-10-07 22:39:04 +02:00
Eloy Lafuente (stronk7) 9a6b0b8c31 Merge branch 'MDL-72621-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-10-07 21:10:05 +02:00
AMOS bot e0fd61d727 Automatically generated installer lang files 2021-10-07 00:07:24 +00:00
Jun Pataleta 802259a6c8 Merge branch 'MDL-72339-m311' of https://github.com/sammarshallou/moodle into MOODLE_311_STABLE 2021-10-06 22:44:31 +08:00
sam marshall 4ae6235d64 MDL-72339 core_availability: Unsafe to use format_string in description
The availability condition get_description method is called while
gathering data for the modinfo object. As such it is not safe to
call other functions which might rely on modinfo, such as format_string
(if using filters which access modinfo).

This change provides a mechanism to call format_string later, and also
a general callback to do other stuff later as well if needed. It uses
the same approach already taken to make activity names work correctly
in the availability_condition class.
2021-10-06 11:26:28 +01:00
Andrew Nicols 13d8eb3321 Merge branch 'MDL-72515-311' of git://github.com/marinaglancy/moodle into MOODLE_311_STABLE 2021-10-06 12:58:39 +08:00
Ilya Tregubov 3fe1755d5d Merge branch 'MDL-72452-resource-filter-311' of https://github.com/Peterburnett/moodle into MOODLE_311_STABLE 2021-10-06 10:55:01 +07:00
Andrew Nicols ab7d7d4d57 Merge branch 'MDL-72599-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-06 09:12:42 +08:00
Eloy Lafuente (stronk7) d2c4d59f81 weekly release 3.11.3+ 2021-10-06 00:24:51 +02:00
Ilya Tregubov 26bcfa6122 Merge branch 'MDL-56773-311' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-10-05 23:26:59 +02:00
Jun Pataleta 1c8e09b4aa Merge branch 'MDL-39324-moodle311' of https://github.com/kiratskitizing/moodle into MOODLE_311_STABLE 2021-10-05 23:26:59 +02:00
Ilya Tregubov 2980b46bf8 Merge branch 'MDL-72395_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-05 23:26:59 +02:00
Simey Lameze 1bb79a6cb3 MDL-72635 calendar: fix typo in data attribute 2021-10-05 06:30:43 +08:00
Paul Holden f91d23a739 MDL-71306 cohort: ignore empty values in form autocomplete element. 2021-10-04 21:14:17 +01:00
Joshua Ebarvia 2ac4573661 MDL-39324 mod_url: Fix icon when URL has params 2021-10-04 20:04:00 +10:30
Marina Glancy c9ff42d096 MDL-72515 admin: do not call curl unnecessary on plugins page 2021-10-04 10:01:12 +02:00
Paul Holden 30830852bf MDL-72309 course: make category a required field in forms.
Course category fields were changed en masse from simple select
elements to autocompletes in 93d72205, but weren't defined as
required fields. This could lead to exceptions and/or unexpected
behaviour if their values were cleared prior to form submission.
2021-10-04 08:11:40 +01:00
Mikhail Golenkov 3550f90dad MDL-64576 completion: Fix criteria and course completion dates 2021-10-04 10:52:31 +11:00
Shamim Rezaie 99af155ddd MDL-66203 mod_assign: Reset submission status when removing a submission 2021-10-04 02:12:43 +11:00
Eloy Lafuente (stronk7) 2a0e7b1d8c MDL-72395 composer: Update to newer dependencies
More notably PHPUnit to 9.5.9 that comes with some good fixes
and better support for go prospecting php81 (beta) status.

Generated with php73, that is the lower version supported
by this branch, following the instructions @ https://docs.moodle.org/dev/Composer
2021-10-02 22:46:11 +02:00
Eloy Lafuente (stronk7) d5e66b50b3 weekly release 3.11.3+ 2021-10-02 22:05:12 +02:00
Eloy Lafuente (stronk7) 55aa35d9fe Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-10-02 22:05:08 +02:00
Eloy Lafuente (stronk7) 59e08ceb6d Merge branch 'MDL-72714_311' of git://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-10-02 15:29:28 +02:00
Eloy Lafuente (stronk7) f3a6d622a2 MDL-72714 behat: Add new @skip_chrome_zerosize labels
With the move from Chrome 93 to 94 a few new "zerosize" cases
have appeared, this just protect us from them, so they
are run apart.
2021-10-02 12:17:51 +02:00
Eloy Lafuente (stronk7) 2704764d80 MDL-72714 behat: fix problem with button on the edge and failing
Surprise came with Chrome 94, so applying the usual trick by
changing window size. Hopefully some day we'll be able to
revert all them (Chrome 123).
2021-10-02 12:17:51 +02:00
Víctor Déniz 61e68a15a1 MDL-72714 behat: Fix Behat failures for chrome 94. 2021-10-01 11:56:47 +01:00
abgreeve 5f26d8c331 Merge branch 'MDL-69682-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-10-01 11:24:46 +08:00
Jun Pataleta 7c814fa48f MDL-72674 core: Add indicator that feedback link opens in new window
* New pix icon i/externallink
* New lang string opensinnewwindow
* Use the external link pix icon with "Opens in new window" lang string
 as its alt text and add it to the "Give feedback about this software"
 link.
* Update cta template to indicate whether the link opens in new window.
2021-10-01 10:39:22 +08:00
Andrew Nicols f603c2c38e Merge branch 'MDL-72673-311' of git://github.com/junpataleta/moodle into MOODLE_311_STABLE 2021-10-01 10:23:44 +08:00
Eloy Lafuente (stronk7) 207174aa0a Merge branch 'MDL-72484-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-30 23:19:15 +02:00
Víctor Déniz ced66d9d66 Merge branch 'MDL-72496-311_assert_tag' of https://github.com/call-learning/moodle into MOODLE_311_STABLE 2021-09-30 15:41:09 +01:00
Laurent David d0958a89f9 MDL-72496 question tests: fix assertTag if tag not found
* The basic_test::assertTag method will issue a warning as $tag is not
found, failing the PHP Unit test that uses this method.
* Add tests to check that assertTag is working
2021-09-30 13:14:34 +02:00
Thong Bui 392e57b6a0 MDL-72507 Quiz: Quiz auto-save does not detect uploaded files 2021-09-30 12:17:40 +07:00
abgreeve 250524cf5b Merge branch 'MDL-72275-311-2' of git://github.com/mickhawkins/moodle into MOODLE_311_STABLE 2021-09-30 10:03:27 +08:00
AMOS bot dbdc0e44d1 Automatically generated installer lang files 2021-09-30 00:07:25 +00:00
Eloy Lafuente (stronk7) 954bc8e887 Merge branch 'MDL-71970-311' of git://github.com/sarjona/moodle into MOODLE_311_STABLE 2021-09-29 23:27:25 +02:00
Andrew Nicols 0e0984010b MDL-72621 admin: Add environment check for admin deprecation 2021-09-29 22:39:32 +08:00
Shamim Rezaie ddff536561 Merge branch 'MDL-72060-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-09-28 20:17:12 +10:00
Adrian Perez f0bf659715 MDL-72060 mod_lti: fix comparison if user is gradable 2021-09-28 17:25:27 +08:00
AMOS bot 955ea66652 Automatically generated installer lang files 2021-09-28 00:07:32 +00:00
Paul Holden d8a1fab050 MDL-72484 report_eventlist: looser check for event 'other' docs. 2021-09-27 18:21:34 +01:00
Sara Arjona 8e1463334c MDL-71970 h5plib_v124: Replace references to new Moodle\H5Pxxx namespace
The joubel/core and joubel/editor libraries have been moved to Moodle
namespace.
This commit adds the new namespace to the places where these classes
are used.
Besides, a couple of minor changes have been done to replace the _test.php
classname and remove some unnecessary defined('MOODLE_INTERNAL').
2021-09-27 11:42:28 +02:00
Sara Arjona 79aa88fddd MDL-71970 h5plib_v124: Add namespace to H5P editor library
The joubel/editor is a third-party library. A namespace has been added to
avoid collision with other plugins using it (such as mod_hvp).
That way, they will be able to have a different version without
side effects.
2021-09-27 11:42:28 +02:00
Sara Arjona 88c5228e61 MDL-71970 h5plib_v124: Add namespace to H5P core library
The joubel/core is a third-party library. A namespace has been added to
avoid collision with other plugins using it (such as mod_hvp).
That way, they will be able to have a different version without
side effects.
2021-09-27 11:42:27 +02:00
Jun Pataleta e0dbb85732 MDL-72673 mod_glossary: Generate unique ID for Keywords select element 2021-09-24 18:31:28 +08:00
Paul Holden 0c9993773c MDL-69682 theme_boost: remove minimum height of tables.
The change that introduced this property (a3124b15) is no longer
required, and it caused visual glitches on tables containing a
single row.
2021-09-24 08:22:45 +01:00
Michael Hawkins 5b6f95647b MDL-72275 timeline: Add default offset to template
This value was being passed in the template, but the template
had 0 hardcoded instead of injecting the context value. With the other
bug fixes in this issue correctly loading the "All" view properly on
page load, this uncovered that at load time, the course view would not
load overdue items, which also meant a behat test was failing.
2021-09-24 11:23:57 +08:00
Michael Hawkins 8061730d7b MDL-72275 timeline: Make time dropdown options display consistently
The 6 month option was highlighted on load if previously selected,
which was not the case for any other options. This has been removed
so it behaves consistently.
2021-09-24 11:23:57 +08:00
Michael Hawkins ea0f449e1b MDL-72275 timeline: Fixed non-loading issue in dates sort
Incorrect setting/getting of the "seen" data attribute resulted in no
information being fetched when switching from course view back to dates
view.
2021-09-24 11:23:57 +08:00
Michael Hawkins 4564ed7412 MDL-72275 timeline: Display "all" time on page load fix
When the timeframe filter was set to "all" when the timeline
block was initially loaded, an incorrect value rendered into
the template meant the timeframe limit was set to 0 (which will
return no results) instead of setting no limit (which would fetch all
 action events, as intended).
2021-09-24 11:23:57 +08:00
AMOS bot 61339394d7 Automatically generated installer lang files 2021-09-24 00:07:32 +00:00
Ilya Tregubov 1a63bccf46 weekly release 3.11.3+ 2021-09-23 18:21:52 +02:00
Ilya Tregubov fcd3d82558 Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-09-23 18:21:50 +02:00
Jun Pataleta 9063970932 Merge branch 'MDL-72426-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-09-23 12:23:53 +08:00
Thong Bui a79905af9a MDL-71750 File upload: Disable submittion when uploading multiple files 2021-09-23 09:08:39 +07:00
AMOS bot 58bbab621c Automatically generated installer lang files 2021-09-23 00:07:27 +00:00
Eloy Lafuente (stronk7) 29e944addb Merge branch 'MDL-72110-311' of https://github.com/sharidas/moodle into MOODLE_311_STABLE 2021-09-22 20:12:18 +02:00
Eloy Lafuente (stronk7) bfec56ac5e Merge branch 'MDL-72593-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-22 10:48:18 +02:00
Jun Pataleta 86f5f11cf8 Merge branch 'MDL-51165-moodle311' of https://github.com/kiratskitizing/moodle into MOODLE_311_STABLE 2021-09-22 10:51:42 +08:00
AMOS bot 497dc38a4b Automatically generated installer lang files 2021-09-22 00:07:28 +00:00
Eloy Lafuente (stronk7) dd401b0dfe Merge branch 'MDL-71352-311' of git://github.com/lucaboesch/moodle into MOODLE_311_STABLE 2021-09-21 23:19:34 +02:00
Eloy Lafuente (stronk7) 0170fcddd0 Merge branch 'MDL-72566-311' of git://github.com/ferranrecio/moodle into MOODLE_311_STABLE 2021-09-21 19:07:27 +02:00
Eloy Lafuente (stronk7) fd54c1631f Merge branch 'MDL-69364-311-alt' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-21 18:19:32 +02:00
Ilya Tregubov f8001bbf14 MDL-70946 repository: Fix 311 branch Behat. 2021-09-21 18:09:42 +02:00
Ilya Tregubov 479d7a42d6 Merge branch 'MDL-70946-311' of git://github.com/peterRd/moodle into MOODLE_311_STABLE 2021-09-21 13:15:21 +02:00
Andrew Nicols 4f4e9b4828 MDL-72593 behat: Improve behat handling of file manager buttons
When using a try/catch for a find if the first match is not met then we
have an implicit 6 second delay waiting for the search to time out.

We can avoid this by combining the searches in a comma-separated
selection.

I have also taken the opportunity to convert the use of ->click() to the
i_click_on function which has the benefit of supporting wait for
pendingJS.
2021-09-21 16:00:41 +08:00
Andrew Nicols 4258188126 MDL-72593 behat: Load the Field node content locally for processing
The standard NodeElement functions for getAttribute, getTagName,
getParent, and friends go back to WebDriver and parse the DOM for each
request. This is insanely slow per request, and in the case of forms we
do a lot of checking to determine the field type.

This change modifies the form field detection to copy the entire node
content into a DOMDocument and parse the document locally.

This is significantly faster - in some cases where there are large
documents minutes faster.

I believe that this should be a safe change as the document fetched from
the browser is normalised to match the doctype specified.
2021-09-21 16:00:41 +08:00
Eloy Lafuente (stronk7) 78c1ecc30c Merge branch 'MDL-72205-311' of git://github.com/HuongNV13/moodle into MOODLE_311_STABLE 2021-09-20 19:05:33 +02:00
Andrew Nicols 3e2cc3cc4c MDL-69364 enrol: Improve setting of save button 2021-09-20 12:07:49 +08:00
Andrew Nicols 9fdaa9daec MDL-69364 enrol: Improve cohort test 2021-09-20 12:07:49 +08:00
Huong Nguyen df426e4a12 MDL-72205 admin: admin_setting_configduration validation improvement
The write_setting() should only use the internal validation if no validation function was provided
2021-09-20 09:18:32 +07:00
Peter Dias 48e1f7f484 MDL-70946 repository: Reenable and fix the disabled behat test 2021-09-20 08:10:09 +08:00
Joshua Ebarvia 0803f695fa MDL-51165 mod_url: allow directory index url direct access 2021-09-19 12:06:37 +09:30
Paul Holden 5279102245 MDL-72599 blocks: handle editing/deletion on admin notification page.
This was broken by changes in fdd5aef0, as the sesskey URL parameter
was required on admin/index.php in order for block related actions
to be performed uninterrupted by any redirections.
2021-09-17 12:21:46 +01:00
Luca Bösch e10d8c46e2 MDL-71352 gradereport_grader: Add icons for pass/fail. 2021-09-17 12:13:20 +02:00
Ilya Tregubov c71b2db9a3 weekly release 3.11.3+ 2021-09-17 08:58:33 +02:00
Ilya Tregubov c7485d9d5f Merge branch 'install_311_STABLE' of https://git.in.moodle.com/amosbot/moodle-install into MOODLE_311_STABLE 2021-09-17 08:58:31 +02:00
Ilya Tregubov cd6c68cf20 Merge branch 'MDL-72173-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-16 15:02:02 +02:00
Andrew Nicols 6220e076f4 MDL-72173 behat: Respect login page preference 2021-09-16 20:47:18 +08:00
Ferran Recio d70cfe4c8c MDL-72566 completion: fix missing mod bug
MDL-71899 produces a regression. When an activity plugin is not present
but it has activities in the DB the course view returns an exception.
With this patch the code will ignore missing modules when calculating
the completion.
2021-09-16 09:59:32 +02:00
Jun Pataleta 533c6717a2 Merge branch 'MDL-72173-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-16 15:39:51 +08:00
Andrew Nicols 84d82ce72e MDL-72173 behat: Fix typo Logout <> Log out 2021-09-16 15:03:07 +08:00
Jun Pataleta 773a4d7603 Merge branch 'MDL-71602-311-2' of git://github.com/rezaies/moodle into MOODLE_311_STABLE 2021-09-16 12:57:50 +08:00
Jun Pataleta 0f82d8c809 Merge branch 'MDL-72173-311' of git://github.com/andrewnicols/moodle into MOODLE_311_STABLE 2021-09-16 12:22:56 +08:00
Andrew Nicols 030dae8824 MDL-72173 behat: Add tests for login/logout steps 2021-09-16 12:20:37 +08:00
Andrew Nicols c47da95926 MDL-72173 behat: Automatically log user out on behat login 2021-09-16 12:13:26 +08:00
Andrew Nicols 3ea7982a85 MDL-72173 behat: Add and use behat logout URL 2021-09-16 12:13:25 +08:00
Jake Dallimore 189b888019 Merge branch 'MDL-71860-311' of git://github.com/lameze/moodle into MOODLE_311_STABLE 2021-09-16 11:02:51 +08:00
Jun Pataleta 5795f1b6b3 Merge branch 'MDL-72589_311' of https://github.com/stronk7/moodle into MOODLE_311_STABLE 2021-09-16 09:46:48 +08:00
AMOS bot 7bcf5222e3 Automatically generated installer lang files 2021-09-16 00:07:27 +00:00
Leon Stringer a40e05798d MDL-71860 core: Migrate lang string
Corresponding move of language string invalidpersistenterror following
move of class invalid_persistent_exception in MDL-57273.

AMOS BEGIN
 CPY [invalidpersistenterror,core_competencies],[invalidpersistenterror,core_error]
AMOS END
2021-09-16 07:00:43 +08:00
Eloy Lafuente (stronk7) 8d080e0994 Merge branch 'MDL-72432-MOODLE_311_STABLE' of https://github.com/katerynadegtyariova/moodle into MOODLE_311_STABLE 2021-09-16 00:37:20 +02:00
Eloy Lafuente (stronk7) 3671f1963e MDL-72589 behat: Create course with 3 sections (workaround)
With the default 5 sections course, after editing the activities, the
"log out" link is exactly on the edge of the view port. It's one of
those cases where Chrome fails to click/press it (have tried both).

So just make the course to have 3 sections is enough to avoid the
problem. Some day Chrome will fix that problem but, until then...
we cannot do much apart from changing the window size or try to
configure things to show differently.
2021-09-15 20:27:06 +02:00
Eloy Lafuente (stronk7) 452c5815e5 MDL-72589 behat: Add @skip_chrome_zerosize to failing scenarios
All the scenarios failing with Chrome zero-size errors are
getting the @skip_chrome_zerosize to be able to keep them apart from
regular runs. See MDL-71108 for more information about
that error.

They will be run by another job, specifically using that tag to
keep them failing and under control.
2021-09-15 20:26:51 +02:00
Jake Dallimore b73f9fec06 Merge branch 'MDL-71550-311' of git://github.com/bmbrands/moodle into MOODLE_311_STABLE 2021-09-15 10:49:45 +08:00
Jake Dallimore c1f3de62ee Merge branch 'MDL-71137-311' of https://github.com/NashTechOpenUniversity/moodle into MOODLE_311_STABLE 2021-09-15 10:12:09 +08:00
Eloy Lafuente (stronk7) 0bc281384d Merge branch '71093-moodle311-backup-honor-formatstringstriptags' of https://github.com/DSI-Universite-Rennes2/moodle into MOODLE_311_STABLE 2021-09-14 22:22:15 +02:00
Eloy Lafuente (stronk7) 7eb9672445 Merge branch 'MDL-72192-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-14 22:17:31 +02:00
Marie-Eve Lévesque c943722407 MDL-71785 core_quiz: Empty quiz section name behaves like new page 2021-09-14 14:38:18 -04:00
Ilya Tregubov bce29fbd43 Merge branch 'MDL-71961-311' of git://github.com/nguyenphuctien/moodle into MOODLE_311_STABLE 2021-09-14 12:08:58 +02:00
Ilya Tregubov bbdca02068 Merge branch 'MDL-71846-311' of git://github.com/paulholden/moodle into MOODLE_311_STABLE 2021-09-13 13:43:38 +02:00
Tien Nguyen 6115822226 MDL-71961 Quiz: Disable quiz navigation buttons when files are uploading 2021-09-13 17:44:02 +07:00
Odei Alba 1209205766 MDL-68325 completion: Add validation to course completion form 2021-09-13 12:11:53 +02:00
Andrew Nicols 1349e5d2f9 MDL-72173 behat: Switch to behat login URL 2021-09-13 11:20:35 +08:00
gthomas2 6c578308b0 MDL-72173 behat: Add alternative login file for behat 2021-09-13 11:14:02 +08:00
Thong Bui aaa2f20a5f MDL-71137 File upload: progress bar issues display when D&D multi files 2021-09-06 14:11:59 +07:00
Shamim Rezaie bef758bae6 MDL-56773 atto_equation: The equation editor should always be rtl
Also re-applied the border that was added to the preview area as part of
MDL-44778. The class name that's used no longer exists.
2021-09-03 17:58:42 +10:00
Simey Lameze 6ba8dbf909 MDL-72426 theme: fix message and notification count colour contrast 2021-09-03 12:26:36 +08:00
Peter Burnett 6f25060b32 MDL-72452 resource: Filter resource media embed output 2021-09-03 09:12:38 +10:00
Paul Holden e8b23a3efb MDL-72192 user: observe fullname capability in selector context. 2021-08-31 12:17:17 +01:00
Paul Holden 13537c6d64 MDL-71846 group: consistent escaping of user/group names. 2021-08-31 12:15:49 +01:00
Sujith Haridasan 1e67fe7005 MDL-72110 core_navigation: home page preference
Admin should respect the home page preference set
just like any other user.
2021-08-27 07:35:10 +05:30
Kateryna Degtyariova 094a136394 MDL-72342 groups: Use get_columns() to handle BOM in CSV
Ensuring that BOM was properly removed from input CSV file by using get_columns() instead of parsing the raw data.
2021-08-24 10:50:17 +10:00
Shamim Rezaie fa1da2e471 MDL-71602 qtype_essay: label essay question's answer area 2021-08-24 00:59:18 +10:00
Julien Boulen 63e37835e0 MDL-71093 backup: fix backup when activity names use HTML tags 2021-08-19 11:24:34 +02:00
Thong Bui 49d1413f72 MDL-72064 Questions: response selection area enough 2021-08-19 14:33:45 +07:00
Bas Brands 6fb325de02 MDL-71550 theme_boost: improve dropdown hover styles 2021-08-19 09:17:24 +02:00
2805 changed files with 51839 additions and 33005 deletions
+64 -5
View File
@@ -2,6 +2,7 @@
'plugins': [
'babel',
'promise',
'jsdoc',
],
'env': {
'browser': true,
@@ -191,7 +192,6 @@
'property': 'str',
'message': 'Use AMD module "core/str" or M.util.get_string()'
}],
},
overrides: [
{
@@ -200,7 +200,23 @@
rules: {
'no-undef': 'off',
'no-unused-vars': 'off',
'no-unused-expressions': 'off'
'no-unused-expressions': 'off',
// === JSDocs ===
"jsdoc/check-access": 'off',
"jsdoc/check-alignment": 'off',
"jsdoc/check-param-names": 'off',
"jsdoc/check-property-names": 'off',
"jsdoc/empty-tags": 'off',
"jsdoc/implements-on-classes": 'off',
"jsdoc/multiline-blocks": 'off',
"jsdoc/require-jsdoc": 'off',
"jsdoc/require-param": 'off',
"jsdoc/require-param-name": 'off',
"jsdoc/require-param-type": 'off',
"jsdoc/require-property": 'off',
"jsdoc/require-property-name": 'off',
"jsdoc/require-property-type": 'off',
}
},
{
@@ -211,7 +227,7 @@
},
// We're using babel transpiling so use their parser
// for linting.
parser: 'babel-eslint',
parser: '@babel/eslint-parser',
// Check AMD with some slightly stricter rules.
rules: {
'no-unused-vars': 'error',
@@ -238,11 +254,54 @@
// === Promises ===
// We have Promise now that we're using ES6.
'promise/no-native': 'off',
'promise/avoid-new': 'off'
'promise/avoid-new': 'off',
// === JSDocs ===
"jsdoc/check-access": [
'error',
],
"jsdoc/check-alignment": 1, // Recommended.
"jsdoc/check-param-names": [
'error',
],
"jsdoc/check-property-names": [
'error',
],
"jsdoc/empty-tags": [
'error',
],
"jsdoc/implements-on-classes": [
'error',
],
"jsdoc/multiline-blocks": [
'error',
],
"jsdoc/require-jsdoc": [
'error',
],
"jsdoc/require-param": [
'error',
],
"jsdoc/require-param-name": [
'error',
],
"jsdoc/require-param-type": [
'error',
],
"jsdoc/require-property": [
'error',
],
"jsdoc/require-property-name": [
'error',
],
"jsdoc/require-property-type": [
'error',
],
},
parserOptions: {
'ecmaVersion': 9,
'sourceType': 'module'
'sourceType': 'module',
'requireConfigFile': false,
}
}
]
+3 -2
View File
@@ -20,8 +20,9 @@ jobs:
uses: actions/checkout@v2
- name: Configuring node & npm
shell: bash -l {0}
run: nvm install
uses: actions/setup-node@v2
with:
node-version-file: '.nvmrc'
- name: Installing node stuff
run: npm install
@@ -111,8 +111,22 @@ module.exports = ({template, types}) => {
if (!this.seenDefine && path.get('callee').isIdentifier({name: 'define'})) {
// We only want to modify the first instance of define that we find.
this.seenDefine = true;
// Get the Moodle component for the file being processed.
var moduleName = getModuleNameFromFileName(this.file.opts.filename);
// The function signature of `define()` is:
// define = function (name, deps, callback) {...}
// Ensure that if the moduel supplied its own name that it is replaced.
if (path.node.arguments.length > 0) {
// Ensure that there is only one name.
if (path.node.arguments[0].type === 'StringLiteral') {
// eslint-disable-next-line
console.log(`Replacing module name '${path.node.arguments[0].extra.rawValue}' with ${moduleName}`);
path.node.arguments.shift();
}
}
// Add the module name as the first argument to the define function.
path.node.arguments.unshift(types.stringLiteral(moduleName));
// Add a space after the define function in the built file so that previous versions
+119 -44
View File
@@ -30,6 +30,7 @@
* @param {String} srcPath the matched src path
* @return {String} The rewritten destination path.
*/
const babelRename = function(destPath, srcPath) {
destPath = srcPath.replace('src', 'build');
destPath = destPath.replace('.js', '.min.js');
@@ -53,65 +54,139 @@ module.exports = grunt => {
// Register JS tasks.
grunt.registerTask('yui', ['eslint:yui', 'shifter']);
grunt.registerTask('amd', ['ignorefiles', 'eslint:amd', 'babel']);
grunt.registerTask('amd', ['ignorefiles', 'eslint:amd', 'rollup']);
grunt.registerTask('js', ['amd', 'yui']);
// Register NPM tasks.
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-rollup');
// Load the Babel tasks and config.
grunt.loadNpmTasks('grunt-babel');
const babelTransform = require('@babel/core').transform;
const babel = (options = {}) => {
return {
name: 'babel',
transform: (code, id) => {
grunt.log.debug(`Transforming ${id}`);
options.filename = id;
const transformed = babelTransform(code, options);
return {
code: transformed.code,
map: transformed.map
};
}
};
};
// Note: We have to use a rate limit plugin here because rollup runs all tasks asynchronously and in parallel.
// When we kick off a full run, if we kick off a rollup of every file this will fork-bomb the machine.
// To work around this we use a concurrent Promise queue based on the number of available processors.
const rateLimit = () => {
const queue = [];
let queueRunner;
const startQueue = () => {
if (queueRunner) {
return;
}
queueRunner = setTimeout(() => {
const limit = Math.max(1, require('os').cpus().length / 2);
grunt.log.debug(`Starting rollup with queue size of ${limit}`);
runQueue(limit);
}, 100);
};
// The queue runner will run the next `size` items in the queue.
const runQueue = (size = 1) => {
queue.splice(0, size).forEach(resolve => {
resolve();
});
};
return {
name: 'ratelimit',
// The options hook is run in parallel.
// We can return an unresolved Promise which is queued for later resolution.
options: async() => {
return new Promise(resolve => {
queue.push(resolve);
startQueue();
});
},
// When an item in the queue completes, start the next item in the queue.
buildEnd: () => {
runQueue();
},
};
};
const terser = require('rollup-plugin-terser').terser;
grunt.config.merge({
babel: {
rollup: {
options: {
sourceMaps: true,
comments: false,
format: 'esm',
dir: 'output',
sourcemap: true,
treeshake: false,
context: 'window',
plugins: [
'transform-es2015-modules-amd-lazy',
'system-import-transformer',
// This plugin modifies the Babel transpiling for "export default"
// so that if it's used then only the exported value is returned
// by the generated AMD module.
//
// It also adds the Moodle plugin name to the AMD module definition
// so that it can be imported as expected in other modules.
path.resolve('.grunt/babel-plugin-add-module-to-define.js'),
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-syntax-import-meta',
['@babel/plugin-proposal-class-properties', {'loose': false}],
'@babel/plugin-proposal-json-strings'
rateLimit(),
babel({
sourceMaps: true,
comments: false,
compact: false,
plugins: [
'transform-es2015-modules-amd-lazy',
'system-import-transformer',
// This plugin modifies the Babel transpiling for "export default"
// so that if it's used then only the exported value is returned
// by the generated AMD module.
//
// It also adds the Moodle plugin name to the AMD module definition
// so that it can be imported as expected in other modules.
path.resolve('.grunt/babel-plugin-add-module-to-define.js'),
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-syntax-import-meta',
['@babel/plugin-proposal-class-properties', {'loose': false}],
'@babel/plugin-proposal-json-strings'
],
presets: [
['@babel/preset-env', {
targets: {
browsers: [
">0.25%",
"last 2 versions",
"not ie <= 10",
"not op_mini all",
"not Opera > 0",
"not dead"
]
},
modules: false,
useBuiltIns: false
}]
]
}),
terser({
// Do not mangle variables.
// Makes debugging easier.
mangle: false,
}),
],
presets: [
['minify', {
// This minification plugin needs to be disabled because it breaks the
// source map generation and causes invalid source maps to be output.
simplify: false,
builtIns: false
}],
['@babel/preset-env', {
targets: {
browsers: [
">0.25%",
"last 2 versions",
"not ie <= 10",
"not op_mini all",
"not Opera > 0",
"not dead"
]
},
modules: false,
useBuiltIns: false
}]
]
},
dist: {
files: [{
expand: true,
src: grunt.moodleEnv.files ? grunt.moodleEnv.files : grunt.moodleEnv.amdSrc,
rename: babelRename
}]
}
}],
},
},
});
@@ -132,7 +207,7 @@ module.exports = grunt => {
let changedFiles = Object.create(null);
const onChange = grunt.util._.debounce(function() {
const files = Object.keys(changedFiles);
grunt.config('babel.dist.files', [{expand: true, src: files, rename: babelRename}]);
grunt.config('rollup.dist.files', [{expand: true, src: files, rename: babelRename}]);
changedFiles = Object.create(null);
}, 200);
+1 -1
View File
@@ -1 +1 @@
v14.15.0
lts/gallium
+5
View File
@@ -3724,6 +3724,11 @@
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_max_input_vars" level="optional">
</CUSTOM_CHECK>
<CUSTOM_CHECK file="lib/upgradelib.php" function="check_admin_dir_usage" level="optional">
<FEEDBACK>
<ON_CHECK message="iscustomadminwarnings" />
</FEEDBACK>
</CUSTOM_CHECK>
</CUSTOM_CHECKS>
</MOODLE>
</COMPATIBILITY_MATRIX>
+2 -3
View File
@@ -38,12 +38,11 @@ $form = new core_admin\form\purge_caches(null, ['returnurl' => $returnurl]);
if ($data = $form->get_data()) {
// Valid request. Purge, and redirect the user back to where they came from.
$selected = $data->purgeselectedoptions;
purge_caches($selected);
if (isset($data->all)) {
purge_caches();
$message = get_string('purgecachesfinished', 'admin');
} else {
purge_caches($data->purgeselectedoptions);
$message = get_string('purgeselectedcachesfinished', 'admin');
}
+48
View File
@@ -0,0 +1,48 @@
<?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/>.
/**
* Endpoint to get the Moodle version
*
* Moodle linkchecker will check this endpoint when it cannot get the Moodle version otherwise.
*
* @package core
* @copyright 2022 Victor Deniz <victor@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(__DIR__ . '/../../config.php');
require_once($CFG->libdir . '/filelib.php');
// Get public key.
$key = download_file_content(HUB_STATSPUBLICKEY);
// Check $key is a valid public key.
$publickey = openssl_pkey_get_public($key);
if ($publickey !== false) {
$publickeystr = openssl_pkey_get_details($publickey)['key'];
} else {
die('Error getting a valid public key');
}
// Encrypt data.
$message = $CFG->release;
$success = openssl_public_encrypt(utf8_encode($message), $encrypteddata, $publickeystr);
if ($success) {
echo base64_encode($encrypteddata);
} else {
die ('Error encrypting the data');
}
+17 -14
View File
@@ -220,7 +220,7 @@ class core_admin_renderer extends plugin_renderer_base {
$output .= $this->container_end();
}
$button = new single_button($continueurl, get_string('upgradestart', 'admin'), 'get');
$button = new single_button($continueurl, get_string('upgradestart', 'admin'), 'get', true);
$button->class = 'continuebutton';
$output .= $this->render($button);
$output .= $this->footer();
@@ -1616,12 +1616,18 @@ class core_admin_renderer extends plugin_renderer_base {
$plugininfo = $pluginman->get_plugins();
$numtotal = $numextension = $numupdatable = 0;
$numtotal = $numextension = $numupdatable = $numinstallable = 0;
foreach ($plugininfo as $type => $plugins) {
foreach ($plugins as $name => $plugin) {
if ($plugin->available_updates()) {
if ($res = $plugin->available_updates()) {
$numupdatable++;
foreach ($res as $updateinfo) {
if ($pluginman->is_remote_plugin_installable($updateinfo->component, $updateinfo->version, $reason, false)) {
$numinstallable++;
break;
}
}
}
if ($plugin->get_status() === core_plugin_manager::PLUGIN_STATUS_MISSING) {
continue;
@@ -1664,16 +1670,13 @@ class core_admin_renderer extends plugin_renderer_base {
$out .= $this->output->heading(get_string('overviewext', 'core_plugin'), 3);
}
if ($numupdatable) {
$installableupdates = $pluginman->filter_installable($pluginman->available_updates());
if ($installableupdates) {
$out .= $this->output->single_button(
new moodle_url($this->page->url, array('installupdatex' => 1)),
get_string('updateavailableinstallall', 'core_admin', count($installableupdates)),
'post',
array('class' => 'singlebutton updateavailableinstallall')
);
}
if ($numinstallable) {
$out .= $this->output->single_button(
new moodle_url($this->page->url, array('installupdatex' => 1)),
get_string('updateavailableinstallall', 'core_admin', $numinstallable),
'post',
array('class' => 'singlebutton updateavailableinstallall')
);
}
$out .= html_writer::div($infoall, 'info info-all').
@@ -1907,7 +1910,7 @@ class core_admin_renderer extends plugin_renderer_base {
'infos'
);
if ($pluginman->is_remote_plugin_installable($updateinfo->component, $updateinfo->version, $reason)) {
if ($pluginman->is_remote_plugin_installable($updateinfo->component, $updateinfo->version, $reason, false)) {
$box .= $this->output->single_button(
new moodle_url($this->page->url, array('installupdate' => $updateinfo->component,
'installupdateversion' => $updateinfo->version)),
+2 -1
View File
@@ -163,7 +163,8 @@ if (!empty($capabilities)) {
echo html_writer::start_tag('div', array('class'=>'submit_buttons'));
$attrs = array('type'=>'submit', 'name'=>'savechanges', 'value'=>get_string('savechanges'), 'class'=>'btn btn-primary');
echo html_writer::empty_tag('input', $attrs);
$attrs = array('type'=>'submit', 'name'=>'cancel', 'value'=>get_string('cancel'), 'class' => 'btn btn-secondary');
$attrs = array('type' => 'submit', 'name' => 'cancel', 'value' => get_string('cancel'),
'class' => 'btn btn-secondary ml-1');
echo html_writer::empty_tag('input', $attrs);
echo html_writer::end_tag('div');
echo html_writer::end_tag('div');
@@ -22,16 +22,17 @@
* @copyright 2018 Carlos Escobedo <carlos@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_role\privacy;
defined('MOODLE_INTERNAL') || die();
use \core_role\privacy\provider;
use \core_privacy\local\request\approved_contextlist;
use \core_privacy\local\request\writer;
use \core_privacy\tests\provider_testcase;
use \core_privacy\local\request\transform;
use \tool_cohortroles\api;
use \core_privacy\local\request\approved_userlist;
use core_role\privacy\provider;
use core_privacy\local\request\approved_contextlist;
use core_privacy\local\request\writer;
use core_privacy\tests\provider_testcase;
use core_privacy\local\request\transform;
use tool_cohortroles\api;
use core_privacy\local\request\approved_userlist;
/**
* Privacy test for core_role
@@ -39,7 +40,7 @@ use \core_privacy\local\request\approved_userlist;
* @copyright 2018 Carlos Escobedo <carlos@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_role_privacy_testcase extends provider_testcase {
class provider_test extends provider_testcase {
/**
* Test to check export_user_preferences.
* returns user preferences data.
+3
View File
@@ -231,6 +231,9 @@ if ($hassiteconfig) {
array('0' => new lang_string('none'), '1' => new lang_string('allfiles'), '2' => new lang_string('htmlfilesonly')));
$items[] = new admin_setting_configcheckbox('filtermatchoneperpage', new lang_string('filtermatchoneperpage', 'admin'), new lang_string('configfiltermatchoneperpage', 'admin'), 0);
$items[] = new admin_setting_configcheckbox('filtermatchonepertext', new lang_string('filtermatchonepertext', 'admin'), new lang_string('configfiltermatchonepertext', 'admin'), 0);
$items[] = new admin_setting_configcheckbox('filternavigationwithsystemcontext',
new lang_string('filternavigationwithsystemcontext', 'admin'),
new lang_string('configfilternavigationwithsystemcontext', 'admin'), 0);
foreach ($items as $item) {
$item->set_updatedcallback('reset_text_filters_cache');
$temp->add($item);
@@ -48,6 +48,6 @@
</div>
<input type="text" name="{{name}}" id="{{id}}" value="{{value}}" size="12" class="form-control text-ltr" {{#readonly}}disabled{{/readonly}}>
{{#haspreviewconfig}}
<input type="button" id="{{id}}_preview" value={{#quote}}{{#str}}preview{{/str}}{{/quote}} class="admin_colourpicker_preview">
<input type="button" id="{{id}}_preview" value="{{#cleanstr}}preview{{/cleanstr}}" class="admin_colourpicker_preview">
{{/haspreviewconfig}}
</div>
+1 -1
View File
@@ -30,7 +30,7 @@ Feature: Manage external services tokens
And I press "Delete"
And "Firstname1 Lastname1" "table_row" should not exist
@javascript
@javascript @skip_chrome_zerosize
Scenario: Tokens can be filtered by user and by service
Given the following "core_webservice > Service" exists:
| name | Site information |
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_analytics/log_info",["jquery","core/str","core/modal_factory","core/notification"],function(a,b,c,d){return{loadInfo:function loadInfo(e,f){var g=a("[data-model-log-id=\""+e+"\"]");b.get_string("loginfo","tool_analytics").then(function(b){var d=a("<ul>");f.forEach(function(a){d.append("<li>"+a+"</li>")});d.append("</ul>");return c.create({title:b,body:d.html(),large:!0},g)}).catch(d.exception)}}});
//# sourceMappingURL=log_info.min.js.map
/**
* Shows a dialogue with info about this logs.
*
* @module tool_analytics/log_info
* @copyright 2017 David Monllao {@link http://www.davidmonllao.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_analytics/log_info",["jquery","core/str","core/modal_factory","core/notification"],(function($,str,ModalFactory,Notification){return{loadInfo:function(id,info){var link=$('[data-model-log-id="'+id+'"]');str.get_string("loginfo","tool_analytics").then((function(langString){var bodyInfo=$("<ul>");return info.forEach((function(item){bodyInfo.append("<li>"+item+"</li>")})),bodyInfo.append("</ul>"),ModalFactory.create({title:langString,body:bodyInfo.html(),large:!0},link)})).catch(Notification.exception)}}}));
//# sourceMappingURL=log_info.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/log_info.js"],"names":["define","$","str","ModalFactory","Notification","loadInfo","id","info","link","get_string","then","langString","bodyInfo","forEach","item","append","create","title","body","html","large","catch","exception"],"mappings":"AAsBAA,OAAM,2BAAC,CAAC,QAAD,CAAW,UAAX,CAAuB,oBAAvB,CAA6C,mBAA7C,CAAD,CAAoE,SAASC,CAAT,CAAYC,CAAZ,CAAiBC,CAAjB,CAA+BC,CAA/B,CAA6C,CAEnH,MAAoD,CAShDC,QAAQ,CAAE,kBAASC,CAAT,CAAaC,CAAb,CAAmB,CAEzB,GAAIC,CAAAA,CAAI,CAAGP,CAAC,CAAC,wBAAyBK,CAAzB,CAA8B,KAA/B,CAAZ,CACAJ,CAAG,CAACO,UAAJ,CAAe,SAAf,CAA0B,gBAA1B,EAA4CC,IAA5C,CAAiD,SAASC,CAAT,CAAqB,CAElE,GAAIC,CAAAA,CAAQ,CAAGX,CAAC,CAAC,MAAD,CAAhB,CACAM,CAAI,CAACM,OAAL,CAAa,SAASC,CAAT,CAAe,CACxBF,CAAQ,CAACG,MAAT,CAAgB,OAASD,CAAT,CAAgB,OAAhC,CACH,CAFD,EAGAF,CAAQ,CAACG,MAAT,CAAgB,OAAhB,EAEA,MAAOZ,CAAAA,CAAY,CAACa,MAAb,CAAoB,CACvBC,KAAK,CAAEN,CADgB,CAEvBO,IAAI,CAAEN,CAAQ,CAACO,IAAT,EAFiB,CAGvBC,KAAK,GAHkB,CAApB,CAIJZ,CAJI,CAMV,CAdD,EAcGa,KAdH,CAcSjB,CAAY,CAACkB,SAdtB,CAeH,CA3B+C,CA6BvD,CA/BK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Shows a dialogue with info about this logs.\n *\n * @module tool_analytics/log_info\n * @copyright 2017 David Monllao {@link http://www.davidmonllao.com}\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/notification'], function($, str, ModalFactory, Notification) {\n\n return /** @alias module:tool_analytics/log_info */ {\n\n /**\n * Prepares a modal info for a log's results.\n *\n * @method loadInfo\n * @param {int} id\n * @param {string[]} info\n */\n loadInfo: function(id, info) {\n\n var link = $('[data-model-log-id=\"' + id + '\"]');\n str.get_string('loginfo', 'tool_analytics').then(function(langString) {\n\n var bodyInfo = $(\"<ul>\");\n info.forEach(function(item) {\n bodyInfo.append('<li>' + item + '</li>');\n });\n bodyInfo.append(\"</ul>\");\n\n return ModalFactory.create({\n title: langString,\n body: bodyInfo.html(),\n large: true,\n }, link);\n\n }).catch(Notification.exception);\n }\n };\n});\n"],"file":"log_info.min.js"}
{"version":3,"file":"log_info.min.js","sources":["../src/log_info.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Shows a dialogue with info about this logs.\n *\n * @module tool_analytics/log_info\n * @copyright 2017 David Monllao {@link http://www.davidmonllao.com}\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/str', 'core/modal_factory', 'core/notification'], function($, str, ModalFactory, Notification) {\n\n return /** @alias module:tool_analytics/log_info */ {\n\n /**\n * Prepares a modal info for a log's results.\n *\n * @method loadInfo\n * @param {int} id\n * @param {string[]} info\n */\n loadInfo: function(id, info) {\n\n var link = $('[data-model-log-id=\"' + id + '\"]');\n str.get_string('loginfo', 'tool_analytics').then(function(langString) {\n\n var bodyInfo = $(\"<ul>\");\n info.forEach(function(item) {\n bodyInfo.append('<li>' + item + '</li>');\n });\n bodyInfo.append(\"</ul>\");\n\n return ModalFactory.create({\n title: langString,\n body: bodyInfo.html(),\n large: true,\n }, link);\n\n }).catch(Notification.exception);\n }\n };\n});\n"],"names":["define","$","str","ModalFactory","Notification","loadInfo","id","info","link","get_string","then","langString","bodyInfo","forEach","item","append","create","title","body","html","large","catch","exception"],"mappings":";;;;;;;AAsBAA,iCAAO,CAAC,SAAU,WAAY,qBAAsB,sBAAsB,SAASC,EAAGC,IAAKC,aAAcC,oBAEjD,CAShDC,SAAU,SAASC,GAAIC,UAEfC,KAAOP,EAAE,uBAAyBK,GAAK,MAC3CJ,IAAIO,WAAW,UAAW,kBAAkBC,MAAK,SAASC,gBAElDC,SAAWX,EAAE,eACjBM,KAAKM,SAAQ,SAASC,MAClBF,SAASG,OAAO,OAASD,KAAO,YAEpCF,SAASG,OAAO,SAETZ,aAAaa,OAAO,CACvBC,MAAON,WACPO,KAAMN,SAASO,OACfC,OAAO,GACRZ,SAEJa,MAAMjB,aAAakB"}
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_analytics/model",["jquery","core/str","core/log","core/notification","core/modal_factory","core/modal_events","core/templates"],function(b,c,d,e,f,g,h){var i={clear:{title:{key:"clearpredictions",component:"tool_analytics"},body:{key:"clearmodelpredictions",component:"tool_analytics"}},delete:{title:{key:"delete",component:"tool_analytics"},body:{key:"deletemodelconfirmation",component:"tool_analytics"}}},j=function(a){var c=b(a).closest("[data-model-name]");if(c.length){return c.attr("data-model-name")}else{d.error("Unexpected DOM error - unable to obtain the model name");return""}};return{confirmAction:function confirmAction(a,h){b("[data-action-id=\""+a+"\"]").on("click",function(k){k.preventDefault();var l=b(k.currentTarget);if("undefined"==typeof i[h]){d.error("Action \""+h+"\" is not allowed.");return}var a=[i[h].title,i[h].body];a[1].param=j(l);var m=c.get_strings(a),n=f.create({type:f.types.SAVE_CANCEL});b.when(m,n).then(function(a,b){b.setTitle(a[0]);b.setBody(a[1]);b.setSaveButtonText(a[0]);b.getRoot().on(g.save,function(){window.location.href=l.attr("href")});b.show();return b}).fail(e.exception)})},selectEvaluationOptions:function selectEvaluationOptions(a,d){b("[data-action-id=\""+a+"\"]").on("click",function(i){i.preventDefault();var j=b(i.currentTarget),a=b(this).attr("data-timesplitting-methods"),k=c.get_strings([{key:"evaluatemodel",component:"tool_analytics"},{key:"evaluate",component:"tool_analytics"}]),l=f.create({type:f.types.SAVE_CANCEL}),m=h.render("tool_analytics/evaluation_options",{trainedexternally:d,timesplittingmethods:JSON.parse(a)});b.when(k,l).then(function(a,c){c.getRoot().on(g.hidden,c.destroy.bind(c));c.setTitle(a[0]);c.setSaveButtonText(a[1]);c.setBody(m);c.getRoot().on(g.save,function(){var a=b("input[name='evaluationmode']:checked").val();if("trainedmodel"==a){j.attr("href",j.attr("href")+"&mode=trainedmodel")}var c=b("#id-evaluation-timesplitting").val();j.attr("href",j.attr("href")+"&timesplitting="+c);window.location.href=j.attr("href")});c.show();return c}).fail(e.exception)})},selectExportOptions:function selectExportOptions(a,d){b("[data-action-id=\""+a+"\"]").on("click",function(i){i.preventDefault();var j=b(i.currentTarget);if(!d){j.attr("href",j.attr("href")+"&action=exportmodel&includeweights=0");window.location.href=j.attr("href");return}var a=c.get_strings([{key:"export",component:"tool_analytics"}]),k=f.create({type:f.types.SAVE_CANCEL}),l=h.render("tool_analytics/export_options",{});b.when(a,k).then(function(a,c){c.getRoot().on(g.hidden,c.destroy.bind(c));c.setTitle(a[0]);c.setSaveButtonText(a[0]);c.setBody(l);c.getRoot().on(g.save,function(){var a=b("input[name='exportoption']:checked").val();if("exportdata"==a){j.attr("href",j.attr("href")+"&action=exportdata")}else{j.attr("href",j.attr("href")+"&action=exportmodel");if(b("#id-includeweights").is(":checked")){j.attr("href",j.attr("href")+"&includeweights=1")}else{j.attr("href",j.attr("href")+"&includeweights=0")}}window.location.href=j.attr("href")});c.show();return c}).fail(e.exception)})}}});
//# sourceMappingURL=model.min.js.map
/**
* AMD module for model actions confirmation.
*
* @module tool_analytics/model
* @copyright 2017 David Monllao
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_analytics/model",["jquery","core/str","core/log","core/notification","core/modal_factory","core/modal_events","core/templates"],(function($,Str,log,Notification,ModalFactory,ModalEvents,Templates){var actionsList={clear:{title:{key:"clearpredictions",component:"tool_analytics"},body:{key:"clearmodelpredictions",component:"tool_analytics"}},delete:{title:{key:"delete",component:"tool_analytics"},body:{key:"deletemodelconfirmation",component:"tool_analytics"}}};return{confirmAction:function(actionId,actionType){$('[data-action-id="'+actionId+'"]').on("click",(function(ev){ev.preventDefault();var a=$(ev.currentTarget);if(void 0!==actionsList[actionType]){var wrap,reqStrings=[actionsList[actionType].title,actionsList[actionType].body];reqStrings[1].param=(wrap=$(a).closest("[data-model-name]")).length?wrap.attr("data-model-name"):(log.error("Unexpected DOM error - unable to obtain the model name"),"");var stringsPromise=Str.get_strings(reqStrings),modalPromise=ModalFactory.create({type:ModalFactory.types.SAVE_CANCEL});$.when(stringsPromise,modalPromise).then((function(strings,modal){return modal.setTitle(strings[0]),modal.setBody(strings[1]),modal.setSaveButtonText(strings[0]),modal.getRoot().on(ModalEvents.save,(function(){window.location.href=a.attr("href")})),modal.show(),modal})).fail(Notification.exception)}else log.error('Action "'+actionType+'" is not allowed.')}))},selectEvaluationOptions:function(actionId,trainedOnlyExternally){$('[data-action-id="'+actionId+'"]').on("click",(function(ev){ev.preventDefault();var a=$(ev.currentTarget),timeSplittingMethods=$(this).attr("data-timesplitting-methods"),stringsPromise=Str.get_strings([{key:"evaluatemodel",component:"tool_analytics"},{key:"evaluate",component:"tool_analytics"}]),modalPromise=ModalFactory.create({type:ModalFactory.types.SAVE_CANCEL}),bodyPromise=Templates.render("tool_analytics/evaluation_options",{trainedexternally:trainedOnlyExternally,timesplittingmethods:JSON.parse(timeSplittingMethods)});$.when(stringsPromise,modalPromise).then((function(strings,modal){return modal.getRoot().on(ModalEvents.hidden,modal.destroy.bind(modal)),modal.setTitle(strings[0]),modal.setSaveButtonText(strings[1]),modal.setBody(bodyPromise),modal.getRoot().on(ModalEvents.save,(function(){"trainedmodel"==$("input[name='evaluationmode']:checked").val()&&a.attr("href",a.attr("href")+"&mode=trainedmodel");var timeSplittingMethod=$("#id-evaluation-timesplitting").val();a.attr("href",a.attr("href")+"&timesplitting="+timeSplittingMethod),window.location.href=a.attr("href")})),modal.show(),modal})).fail(Notification.exception)}))},selectExportOptions:function(actionId,isTrained){$('[data-action-id="'+actionId+'"]').on("click",(function(ev){ev.preventDefault();var a=$(ev.currentTarget);if(!isTrained)return a.attr("href",a.attr("href")+"&action=exportmodel&includeweights=0"),void(window.location.href=a.attr("href"));var stringsPromise=Str.get_strings([{key:"export",component:"tool_analytics"}]),modalPromise=ModalFactory.create({type:ModalFactory.types.SAVE_CANCEL}),bodyPromise=Templates.render("tool_analytics/export_options",{});$.when(stringsPromise,modalPromise).then((function(strings,modal){return modal.getRoot().on(ModalEvents.hidden,modal.destroy.bind(modal)),modal.setTitle(strings[0]),modal.setSaveButtonText(strings[0]),modal.setBody(bodyPromise),modal.getRoot().on(ModalEvents.save,(function(){"exportdata"==$("input[name='exportoption']:checked").val()?a.attr("href",a.attr("href")+"&action=exportdata"):(a.attr("href",a.attr("href")+"&action=exportmodel"),$("#id-includeweights").is(":checked")?a.attr("href",a.attr("href")+"&includeweights=1"):a.attr("href",a.attr("href")+"&includeweights=0")),window.location.href=a.attr("href")})),modal.show(),modal})).fail(Notification.exception)}))}}}));
//# sourceMappingURL=model.min.js.map
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_analytics/potential-contexts",["jquery","core/ajax"],function(a,b){return{processResults:function processResults(b,c){var d=[];if(a.isArray(c)){a.each(c,function(a,b){d.push({value:b.id,label:b.name})});return d}else{return c}},transport:function transport(c,d,e,f){var g,h=a(c).attr("modelid")||null;g=b.call([{methodname:"tool_analytics_potential_contexts",args:{query:d,modelid:h}}]);g[0].then(e).fail(f)}}});
//# sourceMappingURL=potential-contexts.min.js.map
/**
* Potential contexts selector module.
*
* @module tool_analytics/potential-contexts
* @copyright 2019 David Monllao
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_analytics/potential-contexts",["jquery","core/ajax"],(function($,Ajax){return{processResults:function(selector,results){var contexts=[];return $.isArray(results)?($.each(results,(function(index,context){contexts.push({value:context.id,label:context.name})})),contexts):results},transport:function(selector,query,success,failure){var modelid=$(selector).attr("modelid")||null;Ajax.call([{methodname:"tool_analytics_potential_contexts",args:{query:query,modelid:modelid}}])[0].then(success).fail(failure)}}}));
//# sourceMappingURL=potential-contexts.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/potential-contexts.js"],"names":["define","$","Ajax","processResults","selector","results","contexts","isArray","each","index","context","push","value","id","label","name","transport","query","success","failure","promise","modelid","attr","call","methodname","args","then","fail"],"mappings":"AAuBAA,OAAM,qCAAC,CAAC,QAAD,CAAW,WAAX,CAAD,CAA0B,SAASC,CAAT,CAAYC,CAAZ,CAAkB,CAE9C,MAA8D,CAE1DC,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAA4B,CACxC,GAAIC,CAAAA,CAAQ,CAAG,EAAf,CACA,GAAIL,CAAC,CAACM,OAAF,CAAUF,CAAV,CAAJ,CAAwB,CACpBJ,CAAC,CAACO,IAAF,CAAOH,CAAP,CAAgB,SAASI,CAAT,CAAgBC,CAAhB,CAAyB,CACrCJ,CAAQ,CAACK,IAAT,CAAc,CACVC,KAAK,CAAEF,CAAO,CAACG,EADL,CAEVC,KAAK,CAAEJ,CAAO,CAACK,IAFL,CAAd,CAIH,CALD,EAMA,MAAOT,CAAAA,CAEV,CATD,IASO,CACH,MAAOD,CAAAA,CACV,CACJ,CAhByD,CAkB1DW,SAAS,CAAE,mBAASZ,CAAT,CAAmBa,CAAnB,CAA0BC,CAA1B,CAAmCC,CAAnC,CAA4C,IAC/CC,CAAAA,CAD+C,CAG/CC,CAAO,CAAGpB,CAAC,CAACG,CAAD,CAAD,CAAYkB,IAAZ,CAAiB,SAAjB,GAA+B,IAHM,CAInDF,CAAO,CAAGlB,CAAI,CAACqB,IAAL,CAAU,CAAC,CACjBC,UAAU,CAAE,mCADK,CAEjBC,IAAI,CAAE,CACFR,KAAK,CAAEA,CADL,CAEFI,OAAO,CAAEA,CAFP,CAFW,CAAD,CAAV,CAAV,CAQAD,CAAO,CAAC,CAAD,CAAP,CAAWM,IAAX,CAAgBR,CAAhB,EAAyBS,IAAzB,CAA8BR,CAA9B,CACH,CA/ByD,CAmCjE,CArCK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Potential contexts selector module.\n *\n * @module tool_analytics/potential-contexts\n * @copyright 2019 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax'], function($, Ajax) {\n\n return /** @alias module:tool_analytics/potential-contexts */ {\n\n processResults: function(selector, results) {\n var contexts = [];\n if ($.isArray(results)) {\n $.each(results, function(index, context) {\n contexts.push({\n value: context.id,\n label: context.name\n });\n });\n return contexts;\n\n } else {\n return results;\n }\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n let modelid = $(selector).attr('modelid') || null;\n promise = Ajax.call([{\n methodname: 'tool_analytics_potential_contexts',\n args: {\n query: query,\n modelid: modelid\n }\n }]);\n\n promise[0].then(success).fail(failure);\n }\n\n };\n\n});\n"],"file":"potential-contexts.min.js"}
{"version":3,"file":"potential-contexts.min.js","sources":["../src/potential-contexts.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Potential contexts selector module.\n *\n * @module tool_analytics/potential-contexts\n * @copyright 2019 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax'], function($, Ajax) {\n\n return /** @alias module:tool_analytics/potential-contexts */ {\n\n processResults: function(selector, results) {\n var contexts = [];\n if ($.isArray(results)) {\n $.each(results, function(index, context) {\n contexts.push({\n value: context.id,\n label: context.name\n });\n });\n return contexts;\n\n } else {\n return results;\n }\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n let modelid = $(selector).attr('modelid') || null;\n promise = Ajax.call([{\n methodname: 'tool_analytics_potential_contexts',\n args: {\n query: query,\n modelid: modelid\n }\n }]);\n\n promise[0].then(success).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","processResults","selector","results","contexts","isArray","each","index","context","push","value","id","label","name","transport","query","success","failure","modelid","attr","call","methodname","args","then","fail"],"mappings":";;;;;;;AAuBAA,2CAAO,CAAC,SAAU,cAAc,SAASC,EAAGC,YAEsB,CAE1DC,eAAgB,SAASC,SAAUC,aAC3BC,SAAW,UACXL,EAAEM,QAAQF,UACVJ,EAAEO,KAAKH,SAAS,SAASI,MAAOC,SAC5BJ,SAASK,KAAK,CACVC,MAAOF,QAAQG,GACfC,MAAOJ,QAAQK,UAGhBT,UAGAD,SAIfW,UAAW,SAASZ,SAAUa,MAAOC,QAASC,aAGtCC,QAAUnB,EAAEG,UAAUiB,KAAK,YAAc,KACnCnB,KAAKoB,KAAK,CAAC,CACjBC,WAAY,oCACZC,KAAM,CACFP,MAAOA,MACPG,QAASA,YAIT,GAAGK,KAAKP,SAASQ,KAAKP"}
@@ -24,13 +24,17 @@
* @since Moodle 3.8
*/
namespace tool_analytics\external;
use externallib_advanced_testcase;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
require_once(__DIR__ . '/../../../../analytics/tests/fixtures/test_indicator_max.php');
require_once(__DIR__ . '/../../../../analytics/tests/fixtures/test_target_course_level_shortname.php');
require_once($CFG->dirroot . '/analytics/tests/fixtures/test_indicator_max.php');
require_once($CFG->dirroot . '/analytics/tests/fixtures/test_target_course_level_shortname.php');
/**
* Tool analytics external functions tests
@@ -41,7 +45,7 @@ require_once(__DIR__ . '/../../../../analytics/tests/fixtures/test_target_course
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 3.8
*/
class tool_analytics_external_testcase extends externallib_advanced_testcase {
class external_test extends externallib_advanced_testcase {
/**
* test_potential_contexts description
@@ -73,7 +77,7 @@ class tool_analytics_external_testcase extends externallib_advanced_testcase {
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
$this->assertCount(2, \tool_analytics\external::potential_contexts());
}
}
@@ -0,0 +1,110 @@
@tool_behat
Feature: Verify that the behat login and logout steps work as expected
In order to use behat login and log out steps
As a test writer
I need to verify that login and logout happen when the steps are used
Scenario: Log in as a user using the step
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
When I log in as "traverst1"
Then I should see "Thomas Travers"
@javascript
Scenario: Log in as a user using the step (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
When I log in as "traverst1"
Then I should see "Thomas Travers"
Scenario: Log out using the log out step
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And I am logged in as traverst1
When I log out
Then I should not see "Thomas Travers"
And I should see "You are not logged in"
@javascript
Scenario: Log out using the log out step (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And I am logged in as traverst1
When I log out
Then I should not see "Thomas Travers"
And I should see "You are not logged in"
Scenario: Log in step should automatically log user out if already logged in
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And I am logged in as traverst1
When I log in as "emeryj"
Then I should not see "Thomas Travers"
And I should see "Jane Emery"
@javascript
Scenario: Log in step should automatically log user out if already logged in (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And I am logged in as traverst1
When I log in as "emeryj"
Then I should not see "Thomas Travers"
And I should see "Jane Emery"
Scenario: I am on page logged in as should redirect to correct page
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
@javascript
Scenario: I am on page logged in as should redirect to correct page (javascript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
Scenario: I am on page logged in as should redirect to correct page when automatically logging a user out
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
And I am logged in as emeryj
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
@javascript
Scenario: I am on page logged in as should redirect to correct page when automatically logging a user out (javacript)
Given the following "users" exist:
| username | firstname | lastname |
| traverst1 | Thomas | Travers |
| emeryj | Jane | Emery |
And the following "course" exists:
| fullname | Life, the Universe, and Everything |
| shortname | hhgttg |
And I am logged in as emeryj
When I am on the hhgttg Course page logged in as traverst1
Then I should see "Thomas Travers"
And I should see "Life, the Universe, and Everything"
@@ -0,0 +1,191 @@
<?php
// This file is part of Moodle - https://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 <https://www.gnu.org/licenses/>.
/**
* Tests for behat_form_text class
*
* @copyright 2022 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com}
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_behat;
use behat_form_text;
use Behat\Mink\Session;
use Behat\Mink\Element\NodeElement;
use core_string_manager_standard;
defined('MOODLE_INTERNAL') || die;
global $CFG;
require_once($CFG->libdir . '/behat/classes/behat_session_interface.php');
require_once($CFG->libdir . '/behat/classes/behat_session_trait.php');
require_once($CFG->libdir . '/behat/form_field/behat_form_text.php');
/**
* Tests for the behat_form_text class
*
* @package tool_behat
* @category test
* @copyright 2022 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com}
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*
* @covers \behat_form_text
* @covers \behat_form_field
*/
class behat_form_text_test extends \basic_testcase {
/**
* Data provider for the test_set_get_value() method.
*
* @return array of value and expectation pairs to be tested.
*/
public function provider_test_set_get_value() {
return [
'null' => [null, null],
'int' => [3, 3],
'float' => [3.14, 3.14],
'string' => ['hello', 'hello'],
'utf8' => ['你好', '你好'],
];
}
/**
* Test the set_value() and get_value() methods.
*
* @param mixed $value value to be set.
* @param mixed $expectation value to be checked.
* @dataProvider provider_test_set_get_value()
*/
public function test_set_get_value($value, $expectation) {
$session = $this->createMock(Session::class);
$node = $this->createMock(NodeElement::class);
$node->method('getValue')->willReturn($value);
$field = new behat_form_text($session, $node);
$field->set_value($value);
$this->assertEquals($expectation, $field->get_value());
}
/**
* Data provider for the test_text_matches() method.
*
* @return array of decsep, value, match and result pairs to be tested.
*/
public function provider_test_matches() {
return [
'lazy true' => ['.', 'hello', 'hello', true],
'lazy false' => ['.', 'hello', 'bye', false],
'float true' => ['.', '3.14', '3.1400', true],
'float false' => ['.', '3.14', '3.1401', false],
'float and float string true' => ['.', 3.14, '3.1400', true],
'float and unrelated string false' => ['.', 3.14, 'hello', false],
'float hash decsep true' => ['#', '3#14', '3#1400', true],
'float hash decsep false' => ['#', '3#14', '3#1401', false],
'float and float string hash decsep true' => ['#', 3.14, '3.1400', true],
'float and unrelated string hash decsep false' => ['#', 3.14, 'hello', false],
'float custom-default decsep mix1 true' => ['#', '3#14', '3.1400', true],
'float custom-default decsep mix2 true' => ['#', '3.14', '3#1400', true],
'float 2-custom decsep mix1 false' => ['#', '3#14', '3,1400', false],
'float 2-custom decsep mix2 false' => [',', '3#14', '3,1400', false],
'float default-custom decsep mix1 false' => ['.', '3#14', '3.1400', false],
'float default-custom decsep mix2 false' => ['.', '3.14', '3#1400', false],
];
}
/**
* Test the matches() method.
*
* @param string $decsep decimal separator to use.
* @param mixed $value value to be set.
* @param mixed $match value to be matched.
* @param bool $result expected return status of the function.
* @dataProvider provider_test_matches()
*/
public function test_matches($decsep, $value, $match, $result) {
global $CFG;
// Switch of string manager to avoid having to (slow) customise the lang file.
$origcustom = $CFG->config_php_settings['customstringmanager'] ?? null;
$CFG->config_php_settings['customstringmanager'] = '\tool_behat\phpunit_string_manager';
$manager = get_string_manager(true);
$manager->set_string('decsep', 'langconfig', $decsep);
$session = $this->createMock(Session::class);
$node = $this->createMock(NodeElement::class);
$node->method('getValue')->willReturn($value);
$field = new behat_form_text($session, $node);
$field->set_value($value);
$this->assertSame($result, $field->matches($match));
// Switch back to the original string manager.
if (is_null($origcustom)) {
unset($CFG->config_php_settings['customstringmanager']);
} else {
$CFG->config_php_settings['customstringmanager'] = $origcustom;
}
$manager = get_string_manager(true);
}
}
/**
* Customised values that will be used instead of standard manager one.
*
* If an existing component/identifier is found, return it instead of the real
* one from language files. Note this doesn't support place holders or another niceties.
*
* @package tool_behat
* @category test
* @copyright 2022 onwards Eloy Lafuente (stronk7) {@link https://stronk7.com}
* @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class phpunit_string_manager extends core_string_manager_standard {
/** @var array language customisations provided by the manager without asking for real contents */
protected $customstrings = [];
/**
* Get String returns a requested string
*
* @param string $identifier The identifier of the string to search for
* @param string $component The module the string is associated with
* @param string|object|array $a An object, string or number that can be used
* within translation strings
* @param string $lang moodle translation language, null means use current
* @return string The String !
*/
public function get_string($identifier, $component = '', $a = null, $lang = null) {
$key = trim($component) . '/' . trim($identifier);
if (isset($this->customstrings[$key])) {
return $this->customstrings[$key];
}
return parent::get_string($identifier, $component, $a, $lang);
}
/**
* Sets a custom string to be returned by the string manager instead of the language file one.
*
* @param string $identifier The identifier of the string to search for
* @param string $component The module the string is associated with
* @param string $value the contents of the language string to be returned by get_string()
*/
public function set_string($identifier, $component, $value) {
$key = trim($component) . '/' . trim($identifier);
$this->customstrings[$key] = $value;
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
<?php
// @codingStandardsIgnoreFile
// phpcs:ignoreFile
// @codeCoverageIgnoreStart
// This file is part of Moodle - http://moodle.org/
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="admin/tool/brickfield/db" VERSION="20200215" COMMENT="XMLDB file for Moodle admin/tool/brickfield"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
xsi:noNamespaceSchemaLocation="../../../../lib/xmldb/xmldb.xsd"
>
<TABLES>
<TABLE NAME="tool_brickfield_checks" COMMENT="Checks details">
+55 -51
View File
@@ -16,6 +16,11 @@
namespace tool_brickfield;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/admin/tool/brickfield/tests/area_test_base.php');
/**
* Class tool_brickfield_area_testcase
*
@@ -23,8 +28,7 @@ namespace tool_brickfield;
* @copyright 2020 onward: Brickfield Education Labs, https://www.brickfield.ie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class area_test extends \advanced_testcase {
class area_test extends area_test_base {
/**
* Test for the area assign intro
*/
@@ -46,7 +50,7 @@ class area_test extends \advanced_testcase {
$resultsrs = $c->find_course_areas($course1->id);
$resultsrs2 = $c->find_course_areas($course2->id);
// Set up a results array from the recordset for easier testing.
$results = array_merge(self::array_from_recordset($resultsrs), self::array_from_recordset($resultsrs2));
$results = array_merge($this->array_from_recordset($resultsrs), $this->array_from_recordset($resultsrs2));
$this->assertEquals([
(object)[
'type' => area_base::TYPE_FIELD,
@@ -76,7 +80,7 @@ class area_test extends \advanced_testcase {
$event = \core\event\course_module_updated::create_from_cm($cm1);
$relevantresultsrs = $c->find_relevant_areas($event);
// Set up a relevantresults array from the recordset for easier testing.
$relevantresults = self::array_from_recordset($relevantresultsrs);
$relevantresults = $this->array_from_recordset($relevantresultsrs);
$this->assertEquals([$results[0]], $relevantresults);
}
@@ -87,43 +91,57 @@ class area_test extends \advanced_testcase {
$this->resetAfterTest();
/** @var \core_question_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_question');
$component = 'core_question';
list($category1, $course1, $qcat1, $questions1) = $generator->setup_course_and_questions('course');
list($category2, $course2, $qcat2, $questions2) = $generator->setup_course_and_questions('category');
list($category3, $course3, $qcat3, $questions3) = $generator->setup_course_and_questions('system');
$c = new \tool_brickfield\local\areas\core_question\questiontext();
$results1 = self::array_from_recordset($c->find_course_areas($course1->id));
$results2 = self::array_from_recordset($c->find_course_areas($course2->id));
$results3 = self::array_from_recordset($c->find_course_areas($course3->id));
$results4 = self::array_from_recordset($c->find_system_areas());
// Set up a results array from the recordset for easier testing.
// Set up results arrays from the recordset for easier testing.
$course1areas = $this->array_from_recordset($c->find_course_areas($course1->id));
$course2areas = $c->find_course_areas($course2->id);
$course3areas = $c->find_course_areas($course3->id);
$sysareas = $this->array_from_recordset($c->find_system_areas());
$this->assertCount(2, $results1);
$this->assertCount(0, $results2);
$this->assertCount(0, $results3);
$this->assertCount(4, $results4);
// Validate the contexts, courseid and categoryid of the returned results.
$this->assertEquals(\context_course::instance($course1->id)->id, $results1[0]->contextid);
$this->assertEquals($course1->id, $results1[0]->courseid);
$this->assertEmpty($results1[0]->categoryid);
$this->assertEquals(\context_coursecat::instance($category2->id)->id, $results4[0]->contextid);
$this->assertEquals(SITEID, $results4[0]->courseid);
$this->assertEquals($category2->id, $results4[0]->categoryid);
$this->assertEquals(\context_system::instance()->id, $results4[2]->contextid);
$this->assertEmpty($results4[2]->categoryid);
$this->assertEquals(SITEID, $results4[2]->courseid);
// Results4 should contain id's for questions 1 and 2.
$this->assertTrue(($questions3[0]->id == $results4[2]->itemid) || ($questions3[0]->id == $results4[3]->itemid));
$this->assertTrue(($questions3[1]->id == $results4[2]->itemid) || ($questions3[1]->id == $results4[3]->itemid));
// Assert the core_question area exists for the individual question's context, courseid and categoryid.
$this->assert_area_in_array(
$course1areas,
$component,
\context_course::instance($course1->id)->id,
$questions1[0]->id,
$course1->id,
null
);
$this->assert_area_in_array(
$sysareas,
$component,
\context_coursecat::instance($category2->id)->id,
$questions2[0]->id,
SITEID,
$category2->id
);
$this->assert_area_in_array(
$sysareas,
$component,
\context_system::instance()->id,
$questions3[0]->id,
SITEID,
null
);
// Emulate the question_created event.
$event = \core\event\question_created::create_from_question_instance($questions1[1],
\context_course::instance($course1->id));
$relevantresultsrs = $c->find_relevant_areas($event);
// Set up a relevantresults array from the recordset for easier testing.
$relevantresults = self::array_from_recordset($relevantresultsrs);
$this->assertEquals([$results1[1]], $relevantresults);
$relevantresults = $this->array_from_recordset($c->find_relevant_areas($event));
$this->assert_area_in_array(
$course1areas,
$component,
\context_course::instance($relevantresults[0]->courseid)->id,
$relevantresults[0]->itemid,
$relevantresults[0]->courseid,
$relevantresults[0]->categoryid
);
}
/**
@@ -147,7 +165,7 @@ class area_test extends \advanced_testcase {
$c = new \tool_brickfield\local\areas\core_question\questionanswers();
$resultsrs = $c->find_course_areas($course->id);
$results = self::array_from_recordset($resultsrs);
$results = $this->array_from_recordset($resultsrs);
// There will be the same number of results as the number of records in the question_answers table.
$this->assertEquals(count($dbanswers), count($results));
@@ -157,7 +175,7 @@ class area_test extends \advanced_testcase {
\context_course::instance($course->id));
$relevantresultsrs = $c->find_relevant_areas($event);
// Set up a relevantresults array from the recordset for easier testing.
$relevantresults = self::array_from_recordset($relevantresultsrs);
$relevantresults = $this->array_from_recordset($relevantresultsrs);
$dbanswers = array_values($DB->get_records('question_answers', ['question' => $question1->id], 'id'));
$this->assertEquals(count($dbanswers), count($relevantresults));
@@ -190,7 +208,7 @@ class area_test extends \advanced_testcase {
$c = new \tool_brickfield\local\areas\mod_choice\intro();
$resultsrs = $c->find_course_areas($course->id);
// Set up a results array from the recordset for easier testing.
$results = self::array_from_recordset($resultsrs);
$results = $this->array_from_recordset($resultsrs);
$this->assertCount(2, $results);
$this->assertEquals($cm1->id, $results[0]->cmid);
@@ -199,14 +217,14 @@ class area_test extends \advanced_testcase {
// Emulate the course_module_created event.
$event = \core\event\course_module_created::create_from_cm($cm1);
$relevantresultsrs = $c->find_relevant_areas($event);
$relevantresults = self::array_from_recordset($relevantresultsrs);
$relevantresults = $this->array_from_recordset($relevantresultsrs);
$this->assertEquals([$results[0]], $relevantresults);
// Testing the choice options.
$c = new \tool_brickfield\local\areas\mod_choice\option();
$resultsrs = $c->find_course_areas($course->id);
// Set up a results array from the recordset for easier testing.
$results = self::array_from_recordset($resultsrs);
$results = $this->array_from_recordset($resultsrs);
$this->assertCount(5, $results);
$this->assertEquals($cm2->id, $results[3]->cmid);
@@ -220,21 +238,7 @@ class area_test extends \advanced_testcase {
// Emulate the course_module_updated event.
$event = \core\event\course_module_updated::create_from_cm($cm2);
$relevantresultsrs = $c->find_relevant_areas($event);
$relevantresults = self::array_from_recordset($relevantresultsrs);
$relevantresults = $this->array_from_recordset($relevantresultsrs);
$this->assertEquals([$results[3], $results[4]], $relevantresults);
}
/**
* Array from recordset.
* @param \moodle_recordset $rs
* @return array
*/
private static function array_from_recordset($rs) {
$records = [];
foreach ($rs as $record) {
$records[] = $record;
}
$rs->close();
return $records;
}
}
@@ -0,0 +1,94 @@
<?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_brickfield;
/**
* Class area_test_base provides some utility functions that can be used by testing.
*
* @package tool_brickfield
* @copyright 2020 onward: Brickfield Education Labs, https://www.brickfield.ie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class area_test_base extends \advanced_testcase {
/** @var string Message for failed area test. */
protected $areatestmessage = 'Expected %component% area not found';
/**
* Create and return an array from a recordset. Recordset is destroyed.
* @param \moodle_recordset $rs
* @return array
*/
public function array_from_recordset(\moodle_recordset $rs): array {
$records = [];
foreach ($rs as $record) {
$records[] = $record;
}
// Can't rewind a recordset, so might as well close it.
$rs->close();
return $records;
}
/**
* Test for specified component information present in area recordset. Recordset cannot be reused.
* @param \moodle_recordset $areasrs
* @param string $component
* @param int $contextid
* @param int $itemid
* @param int|null $courseid
* @param int|null $categoryid
* @return void
*/
public function assert_area_in_recordset(\moodle_recordset $areasrs, string $component, int $contextid, int $itemid,
?int $courseid, ?int $categoryid): void {
$this->assert_area_in_array(
$this->array_from_recordset($areasrs),
$component,
$contextid,
$itemid,
$courseid,
$categoryid
);
}
/**
* Test for specified component information present in area array.
* @param array $areas
* @param string $component
* @param int $contextid
* @param int $itemid
* @param int|null $courseid
* @param int|null $categoryid
* @return void
*/
public function assert_area_in_array(array $areas, string $component, int $contextid, int $itemid,
?int $courseid, ?int $categoryid): void {
$found = false;
$message = str_replace('%component%', $component, $this->areatestmessage);
foreach ($areas as $area) {
if (($area->component == $component) &&
($area->contextid == $contextid) &&
((empty($courseid) ? empty($area->courseid) : ($area->courseid == $courseid))) &&
((empty($categoryid) ? empty($area->categoryid) : ($area->categoryid == $categoryid))) &&
($area->itemid == $itemid)
) {
$found = true;
break;
}
}
$this->assertTrue($found, $message);
}
}
+1 -1
View File
@@ -26,7 +26,7 @@ use tool_brickfield\local\tool\filter;
* @author Jay Churchward (jay.churchward@poetopensource.org)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class filter_test extends \advanced_testcase {
class filters_test extends \advanced_testcase {
public function test_constructor() {
$this->resetAfterTest();
@@ -13,9 +13,15 @@
//
// 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_brickfield\local\areas\core_question;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/admin/tool/brickfield/tests/area_test_base.php');
use tool_brickfield\area_test_base;
/**
* Tests for questiontext.
*
@@ -23,8 +29,7 @@ namespace tool_brickfield\local\areas\core_question;
* @copyright 2020 onward: Brickfield Education Labs, https://www.brickfield.ie
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class questiontext_test extends \advanced_testcase {
class questiontext_test extends area_test_base {
/**
* Set up before class.
*/
@@ -158,30 +163,31 @@ class questiontext_test extends \advanced_testcase {
$catcontext = \context_coursecat::instance($category->id);
$systemcontext = \context_system::instance();
$generator = $this->getDataGenerator()->get_plugin_generator('core_question');
$component = 'core_question';
$cat = $generator->create_question_category(['contextid' => $catcontext->id]);
$cat2 = $generator->create_question_category(['contextid' => $systemcontext->id]);
$question = $generator->create_question('multichoice', null, ['category' => $cat2->id]);
$question2 = $generator->create_question('multichoice', null, ['category' => $cat->id]);
$questiontext = new questiontext();
$rs = $questiontext->find_system_areas();
$this->assertNotNull($rs);
$areas = $this->array_from_recordset($questiontext->find_system_areas());
$count = 0;
foreach ($rs as $rec) {
$count++;
if ($count <= 1) {
$this->assertEquals($systemcontext->id, $rec->contextid);
$this->assertEquals(1, $rec->courseid);
$this->assertEquals(0, $rec->categoryid);
$this->assertEquals($question->id, $rec->itemid);
} else {
$this->assertEquals($catcontext->id, $rec->contextid);
$this->assertEquals(1, $rec->courseid);
$this->assertEquals($category->id, $rec->categoryid);
$this->assertEquals($question2->id, $rec->itemid);
}
}
$rs->close();
$this->assertEquals(2, $count);
// Assert the core_question area exists for the individual question's context, courseid and categoryid.
$this->assert_area_in_array(
$areas,
$component,
$systemcontext->id,
$question->id,
SITEID,
null
);
$this->assert_area_in_array(
$areas,
$component,
$catcontext->id,
$question2->id,
SITEID,
$category->id
);
}
}
@@ -101,6 +101,6 @@ class printable_test extends \advanced_testcase {
$object->set_filter($filter);
$output = $object->get_output();
$this->assertStringContainsString('<i class="icon fa fa-tachometer fa-fw " title="Total activities" '.
'aria-label="Total activities">', $output);
'role="img" aria-label="Total activities">', $output);
}
}
@@ -22,7 +22,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
*/
defined('MOODLE_INTERNAL') || die();
namespace tool_capability\event;
/**
* Class for capability overview events.
@@ -31,7 +31,7 @@ defined('MOODLE_INTERNAL') || die();
* @copyright 2014 Petr Skoda
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
*/
class tool_capability_events_testcase extends advanced_testcase {
class events_test extends \advanced_testcase {
/**
* Setup testcase.
@@ -54,11 +54,11 @@ class tool_capability_events_testcase extends advanced_testcase {
$event = reset($events);
$this->assertInstanceOf('\tool_capability\event\report_viewed', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
$this->assertEquals(\context_system::instance(), $event->get_context());
$expected = array(SITEID, "admin", "tool capability", "tool/capability/index.php");
$this->assertEventLegacyLogData($expected, $event);
$this->assertEventContextNotUsed($event);
$url = new moodle_url('/admin/tool/capability/index.php');
$url = new \moodle_url('/admin/tool/capability/index.php');
$this->assertEquals($url, $event->get_url());
$event->get_name();
}
@@ -21,6 +21,7 @@
* @copyright 2021 The Open University
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
*/
namespace tool_capability;
defined('MOODLE_INTERNAL') || die();
global $CFG;
@@ -30,7 +31,7 @@ require_once($CFG->dirroot . '/' . $CFG->admin . '/tool/capability/locallib.php'
/**
* Tests for the capability overview helper functions.
*/
class tool_capability_locallib_testcase extends advanced_testcase {
class locallib_test extends \advanced_testcase {
/**
* Test the function that gets the data - simple case.
@@ -40,7 +41,7 @@ class tool_capability_locallib_testcase extends advanced_testcase {
$data = tool_capability_calculate_role_data('mod/quiz:attempt', get_all_roles());
$systcontext = context_system::instance();
$systcontext = \context_system::instance();
$studentroleid = $DB->get_field('role', 'id', ['shortname' => 'student']);
$this->assertArrayHasKey($systcontext->id, $data);
@@ -63,10 +64,10 @@ class tool_capability_locallib_testcase extends advanced_testcase {
// This simulates a situation that seems to happen sometimes, where
// we end up with contexts with path = NULL in the database.
$systcontext = context_system::instance();
$systcontext = \context_system::instance();
$generator = $this->getDataGenerator();
$course = $generator->create_course();
$coursecontext = context_course::instance($course->id);
$coursecontext = \context_course::instance($course->id);
$studentroleid = $DB->get_field('role', 'id', ['shortname' => 'student']);
role_change_permission($studentroleid, $coursecontext, 'mod/quiz:attempt', CAP_PREVENT);
// This is where we simulate the breakage.
@@ -1 +1 @@
YUI.add("moodle-tool_capability-search",function(s,t){var e=function(){e.superclass.constructor.apply(this,arguments)};e.prototype={form:null,select:null,selectoptions:{},input:null,button:null,cancel:null,lastsearch:null,initializer:function(){this.form=s.one("#capability-overview-form"),this.select=this.form.one("select[data-search=capability]"),this.select.setStyle("minWidth",this.select.get("offsetWidth")),this.select.get("options").each(function(t){var e=t.get("value");this.selectoptions[e]=t},this),this.button=this.form.all("input[type=submit]"),this.lastsearch=this.form.one("input[name=search]");var t=s.Node.create('<div id="capabilitysearchui" class="input-group simplesearchform mb-2"data-fieldtype="text"></div>'),e=s.Node.create('<label for="capabilitysearch"><span class="sr-only"'+this.get("strsearch")+"</span></label>");this.cancel=s.Node.create('<a class="btn btn-clear d-none icon-no-margin"><i class="icon fa fa-times fa-fw " aria-hidden="true"></i></a>'),this.input=s.Node.create('<input type="text" class="form-control withclear" placeholder="'+this.get("strsearch")+'"id="capabilitysearch" />'),t.append(e).append(this.input).append(this.cancel),this.select.insert(t,"before"),this.input.on("keyup",this.typed,this),this.select.on("change",this.validate,this),this.cancel.on("click",function(){this.input.set("value",""),this.typed()},this),this.lastsearch&&(this.input.set("value",this.lastsearch.get("value")),this.typed(),this.select.one("option[selected]")&&this.select.set("scrollTop",this.select.one("option[selected]").get("getX"))),this.validate()},validate:function(){this.button.set("disabled",""===this.select.get("value"))},typed:function(){var t,e=this.input.get("value"),s=0,i=null;for(t in this.lastsearch&&this.lastsearch.set("value",e),this.select.all("option").remove(),this.selectoptions)0<=t.indexOf(e)&&(s++,i=this.selectoptions[t],this.select.append(this.selectoptions[t]));0===s?this.input.addClass("error"):(this.input.removeClass("error"),1===s&&i.set("selected",!0)),""!==e?this.cancel.removeClass("d-none"):this.cancel.addClass("d-none"),this.validate()}},s.extend(e,s.Base,e.prototype,{NAME:"tool_capability-search",ATTRS:{strsearch:{}}}),M.tool_capability=M.tool_capability||{},M.tool_capability.init_capability_search=function(t){new e(t)}},"@VERSION@",{requires:["base","node"]});
YUI.add("moodle-tool_capability-search",function(s,t){var e=function(){e.superclass.constructor.apply(this,arguments)};s.extend(e,s.Base,e.prototype={form:null,select:null,selectoptions:{},input:null,button:null,cancel:null,lastsearch:null,initializer:function(){this.form=s.one("#capability-overview-form"),this.select=this.form.one("select[data-search=capability]"),this.select.setStyle("minWidth",this.select.get("offsetWidth")),this.select.get("options").each(function(t){var e=t.get("value");this.selectoptions[e]=t},this),this.button=this.form.all("input[type=submit]"),this.lastsearch=this.form.one("input[name=search]");var t=s.Node.create('<div id="capabilitysearchui" class="input-group simplesearchform mb-2"data-fieldtype="text"></div>'),e=s.Node.create('<label for="capabilitysearch"><span class="sr-only"'+this.get("strsearch")+"</span></label>");this.cancel=s.Node.create('<a class="btn btn-clear d-none icon-no-margin"><i class="icon fa fa-times fa-fw " aria-hidden="true"></i></a>'),this.input=s.Node.create('<input type="text" class="form-control withclear" placeholder="'+this.get("strsearch")+'"id="capabilitysearch" />'),t.append(e).append(this.input).append(this.cancel),this.select.insert(t,"before"),this.input.on("keyup",this.typed,this),this.select.on("change",this.validate,this),this.cancel.on("click",function(){this.input.set("value",""),this.typed()},this),this.lastsearch&&(this.input.set("value",this.lastsearch.get("value")),this.typed(),this.select.one("option[selected]")&&this.select.set("scrollTop",this.select.one("option[selected]").get("getX"))),this.validate()},validate:function(){this.button.set("disabled",""===this.select.get("value"))},typed:function(){var t,e=this.input.get("value"),s=0,i=null;for(t in this.lastsearch&&this.lastsearch.set("value",e),this.select.all("option").remove(),this.selectoptions)0<=t.indexOf(e)&&(s++,i=this.selectoptions[t],this.select.append(this.selectoptions[t]));0===s?this.input.addClass("error"):(this.input.removeClass("error"),1===s&&i.set("selected",!0)),""!==e?this.cancel.removeClass("d-none"):this.cancel.addClass("d-none"),this.validate()}},{NAME:"tool_capability-search",ATTRS:{strsearch:{}}}),M.tool_capability=M.tool_capability||{},M.tool_capability.init_capability_search=function(t){new e(t)}},"@VERSION@",{requires:["base","node"]});
+10 -20
View File
@@ -14,17 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* API tests.
*
* @package tool_cohortroles
* @copyright 2015 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
use tool_cohortroles\api;
namespace tool_cohortroles;
/**
* API tests.
@@ -33,17 +23,17 @@ use tool_cohortroles\api;
* @copyright 2015 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_cohortroles_api_testcase extends advanced_testcase {
/** @var stdClass $cohort */
class api_test extends \advanced_testcase {
/** @var \stdClass $cohort */
protected $cohort = null;
/** @var stdClass $userassignto */
/** @var \stdClass $userassignto */
protected $userassignto = null;
/** @var stdClass $userassignover */
/** @var \stdClass $userassignover */
protected $userassignover = null;
/** @var stdClass $role */
/** @var \stdClass $role */
protected $role = null;
/**
@@ -67,7 +57,7 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
'roleid' => $this->roleid,
'cohortid' => $this->cohort->id
);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
api::create_cohort_role_assignment($params);
}
@@ -105,7 +95,7 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
);
$result = api::create_cohort_role_assignment($params);
$this->setUser($this->userassignto);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
api::delete_cohort_role_assignment($result->get('id'));
}
@@ -117,7 +107,7 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
'cohortid' => $this->cohort->id
);
$result = api::create_cohort_role_assignment($params);
$this->expectException(dml_missing_record_exception::class);
$this->expectException(\dml_missing_record_exception::class);
api::delete_cohort_role_assignment($result->get('id') + 1);
}
@@ -274,7 +264,7 @@ class tool_cohortroles_api_testcase extends advanced_testcase {
$this->assertEquals($sync, $expected);
// Verify roles assigned by any other component are not removed.
$usercontext = context_user::instance($this->userassignover->id);
$usercontext = \context_user::instance($this->userassignover->id);
role_assign($this->roleid, $this->userassignto->id, $usercontext->id);
$sync = api::sync_all_cohort_roles();
@@ -22,14 +22,15 @@
* @copyright 2018 Zig Tan <zig@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_cohortroles\privacy;
defined('MOODLE_INTERNAL') || die();
global $CFG;
use \core_privacy\local\request\writer;
use \core_privacy\local\request\approved_contextlist;
use \tool_cohortroles\api;
use \tool_cohortroles\privacy\provider;
use core_privacy\local\request\writer;
use core_privacy\local\request\approved_contextlist;
use tool_cohortroles\api;
use tool_cohortroles\privacy\provider;
use core_privacy\local\request\approved_userlist;
/**
@@ -38,7 +39,7 @@ use core_privacy\local\request\approved_userlist;
* @copyright 2018 Zig Tan <zig@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_testcase {
class provider_test extends \core_privacy\tests\provider_testcase {
/**
* Overriding setUp() function to always reset after tests.
@@ -61,7 +62,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
// Create course category.
$coursecategory = $this->getDataGenerator()->create_category();
$coursecategoryctx = \context_coursecat::instance($coursecategory->id);
$systemctx = context_system::instance();
$systemctx = \context_system::instance();
// Create course.
$course = $this->getDataGenerator()->create_course();
$coursectx = \context_course::instance($course->id);
@@ -102,7 +103,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
// Create course category.
$coursecategory = $this->getDataGenerator()->create_category();
$coursecategoryctx = \context_coursecat::instance($coursecategory->id);
$systemctx = context_system::instance();
$systemctx = \context_system::instance();
// Create course.
$course = $this->getDataGenerator()->create_course();
$coursectx = \context_course::instance($course->id);
@@ -154,7 +155,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
// Create course category.
$coursecategory = $this->getDataGenerator()->create_category();
$coursecategoryctx = \context_coursecat::instance($coursecategory->id);
$systemctx = context_system::instance();
$systemctx = \context_system::instance();
$this->setup_test_scenario_data($user->id, $systemctx, 1);
$this->setup_test_scenario_data($user->id, $coursecategoryctx, 1, 'Sausage roll 2',
@@ -170,7 +171,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
$this->assertCount(2, $contexts);
// Make sure the user data is only being deleted in within the system and course category context.
$usercontext = context_user::instance($user->id);
$usercontext = \context_user::instance($user->id);
// Delete all the User's records in mdl_tool_cohortroles table by the user context.
provider::delete_data_for_all_users_in_context($usercontext);
@@ -213,7 +214,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
// Create course category.
$coursecategory = $this->getDataGenerator()->create_category();
$coursecategoryctx = \context_coursecat::instance($coursecategory->id);
$systemctx = context_system::instance();
$systemctx = \context_system::instance();
$this->setup_test_scenario_data($user->id, $systemctx, 1);
$this->setup_test_scenario_data($user->id, $coursecategoryctx, 1, 'Sausage roll 2',
@@ -229,7 +230,7 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
$this->assertCount(2, $contexts);
// Make sure the user data is only being deleted in within the system and the course category contexts.
$usercontext = context_user::instance($user->id);
$usercontext = \context_user::instance($user->id);
// Delete all the User's records in mdl_tool_cohortroles table by the specified approved context list.
$approvedcontextlist = new approved_contextlist($user, 'tool_cohortroles', [$usercontext->id]);
provider::delete_data_for_user($approvedcontextlist);
@@ -255,12 +256,12 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
// Create a user.
$user = $this->getDataGenerator()->create_user();
$usercontext = context_user::instance($user->id);
$usercontext = \context_user::instance($user->id);
// Create course category.
$coursecategory = $this->getDataGenerator()->create_category();
$coursecategoryctx = \context_coursecat::instance($coursecategory->id);
$systemctx = context_system::instance();
$systemctx = \context_system::instance();
$this->setAdminUser();
@@ -301,12 +302,12 @@ class tool_cohortroles_privacy_testcase extends \core_privacy\tests\provider_tes
$user2 = $this->getDataGenerator()->create_user();
// Create user3.
$user3 = $this->getDataGenerator()->create_user();
$usercontext3 = context_user::instance($user3->id);
$usercontext3 = \context_user::instance($user3->id);
// Create course category.
$coursecategory = $this->getDataGenerator()->create_category();
$coursecategoryctx = \context_coursecat::instance($coursecategory->id);
$systemctx = context_system::instance();
$systemctx = \context_system::instance();
$this->setAdminUser();
+4 -4
View File
@@ -10,9 +10,9 @@
<FIELD NAME="lang" TYPE="char" LENGTH="20" NOTNULL="true" SEQUENCE="false" COMMENT="The code of the language this string belongs to. Like en, cs or es"/>
<FIELD NAME="componentid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The id of the component"/>
<FIELD NAME="stringid" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" COMMENT="The identifier of the string"/>
<FIELD NAME="original" TYPE="text" LENGTH="big" NOTNULL="true" SEQUENCE="false" COMMENT="English original of the string"/>
<FIELD NAME="master" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false" COMMENT="Master translation of the string as is distributed in the official lang pack, null if not translated"/>
<FIELD NAME="local" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false" COMMENT="Local customization of the string, null if not customized"/>
<FIELD NAME="original" TYPE="text" NOTNULL="true" SEQUENCE="false" COMMENT="English original of the string"/>
<FIELD NAME="master" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Master translation of the string as is distributed in the official lang pack, null if not translated"/>
<FIELD NAME="local" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Local customization of the string, null if not customized"/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The timestamp of when the original or master was recently modified"/>
<FIELD NAME="timecustomized" TYPE="int" LENGTH="10" NOTNULL="false" SEQUENCE="false" COMMENT="The timestamp of when the value of the local translation was recently modified, null if not customized yet"/>
<FIELD NAME="outdated" TYPE="int" LENGTH="3" NOTNULL="false" DEFAULT="0" SEQUENCE="false" COMMENT="Either the English original or the master translation changed and the customization may be outdated"/>
@@ -37,4 +37,4 @@
</KEYS>
</TABLE>
</TABLES>
</XMLDB>
</XMLDB>
@@ -36,7 +36,7 @@ use moodle_exception;
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class langstring_testcase extends advanced_testcase {
class langstring_test extends advanced_testcase {
/**
* Sanity 1.x string
@@ -34,7 +34,7 @@ use moodle_exception;
* @copyright 2015 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class phpparser_testcase extends advanced_testcase {
class phpparser_test extends advanced_testcase {
/**
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/add_category",["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,e,f,g){var h={CATEGORY_LINK:"[data-add-element=\"category\"]"},i=function(a){this.contextId=a;this.strings=b.get_strings([{key:"addcategory",component:"tool_dataprivacy"},{key:"save",component:"admin"}]);this.registerEventListeners()};i.prototype.contextId=0;i.prototype.strings=0;i.prototype.registerEventListeners=function(){var b=a(h.CATEGORY_LINK);b.on("click",function(){return this.strings.then(function(a){e.create({type:e.types.SAVE_CANCEL,title:a[0],body:""},b).done(function(b){this.setupFormModal(b,a[1])}.bind(this))}.bind(this)).fail(d.exception)}.bind(this))};i.prototype.getBody=function(a){var b=null;if("undefined"!=typeof a){b={jsonformdata:JSON.stringify(a)}}return g.loadFragment("tool_dataprivacy","addcategory_form",this.contextId,b)};i.prototype.setupFormModal=function(a,b){a.setLarge();a.setSaveButtonText(b);a.getRoot().on(f.hidden,this.destroy.bind(this));a.setBody(this.getBody());a.getRoot().on(f.save,this.submitForm.bind(this));a.getRoot().on("submit","form",this.submitFormAjax.bind(this));this.modal=a;a.show()};i.prototype.submitForm=function(a){a.preventDefault();this.modal.getRoot().find("form").submit()};i.prototype.submitFormAjax=function(a){a.preventDefault();var b=this.modal.getRoot().find("form").serialize();c.call([{methodname:"tool_dataprivacy_create_category_form",args:{jsonformdata:JSON.stringify(b)},done:function(a){if(a.validationerrors){this.modal.setBody(this.getBody(b))}else{this.close()}}.bind(this),fail:d.exception}])};i.prototype.close=function(){this.destroy();document.location.reload()};i.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()});this.modal.destroy()};i.prototype.removeListeners=function(){a(h.CATEGORY_LINK).off("click")};return{getInstance:function getInstance(a){return new i(a)}}});
//# sourceMappingURL=add_category.min.js.map
/**
* Module to add categories.
*
* @module tool_dataprivacy/add_category
* @copyright 2018 David Monllao
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/add_category",["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],(function($,Str,Ajax,Notification,ModalFactory,ModalEvents,Fragment){var SELECTORS_CATEGORY_LINK='[data-add-element="category"]',AddCategory=function(contextId){this.contextId=contextId;this.strings=Str.get_strings([{key:"addcategory",component:"tool_dataprivacy"},{key:"save",component:"admin"}]),this.registerEventListeners()};return AddCategory.prototype.contextId=0,AddCategory.prototype.strings=0,AddCategory.prototype.registerEventListeners=function(){var trigger=$(SELECTORS_CATEGORY_LINK);trigger.on("click",function(){return this.strings.then(function(strings){ModalFactory.create({type:ModalFactory.types.SAVE_CANCEL,title:strings[0],body:""},trigger).done(function(modal){this.setupFormModal(modal,strings[1])}.bind(this))}.bind(this)).fail(Notification.exception)}.bind(this))},AddCategory.prototype.getBody=function(formdata){var params=null;return void 0!==formdata&&(params={jsonformdata:JSON.stringify(formdata)}),Fragment.loadFragment("tool_dataprivacy","addcategory_form",this.contextId,params)},AddCategory.prototype.setupFormModal=function(modal,saveText){modal.setLarge(),modal.setSaveButtonText(saveText),modal.getRoot().on(ModalEvents.hidden,this.destroy.bind(this)),modal.setBody(this.getBody()),modal.getRoot().on(ModalEvents.save,this.submitForm.bind(this)),modal.getRoot().on("submit","form",this.submitFormAjax.bind(this)),this.modal=modal,modal.show()},AddCategory.prototype.submitForm=function(e){e.preventDefault(),this.modal.getRoot().find("form").submit()},AddCategory.prototype.submitFormAjax=function(e){e.preventDefault();var formData=this.modal.getRoot().find("form").serialize();Ajax.call([{methodname:"tool_dataprivacy_create_category_form",args:{jsonformdata:JSON.stringify(formData)},done:function(data){data.validationerrors?this.modal.setBody(this.getBody(formData)):this.close()}.bind(this),fail:Notification.exception}])},AddCategory.prototype.close=function(){this.destroy(),document.location.reload()},AddCategory.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",(function(){M.core_formchangechecker.reset_form_dirty_state()})),this.modal.destroy()},AddCategory.prototype.removeListeners=function(){$(SELECTORS_CATEGORY_LINK).off("click")},{getInstance:function(contextId){return new AddCategory(contextId)}}}));
//# sourceMappingURL=add_category.min.js.map
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/add_purpose",["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],function(a,b,c,d,e,f,g){var h={PURPOSE_LINK:"[data-add-element=\"purpose\"]"},i=function(a){this.contextId=a;this.strings=b.get_strings([{key:"addpurpose",component:"tool_dataprivacy"},{key:"save",component:"admin"}]);this.registerEventListeners()};i.prototype.contextId=0;i.prototype.strings=0;i.prototype.registerEventListeners=function(){var b=a(h.PURPOSE_LINK);b.on("click",function(){return this.strings.then(function(a){e.create({type:e.types.SAVE_CANCEL,title:a[0],body:""},b).done(function(b){this.setupFormModal(b,a[1])}.bind(this))}.bind(this)).fail(d.exception)}.bind(this))};i.prototype.getBody=function(a){var b=null;if("undefined"!=typeof a){b={jsonformdata:JSON.stringify(a)}}return g.loadFragment("tool_dataprivacy","addpurpose_form",this.contextId,b)};i.prototype.setupFormModal=function(a,b){a.setLarge();a.setSaveButtonText(b);a.getRoot().on(f.hidden,this.destroy.bind(this));a.setBody(this.getBody());a.getRoot().on(f.save,this.submitForm.bind(this));a.getRoot().on("submit","form",this.submitFormAjax.bind(this));this.modal=a;a.show()};i.prototype.submitForm=function(a){a.preventDefault();this.modal.getRoot().find("form").submit()};i.prototype.submitFormAjax=function(a){a.preventDefault();var b=this.modal.getRoot().find("form").serialize();c.call([{methodname:"tool_dataprivacy_create_purpose_form",args:{jsonformdata:JSON.stringify(b)},done:function(a){if(a.validationerrors){this.modal.setBody(this.getBody(b))}else{this.close()}}.bind(this),fail:d.exception}])};i.prototype.close=function(){this.destroy();document.location.reload()};i.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",function(){M.core_formchangechecker.reset_form_dirty_state()});this.modal.destroy()};i.prototype.removeListeners=function(){a(h.PURPOSE_LINK).off("click")};return{getInstance:function getInstance(a){return new i(a)}}});
//# sourceMappingURL=add_purpose.min.js.map
/**
* Module to add purposes.
*
* @module tool_dataprivacy/add_purpose
* @copyright 2018 David Monllao
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/add_purpose",["jquery","core/str","core/ajax","core/notification","core/modal_factory","core/modal_events","core/fragment"],(function($,Str,Ajax,Notification,ModalFactory,ModalEvents,Fragment){var SELECTORS_PURPOSE_LINK='[data-add-element="purpose"]',AddPurpose=function(contextId){this.contextId=contextId;this.strings=Str.get_strings([{key:"addpurpose",component:"tool_dataprivacy"},{key:"save",component:"admin"}]),this.registerEventListeners()};return AddPurpose.prototype.contextId=0,AddPurpose.prototype.strings=0,AddPurpose.prototype.registerEventListeners=function(){var trigger=$(SELECTORS_PURPOSE_LINK);trigger.on("click",function(){return this.strings.then(function(strings){ModalFactory.create({type:ModalFactory.types.SAVE_CANCEL,title:strings[0],body:""},trigger).done(function(modal){this.setupFormModal(modal,strings[1])}.bind(this))}.bind(this)).fail(Notification.exception)}.bind(this))},AddPurpose.prototype.getBody=function(formdata){var params=null;return void 0!==formdata&&(params={jsonformdata:JSON.stringify(formdata)}),Fragment.loadFragment("tool_dataprivacy","addpurpose_form",this.contextId,params)},AddPurpose.prototype.setupFormModal=function(modal,saveText){modal.setLarge(),modal.setSaveButtonText(saveText),modal.getRoot().on(ModalEvents.hidden,this.destroy.bind(this)),modal.setBody(this.getBody()),modal.getRoot().on(ModalEvents.save,this.submitForm.bind(this)),modal.getRoot().on("submit","form",this.submitFormAjax.bind(this)),this.modal=modal,modal.show()},AddPurpose.prototype.submitForm=function(e){e.preventDefault(),this.modal.getRoot().find("form").submit()},AddPurpose.prototype.submitFormAjax=function(e){e.preventDefault();var formData=this.modal.getRoot().find("form").serialize();Ajax.call([{methodname:"tool_dataprivacy_create_purpose_form",args:{jsonformdata:JSON.stringify(formData)},done:function(data){data.validationerrors?this.modal.setBody(this.getBody(formData)):this.close()}.bind(this),fail:Notification.exception}])},AddPurpose.prototype.close=function(){this.destroy(),document.location.reload()},AddPurpose.prototype.destroy=function(){Y.use("moodle-core-formchangechecker",(function(){M.core_formchangechecker.reset_form_dirty_state()})),this.modal.destroy()},AddPurpose.prototype.removeListeners=function(){$(SELECTORS_PURPOSE_LINK).off("click")},{getInstance:function(contextId){return new AddPurpose(contextId)}}}));
//# sourceMappingURL=add_purpose.min.js.map
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/categoriesactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var g={DELETE:"[data-action=\"deletecategory\"]"},h=function(){this.registerEvents()};h.prototype.registerEvents=function(){a(g.DELETE).click(function(g){g.preventDefault();var h=a(this).data("id"),i=a(this).data("name");d.get_strings([{key:"deletecategory",component:"tool_dataprivacy"},{key:"deletecategorytext",component:"tool_dataprivacy",param:i},{key:"delete"}]).then(function(d){var g=d[0],i=d[1],j=d[2];return e.create({title:g,body:i,type:e.types.SAVE_CANCEL}).then(function(d){d.setSaveButtonText(j);d.getRoot().on(f.save,function(){b.call([{methodname:"tool_dataprivacy_delete_category",args:{id:h}}])[0].done(function(b){if(b.result){a("tr[data-categoryid=\""+h+"\"]").remove()}else{c.addNotification({message:b.warnings[0].message,type:"error"})}}).fail(c.exception)});d.getRoot().on(f.hidden,function(){d.destroy()});return d})}).done(function(a){a.show()}).fail(c.exception)})};return{init:function init(){return new h}}});
//# sourceMappingURL=categoriesactions.min.js.map
/**
* AMD module for categories actions.
*
* @module tool_dataprivacy/categoriesactions
* @copyright 2018 David Monllao
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/categoriesactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],(function($,Ajax,Notification,Str,ModalFactory,ModalEvents){var ACTIONS_DELETE='[data-action="deletecategory"]',CategoriesActions=function(){this.registerEvents()};return CategoriesActions.prototype.registerEvents=function(){$(ACTIONS_DELETE).click((function(e){e.preventDefault();var id=$(this).data("id"),stringkeys=[{key:"deletecategory",component:"tool_dataprivacy"},{key:"deletecategorytext",component:"tool_dataprivacy",param:$(this).data("name")},{key:"delete"}];Str.get_strings(stringkeys).then((function(langStrings){var title=langStrings[0],confirmMessage=langStrings[1],buttonText=langStrings[2];return ModalFactory.create({title:title,body:confirmMessage,type:ModalFactory.types.SAVE_CANCEL}).then((function(modal){return modal.setSaveButtonText(buttonText),modal.getRoot().on(ModalEvents.save,(function(){var request={methodname:"tool_dataprivacy_delete_category",args:{id:id}};Ajax.call([request])[0].done((function(data){data.result?$('tr[data-categoryid="'+id+'"]').remove():Notification.addNotification({message:data.warnings[0].message,type:"error"})})).fail(Notification.exception)})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal}))})).done((function(modal){modal.show()})).fail(Notification.exception)}))},{init:function(){return new CategoriesActions}}}));
//# sourceMappingURL=categoriesactions.min.js.map
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/contactdpo",["exports","core_form/modalform","core/notification","core/str","core/toast"],function(a,b,c,d,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=f(b);c=f(c);function f(a){return a&&a.__esModule?a:{default:a}}var g={CONTACT_DPO:"[data-action=\"contactdpo\"]"};a.init=function init(){var a=document.querySelector(g.CONTACT_DPO);a.addEventListener("click",function(f){f.preventDefault();var g=new b.default({modalConfig:{title:(0,d.get_string)("contactdataprotectionofficer","tool_dataprivacy")},formClass:"tool_dataprivacy\\form\\contactdpo",saveButtonText:(0,d.get_string)("send","tool_dataprivacy"),returnFocus:a});g.addEventListener(g.events.FORM_SUBMITTED,function(a){if(a.detail.result){(0,d.get_string)("requestsubmitted","tool_dataprivacy").then(e.add).catch()}else{var b=a.detail.warnings.map(function(a){return a.message});c.default.addNotification({type:"error",message:b.join("<br>")})}});g.show()})}});
//# sourceMappingURL=contactdpo.min.js.map
define("tool_dataprivacy/contactdpo",["exports","core_form/modalform","core/notification","core/str","core/toast"],(function(_exports,_modalform,_notification,_str,_toast){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}
/**
* Javascript module for contacting the site DPO
*
* @module tool_dataprivacy/contactdpo
* @copyright 2021 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modalform=_interopRequireDefault(_modalform),_notification=_interopRequireDefault(_notification);var SELECTORS_CONTACT_DPO='[data-action="contactdpo"]';_exports.init=function(){var triggerElement=document.querySelector(SELECTORS_CONTACT_DPO);triggerElement.addEventListener("click",(function(event){event.preventDefault();var modalForm=new _modalform.default({modalConfig:{title:(0,_str.get_string)("contactdataprotectionofficer","tool_dataprivacy")},formClass:"tool_dataprivacy\\form\\contactdpo",saveButtonText:(0,_str.get_string)("send","tool_dataprivacy"),returnFocus:triggerElement});modalForm.addEventListener(modalForm.events.FORM_SUBMITTED,(function(event){if(event.detail.result)(0,_str.get_string)("requestsubmitted","tool_dataprivacy").then(_toast.add).catch();else{var warningMessages=event.detail.warnings.map((function(warning){return warning.message}));_notification.default.addNotification({type:"error",message:warningMessages.join("<br>")})}})),modalForm.show()}))}}));
//# sourceMappingURL=contactdpo.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/contactdpo.js"],"names":["SELECTORS","CONTACT_DPO","init","triggerElement","document","querySelector","addEventListener","event","preventDefault","modalForm","ModalForm","modalConfig","title","formClass","saveButtonText","returnFocus","events","FORM_SUBMITTED","detail","result","then","addToast","catch","warningMessages","warnings","map","warning","message","Notification","addNotification","type","join","show"],"mappings":"oNAuBA,OACA,O,sDAIMA,CAAAA,CAAS,CAAG,CACdC,WAAW,CAAE,8BADC,C,QAOE,QAAPC,CAAAA,IAAO,EAAM,CACtB,GAAMC,CAAAA,CAAc,CAAGC,QAAQ,CAACC,aAAT,CAAuBL,CAAS,CAACC,WAAjC,CAAvB,CAEAE,CAAc,CAACG,gBAAf,CAAgC,OAAhC,CAAyC,SAAAC,CAAK,CAAI,CAC9CA,CAAK,CAACC,cAAN,GAEA,GAAMC,CAAAA,CAAS,CAAG,GAAIC,UAAJ,CAAc,CAC5BC,WAAW,CAAE,CACTC,KAAK,CAAE,iBAAU,8BAAV,CAA0C,kBAA1C,CADE,CADe,CAI5BC,SAAS,CAAE,oCAJiB,CAK5BC,cAAc,CAAE,iBAAU,MAAV,CAAkB,kBAAlB,CALY,CAM5BC,WAAW,CAAEZ,CANe,CAAd,CAAlB,CAUAM,CAAS,CAACH,gBAAV,CAA2BG,CAAS,CAACO,MAAV,CAAiBC,cAA5C,CAA4D,SAAAV,CAAK,CAAI,CACjE,GAAIA,CAAK,CAACW,MAAN,CAAaC,MAAjB,CAAyB,CACrB,iBAAU,kBAAV,CAA8B,kBAA9B,EAAkDC,IAAlD,CAAuDC,KAAvD,EAAiEC,KAAjE,EACH,CAFD,IAEO,CACH,GAAMC,CAAAA,CAAe,CAAGhB,CAAK,CAACW,MAAN,CAAaM,QAAb,CAAsBC,GAAtB,CAA0B,SAAAC,CAAO,QAAIA,CAAAA,CAAO,CAACC,OAAZ,CAAjC,CAAxB,CACAC,UAAaC,eAAb,CAA6B,CACzBC,IAAI,CAAE,OADmB,CAEzBH,OAAO,CAAEJ,CAAe,CAACQ,IAAhB,CAAqB,MAArB,CAFgB,CAA7B,CAIH,CACJ,CAVD,EAYAtB,CAAS,CAACuB,IAAV,EACH,CA1BD,CA2BH,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Javascript module for contacting the site DPO\n *\n * @module tool_dataprivacy/contactdpo\n * @copyright 2021 Paul Holden <paulh@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\n\nconst SELECTORS = {\n CONTACT_DPO: '[data-action=\"contactdpo\"]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n const triggerElement = document.querySelector(SELECTORS.CONTACT_DPO);\n\n triggerElement.addEventListener('click', event => {\n event.preventDefault();\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('contactdataprotectionofficer', 'tool_dataprivacy'),\n },\n formClass: 'tool_dataprivacy\\\\form\\\\contactdpo',\n saveButtonText: getString('send', 'tool_dataprivacy'),\n returnFocus: triggerElement,\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n getString('requestsubmitted', 'tool_dataprivacy').then(addToast).catch();\n } else {\n const warningMessages = event.detail.warnings.map(warning => warning.message);\n Notification.addNotification({\n type: 'error',\n message: warningMessages.join('<br>')\n });\n }\n });\n\n modalForm.show();\n });\n};\n"],"file":"contactdpo.min.js"}
{"version":3,"file":"contactdpo.min.js","sources":["../src/contactdpo.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Javascript module for contacting the site DPO\n *\n * @module tool_dataprivacy/contactdpo\n * @copyright 2021 Paul Holden <paulh@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\n\nconst SELECTORS = {\n CONTACT_DPO: '[data-action=\"contactdpo\"]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n const triggerElement = document.querySelector(SELECTORS.CONTACT_DPO);\n\n triggerElement.addEventListener('click', event => {\n event.preventDefault();\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('contactdataprotectionofficer', 'tool_dataprivacy'),\n },\n formClass: 'tool_dataprivacy\\\\form\\\\contactdpo',\n saveButtonText: getString('send', 'tool_dataprivacy'),\n returnFocus: triggerElement,\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n getString('requestsubmitted', 'tool_dataprivacy').then(addToast).catch();\n } else {\n const warningMessages = event.detail.warnings.map(warning => warning.message);\n Notification.addNotification({\n type: 'error',\n message: warningMessages.join('<br>')\n });\n }\n });\n\n modalForm.show();\n });\n};\n"],"names":["SELECTORS","triggerElement","document","querySelector","addEventListener","event","preventDefault","modalForm","ModalForm","modalConfig","title","formClass","saveButtonText","returnFocus","events","FORM_SUBMITTED","detail","result","then","addToast","catch","warningMessages","warnings","map","warning","message","addNotification","type","join","show"],"mappings":";;;;;;;wLA4BMA,sBACW,2CAMG,eACVC,eAAiBC,SAASC,cAAcH,uBAE9CC,eAAeG,iBAAiB,SAAS,SAAAC,OACrCA,MAAMC,qBAEAC,UAAY,IAAIC,mBAAU,CAC5BC,YAAa,CACTC,OAAO,mBAAU,+BAAgC,qBAErDC,UAAW,qCACXC,gBAAgB,mBAAU,OAAQ,oBAClCC,YAAaZ,iBAIjBM,UAAUH,iBAAiBG,UAAUO,OAAOC,gBAAgB,SAAAV,UACpDA,MAAMW,OAAOC,2BACH,mBAAoB,oBAAoBC,KAAKC,YAAUC,YAC9D,KACGC,gBAAkBhB,MAAMW,OAAOM,SAASC,KAAI,SAAAC,gBAAWA,QAAQC,iCACxDC,gBAAgB,CACzBC,KAAM,QACNF,QAASJ,gBAAgBO,KAAK,cAK1CrB,UAAUsB"}
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/data_deletion",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var h={MARK_FOR_DELETION:"[data-action=\"markfordeletion\"]",SELECT_ALL:"[data-action=\"selectall\"]"},i={SELECTCONTEXT:".selectcontext"},j=function(){this.registerEvents()};j.prototype.registerEvents=function(){a(h.MARK_FOR_DELETION).click(function(b){b.preventDefault();var c=[];a(i.SELECTCONTEXT).each(function(){var b=a(this);if(b.is(":checked")){c.push(b.val())}});g(c)});a(h.SELECT_ALL).change(function(b){b.preventDefault();var c=a(this);if(c.is(":checked")){a(i.SELECTCONTEXT).attr("checked","checked")}else{a(i.SELECTCONTEXT).removeAttr("checked")}})};function g(a){var g="";d.get_strings([{key:"confirm",component:"moodle"},{key:"confirmcontextdeletion",component:"tool_dataprivacy"}]).then(function(a){g=a[0];var b=a[1];return e.create({title:g,body:b,type:e.types.SAVE_CANCEL})}).then(function(d){d.setSaveButtonText(g);d.getRoot().on(f.save,function(){b.call([{methodname:"tool_dataprivacy_confirm_contexts_for_deletion",args:{ids:a}}])[0].done(function(a){if(a.result){window.location.reload()}else{c.addNotification({message:a.warnings[0].message,type:"error"})}}).fail(c.exception)});d.getRoot().on(f.hidden,function(){d.destroy()});return d}).done(function(a){a.show()}).fail(c.exception)}return j});
//# sourceMappingURL=data_deletion.min.js.map
/**
* Request actions.
*
* @module tool_dataprivacy/data_deletion
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/data_deletion",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],(function($,Ajax,Notification,Str,ModalFactory,ModalEvents){var ACTIONS_MARK_FOR_DELETION='[data-action="markfordeletion"]',ACTIONS_SELECT_ALL='[data-action="selectall"]',SELECTORS_SELECTCONTEXT=".selectcontext",DataDeletionActions=function(){this.registerEvents()};return DataDeletionActions.prototype.registerEvents=function(){$(ACTIONS_MARK_FOR_DELETION).click((function(e){e.preventDefault();var ids,keys,wsfunction,modalTitle,selectedIds=[];$(SELECTORS_SELECTCONTEXT).each((function(){var checkbox=$(this);checkbox.is(":checked")&&selectedIds.push(checkbox.val())})),ids=selectedIds,keys=[{key:"confirm",component:"moodle"},{key:"confirmcontextdeletion",component:"tool_dataprivacy"}],wsfunction="tool_dataprivacy_confirm_contexts_for_deletion",modalTitle="",Str.get_strings(keys).then((function(langStrings){modalTitle=langStrings[0];var confirmMessage=langStrings[1];return ModalFactory.create({title:modalTitle,body:confirmMessage,type:ModalFactory.types.SAVE_CANCEL})})).then((function(modal){return modal.setSaveButtonText(modalTitle),modal.getRoot().on(ModalEvents.save,(function(){var request={methodname:wsfunction,args:{ids:ids}};Ajax.call([request])[0].done((function(data){data.result?window.location.reload():Notification.addNotification({message:data.warnings[0].message,type:"error"})})).fail(Notification.exception)})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal})).done((function(modal){modal.show()})).fail(Notification.exception)})),$(ACTIONS_SELECT_ALL).change((function(e){e.preventDefault(),$(this).is(":checked")?$(SELECTORS_SELECTCONTEXT).attr("checked","checked"):$(SELECTORS_SELECTCONTEXT).removeAttr("checked")}))},DataDeletionActions}));
//# sourceMappingURL=data_deletion.min.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/data_request_modal",["jquery","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","tool_dataprivacy/events"],function(a,b,c,d,e,f){var g=!1,h={APPROVE_BUTTON:"[data-action=\"approve\"]",DENY_BUTTON:"[data-action=\"deny\"]",COMPLETE_BUTTON:"[data-action=\"complete\"]"},i=function(a){d.call(this,a)};i.TYPE="tool_dataprivacy-data_request";i.prototype=Object.create(d.prototype);i.prototype.constructor=i;i.prototype.registerEventListeners=function(){d.prototype.registerEventListeners.call(this);this.getModal().on(c.events.activate,h.APPROVE_BUTTON,function(b,c){var d=a.Event(f.approve);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this));this.getModal().on(c.events.activate,h.DENY_BUTTON,function(b,c){var d=a.Event(f.deny);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this));this.getModal().on(c.events.activate,h.COMPLETE_BUTTON,function(b,c){var d=a.Event(f.complete);this.getRoot().trigger(d,this);if(!d.isDefaultPrevented()){this.hide();c.originalEvent.preventDefault()}}.bind(this))};if(!g){e.register(i.TYPE,i,"tool_dataprivacy/data_request_modal");g=!0}return i});
//# sourceMappingURL=data_request_modal.min.js.map
/**
* Request actions.
*
* @module tool_dataprivacy/data_request_modal
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/data_request_modal",["jquery","core/notification","core/custom_interaction_events","core/modal","core/modal_registry","tool_dataprivacy/events"],(function($,Notification,CustomEvents,Modal,ModalRegistry,DataPrivacyEvents){var registered=!1,SELECTORS_APPROVE_BUTTON='[data-action="approve"]',SELECTORS_DENY_BUTTON='[data-action="deny"]',SELECTORS_COMPLETE_BUTTON='[data-action="complete"]',ModalDataRequest=function(root){Modal.call(this,root)};return ModalDataRequest.TYPE="tool_dataprivacy-data_request",(ModalDataRequest.prototype=Object.create(Modal.prototype)).constructor=ModalDataRequest,ModalDataRequest.prototype.registerEventListeners=function(){Modal.prototype.registerEventListeners.call(this),this.getModal().on(CustomEvents.events.activate,SELECTORS_APPROVE_BUTTON,function(e,data){var approveEvent=$.Event(DataPrivacyEvents.approve);this.getRoot().trigger(approveEvent,this),approveEvent.isDefaultPrevented()||(this.hide(),data.originalEvent.preventDefault())}.bind(this)),this.getModal().on(CustomEvents.events.activate,SELECTORS_DENY_BUTTON,function(e,data){var denyEvent=$.Event(DataPrivacyEvents.deny);this.getRoot().trigger(denyEvent,this),denyEvent.isDefaultPrevented()||(this.hide(),data.originalEvent.preventDefault())}.bind(this)),this.getModal().on(CustomEvents.events.activate,SELECTORS_COMPLETE_BUTTON,function(e,data){var completeEvent=$.Event(DataPrivacyEvents.complete);this.getRoot().trigger(completeEvent,this),completeEvent.isDefaultPrevented()||(this.hide(),data.originalEvent.preventDefault())}.bind(this))},registered||(ModalRegistry.register(ModalDataRequest.TYPE,ModalDataRequest,"tool_dataprivacy/data_request_modal"),registered=!0),ModalDataRequest}));
//# sourceMappingURL=data_request_modal.min.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/effective_retention_period",["jquery"],function(a){var b={PURPOSE_SELECT:"#id_purposeid",RETENTION_FIELD:"#fitem_id_retention_current [data-fieldtype=static]"},c=function(a){this.purposeRetentionPeriods=a;this.registerEventListeners()},d=function(){a(b.PURPOSE_SELECT).off("change")};c.prototype.purposeRetentionPeriods=[];c.prototype.registerEventListeners=function(){a(b.PURPOSE_SELECT).on("change",function(c){var d=a(c.currentTarget).val(),e=this.purposeRetentionPeriods[d];a(b.RETENTION_FIELD).text(e)}.bind(this))};return{init:function init(a){d();return new c(a)}}});
//# sourceMappingURL=effective_retention_period.min.js.map
/**
* Module to update the displayed retention period.
*
* @module tool_dataprivacy/effective_retention_period
* @copyright 2018 David Monllao
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/effective_retention_period",["jquery"],(function($){var SELECTORS_PURPOSE_SELECT="#id_purposeid",SELECTORS_RETENTION_FIELD="#fitem_id_retention_current [data-fieldtype=static]",EffectiveRetentionPeriod=function(purposeRetentionPeriods){this.purposeRetentionPeriods=purposeRetentionPeriods,this.registerEventListeners()};return EffectiveRetentionPeriod.prototype.purposeRetentionPeriods=[],EffectiveRetentionPeriod.prototype.registerEventListeners=function(){$(SELECTORS_PURPOSE_SELECT).on("change",function(ev){var selected=$(ev.currentTarget).val(),selectedPurpose=this.purposeRetentionPeriods[selected];$(SELECTORS_RETENTION_FIELD).text(selectedPurpose)}.bind(this))},{init:function(purposeRetentionPeriods){return $(SELECTORS_PURPOSE_SELECT).off("change"),new EffectiveRetentionPeriod(purposeRetentionPeriods)}}}));
//# sourceMappingURL=effective_retention_period.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/effective_retention_period.js"],"names":["define","$","SELECTORS","PURPOSE_SELECT","RETENTION_FIELD","EffectiveRetentionPeriod","purposeRetentionPeriods","registerEventListeners","removeListeners","off","prototype","on","ev","selected","currentTarget","val","selectedPurpose","text","bind","init"],"mappings":"AAsBAA,OAAM,+CAAC,CAAC,QAAD,CAAD,CACF,SAASC,CAAT,CAAY,IAEJC,CAAAA,CAAS,CAAG,CACZC,cAAc,CAAE,eADJ,CAEZC,eAAe,CAAE,qDAFL,CAFR,CAYJC,CAAwB,CAAG,SAASC,CAAT,CAAkC,CAC7D,KAAKA,uBAAL,CAA+BA,CAA/B,CACA,KAAKC,sBAAL,EACH,CAfO,CAsBJC,CAAe,CAAG,UAAW,CAC7BP,CAAC,CAACC,CAAS,CAACC,cAAX,CAAD,CAA4BM,GAA5B,CAAgC,QAAhC,CACH,CAxBO,CA8BRJ,CAAwB,CAACK,SAAzB,CAAmCJ,uBAAnC,CAA6D,EAA7D,CAOAD,CAAwB,CAACK,SAAzB,CAAmCH,sBAAnC,CAA4D,UAAW,CAEnEN,CAAC,CAACC,CAAS,CAACC,cAAX,CAAD,CAA4BQ,EAA5B,CAA+B,QAA/B,CAAyC,SAASC,CAAT,CAAa,IAC9CC,CAAAA,CAAQ,CAAGZ,CAAC,CAACW,CAAE,CAACE,aAAJ,CAAD,CAAoBC,GAApB,EADmC,CAE9CC,CAAe,CAAG,KAAKV,uBAAL,CAA6BO,CAA7B,CAF4B,CAGlDZ,CAAC,CAACC,CAAS,CAACE,eAAX,CAAD,CAA6Ba,IAA7B,CAAkCD,CAAlC,CACH,CAJwC,CAIvCE,IAJuC,CAIlC,IAJkC,CAAzC,CAKH,CAPD,CASA,MAAwE,CACpEC,IAAI,CAAE,cAASb,CAAT,CAAkC,CAEpCE,CAAe,GACf,MAAO,IAAIH,CAAAA,CAAJ,CAA6BC,CAA7B,CACV,CALmE,CAO3E,CAtDC,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Module to update the displayed retention period.\n *\n * @module tool_dataprivacy/effective_retention_period\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'],\n function($) {\n\n var SELECTORS = {\n PURPOSE_SELECT: '#id_purposeid',\n RETENTION_FIELD: '#fitem_id_retention_current [data-fieldtype=static]',\n };\n\n /**\n * Constructor for the retention period display.\n *\n * @param {Array} purposeRetentionPeriods Associative array of purposeids with effective retention period at this context\n */\n var EffectiveRetentionPeriod = function(purposeRetentionPeriods) {\n this.purposeRetentionPeriods = purposeRetentionPeriods;\n this.registerEventListeners();\n };\n\n /**\n * Removes the current 'change' listeners.\n *\n * Useful when a new form is loaded.\n */\n var removeListeners = function() {\n $(SELECTORS.PURPOSE_SELECT).off('change');\n };\n\n /**\n * @var {Array} purposeRetentionPeriods\n * @private\n */\n EffectiveRetentionPeriod.prototype.purposeRetentionPeriods = [];\n\n /**\n * Add purpose change listeners.\n *\n * @method registerEventListeners\n */\n EffectiveRetentionPeriod.prototype.registerEventListeners = function() {\n\n $(SELECTORS.PURPOSE_SELECT).on('change', function(ev) {\n var selected = $(ev.currentTarget).val();\n var selectedPurpose = this.purposeRetentionPeriods[selected];\n $(SELECTORS.RETENTION_FIELD).text(selectedPurpose);\n }.bind(this));\n };\n\n return /** @alias module:tool_dataprivacy/effective_retention_period */ {\n init: function(purposeRetentionPeriods) {\n // Remove previously attached listeners.\n removeListeners();\n return new EffectiveRetentionPeriod(purposeRetentionPeriods);\n }\n };\n }\n);\n\n"],"file":"effective_retention_period.min.js"}
{"version":3,"file":"effective_retention_period.min.js","sources":["../src/effective_retention_period.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Module to update the displayed retention period.\n *\n * @module tool_dataprivacy/effective_retention_period\n * @copyright 2018 David Monllao\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'],\n function($) {\n\n var SELECTORS = {\n PURPOSE_SELECT: '#id_purposeid',\n RETENTION_FIELD: '#fitem_id_retention_current [data-fieldtype=static]',\n };\n\n /**\n * Constructor for the retention period display.\n *\n * @param {Array} purposeRetentionPeriods Associative array of purposeids with effective retention period at this context\n */\n var EffectiveRetentionPeriod = function(purposeRetentionPeriods) {\n this.purposeRetentionPeriods = purposeRetentionPeriods;\n this.registerEventListeners();\n };\n\n /**\n * Removes the current 'change' listeners.\n *\n * Useful when a new form is loaded.\n */\n var removeListeners = function() {\n $(SELECTORS.PURPOSE_SELECT).off('change');\n };\n\n /**\n * @var {Array} purposeRetentionPeriods\n * @private\n */\n EffectiveRetentionPeriod.prototype.purposeRetentionPeriods = [];\n\n /**\n * Add purpose change listeners.\n *\n * @method registerEventListeners\n */\n EffectiveRetentionPeriod.prototype.registerEventListeners = function() {\n\n $(SELECTORS.PURPOSE_SELECT).on('change', function(ev) {\n var selected = $(ev.currentTarget).val();\n var selectedPurpose = this.purposeRetentionPeriods[selected];\n $(SELECTORS.RETENTION_FIELD).text(selectedPurpose);\n }.bind(this));\n };\n\n return /** @alias module:tool_dataprivacy/effective_retention_period */ {\n init: function(purposeRetentionPeriods) {\n // Remove previously attached listeners.\n removeListeners();\n return new EffectiveRetentionPeriod(purposeRetentionPeriods);\n }\n };\n }\n);\n\n"],"names":["define","$","SELECTORS","EffectiveRetentionPeriod","purposeRetentionPeriods","registerEventListeners","prototype","on","ev","selected","currentTarget","val","selectedPurpose","this","text","bind","init","off"],"mappings":";;;;;;;AAsBAA,qDAAO,CAAC,WACJ,SAASC,OAEDC,yBACgB,gBADhBA,0BAEiB,sDAQjBC,yBAA2B,SAASC,8BAC/BA,wBAA0BA,6BAC1BC,iCAgBTF,yBAAyBG,UAAUF,wBAA0B,GAO7DD,yBAAyBG,UAAUD,uBAAyB,WAExDJ,EAAEC,0BAA0BK,GAAG,SAAU,SAASC,QAC1CC,SAAWR,EAAEO,GAAGE,eAAeC,MAC/BC,gBAAkBC,KAAKT,wBAAwBK,UACnDR,EAAEC,2BAA2BY,KAAKF,kBACpCG,KAAKF,QAG6D,CACpEG,KAAM,SAASZ,gCAxBfH,EAAEC,0BAA0Be,IAAI,UA2BrB,IAAId,yBAAyBC"}
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/events",[],function(){return{approve:"tool_dataprivacy-data_request:approve",bulkApprove:"tool_dataprivacy-data_request:bulk_approve",deny:"tool_dataprivacy-data_request:deny",bulkDeny:"tool_dataprivacy-data_request:bulk_deny",complete:"tool_dataprivacy-data_request:complete"}});
//# sourceMappingURL=events.min.js.map
/**
* Contain the events the data privacy tool can fire.
*
* @module tool_dataprivacy/events
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/events",[],(function(){return{approve:"tool_dataprivacy-data_request:approve",bulkApprove:"tool_dataprivacy-data_request:bulk_approve",deny:"tool_dataprivacy-data_request:deny",bulkDeny:"tool_dataprivacy-data_request:bulk_deny",complete:"tool_dataprivacy-data_request:complete"}}));
//# sourceMappingURL=events.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/events.js"],"names":["define","approve","bulkApprove","deny","bulkDeny","complete"],"mappings":"AAsBAA,OAAM,2BAAC,EAAD,CAAK,UAAW,CAClB,MAAO,CACHC,OAAO,CAAE,uCADN,CAEHC,WAAW,CAAE,4CAFV,CAGHC,IAAI,CAAE,oCAHH,CAIHC,QAAQ,CAAE,yCAJP,CAKHC,QAAQ,CAAE,wCALP,CAOV,CARK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Contain the events the data privacy tool can fire.\n *\n * @module tool_dataprivacy/events\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n approve: 'tool_dataprivacy-data_request:approve',\n bulkApprove: 'tool_dataprivacy-data_request:bulk_approve',\n deny: 'tool_dataprivacy-data_request:deny',\n bulkDeny: 'tool_dataprivacy-data_request:bulk_deny',\n complete: 'tool_dataprivacy-data_request:complete'\n };\n});\n"],"file":"events.min.js"}
{"version":3,"file":"events.min.js","sources":["../src/events.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Contain the events the data privacy tool can fire.\n *\n * @module tool_dataprivacy/events\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n return {\n approve: 'tool_dataprivacy-data_request:approve',\n bulkApprove: 'tool_dataprivacy-data_request:bulk_approve',\n deny: 'tool_dataprivacy-data_request:deny',\n bulkDeny: 'tool_dataprivacy-data_request:bulk_deny',\n complete: 'tool_dataprivacy-data_request:complete'\n };\n});\n"],"names":["define","approve","bulkApprove","deny","bulkDeny","complete"],"mappings":";;;;;;;AAsBAA,iCAAO,IAAI,iBACA,CACHC,QAAS,wCACTC,YAAa,6CACbC,KAAM,qCACNC,SAAU,0CACVC,SAAU"}
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/expand_contract",["jquery","core/url","core/str"],function(a,b,c){var d=a("<img alt=\"\" src=\""+b.imageUrl("t/expanded")+"\"/>"),e=a("<img alt=\"\" src=\""+b.imageUrl("t/collapsed")+"\"/>"),f={EXPAND:"fa-caret-right",COLLAPSE:"fa-caret-down"};return{expandCollapse:function expandCollapse(a,b){if(a.hasClass("hide")){a.removeClass("hide");a.addClass("visible");a.attr("aria-expanded",!0);b.find(":header i.fa").removeClass(f.EXPAND);b.find(":header i.fa").addClass(f.COLLAPSE);b.find(":header img.icon").attr("src",d.attr("src"))}else{a.removeClass("visible");a.addClass("hide");a.attr("aria-expanded",!1);b.find(":header i.fa").removeClass(f.COLLAPSE);b.find(":header i.fa").addClass(f.EXPAND);b.find(":header img.icon").attr("src",e.attr("src"))}},expandCollapseAll:function expandCollapseAll(b){var g="visible"==b?"hide":"visible",h="visible"==b?!0:!1,i="visible"==b?f.EXPAND:f.COLLAPSE,j="visible"==b?f.COLLAPSE:f.EXPAND,k="visible"==b?d.attr("src"):e.attr("src");a("."+g).each(function(){a(this).removeClass(g);a(this).addClass(b);a(this).attr("aria-expanded",h)});a(".tool_dataprivacy-expand-all").data("visibilityState",g);c.get_string(g,"tool_dataprivacy").then(function(b){a(".tool_dataprivacy-expand-all").html(b)}).catch(Notification.exception);a(":header i.fa").each(function(){a(this).removeClass(i);a(this).addClass(j)});a(":header img.icon").each(function(){a(this).attr("src",k)})}}});
//# sourceMappingURL=expand_contract.min.js.map
/**
* Potential user selector module.
*
* @module tool_dataprivacy/expand_contract
* @copyright 2018 Adrian Greeve
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/expand_contract",["jquery","core/url","core/str"],(function($,url,str){var expandedImage=$('<img alt="" src="'+url.imageUrl("t/expanded")+'"/>'),collapsedImage=$('<img alt="" src="'+url.imageUrl("t/collapsed")+'"/>'),CLASSES_EXPAND="fa-caret-right",CLASSES_COLLAPSE="fa-caret-down";return{expandCollapse:function(targetnode,thisnode){targetnode.hasClass("hide")?(targetnode.removeClass("hide"),targetnode.addClass("visible"),targetnode.attr("aria-expanded",!0),thisnode.find(":header i.fa").removeClass(CLASSES_EXPAND),thisnode.find(":header i.fa").addClass(CLASSES_COLLAPSE),thisnode.find(":header img.icon").attr("src",expandedImage.attr("src"))):(targetnode.removeClass("visible"),targetnode.addClass("hide"),targetnode.attr("aria-expanded",!1),thisnode.find(":header i.fa").removeClass(CLASSES_COLLAPSE),thisnode.find(":header i.fa").addClass(CLASSES_EXPAND),thisnode.find(":header img.icon").attr("src",collapsedImage.attr("src")))},expandCollapseAll:function(nextstate){var currentstate="visible"==nextstate?"hide":"visible",ariaexpandedstate="visible"==nextstate,iconclassnow="visible"==nextstate?CLASSES_EXPAND:CLASSES_COLLAPSE,iconclassnext="visible"==nextstate?CLASSES_COLLAPSE:CLASSES_EXPAND,imagenow="visible"==nextstate?expandedImage.attr("src"):collapsedImage.attr("src");$("."+currentstate).each((function(){$(this).removeClass(currentstate),$(this).addClass(nextstate),$(this).attr("aria-expanded",ariaexpandedstate)})),$(".tool_dataprivacy-expand-all").data("visibilityState",currentstate),str.get_string(currentstate,"tool_dataprivacy").then((function(langString){$(".tool_dataprivacy-expand-all").html(langString)})).catch(Notification.exception),$(":header i.fa").each((function(){$(this).removeClass(iconclassnow),$(this).addClass(iconclassnext)})),$(":header img.icon").each((function(){$(this).attr("src",imagenow)}))}}}));
//# sourceMappingURL=expand_contract.min.js.map
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/form-user-selector",["jquery","core/ajax","core/templates"],function(a,b,c){return{processResults:function processResults(b,c){var d=[];a.each(c,function(a,b){d.push({value:b.id,label:b._label})});return d},transport:function transport(d,e,f,g){var h=b.call([{methodname:"tool_dataprivacy_get_users",args:{query:e}}]);h[0].then(function(b){var d=[],e=0;a.each(b,function(a,b){d.push(c.render("tool_dataprivacy/form-user-selector-suggestion",b))});return a.when.apply(a.when,d).then(function(){var c=arguments;a.each(b,function(a,b){b._label=c[e];e++});f(b)})}).fail(g)}}});
//# sourceMappingURL=form-user-selector.min.js.map
/**
* Potential user selector module.
*
* @module tool_dataprivacy/form-user-selector
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/form-user-selector",["jquery","core/ajax","core/templates"],(function($,Ajax,Templates){return{processResults:function(selector,results){var users=[];return $.each(results,(function(index,user){users.push({value:user.id,label:user._label})})),users},transport:function(selector,query,success,failure){Ajax.call([{methodname:"tool_dataprivacy_get_users",args:{query:query}}])[0].then((function(results){var promises=[],i=0;return $.each(results,(function(index,user){promises.push(Templates.render("tool_dataprivacy/form-user-selector-suggestion",user))})),$.when.apply($.when,promises).then((function(){var args=arguments;$.each(results,(function(index,user){user._label=args[i],i++})),success(results)}))})).fail(failure)}}}));
//# sourceMappingURL=form-user-selector.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/form-user-selector.js"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","promise","call","methodname","args","then","promises","i","render","when","apply","arguments","fail"],"mappings":"AAuBAA,OAAM,uCAAC,CAAC,QAAD,CAAW,WAAX,CAAwB,gBAAxB,CAAD,CAA4C,SAASC,CAAT,CAAYC,CAAZ,CAAkBC,CAAlB,CAA6B,CAE3E,MAAgE,CAE5DC,cAAc,CAAE,wBAASC,CAAT,CAAmBC,CAAnB,CAA4B,CACxC,GAAIC,CAAAA,CAAK,CAAG,EAAZ,CACAN,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAClCH,CAAK,CAACI,IAAN,CAAW,CACPC,KAAK,CAAEF,CAAI,CAACG,EADL,CAEPC,KAAK,CAAEJ,CAAI,CAACK,MAFL,CAAX,CAIH,CALD,EAMA,MAAOR,CAAAA,CACV,CAX2D,CAa5DS,SAAS,CAAE,mBAASX,CAAT,CAAmBY,CAAnB,CAA0BC,CAA1B,CAAmCC,CAAnC,CAA4C,CACnD,GAAIC,CAAAA,CAAO,CAEDlB,CAAI,CAACmB,IAAL,CAAU,CAAC,CACjBC,UAAU,CAAE,4BADK,CAEjBC,IAAI,CAAE,CACFN,KAAK,CAAEA,CADL,CAFW,CAAD,CAAV,CAFV,CASAG,CAAO,CAAC,CAAD,CAAP,CAAWI,IAAX,CAAgB,SAASlB,CAAT,CAAkB,CAC9B,GAAImB,CAAAA,CAAQ,CAAG,EAAf,CACIC,CAAC,CAAG,CADR,CAIAzB,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAClCe,CAAQ,CAACd,IAAT,CAAcR,CAAS,CAACwB,MAAV,CAAiB,gDAAjB,CAAmEjB,CAAnE,CAAd,CACH,CAFD,EAKA,MAAOT,CAAAA,CAAC,CAAC2B,IAAF,CAAOC,KAAP,CAAa5B,CAAC,CAAC2B,IAAf,CAAqBH,CAArB,EAA+BD,IAA/B,CAAoC,UAAW,CAClD,GAAID,CAAAA,CAAI,CAAGO,SAAX,CACA7B,CAAC,CAACO,IAAF,CAAOF,CAAP,CAAgB,SAASG,CAAT,CAAgBC,CAAhB,CAAsB,CAClCA,CAAI,CAACK,MAAL,CAAcQ,CAAI,CAACG,CAAD,CAAlB,CACAA,CAAC,EACJ,CAHD,EAIAR,CAAO,CAACZ,CAAD,CAEV,CARM,CAUV,CApBD,EAoBGyB,IApBH,CAoBQZ,CApBR,CAqBH,CA5C2D,CAgDnE,CAlDK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Potential user selector module.\n *\n * @module tool_dataprivacy/form-user-selector\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_dataprivacy/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n promise = Ajax.call([{\n methodname: 'tool_dataprivacy_get_users',\n args: {\n query: query\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results, function(index, user) {\n promises.push(Templates.render('tool_dataprivacy/form-user-selector-suggestion', user));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"file":"form-user-selector.min.js"}
{"version":3,"file":"form-user-selector.min.js","sources":["../src/form-user-selector.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Potential user selector module.\n *\n * @module tool_dataprivacy/form-user-selector\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\ndefine(['jquery', 'core/ajax', 'core/templates'], function($, Ajax, Templates) {\n\n return /** @alias module:tool_dataprivacy/form-user-selector */ {\n\n processResults: function(selector, results) {\n var users = [];\n $.each(results, function(index, user) {\n users.push({\n value: user.id,\n label: user._label\n });\n });\n return users;\n },\n\n transport: function(selector, query, success, failure) {\n var promise;\n\n promise = Ajax.call([{\n methodname: 'tool_dataprivacy_get_users',\n args: {\n query: query\n }\n }]);\n\n promise[0].then(function(results) {\n var promises = [],\n i = 0;\n\n // Render the label.\n $.each(results, function(index, user) {\n promises.push(Templates.render('tool_dataprivacy/form-user-selector-suggestion', user));\n });\n\n // Apply the label to the results.\n return $.when.apply($.when, promises).then(function() {\n var args = arguments;\n $.each(results, function(index, user) {\n user._label = args[i];\n i++;\n });\n success(results);\n return;\n });\n\n }).fail(failure);\n }\n\n };\n\n});\n"],"names":["define","$","Ajax","Templates","processResults","selector","results","users","each","index","user","push","value","id","label","_label","transport","query","success","failure","call","methodname","args","then","promises","i","render","when","apply","arguments","fail"],"mappings":";;;;;;;AAuBAA,6CAAO,CAAC,SAAU,YAAa,mBAAmB,SAASC,EAAGC,KAAMC,iBAEA,CAE5DC,eAAgB,SAASC,SAAUC,aAC3BC,MAAQ,UACZN,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BH,MAAMI,KAAK,CACPC,MAAOF,KAAKG,GACZC,MAAOJ,KAAKK,YAGbR,OAGXS,UAAW,SAASX,SAAUY,MAAOC,QAASC,SAGhCjB,KAAKkB,KAAK,CAAC,CACjBC,WAAY,6BACZC,KAAM,CACFL,MAAOA,UAIP,GAAGM,MAAK,SAASjB,aACjBkB,SAAW,GACXC,EAAI,SAGRxB,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5Bc,SAASb,KAAKR,UAAUuB,OAAO,iDAAkDhB,UAI9ET,EAAE0B,KAAKC,MAAM3B,EAAE0B,KAAMH,UAAUD,MAAK,eACnCD,KAAOO,UACX5B,EAAEO,KAAKF,SAAS,SAASG,MAAOC,MAC5BA,KAAKK,OAASO,KAAKG,GACnBA,OAEJP,QAAQZ,eAIbwB,KAAKX"}
+3 -2
View File
@@ -1,2 +1,3 @@
define ("tool_dataprivacy/myrequestactions",["exports","core/ajax","core/notification","core/pending","core/str"],function(a,b,c,d,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=f(b);c=f(c);d=f(d);function f(a){return a&&a.__esModule?a:{default:a}}function g(a,b){return m(a)||l(a,b)||j(a,b)||h()}function h(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function j(a,b){if(!a)return;if("string"==typeof a)return k(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return k(a,b)}function k(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);c<b;c++){d[c]=a[c]}return d}function l(a,b){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(a)))return;var c=[],d=!0,e=!1,f=void 0;try{for(var g=a[Symbol.iterator](),h;!(d=(h=g.next()).done);d=!0){c.push(h.value);if(b&&c.length===b)break}}catch(a){e=!0;f=a}finally{try{if(!d&&null!=g["return"])g["return"]()}finally{if(e)throw f}}return c}function m(a){if(Array.isArray(a))return a}var n={CANCEL_REQUEST:"[data-action=\"cancel\"][data-requestid]"};a.init=function init(){document.addEventListener("click",function(a){var f=a.target.closest(n.CANCEL_REQUEST);if(null===f){return}a.preventDefault();(0,e.get_strings)([{key:"cancelrequest",component:"tool_dataprivacy"},{key:"cancelrequestconfirmation",component:"tool_dataprivacy"}]).then(function(a){var e=g(a,2),h=e[0],i=e[1];return c.default.confirm(h,i,h,null,function(){var a=new d.default("tool/dataprivacy:cancelRequest"),e={methodname:"tool_dataprivacy_cancel_data_request",args:{requestid:f.dataset.requestid}};b.default.call([e])[0].then(function(b){if(b.result){window.location.reload()}else{c.default.addNotification({type:"error",message:b.warnings[0].message})}return a.resolve()}).catch(c.default.exception)})}).catch()})}});
//# sourceMappingURL=myrequestactions.min.js.map
define("tool_dataprivacy/myrequestactions",["exports","core/ajax","core/notification","core/pending","core/str"],(function(_exports,_ajax,_notification,_pending,_str){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}function _slicedToArray(arr,i){return function(arr){if(Array.isArray(arr))return arr}(arr)||function(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null==_i)return;var _s,_e,_arr=[],_n=!0,_d=!1;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function(o,minLen){if(!o)return;if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);"Object"===n&&o.constructor&&(n=o.constructor.name);if("Map"===n||"Set"===n)return Array.from(o);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}(arr,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_ajax=_interopRequireDefault(_ajax),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending);var SELECTORS_CANCEL_REQUEST='[data-action="cancel"][data-requestid]';_exports.init=function(){document.addEventListener("click",(function(event){var triggerElement=event.target.closest(SELECTORS_CANCEL_REQUEST);if(null!==triggerElement){event.preventDefault();(0,_str.get_strings)([{key:"cancelrequest",component:"tool_dataprivacy"},{key:"cancelrequestconfirmation",component:"tool_dataprivacy"}]).then((function(_ref){var _ref2=_slicedToArray(_ref,2),cancelRequest=_ref2[0],cancelConfirm=_ref2[1];return _notification.default.confirm(cancelRequest,cancelConfirm,cancelRequest,null,(function(){var pendingPromise=new _pending.default("tool/dataprivacy:cancelRequest"),request={methodname:"tool_dataprivacy_cancel_data_request",args:{requestid:triggerElement.dataset.requestid}};_ajax.default.call([request])[0].then((function(response){return response.result?window.location.reload():_notification.default.addNotification({type:"error",message:response.warnings[0].message}),pendingPromise.resolve()})).catch(_notification.default.exception)}))})).catch()}}))}}));
//# sourceMappingURL=myrequestactions.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/myrequestactions.js"],"names":["SELECTORS","CANCEL_REQUEST","init","document","addEventListener","event","triggerElement","target","closest","preventDefault","key","component","then","cancelRequest","cancelConfirm","Notification","confirm","pendingPromise","Pending","request","methodname","args","requestid","dataset","Ajax","call","response","result","window","location","reload","addNotification","type","message","warnings","resolve","catch","exception"],"mappings":"kNAuBA,OACA,OACA,O,khCAGMA,CAAAA,CAAS,CAAG,CACdC,cAAc,CAAE,0CADF,C,QAOE,QAAPC,CAAAA,IAAO,EAAM,CACtBC,QAAQ,CAACC,gBAAT,CAA0B,OAA1B,CAAmC,SAAAC,CAAK,CAAI,CACxC,GAAMC,CAAAA,CAAc,CAAGD,CAAK,CAACE,MAAN,CAAaC,OAAb,CAAqBR,CAAS,CAACC,cAA/B,CAAvB,CACA,GAAuB,IAAnB,GAAAK,CAAJ,CAA6B,CACzB,MACH,CAEDD,CAAK,CAACI,cAAN,GAOA,kBALwB,CACpB,CAACC,GAAG,CAAE,eAAN,CAAuBC,SAAS,CAAE,kBAAlC,CADoB,CAEpB,CAACD,GAAG,CAAE,2BAAN,CAAmCC,SAAS,CAAE,kBAA9C,CAFoB,CAKxB,EAA4BC,IAA5B,CAAiC,WAAoC,cAAlCC,CAAkC,MAAnBC,CAAmB,MACjE,MAAOC,WAAaC,OAAb,CAAqBH,CAArB,CAAoCC,CAApC,CAAmDD,CAAnD,CAAkE,IAAlE,CAAwE,UAAM,IAC3EI,CAAAA,CAAc,CAAG,GAAIC,UAAJ,CAAY,gCAAZ,CAD0D,CAE3EC,CAAO,CAAG,CACZC,UAAU,CAAE,sCADA,CAEZC,IAAI,CAAE,CAACC,SAAS,CAAEhB,CAAc,CAACiB,OAAf,CAAuBD,SAAnC,CAFM,CAFiE,CAOjFE,UAAKC,IAAL,CAAU,CAACN,CAAD,CAAV,EAAqB,CAArB,EAAwBP,IAAxB,CAA6B,SAAAc,CAAQ,CAAI,CACrC,GAAIA,CAAQ,CAACC,MAAb,CAAqB,CACjBC,MAAM,CAACC,QAAP,CAAgBC,MAAhB,EACH,CAFD,IAEO,CACHf,UAAagB,eAAb,CAA6B,CACzBC,IAAI,CAAE,OADmB,CAEzBC,OAAO,CAAEP,CAAQ,CAACQ,QAAT,CAAkB,CAAlB,EAAqBD,OAFL,CAA7B,CAIH,CACD,MAAOhB,CAAAA,CAAc,CAACkB,OAAf,EACV,CAVD,EAUGC,KAVH,CAUSrB,UAAasB,SAVtB,CAWH,CAlBM,CAmBV,CApBD,EAoBGD,KApBH,EAqBH,CAlCD,CAmCH,C","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * AMD module to enable users to manage their own data requests.\n *\n * @module tool_dataprivacy/myrequestactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {get_strings as getStrings} from 'core/str';\n\nconst SELECTORS = {\n CANCEL_REQUEST: '[data-action=\"cancel\"][data-requestid]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n document.addEventListener('click', event => {\n const triggerElement = event.target.closest(SELECTORS.CANCEL_REQUEST);\n if (triggerElement === null) {\n return;\n }\n\n event.preventDefault();\n\n const requiredStrings = [\n {key: 'cancelrequest', component: 'tool_dataprivacy'},\n {key: 'cancelrequestconfirmation', component: 'tool_dataprivacy'},\n ];\n\n getStrings(requiredStrings).then(([cancelRequest, cancelConfirm]) => {\n return Notification.confirm(cancelRequest, cancelConfirm, cancelRequest, null, () => {\n const pendingPromise = new Pending('tool/dataprivacy:cancelRequest');\n const request = {\n methodname: 'tool_dataprivacy_cancel_data_request',\n args: {requestid: triggerElement.dataset.requestid}\n };\n\n Ajax.call([request])[0].then(response => {\n if (response.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n type: 'error',\n message: response.warnings[0].message\n });\n }\n return pendingPromise.resolve();\n }).catch(Notification.exception);\n });\n }).catch();\n });\n};\n"],"file":"myrequestactions.min.js"}
{"version":3,"file":"myrequestactions.min.js","sources":["../src/myrequestactions.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * AMD module to enable users to manage their own data requests.\n *\n * @module tool_dataprivacy/myrequestactions\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {get_strings as getStrings} from 'core/str';\n\nconst SELECTORS = {\n CANCEL_REQUEST: '[data-action=\"cancel\"][data-requestid]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n document.addEventListener('click', event => {\n const triggerElement = event.target.closest(SELECTORS.CANCEL_REQUEST);\n if (triggerElement === null) {\n return;\n }\n\n event.preventDefault();\n\n const requiredStrings = [\n {key: 'cancelrequest', component: 'tool_dataprivacy'},\n {key: 'cancelrequestconfirmation', component: 'tool_dataprivacy'},\n ];\n\n getStrings(requiredStrings).then(([cancelRequest, cancelConfirm]) => {\n return Notification.confirm(cancelRequest, cancelConfirm, cancelRequest, null, () => {\n const pendingPromise = new Pending('tool/dataprivacy:cancelRequest');\n const request = {\n methodname: 'tool_dataprivacy_cancel_data_request',\n args: {requestid: triggerElement.dataset.requestid}\n };\n\n Ajax.call([request])[0].then(response => {\n if (response.result) {\n window.location.reload();\n } else {\n Notification.addNotification({\n type: 'error',\n message: response.warnings[0].message\n });\n }\n return pendingPromise.resolve();\n }).catch(Notification.exception);\n });\n }).catch();\n });\n};\n"],"names":["SELECTORS","document","addEventListener","event","triggerElement","target","closest","preventDefault","key","component","then","cancelRequest","cancelConfirm","Notification","confirm","pendingPromise","Pending","request","methodname","args","requestid","dataset","call","response","result","window","location","reload","addNotification","type","message","warnings","resolve","catch","exception"],"mappings":"ikDA4BMA,yBACc,uDAMA,WAChBC,SAASC,iBAAiB,SAAS,SAAAC,WACzBC,eAAiBD,MAAME,OAAOC,QAAQN,6BACrB,OAAnBI,gBAIJD,MAAMI,sCAEkB,CACpB,CAACC,IAAK,gBAAiBC,UAAW,oBAClC,CAACD,IAAK,4BAA6BC,UAAW,sBAGtBC,MAAK,gDAAEC,uBAAeC,8BACvCC,sBAAaC,QAAQH,cAAeC,cAAeD,cAAe,MAAM,eACrEI,eAAiB,IAAIC,iBAAQ,kCAC7BC,QAAU,CACZC,WAAY,uCACZC,KAAM,CAACC,UAAWhB,eAAeiB,QAAQD,0BAGxCE,KAAK,CAACL,UAAU,GAAGP,MAAK,SAAAa,iBACrBA,SAASC,OACTC,OAAOC,SAASC,+BAEHC,gBAAgB,CACzBC,KAAM,QACNC,QAASP,SAASQ,SAAS,GAAGD,UAG/Bf,eAAeiB,aACvBC,MAAMpB,sBAAaqB,iBAE3BD"}
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/purposesactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],function(a,b,c,d,e,f){var g={DELETE:"[data-action=\"deletepurpose\"]"},h=function(){this.registerEvents()};h.prototype.registerEvents=function(){a(g.DELETE).click(function(g){g.preventDefault();var h=a(this).data("id"),i=a(this).data("name");d.get_strings([{key:"deletepurpose",component:"tool_dataprivacy"},{key:"deletepurposetext",component:"tool_dataprivacy",param:i},{key:"delete"}]).then(function(d){var g=d[0],i=d[1],j=d[2];return e.create({title:g,body:i,type:e.types.SAVE_CANCEL}).then(function(d){d.setSaveButtonText(j);d.getRoot().on(f.save,function(){b.call([{methodname:"tool_dataprivacy_delete_purpose",args:{id:h}}])[0].done(function(b){if(b.result){a("tr[data-purposeid=\""+h+"\"]").remove()}else{c.addNotification({message:b.warnings[0].message,type:"error"})}}).fail(c.exception)});d.getRoot().on(f.hidden,function(){d.destroy()});return d})}).done(function(a){a.show()}).fail(c.exception)})};return{init:function init(){return new h}}});
//# sourceMappingURL=purposesactions.min.js.map
/**
* AMD module for purposes actions.
*
* @module tool_dataprivacy/purposesactions
* @copyright 2018 David Monllao
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/purposesactions",["jquery","core/ajax","core/notification","core/str","core/modal_factory","core/modal_events"],(function($,Ajax,Notification,Str,ModalFactory,ModalEvents){var ACTIONS_DELETE='[data-action="deletepurpose"]',PurposesActions=function(){this.registerEvents()};return PurposesActions.prototype.registerEvents=function(){$(ACTIONS_DELETE).click((function(e){e.preventDefault();var id=$(this).data("id"),stringkeys=[{key:"deletepurpose",component:"tool_dataprivacy"},{key:"deletepurposetext",component:"tool_dataprivacy",param:$(this).data("name")},{key:"delete"}];Str.get_strings(stringkeys).then((function(langStrings){var title=langStrings[0],confirmMessage=langStrings[1],buttonText=langStrings[2];return ModalFactory.create({title:title,body:confirmMessage,type:ModalFactory.types.SAVE_CANCEL}).then((function(modal){return modal.setSaveButtonText(buttonText),modal.getRoot().on(ModalEvents.save,(function(){var request={methodname:"tool_dataprivacy_delete_purpose",args:{id:id}};Ajax.call([request])[0].done((function(data){data.result?$('tr[data-purposeid="'+id+'"]').remove():Notification.addNotification({message:data.warnings[0].message,type:"error"})})).fail(Notification.exception)})),modal.getRoot().on(ModalEvents.hidden,(function(){modal.destroy()})),modal}))})).done((function(modal){modal.show()})).fail(Notification.exception)}))},{init:function(){return new PurposesActions}}}));
//# sourceMappingURL=purposesactions.min.js.map
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_dataprivacy/request_filter",["jquery","core/form-autocomplete","core/str","core/notification"],function(a,b,c,d){var e={REQUEST_FILTERS:"#request-filters"},f=function init(){c.get_strings([{key:"filter",component:"moodle"},{key:"nofiltersapplied",component:"moodle"}]).then(function(a){var c=a[0],d=a[1];return b.enhance(e.REQUEST_FILTERS,!1,"",c,!1,!0,d,!0)}).fail(d.exception);var f=a(e.REQUEST_FILTERS).val();a(e.REQUEST_FILTERS).on("change",function(){var b=a(this).val();if(f.join(",")!==b.join(",")){if(0===b.length){a("#filters-cleared").val(1)}a(this.form).submit()}})};return{init:function init(){f()}}});
//# sourceMappingURL=request_filter.min.js.map
/**
* JS module for the data requests filter.
*
* @module tool_dataprivacy/request_filter
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_dataprivacy/request_filter",["jquery","core/form-autocomplete","core/str","core/notification"],(function($,Autocomplete,Str,Notification){var SELECTORS_REQUEST_FILTERS="#request-filters";return{init:function(){!function(){Str.get_strings([{key:"filter",component:"moodle"},{key:"nofiltersapplied",component:"moodle"}]).then((function(langstrings){var placeholder=langstrings[0],noSelectionString=langstrings[1];return Autocomplete.enhance(SELECTORS_REQUEST_FILTERS,!1,"",placeholder,!1,!0,noSelectionString,!0)})).fail(Notification.exception);var last=$(SELECTORS_REQUEST_FILTERS).val();$(SELECTORS_REQUEST_FILTERS).on("change",(function(){var current=$(this).val();last.join(",")!==current.join(",")&&(0===current.length&&$("#filters-cleared").val(1),$(this.form).submit())}))}()}}}));
//# sourceMappingURL=request_filter.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/request_filter.js"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","REQUEST_FILTERS","init","get_strings","key","component","then","langstrings","placeholder","noSelectionString","enhance","fail","exception","last","val","on","current","join","length","form","submit"],"mappings":"AAsBAA,OAAM,mCAAC,CAAC,QAAD,CAAW,wBAAX,CAAqC,UAArC,CAAiD,mBAAjD,CAAD,CAAwE,SAASC,CAAT,CAAYC,CAAZ,CAA0BC,CAA1B,CAA+BC,CAA/B,CAA6C,IAQnHC,CAAAA,CAAS,CAAG,CACZC,eAAe,CAAE,kBADL,CARuG,CAkBnHC,CAAI,CAAG,QAAPA,CAAAA,IAAO,EAAW,CAYlBJ,CAAG,CAACK,WAAJ,CAXiB,CACb,CACIC,GAAG,CAAE,QADT,CAEIC,SAAS,CAAE,QAFf,CADa,CAKb,CACID,GAAG,CAAE,kBADT,CAEIC,SAAS,CAAE,QAFf,CALa,CAWjB,EAA4BC,IAA5B,CAAiC,SAASC,CAAT,CAAsB,IAC/CC,CAAAA,CAAW,CAAGD,CAAW,CAAC,CAAD,CADsB,CAE/CE,CAAiB,CAAGF,CAAW,CAAC,CAAD,CAFgB,CAGnD,MAAOV,CAAAA,CAAY,CAACa,OAAb,CAAqBV,CAAS,CAACC,eAA/B,IAAuD,EAAvD,CAA2DO,CAA3D,OAAqFC,CAArF,IACV,CAJD,EAIGE,IAJH,CAIQZ,CAAY,CAACa,SAJrB,EAMA,GAAIC,CAAAA,CAAI,CAAGjB,CAAC,CAACI,CAAS,CAACC,eAAX,CAAD,CAA6Ba,GAA7B,EAAX,CACAlB,CAAC,CAACI,CAAS,CAACC,eAAX,CAAD,CAA6Bc,EAA7B,CAAgC,QAAhC,CAA0C,UAAW,CACjD,GAAIC,CAAAA,CAAO,CAAGpB,CAAC,CAAC,IAAD,CAAD,CAAQkB,GAAR,EAAd,CAEA,GAAID,CAAI,CAACI,IAAL,CAAU,GAAV,IAAmBD,CAAO,CAACC,IAAR,CAAa,GAAb,CAAvB,CAA0C,CAEtC,GAAuB,CAAnB,GAAAD,CAAO,CAACE,MAAZ,CAA0B,CACtBtB,CAAC,CAAC,kBAAD,CAAD,CAAsBkB,GAAtB,CAA0B,CAA1B,CACH,CACDlB,CAAC,CAAC,KAAKuB,IAAN,CAAD,CAAaC,MAAb,EACH,CACJ,CAVD,CAWH,CAhDsH,CAkDvH,MAAmD,CAM/ClB,IAAI,CAAE,eAAW,CACbA,CAAI,EACP,CAR8C,CAUtD,CA5DK,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * JS module for the data requests filter.\n *\n * @module tool_dataprivacy/request_filter\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'], function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{REQUEST_FILTERS: string}}\n */\n var SELECTORS = {\n REQUEST_FILTERS: '#request-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [\n {\n key: 'filter',\n component: 'moodle'\n },\n {\n key: 'nofiltersapplied',\n component: 'moodle'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n return Autocomplete.enhance(SELECTORS.REQUEST_FILTERS, false, '', placeholder, false, true, noSelectionString, true);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.REQUEST_FILTERS).val();\n $(SELECTORS.REQUEST_FILTERS).on('change', function() {\n var current = $(this).val();\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') !== current.join(',')) {\n // If we're submitting without filters, set the hidden input 'filters-cleared' to 1.\n if (current.length === 0) {\n $('#filters-cleared').val(1);\n }\n $(this.form).submit();\n }\n });\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n }\n };\n});\n"],"file":"request_filter.min.js"}
{"version":3,"file":"request_filter.min.js","sources":["../src/request_filter.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * JS module for the data requests filter.\n *\n * @module tool_dataprivacy/request_filter\n * @copyright 2018 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/form-autocomplete', 'core/str', 'core/notification'], function($, Autocomplete, Str, Notification) {\n\n /**\n * Selectors.\n *\n * @access private\n * @type {{REQUEST_FILTERS: string}}\n */\n var SELECTORS = {\n REQUEST_FILTERS: '#request-filters'\n };\n\n /**\n * Init function.\n *\n * @method init\n * @private\n */\n var init = function() {\n var stringkeys = [\n {\n key: 'filter',\n component: 'moodle'\n },\n {\n key: 'nofiltersapplied',\n component: 'moodle'\n }\n ];\n\n Str.get_strings(stringkeys).then(function(langstrings) {\n var placeholder = langstrings[0];\n var noSelectionString = langstrings[1];\n return Autocomplete.enhance(SELECTORS.REQUEST_FILTERS, false, '', placeholder, false, true, noSelectionString, true);\n }).fail(Notification.exception);\n\n var last = $(SELECTORS.REQUEST_FILTERS).val();\n $(SELECTORS.REQUEST_FILTERS).on('change', function() {\n var current = $(this).val();\n // Prevent form from submitting unnecessarily, eg. on blur when no filter is selected.\n if (last.join(',') !== current.join(',')) {\n // If we're submitting without filters, set the hidden input 'filters-cleared' to 1.\n if (current.length === 0) {\n $('#filters-cleared').val(1);\n }\n $(this.form).submit();\n }\n });\n };\n\n return /** @alias module:core/form-autocomplete */ {\n /**\n * Initialise the unified user filter.\n *\n * @method init\n */\n init: function() {\n init();\n }\n };\n});\n"],"names":["define","$","Autocomplete","Str","Notification","SELECTORS","init","get_strings","key","component","then","langstrings","placeholder","noSelectionString","enhance","fail","exception","last","val","on","current","this","join","length","form","submit"],"mappings":";;;;;;;AAsBAA,yCAAO,CAAC,SAAU,yBAA0B,WAAY,sBAAsB,SAASC,EAAGC,aAAcC,IAAKC,kBAQrGC,0BACiB,yBAyC8B,CAM/CC,KAAM,YAtCC,WAYPH,IAAII,YAXa,CACb,CACIC,IAAK,SACLC,UAAW,UAEf,CACID,IAAK,mBACLC,UAAW,YAISC,MAAK,SAASC,iBAClCC,YAAcD,YAAY,GAC1BE,kBAAoBF,YAAY,UAC7BT,aAAaY,QAAQT,2BAA2B,EAAO,GAAIO,aAAa,GAAO,EAAMC,mBAAmB,MAChHE,KAAKX,aAAaY,eAEjBC,KAAOhB,EAAEI,2BAA2Ba,MACxCjB,EAAEI,2BAA2Bc,GAAG,UAAU,eAClCC,QAAUnB,EAAEoB,MAAMH,MAElBD,KAAKK,KAAK,OAASF,QAAQE,KAAK,OAET,IAAnBF,QAAQG,QACRtB,EAAE,oBAAoBiB,IAAI,GAE9BjB,EAAEoB,KAAKG,MAAMC,aAYjBnB"}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -136,4 +136,4 @@
</INDEXES>
</TABLE>
</TABLES>
</XMLDB>
</XMLDB>
@@ -56,7 +56,7 @@
<head>
<meta charset="UTF-8">
<style>
table, th, td {
table.dataprivacy_email_table, .dataprivacy_email_table th, .dataprivacy_email_table td {
border: 1px solid black;
padding: 0.5em;
}
@@ -67,7 +67,7 @@
<div>
<p>{{#str}}emailsalutation, tool_dataprivacy, {{dponame}}{{/str}}</p>
<p>{{#str}}requestemailintro, tool_dataprivacy{{/str}}</p>
<table>
<table class="dataprivacy_email_table">
<tr>
<th scope="row">
{{#str}}requesttype, tool_dataprivacy{{/str}}
+26 -41
View File
@@ -14,29 +14,14 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* API tests.
*
* @package tool_dataprivacy
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_dataprivacy;
use core\invalid_persistent_exception;
use core\task\manager;
use tool_dataprivacy\context_instance;
use tool_dataprivacy\api;
use tool_dataprivacy\data_registry;
use tool_dataprivacy\expired_context;
use tool_dataprivacy\data_request;
use tool_dataprivacy\purpose;
use tool_dataprivacy\category;
use testing_data_generator;
use tool_dataprivacy\local\helper;
use tool_dataprivacy\task\process_data_request_task;
defined('MOODLE_INTERNAL') || die();
global $CFG;
/**
* API tests.
*
@@ -44,7 +29,7 @@ global $CFG;
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_dataprivacy_api_testcase extends advanced_testcase {
class api_test extends \advanced_testcase {
/**
* Ensure that the check_can_manage_data_registry function fails cap testing when a user without capabilities is
@@ -68,7 +53,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
api::check_can_manage_data_registry();
}
@@ -82,7 +67,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
api::check_can_manage_data_registry(\context_system::instance()->id);
}
@@ -96,7 +81,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
api::check_can_manage_data_registry(\context_user::instance($user->id)->id);
}
@@ -174,7 +159,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$u1 = $generator->create_user();
$u2 = $generator->create_user();
$context = context_system::instance();
$context = \context_system::instance();
// Give the manager role with the capability to manage data requests.
$managerroleid = $DB->get_field('role', 'id', array('shortname' => 'manager'));
@@ -215,7 +200,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
// Confirm that the returned list is empty.
$this->assertEmpty($roleids);
$context = context_system::instance();
$context = \context_system::instance();
// Give the manager role with the capability to manage data requests.
assign_capability('tool/dataprivacy:managedatarequests', CAP_ALLOW, $managerroleid, $context->id, true);
@@ -254,7 +239,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$s1 = $generator->create_user();
$u1 = $generator->create_user();
$context = context_system::instance();
$context = \context_system::instance();
// Manager role.
$managerroleid = $DB->get_field('role', 'id', array('shortname' => 'manager'));
@@ -304,7 +289,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
// Login as a user without DPO role.
$this->setUser($teacher);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
api::approve_data_request($requestid);
}
@@ -327,8 +312,8 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$this->assertEquals(api::DATAREQUEST_STATUS_REJECTED, $request->get('status'));
// Confirm they weren't deleted.
$user = core_user::get_user($request->get('userid'));
core_user::require_active_user($user);
$user = \core_user::get_user($request->get('userid'));
\core_user::require_active_user($user);
}
/**
@@ -366,7 +351,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$nondpocapable = $generator->create_user();
$nondpoincapable = $generator->create_user();
$context = context_system::instance();
$context = \context_system::instance();
// Manager role.
$managerroleid = $DB->get_field('role', 'id', array('shortname' => 'manager'));
@@ -666,8 +651,8 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$comment = 'sample comment';
// Get the teacher role pretend it's the parent roles ;).
$systemcontext = context_system::instance();
$usercontext = context_user::instance($user->id);
$systemcontext = \context_system::instance();
$usercontext = \context_user::instance($user->id);
$parentroleid = $DB->get_field('role', 'id', array('shortname' => 'teacher'));
// Give the manager role with the capability to manage data requests.
assign_capability('tool/dataprivacy:makedatarequestsforchildren', CAP_ALLOW, $parentroleid, $systemcontext->id, true);
@@ -923,7 +908,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$dpo = $generator->create_user();
$nondpo = $generator->create_user();
$context = context_system::instance();
$context = \context_system::instance();
// Manager role.
$managerroleid = $DB->get_field('role', 'id', array('shortname' => 'manager'));
@@ -1222,7 +1207,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
*/
public function test_set_contextlevel_invalid_contextlevels($contextlevel) {
$this->expectException(coding_exception::class);
$this->expectException(\coding_exception::class);
api::set_contextlevel((object) [
'contextlevel' => $contextlevel,
]);
@@ -1291,7 +1276,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
'categoryid' => $category1->get('id'),
]);
$this->expectException(coding_exception::class);
$this->expectException(\coding_exception::class);
api::get_effective_contextlevel_purpose($contextlevel);
}
@@ -1908,14 +1893,14 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$assign = $generator->create_module('assign', ['course' => $course->id]);
$forum = $generator->create_module('forum', ['course' => $course->id]);
$coursecatcontext = context_coursecat::instance($coursecat->id);
$coursecontext = context_course::instance($course->id);
$blockcontext = context_block::instance($block->id);
$coursecatcontext = \context_coursecat::instance($coursecat->id);
$coursecontext = \context_course::instance($course->id);
$blockcontext = \context_block::instance($block->id);
list($course, $assigncm) = get_course_and_cm_from_instance($assign->id, 'assign');
list($course, $forumcm) = get_course_and_cm_from_instance($forum->id, 'forum');
$assigncontext = context_module::instance($assigncm->id);
$forumcontext = context_module::instance($forumcm->id);
$assigncontext = \context_module::instance($assigncm->id);
$forumcontext = \context_module::instance($forumcm->id);
// Generate purposes and categories.
$category1 = api::create_category((object)['name' => 'Test category 1']);
@@ -2199,8 +2184,8 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$this->resetAfterTest();
$userid = $this->getDataGenerator()->create_user()->id;
$roleid = $this->getDataGenerator()->create_role();
assign_capability('tool/dataprivacy:requestdelete', CAP_PROHIBIT, $roleid, context_user::instance($userid));
role_assign($roleid, $userid, context_user::instance($userid));
assign_capability('tool/dataprivacy:requestdelete', CAP_PROHIBIT, $roleid, \context_user::instance($userid));
role_assign($roleid, $userid, \context_user::instance($userid));
$this->setUser($userid);
$this->assertFalse(api::can_create_data_deletion_request_for_self());
}
@@ -2269,7 +2254,7 @@ class tool_dataprivacy_api_testcase extends advanced_testcase {
$this->resetAfterTest();
$userid = $this->getDataGenerator()->create_user()->id;
$roleid = $this->getDataGenerator()->create_role();
$contextsystem = context_system::instance();
$contextsystem = \context_system::instance();
assign_capability('tool/dataprivacy:requestdeleteforotheruser', CAP_ALLOW, $roleid, $contextsystem);
role_assign($roleid, $userid, $contextsystem);
$this->setUser($userid);
@@ -22,15 +22,18 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_dataprivacy\external;
use externallib_advanced_testcase;
use tool_dataprivacy\api;
use tool_dataprivacy\context_instance;
use tool_dataprivacy\external;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
use tool_dataprivacy\api;
use tool_dataprivacy\context_instance;
use tool_dataprivacy\external;
/**
* External testcase.
*
@@ -38,7 +41,7 @@ use tool_dataprivacy\external;
* @copyright 2018 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
class external_test extends externallib_advanced_testcase {
/**
* Test for external::approve_data_request() with the user not logged in.
@@ -46,7 +49,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_approve_data_request_not_logged_in() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -57,7 +60,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Log out the user and set force login to true.
$this->setUser();
$this->expectException(require_login_exception::class);
$this->expectException(\require_login_exception::class);
external::approve_data_request($datarequest->get('id'));
}
@@ -67,7 +70,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_approve_data_request_not_dpo() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -77,7 +80,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Login as the requester.
$this->setUser($requester);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
external::approve_data_request($datarequest->get('id'));
}
@@ -87,7 +90,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_approve_data_request_not_waiting_for_approval() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -98,7 +101,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Admin as DPO. (The default when no one's assigned as a DPO in the site).
$this->setAdminUser();
$this->expectException(moodle_exception::class);
$this->expectException(\moodle_exception::class);
external::approve_data_request($datarequest->get('id'));
}
@@ -108,7 +111,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_approve_data_request() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -120,7 +123,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$this->setAdminUser();
api::update_request_status($datarequest->get('id'), api::DATAREQUEST_STATUS_AWAITING_APPROVAL);
$result = external::approve_data_request($datarequest->get('id'));
$return = (object) external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -136,7 +139,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$result = external::approve_data_request(1);
$return = (object) external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$this->assertFalse($return->result);
$this->assertCount(1, $return->warnings);
$warning = reset($return->warnings);
@@ -149,7 +152,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_cancel_data_request_other_user() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$otheruser = $generator->create_user();
$comment = 'sample comment';
@@ -162,7 +165,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$this->setUser($otheruser);
$result = external::cancel_data_request($datarequest->get('id'));
$return = (object) external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$this->assertFalse($return->result);
$this->assertCount(1, $return->warnings);
$warning = reset($return->warnings);
@@ -175,7 +178,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_cancel_data_request_other_user_as_requester() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$otheruser = $generator->create_user();
$comment = 'sample comment';
@@ -191,7 +194,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$datarequest = api::create_data_request($otheruser->id, api::DATAREQUEST_TYPE_EXPORT, $comment);
$result = external::cancel_data_request($datarequest->get('id'));
$return = (object) external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -202,7 +205,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_cancel_data_request_requester_lost_permissions() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$otheruser = $generator->create_user();
$comment = 'sample comment';
@@ -220,7 +223,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
role_unassign($parentrole, $requester->id, \context_user::instance($otheruser->id)->id);
// This user can no longer make the request.
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
$result = external::cancel_data_request($datarequest->get('id'));
}
@@ -231,7 +234,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_cancel_data_request_other_user_as_child() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$otheruser = $generator->create_user();
$comment = 'sample comment';
@@ -247,7 +250,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$datarequest = api::create_data_request($otheruser->id, api::DATAREQUEST_TYPE_EXPORT, $comment);
$result = external::cancel_data_request($datarequest->get('id'));
$return = (object) external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -258,7 +261,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_cancel_data_request() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -270,7 +273,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$this->setUser($requester);
$result = external::cancel_data_request($datarequest->get('id'));
$return = (object) external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::approve_data_request_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -281,13 +284,13 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_contact_dpo() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$user = $generator->create_user();
$this->setUser($user);
$message = 'Hello world!';
$result = external::contact_dpo($message);
$return = (object) external_api::clean_returnvalue(external::contact_dpo_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::contact_dpo_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -298,7 +301,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_contact_dpo_with_nasty_input() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$user = $generator->create_user();
$this->setUser($user);
@@ -312,7 +315,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_deny_data_request_not_logged_in() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -322,7 +325,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Log out.
$this->setUser();
$this->expectException(require_login_exception::class);
$this->expectException(\require_login_exception::class);
external::deny_data_request($datarequest->get('id'));
}
@@ -332,7 +335,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_deny_data_request_not_dpo() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -341,7 +344,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Login as the requester.
$this->setUser($requester);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
external::deny_data_request($datarequest->get('id'));
}
@@ -351,7 +354,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_deny_data_request_not_waiting_for_approval() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -361,7 +364,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Admin as DPO. (The default when no one's assigned as a DPO in the site).
$this->setAdminUser();
$this->expectException(moodle_exception::class);
$this->expectException(\moodle_exception::class);
external::deny_data_request($datarequest->get('id'));
}
@@ -371,7 +374,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_deny_data_request() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -382,7 +385,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$this->setAdminUser();
api::update_request_status($datarequest->get('id'), api::DATAREQUEST_STATUS_AWAITING_APPROVAL);
$result = external::approve_data_request($datarequest->get('id'));
$return = (object) external_api::clean_returnvalue(external::deny_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::deny_data_request_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -397,7 +400,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$this->setAdminUser();
$result = external::deny_data_request(1);
$return = (object) external_api::clean_returnvalue(external::deny_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::deny_data_request_returns(), $result);
$this->assertFalse($return->result);
$this->assertCount(1, $return->warnings);
$warning = reset($return->warnings);
@@ -410,7 +413,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_get_data_request_not_logged_in() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -418,7 +421,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$datarequest = api::create_data_request($requester->id, api::DATAREQUEST_TYPE_EXPORT, $comment);
$this->setUser();
$this->expectException(require_login_exception::class);
$this->expectException(\require_login_exception::class);
external::get_data_request($datarequest->get('id'));
}
@@ -428,7 +431,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_get_data_request_not_dpo() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$otheruser = $generator->create_user();
$comment = 'sample comment';
@@ -438,7 +441,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Login as the otheruser.
$this->setUser($otheruser);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
external::get_data_request($datarequest->get('id'));
}
@@ -448,7 +451,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_get_data_request() {
$this->resetAfterTest();
$generator = new testing_data_generator();
$generator = new \testing_data_generator();
$requester = $generator->create_user();
$comment = 'sample comment';
@@ -459,7 +462,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$this->setAdminUser();
$result = external::get_data_request($datarequest->get('id'));
$return = (object) external_api::clean_returnvalue(external::get_data_request_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::get_data_request_returns(), $result);
$this->assertEquals(api::DATAREQUEST_TYPE_EXPORT, $return->result['type']);
$this->assertEquals('sample comment', $return->result['comments']);
$this->assertEquals($requester->id, $return->result['userid']);
@@ -475,7 +478,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Admin as DPO. (The default when no one's assigned as a DPO in the site).
$this->setAdminUser();
$this->expectException(dml_missing_record_exception::class);
$this->expectException(\dml_missing_record_exception::class);
external::get_data_request(1);
}
@@ -489,7 +492,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$generator = $this->getDataGenerator();
$user = $generator->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
external::set_context_defaults(CONTEXT_COURSECAT, context_instance::INHERIT, context_instance::INHERIT, '', false);
}
@@ -514,7 +517,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$course = $generator->create_course(['category' => $coursecat->id]);
$assign = $generator->create_module('assign', ['course' => $course->id]);
list($course, $assigncm) = get_course_and_cm_from_instance($assign->id, 'assign');
$assigncontext = context_module::instance($assigncm->id);
$assigncontext = \context_module::instance($assigncm->id);
// Generate purpose and category.
$category1 = api::create_category((object)['name' => 'Test category 1']);
@@ -539,7 +542,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$result = external::set_context_defaults(CONTEXT_MODULE, $categoryid, $purposeid, $modulename, $override);
// Extract the result.
$return = external_api::clean_returnvalue(external::set_context_defaults_returns(), $result);
$return = \external_api::clean_returnvalue(external::set_context_defaults_returns(), $result);
$this->assertTrue($return['result']);
// Check the assignment context instance.
@@ -568,7 +571,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$user = $this->getDataGenerator()->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
external::get_category_options(true, true);
}
@@ -623,7 +626,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$result = external::get_category_options($includeinherit, $includenotset);
// Extract the options.
$return = (object) external_api::clean_returnvalue(external::get_category_options_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::get_category_options_returns(), $result);
$options = $return->options;
// Make sure everything checks out.
@@ -642,7 +645,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$generator = $this->getDataGenerator();
$user = $generator->create_user();
$this->setUser($user);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
external::get_category_options(true, true);
}
@@ -687,7 +690,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$result = external::get_purpose_options($includeinherit, $includenotset);
// Extract the options.
$return = (object) external_api::clean_returnvalue(external::get_purpose_options_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::get_purpose_options_returns(), $result);
$options = $return->options;
// Make sure everything checks out.
@@ -746,7 +749,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$result = external::get_activity_options($nodefaults);
// Extract the options.
$return = (object) external_api::clean_returnvalue(external::get_activity_options_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::get_activity_options_returns(), $result);
$options = $return->options;
// Make sure the options list is not empty.
@@ -789,7 +792,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
api::update_request_status($requestid2, api::DATAREQUEST_STATUS_AWAITING_APPROVAL);
$result = external::bulk_approve_data_requests([$requestid1, $requestid2]);
$return = (object) external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -804,7 +807,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$result = external::bulk_approve_data_requests([42]);
$return = (object) external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$this->assertFalse($return->result);
$this->assertCount(1, $return->warnings);
$warning = reset($return->warnings);
@@ -837,7 +840,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$uut = $this->getDataGenerator()->create_user();
$this->setUser($uut);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
$result = external::bulk_approve_data_requests([$requestid1, $requestid2]);
}
@@ -865,7 +868,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Deny the requests.
$this->setUser($requester1);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
$result = external::bulk_approve_data_requests([$requestid1]);
}
@@ -892,7 +895,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
api::update_request_status($requestid2, api::DATAREQUEST_STATUS_AWAITING_APPROVAL);
$result = external::bulk_deny_data_requests([$requestid1, $requestid2]);
$return = (object) external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$this->assertTrue($return->result);
$this->assertEmpty($return->warnings);
}
@@ -905,7 +908,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$this->setAdminUser();
$result = external::bulk_deny_data_requests([42]);
$return = (object) external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$return = (object) \external_api::clean_returnvalue(external::bulk_approve_data_requests_returns(), $result);
$this->assertFalse($return->result);
$this->assertCount(1, $return->warnings);
@@ -939,7 +942,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$uut = $this->getDataGenerator()->create_user();
$this->setUser($uut);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
$result = external::bulk_deny_data_requests([$requestid1, $requestid2]);
}
@@ -967,7 +970,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
// Deny the requests.
$this->setUser($requester1);
$this->expectException(required_capability_exception::class);
$this->expectException(\required_capability_exception::class);
$result = external::bulk_deny_data_requests([$requestid1]);
}
@@ -983,7 +986,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
*/
public function test_get_users_using_using_non_identity() {
$this->resetAfterTest();
$context = context_system::instance();
$context = \context_system::instance();
$requester = $this->getDataGenerator()->create_user();
$role = $this->getDataGenerator()->create_role();
role_assign($role, $requester->id, $context);
@@ -1023,7 +1026,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
$CFG->showuseridentity = 'institution';
// Create requester user and assign correct capability.
$context = context_system::instance();
$context = \context_system::instance();
$requester = $this->getDataGenerator()->create_user();
$role = $this->getDataGenerator()->create_role();
role_assign($role, $requester->id, $context);
@@ -1051,7 +1054,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
public function test_get_users_using_field_not_in_identity() {
$this->resetAfterTest();
$context = context_system::instance();
$context = \context_system::instance();
$requester = $this->getDataGenerator()->create_user();
$role = $this->getDataGenerator()->create_role();
role_assign($role, $requester->id, $context);
@@ -1081,7 +1084,7 @@ class tool_dataprivacy_external_testcase extends externallib_advanced_testcase {
global $CFG;
$this->resetAfterTest();
$CFG->showuseridentity = 'institution';
$context = context_system::instance();
$context = \context_system::instance();
$requester = $this->getDataGenerator()->create_user();
$role = $this->getDataGenerator()->create_role();
role_assign($role, $requester->id, $context);
@@ -21,6 +21,7 @@
* @copyright 2020 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_dataprivacy\privacy;
defined('MOODLE_INTERNAL') || die();
@@ -38,7 +39,7 @@ use tool_dataprivacy\privacy\provider;
* @copyright 2020 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_dataprivacy_privacy_provider_testcase extends provider_testcase {
class provider_test extends provider_testcase {
/**
* Test provider get_contexts_for_userid method
@@ -49,7 +50,7 @@ class tool_dataprivacy_privacy_provider_testcase extends provider_testcase {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$context = context_user::instance($user->id);
$context = \context_user::instance($user->id);
// Returned context list should contain a single item.
$contextlist = $this->get_contexts_for_userid($user->id, 'tool_dataprivacy');
@@ -68,7 +69,7 @@ class tool_dataprivacy_privacy_provider_testcase extends provider_testcase {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$context = context_user::instance($user->id);
$context = \context_user::instance($user->id);
$userlist = new userlist($context, 'tool_dataprivacy');
provider::get_users_in_context($userlist);
@@ -82,7 +83,7 @@ class tool_dataprivacy_privacy_provider_testcase extends provider_testcase {
* @return void
*/
public function test_get_users_in_context_non_user_context() {
$context = context_system::instance();
$context = \context_system::instance();
$userlist = new userlist($context, 'tool_dataprivacy');
provider::get_users_in_context($userlist);
@@ -99,7 +100,7 @@ class tool_dataprivacy_privacy_provider_testcase extends provider_testcase {
$this->resetAfterTest();
$user = $this->getDataGenerator()->create_user();
$context = context_user::instance($user->id);
$context = \context_user::instance($user->id);
$this->setUser($user);
@@ -170,7 +171,7 @@ class tool_dataprivacy_privacy_provider_testcase extends provider_testcase {
provider::export_user_preferences($user->id);
/** @var \core_privacy\tests\request\content_writer $writer */
$writer = writer::with_context(context_system::instance());
$writer = writer::with_context(\context_system::instance());
$this->assertTrue($writer->has_any_data());
/** @var stdClass[] $preferences */
@@ -14,19 +14,13 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Tests for scheduled tasks.
*
* @package tool_dataprivacy
* @copyright 2018 Mihail Geshoski <mihail@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once('data_privacy_testcase.php');
namespace tool_dataprivacy\task;
use tool_dataprivacy\api;
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/../data_privacy_testcase.php');
/**
* Tests for scheduled tasks.
*
@@ -34,7 +28,7 @@ use tool_dataprivacy\api;
* @copyright 2018 Mihail Geshoski <mihail@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_dataprivacy_task_testcase extends data_privacy_testcase {
class task_test extends \data_privacy_testcase {
/**
* Test tearDown.
+1 -1
View File
@@ -27,7 +27,7 @@ require_once($CFG->libdir . '/adminlib.php');
admin_externalpage_setup('tool_filetypes');
$extension = required_param('extension', PARAM_RAW);
$extension = required_param('extension', PARAM_ALPHANUMEXT);
$redirecturl = new \moodle_url('/admin/tool/filetypes/index.php');
if (optional_param('revert', 0, PARAM_INT)) {
@@ -100,10 +100,12 @@ class tool_generator_testplan_backend extends tool_generator_backend {
*
* @param int $courseid The target course id
* @param bool $updateuserspassword Updates the course users password to $CFG->tool_generator_users_password
* @param int|null $size of the test plan. Used to limit the number of users exported
* to match the threads in the plan. For BC, defaults to null that means all enrolled users.
* @return stored_file
*/
public static function create_users_file($courseid, $updateuserspassword) {
$csvcontents = self::generate_users_file($courseid, $updateuserspassword);
public static function create_users_file($courseid, $updateuserspassword, ?int $size = null) {
$csvcontents = self::generate_users_file($courseid, $updateuserspassword, $size);
$fs = get_file_storage();
$filerecord = self::get_file_record('users', 'csv');
@@ -171,14 +173,18 @@ class tool_generator_testplan_backend extends tool_generator_backend {
*
* @param int $targetcourseid
* @param bool $updateuserspassword Updates the course users password to $CFG->tool_generator_users_password
* @param int|null $size of the test plan. Used to limit the number of users exported
* to match the threads in the plan. For BC, defaults to null that means all enrolled users.
* @return string The users csv file contents.
*/
protected static function generate_users_file($targetcourseid, $updateuserspassword) {
protected static function generate_users_file($targetcourseid, $updateuserspassword, ?int $size = null) {
global $CFG;
$coursecontext = context_course::instance($targetcourseid);
$users = get_enrolled_users($coursecontext, '', 0, 'u.id, u.username, u.auth', 'u.username ASC');
// If requested, get the number of users (threads) to use in the plan. We only need those in the exported file.
$planusers = self::$users[$size] ?? 0;
$users = get_enrolled_users($coursecontext, '', 0, 'u.id, u.username, u.auth', 'u.username ASC', 0, $planusers);
if (!$users) {
print_error('coursewithoutusers', 'tool_generator');
}
+1 -1
View File
@@ -98,7 +98,7 @@ if (empty($CFG->tool_generator_users_password) || is_bool($CFG->tool_generator_u
// Create files.
$courseid = $DB->get_field('course', 'id', array('shortname' => $shortname));
$usersfile = tool_generator_testplan_backend::create_users_file($courseid, !empty($options['updateuserspassword']));
$usersfile = tool_generator_testplan_backend::create_users_file($courseid, !empty($options['updateuserspassword']), $size);
$testplanfile = tool_generator_testplan_backend::create_testplan_file($courseid, $size);
// One file path per line so other CLI scripts can easily parse the output.
+1 -1
View File
@@ -51,7 +51,7 @@ if ($data = $mform->get_data()) {
// Creating both test plan and users files.
$testplanfile = tool_generator_testplan_backend::create_testplan_file($data->courseid, $data->size);
$usersfile = tool_generator_testplan_backend::create_users_file($data->courseid, $data->updateuserspassword);
$usersfile = tool_generator_testplan_backend::create_users_file($data->courseid, $data->updateuserspassword, $data->size);
// Test plan link.
$testplanurl = moodle_url::make_pluginfile_url(
+7
View File
@@ -1,6 +1,13 @@
This files describes API changes in core libraries and APIs,
information provided here is intended especially for developers.
=== 3.11.4 ===
* Function tool_generator_testplan_backend::create_users_file() now supports to pass the size of the testing plan,
that needs to be equal or smaller than the size of the generated site. That's used to effectively restrict the
exported number of users to the number of threads the jmeter plan will have (previously all the enrolled users
were being exported, with that leading to "false" loops (users not really looping X times).
=== 3.7 ===
* Function tool_generator_testplan_backend::get_course_options() is removed, the 'course' form element is used instead.
+3 -2
View File
@@ -1,2 +1,3 @@
define ("tool_langimport/search",["exports","core/pending","core/utils"],function(a,b,c){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;b=function(a){return a&&a.__esModule?a:{default:a}}(b);function d(a,b){return j(a)||h(a,b)||f(a,b)||e()}function e(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function f(a,b){if(!a)return;if("string"==typeof a)return g(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return g(a,b)}function g(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);c<b;c++){d[c]=a[c]}return d}function h(a,b){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(a)))return;var c=[],d=!0,e=!1,f=void 0;try{for(var g=a[Symbol.iterator](),h;!(d=(h=g.next()).done);d=!0){c.push(h.value);if(b&&c.length===b)break}}catch(a){e=!0;f=a}finally{try{if(!d&&null!=g["return"])g["return"]()}finally{if(e)throw f}}return c}function j(a){if(Array.isArray(a))return a}var k={AVAILABLE_LANG_SELECT:"select",AVAILABLE_LANG_SEARCH:"[data-action=\"search\"]"},l=250;a.default={init:function init(a){var e=a.querySelector(k.AVAILABLE_LANG_SELECT),f=function(a){var c=new b.default("tool_langimport/search:filter");e.querySelectorAll("option").forEach(function(a){a.remove()});var f=a.target.value.toLowerCase(),g=JSON.parse(e.dataset.availableLanguages),h=Object.keys(g).reduce(function(a,b){if(g[b].toLowerCase().includes(f)){a[b]=g[b]}return a},[]);Object.entries(h).forEach(function(a){var b=d(a,2),c=b[0],f=b[1],g=document.createElement("option");g.value=c;g.innerText=f;e.append(g)});c.resolve()},g={};e.querySelectorAll("option").forEach(function(a){g[a.value]=a.text});e.dataset.availableLanguages=JSON.stringify(g);var h=a.querySelector(k.AVAILABLE_LANG_SEARCH);h.addEventListener("keydown",function(a){if("Enter"===a.key){a.preventDefault()}});h.addEventListener("keyup",function(a){var d=new b.default("tool_langimport/search:keyup");(0,c.debounce)(f,l)(a);setTimeout(function(){d.resolve()},l)})}};return a.default});
//# sourceMappingURL=search.min.js.map
define("tool_langimport/search",["exports","core/pending","core/utils"],(function(_exports,_pending,_utils){var obj;function _slicedToArray(arr,i){return function(arr){if(Array.isArray(arr))return arr}(arr)||function(arr,i){var _i=null==arr?null:"undefined"!=typeof Symbol&&arr[Symbol.iterator]||arr["@@iterator"];if(null==_i)return;var _s,_e,_arr=[],_n=!0,_d=!1;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done)&&(_arr.push(_s.value),!i||_arr.length!==i);_n=!0);}catch(err){_d=!0,_e=err}finally{try{_n||null==_i.return||_i.return()}finally{if(_d)throw _e}}return _arr}(arr,i)||function(o,minLen){if(!o)return;if("string"==typeof o)return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);"Object"===n&&o.constructor&&(n=o.constructor.name);if("Map"===n||"Set"===n)return Array.from(o);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}(arr,i)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _arrayLikeToArray(arr,len){(null==len||len>arr.length)&&(len=arr.length);for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};var SELECTORS_AVAILABLE_LANG_SELECT="select",SELECTORS_AVAILABLE_LANG_SEARCH='[data-action="search"]',_default={init:function(form){var availableLangsElement=form.querySelector(SELECTORS_AVAILABLE_LANG_SELECT),availableLangsFilter=function(event){var pendingPromise=new _pending.default("tool_langimport/search:filter");availableLangsElement.querySelectorAll("option").forEach((function(option){option.remove()}));var searchTerm=event.target.value.toLowerCase(),availableLanguages=JSON.parse(availableLangsElement.dataset.availableLanguages),filteredLanguages=Object.keys(availableLanguages).reduce((function(matches,langcode){return availableLanguages[langcode].toLowerCase().includes(searchTerm)&&(matches[langcode]=availableLanguages[langcode]),matches}),[]);Object.entries(filteredLanguages).forEach((function(_ref){var _ref2=_slicedToArray(_ref,2),langcode=_ref2[0],langname=_ref2[1],option=document.createElement("option");option.value=langcode,option.innerText=langname,availableLangsElement.append(option)})),pendingPromise.resolve()},availableLanguages={};availableLangsElement.querySelectorAll("option").forEach((function(option){availableLanguages[option.value]=option.text})),availableLangsElement.dataset.availableLanguages=JSON.stringify(availableLanguages);var availableLangsSearch=form.querySelector(SELECTORS_AVAILABLE_LANG_SEARCH);availableLangsSearch.addEventListener("keydown",(function(event){"Enter"===event.key&&event.preventDefault()})),availableLangsSearch.addEventListener("keyup",(function(event){var pendingPromise=new _pending.default("tool_langimport/search:keyup");(0,_utils.debounce)(availableLangsFilter,250)(event),setTimeout((function(){pendingPromise.resolve()}),250)}))}};return _exports.default=_default,_exports.default}));
//# sourceMappingURL=search.min.js.map
File diff suppressed because one or more lines are too long
@@ -22,7 +22,7 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
*/
defined('MOODLE_INTERNAL') || die();
namespace tool_langimport\event;
/**
* Test class for langimport events.
@@ -31,7 +31,7 @@ defined('MOODLE_INTERNAL') || die();
* @copyright 2014 Dan Poltawski
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
*/
class tool_langimport_events_testcase extends advanced_testcase {
class events_test extends \advanced_testcase {
/**
* Setup testcase.
@@ -53,7 +53,7 @@ class tool_langimport_events_testcase extends advanced_testcase {
$event = reset($events);
$this->assertInstanceOf('\tool_langimport\event\langpack_updated', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
$this->assertEquals(\context_system::instance(), $event->get_context());
}
public function test_langpack_updated_validation() {
@@ -73,7 +73,7 @@ class tool_langimport_events_testcase extends advanced_testcase {
$event = reset($events);
$this->assertInstanceOf('\tool_langimport\event\langpack_imported', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
$this->assertEquals(\context_system::instance(), $event->get_context());
}
public function test_langpack_installed_validation() {
@@ -93,7 +93,7 @@ class tool_langimport_events_testcase extends advanced_testcase {
$event = reset($events);
$this->assertInstanceOf('\tool_langimport\event\langpack_removed', $event);
$this->assertEquals(context_system::instance(), $event->get_context());
$this->assertEquals(\context_system::instance(), $event->get_context());
}
public function test_langpack_removed_validation() {
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_licensemanager/delete_license",["jquery","core/modal_factory","core/modal_events","core/url","core/str"],function(a,b,c,d,e){var f=a(".delete-license");b.create({type:b.types.SAVE_CANCEL,title:e.get_string("deletelicense","tool_licensemanager"),body:e.get_string("deletelicenseconfirmmessage","tool_licensemanager"),preShowCallback:function preShowCallback(b,c){b=a(b);var e={action:"delete",license:b.data("license")};c.deleteURL=d.relativeUrl("/admin/tool/licensemanager/index.php",e,!0)},large:!0},f).done(function(a){a.getRoot().on(c.save,function(b){b.preventDefault();window.location.href=a.deleteURL})})});
//# sourceMappingURL=delete_license.min.js.map
/**
* Modal for confirming deletion of a custom license.
*
* @module tool_licensemanager/delete_license
* @copyright 2019 Tom Dickman <tomdickman@catalyst-au.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_licensemanager/delete_license",["jquery","core/modal_factory","core/modal_events","core/url","core/str"],(function($,ModalFactory,ModalEvents,Url,String){var trigger=$(".delete-license");ModalFactory.create({type:ModalFactory.types.SAVE_CANCEL,title:String.get_string("deletelicense","tool_licensemanager"),body:String.get_string("deletelicenseconfirmmessage","tool_licensemanager"),preShowCallback:function(triggerElement,modal){var params={action:"delete",license:(triggerElement=$(triggerElement)).data("license")};modal.deleteURL=Url.relativeUrl("/admin/tool/licensemanager/index.php",params,!0)},large:!0},trigger).done((function(modal){modal.getRoot().on(ModalEvents.save,(function(e){e.preventDefault(),window.location.href=modal.deleteURL}))}))}));
//# sourceMappingURL=delete_license.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../src/delete_license.js"],"names":["define","$","ModalFactory","ModalEvents","Url","String","trigger","create","type","types","SAVE_CANCEL","title","get_string","body","preShowCallback","triggerElement","modal","params","data","deleteURL","relativeUrl","large","done","getRoot","on","save","e","preventDefault","window","location","href"],"mappings":"AAsBAA,OAAM,sCAAC,CAAC,QAAD,CAAW,oBAAX,CAAiC,mBAAjC,CAAsD,UAAtD,CAAkE,UAAlE,CAAD,CACF,SAASC,CAAT,CAAYC,CAAZ,CAA0BC,CAA1B,CAAuCC,CAAvC,CAA4CC,CAA5C,CAAoD,CAEhD,GAAIC,CAAAA,CAAO,CAAGL,CAAC,CAAC,iBAAD,CAAf,CACAC,CAAY,CAACK,MAAb,CAAoB,CAChBC,IAAI,CAAEN,CAAY,CAACO,KAAb,CAAmBC,WADT,CAEhBC,KAAK,CAAEN,CAAM,CAACO,UAAP,CAAkB,eAAlB,CAAmC,qBAAnC,CAFS,CAGhBC,IAAI,CAAER,CAAM,CAACO,UAAP,CAAkB,6BAAlB,CAAiD,qBAAjD,CAHU,CAIhBE,eAAe,CAAE,yBAASC,CAAT,CAAyBC,CAAzB,CAAgC,CAC7CD,CAAc,CAAGd,CAAC,CAACc,CAAD,CAAlB,CACA,GAAIE,CAAAA,CAAM,CAAG,CACT,OAAU,QADD,CAET,QAAWF,CAAc,CAACG,IAAf,CAAoB,SAApB,CAFF,CAAb,CAIAF,CAAK,CAACG,SAAN,CAAkBf,CAAG,CAACgB,WAAJ,CAAgB,sCAAhB,CAAwDH,CAAxD,IACrB,CAXe,CAYhBI,KAAK,GAZW,CAApB,CAaGf,CAbH,EAcKgB,IAdL,CAcU,SAASN,CAAT,CAAgB,CAClBA,CAAK,CAACO,OAAN,GAAgBC,EAAhB,CAAmBrB,CAAW,CAACsB,IAA/B,CAAqC,SAASC,CAAT,CAAY,CAE7CA,CAAC,CAACC,cAAF,GAEAC,MAAM,CAACC,QAAP,CAAgBC,IAAhB,CAAuBd,CAAK,CAACG,SAChC,CALD,CAMH,CArBL,CAsBH,CA1BC,CAAN","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Modal for confirming deletion of a custom license.\n *\n * @module tool_licensemanager/delete_license\n * @copyright 2019 Tom Dickman <tomdickman@catalyst-au.net>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_factory', 'core/modal_events', 'core/url', 'core/str'],\n function($, ModalFactory, ModalEvents, Url, String) {\n\n var trigger = $('.delete-license');\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: String.get_string('deletelicense', 'tool_licensemanager'),\n body: String.get_string('deletelicenseconfirmmessage', 'tool_licensemanager'),\n preShowCallback: function(triggerElement, modal) {\n triggerElement = $(triggerElement);\n let params = {\n 'action': 'delete',\n 'license': triggerElement.data('license')\n };\n modal.deleteURL = Url.relativeUrl('/admin/tool/licensemanager/index.php', params, true);\n },\n large: true,\n }, trigger)\n .done(function(modal) {\n modal.getRoot().on(ModalEvents.save, function(e) {\n // Stop the default save button behaviour which is to close the modal.\n e.preventDefault();\n // Redirect to delete url.\n window.location.href = modal.deleteURL;\n });\n });\n });\n"],"file":"delete_license.min.js"}
{"version":3,"file":"delete_license.min.js","sources":["../src/delete_license.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Modal for confirming deletion of a custom license.\n *\n * @module tool_licensemanager/delete_license\n * @copyright 2019 Tom Dickman <tomdickman@catalyst-au.net>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_factory', 'core/modal_events', 'core/url', 'core/str'],\n function($, ModalFactory, ModalEvents, Url, String) {\n\n var trigger = $('.delete-license');\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n title: String.get_string('deletelicense', 'tool_licensemanager'),\n body: String.get_string('deletelicenseconfirmmessage', 'tool_licensemanager'),\n preShowCallback: function(triggerElement, modal) {\n triggerElement = $(triggerElement);\n let params = {\n 'action': 'delete',\n 'license': triggerElement.data('license')\n };\n modal.deleteURL = Url.relativeUrl('/admin/tool/licensemanager/index.php', params, true);\n },\n large: true,\n }, trigger)\n .done(function(modal) {\n modal.getRoot().on(ModalEvents.save, function(e) {\n // Stop the default save button behaviour which is to close the modal.\n e.preventDefault();\n // Redirect to delete url.\n window.location.href = modal.deleteURL;\n });\n });\n });\n"],"names":["define","$","ModalFactory","ModalEvents","Url","String","trigger","create","type","types","SAVE_CANCEL","title","get_string","body","preShowCallback","triggerElement","modal","params","data","deleteURL","relativeUrl","large","done","getRoot","on","save","e","preventDefault","window","location","href"],"mappings":";;;;;;;AAsBAA,4CAAO,CAAC,SAAU,qBAAsB,oBAAqB,WAAY,aACrE,SAASC,EAAGC,aAAcC,YAAaC,IAAKC,YAEpCC,QAAUL,EAAE,mBAChBC,aAAaK,OAAO,CAChBC,KAAMN,aAAaO,MAAMC,YACzBC,MAAON,OAAOO,WAAW,gBAAiB,uBAC1CC,KAAMR,OAAOO,WAAW,8BAA+B,uBACvDE,gBAAiB,SAASC,eAAgBC,WAElCC,OAAS,QACC,kBAFdF,eAAiBd,EAAEc,iBAGWG,KAAK,YAEnCF,MAAMG,UAAYf,IAAIgB,YAAY,uCAAwCH,QAAQ,IAEtFI,OAAO,GACRf,SACEgB,MAAK,SAASN,OACXA,MAAMO,UAAUC,GAAGrB,YAAYsB,MAAM,SAASC,GAE1CA,EAAEC,iBAEFC,OAAOC,SAASC,KAAOd,MAAMG"}
@@ -23,6 +23,7 @@
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace logstore_database\privacy;
defined('MOODLE_INTERNAL') || die();
global $CFG;
@@ -34,7 +35,7 @@ use core_privacy\local\request\transform;
use core_privacy\local\request\writer;
use logstore_database\privacy\provider;
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/../fixtures/event.php');
/**
* Data provider testcase class.
@@ -48,7 +49,7 @@ require_once(__DIR__ . '/fixtures/event.php');
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class logstore_database_privacy_testcase extends provider_testcase {
class provider_test extends provider_testcase {
public function setUp(): void {
global $CFG;
@@ -105,11 +106,11 @@ class logstore_database_privacy_testcase extends provider_testcase {
$c2 = $this->getDataGenerator()->create_course();
$cm2 = $this->getDataGenerator()->create_module('url', ['course' => $c2]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$cm1ctx = context_module::instance($cm1->cmid);
$cm2ctx = context_module::instance($cm2->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$cm2ctx = \context_module::instance($cm2->cmid);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -143,7 +144,7 @@ class logstore_database_privacy_testcase extends provider_testcase {
$this->assert_contextlist_equals($this->get_contextlist_for_user($u3), [$sysctx, $c1ctx]);
$this->assert_contextlist_equals($this->get_contextlist_for_user($admin), [$sysctx, $c1ctx]);
$this->setAdminUser();
\core\session\manager::loginas($u1->id, context_system::instance());
\core\session\manager::loginas($u1->id, \context_system::instance());
$e = \logstore_database\event\unittest_executed::create(['context' => $c2ctx, 'relateduserid' => $u3->id]);
$e->trigger();
$this->assert_contextlist_equals($this->get_contextlist_for_user($u1), [$sysctx, $cm1ctx, $c2ctx]);
@@ -163,8 +164,8 @@ class logstore_database_privacy_testcase extends provider_testcase {
$c1 = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -185,7 +186,7 @@ class logstore_database_privacy_testcase extends provider_testcase {
$e->trigger();
// The admin user should be added (realuserid).
$this->setAdminUser();
\core\session\manager::loginas($u2->id, context_system::instance());
\core\session\manager::loginas($u2->id, \context_system::instance());
$e = \logstore_database\event\unittest_executed::create(['context' => $sysctx]);
$e->trigger();
// Set off an event in a different context. User 4 should not be returned below.
@@ -206,9 +207,9 @@ class logstore_database_privacy_testcase extends provider_testcase {
$u2 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -247,9 +248,9 @@ class logstore_database_privacy_testcase extends provider_testcase {
$u2 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -294,8 +295,8 @@ class logstore_database_privacy_testcase extends provider_testcase {
$u4 = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($course->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($course->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -337,11 +338,11 @@ class logstore_database_privacy_testcase extends provider_testcase {
$cm1 = $this->getDataGenerator()->create_module('url', ['course' => $c1]);
$c2 = $this->getDataGenerator()->create_course();
$cm2 = $this->getDataGenerator()->create_module('url', ['course' => $c2]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$cm1ctx = context_module::instance($cm1->cmid);
$cm2ctx = context_module::instance($cm2->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$cm2ctx = \context_module::instance($cm2->cmid);
$path = [get_string('privacy:path:logs', 'tool_log'), get_string('pluginname', 'logstore_database')];
$this->enable_logging();
@@ -14,6 +14,13 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace logstore_database;
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/fixtures/store.php');
/**
* External database log store tests.
*
@@ -21,13 +28,7 @@
* @copyright 2014 Petr Skoda {@link http://skodak.org/}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/fixtures/store.php');
class logstore_database_store_testcase extends advanced_testcase {
class store_test extends \advanced_testcase {
/**
* Tests log writing.
*
@@ -120,7 +121,7 @@ class logstore_database_store_testcase extends advanced_testcase {
$this->setUser(0);
$event1 = \logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)));
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)));
$event1->trigger();
$logs = $DB->get_records('logstore_standard_log', array(), 'id ASC');
@@ -141,11 +142,11 @@ class logstore_database_store_testcase extends advanced_testcase {
$this->assertEquals($data, $log1);
$this->setAdminUser();
\core\session\manager::loginas($user1->id, context_system::instance());
\core\session\manager::loginas($user1->id, \context_system::instance());
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
$event2 = \logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module2->cmid), 'other' => array('sample' => 6, 'xx' => 9)));
array('context' => \context_module::instance($module2->cmid), 'other' => array('sample' => 6, 'xx' => 9)));
$event2->trigger();
\core\session\manager::init_empty_session();
@@ -190,30 +191,30 @@ class logstore_database_store_testcase extends advanced_testcase {
$DB->delete_records('logstore_standard_log');
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
$store->flush();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(5, $DB->count_records('logstore_standard_log'));
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(5, $DB->count_records('logstore_standard_log'));
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(5, $DB->count_records('logstore_standard_log'));
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(8, $DB->count_records('logstore_standard_log'));
// Test guest logging setting.
@@ -225,22 +226,22 @@ class logstore_database_store_testcase extends advanced_testcase {
$this->setUser(null);
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
$this->setGuestUser();
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
$this->setUser($user1);
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(1, $DB->count_records('logstore_standard_log'));
$this->setUser($user2);
\logstore_database\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
set_config('enabled_stores', '', 'tool_log');
@@ -270,7 +271,7 @@ class logstore_database_store_testcase extends advanced_testcase {
set_config('logguests', 0, 'logstore_database');
$this->setGuestUser();
$event = \logstore_database\event\unittest_executed::create(
array('context' => context_system::instance(), 'other' => array('sample' => 5, 'xx' => 10)));
array('context' => \context_system::instance(), 'other' => array('sample' => 5, 'xx' => 10)));
$logmanager = get_log_manager();
$store = new \logstore_database\test\store($logmanager);
$this->assertTrue($store->is_event_ignored($event));
@@ -23,6 +23,7 @@
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace logstore_legacy\privacy;
defined('MOODLE_INTERNAL') || die();
global $CFG;
@@ -35,7 +36,7 @@ use core_privacy\local\request\writer;
use logstore_legacy\privacy\provider;
use logstore_legacy\event\unittest_executed;
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/../fixtures/event.php');
/**
* Data provider testcase class.
@@ -46,7 +47,7 @@ require_once(__DIR__ . '/fixtures/event.php');
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class logstore_legacy_privacy_testcase extends provider_testcase {
class provider_test extends provider_testcase {
public function setUp(): void {
$this->resetAfterTest();
@@ -58,9 +59,9 @@ class logstore_legacy_privacy_testcase extends provider_testcase {
$u3 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$cm1 = $this->getDataGenerator()->create_module('url', ['course' => $c1]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$cm1ctx = context_module::instance($cm1->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -96,11 +97,11 @@ class logstore_legacy_privacy_testcase extends provider_testcase {
$u3 = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$module = $this->getDataGenerator()->create_module('url', ['course' => $course]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($course->id);
$cm1ctx = context_module::instance($module->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($course->id);
$cm1ctx = \context_module::instance($module->cmid);
$userctx = context_user::instance($u1->id);
$userctx = \context_user::instance($u1->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -161,10 +162,10 @@ class logstore_legacy_privacy_testcase extends provider_testcase {
$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$cm1 = $this->getDataGenerator()->create_module('url', ['course' => $c1]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$cm1ctx = context_module::instance($cm1->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -238,10 +239,10 @@ class logstore_legacy_privacy_testcase extends provider_testcase {
$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$cm1 = $this->getDataGenerator()->create_module('url', ['course' => $c1]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$cm1ctx = context_module::instance($cm1->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -317,11 +318,11 @@ class logstore_legacy_privacy_testcase extends provider_testcase {
$u3 = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$module = $this->getDataGenerator()->create_module('url', ['course' => $course]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($course->id);
$cm1ctx = context_module::instance($module->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($course->id);
$cm1ctx = \context_module::instance($module->cmid);
$userctx = context_user::instance($u1->id);
$userctx = \context_user::instance($u1->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -377,10 +378,10 @@ class logstore_legacy_privacy_testcase extends provider_testcase {
$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$cm1 = $this->getDataGenerator()->create_module('url', ['course' => $c1]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$cm1ctx = context_module::instance($cm1->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -14,6 +14,13 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace logstore_legacy;
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/fixtures/store.php');
/**
* Legacy log store tests.
*
@@ -21,13 +28,7 @@
* @copyright 2014 Petr Skoda {@link http://skodak.org/}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/fixtures/store.php');
class logstore_legacy_store_testcase extends advanced_testcase {
class store_test extends \advanced_testcase {
public function test_log_writing() {
global $DB;
$this->resetAfterTest();
@@ -58,12 +59,12 @@ class logstore_legacy_store_testcase extends advanced_testcase {
$this->setUser(0);
$event1 = \logstore_legacy\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)));
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)));
$event1->trigger();
$this->setUser($user1);
$event2 = \logstore_legacy\event\unittest_executed::create(
array('context' => context_course::instance($course2->id), 'other' => array('sample' => 6, 'xx' => 11)));
array('context' => \context_course::instance($course2->id), 'other' => array('sample' => 6, 'xx' => 11)));
$event2->trigger();
$logs = $DB->get_records('log', array(), 'id ASC');
+1 -1
View File
@@ -39,4 +39,4 @@
</INDEXES>
</TABLE>
</TABLES>
</XMLDB>
</XMLDB>
@@ -23,6 +23,7 @@
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace logstore_standard\privacy;
defined('MOODLE_INTERNAL') || die();
global $CFG;
@@ -34,7 +35,7 @@ use core_privacy\local\request\transform;
use core_privacy\local\request\writer;
use logstore_standard\privacy\provider;
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/../fixtures/event.php');
/**
* Data provider testcase class.
@@ -45,7 +46,7 @@ require_once(__DIR__ . '/fixtures/event.php');
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class logstore_standard_privacy_testcase extends provider_testcase {
class provider_test extends provider_testcase {
public function setUp(): void {
$this->resetAfterTest();
@@ -63,11 +64,11 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$c2 = $this->getDataGenerator()->create_course();
$cm2 = $this->getDataGenerator()->create_module('url', ['course' => $c2]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$cm1ctx = context_module::instance($cm1->cmid);
$cm2ctx = context_module::instance($cm2->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$cm2ctx = \context_module::instance($cm2->cmid);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -101,7 +102,7 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$this->assert_contextlist_equals($this->get_contextlist_for_user($u3), [$sysctx, $c1ctx]);
$this->assert_contextlist_equals($this->get_contextlist_for_user($admin), [$sysctx, $c1ctx]);
$this->setAdminUser();
\core\session\manager::loginas($u1->id, context_system::instance());
\core\session\manager::loginas($u1->id, \context_system::instance());
$e = \logstore_standard\event\unittest_executed::create(['context' => $c2ctx, 'relateduserid' => $u3->id]);
$e->trigger();
$this->assert_contextlist_equals($this->get_contextlist_for_user($u1), [$sysctx, $cm1ctx, $c2ctx]);
@@ -118,8 +119,8 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$c1 = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -140,7 +141,7 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$e->trigger();
// The admin user should be added (realuserid).
$this->setAdminUser();
\core\session\manager::loginas($u2->id, context_system::instance());
\core\session\manager::loginas($u2->id, \context_system::instance());
$e = \logstore_standard\event\unittest_executed::create(['context' => $sysctx]);
$e->trigger();
// Set off an event in a different context. User 4 should not be returned below.
@@ -161,9 +162,9 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$u2 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -202,9 +203,9 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$u2 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c2 = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -246,8 +247,8 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$u4 = $this->getDataGenerator()->create_user();
$course = $this->getDataGenerator()->create_course();
$sysctx = context_system::instance();
$c1ctx = context_course::instance($course->id);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($course->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -289,11 +290,11 @@ class logstore_standard_privacy_testcase extends provider_testcase {
$cm1 = $this->getDataGenerator()->create_module('url', ['course' => $c1]);
$c2 = $this->getDataGenerator()->create_course();
$cm2 = $this->getDataGenerator()->create_module('url', ['course' => $c2]);
$sysctx = context_system::instance();
$c1ctx = context_course::instance($c1->id);
$c2ctx = context_course::instance($c2->id);
$cm1ctx = context_module::instance($cm1->cmid);
$cm2ctx = context_module::instance($cm2->cmid);
$sysctx = \context_system::instance();
$c1ctx = \context_course::instance($c1->id);
$c2ctx = \context_course::instance($c2->id);
$cm1ctx = \context_module::instance($cm1->cmid);
$cm2ctx = \context_module::instance($cm2->cmid);
$path = [get_string('privacy:path:logs', 'tool_log'), get_string('pluginname', 'logstore_standard')];
$this->enable_logging();
@@ -14,6 +14,13 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace logstore_standard;
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/fixtures/restore_hack.php');
/**
* Standard log store tests.
*
@@ -21,13 +28,7 @@
* @copyright 2014 Petr Skoda {@link http://skodak.org/}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once(__DIR__ . '/fixtures/event.php');
require_once(__DIR__ . '/fixtures/restore_hack.php');
class logstore_standard_store_testcase extends advanced_testcase {
class store_test extends \advanced_testcase {
/**
* @var bool Determine if we disabled the GC, so it can be re-enabled in tearDown.
*/
@@ -84,7 +85,7 @@ class logstore_standard_store_testcase extends advanced_testcase {
$this->setUser(0);
$event1 = \logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)));
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)));
$event1->trigger();
$logs = $DB->get_records('logstore_standard_log', array(), 'id ASC');
@@ -105,14 +106,14 @@ class logstore_standard_store_testcase extends advanced_testcase {
$this->assertEquals($data, $log1);
$this->setAdminUser();
\core\session\manager::loginas($user1->id, context_system::instance());
\core\session\manager::loginas($user1->id, \context_system::instance());
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
logstore_standard_restore::hack_executing(1);
\logstore_standard_restore::hack_executing(1);
$event2 = \logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module2->cmid), 'other' => array('sample' => 6, 'xx' => 9)));
array('context' => \context_module::instance($module2->cmid), 'other' => array('sample' => 6, 'xx' => 9)));
$event2->trigger();
logstore_standard_restore::hack_executing(0);
\logstore_standard_restore::hack_executing(0);
\core\session\manager::init_empty_session();
$this->assertFalse(\core\session\manager::is_loggedinas());
@@ -161,30 +162,30 @@ class logstore_standard_store_testcase extends advanced_testcase {
$DB->delete_records('logstore_standard_log');
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
$store->flush();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(5, $DB->count_records('logstore_standard_log'));
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(5, $DB->count_records('logstore_standard_log'));
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(5, $DB->count_records('logstore_standard_log'));
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(8, $DB->count_records('logstore_standard_log'));
// Test guest logging setting.
@@ -196,22 +197,22 @@ class logstore_standard_store_testcase extends advanced_testcase {
$this->setUser(null);
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
$this->setGuestUser();
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(0, $DB->count_records('logstore_standard_log'));
$this->setUser($user1);
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(1, $DB->count_records('logstore_standard_log'));
$this->setUser($user2);
\logstore_standard\event\unittest_executed::create(
array('context' => context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
array('context' => \context_module::instance($module1->cmid), 'other' => array('sample' => 5, 'xx' => 10)))->trigger();
$this->assertEquals(2, $DB->count_records('logstore_standard_log'));
set_config('enabled_stores', '', 'tool_log');
@@ -335,7 +336,7 @@ class logstore_standard_store_testcase extends advanced_testcase {
$this->resetAfterTest();
// Create some records spread over various days; test multiple iterations in cleanup.
$ctx = context_course::instance(1);
$ctx = \context_course::instance(1);
$record = (object) array(
'edulevel' => 0,
'contextid' => $ctx->id,
@@ -424,11 +425,11 @@ class logstore_standard_store_testcase extends advanced_testcase {
// Create some log data in a course - one with other data, one without.
\logstore_standard\event\unittest_executed::create([
'context' => context_course::instance($course->id),
'context' => \context_course::instance($course->id),
'other' => ['sample' => 5, 'xx' => 10]])->trigger();
$this->waitForSecond();
\logstore_standard\event\unittest_executed::create([
'context' => context_course::instance($course->id)])->trigger();
'context' => \context_course::instance($course->id)])->trigger();
$records = array_values($DB->get_records('logstore_standard_log',
['courseid' => $course->id, 'target' => 'unittest'], 'timecreated'));
@@ -473,7 +474,7 @@ class logstore_standard_store_testcase extends advanced_testcase {
/**
* Backs a course up to temp directory.
*
* @param stdClass $course Course object to backup
* @param \stdClass $course Course object to backup
* @return string ID of backup
*/
protected function backup($course): string {
@@ -481,14 +482,14 @@ class logstore_standard_store_testcase extends advanced_testcase {
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
// Turn off file logging, otherwise it can't delete the file (Windows).
$CFG->backup_file_logger_level = backup::LOG_NONE;
$CFG->backup_file_logger_level = \backup::LOG_NONE;
// Do backup with default settings. MODE_IMPORT means it will just
// create the directory and not zip it.
$bc = new backup_controller(backup::TYPE_1COURSE, $course->id,
backup::FORMAT_MOODLE, backup::INTERACTIVE_NO, backup::MODE_IMPORT,
$bc = new \backup_controller(\backup::TYPE_1COURSE, $course->id,
\backup::FORMAT_MOODLE, \backup::INTERACTIVE_NO, \backup::MODE_IMPORT,
$USER->id);
$bc->get_plan()->get_setting('users')->set_status(backup_setting::NOT_LOCKED);
$bc->get_plan()->get_setting('users')->set_status(\backup_setting::NOT_LOCKED);
$bc->get_plan()->get_setting('users')->set_value(true);
$bc->get_plan()->get_setting('logs')->set_value(true);
$backupid = $bc->get_backupid();
@@ -505,18 +506,18 @@ class logstore_standard_store_testcase extends advanced_testcase {
* @param \stdClass $course Original course object
* @param string $suffix Suffix to add after original course shortname and fullname
* @return int New course id
* @throws restore_controller_exception
* @throws \restore_controller_exception
*/
protected function restore(string $backupid, $course, string $suffix): int {
global $USER, $CFG;
require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
// Do restore to new course with default settings.
$newcourseid = restore_dbops::create_new_course(
$newcourseid = \restore_dbops::create_new_course(
$course->fullname . $suffix, $course->shortname . $suffix, $course->category);
$rc = new restore_controller($backupid, $newcourseid,
backup::INTERACTIVE_NO, backup::MODE_GENERAL, $USER->id,
backup::TARGET_NEW_COURSE);
$rc = new \restore_controller($backupid, $newcourseid,
\backup::INTERACTIVE_NO, \backup::MODE_GENERAL, $USER->id,
\backup::TARGET_NEW_COURSE);
$rc->get_plan()->get_setting('logs')->set_value(true);
$rc->get_plan()->get_setting('users')->set_value(true);
+3 -4
View File
@@ -14,6 +14,8 @@
// 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_log;
/**
* Log manager and log API tests.
*
@@ -21,10 +23,7 @@
* @copyright 2014 Petr Skoda {@link http://skodak.org/}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die;
class tool_log_manager_testcase extends advanced_testcase {
class manager_test extends \advanced_testcase {
public function test_get_log_manager() {
global $CFG;
$this->resetAfterTest();
@@ -23,6 +23,7 @@
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_log\privacy;
defined('MOODLE_INTERNAL') || die();
global $CFG;
@@ -49,7 +50,7 @@ require_once($CFG->dirroot . '/admin/tool/log/store/standard/tests/fixtures/even
* @author Frédéric Massart <fred@branchup.tech>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class tool_log_privacy_testcase extends provider_testcase {
class provider_test extends provider_testcase {
public function setUp(): void {
$this->resetAfterTest();
@@ -60,7 +61,7 @@ class tool_log_privacy_testcase extends provider_testcase {
$admin = \core_user::get_user(2);
$u1 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c1ctx = context_course::instance($c1->id);
$c1ctx = \context_course::instance($c1->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -77,7 +78,7 @@ class tool_log_privacy_testcase extends provider_testcase {
$u1 = $this->getDataGenerator()->create_user();
$u2 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c1ctx = context_course::instance($c1->id);
$c1ctx = \context_course::instance($c1->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -111,7 +112,7 @@ class tool_log_privacy_testcase extends provider_testcase {
$u1 = $this->getDataGenerator()->create_user();
$u2 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c1ctx = context_course::instance($c1->id);
$c1ctx = \context_course::instance($c1->id);
$this->enable_logging();
$manager = get_log_manager(true);
@@ -144,7 +145,7 @@ class tool_log_privacy_testcase extends provider_testcase {
$admin = \core_user::get_user(2);
$u1 = $this->getDataGenerator()->create_user();
$c1 = $this->getDataGenerator()->create_course();
$c1ctx = context_course::instance($c1->id);
$c1ctx = \context_course::instance($c1->id);
$path = [get_string('privacy:path:logs', 'tool_log'), get_string('pluginname', 'logstore_standard')];
$this->enable_logging();
+14 -2
View File
@@ -1,2 +1,14 @@
define ("tool_lp/actionselector",["jquery","core/notification","core/ajax","core/templates","tool_lp/dialogue","tool_lp/event_base"],function(a,b,c,d,e,f){var g=function(a,b,c,d,e){var g=this;f.prototype.constructor.apply(this,[]);g._title=a;g._message=b;g._actions=c;g._confirm=d;g._cancel=e;g._selectedValue=null;g._reset()};g.prototype=Object.create(f.prototype);g.prototype._selectedValue=null;g.prototype._popup=null;g.prototype._title=null;g.prototype._message=null;g.prototype._actions=null;g.prototype._confirm=null;g.prototype._cancel=null;g.prototype._afterRender=function(){var b=this;b._find("[data-action=\"action-selector-confirm\"]").attr("disabled","disabled");b._find("[data-region=\"action-selector-radio-buttons\"]").change(function(){b._selectedValue=a("input[type='radio']:checked").val();b._find("[data-action=\"action-selector-confirm\"]").removeAttr("disabled");b._refresh.bind(b)});b._find("[data-action=\"action-selector-cancel\"]").click(function(a){a.preventDefault();b.close()});b._find("[data-action=\"action-selector-confirm\"]").click(function(a){a.preventDefault();if(!b._selectedValue.length){return}b._trigger("save",{action:b._selectedValue});b.close()})};g.prototype.close=function(){var a=this;a._popup.close();a._reset()};g.prototype.display=function(){var a=this;return a._render().then(function(b){a._popup=new e(a._title,b,a._afterRender.bind(a))}).fail(b.exception)};g.prototype._find=function(b){return a(this._popup.getContent()).find(b)};g.prototype._refresh=function(){var a=this;return a._render().then(function(b){a._find("[data-region=\"action-selector\"]").replaceWith(b);a._afterRender()})};g.prototype._render=function(){var a=this,b=[];for(var c in a._actions){b.push(a._actions[c])}var e={message:a._message,choices:b,confirm:a._confirm,cancel:a._cancel};return d.render("tool_lp/action_selector",e)};g.prototype._reset=function(){this._popup=null;this._selectedValue=""};return g});
//# sourceMappingURL=actionselector.min.js.map
/**
* Action selector.
*
* To handle 'save' events use: actionselector.on('save')
* This will receive the information to display in popup.
* The actions have the format [{'text': sometext, 'value' : somevalue}].
*
* @module tool_lp/actionselector
* @copyright 2016 Serge Gauthier - <serge.gauthier.2@umontreal.ca>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_lp/actionselector",["jquery","core/notification","core/ajax","core/templates","tool_lp/dialogue","tool_lp/event_base"],(function($,Notification,Ajax,Templates,Dialogue,EventBase){var ActionSelector=function(title,message,actions,confirm,cancel){EventBase.prototype.constructor.apply(this,[]),this._title=title,this._message=message,this._actions=actions,this._confirm=confirm,this._cancel=cancel,this._selectedValue=null,this._reset()};return(ActionSelector.prototype=Object.create(EventBase.prototype))._selectedValue=null,ActionSelector.prototype._popup=null,ActionSelector.prototype._title=null,ActionSelector.prototype._message=null,ActionSelector.prototype._actions=null,ActionSelector.prototype._confirm=null,ActionSelector.prototype._cancel=null,ActionSelector.prototype._afterRender=function(){var self=this;self._find('[data-action="action-selector-confirm"]').attr("disabled","disabled"),self._find('[data-region="action-selector-radio-buttons"]').change((function(){self._selectedValue=$("input[type='radio']:checked").val(),self._find('[data-action="action-selector-confirm"]').removeAttr("disabled"),self._refresh.bind(self)})),self._find('[data-action="action-selector-cancel"]').click((function(e){e.preventDefault(),self.close()})),self._find('[data-action="action-selector-confirm"]').click((function(e){e.preventDefault(),self._selectedValue.length&&(self._trigger("save",{action:self._selectedValue}),self.close())}))},ActionSelector.prototype.close=function(){this._popup.close(),this._reset()},ActionSelector.prototype.display=function(){var self=this;return self._render().then((function(html){self._popup=new Dialogue(self._title,html,self._afterRender.bind(self))})).fail(Notification.exception)},ActionSelector.prototype._find=function(selector){return $(this._popup.getContent()).find(selector)},ActionSelector.prototype._refresh=function(){var self=this;return self._render().then((function(html){self._find('[data-region="action-selector"]').replaceWith(html),self._afterRender()}))},ActionSelector.prototype._render=function(){var choices=[];for(var i in this._actions)choices.push(this._actions[i]);var content={message:this._message,choices:choices,confirm:this._confirm,cancel:this._cancel};return Templates.render("tool_lp/action_selector",content)},ActionSelector.prototype._reset=function(){this._popup=null,this._selectedValue=""},ActionSelector}));
//# sourceMappingURL=actionselector.min.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+10 -2
View File
@@ -1,2 +1,10 @@
define ("tool_lp/competency_outcomes",["jquery","core/str"],function(a,b){return{NONE:0,EVIDENCE:1,COMPLETE:2,RECOMMEND:3,getAll:function getAll(){var a=this;return b.get_strings([{key:"competencyoutcome_none",component:"tool_lp"},{key:"competencyoutcome_evidence",component:"tool_lp"},{key:"competencyoutcome_recommend",component:"tool_lp"},{key:"competencyoutcome_complete",component:"tool_lp"}]).then(function(b){var c={};c[a.NONE]={code:a.NONE,name:b[0]};c[a.EVIDENCE]={code:a.EVIDENCE,name:b[1]};c[a.RECOMMEND]={code:a.RECOMMEND,name:b[2]};c[a.COMPLETE]={code:a.COMPLETE,name:b[3]};return c})},getString:function getString(b){var c=this,d=c.getAll();return d.then(function(c){if("undefined"==typeof c[b]){return a.Deferred().reject().promise()}return c[b].name})}}});
//# sourceMappingURL=competency_outcomes.min.js.map
/**
* Competency rule config.
*
* @module tool_lp/competency_outcomes
* @copyright 2015 Frédéric Massart - FMCorz.net
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define("tool_lp/competency_outcomes",["jquery","core/str"],(function($,Str){return{NONE:0,EVIDENCE:1,COMPLETE:2,RECOMMEND:3,getAll:function(){var self=this;return Str.get_strings([{key:"competencyoutcome_none",component:"tool_lp"},{key:"competencyoutcome_evidence",component:"tool_lp"},{key:"competencyoutcome_recommend",component:"tool_lp"},{key:"competencyoutcome_complete",component:"tool_lp"}]).then((function(strings){var outcomes={};return outcomes[self.NONE]={code:self.NONE,name:strings[0]},outcomes[self.EVIDENCE]={code:self.EVIDENCE,name:strings[1]},outcomes[self.RECOMMEND]={code:self.RECOMMEND,name:strings[2]},outcomes[self.COMPLETE]={code:self.COMPLETE,name:strings[3]},outcomes}))},getString:function(id){return this.getAll().then((function(outcomes){return void 0===outcomes[id]?$.Deferred().reject().promise():outcomes[id].name}))}}}));
//# sourceMappingURL=competency_outcomes.min.js.map

Some files were not shown because too many files have changed in this diff Show More