When upgrading from 'Sum of grades' to natural aggregation the
weights were no automatically assigned and the grade totals were
wrong. This has now been rectified.
For some reason, Safari behaves incorrectly when dealing with RTL content
where the table has a max-width of 100%.
This issue is a part of the MDL-25544 Epic.
Even if the navbar is in a static header, it should only be respected if it
is fixed still.
This issue is a part of the MDL-46658 Task.
This issue is a part of the MDL-25544 Epic.
As part of this, I tweaked the LTR style a bit, in a way that is both an
improvement (I hope) and also to reduce the amount of RTL-specific code
required. (Thanks to Fred for spotting some of the problems.)
Also, I changed one course style in boostrapbase, where the RTL rule was
different from the LTR rule.
Finally, I saw some repeated RTL rules in the quiz styles.css, and so
eliminated the the duplicate rules.
If a handler is disabled, the user should be informed of this issue.
This issue is a part of the MDL-47194 Task.
This issue is a part of the MDL-39707 Epic.
Really, this is just to test the new behat setps, as much as anything.
Note that the details of what is written to the export files is tested in
the unit tests.
These steps were created by sam marshall and Jes Ackland-Snow at the Open
University. I just altered them to make them a bit more generic, and
submitted them to Moodle core, at the point when I wanted to reuse them
in another plugin.
This commit introduces two new steps:
Then following "XXX" should download "YY" bytes
Then following "XXX" should download between "YY" and "ZZ" bytes
At the moment, this only works for links with href attributes.
When a checkbox is not checked, it does not submit in the form, therefore
this must be an !empty() test instead of an (int) casting.
This issue is a part of the MDL-47194 Task.
This issue is a part of the MDL-39707 Epic.
1) Get rid of "uid" that is a reserved word.
2) Add cross-db support for text columns in the get_condition_sql() method
by adding a new, defaulting to false for BC param and intensively using
the sql_compare_text() helper to build the correct sql fragments.
That helper, used to fetch information from DB by all the grade_object
chidren classes was not behaving properly handling TEXT/CLOB columns.
Instead of creating a property within every class listing the
existing columns, it seems to be a better solution to instrospect
the database metadata (cached) to ensure the correct SQL is generated
in every case.
Behat tests for lang import. To run these tests you must define the
TOOL_LANGIMPORT_REMOTE_TESTS constant - because they rely on the
download.moodle.org infrastructure.
When working against external services it can be advantageous to not
have automated tasks all hit the service at the exact same time from
many different installations.
This change allows the use of 'R' in hour/minute fields of the scheduled
task definition so a task will be installed with a 'random' hour/minute
value for these sort of occasions.
Note that the task will be installed in the database with a defined
time, this simply randomises the time chosen when loading from the
definiton.
When working against external services it can be advantageous to not
have automated tasks all hit the service at the exact same time from
many different installations.
This change allows the use of 'R' in hour/minute fields of the scheduled
task definition so a task will be installed with a 'random' hour/minute
value for these sort of occasions.
Note that the task will be installed in the database with a defined
time, this simply randomises the time chosen when loading from the
definiton.
Added property 'visible' for cohorts. Unsetting it hides the cohort from users in the course.
AMOS BEGIN
CPY [visible,core_moodle],[visible,core_cohort]
AMOS END
Cohort capabilities are defined in lang/en/roles.php, remove(rename) the capability-styled strings
AMOS BEGIN
CPY [cohort:assign,core_assign],[assigncohorts,core_assign]
AMOS END
This part of the code is changing an index on the course_sections table to be unique, for this to happen in the upgrade script the index must be deleted and then the new version added.
Before this change the following was being done:
* The index is removed
* A query to delete records that were not unique on this index is performed
* The unique version of the index is added
After this change the following happens:
* A query to delete records that were not unique on this index is performed
* The index is removed
* The unique version of the index is added
When the original index is present the query uses it, which greatly improves the execution plan.
Before the change an upgrade on a site with around 387967 course_section records the upgrade would be stuck on the delete query for many hours, after the change the time can be measured in minutes.
This is a basic implementation of the actual content generation in the workshop
generator. Note the we do not generate actual grading form data (which is what
the grading strategy plugins would do), just their results.
This is built upon original work by Michael Hughes. We now have separate
settings for deleting workshop submissions, assessments and for resetting the
workshop phase.
The methods workshop::delete_submission() and workshop::delete_assessment() did
not delete files (embedded and attachments) associated with the given
submission or assessment. This is fixed now.
Additionally, the delete_assessment() method now cleans-up records from the
table workshop_grades, too. This internal workshop API still does not give
workshop subplugins a chance to clean up their data, should they store them in
their own tables instead of the workshop_grades one. This should be improved in
the future yet.
This is unrelated to the issue but was spotted while testing it. The order of
format_text() and file_rewrite_pluginfile_urls() was incorrect and threw
debugging message. Fixed now.
Not related to the issue itself but spotted while working on the
workshop reset feature. Assigning copyleft holder to Petr as the
original author of the file.
This is necessary for themes with non-fixed navbars to work with the
grader report, otherwise headers will be hidden.
This issue is a part of the MDL-46658 Task.
This issue is a part of the MDL-25544 Epic.
This makes use of Global YUI events to trigger the resized event handler.
This issue is a part of the MDL-46658 Task.
This issue is a part of the MDL-25544 Epic.
They are not serving the same purpose as the one they had before,
and they were overlapping with the content of the cell. Positioning
them somewhere else made them more confusing than helpful.
This issue is a part of the MDL-46658 Task.
This issue is a part of the MDL-25544 Epic.
The grader table has been made entirely standalone from core or
theme styling. The floating divs have to share the exact same
rules, and so it was a lot easier and more maintainable to just
style them both using the same selectors, entirely ignoring the
table default styles.
And because the selectors are unique for both the floating elements
and the table cells, a themer can easily re-use them to style both,
without having to dig around to find all the selectors to overwrite.
Working on this highlighted some issues with the positioning. Those
have been fixed within the same patch. And even though it is still
not 100% correct on IE, the result is pretty decent.
This issue is a part of the MDL-46658 Task.
This issue is a part of the MDL-25544 Epic.
For some reason, the max-width/min-width/width of the table cell containing
the name of the users did not work, leading to very large columns but a very
narrow floating one. Handling the size of those columsn upon resize was
also necessary after with this fix.
This issue is a part of the MDL-46658 Task.
This issue is a part of the MDL-25544 Epic.
This also moves the code into a set of separate files to allow for
additional components of the report to be migrated to the same YUI module,
adjusts some UI components, improves JS performance, and adds appropriate
documentation.
This issue is a part of the MDL-46658 Task.
This issue is a part of the MDL-25544 Epic.
While doing this code clean-up, I noticed that the question bank pop-up was
only showing the question name, whereas it should have been showing the
question name and the start of the question text, so I fixed that.
Changes include:
* Search for existing items to reduce DB queries in grade_category::aggregate_grades
* Comments improvements
* Move brackets to be part of lang string
* Convert aggregationhints to be a class variable instead of passing it around
Part of: MDL-46576
It's still not perfect, but this is getting closer.
This is based on Johns work on MDL-47009 (just the algorithm). There are some additional
changes to scale the weights if they do not add up to 1.
Part of: MDL-46576
Before this patch we would be marking some items as 'needsupdate'
during an update. Leaving them aside and not effectively updating
them.
Part of: MDL-46576
If you edited a question from the Edit quiz page in a quiz, the navigation
bar was far too long. This was due to some odd code that was trying too
hard to be clever.
Instead, editing a question is now always treated as being logically within
the question bank for the purposes of navigation. That is, even if the
returnurl will end up taking you back to where you where when you have finished.
This commit is actually the joint work of Mahmoud Kassaei, Colin
Chambers and Tim Hunt from The Open University. We could only use one
persons name for the commit, and this time Colin gets the credit/blame.
The goal of this work was to increase usability, and also clean up
the page enough that it will be possible to add new features in future.
Display of mod/quiz/edit.php is now entirely generated by
mod_quiz\output\edit_renderer. This uses a helper class
mod_quiz\structure to provide details of the structure of the quiz, and
mod_quiz\repaginate to alter that structure. (Acutally, there are still
some modification methods on mod_quiz\structure. Expect that to be
cleaned up in future.)
The new code uses much more ajax, and there are new scripts
mod/quiz/edit_rest.php and mod/quiz/repaginate.php to handle this.
(Again, don't be surprised if those two scripts get merged in future.)
Also questionbank.ajax.php (which may, in future, be made more generic,
and moved into the core question bank code.)
Most of the new JavaScript code has intentionally copied the way things
are done when editing activities on the course page.
As a result of this, mod/quiz/editlib.php is now much shorter than it
was. (In future, expect the remaining code in here to move into
mod/quiz/classes.)
Learnwise was an old LMS that no longer exists. (Last reference found on
Google from 2009.) So we are removing the ability to import questions in
that format.
This is an extremely dangerous query, because it includes the user
table twice, along-side two other potentially large tables,
role_assignments and user_enrolments.
The solution is to rewrite the query so that:
1. The subquery is JOINed, not WHERE ... INed. Typically query
optimisers handle the JOIN case better.
2. Before the join was role-assignments <-> users <-> subquery.
That is, everything was linked to u.id.
Now the linking is role-assignments <-> subquery <-> users,
so the SELECT DISTINT eu1_u.id FROM {enrolled users} is central.
That seems to send a strong hint to the query optimiser about
a good order to execute the query.
Was not yet ready for the prime time.
This reverts commit dc4bff329d.
This reverts commit a535004e5c.
This reverts commit c8398fb95a.
This reverts commit d24b8e52d3.
Conflicts:
theme/bootstrapbase/less/moodle/modules.less
theme/bootstrapbase/style/moodle.css
Functionality by default does not change with this patch.
However spaces are no longer stripped when cleaning usernames IF
$CFG->extendedusernamechars has been set.
Also included 2 trim statements where small issues were found with reading
external usernames in that were not filtered for trailing whitespaces.
As part of the unit test modifications for this change, I added the get_json
function to the availability conditions that didn't have it. (This is a function
for use in unit tests.)
Credit goes to PJ King. I was trying to add unit tests for this new
behaviour but it turned out there are many hard-coded dependencies and
it's not easy to make the whole machinery support alternative location
of testable (fake) plugins.
The plugins check page displays other plugins that the current one
depends on. Previously, we always displayed the other plugin as a link
to the plugins directory. This did not work well in two scenarios:
* The admin wants/needs to upload the other plugin from the ZIP file
(e.g. it is not available in the plugins directory),
* the other plugin is actually a standard plugin that is not supposed to
be registered with the plugins directory.
This patch displays the Install or Upload or Check for updates links
next to the required plugin instead, as appropriate.
* Remove hardcoded table names
* Remove some code that was left in after debugging
* Add some comments about grades with no submission
* Set submission->latest to 0 on restore (it will get fixed later)
* Changed get_records_sql to get_recordset_sql in restore.
These strings have already been copied from mod_quiz to qtype_numerical but
in the qtype_numerical plugin code the translations from mod_quiz were used.
Even though the strings were already present we copy the translations.
AMOS BEGIN
CPY [invalidnumericanswer,mod_quiz],[invalidnumericanswer,qtype_numerical]
CPY [multiplier,mod_quiz],[qtype_numerical]
CPY [invalidnumerictolerance,mod_quiz],[qtype_numerical]
AMOS END
function prepare_choice_show_results() is never called with the 5th argument,
forming of html has been moved to the renderer in MDL-20508, when function
choice_show_results() was transformed into prepare_choice_show_results() but
not all code was deleted from the funciton.
The YUI2 calendar widget (still used via 2in3) uses midnight as the time
component of its Date objects, which triggers a Safari bug resulting in
11pm Saturday being returned instead of midnight Sunday when subtracting
days to get the last few days of the previous month. This shows up ONLY
on the month after DST begins, if DST begins on the last Sunday of a given
month (and the Calendar widget is set to Sunday as the first day of the
week). The fix/workaround of using noon instead of midnight is employed
by YUI3 and others.
Some form fields are disabled if only one attempt is allowed. However,
there may be an override allowing some students more attempts. We need
to account for that possiblity when setting up the disabled if rules.
Note the disabledIf is good for usability on this complex form, which is
why I don't just want to get rid of them.
Some of the actions generate more then 1 event.
Example: forum post create generate:
- post_created and
- accessible_uploaded
events which gets logged at the same time.
Count them as 1 action and not 2, as it is
single action and report should show 1 and not 2
Rather than using module cron, use scheduled tasks to work out
if cron has been running recently.
This is not perfect, the admin could disble all tasks, or reschedule
them - but its not complex to compute.
Themes can override this logo as any other core pix file. The new logo copied
from https://moodle.org/logo/ and resized to match the previous logo size
(140x35px).
Fixed bug by building full menu structure, then removing hidden menu items and all associated children.
Refactored custom_menu_item class and convert_text_to_menu_nodes() to improve maintenance.
Strings are not used in the components where they are defined.
If they are used in other components they should be defined in appropriate locations
since the translation may depend on the subject that is being hidden.
If a cm isn't in modinfo's cm list, then the user shouldn't be able to see that cm.
This fixes an issue where hidden activities would cause users to be unable to use moodle.
The tests now cover hidden grades in sub categories for all aggregation types. This change
includes a data generator for grade categories, with unit tests and behat tests for
the generator.
I know. You should not refer to strings from other plugins, but
* qformat_webct is importing multichoice questions in that bit of code.
I suppose a pedant would say that qformat_webct should declare dependencies
on all the qtypes it relies on, but that would be silly.
* Lesson should be using the question engine, rather than doing its own thing.
A confirm dialog is given when Javascript is off but not when it is on.
This aligns the two so that they neither have a confirm when duplicating
an activity.
There are 2 fixes here:
1. do not overwrite the changes to the HTML source when we do an autosave.
2. Move the Atto notifications alert to the containing div so it aligns properly for either view.
There is one point where it restricted the list of users. I have
fixed this and also altered the (only) script that calls that function
so that it obtains a cm_info $cm rather than the old sort.
There were previously no Behat tests at all in this module. In order
to be confident that I didn't break it, I have implemented a Behat
test (which should also be useful in general as it does go through
other pages on the way to get to the relevant one).
Makes it possible to add a grouping condition when creating an
activity, using the Behat field type API. You can set the field
using a syntax 'Grouping: NAME' (at present, only groupings are
supported, obviously we could potentially extend this to add
support for other conditions if needed).
Tested in Firefox and Chrome in JS mode, and in non-JS mode.
Currently cm_info::create allows the 'null' parameter, and
returns null (as a null $cm should still be null when treated
as a cm_info object).
Some unit tests relied on the value 'false' being treated
the same as null in this regard. This seems like a generally
safe assumption (given this is a function about changing
weakly typed data into a stronger type) so I modified the
function to accept anything PHP false, returning null.
The availability restrictions that apply to user lists (group, grouping)
now apply in workshop:
* In user lists.
* When randomly allocating users (also now works as expected if you use
group mode and a grouping with the activity).
The previous API included a facility to filter a list of users
to include only those who are allowed to access an activity, i.e.
only people who belong to the required groups etc.
This change adds a new API function to return SQL that obtains
this list of users, so that it can be combined with other
queries.
Updated code to restrict list of users. Also includes changes to
ensure that a cm_info object is available (required for availability
checks).
There is a tweak to upgradelib to reflect the different fields used.
(Note that upgradelib is not used during upgrade, but only when
converting assignments from the old assignment module.)
This only affects the quiz overrides form, as groupmembersonly was
not used elsewhere. The change simply restricts the list of users
shown when selecting somebody for overrides.
Some additional code is needed to (efficiently) load the $cm object
as a cm_info so that the availability API can be used on it.
Previously there was no way in PHP to create the JSON values used for
availability, except by manually hard-coding them (the main code to
do this normally is in JavaScript).
This makes unit tests hard to read, so I have implemented static
functions tree::get_root_json and tree::get_nested_json which allow
for easier-to-read unit tests.
Remove groupmembersonly option from require_login.
NOTE: This code, and another branch (both related to login when
accessing activities on the site course), are not actually
necessary because there is code above which already checks
$cm->uservisible.
NOTE: You can see this change more simply by doing
git diff --ignore-space-change; indent was altered.
Remove groupmembersonly usage in the core_availability API, and change
the update code (used in backup) so that it considers groupmembersonly
when restoring old backups.
* Upgrades existing data so that the groupmembersonly option is
replaced with equivalent data for the new availability API.
* Removes the database field and admin setting used for
groupmembersonly.
* Changes core modinfo library to remove/deprecate groupmembersonly
data and functions.
* Changes other core library files to remove groupmembersonly
references.
Includes deprecation of several functions, listed in lib/upgrade.txt.
LTI's activity table used to have a float
field for the grade. Now it is an integer
so we must restore the grade as an integer
so it matches the table schema.
Part of MDL-46191
This patch includes:-
- Convertion of the code to use new renderable/renderer apis
- Rewrote the code to remove all custom sorting, etc and use table sql instead
- Usernames are now clickable
- Grade items are now clickable
- Grade history is now displayed even if the grade item is deleted
- We are now using table sql for downloads so export in multiple formats is supported
- Feedback is now properly formatted
- Source fields are not capitilised anymore
- Paging is not shown on top of filters anymore
Part of MDL-46191
This commit includes following changes:-
- Fix codestyle issues
- Remove readme file
- Fix and add file headers
- Fix and add missing phpdocs
Note that this is a very basic conversion without doing any refactoring
to split the tasks up better. That will come in MDL-44734, this is about
being a safe backportable change to give admins better control over the
running of the forum cron task.
Squashed commit of the following:
commit 5881cccc95c135e1440ce0c5441a84b462941758
Author: Mary Evans <lazydaisy@visible-expression.co.uk>
Date: Thu Aug 21 02:15:05 2014 +0100
MDL-46812 grade/report/grader: Reset previous commit for left scroller.
commit 5abeb60470f02ab4c79c27b2a6f6187e75891e0b
Author: Mary Evans <lazydaisy@visible-expression.co.uk>
Date: Thu Aug 21 01:29:41 2014 +0100
MDL-46812 grade/report/grader: Added jsenabled css body class to rtl style.
commit a95d23d8b753a590d980e5427e8c74ba597c2b91
Author: Mary Evans <lazydaisy@visible-expression.co.uk>
Date: Thu Aug 21 00:59:06 2014 +0100
MDL-46812 theme_base; Removed more redundent CSS.
commit 3fb326e5b39738343e0b7c0d9c8da17adf5a09bb
Author: Mary Evans <lazydaisy@visible-expression.co.uk>
Date: Wed Aug 20 13:24:59 2014 +0100
MDL-46812 theme_base: Removed redundent grade/report/grader CSS in style/grade.css
commit c602e7e277f9ce1fed6d0eccf72c547432e130b6
Author: Mary Evans <lazydaisy@visible-expression.co.uk>
Date: Thu Aug 14 12:50:14 2014 +0100
MDL-46812 grade/report/grader: Need to tie up loose ends in Gradebook after MDL-43824
1. fixed gradebook layout when JS is disabled
2. added height and background color to scroller when JS is enabled
3. removed redundent top margin in user-grades table
2 quiz tests are creating forms with text editors manually - they need to ensure a valid
$PAGE->url is set so they don't trigger debugging warnings from $PAGE->url magic method
called by Atto.
For data mapping LDAP or CAS. Change order of fieldname display checks to verify
custom profile fields first to allow custom field shortname to contain number at the end.
Creates two new functions that make it easier to get cm_info
objects (both in modinfolib.php):
get_course_and_cm($cmid) - intended for use e.g. in modules;
efficiently loads $course and $cm (normally saves 1 query).
cm_info::from_mixed($cm) - for use in back-end API where we
are not sure whether a $cm is a real cm_info or a stdClass.
This was a regression from MDL-46548.
I also added to the behat test to cover this, and sped up the behat test while I was there.
I also restored the behaviour where usercustomfields was hardcoded to true for all
export types except XML - but the default was false.
When assignment is "Available for group members only" and no users with
mod/assign:submit role permision is enrolled (students),
groups_filter_users_by_course_module_visible is causing error (as $users
array is empty). The patch resolves the issue.
For users with edit permissions, but not add permissions, it was
impossible to save the editing form. The validation assuemd this value
was present, but it was not. Other code checks this field too, so I
added it rather than changing the validation and all the other uses.
This makes the strings more descriptive and consistent.
AMOS START
MOV [eventreportviewed, gradereport_grader],[eventgradereportviewed, gradereport_grader]
MOV [eventreportviewed, gradereport_outcomes],[eventgradereportviewed, gradereport_outcomes]
MOV [eventreportviewed, gradereport_overview],[eventgradereportviewed, gradereport_overview]
MOV [eventreportviewed, gradereport_user],[eventgradereportviewed, gradereport_user]
AMOS END
The grader report table makes use of various user preferences, and strings
which on every iteration. On a large gradebook, this can have a significant
impact upon performance.
The table also uses html_writer::tag to generate spans for
machine-generated content which becomes expensive on larger gradebooks.
It is important to be able to tell which behaviours are in use, and
without this index, it requires a complete scan of this table, which can
be very big, to verify that a behaviour is unused.
For questions set to 'One answer only', the 'Clear incorrect responses'
and 'Show the number of correct responses' hint options make not sense,
and are not used. Hence we disableIf them.
The code only needs the id column to perform its count. On courses with a lot of users
fetching the whole user record for them all easily adds up to several hundred MB of
memory.
Existence of admin settings must not depend on other settings,
especially not from other plugins.
In any case somebody should cleaup the preference mess and allow
plugins to setup user preferences instead of hardcoding everything in
core.
New features:
* environment.xml files in all types of plugins
* support for plugin strings via new optional plugin attribute in FEEDBACK
* support for class_name::method_name custom callbacks and classloader
Move the list of grade items to the top, and leave them expanded by default.
Move the idnumber warning into the grade items section, now it is visible by default.
This ui change requires changes to the API so I have deprecated the old functions while maintaining
compatibility (if you don't mind lots of debugging).
Check for empty text it row, column headers and captions on tables.
Link to "Entire document" text instead of repeating the entire document if the text is long and has no headings.
In IE, you cannot set the value of a dropdown to an integer; it has to be a string.
This caused a bug in several parts of the conditional availability editing
interface.
* Removed get_config_instance_capabilities() which was from
older reviewed vrsions of the patch
* Added note to upgrade.txt
* Fixed deprecation note
* Bump versions
The issue was that clean_param took an int and returned a string
and the result was used in an exact comparison.
The type change mean the comparison failed.
The solution was to ensure the param was cast as a string.
This patch adds completion options to Quiz similar to what is available in scorm.
One can have the quiz marked complete when either a passing grade is achieved or
all attempts are used up. This will allow a quiz to complete when the user "passes
or fails". (Where "fail" means "using up all attempts without passing".)
MDL-45965 assign: add notification capability
Adds a new capability that adds flexibility to what users receive grader
submission messages. Includes phpunit tests. Function is based off of
get_graders() but is separate because it is bad form to have a
capability that is dependent on another capabilities setting.
This patch adds completion options to Quiz similar to what is available in scorm.
One can have the quiz marked complete when either a passing grade is achieved or
all attempts are used up. This will allow a quiz to complete when the user "passes
or fails". (Where "fail" means "using up all attempts without passing".)
MDL-45847 resort: Add more course sorting options
Add descending sort options and course timecreated sort options.
Includes behat and unit test changes.
MDL-45991 groups: Auto-create groups with ungrouped users only
When using auto-create groups, sometimes it is needed to only create
groups with users that are not already inside a course group. This
patch creates a checkbox that will ignore users that are in already
existing groups. It alters the groups_get_potential_members function so
that the eligible users are retrieved entirely though sql.
get_scorm_default in scorm_12lib.php
get_scorm_default in scorm_13lib.php
get_scorm_default in aicclib.php
scorm_isset in locallib.php
scorm_empty in locallib.php
In order to post to all groups in a forum, you must have the
moodle/site:accessallgroups capability.
Thanks to Jakob Ackermann <jackermann@onlineschool.ca> for part of the fix
on this one.
There are two phpunit.xml build locations, one for overall
and another for individual components. To reduce id changes
when running different components, we use the same initial ID
in all component files when building.
In order to do this in a sane way, I cleaned up a lot of old mess,
inclduing:
1. Previously, qtype_calcuated used ->answeres when importing, and
->answer when saving the form. This was crazy, so I fixed it, and
stripped out the code that made the alternative variable name work.
2. Similarly, it could handle ->answer being either an array, such as
you would get form the HTML editor, or a simple string, which is what
you get form the form. I simplified that too.
3. Finally, I made import use a transaction around saving each
question, so we don't get half questions in the database when an error
occurs.
With the previous commit in this issue, now the course management
UI defaults to show the "default category" courses.
But some bits were missing in order to make that default behavior
fully equivalent with the manual navigation to that category.
This patch:
- Adds the missing categoryid url param, used by some of the options
in the UI, like sorting, that was completely broken.
- Sets the context to the default category, previously was being set to
system context, incorrectly if now we are defaulting to a category.
That way everything is 100% the same than when we land to the category manually.
In various places, when showing several attempts, we try to hilight the
most significant one (the one that gave the final grade if the quiz is
set to first/last/best attempt). That was not working because the table
zebra stripes were a more specific rule.
Also, the colour was inconsistent, not nice, and not very bootstrapy, so
I changed it.
Function repository::get_moodle_file() should always be called on packed reference and not on the source received from user.
Also added phpdocs to some other methods that were confusing source and reference
The user is not in control of when these popups show up and it
may not be appropiate to have part of this content display whilst
in the presence of other users.
We now call them all as just 'plugins' for consistency. There where we need to
explicitly distinguish the source of the plugin, we say they are 'additional
plugins' on contrary to 'standards plugins' coming with the core.
This reverses the references used for global $USER and $SESSION,
the reason is that PHP does not allow references to references.
$USER is a reference to $GLOBALS['USER'] which means we cannot
put any references to it. Solution is to store the current user and session
objects in $GLOBALS['USER'] and $GLOBALS['SESSIOn'] are reference
them in $_SESSION.
This patch makes the session code behave the same way in CLI,
phpunit and normal web requests - this allows use to finally
unit test most aspects of the session code in Moodle.
For stores where there is a very high rate of sets compared to gets, it
is beneficial to retrieve from the local server, skipping the network
overhead, at the expense of having to set many severs when a key is set.
This patch adds a memcache option to enable clustering. When on, only
one "server" is allowed, which will be where fetches are from, while
sets/updates/deletes/purges will occur to the all the servers in the
"set server" list.
To run unit tests, define TEST_CACHESTORE_MEMCACHE_TESTSERVERS with
multiple (return delimited) servers.
For stores where there is a very high rate of sets compared to gets, it
is beneficial to retrieve from the local server, skipping the network
overhead, at the expense of having to set many severs when a key is set.
This patch adds a memcached option to enable clustering. When on, only
one "server" is allowed, which will be where fetches are from, while
sets/updates/deletes/purges will occur to the all the servers in the
"set server" list.
To run unit tests, define TEST_CACHESTORE_MEMCACHED_TESTSERVERS with
multiple (return delimited) servers.
Allows plugins to add columns to the question bank view by extending core_question\bank\column_base
Columns to display are set in $CFG->questionbankcolumns. Columns are namespaced and autoloaded to support this.
user_updated event was being triggred while
setting password, which is not correct. It now
trigger user_password_updated event. Few more
modifications done:
1. Correct event is being triggred.
2. Event is only triggred when password is chnaged.
3. Password is updated via single api.
4. Updated unit test
On some pages full user data is not stored before user_created/
user_updated event is triggred. So giving option to trigger that
manually, so it can be triggred after all data is saved
Using mismatches from the submissions/grades tables does not make much sense, we
should always only consider only the maxattempt from the submissions table.
Four core library classes renamed for autoloading with deprecated stubs
have been converted to the new scheme for autoloading.
They are:
* textlib
* collatorlib
* plugin_manager
* plugininfo_base
These will be removed in 2.9 by MDL-46124
I've added a better means of renaming classes for autoloading and
handling the deprecation of the original class name.
This system records renamed classes in db/renamedclasses.php and
when a renamed class is requested a debugging notice is printed
and a class alias is created so that the calling code both works
and is informed of the deprecation.
Several reports have been made about the unexpected purging of entire
memcached servers when MUC is configured to use Memcache and caches
get purged.
This is expected and occurs because the memcache extenions don't
provide isolated containers. Moodle data is stored along side any other
data in the cache and when caches get purged all data gets removed
whether it belongs to Moodle or not.
The docs cover this point and here I've added notes about this to both
config-dist.php and cache/README.md
We were using ORDER BY id even though there was a perfectly good
attempt column to order the attempts by one user at one quiz.
Also, Oracle was complaining:
Debug info: ORA-01799: a column may not be outer-joined to a subquery
In several places we only want to output a certain bit of HTML (e.g. the
contents on the mod chooser) once per page.
This used to be done with a static variable in the function, which
meant the logic was once per PHP-script execution, not once-per-page.
Now there is a new bit of API in page_requirements_manager to handle
this properly.
When different ID's are set for each sequence a number
of unit test failures appear. They have been corrected
to allow unit tests to pass with the new generator in place.
This patch includes following fixes:
- messages may be now sent when database transactions active
- consistent return status on failure from message_send(), false is
returned only when message not created in message(_read)? table,
processor failure results in debugging message only and messages
are not marked as read
- message_sent is triggered always with id from message table
- logic for marking messages as viewed was standardised
- message_viewed event is triggered consistently
- improved performance when fetching user preferences
- full unit tests coverage for send_message() function
- fixed multiple other smaller issues discovered by unit tests
When all starting autoincrement ids are the same, it's difficult to detect coding and testing
errors that use the incorrect id in test calls. The classic case is cmid vs instance id.
To reduce the chance of the coding error we start sequences at different values where possible.
OUBlog installation is the case that highlighted this as it inserts a sitewide course module
at install time and cmid <> instance id in most cases.
The pass by reference meant the function was clobbering the variable in
the calling function. Once that was change, it was not strictly
necessary to rename the variable in the function, but I did anyway for
clarity.
Thanks to Rajesh Taneja for finding the problem, and identifying which
bit of code was broken. I really just made the patch.
The main changes here are that the "select the text in" step was modified to select only the
first text node in the editor field, and to focus on it's parent instead of the entire editable div.
Some tests had to be modified to match the new behaviour, and another "real" bug was found in the table plugin.
Amended #dock z-index level from 11000 to 5000 across all themes; amended z-index style of #page-header in Overlay theme such that elements no longer occlude TinyMCE.
When there are many files inside a single resource, it's possible
for the backup to time out because it does not report progress
while adding entries to the backup_ids table.
If a plugin says it is empty, skip it for for building the inline
comment.
If not format was found in any plugins, set to FORMAT_HTML, which is
the default for feedback anyways.
AMOS BEGIN
MOV ['gspath','assignfeedback_editpdf'],['pathtogs','admin']
MOV ['gspath_help','assignfeedback_editpdf'],['pathtogs_help','admin']
AMOS END
This prevents the browser to assume that those buttons are submit
buttons. In which case the submit action was stolen and the form
could not be submitted pressing the 'enter' key.
Some time ago, it when from using '0' for no-subcategories to blank.
Change to properly define '0' or '1', update old questions, and make
sure to fix newly restored questions.
Strangers get mixed with noreply user and support user,
if noreply/support users real user.
To avoid duplication use userid as array index. Also,
avoid fetching data again for noreply and support users,
if they are real users, then data is already feteched.
It seems that Android automatically focuses the cursor in the last position
when the content editable region is programatically re-focused.
Whilst this does not cause an issue on it's own, when combined with the
behaviour of the dictionary auto-completion to restore focus on the start
of the word when a word has not yet been finished, this was causing us to
change focus when pressing buttons.
Remove errors when attempting to delete non-empty directories when
child directories do not get removed since the mtime was updated when
files were removed from the child directory.
It has never worked, because the data for text area fields is not
loaded into the $USER object.
Changing it so that the dropdown list does not include these types
of field.
FireFox thinks that you can have an active selection on an element which
currently does not have focus. How this can be the case is a mystery.
Conflicts:
lib/editor/atto/yui/build/moodle-editor_atto-editor/moodle-editor_atto-editor-min.js
Invalid CSS with extra } symbols, which previously (by fluke)
worked, was broken by recent chunking improvements. This change
makes the chunking code robust against this (stupid) situation.
Having a I click on we can use all our selectors rather
than having multiple steps for the same purpose. This
step allow us to manage JS native dialogues without
having to fail a scenario.
Credit for Mohamed Alsharaf.
The behat script is to test the batch action to lock and unlock submissions.
The new definitions are to prevent the "unexpected alert open" error in Selenium.
This is no longer required as the toolbar configuration prevents
missing plugins from being set. However, even if we do not output
any notice, we ignore missing plugins to prevent errors in case
one was uninstalled but left in the editor toolbar.
There was an error in the JavaScript and custom user field
restrictions did not show correctly when editing the form.
Behat tests didn't cover custom user fields, so I added a
scenario.
* LTI service related changes:
** Fixing exceptions in OAuth library.
** Added new launch option, Existing window: replaces entire page with the LTI object.
** The LTI tool ID used to perform the launch is now sent with the LTI launch parameters. This is sent back to Moodle on subsequent requests.
** Added $CFG->mod_lti_forcessl to force SSL on all LTI launches.
** Added new LTI launch parameter: tool_consumer_instance_name. Default value is site full name, but can be customized with $CFG->mod_lti_institution_name.
** The LTI grade service endpoints now set the affected user to the session. This was required for event listeners.
** Fix the grade deletion service. Was deleting the grade item instead of just the grade.
** Send error response when LTI instance does not accept grades and grades are being sent.
** Added a method for writing incoming LTI requests to disk for debugging. Disabled by default.
* Changes for ltisource plugins:
** Can now to plug into backup/restore.
** Can now have settings.php files.
** Can now hook into the LTI launch and edit parameters.
* Several grade changes:
** Added standard_grading_coursemodule_elements to LTI instance edit form. This means LTI instances can be configured with a grade.
** No longer assumes that grade is out of 100.
** Replaced modl/lti:grade capability with mod/lti:view.
* JS on mod/lti/view.php for resizing the content object has been converted to YUI3.
* Fixed misspellings in language file.
* Added hooks for log post and view actions.
* Bug fix for lti_get_url_thumbprint() when the URL is missing a schema.
@@ -11,7 +11,6 @@ if ($hassiteconfig) { // speedup for non-admins, add all caps used on this page
//TODO: Re-enable cc-import once re-implemented in 2.0.x
//$temp->add(new admin_setting_configcheckbox('enableimsccimport', new lang_string('enable_cc_import', 'imscc'), new lang_string('enable_cc_import_description', 'imscc'), 0));
$string['acknowledgementmust']='You must acknowledge this';
$string['acknowledgementtext']='I understand that it is my responsibility to have full backups of this site prior to installing add-ons. I accept and understand that add-ons (especially but not only those originating in unofficial sources) may contain security holes, can make the site unavailable, or cause private data leaks or loss.';
$string['featuredisabled']='The add-on installer is disabled on this site.';
$string['installaddon']='Install add-on!';
$string['installaddons']='Install add-ons';
$string['installexception']='Oops... An error occurred while trying to install the add-on. Turn debugging mode on to see details of the error.';
$string['installfromrepo']='Install add-ons from the Moodle plugins directory';
$string['installfromrepo_help']='You will be redirected to the Moodle plugins directory to search for and install an add-on. Note that your site full name, URL and Moodle version will be sent as well, to make the installation process easier for you.';
$string['installfromzip']='Install add-on from ZIP file';
$string['installfromzip_help']='An alternative to installing an add-on directly from the Moodle plugins directory is to upload a ZIP package of the add-on. The ZIP package should have the same structure as a package downloaded from the Moodle plugins directory.';
$string['acknowledgementtext']='I understand that it is my responsibility to have full backups of this site prior to installing additional plugins. I accept and understand that plugins (especially but not only those originating in unofficial sources) may contain security holes, can make the site unavailable, or cause private data leaks or loss.';
$string['featuredisabled']='The plugin installer is disabled on this site.';
$string['installaddon']='Install plugin!';
$string['installaddons']='Install plugins';
$string['installexception']='Oops... An error occurred while trying to install the plugin. Turn debugging mode on to see details of the error.';
$string['installfromrepo']='Install plugins from the Moodle plugins directory';
$string['installfromrepo_help']='You will be redirected to the Moodle plugins directory to search for and install a plugin. Note that your site full name, URL and Moodle version will be sent as well, to make the installation process easier for you.';
$string['installfromzip']='Install plugin from ZIP file';
$string['installfromzip_help']='An alternative to installing a plugin directly from the Moodle plugins directory is to upload a ZIP package of the plugin. The ZIP package should have the same structure as a package downloaded from the Moodle plugins directory.';
$string['installfromzipfile']='ZIP package';
$string['installfromzipfile_help']='The plugin ZIP package must contain just one directory, named to match the plugin. The ZIP will be extracted into an appropriate location for the plugin type. If the package has been downloaded from the Moodle plugins directory then it will have this structure.';
$string['installfromziprootdir']='Rename the root directory';
$string['installfromziprootdir_help']='Some ZIP packages, such as those generated by Github, may contain an incorrect root directory name. If so, the correct name may be entered here.';
$string['installfromzipsubmit']='Install add-on from the ZIP file';
$string['installfromzipsubmit']='Install plugin from the ZIP file';
$string['installfromziptype']='Plugin type';
$string['installfromziptype_help']='Choose the correct type of plugin you are about to install. Warning: The installation procedure can fail badly if an incorrect plugin type is specified.';
$string['permcheck']='Make sure the plugin type root location is writable by the web server process.';
@@ -49,54 +49,54 @@ $string['permcheckerror'] = 'Error while checking for write permission';
$string['permcheckprogress']='Checking for write permission ...';
$string['permcheckresultno']='Plugin type location <em>{$a->path}</em> is not writable';
$string['permcheckresultyes']='Plugin type location <em>{$a->path}</em> is writable';
$string['pluginname']='Add-on installer';
$string['remoterequestalreadyinstalled']='There is a request to install add-on {$a->name} ({$a->component}) version {$a->version} from the Moodle plugins directory on this site. However, this plugin is <strong>already installed</strong> on the site.';
$string['remoterequestconfirm']='There is a request to install add-on <strong>{$a->name}</strong> ({$a->component}) version {$a->version} from the Moodle plugins directory on this site. If you continue, the add-on ZIP package will be downloaded for validation. Nothing will be installed yet.';
$string['remoterequestinvalid']='There is a request to install an add-on from the Moodle plugins directory on this site. Unfortunately the request is not valid and so the add-on cannot be installed.';
$string['remoterequestpermcheck']='There is a request to install add-on {$a->name} ({$a->component}) version {$a->version} from the Moodle plugins directory on this site. However, the plugin type location <strong>{$a->typepath}</strong> is <strong>not writable</strong>. You need to give write access for the web server user to the plugin type location, then press the continue button to repeat the check.';
$string['remoterequestpluginfoexception']='Oops... An error occurred while trying to obtain information about the add-on {$a->name} ({$a->component}) version {$a->version}. The add-on cannot be installed. Turn debugging mode on to see details of the error.';
$string['remoterequestalreadyinstalled']='There is a request to install plugin {$a->name} ({$a->component}) version {$a->version} from the Moodle plugins directory on this site. However, this plugin is <strong>already installed</strong> on the site.';
$string['remoterequestconfirm']='There is a request to install plugin <strong>{$a->name}</strong> ({$a->component}) version {$a->version} from the Moodle plugins directory on this site. If you continue, the plugin ZIP package will be downloaded for validation. Nothing will be installed yet.';
$string['remoterequestinvalid']='There is a request to install a plugin from the Moodle plugins directory on this site. Unfortunately the request is not valid and so the plugin cannot be installed.';
$string['remoterequestpermcheck']='There is a request to install plugin {$a->name} ({$a->component}) version {$a->version} from the Moodle plugins directory on this site. However, the location <strong>{$a->typepath}</strong> is <strong>not writable</strong>. You need to give write access for the web server user to the location, then press the continue button to repeat the check.';
$string['remoterequestpluginfoexception']='Oops... An error occurred while trying to obtain information about the plugin {$a->name} ({$a->component}) version {$a->version}. The plugin cannot be installed. Turn debugging mode on to see details of the error.';
$string['validationmsg_componentmismatchname']='Add-on name mismatch';
$string['validationmsg_componentmismatchname_help']='Some ZIP packages, such as those generated by Github, may contain an incorrect root directory name. You need to fix the name of the root directory to match the declared add-on name.';
$string['validationmsg_componentmismatchname_info']='The add-on declares its name is \'{$a}\' but that does not match the name of the root directory.';
$string['validationmsg_componentmismatchtype']='Add-on type mismatch';
$string['validationmsg_componentmismatchtype_info']='You have selected the type \'{$a->expected}\' but the add-on declares its type is \'{$a->found}\'.';
$string['validationmsg_componentmismatchname']='Plugin name mismatch';
$string['validationmsg_componentmismatchname_help']='Some ZIP packages, such as those generated by Github, may contain an incorrect root directory name. You need to fix the name of the root directory to match the declared plugin name.';
$string['validationmsg_componentmismatchname_info']='The plugin declares its name is \'{$a}\' but that does not match the name of the root directory.';
$string['validationmsg_componentmismatchtype']='Plugin type mismatch';
$string['validationmsg_componentmismatchtype_info']='You have selected the type \'{$a->expected}\' but the plugin declares its type is \'{$a->found}\'.';
$string['validationmsg_filenotexists']='Extracted file not found';
$string['validationmsg_filesnumber']='Not enough files found in the package';
$string['validationmsg_filestatus']='Unable to extract all files';
$string['validationmsg_filestatus_info']='Attempting to extract file {$a->file} resulted in error \'{$a->status}\'.';
$string['validationmsg_maturity_help']='The add-on can declare its maturity level. If the maintainer considers the add-on stable, the declared maturity level will read MATURITY_STABLE. All other maturity levels (such as alpha or beta) should be considered unstable and a warning is raised.';
$string['validationmsg_maturity_help']='The plugin can declare its maturity level. If the maintainer considers the plugin stable, the declared maturity level will read MATURITY_STABLE. All other maturity levels (such as alpha or beta) should be considered unstable and a warning is raised.';
$string['validationmsg_missingexpectedlangenfile']='English language file name mismatch';
$string['validationmsg_missingexpectedlangenfile_info']='The given add-on type is missing the expected English language file {$a}.';
$string['validationmsg_missingexpectedlangenfile_info']='The given plugin type is missing the expected English language file {$a}.';
$string['validationmsg_missinglangenfile']='No English language file found';
$string['validationmsg_missinglangenfolder']='Missing English language folder';
$string['validationmsg_missingversion']='Add-on does not declare its version';
$string['validationmsg_missingversion']='Plugin does not declare its version';
$string['validationmsg_missingversionphp']='File version.php not found';
$string['validationmsg_multiplelangenfiles']='Multiple English language files found';
$string['validationmsg_onedir']='Invalid structure of the ZIP package.';
$string['validationmsg_onedir_help']='The ZIP package must contain just one root directory that holds the add-on code. The name of that root directory must match the name of the plugin.';
$string['validationmsg_onedir_help']='The ZIP package must contain just one root directory that holds the plugin code. The name of that root directory must match the name of the plugin.';
$string['validationmsg_rootdir']='Name of the add-on to be installed';
$string['validationmsg_rootdir_help']='The name of the root directory in the ZIP package forms the name of the add-on to be installed. If the name is not correct, you may wish to rename the root directory in the ZIP prior to installing the add-on.';
$string['validationmsg_rootdirinvalid_help']='The name of the root directory in the ZIP package violates formal syntax requirements. Some ZIP packages, such as those generated by Github, may contain an incorrect root directory name. You need to fix the name of the root directory to match the add-on name.';
$string['validationmsg_rootdir']='Name of the plugin to be installed';
$string['validationmsg_rootdir_help']='The name of the root directory in the ZIP package forms the name of the plugin to be installed. If the name is not correct, you may wish to rename the root directory in the ZIP prior to installing the plugin.';
$string['validationmsg_rootdirinvalid_help']='The name of the root directory in the ZIP package violates formal syntax requirements. Some ZIP packages, such as those generated by Github, may contain an incorrect root directory name. You need to fix the name of the root directory to match the plugin name.';
$string['validationresult0_help']='A serious problem was detected and so it is not safe to install the add-on. See the validation log messages for details.';
$string['validationresult0_help']='A serious problem was detected and so it is not safe to install the plugin. See the validation log messages for details.';
$string['validationresult1_help']='No serious problems were detected. You can continue with the add-on installation. See the validation log messages for more details and eventual warnings.';
$string['validationresult1_help']='The add-on package has been validated and no serious problems were detected.';
$string['validationresult2_help']='No serious problems were detected. You can continue with the plugin installation. See the validation log messages for more details and eventual warnings.';
$string['validationresult1_help']='The plugin package has been validated and no serious problems were detected.';
@@ -27,17 +27,21 @@ $string['install'] = 'Install selected language pack(s)';
$string['installedlangs']='Installed language packs';
$string['langimport']='Language import utility';
$string['langimportdisabled']='Language import feature has been disabled. You have to update your language packs manually at the file-system level. Do not forget to purge string caches after you do so.';
$string['langpackinstalled']='Language pack {$a} was successfully installed';
$string['langpackremoved']='Language pack was uninstalled';
$string['langpackupdateskipped']='Update of {$a} language pack skipped';
$string['langpackuptodate']='Language pack {$a} is up-to-date';
$string['langpackinstalled']='Language pack \'{$a}\' was successfully installed';
$string['remotelangnotavailable']='Because Moodle cannot connect to download.moodle.org, it is not possible for language packs to be installed automatically. Please download the appropriate ZIP file(s) from <a href="http://download.moodle.org/langpack/">download.moodle.org/langpack</a>, copy them to your {$a} directory and unzip them manually.';
$string['remotelangnotavailable']='Because Moodle cannot connect to download.moodle.org, it is not possible for language packs to be installed automatically. Please download the appropriate ZIP file(s) from <a href="https://download.moodle.org/langpack/">download.moodle.org/langpack</a>, copy them to your {$a} directory and unzip them manually.';
$string['uninstall']='Uninstall selected language pack';
$string['uninstallconfirm']='You are about to completely uninstall language pack {$a}, are you sure?';
$string['updatelangs']='Update all installed language packs';
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Strings for component 'tool_messageinbound', language 'en'
*
* @package tool_messageinbound
* @copyright 2014 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
$string['classname']='Class name';
$string['component']='Component';
$string['configmessageinboundhost']='The address of the server that Moodle should check mail against. To specify a non-default port, you can use the [server]:[port], for example mail.example.com:587 format. If you leave this field blank, Moodle will use the default port for the type of mail server you specify.';
$string['defaultexpiration_help']='When an email address is generated by the handler, it can be set to automatically expire after a period of time, so that it can no longer be used. It is advisable to set an expiry period.';
$string['description']='Description';
$string['domain']='Email Domain';
$string['edit']='Edit';
$string['edithandler']='Edit settings for the {$a} handler';
$string['fixedvalidateaddress_help']='You cannot change the address validation for this handler. This may be because the handler requires a specific setting.';
$string['fixedenabled_help']='You cannot change the state of this handler. This may be because the handler is required by other handlers.';
$string['handlerdisabled']='The email handler you tried to contact has been disabled. Unable to process message at this time.';
$string['incomingmailconfiguration']='Incoming mail configuration';
$string['incomingmailserversettings']='Incoming mail server settings';
$string['incomingmailserversettings_desc']='Moodle is capable of connecting to appropriately configured IMAP servers. You can specify the settings used to connect to your IMAP server here.';
$string['invalid_recipient_handler']='If a valid message is received but the sender cannot be authenticated, the message is stored on the email server and the user is contacted using the email address in their user profile. The user is given the chance to reply to confirm the authenticity of the original message.
This handler processes those replies.
It is not possible to disable sender verification of this handler because the user may reply from an incorrect email address if their email client configuration is incorrect.';
$string['invalidrecipientdescription']='The message "{$a->subject}" could not be authenticated, since it was sent from a different email address than in your user profile. For the message to be authenticated, you need to reply to this message.';
$string['invalidrecipientdescriptionhtml']='The message "{$a->subject}" could not be authenticated, since it was sent from a different email address than in your user profile. For the message to be authenticated, you need to reply to this message.';
$string['invalidrecipientfinal']='The message you sent with subject "{$a->subject}" could not be authenticated. Please check that you are sending your message from the e-mail account listed in your Moodle profile.';
$string['messageprocessingerror']='You recently sent an e-mail to Moodle with the subject "{$a->subject}" but Moodle was unable to process it.
The details of the error are shown below.
{$a->error}';
$string['messageprocessingerrorhtml']='<p>You recently sent an e-mail to Moodle with the subject "{$a->subject}" but Moodle was unable to process it.</p>
<p>The details of the error are shown below.</p>
<p>{$a->error}</p>';
$string['messageprocessingfailed']='Moodle was unable to process the e-mail you sent with subject "{$a->subject}". The following error was given: "{$a->message}".';
$string['messageprocessingfailedunknown']='Moodle was unable to process the e-mail you sent with subject "{$a->subject}". Contact your system administrator for further information.';
$string['messageprocessingsuccess']='{$a->plain}
If you do not wish to receive these notifications in the future, you can edit your personal messaging preferences by opening {$a->messagepreferencesurl} in your browser.';
<p>If you do not wish to receive these notifications in the future, you can <a href="{$a->messagepreferencesurl}">edit your personal messaging preferences</a>.</p>';
$string['messageinbound']='Message Inbound';
$string['messageinboundenabled']='Enable incoming mail processing';
$string['messageinboundenabled_desc']='Incoming mail processing must be enabled in order for messages to be sent with the appropriate information.';
$string['messageinboundgeneralconfiguration_desc']='Inbound message processing allows you to receive and process email within Moodle. This has applications such as sending email replies to forum posts or adding files to a user\'s private files.';
$string['messageinboundhost']='Incoming Mail Server';
$string['messageinboundhostpass']='Password';
$string['messageinboundhostpass_desc']='This is the password your service provider will have provided to log into your e-mail account with.';
$string['messageinboundhostssl']='Use SSL';
$string['messageinboundhostssl_desc']='Some mail servers support an additional level of security by encrypting communication between Moodle and your server. We recommend using this SSL encryption if your server supports it.';
$string['messageinboundhosttype']='Server type';
$string['messageinboundhostuser']='Username';
$string['messageinboundhostuser_desc']='This is the username your service provider will have provided to log into your e-mail account with.';
$string['messageinboundmailboxconfiguration_desc']='When messages are sent out, they fit into the format address+data@example.com. To reliably generate addresses from Moodle, please specify the address that you would normally use before the @ sign, and the domain after the @ sign separately. For example, the Mailbox name in the example would be "address", and the E-mail domain would be "example.com". You should use a dedicated e-mail account for this purpose.';
$string['messageprovider:invalidrecipienthandler']='Messages to confirm that an inbound messages came from you';
$string['messageprovider:messageprocessingerror']='Warning when an inbound message could not be processed';
$string['messageprovider:messageprocessingsuccess']='Confirmation that a message was successfully processed';
$string['noencryption']='Off - No encryption';
$string['noexpiry']='No expiry';
$string['oldmessagenotfound']='You tried to manually authenticate a message, but the message could not be found. This could be because it has already been processed, or because the message expired.';
$string['validateaddress_help']='When a message is received from a user, Moodle attempts to validate the message by comparing the email address of the sender with the email address in their user profile.
If the sender does not match, then the user is sent a notification to confirm that they really did send the email.
If this setting is disabled, then the email address of the sender is not checked at all.';
phpCAS::error(self::$_PHPCAS_INIT_CALL['method'].'() has already been called (at '.self::$_PHPCAS_INIT_CALL['file'].':'.self::$_PHPCAS_INIT_CALL['line'].')');
}
if(gettype($server_version)!='string'){
phpCAS::error('type mismatched for parameter $server_version (should be `string\')');
}
if(gettype($server_hostname)!='string'){
phpCAS::error('type mismatched for parameter $server_hostname (should be `string\')');
}
if(gettype($server_port)!='integer'){
phpCAS::error('type mismatched for parameter $server_port (should be `integer\')');
}
if(gettype($server_uri)!='string'){
phpCAS::error('type mismatched for parameter $server_uri (should be `string\')');
phpCAS::error(self::$_PHPCAS_INIT_CALL['method'].'() has already been called (at '.self::$_PHPCAS_INIT_CALL['file'].':'.self::$_PHPCAS_INIT_CALL['line'].')');
}
if(gettype($server_version)!='string'){
phpCAS::error('type mismatched for parameter $server_version (should be `string\')');
}
if(gettype($server_hostname)!='string'){
phpCAS::error('type mismatched for parameter $server_hostname (should be `string\')');
}
if(gettype($server_port)!='integer'){
phpCAS::error('type mismatched for parameter $server_port (should be `integer\')');
}
if(gettype($server_uri)!='string'){
phpCAS::error('type mismatched for parameter $server_uri (should be `string\')');
phpCAS::error('this method should only be called before '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() (called at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().')');
}
if(!($storageinstanceofCAS_PGTStorage)){
phpCAS::error('type mismatched for parameter $storage (should be a CAS_PGTStorage `object\')');
}
self::$_PHPCAS_CLIENT->setPGTStorage($storage);
phpCAS::traceEnd();
}
@@ -766,25 +748,13 @@ class phpCAS
$password='',$table='',$driver_options=null
){
phpCAS::traceBegin();
if(!is_object(self::$_PHPCAS_CLIENT)){
phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
phpCAS::error('this method should only be called before '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() (called at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().')');
}
if(gettype($username)!='string'){
phpCAS::error('type mismatched for parameter $username (should be `string\')');
}
if(gettype($password)!='string'){
phpCAS::error('type mismatched for parameter $password (should be `string\')');
}
if(gettype($table)!='string'){
phpCAS::error('type mismatched for parameter $table (should be `string\')');
phpCAS::error('this method should only be called before '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() (called at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().')');
}
if(gettype($path)!='string'){
phpCAS::error('type mismatched for parameter $path (should be `string\')');
}
self::$_PHPCAS_CLIENT->setPGTStorageFile($path);
phpCAS::traceEnd();
}
/** @} */
@@ -836,23 +800,13 @@ class phpCAS
publicstaticfunctiongetProxiedService($type)
{
phpCAS::traceBegin();
if(!is_object(self::$_PHPCAS_CLIENT)){
phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
}
if(!self::$_PHPCAS_CLIENT->isProxy()){
phpCAS::error('this method should only be called after '.__CLASS__.'::proxy()');
phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
}
if(gettype($type)!='string'){
phpCAS::error('type mismatched for parameter $type (should be `string\')');
phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
}
if(gettype($url)!='string'){
phpCAS::error('type mismatched for parameter $url (should be `string\')');
phpCAS::error('this method should only be called after the programmer is sure the user has been authenticated (by calling '.__CLASS__.'::checkAuthentication() or '.__CLASS__.'::forceAuthentication()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
}
if(gettype($url)!='string'){
phpCAS::error('type mismatched for parameter $url (should be `string\')');
}
phpCAS::_validateProxyExists();
if(gettype($flags)!='integer'){
phpCAS::error('type mismatched for parameter $flags (should be `integer\')');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
}
returnself::$_PHPCAS_CLIENT->getUser();
}
/**
* Answer attributes about the authenticated user.
*
* @warning should not be called only after phpCAS::forceAuthentication()
* @warning should only be called after phpCAS::forceAuthentication()
* or phpCAS::checkAuthentication().
*
* @return array
*/
publicstaticfunctiongetAttributes()
{
if(!is_object(self::$_PHPCAS_CLIENT)){
phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
}
returnself::$_PHPCAS_CLIENT->getAttributes();
}
/**
* Answer true if there are attributes for the authenticated user.
*
* @warning should not be called only after phpCAS::forceAuthentication()
* @warning should only be called after phpCAS::forceAuthentication()
* or phpCAS::checkAuthentication().
*
* @return bool
*/
publicstaticfunctionhasAttributes()
{
if(!is_object(self::$_PHPCAS_CLIENT)){
phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
}
returnself::$_PHPCAS_CLIENT->hasAttributes();
}
/**
@@ -1243,21 +1144,18 @@ class phpCAS
* @param string $key attribute name
*
* @return bool
* @warning should not be called only after phpCAS::forceAuthentication()
* @warning should only be called after phpCAS::forceAuthentication()
* or phpCAS::checkAuthentication().
*/
publicstaticfunctionhasAttribute($key)
{
if(!is_object(self::$_PHPCAS_CLIENT)){
phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
}
returnself::$_PHPCAS_CLIENT->hasAttribute($key);
}
/**
@@ -1266,21 +1164,18 @@ class phpCAS
* @param string $key attribute name
*
* @return mixed string for a single value or an array if multiple values exist.
* @warning should not be called only after phpCAS::forceAuthentication()
* @warning should only be called after phpCAS::forceAuthentication()
* or phpCAS::checkAuthentication().
*/
publicstaticfunctiongetAttribute($key)
{
if(!is_object(self::$_PHPCAS_CLIENT)){
phpCAS::error('this method should not be called before '.__CLASS__.'::client() or '.__CLASS__.'::proxy()');
phpCAS::error('authentication was checked (by '.self::$_PHPCAS_CLIENT->getAuthenticationCallerMethod().'() at '.self::$_PHPCAS_CLIENT->getAuthenticationCallerFile().':'.self::$_PHPCAS_CLIENT->getAuthenticationCallerLine().') but the method returned false');
@@ -99,7 +99,7 @@ class CAS_Languages_German implements CAS_Languages_LanguageInterface
*/
publicfunctiongetYouWereNotAuthenticated()
{
return'<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontkatieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>';
return'<p>Sie wurden nicht angemeldet.</p><p>Um es erneut zu versuchen klicken Sie <a href="%s">hier</a>.</p><p>Wenn das Problem bestehen bleibt, kontaktieren Sie den <a href="mailto:%s">Administrator</a> dieser Seite.</p>';
}
/**
@@ -113,4 +113,4 @@ class CAS_Languages_German implements CAS_Languages_LanguageInterface
thrownewCAS_ProxiedService_Exception("If you pass a POST body, you must specify a content type via ".get_class($this).'->setContentType($contentType).');
thrownewCAS_ProxiedService_Exception(
"If you pass a POST body, you must specify a content type via "
trigger_error('Invalid code '.$code.' passed. Must be one of PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, or PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE.');
trigger_error(
'Invalid code '.$code
.' passed. Must be one of PHPCAS_SERVICE_PT_FAILURE, PHPCAS_SERVICE_PT_NO_SERVER_RESPONSE, or PHPCAS_SERVICE_PT_BAD_SERVER_RESPONSE.'
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.