Commit graph

915 commits

Author SHA1 Message Date
martinlanghoff
d0009dff7d accesslib: Fix dup enrolment entries in get_user_access_bycontext() and get_user_access_sitewide()
Avoid duplicate entries in the ra array. Now it works too!
2007-09-19 07:07:59 +00:00
martinlanghoff
4d8ab2749e accesslib: get_context_users_bycap() draft for course participants...
Introducing get_context_users_bycap() which gets the data in
2 DB queries, takes around 10ms on my laptop, and returns
the records with a nice context property attached.

Note Note Note: right now, some user recs do not have a context
associated, so are _not_ returned. So this awaits Matt's fix
to contexts maintenance to be 100% accurate...
2007-09-19 07:07:45 +00:00
martinlanghoff
ae1555ae2e get_my_courses(): Support course-level login as
A walkthrough of course-login-as functionality shows that is
Just Works, except that get_my_courses() was showing all the
courses. So we fix it.

And cleanup load_all_capabilities() - things just work
transparently.
2007-09-19 07:07:21 +00:00
martinlanghoff
2219374865 accesslib: remove some functions we do not need anymore
This is *the* scary commit. No more scaffolding, no more
training wheels. Remove the legacy has_capabilty_old() and
several supporting functions.

   has_capability_old()
   capability_search()
   is_parent_context()
   roles_context_cmp()
   load_user_capability()
   capability_prohibits()

I've grepped far and wide. Noone else uses the supporting
functions anywhere in-the-known-universe. If I could not
find it, it does not exist.

[Thankful that cvs/git/whatever will hold on to them
 if I end up having to regret this.]
2007-09-19 07:07:08 +00:00
martinlanghoff
204a369c1e accesslib: Intro global $ACCESS and load_user_accessdata()
This patch introduces a new global $ACCESS that will cache
accessdata (our ra/rdef array) for users that are _not_ the
logged in user.

Most of the time it will be empty (luckily).

Each new user we have to get "in" costs us 3 or 4 cheap
dbqueries at the moment, so it is not that bad.

has_capability() now calls load_user_accessdata() if the
call is for a non-logged-user. So $ACCESS is autopopulated
transparently.

This also means that has_capability no longer calls
has_capability_old(). Yay!

With this patch, user/view.php for looking at a user in a course...

  Before: 62 dbqueries, 10.3MB, 0.7s
  After:  49 dbqueries,  8.5MB, 0.3s
2007-09-19 07:06:55 +00:00
martinlanghoff
6cc59cb21b accesslib: add support for multi-enrolments
I had dropped support for multi-enrolments on the same context.

 Oops!

This patch reinstates it, changing the semantics of the 'ra'
array leaves from an int to an array of ints.

So no instead of

   $USER->access['ra']['/1/12/543'] = 5

we have

   $USER->access['ra']['/1/12/543'] = array(5)

the functions that build the array, and the array walkers have
been updated. This touches...

  Writing RAs
    load_all_capabilities()
    get_user_access_sitewide()
    get_user_access_bycontext()

  Reading RAs
    has_cap_fromsess()
    aggr_roles_fromsess()

Thanks to Matt Clarkson for mentioning multi-enrolments!
2007-09-19 07:06:30 +00:00
martinlanghoff
1c886b238d accesslib: role_switch() supports unswitching by passing $roleid=0
It is a good idea, silly of me to remove it...
2007-09-19 07:06:03 +00:00
martinlanghoff
6a8d9a387d accesslib: has_cap_from_sess() now supports role switching
With this commit we now have very fast support for
roleswitching, based on $sess[rsw] entries.

And a bit of phpdoc. This is function, and the
datastructure it walks, is the heart of of it.
2007-09-19 07:05:48 +00:00
martinlanghoff
6f1bce30b1 accesslib - role_switch() revamp, introduce get_role_access_bycontext()
First stage of role_switch() rewrite - role_switch() sets up
a rsw entry in $USER->access, and makes sure we have the
appropriate role definitions in rdef.

That is where get_role_access_bycontext() comes into play -
gets all the rdef entries in one cheap sql query.

... though there may be many of them...

TODO:

 - fix callers of role_switch()
 - teach has_cap_fromsess() to read the rsw entries
2007-09-19 07:05:32 +00:00
martinlanghoff
b5a645b4eb accesslib: Draft get_context_users_byrole()
Draft - use for the course participants list page

 Uses 1 DB query (cheap too - 2~7ms).

 TODO:
 - implement additional where clauses
 - sorting
 - get course participants list to use it!

 returns a users array, both sorted _and_ keyed
 on id (as get_my_courses() does)

 as a bonus, every user record comes with its own
 personal context, as our callers need it straight away
 {save 1 dbquery per user! yay!}
2007-09-19 07:05:21 +00:00
martinlanghoff
352f6f74fc get_my_courses() and get_user_courses_bycap() field handling and caching
- Field handling moves back to get_my_courses() and now we have
  almost all the fields that the old get_my_courses() did
  (except for summary, which is *huge*) so get_my_courses() asks
  for a lot of fields, but the get_user_courses_bycap() defaults
  are _much_ leaner now.

  I think this makes sense ;-)

- get_my_courses() now caches the course ids for the currently logged in
  user in $USER->mycourses -- as a _string_. This is magnitudes more efficient
  than having it as an array.

The cache makes a difference, but it's not very visible on
normal pageloads (with my courses block, for example).

However, over 100 iterations, for a user with 50 enrolments in a site
with 6K courses, we go from 4.3s to 0.6s. And the DB queries are *cheap*.

            $tt = microtime(true);
            for($n=0;$n<100;$n++) {
                get_my_courses($USER->id, 'sortorder ASC');
            }
            error_log("took " .  (microtime(true) - $tt));
2007-09-19 07:04:59 +00:00
martinlanghoff
2e059c7709 accesslib: get_user_courses_bycap() - make $doanything work in the optimised path
OMG! Bugfix!
2007-09-19 07:04:37 +00:00
martinlanghoff
573674bf47 accesslib: get_user_courses_bycap() is less of a piggy now...
get_user_courses_bycap() replaces get_courses_bycap_fromsess().

Using a combination of in-DB enrolments and in-session capability
checks, we narrow down the courses we fetch from the DB for checking.

This patch adds a small DB query, and has has a moderate impact on
the timings observable on my laptop (~300ms?), but reduces
*significantly* the bandwidth used, which in cluster environments
with frontends separate from backends has a serious impact.
2007-09-19 07:04:23 +00:00
martinlanghoff
aeb3916b7a datalib: get_my_courses() - some fixes to the data we return
strangely, get_my_courses() is expected to return the
array keyed on id, which messes up the sorting

So let's do it ;-)
2007-09-19 07:04:10 +00:00
martinlanghoff
e1d5e5c181 accesslib: get_my_courses() rework, new get_courses_bycap_fromsess()
get_my_courses() goes from a bazillion queries (500 in some sample
cases) to 1 for the logged-in user, and 4 for a non-logged-in user.

One of those queries brings a *lot* of data across (all rows from
mdl_course) so there is room for serious optimisation.

  However, this clocks at ~300 ms on my laptop, costly, but not
  the end of the world. If your PHP-DB link has bandwidth probs
  it might be a problem.

A few important changes to get_my_courses()

 - (Compat ALERT!) the default fields are less than before --
   (will be followed by patches that fix the callers!) our defaults
   had grown to quite a bit because of the crazy caching scheme it had

 - the $fields parameter is to name _additional_ fields you need, and
   ideally wants them passed as an array. Will cope with old-style
   strings too.

 - the returned courses have an extra property "context" that is
   a fully valid context object, so if the caller needs to perform
   further accesslib checks, we save a query per course down the road

The work is done in the newfangled get_courses_bycap_fromsess()
which is brute-force but fast. I'm sure we can optimise the common
cases a lot in it if we try. It'd be worthwhile to

  - reduce the rows we grab - that's really boneheaded

  - if we copy and tweak the logic of has_cap_fromsess() in it
    it can be made even faster
2007-09-19 07:03:49 +00:00
martinlanghoff
13a794757e accesslib: has_capability() - useful debugging bit... 2007-09-19 07:03:34 +00:00
martinlanghoff
018d4b52b7 accesslib: get_user_access_bycontext() fetches overrides in subcontexts, intro aggr_roles_fromsess()
The main thing here is that overrides in subcontexts are
now read correctly (and still cheaply) into the access array.

Also

 - introducing aggr_roles_fromsess() with gives you a list of
   the relevant roles that affect the user in this context

 - we clear out $USER->access on login/logout

 - get_user_access_bycontext() gets a few optimisations too...
2007-09-19 07:03:19 +00:00
martinlanghoff
e0376a6241 accesslib: default, guest and notloggedin roles work properly now
Changes around load_user_capability() and has_capability() to make
the default role fallbacks and guest/nonloggedin roles work.

This commit also introduces the concept of having a magic
context next to the root context in $USER->access[ra], as

 $USER->access[ra][/1] = 1 (admin roleid)
 $USER->access[ra][/1:def] = 7 (loggedinuser roleid)

and has_cap_fromsess() now checks for that magic context
as well.
2007-09-19 07:02:57 +00:00
martinlanghoff
74ac5b66cb accesslib: has_capability() now works for the logged in user
With this commit, the new has_capability works for the logged
in user correctly.

 - load_all_capabilities() no longer calls load_user_capability()!
   6K dbqueries less on login... ;-)

 - When delving into a context we haven't loaded yet, we call
   get_user_access_bycontext()

 - Introduce: get_user_access_bycontext()

 - Several fixes in get_user_access_sitewide()
   (renamed from get_user_sitewide_access())

 - Fixes in has_cap_fromsess()

 - Introduce access_insess() to check if we have to call
   get_user_access_bycontext() for the context
2007-09-19 07:02:44 +00:00
martinlanghoff
7f97ea29bf accesslib: initial has_capability() rewrite
- has_capability() renamed has_capability_old() and we fallback
   when we cannot answer the question

 - has_capability() works great for the course-and-above contexts
   for the logged in user - does not touch the DB

 - works based on $USER->access which has a pretty compact view
   of the user's access rights...

TODO:

 - deal with contexts below the course - here we need to
   trigger the role-assignment and role-defs load when needed

 - deal with "other" contexts that hang from the system context

 - deal with global roleswitch, local roleswitch
2007-09-19 07:02:31 +00:00
martinlanghoff
a9bee37ea1 accesslib: Introducing get_user_sitewide_access($userid)
This function carefully fetches all the data needed to
handle site/category/course access for a given user
as cheaply as possible.

It currently takes 3 db queries.
2007-09-19 07:02:04 +00:00
martinlanghoff
1f3c9d097f accesslib: Introducing build_context_path()
which populates the context.path and context.depth fields
2007-09-19 07:01:27 +00:00
martinlanghoff
19bb8a0517 accesslib:get_child_contexts() reworked to use context.path
Using context.path, now get_child_contexts...

 - always takes 1 query
 - populated the context_cache
 - returns full records
 - when called with an category, it won't
   recurse into the children of courses

Also

 - All callers in accesslib changed to the new
   calling convention

A normal course page with a std blocks and a few
activities sees around 100 queries less with this patch.

Note: this commit is slightly different on HEAD/19 and on
MOODLE_18_STABLE, as groups-related tables have changed.
2007-09-19 06:52:34 +00:00
martinlanghoff
17b0efae11 accesslib: Introducing cleanup_contexts() and use it in cron
The newly minted cleanup_contexts() walks the context table
matching contexts with the tables they are referencing and
clearing any leftover contexts.
2007-09-19 06:50:53 +00:00
nicolasconnault
c421ad4b2e MDL-11233 Corrected typo in grader report lib, and added a second sort parameter for lastname and firstname sorts, to add consistency to result sets. Non-students no longer appear in the list 2007-09-13 13:44:35 +00:00
mattc-catalyst
38553f9754 MDL-10888: groupings - fix SQL error 2007-08-27 03:54:59 +00:00
skodak
dda6370707 MDL-10635 fixed incorrect capability value check in has_capability_including_child_contetxt() 2007-08-26 16:55:46 +00:00
skodak
47ba005d0d MDL-10995 course parents cache size now limited 2007-08-26 07:58:20 +00:00
moodler
5464c36277 Fixes for grade plugincapability names MDL-10989 2007-08-26 05:49:59 +00:00
skodak
3bf618ce0d MDL-10995 implemented caching of course and category parents - eliminates substantial number of db queries - mostly during login and on course page 2007-08-25 19:25:17 +00:00
skodak
5785266f9e MDL-10995 removing previous patch; testing a better one just now 2007-08-25 14:35:54 +00:00
skodak
8496a9c911 MDL-10995 improved capability_search():
* eliminated fetching of course - $COURSE used if id matches
* parent category structure is cached in static array
2007-08-25 12:22:15 +00:00
skodak
e6260a456b MDL-10635 improved performance of update_course_icon() and friends; fixed parameter of iseditting() - removed $userid which was not used and did not make much sense there anyway 2007-08-25 11:28:37 +00:00
skodak
c331cf23c5 MDL-10945 fixed block capability checks in switch role mode 2007-08-22 19:20:20 +00:00
skodak
5bf243d131 MDL-10383 - groups/groupings refactoring nearly finished ;-) 2007-08-16 11:06:48 +00:00
toyomoyo
baea72ec48 some changes for better capabilities list display 2007-08-16 08:48:53 +00:00
skodak
2c386f82e5 MDL-10383 - deprecated get_groups(), user_group() and ismember() 2007-08-15 20:21:01 +00:00
poltawski
7e874772a3 MDL-10573 - Added a capability for viewing blocks, this allows role-based control of block
display.

Changed context capability check so that CONTEXT_BLOCK capabilities can also come from the
moodle core capability definitions
2007-08-13 10:08:15 +00:00
poltawski
be23993798 MDL-10624 Reverting forum part of last commit - it wasn't needed, I wasn't testing
correctly. merged from 18_STABLE
2007-08-06 19:17:36 +00:00
poltawski
87c2d37d82 Fixed typo in previous commit 2007-08-06 18:47:57 +00:00
poltawski
2515adf9ea MDL-9431 & MDL-10624 - we're not removing some tracking records from the
database when we unassign roles - remove forum_subscriptions & user_lastaccess

Merged from MOODLE_18_STABLE
2007-08-06 18:45:35 +00:00
stronk7
6cdd0f9c93 Adding Id tag + copyright notice.
Merged from MOODLE_18_STABLE
2007-08-06 17:55:44 +00:00
toyomoyo
c345bb584a MDL-10679, improvement to context_rel table and load_user_capability 2007-08-02 08:28:29 +00:00
toyomoyo
3527464679 when unassign users in course, if user has no more course:view capability left, he should be removed from all groups in course 2007-07-27 05:43:05 +00:00
skodak
89bd8357e9 MDL-10579 capabilities for grade export plugins 2007-07-24 08:51:45 +00:00
mattc-catalyst
cd54510d42 lib/accesslib: Performance optimisation
- On postgres query time drops from ~600ms to ~35ms in some
  instances, in other instances performance is around the same
  as old the implementation.


Author: Matt Clarkson <mattc@catalyst.net.nz>
2007-07-20 04:05:34 +00:00
toyomoyo
60ace1e114 merged fix for MDL-10149, preventing the deletion of the last admin role 2007-07-19 05:19:05 +00:00
toyomoyo
69b0088cd9 merged fix for MDL-10461, timemodied in role assignments not preserved 2007-07-19 03:37:53 +00:00
skodak
454cf87189 MDL-10421 $fields= typo 2007-07-11 17:27:46 +00:00
toyomoyo
52bb13dc9f adding group support for get_role_users 2007-07-09 06:22:56 +00:00