Introduce a lang string `questioniconfollowlangdirection` that will
allow the current behaviour of displaying the question mark icon
in RTL languages in the same manner as the current language.
This fixes the changes made in MDL-75047:
* Change `thisicondirection` langconfig string to a more specific one
like `questionicondirection`.
* Use existing direction string value `ltr` for the value of
`questionicondirection`. Also add a comment to at least provide some
form of documentation for it.
* Improve the logic for applying the horizontal flipping class for the
question icon:
- Check first if the icon is a question icon
- Flip the icon if `questionicondirection` is set to `rtl`.
This was detected only in master (4.3dev) because MDL-40084
added a unit test covering it. But the very same patch is
needed in 402_STABLE, no matter it's not covered there.
Patch makes user dashboard respect permission overrides
that have been set on individual blocks on the system
dashboard (indexsys.php). When a user dashboard is created
either when the user visits their dashboard for the first
time or after an admin reset. When blcoks are copied to
the new dashbaord overriden permissions are also copied.
This is in keeping with other Editors such as Atto and resolves an issue
where DOM Purification incorrectly identifies HTML-like string content
as an HTML tag with a JS variable.
Moodle already performs XSS sanitisation using HTML Purifier in PHP.
This bumps direct dependencies to current ones:
- phpunit: 9.5.x No updates here, there is the 9.6.x series
available but a lot of deprecation warnings have been
introduced there without any alternative to use. See:
- https://github.com/sebastianbergmann/phpunit/issues/5160
- https://github.com/sebastianbergmann/phpunit/issues/5062
- ...
While that will be handy to prepare ourselves to PHPUnit 10
in some months... we cannot force everybody to jump to 9.6.x
because that will make a lot of tests to start emitting
warnings.
So we stay with PHPUnit 9.5.x for the life of this branch.
- mink-phpwebdriver: 1.2.1 No updates here, just changed the
constraint because we cannot advance to 1.3.x yet, there is
a change there causing some app tests to fail. See:
- https://github.com/oleg-andreyev/MinkPhpWebDriver/pull/81
So we stay with 1.2.x until that issue is fixed/clarified,
only then we'll review the status.
- behat: 3.12.x => 3.13.x
And also, automatically, a bunch of 2nd and deepest dependencies.
Generated with php80 that is the lowest php version supported
by this branch and, also, by some of the dependencies, as per
documented @ https://moodledev.io/general/development/tools/composer
Worth mentioning behat/mink-goutte-driver, that we should move
to mink-browserkit-driver, but that's out from this issue scope.
PHP 8.2 has deprecated setting properties on objects dynamically.
The qtype_calculatedmulti question type had two properties being
set this way($correctanswerlength and$correctanswerformat).
This patch extends the question_answer class to add the properties
when the object is instantiated.
The boost theme makes the TinyMCE editor rendered in a scrollable container,
scrolling the editor’s container will cause TinyMCE UI elements to be detached from the anchor.
Therefore, to keep the tinyMCE menu in the correct position,
adjustments must be made on the page drawers style.
When using TinyMCE editor in Safari browsers, a problem may occur where the dialogue
windows (such as modal dialogs) overlap with page drawers due to a specific behavior
in Safari's rendering. This function addresses the issue by adjusting the CSS overflow
property of the page drawers, ensuring they do not obscure the dialogue windows.
* Using the generator to create the forum discussions, the timecreated
of a discussion can be set before the user's last course access which
will prevent forum_print_recent_activity() from including this generated
discussion in the recent activity results. To work around this, generate
the forum discussion 1 second after the current time to make sure that
the user's last course access will always be before the discussion's
creation time.
* This patch also includes some optimisations by:
- Removing the unnecessary @javascript tag for the
`Time limit expires` scenario
- Bringing the discussion generation to each scenario to allow each
scenario to customise the data passed to the generator like for the
`Time limit expires` scenario.
- Navigating directly to the forum instance.
This commit does few things:
* Replace manual forum posts and replies to use data generator.
* It also changes the code to handle social forums.
* Other behat clean-ups and optimization.
Co-authored-by: Simey Lameze <simey@moodle.com>
The current I am on course homepage with editing mode loads twice the
course page. This patch prevents this from happening by going directly
to editmode.php.
Aurora MySQL does not support row format COMPRESSED and falls back
to COMPACT if you try to use it, cuasing column size too large
errors if you try to use it with utf8mb4 collation.
Declare qformat_xml::answerfiles and qformat_xml::feedbackfiles instead
of dynamically declaring answerfiles and feedbackfiles for the
question_answer instance when exporting questions and answers to XML
format.
The question answers for question type plugins extending
\qtype_calculated now have the type
\qtype_calculated\qtype_calculated_answer. So the answers for test
helper functions make_calculatedmulti_question_singleresponse() and
make_calculatedmulti_question_multiresponse() should also be changed
accordingly.
The question answers for question type plugins extending
\qtype_calculated now have the type
\qtype_calculated\qtype_calculated_answer. So the answers for
make_calculatedsimple_question_sum() should be changed accordingly.
* Question type plugins that extend qtype_calculated should be made
aware of the changes about the new question_answer type
\qtype_calculated\qtype_calculated_answer.
Where only the case of the idnumber field was being updated, we
triggered an exception because checking for an exising idnumber
was not excluding the current category (i.e. the one being updated).
This commit addresses compatibility issues in the qtype_multianswer
question type. The following changes were made:
- The usage of the undeclared property $maxmark on subquestions in
qtype_multianswer was identified as problematic. To resolve this,
the existing declared property $defaultmark is now being used for
the same purpose.
By switching to the declared property $defaultmark, compatibility with
PHP 8.2 is ensured and the issue with the undeclared property is
resolved.
This commit addresses compatibility issues in the qtype_calculated
question type. The following problems were identified and resolved:
- qtype_calculated was reusing the qtype_numerical_answer class and
setting two additional properties ($correctanswerlength and
$correctanswerformat) that were not declared. To resolve this, a new
class, qtype_calculated_answer, was defined and utilised.
- During grading in qtype_numerical, there were references to an
undeclared property ($unitisright) used to track calculation details.
This issue was fixed using a 'replace temp with query' refactoring.
These changes ensure the qtype_calculated question type is compatible
with PHP 8.2 and addresses the identified issues.
This commit addresses the following issues and improvements in the
qtype_truefalse class:
- Added missing class properties:
- public $truefeedbackformat
- public $falsefeedbackformat
- public $showstandardinstruction
- Updated qtype_truefalse_question to include type hinting for better
IDE support.
Otherwise the enrolment index page tries to load the course index
drawer, which doesn't exist at this point and triggers exceptions in
the editor module.
Co-authored-by: Tim Volckmann <tim.volckmann@mastersolution.com>
The completion_rule_enabled() method was not checking all the fields
and, in some cases, it was returning false (because it was not checking
that "Count of entries" field was enabled).
Change the param type of the category name when editing to allow
for entry of multilang tags, the formatting of which is already
supported when returning category name.
Co-authored-by: Hiroto Kagotani <hiroto.kagotani@gmail.com>
Ensures cross-DB compatibility for all types of both custom and user
profile fields, specifically when they're filtered and/or aggregated.
Implement stress testing of both via appropriate report sources.
The selected value of the dropdown was being cleared when the dropdown
was opened, this was causing an error when submitting the form if the
field was required. The main cause was that we were emptying the
select before loading new values, this solution was created because
of an issue where we could not deselect values if the list was
reloaded. To fix this problem, I added an empty option as the first
element of the select only when deselecting a certain item.
If we cannot resize the given file (files such as ICO can't be, for
SVG it makes no sense), then we should just return the original file
as is rather than an error.
From my experimentation I have discovered that Safari does not properly
respect the standard MediaRecorder mimetype. Instead of using `codecs=`
it uses `codecs:`.
This change copies the codec array to have the list of possible codecs
include both codecs= and codecs: whilst remaining in order.
Add a new method for activity_header that determines the heading level
depending on whether the theme displays a heading for the activity
header (usually a h2 heading with the activity name).
E.g. in Boost, the activity name is already being displayed in a
heading. So page headings can be rendered as h2. However, on Classic,
the activity name is being displayed as a h2 heading. So headings need
to be adjusted for the activity pages.
- Improve the grammatical structure of the lang string.
- Remove the mention of "link", for sighted users, it should already
be obvious that it's a link. For screen reader users, screen readers
already announce links. So it would be confusing for them to hear
something like "Click 'Moodle.org, link' link to open resource"
Add a help text explaining that the URL resource's name field will be
used for the link text. Also add basic guidelines about naming links for
the benefit of screen reader users.
LTI 1.1 uses OAuth 1.0, which requires 'hostname', among other things,
as part of signature verification. When Moodle is run behind a reverse
proxy, $_SERVER['SERVER_NAME'] is an unreliable way to fetch hostname.
It isn't always equal to the external hostname but instead can contain
the local host, meaning the signature verification will fail. This
change replaces the use of $_SERVER vars with $FULLME - which already
takes this into account - to fix the signature verification.
Co-authored-by: Berengar W. Lehr <Berengar.Lehr@uni-jena.de>
It turns out that there are plugins which don't (currently)
clean up their question attempts when a context is deleted.
Therefore, we need to make Moodle core robust to that.
This covers the case where a course is published and the launch data
doesn't include the 'lineitem' property of the ags claim, meaning the
tool can manage its own line items.
With courselistshortnames enabled Moodle 3.11 and earlier showed
"Category | Short name" on the first line of course cards (for example
in block_myoverview). From Moodle 4.0 the category is moved to the last
line making the first line "Short name |". This change removes that
stray "|".
* Process markdown and other allowed formats (see FORMAT_XXX) in get_label_name
so it does not display it as a litteral string in the course index menu.
This handles things like site policies, which store the current URL,
redirect to the policy agreement, then redirect back the current URL
afterwards. In such cases, we want to redirect back with 'launchid' set
so that we can fetch the id_token from the session cache. This is the
same thing we already do during account binding, so the patch only
makes sure the PAGE->url is properly set before calling require_login.
Now that it has been decided to backport php82 to Moodle 4.2.x, we
can already fix the php versions to be checked by the coding
standard (they were previously open for the branch).
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In these cases, mod_assign was treating other unrelated objects as its
personal object store. These have been updated to not require this.
Ensure we don't create nested <script> tags when rendering templates,
which triggers console errors since 1ef815cd.
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
Changes done to fix the warnings thrown in the history view when the
last version of a question is deleted and improved UI to display the
message and a Continue button, to navigate back to the Question bank.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
At the test_transaction_with_events() I changed $this->_called into $called local var,
since the $called is used inside the anonymous function I added the third param as
a variable passed by reference so the last assert can get the newest value.
Replace steps that manually add page instances via the UI and use
Behat generators. This improves the speed of Behat test runs.
Co-authored-by: Simey Lameze <simey@moodle.com>
The property was added to the config options in c3f4123b, however no
default value was provided, meaning if it was ever unset then a PHP
type error would be triggered on the null return.
If an activity, like workshop or forum, has multiple grade items,
declarative binding of the grade item (line item) isn't supported.
Instead of throwing an exception, handle the case more elegantly
and just omit the 'add to gradebook' option for these activities.
Converting these tests to use an onlinetext submission and drop the JS
requirement means that they are much less susceptible to runtime issues,
and not susceptible to those caused by JS at all.
This random failure was happening because of the time required to render
and interact with the file picker which sometimes exceeded 2 seconds,
depending on the speed of the machine running the tests.
Converting these tests to use an onlinetext submission and drop the JS
requirement means that they are much less susceptible to runtime issues,
and not susceptible to those caused by JS at all.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
If a statically accelerated cache returns an empty array then the value
was still fetched from the non-static cache store.
The check of the `$result` should be strictly checked against `false`,
which is the value used if no value was found.
When creating a course, a manual enrolment instance is added by default. The instance settings should inherit the values of those
for the manual enrolment plugin and properly calculate its extra settings. The 'expirynotify' setting wasn't inherited correctly
in case it had 'Enroller + Enrolled' value.
A functional test was added to test the behaviour of settings inheritance.
For backpack connection using OBv2.0, email and password can't be
blank.
This patch adds some extra checks to validate this and displays an
error to the users before trying to connect to the backpack.
Besides, the error displayed when any error is returned by the
backpack (like invalid credentials), has also been improved, to
make it clearer for the users.
The missing version bump caused cache configuration to not be updated,
and the static acceleration cache size was therefore not updated. The
result here was that the static acceleration cache was constantly
emptied leading to an increased page load time.
Import now checks whether assignment is an group submission and
matches group ids instead of user ids in that case.
Additionally check for original unchanged files to not import in
group files instead of user files.
MDL-45580 introduced the readonlypages filearea, and when loading
page images for an attempt, the code would check if the pages existed
, creating them if not. The code inside this block also contained
a guard clause for the case where no readonly pages existed - which
is a situation that should not happen. Whenever readonly pages are
requested, they should exist.
MDL-66626 introduced a situation where page counts not matching would
also retrigger page generation. However this led to a situation where
the guard clause could be entered when requesting readonly pages.
This patch refactors the guard clause, and improves the logic to
regenerate pages.
When requesting the readonly version of pages (which contain
teacher annotations), they should always be available - the
PHP side even throws an exception when they're not. This
means we don't need to worry about polling document converters
from the JS side and can just return the pages immediately.
The behat step "I draw on the pdf" creates the exact same line every
time it is called. This can cause issues in a situation like the following:
- Student uploads PDF
- Teacher annotates page 1
- Student edits submission, adding another PDF
- Teacher annotates page 1 again
- When the student looks at their annotated PDF it appears the same as
before they added the second PDF (i.e., they don't see extra pages for
the second PDF)
Exactly why this happens isn't clear, and in practice this probably never
happens because the chances of drawing the exact same line twice are almost
0. However, when testing the functionality added in MDL-45580 it was causing
issues.
Only call user_update_user when the relevant user data has changed,
preventing unnecessary user_updated events. This also removes the
line setting timemodified on the user since user_update_user already
handles this.
When receiving data from the LTI launch, or service call, only update
the user record when we know something has changed. This prevents the
creation of many \core\event\user_updated events.
This isn't required and generates excess events. The only thing update
does, other than update the user fields, is to update the picture, but
in this case, that's unset in membership-based auths anyway, so it's
entirely safe to remove this.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
This is as regression of MDL-72413, when description was moved to a
standard module API.
In some cases, when description has only images, it's was not
displayed.
This is a regression when the activity pages were redessigned in Moodle
4.0. The default introduction should be displayed when the activity
description is empty.
This commit does few things:
* Unify data generators usage to role short name.
* Replace remaining manual steps to use the new data generator.
* Also replaced other manual steps to set config to use data generators.
* Tidy up of some tests, aligning pipes and splitting one line steps into multiple lines.
* Fixes tests to have one Given/When/Then per scenario.
If a plugin attempts to do something that would lock coursemodinfo cache
during install (such as creating a course module), this currently fails
as check_lock_state is not implemented in cache_disabled. Adding the
cache_loader_with_locking interface ensures that all lock methods are
implemented.
If the content in Atto is wrapped by an element with only a background color, without text color,
the accessibility checker will use the parent text-color as the foreground color, which is owned by form-control,
it becomes a problem if the wrapped element background using #34274f and the parent text-color is #495057 then
the low contrast as a result.
To avoid such a situation, the patch will only calculate color contrast if only the element has text,
so it will give results per element if the accessibility checker is unsatisfied.
If the content in Tiny is wrapped by an element with only a background color, without text color,
the accessibility checker will use the parent text-color as the foreground color, which is owned by form-control,
it becomes a problem if the wrapped element background using #34274f and the parent text-color is #495057 then
the low contrast as a result.
To avoid such a situation, the patch will only calculate color contrast if only the element has text,
so it will give results per element if the accessibility checker is unsatisfied.
The patch also changes the selected element from 'body > *' to 'body *',
so it will return all elements (parents and children) in the content instead of parents only.
And minor modifications on the warning_content.mustache to fix the numbering format.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
To make Moodle 4.2 compatible with PHP 8.2 regarding the deprecation of dynamic properties,
several changes have been made from version 5.22.5 (https://github.com/adodb/adodb/compare/v5.22.4...v5.22.5) and
then applied the changes to Moodle 4.2.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
Removing the existing $id property at portfolio_format_leap2a_writer, because
the $id only needed inside the __construct().
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
Adding @runTestsInSeparateProcesses and removing setUp() and tearDown() at the
component_test.php, so the test will run in a separate process making sure that
whatever changes happen to the in-memory version of the component class in its thread,
therefore does not impact other tests and makes it more safe.
This commit makes the following improvements to mod_imscp tests:
* Removes unnecessary @javascript and @_file_upload tags from non-JS tests.
* Removes user/enrol data generation from tests that can be performed as admin.
* Removes "I log out" and other unnecessary steps.
In this commit, the following improvements were made to the mod_lti Behat tests:
* Replaced manual steps with data generators to set completion.
* Eliminated unnecessary user and course enrolments data generation as some tests can be performed as an admin.
* Removed the @javascript tag from non-JS tests.
* Updated the LTI data generator to generate an internal Moodle URL in the toolurl field, enabling the use of XML files.
This feature had lots of small issues and it made sense to fix it whilst
investigating a query:
* most of the steps do not require JavaScript
* it uses the UI to set an admin setting, for every scenario:
** only 3-4 of the scenarios actually test that setting
** it is very slow to do it his way when we have a generator step we can use
* we create two assignments in the Background, but each test only uses one of them
* we create the assignments in the Background with a generator, but
update them to modify various settings in each Scenario using the UI
when we should just create one assignment for each test and set it up
correctly for that Scenario
The feature added in 4.1 to lock the modinfo cache does not work when
using Redis, because:
* The API to acquire a cache lock is confusing, and the code did not
check that it successfully acquired a lock before going on to build
the cache anyway.
* Unlike the other types of cache lock, the Redis store did not retry
the lock for a timeout period before giving up and failing.
This change fixes both points.
It is perfectly legitimate to create and/or use a method named `define`
in JS outside of RequireJS.
Unfortunately our requirejs.php wrapper is dumb and does not understand
this.
In the long term we need to stop doing this at all. We really should be
able to already, but every time I try to something prevents it.
In the interim, this change adds a secondary check to see if there is an
existing define which _does_ have the right name in it already.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
Restoring multiple quizzes from a pre-4.0 backup was broken when
the quizzes shared a random question. This is because after the
first quiz created a set reference in place of the random question,
it deleted the question record so it was not there for the second
quiz to use. This change tracks the IDs of random questions so
they can be deleted at the end.
Several version checks were incorrectly using
restore_controller::info::moodle_release instead of moodle_version as a
version number. This replaces all of those checks with a common pair of
methods to make the checks clearer and more maintainable.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
// Removed test_add_malformed_favourite()
PHPUnit version >= 9.5 no longer converts PHP deprecations to exceptions by default.
To comply with PHP 8.2, which will deprecate the dynamic properties,
we need to remove test_add_malformed_favourite()
because the test will raise a warning for dynamic property deprecations.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
Course date registration data reports correctly.
MDL-77306 added a count of how many courses there are
without start and end dates. However, all courses have
a start date, it is only the end date that is optional.
This patch fixes the data collection and makes the lang
string describing it clearer.
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).
Previously, a set of calculated quiz statistics would only 'last' for
15 minutes. Then they would be considered invalid and not used.
Now, computed statistics are kept indefinitely. Instead, when a new
batch of values are computed for a particular set of settings, older numbers
for the same settings are deleted first. Therefore,
question_stats_cleanup_task is no more.
Previously, when users viewed the question bank, if the quiz statistics
had not already been calculated, we would try to compute them there an then.
This could be very, very slow, leading to session lock problems.
Now, we never try to compute the statistics on the fly. Instead, we rely
on the existing \quiz_statistics\task\recalculate scheduled task to do it.
There is a new method on the column class, for the column to declare any
statistics it requires. The question then efficiently loads all those
statistics in one go, and makes them available as the columns are
rendererd, or do any subsequent processing.
According to Boostrap Popovers documentation for popovers triggered
on focus:
"For proper cross-browser and cross-platform behavior, you must use the
<a> tag, not the <button> tag, and you also must include a tabindex
attribute."
This test apparently fails sporadically on Oracle, without obvious
causes. The failure however was hard to interpret, and the test
itself made a lot of assumptions about the system re. naming of
categories/courses. This could be prone to errors, so improve that.
When the H5P third-party library was upgraded to moodle-1.23, the calls to
libraryToString(xxx, true) where replaced with libraryToFolderName().
We missed this, which was doing the H5P Timeline activities weren't
displayed properly.
Thanks Joseph for raising this and preparing a patch! Well done!
Co-authored: Joseph Rézeau
Recent additions to timezones from the IANA TZDB are not necessarily
reflected in those used by the intl extension and/or ICU zones:
* America/Ciudad_Juarez
* America/Nuuk
* Europe/Kyiv
* Pacific/Kanton
Create mapping to allow these zones to be used without errors.
The apiBase in .well-known/badgeconnect.json was ignored and it was
causing some failures when connecting or sending badges to an
external backpack.
For OBv2.1, it has been changed to always use the apiBase defined
in the badgeconnect.json backpack provider.
Right now the order of the groups returned by groups_get_user_groups()
is not fixed and, every DB, can return them in any order. While 99%
of times the order will be the creation one, depending of the RDBMS
decisions, they can be returned in any order.
This is specially noticeable with Oracle, but can affect to any DB.
And that makes some tests (expecting a given order) to fail.
This commit fixes the problem by making the order of the groups
deterministic, because that's the way we use to fix these problems.
Alternative is to relax the tests so only values are asserted by
using assertEqualsCanonicalizing().
If the enrolment instance (the 'published resource') has been upgraded
from LTI 1.1/2.0 to LTI 1.3 (i.e. a new instance was not created),
prevent legacy launches which may occur from old resource links. Only
LTI Advantage launches should be permitted through the method.
If the enrolment method is updated from an LTI 1.1/2.0 tool to an LTI
1.3 tool, it may have associated enrol_lti_users records not having
ltideploymentid values. These are legacy users and must not be returned
by the repository, which deals only with LTI 1.3 LTI users.
Random failures after manually adding block instances (specifically
on slow/Oracle systems) can be entirely avoided by using the block
test generator for scenarios that are not specifically concerned with
manually adding blocks.
While the uses here were not causing too much problem with PHPUnit
execution in any OS, better have them explicitly closed to better
serve as reference for other, future uses anywhere in codebase.
Always that a stream is used, better we close it as soon as possible,
not relying on destructors, gc and friends.
And do it as soon as it's not needed any more. Else, only
_destruct() / shutdown / gc will, and that can be problematic
if many streams are open, or, under some environments like
Windows that consider the stream underlying files still busy,
because they have not been closed.
Although the screenshots in the failures for some of the scenarios in
filter/displayh5p/tests/behat/h5p_filter.feature, like "Render a local
H5P file as teacher" were displaying the expected result, there were
some javascript errors (probably due to behat is quicker and the
iframes were not always ready).
I've added one extra step before accessing the iframe to give more
time to the H5P player to load and confirm the page is displayed
properly.
* The object returned by update_question is alwasy a new clone
and the $question passed in will not be modified.
* The returned object has the fields like questionbankentryid and
the ones related to versionning, so it is more like the data
returned by question_bank::load_question_data.
The used the exist in Moodle up to 3.11, but then was removed with
insufficient thought in 4.0 (because we had grander long-term plans
which still have not happened). Until those plans happen, this
commit adds the simple link back on the preview screen.
When the two restore forms for searching courses and categories were
converted to core templates in eb9935c9 they lost the named submit
button, which broke searching.
The widgetbase module was intended to be a generic search widget,
despite its location in grade/amd/src. As such, other modules may
depend on this. This was modified in MDL-76246, which added new
requires params to the js, and changed the js to expect certain new
data attributes in the templates. This broke b/c for existing
dependents.
This patch makes sure the existing uses of the basewidget continue
to work by adding b/c code. See MDL-77991 which deals with deprecating
this search widget and replacing it with one that just implements the
desired combobox logic, without the b/c code. That issue should also
make it abundantly clear that this widget is for public consumption.
When we deprecate the use of a file, we often include tests which ensure
that the legacy behaviour is maintained. There are also legacy uses
in the community where people would like to use the deprecated API for a
period.
The issue that we face is that, if the deprecated file is included once,
then it will be included for all other, unrelated, tests. This means
that other tests may not detect cases where the deprecated file was
included.
We can solve these cases by running the test that performs the inclusion
in a deprecated process. This means that the inclusion is only performed
in that isolated process, and other unrelated tests do not include the
file.
However, we also then need to detect which files which are including the
file and which we do not know about.
This change introduces:
- an override to the TestCase::setInIsolation method to define a
constant when the test is running in isolation
- a new function that a file can call when it is included, to make sure
that the test process was isolated, where there is any test.
Move the fixed assignment removal upgrade code to the end of the upgrade
script as a new upgrade step. Already upgraded sites with mod_assignment
removed should just be able to rerun this without any issues.
When an editor is renderer initially invisible to the browser, e.g.
the forum "Add discussion" form, it has a `clientHeight` value of
zero. We can approximate an alternative value based on the number
of rows in the textarea.
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
Previously the content of the stored file was extracted and stored in a
variable, passed around, and then submitted to MoodleNet. This results
in very high memory consumption when dealing with MoodleNet.
The stored_file should be passed around as a first-level param to
discourage this, and the content should _never_ be loaded into memory.
Instead file streams and resources should be used to allow Guzzle/Curl
to buffer the file from disk/other storage straight to MoodleNet.
This change introduces a new get_psr_stream() method to:
* stored_file
* file_system
This allows us to fetch a Psr Stream implementing the
PSR\Http\Message\StreamInterface and pass it into Guzzle, which means
that there is no need to load the entire file content into memory to
serve it.
We shouldn't invent fileareas with invalid values (specifically in
this case, the `itemid` overflowed maximum length of the field on
Oracle).
Given the generated file is transitory in nature, instead store it
in the users draft area.
It's possible to have some Moodle components soft linked instead
of being real directories within codebase (within dirroot).
For example, Composer's "vendor" directory can be soft linked
(from elsewhere), or also plugins can be installed using soft
links.
In those cases, Moodle calculates the $SCRIPT global as null. And,
then, string operations on it are emitting a PHP deprecation message
with PHP 8.1 and up.
This fix just ensures that the behaviour is the same than before
PHP 8.1, aka: ltrim(null) = '' (empty string), without any PHP warning.
This makes it possible to share a single activity to a MoodleNet
instance (which has been enabled for sharing in site admin).
This utilises the core\moodlenet\activity_packager to create an
activity backup, then sends it using the MoodleNet create resource
API specification.
Originally implemented as MDL-75932
This makes it possible to package a single activity as a Moodle backup
file, excluding user data so it is ready to be shared as a MoodleNet
resource.
Co-authored-by: Michael Hawkins <michaelh@moodle.com>
Originally implemented as MDL-75932
The icon's iconclass context data adds additional CSS class(es) to
calendar event icons to better control how the event icon is displayed.
e.g. without filtering for activity events that don't hae monologo
versions of their icons.
Ensure the same heading tags are available as those defined in the
editor block formats configuration (c51b7e2c).
Co-authored-by: Andrew Nicols <andrew@nicols.co.uk>
From Selenium 4.8.0, support for non-w3c browser control has ended.
We only use W3C browser control these days, and this was missed as part
of the move to W3C. All browser options must be vendor-prefixed.
In MDL-77086 some extra information was added when a badge can't be
sent to a backpack. However, as the Badgr is not following the
specification, it's still hard to debug it when it fails (as
raised in MDL-75552, Badgr is not working because, in some cases,
it's returning the "Method Not Allowed / Request method 'POST'
not supported" error.
In some cases, $CFG->lang might not be set, and this is causing a
Notice to be displayed when, for instance, database connection fails.
This patch should fix this case.
- Only resize if the H5P EmbedCommunicator is defined (otherwise, it was causing a
JS error)
- An unnecessary image has been removed from the greeting-card.h5p fixture package.
That way, the text will always be displayed (even if the iframe is still not
resized). Instead of replacing the original greeting-card-887.h5p file, I've
renamed it to greeting-card.h5p, to remove these ugly and unnecessary numbers
at the end of the file name).
To temporarily prevent the PHP 8.2 warning about Dynamic Properties' deprecation,
the #[AllowDynamicProperties] property was added. We encourage anyone to perform the upgrade
as soon as the Google library complies with PHP 8.2.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
While working on this issue, even though it's not related to the deprecation issue,
I added 'use core_external\external_api' to avoid the 'Undefined type external_api' warning at
mod_lti_testcase::generate_tool_proxy().
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
We should be proactive in ensuring that the environment is clean when
running a task. We already ensure that we have a clean renderer and
other parts of the output chain, but we were not setting a clean user.
This change adds a call to setup the cron user before each task is
actually executed.
The main goal of this issue is to avoid scanners (Dependabot
and friends), reporting about security issues with the current
xmldom 0.6.0 package.
Note that this doesn't affect prod at all, because it's a dev
dependency, hardly exploitable. So it's not a security fix, just
a security_benefit, if something.
So here, we are updating from xmldom 0.6.0 to @xmldom/xmldom 0.8.7
(note that the package was renamed in 0.7.0, so it's the very same)
Also, when proceeding with the changes, it was detected that we
are incorrectly declaring @babel/eslint-parser as a normal dependency
instead of a development one, so we are also fixing that little detail.
The commands executed to get the changes above applied have been:
- nvm use
- npm install @xmldom/xmldom@^0.8.7 --save-dev
- npm uninstall xmldom
- npm install @babel/eslint-parser@^7.17.0 --save-dev
(we haven't run a complete re-install because we only want to modify
the minimum possible at this stage).
When questions are filtered by tags in the question bank, the qtagids
params are passed in the array format. Though moodle_url handles this,
single_button::export_for_template cannot. Hence changes done in
weblib.php to provide params for export_for_template in the
suitable format.
Thanks Huong. I have added the Behat test you provided in the patch.
The YUI Overlay widget encloses the subquestion feedback in a div
which causes a div element to be enclosed in the subquestion span. This
leads to an accessibility issue in terms of HTML parsing as inline
elements (span) should not contain block elements (div)
The YUI Overlay widget is also not accessible as it does not really hide
the overlay contents via aria-hidden when the overlay is not being
shown. It's better if we stop using this and use Bootstrap's
popover component which is more accessible by default.
This patch also removes module.js for the qtype_multianswer plugin as
it only contains codes related to rendering the feedback contents in the
YUI overlay widget which is no longer necessary.
- Table cells are top-aligned
- Cell paddings changed to 10px
- In the header row, the user detail cells don't wrap but other cells do
- Grade item names wrap when they are long
- Action menu button for the grade cells does not go to the next line
when the cell is not in the header row
- Heading cells in the footer row are right aligned
Use native ANSI SQL syntax for numeric comparisons where possible,
define filter API for the case where filters must re-use the given
field SQL while ensuring uniqueness of any field parameters.
Currently only necessary in the category filter type.
* CLI adhoc_task.php: new option --taskslimit
* CLI adhoc_task.php: --execute option is implied when other options are given
* core\task\manager::get_next_adhoc_task(): new param $number
for limiting number of tasks to run
* CLI adhoc_task.php: new option --id
* cron::run_adhoc_task($taskid) for running tasks by id
* core\task\manager::get_adhoc_task($taskid) for retreival/locking
The restored states should be treated differently, to avoid resetting
them by default the first time users access them.
In that case, the first time users access to content with restored
xAPI states, they should be displayed (instead of resetting them).
The 'Content state is removed when an attempt is created' scenario
is failing randomly because the content for the student2 was not
always saved. Some extra steps have been added to give more time
to the player to save contents and also to check it has the
expected value.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
This adds "core_question > updated question" as an entity for `the
following "X" exist` and calls the existing update_question() generator
which will create a new question version with the supplied data.
This works by always outputting both the customised and uncustomised
number into the HTML of the Questions page, then uses CSS & JS to
show the appropriate one as shuffle is toggled.
The `filename` field was only used by each to determine whether the
file was itself a directory, and it's presence meant that aggregation
of each column wasn't working properly.
Adding LIMIT to the primary auth type SQL statement does not play well
with Oracle. We can just remove the LIMIT clause from the SQL statement
and and pass IGNORE_MULTIPLE to the call to $DB->get_field_sql()
instead.
When a new attempt is created, the previous state content is removed.
There was a bug which was removing all the content data of a given
activity for all the users (instead of deleting only the content data
for the current user).
To prevent future regressions some extra checks has been added to the
bulk_select feature file. The new checks validate the activities and
sections bulk selectors are really selected, not only the total count.
AMOS BEGIN
CPY [type_contentbank,core_plugin],[type_contenttype,core_plugin]
CPY [type_contentbank_plural,core_plugin],[type_contenttype_plural,core_plugin]
AMOS END
When fetching the list of tasks to run, we were using the _process_
start time as a base. The various task fetchers (adhoc and scheduled)
only fetch tasks which were due to run _before_ this time.
With the new keepalive setting, we need to pass both the process start
time, and the run start time. We need to use the process start time to
determine whether MUC caches have been cleared since the process
started. but the run start time to fetch recent runs.
The Assignment 2.2 activity module was disabled in 2012 but kept to
enable pre-2.2 backups to be restored and have the assignments
auto-converted to new assignments. After almost 10 years, it's time
to remove it from Moodle core.
After checking the the relation between mod_assign and mod_assginment,
it was found that upgradelib.php was only used/called from the
mod_assignment. Therefore, it was decided to move the upgradelib.php
from mod_assign to mod_assignment and deleted the line in which requires the upgradelib.php
* Recording formats should not be accessible to students unless specified as safe
* A global setting will now list all the "safe" formats for students
* A new capability 'mod/bigbluebuttonbn:viewallrecordingsformats' will allow users to
see all formats (as long as they can manage recordings also)
This test is adding table rows into an HTML editor and, quite rightly,
is failing under TinyMCE.
This only worked under Atto because Atto does not perform any HTML
validation. A user would not actually be able to insert the template
content this way, and therefore the test is/was invalid.
This change disables the HTML editor before inserting the template
content, which resembles the actions of a real user.
This install script has not been required for a number of years because
we require the previous LTS for an LTS+1 upgrade. Once Atto was
part of core after an LTS release, it was safe to remove this file.
This is now preventing Tiny from becoming default for new installs in
some situations.
* The file file_remove_editor_orphaned_files should take into account URL that
have been embedded in a tag content instead of an attribute (like src attribute)
* This will fix issue with inserting H5P content in calendar events.
Add the DB type, count of courses with start or end dates set,
default site theme, and primary auth type statistics to those
collected as part of the site registration data.
MDL-76499 revealed a few problems with resource generators:
1. We were not covering with unit tests the upload of files from disk
(and here it's where the problem was).
2. There was a little of confusion between disk paths (only needed
to upload files) and file_area paths (the generator only creates
or uploads files to the root directory of the file area.
3. It was possible to request the upload of a file to the generator
without that file effectively existing.
This commit fixes those points and covers 99% of the generator code.
This is a workaround for an upstream bug which I have not been able to
reproduce outside of Moodle whereby the editor.contentWindow does not
match the editor.iframeElement.contentWindow when it should.
This issue only seems to affect Firefox, and it may even be a bug in
Firefox. It can only be reproduced when using a fresh browser which has
never had a TinyMCE window open.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
When rendering content items, check whether the plugin has monologo
icons. If so, add a 'nofilter' class so the plugin icon can be
rendered as is and without the CSS filter.
Add the `.nofilter` class for activity icons when the icon URL's
`filtericon` parameter is not set, so they get rendered as they are on
the timeline block.
Add the `.nofilter` class for activity icons when the icon URL's
`filtericon` parameter is not set, so they get rendered as they are on
the recently accessed items block.
Add the `.nofilter` class for activity icons when the icon URL's
`filtericon` parameter is not set, so they get rendered as they are on
the context header on the activity page.
Add the `.nofilter` class for activity icons when the icon URL's
`filtericon` parameter is not set, so they get rendered as they are on
the course homepage.
* Apply the filter CSS property only to activity icons
that don't have the ".nofilter" class. This will allow
activities with non-SVG icons to be rendered as they are.
* If a plugin defines a `filtericon` custom data or uses its monologo
version of the icon, a `filtericon` parameter is being added to the
icon's URL. This information can help plugins determine whether to
render the activity icon as is or with CSS filtering.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
At certain cases I didn't see a tick in view mode. For example
when I click grades only and then switch to totals only a tick
next to total only was not shown. I think this is caused since before
mode was changed in circlurar order i.e.
fullmode->grade only->aggregate only->fullmode. But now any order is
possible so we need to respect it
The step i_enable_plugin cannot be used as bigbluebuttonbn_default_dpa_accepted
setting needs to be enable in order for the BigBlueButton plugin to be enabled.
* Unify the fields_action_bar and action_bar template
* Make sure the Create a field button is a primary button
* The fields_action_bar is very similar to the action_bar template so
should be used instead
Not critical to have, but better don't mention it. Note that all
the cases need to stay because there may be other environments
where the same problems are reproducible.
Only exception is the CURL_SSLVERSION_TLSv1_2 constant, that
can be safely removed because it's available since PHP 5.5.19.
Agreed @ MDLSITE-7135, this completely removes the Travis CI
integration with a note in the lib/upgrade.txt file, pointing
to the currently supported GHA alternative.
* get_join url should not have as many parameters as they can be deduced from the instance.
* Refactoring it will allow to pass on more implicit parameters like the user profile file.
MDL-69087 added an option to let themes personalize the H5P styles.
This patch implements the h5p_alter_styles() method in boost, to
let admins personalize the H5P styles using the 'Raw initial SCSS'
and 'Raw SCSS' theme settings.
That way, users won't need to create their own themes to define
some styles for the H5P player.
- It was a mistake to assume the listbox is always within
combobox.parentElement
- Take into account that the popup of the combobox is not necessarily a
listbox
- Update combobox fix so that it also work with comboboxes that are not
select-menu
- Update combobox fix so that it also support editable comboboxes
- Update click listener to take into account that the event's target
might be one of the option element
- Having a hidden input element for comboboxes was not an ARIA
requirement and was added by us. I added data-input-element to the
combobox element to specify the input element related to it.
Ensure that when the user entity is added multiple times to a report,
when there are custom profile fields, each of those gets a unique table
alias per-entity.
Evaluated usage of "Install selected language pack(s)" in Behat and
replaced the steps to use generator to install language packs as part
of test setup.
- Filter searchable courses if set.
- Sites with large groups should now experience better performance.
- Applies and optimises query against a proper date range.
Co-authored-by: Mark Sharp <mark.sharp@solent.ac.uk>
Co-authored-by: Peter Sistrom <petersistrom@catalyst-au.net>
Co-authored-by: Kevin Pham <keevan.pham@gmail.com>
Most section related actions require the frontend to use alternative
strings depending on the format plugin lang file. This patch adds
overridden strings to the current setViewFormat course editor setup
object.
The new Font Awesome version needs some changes in the way icons
are displayed from SCSS files:
- The atribute 'content: "\xxx"' needs to be converted to
'content: fa-content("\xxx")'
- The style must be declared. The regular is used by default, so all the
solid icons needs to add '@extend .fa-solid'
- @include fa-icons() is not required anymore (if used, the icons
are not displayed properly).
While working on this issue MDL-76931(Upgrade core-js-bundle),
we need to convert a HTMLCollection like .children to an array to use forEach(),
so we can upgrade the core-js to the upper version.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
After upgrading the Font Awesome from 4.7 to 6.3.0, the moodle.css
file is bigger than before, so a few behat tests related to the data
export (where the moodle.css file is included), need to be updated
to meet the new size.
This patch updates the Font Awesome library version from 4.7 to 6.3.0.
The readme_moodle.txt has been updated properly because the new version
works slightly different.
There is a file to add backward compatibily to version 6 files (shim).
More information about how to upgrade from 4 to 6 can be found in
https://fontawesome.com/docs/web/setup/upgrade/upgrade-from-v4
Although a few icons have been renamed in Moodle 6, as the new version
is compatible with v4 icons, for now the references to the old icons
(fa fa-xxxx --> fa-solid fa-xxxx) haven't been changed yet.
A separate issue will be created to update them in the future and
review if some new icons can be used too.
Following MDL-65835 this now finally deprecates and removes the
functions:
- plagiarism_save_form_elements(), please use
{plugin name}_coursemodule_edit_post_actions() instead
- plagiarism_get_form_elements_module(), please use
{plugin name}_coursemodule_standard_elements() instead.
- plagiarism_plugin::get_form_elements_module(), please
use {plugin name}_coursemodule_edit_post_actions() instead.
- plagiarism_plugin::save_form_elements(), please use
{plugin name}_coursemodule_standard_elements() instead.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
In the quiz reports, for any 'Never submitted' attempt, there is
now a 'Re-open' button next to where it says the attempt state.
If that is clicked, there is an 'Are you sure?' pop-up. If the user
continues, the attempt is reopened. If the student now has time left,
the attempt is put into the In progress state. If there is not time
left the attempt is immediately submitted and graded. The
'Are you sure? pop-up says which of those two things will happen.
This allows an availability plugin to indicate that a selected condition
should be considered "private", and therefore should never be shown to
users who don't satisfy the criteria. The availability_groups plugin
uses this to protect visibility of groups that are not visible to
non-members.
These new settings are designed to enchance user privacy surrounding
groups. They allow groups to be configured so that users outside the
group cannot see the group, so that users in the group cannot see each
other, or so that users cannot see the group at all, even if they are in
it. This avoids issues where a group may be assigned based on sensitive
personal information (such as a person requiring special arrangements
due to a disability).
By default, groups are visible to all and available for participation in
activities, which maintains the current behaviour.
For performance, a new cache has been added to track the number of
groups on a course that are not visible to non-members. This allows us
to revert to the existing behaviour if the new features are not being
used at all on a course, and only apply the new visibility conditions if
they are.
Users who have the moodle/course:viewhiddengroups capability should be
concious of exposing hidden groups when showing their screen to other
users. The "Switch role to..." feature can be used to show a course page
on screen without exposing private availability conditions, for example.
The changes cover several specific areas:
* grouplib functions, which most code should use to get lists of groups
and members (this includes the participants page).
* Activities supporting group overrides will not allow overrides for
groups that are hidden from all users.
* Activities supporting separate/visible groups modes will only allow
groups with the new "participation" flag enabled to be selected.
* Group messaging will be disabled for groups where members cannot see
each other, or cannot see the group at all.
The previous behaviour guessed the table filterset based on the table's
class name, but this is not very flexible if you wish to create an
abstract table class and use a generic filter for all implementations.
This change adds the ability to specify the filterset class, with the
default behaviour using the table class name as a prefix.
A new grunt task, upgradablelibs, has been added in order to get the
list of libraries that have a newer version in their repositories.
Co-author: Andrew Lyons <andrew@moodle.com>
If for any reason a Redis session lock is not being released, all subsequent
requests will wait to acquire the lock, forcing them to time out eventually.
This will happen till the original lock finally expires after the session timeout.
This sets the Redis session lock expiry time to whatever is lower,
either the PHP execution time `max_execution_time`, if the value was
defined in the `php.ini` or the globally configured `sessiontimeout`.
Setting it to the lower of the two will not make things worse it if the
execution timeout is longer than the session timeout.
For the PHP execution time, once the PHP execution time is over, we can
be sure that the lock is no longer actively held so that the lock can
expire safely. Although at `lib/classes/php_time_limit.php::raise(int)`,
Moodle can progressively increase the maximum PHP execution time, this
is limited to the `max_execution_time` value defined in the `php.ini`.
For the session timeout, we assume it is safe to consider the lock to
expire once the session itself expires.
If we unnecessarily hold the lock any longer, it blocks other session
requests.
Co-authored-by: Daniel Ziegenberg <daniel@ziegenberg.at>
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
When a test runs just after midnight, and the user time zone is not the
same as the server timezone, and the course is created using a generator
(which runs in server time zone) but the UI presented in the user
timezone, the course start time is still in the future.
We need to create the course a day earlier to ensure that the "This
week" indicator is in the correct day.
- Use span instead of dummy input elements because form elements need a
label
- Sufficient size for target is at least 24px by 24px (Success Criteria
2.5.8)
* Have the following classes extend qtype_essay_format_renderer_base
as they have been meant to:
- qtype_essay_format_editor_renderer
- qtype_essay_format_noinline_renderer
- qtype_essay_format_plain_renderer
* Add a question_display_options instance variable for
qtype_essay_format_renderer_base so its subclasses can use it to
generate the label for their respective answer fields.
* Add the question number to the answer fields if it's available.
* Improve multiple choice question accessibility:
- Label the multiple choice question groups appropriately by
enclosing them in fieldset tags and applying sr-only legend tags to
label them.
- Apply Bootstrap form-check classes to the radio buttons, so they
are rendered better and become responsive as well. This also helps
avoid the use of the table element for layout purposes when
rendering horizontal multiple choice sub-questions.
* Add an instance variable to question_display_options to store the
identifier associated with the question being rendered.
* This information can be used by question type plugins to improve the
accessibility of the answer fields being rendered by adding the
question identifier to the answer fields' labels.
* Adding the question identifier to the label can be achieved by using
question_display_options::add_question_identifier_to_label().
Co-authored-by: Tim Hunt <t.j.hunt@open.ac.uk>
- set the role of table to none
- moved aria-label from <table> element (that doesn't has role="none")
to the element that has the radiogroup role
- if it's not radiogroup/radio, it is list/listitem
- removed aria-label from the rubric table and used caption instead
Simple JSON reader which takes an issuer and reads its metadata. The
class is aware of request-centric rules, such as:
- The position of the well known suffix in the URL (per RFC8414)
- The requirement to have HTTPS auth server issuer URL
- The validity of query strings, paths and fragments in the auth server
issuer URL
,but makes no attempt to validate the config JSON returned.
This is very similar to MDL-77090, but at the time, I missed that this
also needed to be handled. (Question metadata is, I think, only used
by the quiz 'Try another question like this one' feature.)
Some behat scenarios were using labels with links to access some
specific PHP files.
Now that labels are also displayed in the course index, the region
needs to be defined in the step to access to the expected link
(otherwise, the one in the course index will be used).
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
When clicked, disable the "Edit mode" button just before doing a
redirection. It's been reported that after clicling several times the
button, an inconsistent state between the button and the editing mode is
achieved. The patch mitigates the issue.
Some extra options have been added to the activitychoosertabmode setting, to let
admins decide when to display the Recommended tab.
Apart from that, one of these values have be set as default value for this setting,
as suggested by the UX/PX teams. So the Starter and Full presets have been updated
too with the new values.
There is a Pull-request from Tim Hunt to the project in GitHub
(https://github.com/matthiasmullie/minify/issues/317) but, for now,
as it hasn't been applied yet, we need to manually cherry-pick
this change.
Enabling the course copy UI of MDL-64843 already without the capability 'moodle/course:view'
has the advantage, that a user with 'moodle/course:create', 'moodle/backup:backupcourse'
and 'moodle/restore:restorecourse' (typically a teacher)
will be able to use this UI for their own courses and with the additional benefit
of also being enrolled in the copied course.
Important: the role assigned to the user who copies a course is determined
by the value of the setting 'creatornewroleid', which defaults to 'editingteacher'.
* When the server is not reachable (or recordings are not reacheable)
the recording is set to RECORDING_STATUS_DISMISSED and is then
not visible in the list.
* Add a CLI script to solve potential issue with DISMISSED recordings
We now include more polyfills than we have ever done, and some of these
cause false-positives on our code to address modules which do not have a
name.
We started adding module names to modules in Moodle 3.8 at _build_ time
and kept support for modules which were not transpiled using Babel
before that point.
We no longer need to support this as all pre-3.8 Moodle versions are
long out of support. The most recent to go out of support was Moodle
3.5, which went completely out of support in May 2021.
We should not support code written and minified without a transpilation
phase from this time any longer.
When we unlock completion criteria and save changes 'viewed' criteria
still should be completed if user has viewed activity before. Seems
that that was broken by recent changes. Fixing here.
For hidden grade items we used to mark students as completed if
they have any grade. But this was not working correctly when we
also set pass grade for activity and completion criteria based
on pass grade. So we will have these completion states
Competion criteria 'Receive grade':
No grade - COMPLETION_INCOMPLETE
Grade visible, achieved passing grade - COMPLETION_COMPLETE_PASS
Grade visible, failed passing grade - COMPLETION_COMPLETE_FAIL
Grade hidden - COMPLETION_COMPLETE
Completion criteris 'Receive passing grade'
No grade - COMPLETION_INCOMPLETE
Grade visible, achieved passing grade - COMPLETION_COMPLETE_PASS
Grade visible, failed passing grade - COMPLETION_COMPLETE_FAIL
Grade hidden, achieved passing grade - COMPLETION_COMPLETE_PASS
Grade hidden, failed passing grade - COMPLETION_COMPLETE_FAIL_HIDDEN
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
Co-authored-by: Tim Hunt <t.j.Hunt@open.ac.uk>
In PHP 8.2 and later, setting a value to an undeclared class property is
deprecated and emits a deprecation notice.
So we need to add missing class properties that still need to be declared.
Co-authored-by: Tim Hunt <t.j.Hunt@open.ac.uk>
Also:
* Fix some incorrect punctuation in two strings.
* Add a test to verify that this change does not cause a regression.
* Improve some PHPdoc comments.
Due to missing `AND k.script = 'rss'` condition, the query did not make
use of the existing script-value compound index defined for the table.
So it had to perform the full sequential scan for all rows when
searching for the token. This had serious performance issues on sites
with many users, especially in case on non-existing token / key.
Whenever some plugin is missing from disk but installed, the plugins
page (and the upgrade) shows them as "missing from disk". Still, the
code tries to do things with their directory that, now, is null.
That was silently defaulting to '' in previous php versions, but
php81 emits a deprecated warning. So we have to check for them.
Note: The original callback was incorrectly using the $PAGE output,
which cannot be relied upon in this callback. The best we can do here is
to add a notification to explain the situation.
This commit switches to a new custom version of Shifter which sees it
put on a massive diet.
Many of the standard Shifter features are totally unused by Moodle, but
they add dependency spaghetti. Some of those dependencies will start to
cause us issues as they have not been updated for a very long time, are
no longer maintained, and are no longer compatible with anything
resembling a recent version of NodeJS.
This resolves an issue identified in 77083 which identified that GitHub
hashes shouldn't be treated as repeatable.
Whilst GitHub have reverted this change, it's still worth making this
change.
Unregistered sites will now display registration form to admins
after every core upgrade. Non core upgrades will not trigger the
form.
Registration form will not show for sites that are not set to
public.
Allow the repository call to the web service method to complete before
re-directing, otherwise the call may not complete and/or races against
the page reload causing random Behat errors.
Since 0188af39 we've cached loaded reports, however there was an
edge case in those report sources that relied on the current user
as part of their own initialization (e.g. checking capabilities).
Co-authored-by: Marina Glancy <marina@moodle.com>
This is only randomly affecting to Moodle 4.2 with PostgreSQL 13
that, for some reason, returns the control to the script before
some files (.pid) have been deleted as part of the database
shutdown.
It seems that adding 1 second of sleep it's enough to workaround
that problem (there are examples of that in various Travis discussions).
So we are adding here 2 seconds, to ensure we are in the safe side
towards consistent passes. And we are applying the same strategy
also to the MySQL installation, just to keep them 100% parallel.
Right now, any E_DEPRECATED, E_USER_DEPRECATED error type leads
to exception in behat runs, because the behat error handled is
not aware of them. See MDL-38041 for the initial implementation.
We don't want that to happen and they must behave like other "low"
error types (notices, warnings...), that will be reported in logs
or output, but won't trigger any exception, so the test can continue.
This commit just adds those 2 "new" error types to the handler,
providing the very same behaviour for them than the rest.
Text elements must have sufficient colour contrast against the background,
restyling the link element when it is focused is to ensure colour contrast of at least 4.5:1
Following MDL-61880 you could turn on "Authenticate token requests via
HTTP headers" but not turn this off again. This change fixes this and
adds a Behat scenario to test toggling this checkbox is saved
correctly.
When a single template is reset, the string displayed in the modal should
not reference to "all templates" to avoid confusion, as it was shown in the
original prototype for the 4.1 database project.
Probably from historical reasons and because of layout of former Moodle
versions the container the feedback is situated in has 70% width and is
indented. In nowadays themes this looks weird and gives visual inconsistency.
Previously, it was possible to create drag-drop markers and onto image
questions without any drag items or drop zones. This was non-sensical,
and broke statistics calculations.
So, missing validation added, and random guess score calculation made
robust.
If you delete a file with a hash and then create another file with
the same hash, sometimes on EFS filesystems while trying to create
the new file, it returns true to the file_exists check even though
the file doesn't exist, but then fails other calls.
This change makes Moodle tolerate that behaviour.
When cache is disabled but temporary in-memory caches are allowed,
these were direct instances of cachestore_static with no loader, which
meant that the get_versioned and set_versioned functions did not work.
The reactive debug panel stops working when a new reactive instance is
created in the fly. This was not detected until the new dragf and drop
files into course uses a second reactive UI component in the same page.
A new developer setting that adds comments in the page HTML specifying
which template is used to render each part of the page. It can be set
form the site admin development tab and it is stored
as $CFG->debugtemplateinfo.
The get_items() and get_page_items() external methods should return
items only when the user has access. Otherwise, empty array for items
will be returned, with the exact error in the warnings parameter.
The component the audience belongs to is used by the cards exporter
for rendering the editing interface. Avoid duplication in determining
this value by defining appropriate method in the base class.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Since PHP 8.2, placing the dollar sign outside the curly brace is deprecated when
the expression inside the braces resolves to a variable or an expression.
Changes done to fix access order of attempts that need manual grading.
Changed button text from 'Save and go to next page' to 'Save and show next' to improve UI.
Move the construction of the useridlist $SESSION cache to when a key
is requested.
This stops the writing of $SESSION when backing up
or restoring mod_assign instances, which is neccessary since the
backup and restore scripts close the session when processing.
The session write_close was moved to the earliest point in the script
that does not modify the session. This is currently always after
$OUTPUT->header()
As part of a restore, the session is closed early so it does not
interrupt the users session during the restore.
Currently the restore controller rebuilds the course caches while
restoring. This inadvertently resets the navcache, which would edit the
session despite it being closed.
Because this tracker now adds logging for this behaviour, it means
restoring now outputs a debugging message as a warning.
To resolve the debugging message, the navcache is now reset just before
closing the session. This is allowed, since the caches are designed
to be volatile.
The script has been reorganised so that it closes the session as early
as possible, without causing session changes after close being logged.
In this case, after the table has been output it is OK to close the
session.
A snapshot of the session is now taken when write_close is called.
The session at shutdown is then compared to the snapshot. If changes
are detected, they are logged. This aids developers in seeing if
early session closes may be having unintended consequences.
Previously, newly added keys to the session were not detected. Objects
with the same properties were also incorrectly reported as different.
This commit improves this, and updates the unit tests to reflect the
new functionality.
In 4.0, the plugin name was added above their name. Based on the community
feedback and the research done by the UX team, this needs to be removed.
This commit removes the activity name when edit mode is disabled.
During request lifecycle ensure that column, filter and condition
persistents are only loaded a single time to prevent additional
database reads.
Provide invalidation method, used by the report helpers, to ensure
that the persistents are re-loaded appropriately.
Co-authored-by: Marina Glancy <marina@moodle.com>
Apart from applying the points described in readme_moodle.txt, the following
changes have been done too:
- The parameter $folderName from the method libraryToString() have been removed
and a new method, libraryToFolderName() has been added to the H5PCore API.
References to libraryToString() with the $folderName set to true have been
replaced to the new method.
- missing-main-library has been added and replaces in some cases to
missing-required-library.
- The framework saveLibraryData method must be called before saveLibrary
(h5p.classes.php file has been patched to leave the original order because
libraryid is required to save the itemid).
- The getLibraryId() method from H5PCore has been rewritten to use MUC, in
order to avoid PHPUnit failures.
Cache locking fails if the cache store supports multiple identifiers
(in core, the only two which do are cachestore_static and
cachestore_mongodb, so this is unlikely to cause severe problems).
The Preview questions icon shouldn't be displayed unless the user can
edit the feedback or access to the reports; otherwise, it's causing
confusion (especially when the feedback is not opened).
Replace the old course/dragdrop.js file (which was not even minimised)
to AMD modules and integrate them to the new reactive course editor.
From now on, a file can be drop over any course section, no matter if it
is in the course content or in the course index. It will also start
using the new process monitor to show the uploading state to the user.
In 4.0- version each time the course page is loaded the file handlers
are calculate din the backend and injected directly into JS using a json
encapsulation. With this new webservice the handlers can be obtained
directly from the frontend when needed.
This commit adds all the necessary CSS and logic to handle file dropping
into a reactive compoment. From now on, a reactive application can
handle both element drag&drop and file drop easily.
Create a new UI compoment to queue, execute and display errors on batch
processing. The first use of this component is when the teacher drops a
file into the course page.
Half of the times the normalise module is used is to get a single
element. However, because jQuery elements can contain multiple elements
the getList is always an array. Due to this in many ocasions we repeat
the getList(VAR)[0] line instead of having a more readable getFirst
method which only implies a couple of lines in the original code.
Basically, we only need to change:
- PHP 8.0
- MySQL 8.0
- PostgreSQL 13
Also, remove any php-xmlrpc installation because they aren't
needed since Moodle 4.1.
Finally, ensure that we aren't using mysql bin logs ever, because
they are huge and can make the 1Gb tmpfs to become full. This is
specifically needed for MySQL 8.0, because it comes with bin logs
enabled by default.
We have forked the mysql-action to achieve that:
https://github.com/moodlehq/mysql-action
Worth blaming travis because, after PG 11 and 12 using port 5433,
now they are back (in PG 13) to port 5432. Surely there is some
logic behind the undocumented ping-pong but...
Note that, despite the commit message, this is not possible. Moodle
3.11.0 (and 3.10.0) were developed in parallel with Moodle 4.0, and
when they were released, the master branch had already diverged, so
the master branch does not contain the comment lines:
"// Automatically generated Moodle v3.11.0 release upgrade line"
And they are needed to know which parts of the upgrade are safe to delete.
So we only proceed to delete all those steps from lib/db/upgrade.php
which version is known to be < 2021051708 (v3.11.8), master ones will
be, always bigger than that. We don't touch plugin upgrade scripts
because they may have different versions, not 100% matching the
2021051708 rule, so there will be an excess of steps there.
Note this is not a big problem, just a few more steps will be skipped and
that's all. Whenever we bump the Moodle requirements again (to Moodle
4.0 or up), the lines will be back and we'll be able to safely remove
all the steps before them. See previous Moodle requirements issues as
example.
The upgrade steps deleted by this commit weren't using any stuff from
upgradelib, tasks..., so there isn't anything else to be removed but
the core steps themselves.
Also includes an upgrade step to prevent upgrading from any
version < 2021051708 (v3.11.8) as anti-cheating measure.
Now that the required PHP version has been raised to php80, set
it in the composer.json file and regenerate everything, following
the instructions @ https://docs.moodle.org/dev/Composer .
The only changes, as agreed in the issue are:
- Raise min PHP version to 8.0 (from 7.4).
- Make the php-sodium extension required (was optional).
- Small behat/behat bump to 3.12.0 (from 3.11.0)
Replace steps that manually add resource instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.
Co-authored-by: David Woloszyn <david.woloszyn@moodle.com>
Old-version backups (< 3.11.7, < 4.0.1) lose their course-level format
options when restoring into newer versions after the backup structure
was changed.
Also, course-level format options were not accurately restored against
the appropriate format type. And section-level format options were
redundantly stored at course-level and restored without mapping their
sectionids, thus creating lint.
The behaviour-specific data was getting corrupted when the regrade
recreated the first step, because $oldstep->get_behaviour_data() was
stripping off the leading '-' characters from the names, and they were
not being added back.
Some calls to the external_multiple_structure's constructor incorrectly
pass parameters where the value for the $description parameter is not
being passed. This results to invalid values being passed for the
$required parameter.
Replace steps that manually add Book instances via the UI and use
Behat generators. This improves the speed of the Behat test runs.
Additionally, performed Behat cleanup and optimisation to affected
files.
Ensure column and filters provided by each source have sufficient
coverage. Re-factor individual entity/helper class tests to test
their own specific implementation only.
Remove now-defunct test fixtures.
The base time allows for the setting of the "current time" for the
purposes of the schedule test against recurrence configuration.
We should ensure the generator method allows this property so that
it can be used when calculating the initial "next send time" of the
schedule upon creation (and avoiding excessive recursion when the
actual current time is used for the calculation).
The TinyMCE menu has a significant issue with the Overflow style,
and the Boost theme heavily uses Overflow for drawer navigation.
Nest the dropdown menu container into the parent editor container makes it work correctly.
Co-authored-by: davewoloszyn <david.woloszyn@moodle.com>
Co-authored-by: xr0master <xr0master@gmail.com>
This commit will add missing fields as Time enrolled/started/reaggregated
in the filter/condition area for the completion entity when creating a course participants
as a report source in the Report Builder.
Calls to `str_ends_with` are polyfilled currently, as the method is
not present in PHP7.4 or earlier. We should avoid uses of it so as
to not trip up compatibility standard checkers.
quiz_settings::create() requires at least 3 DB queries, so the point is
that we can avoid doing that until after we have worked out if we need
to calculate statistics for this quiz.
Also, we order the list of quizzes to consier, to process the ones with
more recent attempts first.
This is because on classic theme the navigation block pushes the content
to the right and once behat changes the grades the 'Save changes' button
is no longer visible.
This commit will implement the Guzzle library in core
to make it usable in different locations.
Co-Authored-By: Andrew Nicols <andrew@nicols.co.uk>
Co-Authored-By: Safat Shahin <safat.shahin@moodle.com>
This commit will import the Guzzle library in
core. The imported libraries will be used in
the next commits to create an api for the http
client to be used in relevant locations.
Co-Authored-By: Andrew Nicols <andrew@nicols.co.uk>
Co-Authored-By: Safat Shahin <safat.shahin@moodle.com>
It happens often that some timezone is renamed, split, added to the
IANAs list of timezones (that, for PHP is kept updated by the
php-timezonedb PECL extension).
When the information coming from the extension changes, all the
PHPUnit jobs in the world start failing (that's when CIs update
their PHP images, when devs update their packages, ...).
So, what we are doing here is to move that test that check for
every single string existing to be run only when PHPUNIT_LONGTEST
is enabled. That way only places running all tests will run that
one. And every other run just will skip it.
This corresponds to point 1 & 2 of the issue, lower impact in general
and, still be able to enable the tests to run.
This was used as part of the auth_config.php configuration system for
the auth subsystem, which was deprecated in Moodle 3.3.
It has never had any other uses in core.
Whilst it would be ideal to deprecate it by replacing with an
alternative, it would be impossible to test.
Changes in fbc2732d made the JS template string helper method
too strict in regards to what it considers a valid JSON object.
Co-authored-by: Mike Churchward <mike@brickfieldlabs.ie>
In PHP 8.1, any implicit conversion of float to int, which leads to a loss in precision, is now deprecated.
To avoid the error warning, the code must explicitly convert a floating value to an integer.
Pass correct parameter/type in field constructor (`XMLDB_NOTNULL`)
for consistency. This corrects the definition and preserves the
truthyness of the value that was incorrectly passed previously.
This commit makes the following changes:
* convert to use ES6 module format
* migrate from a jQuery Deferred to a native ES6 promise
* add a native-Promise-like instantiation
New uses are documented in appropriate jsdoc with examples.
Whenever the page_requirements_manager::js_fix_url()
is called with null url, it must throw an exception and emit 0 warnings.
It's covered by an explicit test:
test_js_fix_url_coding_exception with data set "Provide a null argument"
The json_decode function does not accept a null, which is the
traditional default for get_user_preferences. By passing a default of
am empty string we avoid issues in PHP 8.1.
Revert the lang string "Add an activity or resource before [xx]" back to
its original form of "Insert an activity or resource before [xx]" in
order to avoid conflicts with the "Add an activity or resource" button
especially when running Behat tests.
A new signature was introduced to ImagePolygon functions from PHP 8.0
with the previous signature deprecated in 8.1.
For PHP versions 8.0 and later we should use the new signature. Once PHP
8.0 is the required minimum version, the legacy version should be
removed.
This report source differs from the original badges source (5274ee5a)
by making `user` the primary table of the report, allowing for reports
on all users regardless of whether they have been awarded badges.
Added a few functions to remove the toolbar button, menubar and sub-menu items.
One of the implementations is to remove the justify alignment in the toolbar and
the sub-menu items to aid the accessibility aspect of the TinyMCE editor.
This change makes the regrade progress bar send frequent updates to
the web browser, even when processing within the same grade item, to
avoid timeout problems when there are a large number of users.
By using that assertion the arrays will be sorted before comparison
preventing any Oracle sorting related failures.
Credits for the solution go to Tim Hunt!
With Moodle 4.1 and up, we have stopped to work with strftime(),
because it's deprecated for PHP 8.1 and up and, instead we are
using core_date::strftime() that performs the conversions using
the php-intl extension.
The original strftime() had a lot of OS-specific dependencies,
both about locale names and charsets used to provide the information.
Instead, the php-intl gets rid of all those OS-specific nightmares
and only uses ICU/Unicode locales and UTF-8.
Because of that, the old utf-8 => windows charset => utf-8
conversions aren't needed anymore. Hence, removing them.
MDL-75596 added an "Insert an activity or resource before ..." button
that allows adding an activity or a resource before or after another
activity in a course. This renders the button in the DOM (although
hidden and shown only on mouseover) when there's at least one activity
in the course.
In this issue, the button's label was renamed to "Add an activity or
resource before ..." and it now obscures the normal "Add an activity or
resource" button at the bottom of the course section from being
interacted on when running Behat tests.
This failure happens in the create_activity.feature file as it creates
two DB activities in a single scenario – one when "usecomments" is
turned on and one when it's turned off. Given this limitation, a
workaround is to split the "Teacher cannot enable comments if they are
disabled at site level" scenario into two scenarios with the first one
testing when "usecomments" is on while the second scenario testing when
"usecomments" is turned off.
We created a list of placeholder selectors in placeholderSelectors option.
The purpose of this list is to indicate the contents that are only shown
in the editor and not to the users, by that way, we can decide to apply or
not to apply rules, styles, etc... to these contents
* Add "Preview" and "Use this preset" menus to the preset plugin page's
burger menu
* Refactor importmapping dialogue to use the 'data-action' selector
* Add a new set_kebab_trigger action menu method
* Use set_additional_classes method for action menu
* Remove redundant parameter to add_action_menu
PHP before version 8.1 automatically converted to int if the function
parameter (or array key) is expected to be int. PHP 8.1 shows notice in
this case
PHP before version 8.1 automatically converted stdClass or 'false' to arrays if
function parameter expects array (for example, "reset").
PHP 8.1 shows notices in these situations
Currently, the unordered list in the course content follows the original style and
is ordered from the top of the content section, which is not part of the description.
That's why the first occurrence of the list is the 2nd level which uses the circle as the marker/list type
instead of the disc. In contrast, the editor always uses the original style.
so we need to reset the CSS of the unordered list in the description to the original
which the disc as the first marker, a circle for the second marker,
and a square for the following levels.
Allow users to see their own private messages even if they don't have
mod/forum:readprivatereplies capability
Add behat test to avoid MDL-67109 issue.
Co-authored-by: Martin Putzlocher <mputzi@users.noreply.github.com>
At the moment, quiz_statistics\task\recalculate gives no useful
information about what it is doing, which makes it hard to investigate
if the task fails. This commit makes it more usefully verbose.
Also, following this change, one instance of this task will not
run for more than one hour at a time.
As part of this commit, I have added a new helper mtrace_exception.
to consistently log exceptions in scheduled tasks. It is sad to
add a new function to moodlelib.php, but that seemed the logical place.
Looking at other tasks, this method is badly needed. Many are just
logging the ->getMessage() which is normaly insufficient for proper
debugging. However, swiching all existing tasks to use the new function
will need to wait for a future MDL.
As in MDL-74691, we need either or both of these fields, meaning either
one could be omitted. This just supports that as per the fix made in
MDL-74691.
This covers the following cases:
1. Where only the 'lineitem' service endpoint is provided
2. Where only the 'lineitems' service endpoint is provided.
Existing tests already cover the case where both are provided.
After the user creation, the system must call an update function to update profile_fields_*.
We also provided two functions into user/profile/lib.php to get available from other areas.
We added PHP unit testing for new public functions and
the Behat tests for custom profile fields with locked and unlocked statuses.
Co-authored-by: Matt Porritt <matt.porritt@moodle.com>
Since the <ul> and <li> elements for listing the quiz questions and
elements are mainly used for layout purposes, it is better to set the
role of these elements to presentation only.
The aria-label for the <li> element is inappropriate and can also cause
confusion to screen reader users. Better to remove this. Though this is
being used in the confirmation modal so better to just change it to a
data attribute.
Since the <ul> and <li> elements for listing the quiz questions and
elements are mainly used for layout purposes, it is better to set the
role of these elements to presentation only.
Add a default sr-only section heading in order to prevent having an
empty heading for the quiz section which is not good for accessibility.
Plus:
- There's also an existing issue where filters are never applied to
section headings on load. This has been fixed in this commit as well.
- Button role added for the edit section button which enables it to
take advantage of the theme highlighting when it receives focus.
I thought about renaming the class to just plain attempt, but I
acutally think quiz_attempt makes it clearer what this is. Also
not changing the name massively reduces the pain for everyone
updating their code (including me right now!)
Code should just directly use moodle_execption.
Note, some of the existing uses (in web services) were passing a
literal message, not a language string identifier, but I decided
now was not the time to try to fix that.
Update oauth2 to allow mapping of provider attributes against
user profile fields. Fields can also be locked to prevent
user changes.
Co-Authored-By: Michael Milette <michael.milette@tngconsulting.ca>
extrainfo is an extra information for the DB driver, e.g. SQL Server,
has additional configuration according to its environment,
which the administrator can specify to alter and override any connection options.
Co-authored-by: LukeCarrier <luke@carrier.im>
- Markdown is saved to the DB, no conversion to HTML to keep
ability to reedit the content without beaking it.
- Blockquote element is styled that it's distingishable from
normal text.
See also f4fb91ae. PHP8 now supports named arguments in calls to
the `call_user_func_array` method, which can result in differing
behaviour compared to PHP7, e.g. in this case it was throwing an
exception due to an unknown named parameter.
Displaying the course card menu only on hover is bad in terms of
accessibility as it prevents keyboard-only users from accessing the
menu. So it's better to always display them.
If a user drags an activity and press the ALT key, the activity will be
duplicated in the new place instead of simply moved. This behaviour
is quite normal in many softwares and it is a non intrusive usability
improvement.
Adding an activity with a grade item previously triggered a course
regrade, which can be extremely slow. This change makes it so that on
courses where regrading is slow, when you add an activity that
requires regrading, it takes you to an intermediate screen with a
progress bar.
This change also fixes a bug in the existing grade overview report,
which shows grades across multiple courses, but previously only
checked, and if necessary regraded, one course.
The courseindex init methods contains static references to the class
name instead of a dynamic "this" reference. This makes harder for format
plugins to extend those classes as they need to override the init method
for no specific reason.
I have opted not to go through any deprecation process for this as there
is not really much we can do about it anyway. There is no loss of
functionality - just a change of where things are served from.
The Yahoo! CDN was only used for http connections as it did not
officially support SSL, and it is not guaranteed to continue existing in
the future since YUI has been deprecated for a number of years now.
Including in this commit:
- Prevent the tour to be displayed if the CSS is disabled by the browser
- Removed redundant tabindex=0 attribute on the target
- Created extra code to re-calculate the suitable position of the tour
- Fixed tour issue in 200% and 400% zoom
- Fixed tour highlight is not correct in 200% and 400%
The highlight and unhighlight sections applies only to the format_topics
plugins. With this commit all the related code is migrated to reactive
component and format_topics extend the current course editor to add all
the logic
Add 'versionfromdb' to opt-in for VERSION() query.
mariadb_native_moodle_database::get_server_info() has been removed
to avoid the specific override: everything is now managed in the base
method which takes care of both MySQL and MariaDB versioning details.
New protected methods have been added too to improve the testing strategy,
allowing to mock the results from an actual DB connection.
The new testing strategy enables simulating even the Azure scenarios.
When the param string contains a left curly bracket as the first character,
the system will assume the string is a JSON string and will be parsed and returned as an object.
But in some cases, the string is not JSON and will return an error if the system parses it.
For example, a user might have used the course name with a left curly bracket as the first character.
Adding a double quote after the left curly bracket to differentiate between string and JSON string,
so it can be safe to parse the string, and also added try..catch to ensure that the parsing creates an object type.
The new library version should work without problems with older
php-mongodb extension versions:
- v1.15.0 (paired version, tested).
- v1.14.1 (tested)
But, in order to keep them paired, the requirements have been
raised to the extension v1.15.0. See:
https://www.mongodb.com/docs/drivers/php/#compatibility
This updates the library from v1.13.1. Fixes some php81 warnings
leading to failed/risky tests.
The new library version should work without problems with older
php-mongodb extension versions:
- v1.15.0 (paired version, tested).
- v1.14.1 (tested)
During install/upgrade, caching is disabled. This change provides a
way to temporarily enable caching (using in-memory cache storage only)
within a specific function; caches are deleted afterwards.
Adding this to two locations improves install performance quite a lot.
Caching is not enabled during the parts of plugin installation that
can vary for individual plugins (install.php/upgrade.php) as these
might be relying on its absence, for example by making direct database
changes.
Adding new capabilities can be slow if they have permissions cloned
from an existing capability, and if there are many places in the
database where the existing capability was overridden.
This change optimises the clone-capability performance, approximately
halving the number of queries required.
Adding multiple capabilities was very slow because it clears and
rebuilds the capability cache after each one. This change makes it
clear the cache once after adding all capabilities, before adding
permissions to the archetype roles.
Webservice doesn't need to set the page URL. Hence,
any function that requires a page URL will raise debugging output.
The patch fixes it by adding a fake URL for the webservice.
The patch also removed assertDebuggingCalled because it is no longer needed.
This will find all data generators that can be used in behat via the
'the following "something" exist:' step, and display them in a select
list on the step definitions page.
When a generator is selected, it will fetch the required fields for that
generator and display them on the page.
jQuery submit events do not trigger the native submit event, and
therefore the TinyMCE submit listener is not called. This means that the
tinymce.triggerSave() function is not called, and the editor content is
not saved.
To work around this, if there is a form for the Node that the editor is
attached to, the jQuery submit event is listened to and the save event
called.
Unfortunately it is not possible to use a global jQuery submit listener
added to the document to save all editors on the page.
In some cases, this is too late because the bubbling process means that
a child node consumer may attempt to consume the data before the
delegated handler is called for the document.
This change reduces the priority of the shipped phpcs configuration to
allow for local overrides.
This is beneficial in several situations:
- when users wish to apply stricter or additional standards
- when the integration team wishes to trial new rules
If the default dashboard contained a block that was missing from disk
then "Exception - Call to a member function instance_copy() on bool"
was shown to users. This change only shows an error with debugging
enabled which now includes the name of the missing block.
Use the full result from download_file_content within the component
installer to ensure that spurious debugging is not emitted during
operation. Handle validation of the returned data consistently.
Under some linux versions, and depending of the configured
locale categories, it's possible to get a current locally
which length > 255 when calling to setlocale(LC_ALL, 0).
Later, if that long locale is tried to be restored, there
is a "setlocale(): Specified locale name is too long" warning
error.
When that happens we need to split the long locale into
individual chunks and set all the (six) locale categories
supported one by one.
Covered with tests, note that, in practice, this only
happens with linux because it supports 12 locale categories
@ OS level. Both BSD (6) and Windows (5) hardly can reach the limit.
No matter of that, the tests have been designed to ensure that
they pass on all OSs, just the new code only will be executed
on linux.
This part of the code in 'question_category_object.php' 'update_category' method was used before Moodle 4.0 version for renaming
the random questions in an updated category. For Moodle 4.0 and later versions, it is unnecessary as the details of
random questions are no more stored in 'question' table but in 'question_set_references' table.
The method call move_question_set_references handles the same.
AMOS BEGIN
MOV [config_recordings_sortorder,mod_bigbluebuttonbn],[config_recordings_asc_sort,mod_bigbluebuttonbn]
MOV [config_recordings_sortorder_description,mod_bigbluebuttonbn],[config_recordings_asc_sort_description,mod_bigbluebuttonbn]
AMOS END
We will not calculate old maker position again and using old data.
This will make sure the position of makers is correct
when the background image is smaller than dropzone.
Right now we have the information only in docs:
- https://docs.moodle.org/dev/Core_APIs
- https://moodledev.io/docs/apis
And, in fact, we are crawling those pages to get the information
from various tools (moodlecheck, CiBoT...). Obviously, that's far
from ideal, the source only has the current list of APIs, and
there isn't much information there but the names.
So we are moving the source of information to be in core, so it
can be modified between branches, and contains richer information:
- The component the API belongs to, usually a subsystem or core.
- If the API can be used as level 2 namespace.
- If the API can be used as level 2 namespace out from its component.
Note that all that information has NO USES right now in core (and maybe
never will), but tools/checkers will benefit enormously by having that
information at hand, so we can check for namespaces, categories and
other bits way better.
Also, once we have this, the APIs dev documents linked above, surely
can be improved by being automatically generated and include all the
meta-information available.
It also includes a very basic json schema validating the basis. It can
be tried online @ https://www.jsonschemavalidator.net , or any other
tool. PHP requires extra libraries to be able to perform the validation.
Covered with unit tests, both api-related functions and structure validation.
Remove negative margin from the "clear my choice" anchor.
With the negative margin, when the containing box height is calculated
the anchor's hidden style overflows beyond the boundary and triggers
the overflow:auto to add a scroll bar.
... or anything else with length = 0. This got broken in MDL-71696.
The only way to fix this kind-of involves and API change to
quiz_report_get_significant_questions. However, it is only changing
the external API of this function back to how it was before the 4.0 release,
and the chnages in 4.0 were never documented, nor, I would guess, intended,
since they just broke things.
This commit adds an additional environment check for the unsupported
PHP 8.1 version to Moodle 3.9.x, 3.11.x and 4.0.x.
It also updates the lang string for unsupported PHP version.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
When the site uses custom user text fields that would show up in a
user list, the filter for firstname or lastname didnt work anymore.
If a filter was used, no result would show up. Users where shown only
when the course reports where used without filters.
It was detected that 'This month' option may cause failures in builds in between months
so using the 'Recent and next 60 days' still fixes the weekend scenario and also the
in between months issue.
This is necessary because 'This week' option is conditionally
hidden on weekends making behat builds to fail on those days.
Also, the last two steps had to be split because Bennu library
adds days with leading zero and moodle removes it by default.
When the keyword participant filter was used with multiple values
in conjunction with other participants filters, the boolean logic
was effectively:
X AND Y OR Z
When what we actually wanted was:
X AND (Y OR Z)
Set type of the report paging setting to integer, to ensure usage
of it is predictable. Unsupported operated type errors were thrown
on PHP8.0 when it's value contained a string or was empty.
This adds a new method to the assignfeedback edit pdf library
to specify user data file areas that will return just the meaningful
annotated feedback pdf.
get_file_areas has been updated for this plugin to return all
file areas related to assignfeedback_editpdf, and should stop
producing orphaned files and records when a course reset is done.
Thanks to @toniginard who provided a base solution for me to work
off.
The method already loaded the validated persistent model data on the
previous line, there's no need to do it again (while also trying to
load unvalidated properties).
The assumption that the settings checkbox always stores boolean values
(e.g. 0/1) isn't correct. The `perfdebug` configuration instead uses
the values 7/15.
Default value of the $flag argument changed in PHP 8.1 from ENT_COMPAT to ENT_QUOTES | ENT_SUBSTITUTE
To ensure consistent behavior across different PHP version the second parameter is now required for the functions:
htmlspecialchars(), htmlentities(), htmlspecialchars_decode(), html_entity_decode() and get_html_translation_table()
Including in this commit:
- Convert existing Behat scenario to use Data generators
- Convert existing Behat scenario to use Provider
- Add new scenario for Include users setting in General restore page
This changes a couple of cases, in postgres and oracle where we
were trying to calculate strlen() on null values (that causes a
PHP 8.1 warning).
Also, at the same time, fixing another case in xmldb_field, it
was detected that it had a bug around precision (being set to the
value of type), being used as object property, when it's not, so
it was also fixed by moving the code logic a little bit.
Note that the bug has been there since inception because there
isn't any code in Moodle using that ->precision property. It
was just detected thanks to PHP 8.2, but that's another story. :-)
Verified that with the patch:
- All DBs can be installed (phpunit install)
- Both DDL and DML pass without any ddl/dml warning (in all DBs).
The autosave is reset on form submission, but if that form submission
happens at the same time as a page reload, the connection and/or server
is slow, then the connection may be aborted before the session is
removed.
This commit changes the autosave reset to use the fetch() API with a
keepalive flag.
Unfortunately we do not have a formal endpoint for this in Moodle JS so
this is a hackier approach than I would like. MDL-76463 has been opened
to investigate this.
This commit also fixes a situation where the autosave content is re-sent
when the user has typed in the editor and their next action is to click
on the submit button. This is now blocked for that editor instance.
Bootstrap core's "reboot" sets a default text-align which is
incompatible with RTL languages.
Arguably this should be set in the Boost theme, but this is a fairly
large change which has potential to break things so I'm making it here
where we experience the issue for now.
This case was left not changed @ MDL-72509, and detected by the
Moodle 4.1 apache logs review @ MDL-76064.
Not much to say, just switch to the core lang string, the other
is deprecated for 4.1 and up.
TinyMCE uses a magic langstring only present in RTL languages which
makes it hard to automatically fetch from their strings.
Since it's the only magic string I can find a reference to (after
searching their codebase), I've elected to add this in the lang.php
serving layer. This allows us to use our own langstring instead of
re-declaring something that should be stored once across Moodle.
Prior to this change, all the line endings in the imported HTMLPurifier
library were using CRLF (\r\n aka Windows style), but the HTMLPurifier
source and also the downloadable artefacts use LF (\n aka Linux style)
as line endings. This has been the case since
510d190382 when with the commit
"MDL-38672 import HTML Purifier 4.5.0" all line endings were changed
from LF to CRLF. There was no comment in the commit on why this change
was done.
As the original source uses LF, this commit partly reverts
510d190382 and goes back to LF as line
endings.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
Since phpCAS v1.6.0, a required base service URL parameterneeds to be
passed to phpCAS::client(). This is basically the protocol, hostname,
and port number (optional) of the site connecting to the CAS server
in order for it to perform service URL discovery.
Set needsupdate to finish to avoid regrading each call.
Add error messages for regrading.
Display the error message on the quiz page.
Co-authored-by: Mark Johnson <mark.johnson@catalyst-eu.net>
AMOS can only cope with string identifiers with a length < 100
characters. Our tooling for Tiny automatically generates string idents
based on the language string and these can end up longer.
This change modifies our generated idents to be capped at 90 characters.
Atto mixed vertical and horizontal alignment into a single selection,
which does not make any sense. It also used CSS classes in such a way
that those styles will break if/when Atto is removed.
This commit:
* removes the horizontal alignment from the dropdown - these are easily
achieved using the existing Tiny UI
* addresses a bug where existing styles (like horizontal alignment) were
not preserved when editing the image
* fixes a bug where the CSS selector was used instead of a CSS class
name
* recognises legacy TinyMCE class names and replaces these
* switches from using random class names to using Bootstrap class
utility classes for vertical alignment.
The Atto preview plugin does not support Moodle filters. This commit
disables it for now with the intent that in a future release we may
replace it with a Moodle version which applies our filters correctly.
In some cases, we get an error message such as:
Wrong parameter count for Redis::zRem()
Within the delete_many function. This function requires at least one
key to be supplied, but if delete_many is called with an empty array,
we will call it with no keys.
* Guest URL and passwords are not supposed to be included in the backup
file so they should be excluded in assert_bbb_activities_same.
* Removed redundant entry 'course' in the filter list as well.
* Provide a way for external participants to be invited to a meeting by giving them an url/password
for external users (not registered in Moodle)
* Add guest access page with username and password prompt
* Add form and modify API calls to take into account guest login
* Add a form modal to add guest users emails
* Allow copy of link and password in both popup form and module form
* The guest should be approved by default. It should be intentional to let them
in without checks.
* Guest access URL and password should not be copied when duplicating or backing
up the activity.
* The mod_bigbluebuttonbn_meeting_info web service function now
returns guestjoinurl and guestpassword only for moderators.
* Redirect if user already logged in
Note: this will allow guest to connect to an existing and running meeting. The moderator will then
be able to adjust the guest user's right. For security reasons we do not yet allow moderators
to join the meeting directly (or start a meeting)
Fixes the inapropriate attribution of the 'reporttable' css class.
This class should be only attributed to the html output related to the
the report table.
Added navigation links similar to user report page.
Removed top paging bar. Bottom paging bar and select per page
are moved on same level with next/previous links.
The override and exlude links are removed form the table header because
a new bulk actions menu will be used (see MDL-75455).
Co-authored-by: Shamim Rezaie <shamim@moodle.com>
Creates a single action bar class to output the action elements in
the single view report. Also, enables the singleview report class
to set and return the appropriate item selector (in raw HTML)
based on the currently selected single view item type.
Updates the Aiken Format class to process answers correctly, enabling
support for special HTML characteres such as <, >, and &.
Co-authored-by: Leticia Luz <leticia.adrielli.luz@gmail.com>
This commit removes several contentious formatting options for now,
pending further consideration, in particular it removes:
- forecolor
- backcolor
- fontfamily
- styles
The two color plugins are written in such a way that the chosen colour
is embedded into a style tag in the generated content. This is not
ideal as it removes these decisions away from theme developers and upon
theme changes to a site, is likely to lead to inaccessible and/or broken
content.
We feel that a new colour plugin will be required which links to known
colour style classes within the theme to allow a subset of colours which
are guaranteed to work with the theme.
The fontfamily plugin is removed pending further administrator
configuration in a future release.
In the case of the 'styles' plugin, this duplicates large parts of the
Format menu into which it is placed but does so in a way that does
respect the configuration of other areas - for example the block_formats
tag is ignored in this menu.
Part of MDL-75966
The template plugin is a part of Tiny, and requires us to create an
administrator UI to configure the templates.
This requires much more thought on workflows, intent, and so on so we'll
park it for later.
Part of MDL-75966.
Part of MDL-75966
This commit adds a cache-busting loader API for use in the TinyMCE
plugin.
This is not for use in any TinyMCE subplugins at this time as we have no
use-case outside of AMD modules.
This loader ensures that only files within the js/tiny directory are
loaded, and it only supports either .js or .css files at this time.
The client-side of the loader makes use of the jsrevision as a
cache-buster, including for CSS files included with TinyMCE.
If the revision is negative, then files are not cached.
If the revision is positive, then the requested file is cached in a
candidate file and served using aggressive cache headers.
Part of MDL-75966
Add support for translation of the TinyMCE interface.
TinyMCE translates English language strings rather than keys, and a tool
to perform this translation is included.
Part of MDL-75966
This commit adds TinyMCE version 6.1 into Moodle core.
A basic editor implementation is included, along with Moodle loader, and
basic Plugin API for Moodle. The Plugin API will be extended and
improved in future changes.
A new subplugin is defined for this plugin.
- The current item should be focusable otherwise the focus will be lost
as soon as a user clicks on an item in the initials bar
- Modified behat tests to not mistakenly click on the 'All' link
- Use the nav tag because each item in the initials bar is a
navigation link within the current document
- The currently selected item is specified by aria-current
- Useed aria-current=true rather than =page because the links of each
item in the initials bar is missing the pagination information
* In preparation for the guest access trigger button, move the join session
button to the right
* Fix id in the templates to be more consistent
* Fix issue with room refreshing process so it replaces the node instead of node content.
This commit implements the bulk action api to allow multiple bulk
actions from the qbank plugins instead of one. Any qbank plugin
wants to implement bulk action can now define an array of bulk
actions as a plugin feature.
An improvement has been added to the H5P tests to avoid random errors
due to the fact that H5P content needs a while to be displayed.
Co-author: Ferran Recio <ferran@moodle.com>
These pages sit under the 'restore' and 'copy' menu items respectively
but the selected menu item isn't correct because the 'restore.php' and
'copyprogress.php' page URLs don't match the node action for their
respective 'restore' and 'copy' nodes. Force set the selected node in
each case to resolve this.
Allow pages to choose which course reuse overflow node is selected, to
handle cases where the default selection (based on matching PAGE->url
to the node action URL) isn't possible (such as when several pages need
to exist under the same selected node).
If member sync runs before the user launches the tool, a partial record
is created, without consumer secret. Subsequent launches of the tool by
that member don't resolve this and this results in grade sync failing
for any affected users. This patch:
- data fixes the existing affected rows
- fixes the launch code, ensuring secret is recorded on launch,
irrespective of whether the user info record has been created already
or not.
Although we're not currently supporting the H5P Hub, the hubIsEnabled
setting was set to true (probably by mistake).
It has been changed to false by default because the new version of
the H5P editor library is causing some errors otherwise.
Trivial change, only point is that, for the h5p library it was
agreed that it's better to just remove the "sample" directory
completely when importing the library.
This partially reverts MDL-73270, where some useful environmental
checks and notifications in the admin UI were added to inform
about different parts of Moodle relying on the "unsupported"
php-xmlrpc extension.
Since then, some changes have happened in core, only available
for Moodle 4.1 and up (see the MDL-70889 mini-epic). Namely:
- MNet (SSO, roaming, auth, enrol and Mahara portfolio) are not
using the php-xmlrpc extension anymore, but a pure php library.
- The xmlrpc webservices protocol, has been move from core to
the plugins directory, although it continues using the php-xmlrpc
extension.
Because of that here we are removing all the checks and notifications
related with MNet (not using the extension anymore), but keeping the
webservice plugin ones (still using the extension). Surely if some day the
protocol stops using the extension, we'll be able to remove the
corresponding checks too. But that's future.
Note the associated lang strings have been also removed (not deprecated)
because they were highly specific and hardly reusable:
- xmlrpcmaharaenabled
- xmlrpcmnetauthenticationenabled
- xmlrpcmnetenabled
And very same applies, because MNet doesn't contain anything deprecated
or not supported anymore, hence, straight deletion, to the function:
- mnet_get_deprecation_notice()
Also, related tests using any of the removed stuff above have been deleted.
In the other side, the "check_xmlrpc_usage" continues existing and
being used both by environment checks and admin notifications but,
as commented above, now it only looks for the xmlrpc webservice
protocol now.
For Moodle 4.1 and up, the php-xmlrpc is not needed anymore:
- All the MNet stuff has been moved to use php library (MDL-76055).
- The webservice/xmlrpc has been moved from core to contrib (MDL-76052).
So we just remove the check here. Starting with 4.1, it's not
needed for any core functionality.
Note that the string has been removed, and not deprecated, because it's
a non-generic string, not belonging to core/moodle main lang file, and
hardly reused ever. That fits with the allowed deletions, not requiring
any deprecation.
Of course, the lang removal only has been applied to master (4.1dev).
Older branches still keep it and will be used when checking < 4.1
upgradability.
The wiki_extend_navigation is using $PAGE->url when it is not allowed
to. Extending navigation can be invoked in an Ajax request so it should
not use $PAGE global.
Including in this commit:
- New method called get_number_of_unanswered_questions() for getting the unanswered questions
- PHPUnit and Behat tests for the new dialogue
- Changed the title from "Confirm" to "Submit all your answers and finish?"
- Changed the content from "Once you submit, you will no longer be able to change your answers for this attempt."
to "You will no longer be able to change your answers for this attempt."
- Changed some Behat scenarios to match with the new dialogue content
Because @coversDefaultClass doesn't indicate any coverage (it's
just an alias to avoid having to write the class name in @covers),
this commit fixes all the files that were using that annotation
and missing any @covers.
Basically, replacing one by the other and done.
It has been detected that there are various uses of the plugins
breaking the inter-communication principles, with core_webservice
implementing functionality plugin-dependent that should belong
to the plugins.
Because of that, https://tracker.moodle.org/browse/MDL-76078 has
been created and we have added some TODO/@todo comments in core
pointing to that issue, for further analysis and fixes there.
Normal removal procedure:
- Remove the plugin completely from core.
- Document it in the webservices upgrade.txt file.
- Add a core upgrade step to proceed to remove any configuration
if the plugin has not been re-installed manually.
Plus:
- Remove a few remaining uses in the hub/sites registration scripts,
that were moved from xmlrpc to hand.made rest calls by MDL-31436
(Moodle 3.4.1 and up) and never removed then.
- Remove the php-xmlrpc extension as a recommendation in composer.
- Remove "xmlrpc" from various comments, trivial cleanup.
Note:
- While working on this MDL-76078 has been created about to
fix a serious design problem detected (it does not affect
functionality). That's out from this issue scope.
This commit will implement in place editing for the
qbank view where users with permission can edit the
title of the questions from the quesion bank view.
* BBB has specific completion indicator that need to be taken into account
* Fix mock requests so we can send participant id and then attach events to them
* Refactor slightly the broker to split meeting logic from request (decoding)
* Fix update completion state cron
These steps have accepted a NodeElement instance as an argument for some
time, but were trying to cast it to string when formulating exception
messages, making it harder to debug and, in the case of the 'should see'
step, not work at all.
This patch introduces a new function to produce a consistent naming for
them.
This commit adds new steps related to action menus to support:
* Choosing an item in a named action menu
* Choosing an item in a named action menu within a container
* Confirming that an action menu item does or does not exist in a named
action menu
* Confirming that an action menu item does or does not exist in a named
action menu within a container
The existing action menu steps were insufficient as they assume that
there is only one action menu within he container, which is not
necessarily the case.
The existing action menu steps are not non-JS friendly and will error if
JS is disabled, without providing any fallback when one is easily
available.
Unfortunately these steps cannot be used to replace the existing steps
without manual intervention.
* When the language pack being deleted is
- the same as the site default language, we must set the site default
language to 'en'.
- fix the user's current language to the default site language.
- Linking classes/methods mentioned in PHPDoc with @see tags help devs
checking the PHPDoc to quickly navigate to the class/method mentioned
and also helps us ensure that it points to the correct class/method.
- Some typo/grammar fixes as well in existing PHPDoc descriptions.
- Fixed parameter type in execute()'s PHPDoc block.
This change makes the JS in for preset management more resilient.
Previously, if the button was not on the page then an error was thrown.
Instead this code changes the listener to listen to the document and
filters the clicked element based on the same selector. This is a much
safer approach as it will not error if the selector was not found on the
page.
In this case the behat test introduced elsewhere in this issue is
testing a scenario where the Save as preset button is not present
because there are no fields to store as a preset.
This service is different from the rest because it
doesn't run encrypted, but plain xmlrpc. Hence, we
cannot use the normal mnet_xmlrpc_client (that provides
on-the-fly encryption and signing).
So, instead, let's instantiate a custom client here
and use it for this pure xmlrpc request and response.
PS: It's curious that this exact sevice has support
for proxies but the mnet_xmlrpc_client one has not. I'm not
going to modify that here, but have left a comment
in the code about that.
PS: Some small style changes have been applied around
the modified code (spacing, &&, comments...)
Basically this fixes MDL-70833 that was reproduced while
testing the update_enrolments requests. Summary:
- Fixes a typo in table name preventing it to be updated ever.
- Fix outer join that was missing records.
- Stop playing and mixing ids (local and remote).
- Better control which enrolments have to be kept (previously
they were being deleted immediately after creating them).
- Improve the coding style of inserts.
- Modernise the deletions to use sql helper and to work with 0..n ids.
Completely remove all uses if the xmlrpc php extension in
the client and replace them by the phpxmlrpc library.
Very noticeably, remove all the uses of the curl extension
and use phpxmlrpc own curl support.
Working ok for moodle-moodle/mahara sso and mahara portfolio export.
This patch should fix a regression introduced in MDL-75171, raised
while running the OBv2.1 certification.
The new method get_raw_userinfo() can return stdClass or false but
the second one was not taken into account from get_userid() (so an
error was thrown: "Argument 1 passed to
core\oauth2\client::map_userinfo_to_fields() must be an instance
of stdClass, bool given").
Introduces a new method get_element_type_string() in grade/lib.php
which returns the appropriate string that describes the type of the
grade item element.
Outputs the relevant tertiary navigation actions based in index.php,
the prev/next user navigation and removes the old trigger buttons for
the group and user selector from the zero state page.
Fixes the enrol_lti_users.consumersecret field for LTI 2.0 users.
This field erroneously contained the tool secret and not the consumer
secret needed for service requests when used with LTI 2.0 consumers,
which resulted in complete grade sync failure for LTI 2.0 consumers.
This patch:
- adds an upgrade step to address existing incorrect secrets for LTI
2.0 launched users. It sets these to the correct consumer secret.
- fixes the way the secret is first set during a launch, ensuring
this->consumer->secret is used, which properly captures either the
tool secret (for 1.1 launches) or the consumer secret (for 2.0
launches).
Adjusts the testing scenarios so that we don't rely on endpoint
discovery being run during an issuer edit, which is no longer the case.
For scenarios that need a userinfo endpoint, set this manually.
In cases where we have an id, load the persistent and then set new data
before saving. This ensures we don't delete fields which are missing in
the form data.
On the Database page:
- The List/single view is displayed in the right.
- The buttons Import entries, export entries and Export to portfolio
have been moved to the Actions menu.
- The List/Single view headings have been removed.
- The "Save settings" secondary button is hidden when advanced search
is enabled.
- The result (Found X out of Y entries, No records found) are not
displayed as notifications anymore.
On the Presets page:
- The buttons (Import, Export and Save as preset) have been moved to an
actions menu to the tertiary navigation. Some of these options have been
renamed.
- Remove the Action column heading from the table.
On the Presets preview page:
- Move the preset name to the heading in the tertiary navigation (Preview
of xxxxx), and remove the current preset name from the page.
- Align the List/single template to the right in the tertiary navigation.
- Make primary the "Use this preset" button.
On the Fields page:
- Remove the "Manage fields" menu.
- Remove the Export and Save as preset from the tertiary navigation.
- Align Create a field to the right in the tertiary navigation.
- Add a description at the top of the page.
- Remove the Action column heading from the table.
- Move field actions (Edit and Delete) to ellipsis.
On the Templates page:
- Move Export and Save as preset to the Actions menu.
- Move the templates list to a tertiary navigation selector and remove
the template heading.
- Reorder the templates list (Add entry template should be displayed
at the begining, instead of List template).
- Rename "Enable editor" to "Enable code editor".
This allows admins to configure whether contact site support is
available to everyone, authenticated users, or nobody.
The behat testing checks linked and direct access for each setting,
as well as adding testing that the support page override works as
expected.
* Use a modal instead of a standard page to select the preset file
and import it.
* Change the zero state import button to a modal dialog so it uses the same
workflow as on the preset page
Added a new element to wrap filter control in Course Overview,
so it will display well on desktop and mobile.
Co-authored-by: Huong Nguyen (huongnv13@gmail.com)
* The setting "Display mode" modifies the choices alignment of radio choice button
from horizontally to vertically. It should also display the list of choices in
the graph in the same directions.
Disables filipping the dropdowns up or dynamically repositioning
them along the y-axis to prevent them getting hidden behind the
navbar or them covering the trigger element.
Each template should display at the top the information about the
user who has created the entry, when it was created and modified.
Apart from that, this commit also includes:
- For the Journal preset, a link on each card entry title has been
added, to open the Single view.
- For the Resources preset, the Author field has been renamed to
"Author of resource" and the Description to "Content".
- For the Resources preset, the Author and Type fields will be
hidden in the List view for small devices.
Apart from removing the "List view" and "Single view" h2 headings,
the presets and templates must be also reviewed to confirm no
heading is skipped (so h2 > h3 > h4 ...).
For the Journal preset, the "Reflections" heading has been removed
here too.
This commit addresses a race condition when showing the message drawer
and opening the settings page from the Message preferences page.
In that situation, the message/edit.php page calls the
message_drawer_helper.showSettings function, which publishes a request
to show the drawer.
In some conditions (notably faster machines, or after MDL-66107) this
event is fired before the message_drawer.init has listened to it.
The solution here is to delay firing of the event until the drawer
announces itself as ready.
This ensures that the event is subscribed to before it is fired.
The lock ensures that multiple conversions do not happen for the same
assignment submission.
Otherwise, subsequent conversions will fail when trying to save the
converted file.
Polling conversions will run the document conversion immediately if the
conversion has not already been completed.
Releasing the session lock while doing this ensures large conversions
do not unnecessarily hold the users session.
Before PHP 8.1, the mysqli extension had MYSQLI_REPORT_OFF as default setting.
With PHP 8.1, it has been changed to MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT
The native driver is not ready to work with this new reporting level,
see MDL-75761 about to considering to improve it.
So this change just ensures that we continue using MYSQLI_REPORT_OFF
with any PHP version.
Create new entities for exposing report data on course groups and
groupings, joining to existing course/user entities to provide data
for the reportbuilder editor.
Also ensure that if course reuse contains only a single node (e.g.
reset), then it is still accessible from secondary navigation.
Co-authored-by: Meirza Arson <meirza.arson@moodle.com>
MDL-73727 aimed to improve the performance of the
get_conversions_for_file SQL. Unfortunately it also
changed the behvaiour of the SQL.
On further investigation, there is nothing wrong with
the SQL. This patch returns it back to its initial state.
Create entity definition containing report elements for blog posts.
Add new report source joining the entity to existing user, course
and tag entities to provide data for the reportbuilder editor.
Create entity definition containing report elements for notes. Add
new report source joining the entity to the user/course entities to
provide data for the reportbuilder editor.
The "Services and support" and "Contact site support" links were
missing from the footer in the Classic theme (which now has its own
footer template), so there was no way to navigate to the relevant links.
- Add scrolling to big filter containers to avoid them to be hidden under header
- Remove custom reportbuilder scrollbar mixin and replace it with 'thin-scrolls'
standard mixin
The mnet_environment->keypair array contains the following
elements (and more, just focussing on these):
- keypair_PEM : textual representation of the private key.
- certificate : textual representation of the public key.
- privatekey : OpenSSLAsymmetricKey representation of the private key,
generated from keypair_PEM. See get_private_key().
- publickey : OpenSSLAsymmetricKey representation if the public key,
generated from certificate. See get_public_key().
The last 2 elements in the array are only used as "caching", to avoid
having to call to openssl_pkey_get_private() and
openssl_pkey_get_public() to convert from the textual representation
to the OpenSSLAsymmetricKey representation that is the one required
by a number of openssl functions.
Problems arrive when, as part of the MNet protocol, the mnet_environment
is serialised, because, since PHP 8.0 those OpenSSLAsymmetricKey objects
aren't serialisable any more.
So, as far as they are only used for internal caching it's perfectly ok
to remove the caching bits and use the openssl_pkey_get_xxx() methods
to calculate them under demand.
The alternative to this would be to implement into the mnet_environment
some custom serialisation, skipping those OpenSSLAsymmetricKey
instances, using __sleep(), the Serializabla interface or __serialize(),
but that seems unnecessary because, as explained above, the uses are
really limited and easily replaceable.
That's what this patch does.
This is basically the manual background that was removed in the
previous commit, with 4 attempts here. Note it includes the 2
waits that are REQUIRED to make it pass in too-quick environments.
If they are removed, they begin to fail because it seems that
the attempts need a minimum of separation between them.
This moves away from manual attempts and uses the activity
attempts generator instead. Quicker and not exposed to the
problems with clicks, refreshes and missing attempts.
Note that there is a small change in the attempt generator
so, now, when a new attempt is created, if the activity has
tracking enabled, the final result / grades are recalculated.
That's the real behaviour when the activity settings are
changes in the edition form and it's natural to get them
recalculated without having to visit the form. Specifically,
this allows the 1st scenario to pass, because in that scenario
no changes to the form are being performed.
Also, little detail, amend a dupe scenario name.
This automatically comes with Goutte client 4.x that is
the one we want to, also, update.
It should work 100% the same and comes with some php81
warnings cleaned.
To avoid getting some random errors with Oracle, the order for the
students have been removed from the tests (to check they are there,
regardless the order they are returned, because in that case, the
order is not important).
This commit adds a new Grunt task which generates a jsconfig.json file.
This file is described at
https://code.visualstudio.com/docs/languages/jsconfig and can be used
to configure vscode and other similar editors to understand our module
loading.
This task is an optional task for Grunt and can be run with:
npx grunt jsconfig
The file is git-ignored and will not affect normal usage.
Previously, if a course module had already been graded, course module
completion linked to the course module would not update. This
commit adds the option to enable overriding the grade at the course
module competency level.
This ensures that if enabled and a user completes a module associated
with a competency, that competency will be graded appropriately.
Some editors do not immediately store their content to the textarea they
represent and only do so when the form is submitted or they are
requested to.
This change adds to the existing API to allow an (optional)
`store_current_value` function to be defined for the editor type so that
it can use the JavaScript API to persist any current content to the
editor.
This commit adds a standardise_html function and updates the matches
function to compare normalised content.
This allows for a wider variety of valid editor output to be handled
using the standard value matching steps in Behat, thus supporting
editors other than Atto better.
There is inconsistent status check for course completion block and
completion details page. Completion block was taking to account
pending statuses for completion criteria while completion details
page was ignoring those.
SQL was fetching activities where completion state was 'completed,
but not passed reqyured grade'. For course completion such states
must be ignored.
Also fixed progress bar on my courses page. Same reasoning as above.
The lib/lti1p3 library now passes $options['form_params'] instead of
$options['body'] when making access token requests. To maintain the
'application/x-www-form-urlencoded' content-type required by OAuth 2.0
(https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3), the client has
been changed to convert these array params into a body query string,
which matches the behaviour prior to the library upgrade and makes
the tool can continue to call tool platform services. Support for
$options['body'] remains, as this is still used during service calls.
This fixes a regression caused by MDL-74752. If you regraded
a subsequent quiz attempt in a quiz using the 'Each attempt
builds on last' option, then the student's response could get lost.
Prior to this commit, the behat_form_editor integration was hard-coded
to use Atto.
This change allows other editors to be used to set editor values, and
breaks that hard bond. Following this change, any editor is able to
define a behat_editor_[name].php file defining a function which meets
the following signature:
set_editor_value(string $editorid, string $value): void
Each editor is responsible for checking whether its own API is available
and calling any relevant functions to force the editor to set the
content.
Please note: Behat is unable to determine the current editor in use on
the page automatically.
This change puts back the behaviour that get_fast_modinfo will accept
a cached version of modinfo that is newer than expected (according to
the course cacherev).
Not accepting newer versions can lead to poor performance in cases
where multiple requests take place at once, or using a clustered
database.
Following MDL-45184 this now finally deprecates and removes the class
\admin_setting_managelicenses. Please use \tool_licensemanager\manager
instead.
Following MDL-45184 this now finally deprecates and removes the
function license_manager::add(). Please use license_manager::save()
instead.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
* Add a $deprecatedcapabilities variable to deal with deprecated
capabilities
Change-Id: I14f44d331e8a1c4bd9abe9566c78d911c0205583
Co-authored-by: Mark Johnson <mark.johnson@catalyst-eu.net>
* Adds time logging (number of seconds for each success) on install,
which was previously only shown in upgrades. Useful when installing
a new plugin as part of an upgrade, or if anyone wants to optimise
Moodle installation.
* In developer debug mode, upgrade savepoint time was already logged
but now it also logs time for lots of 'details' of the process in
case time is taken in other Moodle function calls.
There are many places (install/upgrade for core, modules, blocks,
and plugins) where we need to call the same, or very similar,
sequence of Moodle functions to ensure the item is updated properly.
This change moves that sequence into a function so that it can be
held consistently in one place.
When an HTML content area contains invalid HTML, some editors will clean
and validate the content upon submission.
In this case the content was:
<b>Test content</b>
But this should be wrapped in some form of container which accepts
phrasing content (such as a <p> tag).
Some editors, such as TinyMCE, will normalise the content and add the
wrapping paragraph tags to it.
Furthermore, the bold tag is purely stylistic and does not have semantic
meaning. As a result, the <strong> tag is favoured and some editors,
again such as TinyMCE, will replace bold tags with strong tags.
We should update the content here to be valid HTML (wrap the bold tag
in a para), and use a strong tag rather than bold. This allows this test
to pass both with Atto, and other stricter editors such as TinyMCE 6.
These steps are currently using Atto-specific UI features and must
therefore make use of the @editor_atto tag to ensure that they continue
to run using Atto.
A new issue will be raised to migrate each of these to be
editor-agnostic.
When the template editor is configured to use the HTML Editor, it should
indicate this to Behat by setting the `data-fieldtype` to "editor".
This indicates to the behat field manager that the editor is in use,
which ensures that the correct value setting can take place.
This is important in the context of MDL-75887.
When an editor is used in a form as part of a group, it is missing its
label element.
This happens because there is no inline template for the editor, and
therefore it reverts to using the old `toHtml` function. The legacy
function does not cater to the editor being in a group, and therefore
does not add the hidden label.
In addition, the hiddenLabel attribute was missing from the editor
element. This is a semi-standard element but must be added to each
supporting element.
Both the missing inline template for the editor, and the hidden label
attribute must be present:
- If the hidden label attribute is not present, then the standard inline
template will add a visible label within the group.
- If the inline editor template is missing, then the label is not shown
at all.
* Remove the setting "lock on join" and related settings
* Hard-code the lockSettingsLockOnJoin=true parameter on create when any of the lock settings is used.
In MDL-75146, the get_fields_record() method was added without any
ordering criteria.
In MDL-75276, this method is reused to get the fields. We need to
re-add the order to guarantee the field are always returned in the
same order (and avoid some Oracle ordering failures).
Fixed problems in lateral navigation and grading when
a SCORM has more than three levels
The SCORM module has problems with full screen display,
completion tracking and grading in SCORM.
Also resolves issues MDL-74992, MDL-73249, MDL-75407
This change, which should be easy to mimic for other editors.
This will ensure that the correct editor is used for tests relating to
that editor, or its subplugins.
The mod_data is forcing teachers to understand how to write templates
even if they want to use basic forms. With this patch the default
templates will be auto updated unless the user manually define the
templates.
Provide a test page in authentication settings
to allow administrators to test configured oAuth2
providers and to examine the data that is passed
back on a successful test user authentication.
Co-authored-by: Matt Porritt <mattp@catalyst-au.net>
If you have one course format that extends another one, any course
format output classes that are not defined in the child format will
now inherit from the parent (instead of from the base class as
before).
The current implementation conditions the highlight and hidden form
student badges to the present of the badges in the HTML. This way if a
format does not include those badges the code will continue working.
The formatting of exported dataformat content is now always dependent
on whether the format supports HTML or not, so we no longer need our
custom export class for providing the same.
Apart from updating the default templates, to make them look better,
they have been also moved to mustache files, in order to make it easier
to edit them.
The OR conditions in the WHERE clause prevented the query from
effectively filtering the messages related to the user quickly, this
change helps gets around this by allowing the database to limit
the rows in the messages table it needs to scan significantly.
The following change adds support to show only active course users
in the forum grader and generally replicates the behaviour from the
assignment grader which relies on certain config settings, user
permissions and capabilities.
Standardises return patterns of null values across database types
to keep with sorting nullsto the top when ascending, and
to the bottom when descending
Modifies the 'core_course_get_enrolled_users_by_cmid' webservice and
the generic js methods that call this webservice and enables defining
whether the ws should only return the active users or all enrolled
users in the course.
When using the date filter with the "Current" operator, the "Value"
field should not be present (because it has no meaning). This fixes
a small regression from 131a9740.
This implementation will de-couple the participant filter from
core user to core so its easily usable to any api in core or any
community plugin. This removes the dependency from the core_user
and creates a nice api where it can produce filterable objects.
Co-Authored-By: Safat Shahin <safatshahin@catalyst-au.net>
Co-Authored-By: Tomo Tsuyuki <tomotsuyuki@catalyst-au.net>
AMOS BEGIN
MOV [addcondition,core_user], [addcondition,core]
MOV [adverbfor_and,core_user], [operator_and,core]
MOV [adverbfor_andnot,core_user], [operator_andnot,core]
MOV [adverbfor_or,core_user], [operator_or,core]
MOV [applyfilters,core_user], [applyfilters,core]
MOV [clearfilterrow,core_user], [clearfilterrow,core]
MOV [clearfilters,core_user], [clearfilters,core]
MOV [filtersetmatchdescription,core_user], [filtersetmatchdescription,core]
MOV [filterrowlegend,core_user], [filterrowlegend,core]
MOV [filtertype,core_user], [filtertype,core]
MOV [match,core_user], [match,core]
MOV [matchofthefollowing,core_user], [matchofthefollowing,core]
MOV [placeholdertypeorselect,core_user], [placeholdertypeorselect,core]
MOV [selectfiltertype,core_user], [selectfiltertype,core]
AMOS END
This issue just goes over all the currently incorrect
namespaces in test cases and:
1. Change the namespace to the correct one.
2. Move/rename it to correct location if needed (level 2 and down).
3. Remove not needed MOODLE_INTERNAL check when possible.
4. Remove file phpdoc when the file only has one class.
5. Make small adjustments in case the change of namespace requires it.
There is an upgrade to clean the moodlenetprofile field which
performs very poorly, but it is also not needed because an upgrade
further down sets this field to empty string anyway.
Show performance information about locks (time taken to acquire lock,
time lock is held for) in the 'perfinfo' display.
Also show existing information (that was already calculated but not
shown before) about the session lock, which is not a 'core\lock' type
lock, but the information is similarly useful.
Have tried to also bump Travis to 22.04 (jammy) but it
was not working ok, with problems trying to find both
PHP and PostgreSQL versions.
Surely that's because 22.04 support is really new (Sep 9, 2022):
https://blog.travis-ci.com/22-9-9-ubuntujammy
So we'll have to wait a little more before being able to, also,
bump Travis to use 22.04
We were using our fork of the mink extension:
https://github.com/moodlehq/MinkExtension.git
Because they bumped requirements to PHP 7.4 too early for us. Now,
with Moodle 4.1, finally our requirements are also PHP 7.4, so we
can stop using the fork and switch to the upstream one:
https://github.com/FriendsOfBehat/MinkExtension
Note this only can be done in 4.1dev, because this is the first
version using PHP >= 7.4. Older branches will need to continue
using the fork. Also, note that we may need to go back to the
fork if there is any future trouble with the upstream library
not matching our supported PHP versions.
Apart from that, it's a good moment to bump other components to
current ones.
Of course, this has been generated following the instructions:
https://docs.moodle.org/dev/Composer
And using PHP 7.4 (always the min version supported) to generate
the lock file.
Note the failures are unrelated to this issue, but we needed
an ongoing issue to add the tag and this was picked.
The problem, only reproducible @ CI servers will be fixed here:
https://tracker.moodle.org/browse/MDL-75820
In circumstances where all collapsible form sections were expanded on
page load, a check is now made to ensure the expand all/collapse all
button behaves as intended.
Deprecates the select_in_gradebook_navigation_selector() function in
behat_grade.php and removes all usages. The select menu field supports
the same functionality and this function can be simply replaced with
behat_forms::i_set_the_field_to().
Adds new template dedicated for the general tertiary navigation element
which utilizes the exising select_menu output component. Also, adds
custom styling to the tertiary navigation selector element.
Adds behat support for group structures in the select menu field. When
looking for a particular option you can further specify the group under
which this option should be located by using the '>' delimiter
(e.g. "Group name > Option name"). In addition to that, this commit
intorduces new step definition which can be used to check whether the
select menu field contains a particular option.
The following commit fixes the current logic that is used to return the
selected option and take into account structures with group options.
Also, it adds a default value to the $labelattributes class property to
to fix the issues that occur then the label is not explicitely set by
set_label().
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.
Recently, PHPUnit (all versions) did some changes about how the
comparators worked and this has caused some float comparisons
to stop working.
We need to move them to assertEqualsWithDelta(), allowing a small
tolerance to workaround the floats comparison problem.
0.00001 has been decided. And applied to all the similar assertions
within the unittest function, so if more cases are added to them
better be copied with the agreed tolerance.
This issue greatly improves the performance of displaying statistics in
the question bank.
1. The required quiz statistics are now pre-computed by a scheduled task.
2. Cached statistics in the database are now never cleaned up, so the
pre-computed stats are always available.
3. The way the cached statistics are loaded for each question
that is being displayed is now a bit more efficient.
4. Related to that, there is a new callback which activities can implement,
if they want their question statistics to be included in the ones shown
in the question bank.
Note, there is still further improvement possible to load the statistics
for all questions being displayed in bulk. However, that must wait for a
future issue, MDL-75576. The other improvements in this issue are
significant and we did not want to delay releasing them.
Co-authored-by: Jonathan Champ <jrchamp@ncsu.edu>
Co-authored-by: Tim Hunt <t.j.hunt@open.ac.uk>
The cache file is only ever written to in the `write_file` function,
where it does so by writing to a temp file and performing an atomic
rename of that file. When writing, the target file is never locked.
The cache file is only ever read in the `get` function, and there is no
need for an exclusive lock in that situation.
There is therefore no need to obtain any lock, shared or exclusive, to
read the cache file. Doing so only affects performance of the file sytem
as file locks must be needlessly obtained and written to disk for a read
operation which does not benefit from them.
- Guest user attempting to access to single-activity course.
- Not enrolled user attempt to access to single-activity course.
Both should, by default, land to the "cannot access/enrol" page.
The Redis cache store and session handler both do a 'ping()' after
connecting to Redis. This is unnecessary because the connect() call
has just checked the network connection and it's hardly likely that
the server has gone down since then.
According to my profiling, both connect() and ping() take
measurable time when talking to a separate server, i.e. a few
milliseconds. So it's not the case that connect() doesn't really
talk to the server, as I initially wondered.
If using Redis on a separate (non-localhost) server for both session
and cache store, removing these ping calls can save a millisecond
or two per request.
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:
- In lib/tests/blocklib_test.php 2 helper classes have been
moved to tests/fixtures, because they needed to be namespace-free.
We should respect the value of the PHPUNIT_LONGTEST constant in the
report source stress tests, as it was discovered after 165e26fa that
the default configuration of some CIs (GHA) was not sufficient to run
them.
Hence, use the PHPUNIT_LONGTEST to determine whether to execute said
tests. Note this constant is enabled on internal CI.
* When loading a course with the Recent Activity block the bigbluebuttonbn_print_recent_activity
takes too much time to load the logs. Using the courseid (index of log table) improves the
time taken by the query.
* Opening braces should be on the same line
* Unwanted MOODLE_INTERNAL
* Behat edit_instance.feature should use "activity editing" page locator
* Coverage indication
Calling \core_user\fields::get_sql() incerements a static uniqueid
variable. This should be called only once and not make a separate call
for the sort mapping data as it doing so will result to an incorrect
table alias for the sort mapping data.
The parameters $exportactiveurl and $importactiveurl are removed from
export_action_bar and import_action_bar classes. Not only passing them
were redundant and it was possible to generate them by having
$activeplugin (also passed to the mentioned class constructors), but
also we had a bug there. The value of $PAGE->url was passed as those
parameters, but $PAGE->url can sometimes include additional parameters
and as a result, its value may not match any of the available
export/import plugins.
This commit introduces a new partial selector for select_menu fields,
and teaching the field manager how to recognise these, then introducing
a new field type which can handle setting values for this field.
Implement stress tester methods for iterating over report columns,
aggregation and conditions. Assert that each works correctly in
isolation, and when used in conjunction with other columns.
With IANA TZDB (timezone database) release 2022b, Europe/Kiev
has been renamed to Europe/Kyiv. So we need to add this string
to our list to keep tests passing.
Note that the old Europe/Kiev continues working (is an alias) and,
also, there are places in core where we are using it. Just we cannot
remove/replace those uses in core until we ensure that everybody is
using PHP 8.0.23 (TZDB 2022b) or more recent versions. Hence,
not changing those uses now.
Oracle 21 performs worse than previous versions and this
is causing some tool_httpsreplace jobs to, near consistently,
fail with timeouts.
This can be workaround in a number of ways:
1) Hacking tool_httpsreplace to detect when it's running a
behat test and avoid running it completely. We did something
like that for tool_customlang in the past. Ugly exception.
2) For Oracle jobs, set BEHAT_INCREASE_TIMEOUT to 2 or higher, that
will allow the whole behat run to have more time. Maybe too much
if only the tool_httpsreplace scenarios are affected. And requires
special configuration in sites running the tests.
3) Improve Oracle 21 performance. There are some remaining tests to
perform to achieve that, but it's extremely slow process, so it
won't happen soon.
4) Give more time to the failing tests using the step: "I mark this
test as slow setting a timeout factor of X". It applies to all
databases, but we are already using it, so no big problem. It's the
same than solution 2) but from within the tests instead of affecting
to the whole run.
From all the alternatives above, this patch implements 4), doubling
(from current 2 to 4), to give each test up to two minutes
(30 secs * 4 = 120 secs) with the new allowed timeout-factor.
The uniqueidentifier argument is only needed by the version selector and
can be set within the output fragment function using it. There's no need
for it to be a parameter when calling the output fragment function.
* Sometimes recordings are not migrated when upgrating from pre-4.0 release
version. The additional script will allow to launch the migration once again
either for specific courses or activities.
Mustache version 2.14.1 is already included, but the VERSION const
incorrectly listed 2.14.0 in the tagged Mustache release. A later
upstream commit corrected this in the library, which this now matches.
* Replaces checking header for SEB config keys to assess quiz access.
* Adds new web service accessible via Ajax
* Forces the use of the new API where available
* Stores access in Moodle SESSION for quiz instead of checking every
page.
The enabled state of a plugin is a tri-state value (boolean or
null). We should be consistent with elsewhere by only considering
boolean false as an actually disabled plugin.
See also cdcb53a1 for similar change in task management.
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:
- The following task tests have been moved within the level2 directory:
- \core\adhoc_task_test => \core\task\adhoc_task_test
- \core\scheduled_task_test => \core\task\scheduled_task_test
- \core\calendar_cron_task_test => \core\task\calendar_cron_task_test
- \core\h5p_get_content_types_task_test => \core\task\h5p_get_content_types_task_test
- \core\task_database_logger_test => \core\task\database_logger_test
- \core\task_logging_test => \core\task\logging_test
- The following event tests have been moved within level2 directory:
- \core\event_context_locked_test => \core\event\context_locked_test
- \core\event_deprecated_test => \core\event\deprecated_test
- \core\event_grade_deleted_test => \core\event\grade_deleted_test
- \core\event_profile_field_test => \core\event\profile_field_test
- \core\event_unknown_logged_test => \core\event\unknown_logged_test
- \core\event_user_graded_test => \core\event\user_graded_test
- \core\event_user_password_updated_test => \core\event\user_password_updated_test
- The following output tests have been moved within level2 directory:
- \core\mustache_template_finder_test => \core\output\mustache_template_finder_test
- \core\mustache_template_source_loader_test => \core\output\mustache_template_source_loader_test
- \core\output_mustache_helper_collection_test => \core\output\mustache_helper_collection_test
- The following tests have been moved to their correct tests directories:
- lib/tests/time_splittings_test.php => analytics/tests/time_splittings_test.php
- All the classes and tests under lib/filebrowser and lib/filestorage
belong to core, not to core_files. Some day we should move
them to their correct subsystem.
- All the classes and tests under lib/grade belong to core, not
to core_grades. Some day we should move them to their correct
subsystem.
- The core_grades_external class and its \core\grades_external_test
unit test should belong to the grades subsystem or, alternatively,
to \core\external, they both should be moved together.
- The core_grading_external class and its \core\grading_external_test
unit test should belong to the grading subsystem or, alternatively,
to \core\external, they both should be moved together.
- The \core\message\message and \core\message\inbound (may be others)
classes, and their associated tests should go to the core_message
subsystem.
- The core_user class, and its associated tests should go to the
core_user subsystem.
- The \core\update namespace is plain wrong (update is not valid API)
and needs action 1) create it or 2) move elsewhere.
This commit fixes few things:
- Fix correct language string order.
- Change the code in myprofile.php to be consistent with other checks.
- Update provided test to fix behat failure.
The 'user' parameter has been added to the 'mod_data > presets'
generator, to let define the author of the preset.
When it's not defined, admin is used as the author.
This commit changes changes the unit test calculations to
keep track of the time the bucket starts/finishes bursting
and use milliseconds instead of seconds to have a precise
time to sleep.
From now on, the data_generate_default_template method will always return
a string with the template content or an empty string when there is no
content available (for instance, when the database has no fields).
This method won't return a boolean anymore.
The 'user' parameter has been added to the 'mod_data > entries'
generator, to let define the author of the entry.
When it's not defined, admin is used as the author.
Update existing entity to define remaining report elements. Add new
report source joining the entity to the user entity to provide data
for the reportbuilder editor.
This issue has started causing some errors with behat. It seems the
"Save changes" button is not clickable, so changing the window size
will do the magic.
* As a student I should only be able to access the next question or the current question
* The API should not show more than the current question
* Once the quiz is previewed we can see the question in any order (existing behaviour)
* Related to ticket MDL-71728
Co-authored-by: Rajneel Totaram <rjnlfj@yahoo.com>
Co-authored-by: Tim Hunt <t.j.hunt@open.ac.uk>
For a long time, Moodle has had the feature to force the language
for a whole course. This change adds the same feature at activity
level.
The course-level feature was controlled by a capability
moodle/course:setforcedlanguage, and I decided to use the same
capability to control this feature. I think a new capability would be
overkill.
This is a regression from MDL-75146, when the manager class was created.
The field class was not found in the Single view, because the field.class.php
file was not included (so the base class was used in all the cases for this
view). That's why the image field was displaying only the image name instead
of building the <img element or the URLs were displaying only the text, instead
of creating a link for them.
Replace steps that manually add H5Pactivity instances via the UI
and use Behat generators. This improves the speed of the Behat test
runs.
Co-authored-by: Simey Lameze <simey@moodle.com>
* When Show imported links only is enabled in activity or config, only imported recordings will appear
* Logic for activity/default overrides implemented
This commit adds support to description field for presets:
- For plugin presets, description will be stored in the module_help
string in lang files.
- For saved presets, a new element, <description>, has been added
to the preset.xml file, to include this information.
A new field has been added to the "Save as preset" modal, to let users
define description (which is empty by default, to support pre-existing
presets that won't have it).
Apart from that, the "Save as preset" workflow has been slightly improved,
following the Product UX/UX suggestions to hide the checkbox to overwrite
the preset by default and show it only if the user tries to save a preset
with an existing name.
The custom report exporter should define its own editable element
properties (conditions, filters, etc) as optional, rather than each
of those element exporters defining their properties as optional.
Replace steps that manually add BigBlueButton instances via the UI
and use Behat generators. This improves the speed of the Behat test
runs.
Co-authored-by: Simey Lameze <simey@moodle.com>
Editor stylesheets are kept separately to standard plugin stylesheets so
that they can be provided to style individual iframes where loading the
standard Moodle stylesheets would be incorrect.
Unfortunately the editor stylesheet system does not consider that
subplugins may want to add small individual styling to the editor but
this is required in some situations.
When resetting report filters, we need to include the original report
parameters in the external method call to ensure all those that are
required during validation are present (e.g. when determining if user
can view the current system report).
- Add a new help text.
- Add captions to table columns.
- Move action icons to action menu, and fix code to display the remove
action only for presets created by users.
- CSS improvements to fit the prototype.
In order to achive the previous points, the renderer has been improved,
to return the data and let the mustache to print it properly (instead of
returning the formatted HTML table).
This activity currently supports two different preset types:
- Datapreset plugins, that can be installed copying them to the
mod/data/preset folder.
- Presets saved manually by users.
This commit adds an attribute to the presets to mark them, in order
to identify them later (because, for instance, the plugins can't be
removed).
Apart from that, the methods in lib.php, involved with this issue, have
been deprecated. New methods have been implemented in the manager class,
covering them with PHPUnit tests.
While covering is_directory_a_preset() with PHPUnit tests, it has been
identified that there was a missing file in the Image gallery preset.
The template will be reviewed in the future (in a separate issue) but,
for now, I'm going to add the default template for advanced search.
The window.tinyMCE.editors API was present in version 3 of TinyMCE, but
is not present in later versions. As a result, this check tries to loop
over a variable which does not exist and throws an error in the process.
We should check that window.tinyMCE *and* window.tinyMCE.editors both
exist before attempting to loop over them.
Fixes the site home secondary nav, so that nodes added by plugins
implementing the PLUGIN_extend_navigation_frontpage callback can be
displayed for users who don't have the 'course:update' capability.
This change comprises:
- Removed course:update capability checks from site home (index.php)
and from the secondary nav view. This isn't needed since the nav is
capability aware.
- Fixed the initialisation of the secondary nav for the frontpage
course, removing erroneous duplicate 'home' nodes. The nav is now only
shown if there are nodes to display.
Allow adhoc tasks to implement this method, so they too can have
descriptive names for themselves. Default implementation added to
return the class name itself.
AMOS BEGIN
CPY [privacy:preference:showstandardinstruction,qtype_multichoice],[privacy:preference:showstandardinstruction,qtype_truefalse]
CPY [showstandardinstruction,qtype_multichoice],[showstandardinstruction,qtype_truefalse]
AMOS END
The changes introduced here are completely safe, just we stop
binding SITEID and, instead, embed it in the SQL.
Why? Because Oracle 21 has started to return non-sense results
when SITEID is bound.
After lots of tests, attempts, debugging... we have been unable
to find any logic to the need of this change and also, have been
unable to reproduce the problem with a standalone script that
pretty much runs the same queries that the ones changed here.
I'm sure that there is something, somewhere, but have failed
to find it, grrr.
Please read MDL-75208 and linked issues to find more information
about this problem, that is one of the biggest mysteries I've
seen recently. Maybe at the end there is a tiny detail that
explains it all, but it's really well hidden.
When concatenating column fields in order to perform aggregation on
them (e.g. group concatenation), we need to preserve all null values
in the data passed to each column callback.
Co-authored-by: Carlos Castillo <carlos.castillo@moodle.com>
Removal of the callback get_shortcuts() and its plugin implementations.
The private methods in the content_item_readonly_repository class
which were only used by the callback hook logic are also removed.
Previously the `moodle/course:bulkmessaging` capability controlled
access to the entire bulk actions menu for course participants,
rather than just those actions related to messaging.
Verify the expected behaviour of the sync_members and sync_grades tasks
when enrolment instances are disabled, whether as a byproduct of module
deletion, or as status change made by the user.
Adds a warning to the 'name' column of the tables, letting teachers know
that the activity exposed by the method has been deleted and what their
options are.
When instantiating classes that extend `inplace_editable` we can
improve performance by passing persistent instances we already have,
rather than re-requesting them.
Add test coverage to relevant classes.
This is a partial backport of MDL-73270 to ensure that the
check_xmlrpc_usage custom check is present in all the supported
branches and it's applied to all branches able to run php80:
- MOODLE_311_STABLE
- MOODLE_400_STABLE
- master (aka, 4.1 and up)
Note that the whole patch has not been backported, only the
environmental check (xml file and check implementation).
Basically, we only need to change:
- PHP 7.4
- PostgreSQL 12
Also, moving up to focal as dev environment, removing NVM_VERSION
because nvm automatically detects .nvmrc and switching to
socketed connection for PostgreSQL (little improvements).
Apply core_form/submit JavaScript code to prevent double submission of login form and guest login button.
Add ID to guest login button to make it addressable.
Moved written table timestamping from query_start() to query_end():
We are adjusting table last written times at the end of transaction.
That does not apply to immediate database writes that are not performed
within transaction. This change is to set last written time after the query
has finished for such writes, rather than before it started. That way
long write operations cannot spill over the latency parameter.
This code was used only by deleted upgrade steps so it's safe
to proceed with straight deletion, considering it internal.
Deletion has been documented in corresponding upgrade.txt files:
- \mod_forum\task\refresh_forum_post_counts adhoc task
And these is the list of code that has NOT been removed
because it may be needed in the future:
- \core_search\manager::clean_up_non_existing_area(), used by
- adhoc task: \core\task\clean_up_deleted_search_area_task adhoc task
This code was used only by deleted upgrade steps so it's safe
to proceed with straight deletion, considering it internal.
Deletion has been documented in corresponding upgrade.txt files:
- upgrade_analytics_fix_contextids_defaults()
- upgrade_convert_hub_config_site_param_names()
- upgrade_rename_prediction_actions_useful_incorrectly_flagged()
This just deletes all the upgrade steps previous to 3.9.0. Some
small adjustments, like tweaking globals can also be applied
when needed.
Also includes an upgrade step to prevent upgrading from any
version < 2020061500 (v3.9.0) as anti-cheating measure.
The next commits will proceed to deprecate / remove functions
that were exclusively (usually belonging to upgradelib) being
used by those, now removed, upgrade steps. This is the list
of code to remove and document in upgrade.txt files:
- upgrade_analytics_fix_contextids_defaults()
- upgrade_convert_hub_config_site_param_names()
- upgrade_rename_prediction_actions_useful_incorrectly_flagged()
- \mod_forum\task\refresh_forum_post_counts adhoc task.
And these is the code that has NOT been removed
because it may be needed later (no matter there aren't uses now):
- \core_search\manager::clean_up_non_existing_area(), used by
- \core\task\clean_up_deleted_search_area_task adhoc task
Now that the required PHP version has been raised to php74, set
it in the composer.json file and regenerate everything, following
the instructions @ https://docs.moodle.org/dev/Composer, also
with php74.
That's the only change (raised php version) as far as no change
has been performed to extension.
This re-applies the same fix that was used for the central mod form
to the workshop activity. This is needed because the completion
support for this module is custom (there are 2 grade items), hence
the validations are also custom.
For more information, read the previous commit and MDL-74516
Unfortunately, because of a related bug with assessment completion
(see MDL-69690) we cannot provide automated testing for this
activity. Manual instructions will be provided instead.
Current code was relying on grade_floatval() that is not a validation
function. Instead, the gradepass field must be defined as proper float
and then perform the needed validations using unformat_float().
Note that the float element form has some particularities, see
MDL-73994 for more information and that makes us to have to check
for some values (null, zero) manually. Once that form element type
gets its behaviour fixed, the code will need to be revisited, hence
we have annotated it as comments for easier finding it in the future
(the same changes already were applied to other gradebook forms).
Also, remove an unreachable line of code (comparing with empty string)
within the grade_floatval() function because it's not possible anymore
to pass any string to it, as far as it's "?float" typed.
Covered as many cases with quiz completion as have been able to imagine.
Due to fixed positioning of the block drawer and the navbar, the
z-index css property on the skip link elements from the drawer
is not respected. This ultimately results in the skip links being
stacked behind the navbar. As a workaround, an absolute positioning
will be temporary applied to the block drawer once the current
focus is on an element within the drawer which will stack the
skip links infront of the navbar.
- Apply the .alert-dismissible class for notification alerts with
close button to fix its positioning. As an added bonus, the
.alert-dismissible class also enlarges the clickable area of the
close button which is great for accessibility.
- Improve example context for the notification alerts templates.
This patch modifies the way copy data is shared in order to mitigate potential race conditions
and ensure that the serialised controller stored in the DB is always in a valid state.
The restore controller is now considered the "source of truth" for all information about the
copy operation. Backup controllers can no longer contain information about course copies.
As copy creation is not atomic, it is still possible for copy controllers to become orphaned or
exist in an invalid state. To mitigate this the backup cleanup task has been modified to call
a new helper method copy_helper::cleanup_orphaned_copy_controllers.
Summary of changes in this patch:
- Copy data must now be passed through the restore controller's constructor
- base_controller::get_copy has been deprecated in favour of restore_controller::get_copy
- base_controller::set_copy has been deprecated without replacement
- core_backup\copy\copy has been deprecated, use copy_helper.class.php's copy_helper instead
- backup_cleanup_task will now clean up orphaned controllers from copy operations that went awry
Thanks to Peter Burnett for assiting with testing this patch.
Re-factor existing code to make use of file manager class that renders
these details for us by default.
Co-authored-by: Simey Lameze <simey@moodle.com>
We are disabling the -v (verbose) option, used by default. Still,
now we support a secret (that can be added to everyone's repository)
to accept any PHPUnit's command line options and run the tests with
them.
Some examples:
phpunit_options = -v (to keep the verbose option enabled)
phpunit_options = --testdox (to print information about every test...)
... (basically anything supported by the CLI).
Also, we are raising here the environment from Ubuntu 18.04 to 20.04
(self tested by GHA, heh)
Switch the select element event listener to that provided by custom
events helper, for adding report filters and conditions. This improves
cross-platform support.
* Darken the score value using the green theme colour
* Use a light green theme colour for selection backgrounds
* Unify rubric styles related to background and text colour within the
criteria.
The previous code was resetting timestamps for only the file itself,
which could lead to it having an earlier time than the root entry of
it's filearea.
This caused sporadic test failures when the current time ticked over
by a second during execution.
* When adding the block_site_main_menu on every page, the activity chooser generated
for this entire page is set with courseid = 1. So any activity is then added to the
home page instead of a course.
Both entities define columns and filters for related tags (referred
to as "interests" for users).
Create new generic tags filter type to facilitate this, which can be
re-used by any entities for components which support tagging.
It has been detected that the flatten_dependencies_array() was fragile
and leading to wrong results when some incorrect data was passed to it.
This includes:
- Missing elements.
- Null dependencies.
- Non array dependencies.
While the existing behaviour (testing-wise) has been preserved, now the
situations above are better controlled and the function ignores all
those incorrect cases that shouldn't happen ever.
That implies that a good number of notices/warnings/errors aren't
happening anymore. That was impacting both results (when the problems
were only notices and warnings) and execution (when the problems
were errors).
Covered with tests.
* Completion view should work out of the box
* Patch the _user_outline and _user_complete so it works with completion view, while
implementing something better in MDL-74468
Reverting the addition of a Boostrap tooltip on the alert notification's
close button. It introduced a bug where the tooltip remains after
dismissing the notification alert. We can manually toggle the state of
the tooltip via JS, but I don't think it's worth the effort. The tooltip
is meant as an added bonus for sighted users to see what the close
button is about.
Use #region-main-box and not .mform in the selector, otherwise it may
return the wrong mform, such as global search, if enabled. This is the
same way the form is selected in showMultipleSummaryAndHideForm().
Adjusted the condition while reading the streams
in chunks. Read till the end to make sure we have got all
the data. Else we might not get all the data to show
in file picker.
Secondary nav previously had to be in my_plugin\local\views\secondary; this
location continues to work but is deprecated. The new location is
my_plugin\navigation\views\secondary.
Following MDL-63580 this now finally deprecates and removes the class
\tool_task\run_from_cli, please use \core\task\manager.
Following MDL-63580 this now finally deprecates and removes
- admin/tool/task/cli/schedule_task.php, use admin/cli/scheduled_task.php
- admin/tool/task/cli/adhoc_task.php, use admin/cli/adhoc_task.php
Also mentions and references to the old CLI scripts are updated to
point to the new counterparts.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
Ensure the saved values for the hidden and hidden until fields are
populated when editing a grade category. Fix behaviour on enabling
the hidden until field.
Re-enable tests commented out in eba1d32c.
As well as storing 1/0 to indicate hidden state, they are also used
to store a timestamp indicating hidden until date. Increasing field
size allows these values to be stored without triggering exceptions.
This patch fixes the behat failures with classic for the scenario
"Upload users enrolling them on courses and assign category roles".
There is a "Participants" link hidden in the "Site pages" which is
causing these failures.
Apart from this, there was another issue because it was not possible
to navigation with classic (I've added one extra step to visit homepage).
This adds a condition to check if Online text is used
for the submission. The functions file_postupdate_standard_editor
and file_postupdate_standard_filemanager needs the property
content_editor of the formdata.
The implements the new regrade-related hooks, and also has
tests for the changes to the core system, now that we have a question
type we can use for them.
This commit implements the necessary core hooks to ensure we only
allow a regrade of a quetion attempt to take place if the new and old
versions of the question are sufficiently similar.
It will be followed by commits to each question type where the
new method needs to be implemented.
Automated tests will be included in the first of those (mulitple choice)
becuse we need a question type that implements the hooks to test
the core changes.
During the late stages of developing MDL-20636, some key concepts
in the code got renamed. However, at the time, this class was not
updated properly so updating it now.
- Formatted the query to meet SQL coding styles
- Add index on {files} to prevent performance regression
- Fork the SQL query based on DB family based on support
- Updates to log stores and backup helper to improve performance when
checking if a course has been modified.
- This is a breaking change as it adds a new function on the sql_reader
interface.
Co-authored-by: Kevin Pham <keevan.pham@gmail.com>
This patch changes the way adhoc tasks are chosen to run. It now calculates
how many runners each type of adhoc task should be allowed to use. In the
case that not all the runners are utilised, it attempts to infer which
tasks do not take a long time to run, and gives those to the vacant runners.
Thanks to Brendan Heywood for guidance and SQL help.
The 'unable to obtain session lock'-exception raised by the Redis
session handler is hardcoded in English and not all that useful
to the end user.
This change adds the error message to the lang/error.php and gives
the user further hints why the error might have occured and how it
could be fixed.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
* Make the ordering of the message and the close button logical on
the DOM.
* Hide the times HTML entity
* Add sr-only label on the close button for non-sighted users
* Add tooltip on the close button sighted users
* With all the notification templates being the same except for the
class, I created a base notification template (core/notification_base)
that alert notifications just override. This avoids code duplication
and can make maintenance simpler.
In MDL-73915 the nodejs version was switched to lts/gallium but the
travis integration was not updated.
Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
* No need to enclose the title of the quiz navigation fake block in
a span tag. The block title also gets appended to the skip link which
means that a block title with a span tag assigned with an identifier
can cause duplicate ID errors on the DOM.
Display more friendly messages when:
* When displaying activity and the server is not available
* When we join a meeting and the server is not available or an error is detected
When the user is logged in successfully then reset the value
of login_failed_count_since_success to zero, if the value of
login_failed_count_since_success is greater than zero.
Create two entities exposing reportable data on badges and their
recipients, via column and filter definitions.
Create report source bringing them together along with the user and
course entities to provide data for the reportbuilder editor.
Prior to this change, the testcase would assert ordering based on
identical fields which could lead to random failures. Set distinct
next start time of course backup, and also remove random ordering
by sorting on defined course order (all other fields being equal).
Given that custom reports can now have defined pagesize properties, we
need to preserve that value in the table filterset so that it's always
available after AJAX requests.
- Replace all individual calls to add all columns, filters and
conditions on the cohorts datasource with the new
method add_all_from_entities().
- Replace all individual calls to add all columns, filters and
conditions on the courses datasource with the new
method add_all_from_entities().
- Replace all individual calls to add all columns, filters and
conditions on the users datasource with the new
method add_all_from_entity().
Without this index, a full table scan / table level locking occurs when
logging out of Moodle. This can result in slow performance in a busy
Moodle site.
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:
- Moved to the level2 "privacy" namespace:
- \mod_assign\privacy\feedback_legacy_polyfill_test
- \mod_assign\privacy\submission_legacy_polyfill_test
- Moved to the level2 "task" namespace:
- \core_message\task\migrate_message_data_test
- \ltiservice_gradebookservices\task\cleanup_test
- \message_email\task\send_email_test
- \mod_lti\task\clean_access_tokens_test
- \mod_workshop\task\cron_task_test
- Moved to the level2 "event" namespace:
- \core_h5p\event\deleted_test
- \core_h5p\event\viewed_test
- Renamed to a better name:
- backup_forum_activity_task_test.php (missing "task")
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:
- Some fixtures, initially defined in the test files have been
moved to new files in fixtures subdirectory, leaving the unit
test files clearer:
- moodle2_course_format_test.php
- Rename wrong named test:
- baseoptiogroup_test = baseoptigroup_test
Adds a new install script for the BBB module and a new upgrade step.
The BBB module now will be disabled by default for new installations
and also it will be disabled for the existing sites that use the
default BBB server configuration. Admistrators will be required to
confirm the acceptance of the related DPA prior to (re)enabling the
plugin once again.
Adds a note in the BBB general settings page to raise awareness about
the legal obligations related to the data processing agreement with the
service provider which is currently configured.
Implements a function for the 'pre_enable_plugin_actions' callback.
When the default BBB server settings are used while the administrator
attempts to enable the BBB plugin, the function will prevent this
action and trigger a dynamic form requesting the admin to conifrm
their acceptance of the related data processing agreement. The process
of enabling the plugin will continue as usual in cases where the
admin has already confirmed the acceptance of the dpa or a different
BBB server configuration is used other than the default.
Adds a callback xxx_pre_enable_plugin_actions in admin/modules.php
which plugins can use to force additional actions before enabling the
plugin. The return value (bool) from the plugin callback method
specifies whether the process of enabling the plugin should continue
after the added actions or not.
This patch wraps the login_failed_count logic in a resource lock and
forces a user preferences cache reload. Each thread must wait for the
lock and must fetch the current count before incrementing it. This
ensures that login_failed_count is correct across threads and that the
lockout threshold is correctly honoured.
Co-Authored-By: Sujith Haridasan <sujith@moodle.com>
Modified course format options reading and writing to be able to handle Editor elements by enabling them to split array values into
multiple values before inserting into database, and combining multiple values into an array when reading from the database.
Modified backup and restore code to use backup_nested_elements, and to interact directly with the database.
Co-authored-by: Jason den Dulk <jasondendulk@catalyst-au.net>
Co-authored-by: Matthew Hilton <matthewhilton@catalyst-au.net>
The activity header, which includes things like dates and completion
information, was moved out of the page $OUTPUT and into a separate
template context variable in 4.0, meaning it was missing from any layout
which didn't actively add it back to the page output. This fixes this
problem for the embedded layout only by adding support for the activity
header in the embedded template.
The defined context in admin_settingpage does not always relate to the
system context. One example is the 'frontpagesettings' admin setting
page which specifies front page as it's default context. Therefore, the
page context in admin/settings.php should be consisent with the defined
context in the related admin_settingpage object to make sure that the
expected navigation menus are being displayed and properly highlighted.
Additionally, the code in admin/settings.php related to the breadcrumb
structure specific to 'frontpagesettings' has been removed as it is no
longer relevant.
The scenario has not only grades related completion conditions
but also timing conditions or reach the end conditions that
shouldn't be tested by a grades feature.
More yet, those completion conditions are already tested by
other feature files, namely:
- reach the end: completion_condition_end_reached.feature
- visit and timing: lesson_activity_completion.feature
So we have removed all those parts that are being tested
by other features.
Specially the visit and timing ones, because they lead to
random failures in slow environments and they have been
fixed in the lesson_activity_completion.feature scenarios
by MDL-72698.
* Fix issue with the roomupdater that should not force the updatecache flag
for get_meeting_info API
* Fix issue when meeting is not started (and does not exist) and bigbluebutton_proxy::get_meeting_info
throws an exception, skipping the cache and then polling the server every second.
This should be a button given it's an action, and making it a button
means it can be activated using either the space or enter keys, instead
of just enter.
By adding the step:
Given remote langimport tests are enabled
We make the execution of scenarios requiring to install /
upgrade lang packs optional, based in the existence of the constant:
TOOL_LANGIMPORT_REMOTE_TESTS
That way, when we are skipping language upgrades with the CFG var:
$CFG->skiplangupgrade = true
We can decide not not execute those tests.
With other words, putting something like this in the config.php
file we will be controlling when to execute or no the behat tests:
// Disable lang updates on upgrade.
$CFG->skiplangupgrade = true;
if (empty($CFG->skiplangupgrade)) {
// Define it only if we aren't skipping lang upgrades.
define('TOOL_LANGIMPORT_REMOTE_TESTS', true);
}
This option was used to return the source files, but we do not support
this any more because we use source maps instead and require babel
transformation to support ES2015.
It does not make sense to support this code path any longer.
- There is now a single point for the configuration to be updated or
inserted into the DB.
- De-nestifying the code does make it longer to scroll through but you
can now edit areas of interest with more confidence, and should make
it easier to grok places of interest.
- Updated DB check from get_field to get_record as it's better in the
case of an update - using the id.
- Updates will happen on the ID field, which should be the primary key
for the table.
- Cache won't be invalidated if no changes were made.
- Property does not need to be checked for behat test if you are just
inserting a new value to an array using the arr[] = value syntax as it
should just work.
- Opted to replace array_key_exists with isset which is a faster check
due to it being a language construct and the fact that it should NOT
contain null values (as a null value would be removed) should mean
this is a safe change.
- Cleanup function param defaults.
- Prefer [] arrays instead of array() declarations.
2022-01-05 10:04:41 +11:00
13050 changed files with 656421 additions and 402810 deletions
{"version":3,"file":"block_management_table.min.js","sources":["../src/block_management_table.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\nimport PluginManagementTable from './plugin_management_table';\nimport {refreshTableContent} from 'core_table/dynamic';\nimport {call as fetchMany} from 'core/ajax';\nimport Pending from 'core/pending';\nimport {fetchNotifications} from 'core/notification';\n\nexport default class extends PluginManagementTable {\n constructor() {\n super();\n this.addClickHandler(this.handleBlockProtectToggle);\n }\n\n /**\n * Set the block protection state.\n *\n * @param {string} plugin\n * @param {number} state\n * @returns {Promise}\n */\n setBlockProtectState(plugin, state) {\n return fetchMany([{\n methodname: 'core_admin_set_block_protection',\n args: {\n plugin,\n state,\n },\n }])[0];\n }\n\n /**\n * Handle toggling of block protection.\n *\n * @param {HTMLElement} tableRoot\n * @param {Event} e\n */\n async handleBlockProtectToggle(tableRoot, e) {\n const stateToggle = e.target.closest('[data-action=\"toggleprotectstate\"]');\n if (stateToggle) {\n e.preventDefault();\n const pendingPromise = new Pending('core_table/dynamic:processAction');\n\n await this.setBlockProtectState(\n stateToggle.dataset.plugin,\n stateToggle.dataset.targetState === '1' ? 1 : 0\n );\n\n const [updatedRoot] = await Promise.all([\n refreshTableContent(tableRoot),\n fetchNotifications(),\n ]);\n\n // Refocus on the link that as pressed in the first place.\n updatedRoot.querySelector(`[data-action=\"toggleprotectstate\"][data-plugin=\"${stateToggle.dataset.plugin}\"]`).focus();\n pendingPromise.resolve();\n }\n }\n}\n"],"names":["PluginManagementTable","constructor","addClickHandler","this","handleBlockProtectToggle","setBlockProtectState","plugin","state","methodname","args","tableRoot","e","stateToggle","target","closest","preventDefault","pendingPromise","Pending","dataset","targetState","updatedRoot","Promise","all","querySelector","focus","resolve"],"mappings":"uhBAqB6BA,iCACzBC,2BAESC,gBAAgBC,KAAKC,0BAU9BC,qBAAqBC,OAAQC,cAClB,cAAU,CAAC,CACdC,WAAY,kCACZC,KAAM,CACFH,OAAAA,OACAC,MAAAA,UAEJ,kCASuBG,UAAWC,SAChCC,YAAcD,EAAEE,OAAOC,QAAQ,yCACjCF,YAAa,CACbD,EAAEI,uBACIC,eAAiB,IAAIC,iBAAQ,0CAE7Bd,KAAKE,qBACPO,YAAYM,QAAQZ,OACgB,MAApCM,YAAYM,QAAQC,YAAsB,EAAI,SAG3CC,mBAAqBC,QAAQC,IAAI,EACpC,gCAAoBZ,YACpB,wCAIJU,YAAYG,wEAAiEX,YAAYM,QAAQZ,cAAYkB,QAC7GR,eAAeS"}
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.