35 if (self::$instance ===
null) {
36 self::$instance =
new self();
38 self::$instance->dropTempTable(self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_SPEC_PERMISSIONS .
"_" . self::DEFAULT_ORG_UNIT_OPERATION .
"_"
39 . self::DEFAULT_CONTEXT);
40 self::$instance->dropTempTable(self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_DEFAULT_PERMISSIONS .
"_" . self::DEFAULT_ORG_UNIT_OPERATION
41 .
"_" . self::DEFAULT_CONTEXT);
42 self::$instance->dropTempTable(self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_ORGU_DEFAULT_PERMISSIONS .
"_" . self::DEFAULT_ORG_UNIT_OPERATION
43 .
"_" . self::DEFAULT_CONTEXT);
44 self::$instance->dropTempTable(self::TMP_DEFAULT_TABLE_NAME_PREFIX_CRS_MEMBERS .
"_user_id_" .
$DIC->user()->getId());
45 self::$instance->dropTempTable(self::TMP_DEFAULT_TABLE_NAME_PREFIX_ORGU_MEMBERS .
"_user_id_" .
$DIC->user()->getId());
46 self::$instance->dropTempTable(self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_USER_MATRIX .
"_" . self::DEFAULT_ORG_UNIT_OPERATION .
"_"
47 . self::DEFAULT_CONTEXT);
69 if (!
$DIC->settings()->get(
"enable_my_staff")) {
125 if (count($arr_usr_id) > 0) {
142 $q =
"SELECT COUNT(orgu_ua.orgu_id) AS 'cnt' FROM il_orgu_permissions AS perm
143 INNER JOIN il_orgu_ua AS orgu_ua ON orgu_ua.position_id = perm.position_id
144 INNER JOIN il_orgu_op_contexts AS contexts on contexts.id = perm.context_id AND contexts.context is not NULL
145 WHERE orgu_ua.user_id = " .
$DIC->database()->quote($user_id,
'integer') .
" AND perm.operations is not NULL AND perm.parent_id = -1";
147 $set =
$DIC->database()->query($q);
148 $rec =
$DIC->database()->fetchAssoc($set);
161 public function countOrgusOfUserWithOperationAndContext($user_id, $org_unit_operation_string = self::DEFAULT_ORG_UNIT_OPERATION,
$context = self::DEFAULT_CONTEXT)
170 $q =
"SELECT COUNT(orgu_ua.orgu_id) AS cnt FROM il_orgu_permissions AS perm
171 INNER JOIN il_orgu_ua AS orgu_ua ON orgu_ua.position_id = perm.position_id
172 INNER JOIN il_orgu_op_contexts AS contexts on contexts.id = perm.context_id AND contexts.context = '" .
$context .
"'
173 and orgu_ua.user_id = " .
$DIC->database()->quote($user_id,
'integer') .
" AND perm.operations LIKE '%\""
174 . $operation->getOperationId() .
"\"%'
175 WHERE perm.parent_id = -1";
177 $set =
$DIC->database()->query($q);
178 $rec =
$DIC->database()->fetchAssoc($set);
192 public function getUsersForUserOperationAndContext($user_id, $org_unit_operation_string = self::DEFAULT_ORG_UNIT_OPERATION,
$context = self::DEFAULT_CONTEXT, $tmp_table_name_prefix = self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_USER_MATRIX)
196 $tmp_table_name = $this->buildTempTableIlobjectsUserMatrixForUserOperationAndContext($user_id, $org_unit_operation_string,
$context, $tmp_table_name_prefix);
198 $q =
'SELECT usr_id FROM ' . $tmp_table_name;
200 $user_set =
$DIC->database()->query($q);
202 $arr_users = array();
204 while ($rec =
$DIC->database()->fetchAssoc($user_set)) {
205 $arr_users[$rec[
'usr_id']] = $rec[
'usr_id'];
223 $q =
"SELECT " . $tmp_orgu_members .
".user_id AS usr_id
225 " . $tmp_orgu_members .
"
226 INNER JOIN il_orgu_ua AS orgu_ua_current_user on orgu_ua_current_user.user_id = " .
$DIC->database()->quote($user_id,
'integer') .
"
227 INNER JOIN il_orgu_authority AS auth ON auth.position_id = orgu_ua_current_user.position_id
230 /* Identische OrgUnit wie Current User; Nicht Rekursiv; Fixe Position */
231 (orgu_ua_current_user.orgu_id = " . $tmp_orgu_members .
".orgu_id AND auth.scope = 1
232 AND auth.over = " . $tmp_orgu_members .
".user_position_id AND auth.over <> -1
235 /* Identische OrgUnit wie Current User; Nicht Rekursiv; Position egal */
236 (orgu_ua_current_user.orgu_id = " . $tmp_orgu_members .
".orgu_id AND auth.scope = 1 AND auth.over = -1)
238 /* Kinder OrgUnit wie Current User */
241 " . $tmp_orgu_members .
".orgu_id = orgu_ua_current_user.orgu_id OR
242 " . $tmp_orgu_members .
".tree_path LIKE CONCAT(\"%.\",orgu_ua_current_user.orgu_id ,\".%\")
244 " . $tmp_orgu_members .
".tree_path LIKE CONCAT(\"%.\",orgu_ua_current_user.orgu_id )
250 /* Gleiche Position */
251 auth.over = " . $tmp_orgu_members .
".user_position_id AND auth.over <> -1
264 $user_set =
$DIC->database()->query($q);
266 $arr_users = array();
268 while ($rec =
$DIC->database()->fetchAssoc($user_set)) {
269 $arr_users[$rec[
'usr_id']] = $rec[
'usr_id'];
283 public function getIlobjectsAndUsersForUserOperationAndContext($user_id, $org_unit_operation_string = self::DEFAULT_ORG_UNIT_OPERATION,
$context = self::DEFAULT_CONTEXT)
292 $tmp_table_name =
'tmp_ilobj_user_matrix_' . $operation->getOperationId();
294 $this->buildTempTableIlobjectsUserMatrixForUserOperationAndContext($user_id, $org_unit_operation_string,
$context, $tmp_table_name);
296 $q =
'SELECT * FROM ' . $tmp_table_name;
298 $user_set =
$DIC->database()->query($q);
300 $arr_user_obj = array();
302 while ($rec =
$DIC->database()->fetchAssoc($user_set)) {
303 $arr_user_obj[] = $rec;
306 return $arr_user_obj;
318 public function buildTempTableIlobjectsUserMatrixForUserOperationAndContext($user_id, $org_unit_operation_string = self::DEFAULT_ORG_UNIT_OPERATION,
$context = self::DEFAULT_CONTEXT, $temporary_table_name_prefix = self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_USER_MATRIX)
322 $temporary_table_name = $temporary_table_name_prefix .
"_" . $org_unit_operation_string .
"_" .
$context;
331 $tmp_table_objects_specific_perimissions = $this->buildTempTableIlobjectsSpecificPermissionSetForOperationAndContext($org_unit_operation_string,
$context, self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_SPEC_PERMISSIONS);
333 $tmp_table_objects_default_perimissions = $this->buildTempTableIlobjectsDefaultPermissionSetForOperationAndContext($org_unit_operation_string,
$context, self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_DEFAULT_PERMISSIONS);
335 $tmp_table_orgunit_default_perimissions = $this->buildTempTableIlorgunitDefaultPermissionSetForOperationAndContext($org_unit_operation_string,
$context, self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_ORGU_DEFAULT_PERMISSIONS);
343 if ($temporary_table_name != self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_USER_MATRIX .
"_" . self::DEFAULT_ORG_UNIT_OPERATION .
"_"
344 . self::DEFAULT_CONTEXT) {
348 $q =
"CREATE TEMPORARY TABLE IF NOT EXISTS " . $temporary_table_name .
" AS (
349 SELECT DISTINCT user_perm_matrix.perm_for_ref_id, user_perm_matrix.usr_id FROM
351 SELECT crs.*," . $tmp_table_course_members .
".ref_id," . $tmp_table_course_members .
".usr_id FROM
353 SELECT * FROM " . $tmp_table_objects_specific_perimissions .
"
355 SELECT * FROM " . $tmp_table_objects_default_perimissions .
"
357 INNER JOIN " . $tmp_table_course_members .
" on " . $tmp_table_course_members .
".ref_id = crs.perm_for_ref_id
360 " . $tmp_table_course_members .
".orgu_id = crs.perm_for_orgu_id AND " . $tmp_table_course_members .
".position_id = crs.perm_over_user_with_position AND perm_orgu_scope = 1
362 or perm_orgu_scope = 2
365 SELECT " . $tmp_table_orgunit_default_perimissions .
".*, " . $tmp_table_orgu_members .
".orgu_id AS ref_id, "
366 . $tmp_table_orgu_members .
".user_id FROM " . $tmp_table_orgunit_default_perimissions .
"
367 INNER JOIN " . $tmp_table_orgu_members .
" on " . $tmp_table_orgu_members .
".orgu_id = "
368 . $tmp_table_orgunit_default_perimissions .
".perm_for_ref_id
371 " . $tmp_table_orgu_members .
".orgu_id = " . $tmp_table_orgunit_default_perimissions .
".perm_for_orgu_id AND "
372 . $tmp_table_orgu_members .
".user_position_id = " . $tmp_table_orgunit_default_perimissions .
".perm_over_user_with_position AND perm_orgu_scope = 1
374 or perm_orgu_scope = 2
377 ) AS user_perm_matrix
378 INNER JOIN " . $tmp_table_orgu_member_path .
" AS path on path.user_id = user_perm_matrix.usr_id
380 INNER JOIN il_orgu_ua AS orgu_ua_current_user on orgu_ua_current_user.user_id = " .
$DIC->database()->quote($user_id,
'integer') .
"
381 INNER JOIN il_orgu_permissions AS perm on perm.position_id = orgu_ua_current_user.position_id AND perm.parent_id = -1
382 INNER JOIN il_orgu_op_contexts AS contexts on contexts.id = perm.context_id AND contexts.context = '$context'
383 and perm.operations LIKE '%\"" . $operation->getOperationId() .
"\"%'
387 /* Identische OrgUnit wie Current User; Nicht Rekursiv; Fixe Position */
388 (orgu_ua_current_user.orgu_id = user_perm_matrix.perm_for_orgu_id AND user_perm_matrix.perm_orgu_scope = 1
389 AND orgu_ua_current_user.position_id = user_perm_matrix.perm_for_position_id AND user_perm_matrix.perm_over_user_with_position <> -1
392 /* Identische OrgUnit wie Current User; Nicht Rekursiv; Position egal */
393 (orgu_ua_current_user.orgu_id = user_perm_matrix.perm_for_orgu_id AND user_perm_matrix.perm_orgu_scope = 1 AND user_perm_matrix.perm_over_user_with_position = -1)
395 /* Kinder OrgUnit wie Current User */
397 orgu_ua_current_user.orgu_id = user_perm_matrix.perm_for_orgu_id
400 path.orgu_id = user_perm_matrix.perm_for_orgu_id OR
401 path.tree_path LIKE CONCAT(\"%.\",user_perm_matrix.perm_for_orgu_id ,\".%\")
403 path.tree_path LIKE CONCAT(\"%.\",user_perm_matrix.perm_for_orgu_id )
409 /* Gleiche Position */
410 orgu_ua_current_user.position_id = user_perm_matrix.perm_for_position_id AND user_perm_matrix.perm_over_user_with_position <> -1
415 user_perm_matrix.perm_over_user_with_position = -1
418 AND user_perm_matrix.perm_orgu_scope = 2
424 $DIC->database()->manipulate($q);
426 return $temporary_table_name;
437 public function buildTempTableIlobjectsSpecificPermissionSetForOperationAndContext($org_unit_operation_string = self::DEFAULT_ORG_UNIT_OPERATION,
$context = self::DEFAULT_CONTEXT, $temporary_table_name_prefix = self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_SPEC_PERMISSIONS)
441 $temporary_table_name = $temporary_table_name_prefix .
"_" . $org_unit_operation_string .
"_" .
$context;
448 if ($temporary_table_name != self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_SPEC_PERMISSIONS .
"_" . self::DEFAULT_ORG_UNIT_OPERATION .
"_"
449 . self::DEFAULT_CONTEXT) {
453 $q =
"CREATE TEMPORARY TABLE IF NOT EXISTS " . $temporary_table_name .
"
454 (INDEX i1 (perm_for_ref_id), INDEX i2 (perm_for_orgu_id), INDEX i3 (perm_orgu_scope), INDEX i4 (perm_for_position_id), INDEX i5 (perm_over_user_with_position))
457 obj_ref.ref_id AS perm_for_ref_id,
458 orgu_ua.orgu_id AS perm_for_orgu_id,
459 auth.scope AS perm_orgu_scope,
460 orgu_ua.position_id AS perm_for_position_id,
461 auth.over AS perm_over_user_with_position
463 il_orgu_permissions AS perm
464 INNER JOIN il_orgu_ua AS orgu_ua ON orgu_ua.position_id = perm.position_id
465 INNER JOIN il_orgu_authority AS auth ON auth.position_id = orgu_ua.position_id AND orgu_ua.user_id = " .
$GLOBALS[
'DIC']->user()
467 INNER JOIN object_reference AS obj_ref ON obj_ref.ref_id = perm.parent_id
468 INNER JOIN object_data AS obj ON obj.obj_id = obj_ref.obj_id AND obj.type = '$context'
469 INNER JOIN il_orgu_op_contexts AS contexts on contexts.id = perm.context_id AND contexts.context = '$context'
471 perm.operations LIKE '%\"" . $operation->getOperationId() .
"\"%'
474 $DIC->database()->manipulate($q);
476 return $temporary_table_name;
487 public function buildTempTableIlobjectsDefaultPermissionSetForOperationAndContext($org_unit_operation_string =
ilOrgUnitOperation::OP_ACCESS_ENROLMENTS,
$context = self::DEFAULT_CONTEXT, $temporary_table_name_prefix = self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_DEFAULT_PERMISSIONS)
491 $temporary_table_name = $temporary_table_name_prefix .
"_" . $org_unit_operation_string .
"_" .
$context;
498 if ($temporary_table_name != self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_DEFAULT_PERMISSIONS .
"_" . self::DEFAULT_ORG_UNIT_OPERATION .
"_"
499 . self::DEFAULT_CONTEXT) {
503 $q =
"CREATE TEMPORARY TABLE IF NOT EXISTS " . $temporary_table_name .
"
504 (INDEX i1 (perm_for_ref_id), INDEX i2 (perm_for_orgu_id), INDEX i3 (perm_orgu_scope), INDEX i4 (perm_for_position_id),INDEX i5 (perm_over_user_with_position))
507 obj_ref.ref_id AS perm_for_ref_id,
508 orgu_ua.orgu_id AS perm_for_orgu_id,
509 auth.scope AS perm_orgu_scope,
510 orgu_ua.position_id AS perm_for_position_id,
511 auth.over AS perm_over_user_with_position
514 INNER JOIN object_reference AS obj_ref ON obj_ref.obj_id = obj.obj_id
515 INNER JOIN il_orgu_permissions AS perm ON perm.operations LIKE '%\"" . $operation->getOperationId() .
"\"%' AND perm.parent_id = -1
516 INNER JOIN il_orgu_op_contexts AS contexts on contexts.id = perm.context_id AND contexts.context = '" .
$context .
"'
517 INNER JOIN il_orgu_ua AS orgu_ua ON orgu_ua.position_id = perm.position_id AND orgu_ua.user_id = " .
$GLOBALS[
'DIC']->user()
519 INNER JOIN il_orgu_authority AS auth ON auth.position_id = orgu_ua.position_id
523 AND (obj_ref.ref_id , orgu_ua.position_id)
526 perm.parent_id, orgu_ua.position_id
528 il_orgu_permissions AS perm
529 INNER JOIN il_orgu_ua AS orgu_ua ON orgu_ua.position_id = perm.position_id
530 INNER JOIN il_orgu_op_contexts AS contexts on contexts.id = perm.context_id AND contexts.context = '" .
$context .
"'
531 WHERE perm.parent_id <> -1)
534 $DIC->database()->manipulate($q);
536 return $temporary_table_name;
547 public function buildTempTableIlorgunitDefaultPermissionSetForOperationAndContext($org_unit_operation_string = self::DEFAULT_ORG_UNIT_OPERATION,
$context = self::DEFAULT_CONTEXT, $temporary_table_name_prefix = self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_ORGU_DEFAULT_PERMISSIONS)
551 $temporary_table_name = $temporary_table_name_prefix .
"_" . $org_unit_operation_string .
"_" .
$context;
557 if ($temporary_table_name != self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_ORGU_DEFAULT_PERMISSIONS .
"_" . self::DEFAULT_ORG_UNIT_OPERATION .
"_"
558 . self::DEFAULT_CONTEXT) {
562 $q =
"CREATE TEMPORARY TABLE IF NOT EXISTS " . $temporary_table_name .
"
563 (INDEX i1 (perm_for_ref_id), INDEX i2 (perm_for_orgu_id), INDEX i3 (perm_orgu_scope), INDEX i4 (perm_for_position_id), INDEX i5 (perm_over_user_with_position))
566 orgu_ua.orgu_id AS perm_for_ref_id, /* Table has to be identical to the other Permission For Operation And Context-Tables! */
567 orgu_ua.orgu_id AS perm_for_orgu_id,
568 auth.scope AS perm_orgu_scope,
569 orgu_ua.position_id AS perm_for_position_id,
570 auth.over AS perm_over_user_with_position
572 il_orgu_permissions AS perm
573 INNER JOIN il_orgu_ua AS orgu_ua ON orgu_ua.position_id = perm.position_id AND perm.parent_id = -1 AND orgu_ua.user_id = "
574 .
$GLOBALS[
'DIC']->user()->getId() .
"
575 INNER JOIN il_orgu_authority AS auth ON auth.position_id = orgu_ua.position_id
576 INNER JOIN il_orgu_op_contexts AS contexts on contexts.id = perm.context_id AND contexts.context = '" .
$context .
"'
578 perm.operations LIKE '%\"" . $operation->getOperationId() .
"\"%'
581 $DIC->database()->manipulate($q);
583 return $temporary_table_name;
593 public function buildTempTableCourseMemberships($temporary_table_name_prefix = self::TMP_DEFAULT_TABLE_NAME_PREFIX_CRS_MEMBERS, array $only_courses_of_user_ids = array())
597 $temporary_table_name = $temporary_table_name_prefix .
"_user_id_" .
$DIC->user()->getId();
599 if ($temporary_table_name != self::TMP_DEFAULT_TABLE_NAME_PREFIX_CRS_MEMBERS .
"_user_id_" .
$DIC->user()->getId()
600 || count($only_courses_of_user_ids) > 0) {
604 $q =
"CREATE TEMPORARY TABLE IF NOT EXISTS " . $temporary_table_name .
"
605 (INDEX i1(ref_id), INDEX i2 (usr_id), INDEX i3 (position_id), INDEX i4 (orgu_id))
607 SELECT crs_members_crs_ref.ref_id, crs_members.usr_id, orgu_ua.position_id, orgu_ua.orgu_id
609 SELECT obj_id, usr_id FROM obj_members WHERE member = 1
610 AND " .
$DIC->database()->in(
'obj_members.usr_id', $only_courses_of_user_ids,
false,
'integer') .
"
612 SELECT obj_id, usr_id FROM crs_waiting_list
613 WHERE " .
$DIC->database()->in(
'crs_waiting_list.usr_id', $only_courses_of_user_ids,
false,
'integer') .
"
615 SELECT obj_id, usr_id FROM il_subscribers
616 WHERE " .
$DIC->database()->in(
'il_subscribers.usr_id', $only_courses_of_user_ids,
false,
'integer') .
"
618 INNER JOIN object_reference AS crs_members_crs_ref on crs_members_crs_ref.obj_id = crs_members.obj_id
619 INNER JOIN il_orgu_ua AS orgu_ua on orgu_ua.user_id = crs_members.usr_id
622 $DIC->database()->manipulate($q);
624 return $temporary_table_name;
634 public function buildTempTableOrguMemberships($temporary_table_name_prefix = self::TMP_DEFAULT_TABLE_NAME_PREFIX_ORGU_MEMBERS, array $only_orgus_of_user_ids = array())
638 $temporary_table_name = $temporary_table_name_prefix .
"_user_id_" .
$DIC->user()->getId();
640 if ($temporary_table_name != self::TMP_DEFAULT_TABLE_NAME_PREFIX_ORGU_MEMBERS .
"_user_id_" .
$DIC->user()->getId()
641 || count($only_orgus_of_user_ids) > 0) {
645 $q =
"CREATE TEMPORARY TABLE IF NOT EXISTS " . $temporary_table_name .
"
646 (INDEX i1(orgu_id), INDEX i2 (tree_path), INDEX i3 (tree_child), INDEX i4 (tree_parent), INDEX i5 (tree_lft), INDEX i6 (tree_rgt), INDEX i7 (user_position_id), INDEX i8 (user_id))
648 SELECT orgu_ua.orgu_id AS orgu_id,
649 tree_orgu.path AS tree_path,
650 tree_orgu.child AS tree_child,
651 tree_orgu.parent AS tree_parent,
652 tree_orgu.lft AS tree_lft,
653 tree_orgu.rgt AS tree_rgt,
654 orgu_ua.position_id AS user_position_id,
655 orgu_ua.user_id AS user_id
657 il_orgu_ua AS orgu_ua
658 INNER JOIN object_reference AS obj_ref on obj_ref.ref_id = orgu_ua.orgu_id AND obj_ref.deleted is null
659 LEFT JOIN tree AS tree_orgu ON tree_orgu.child = orgu_ua.orgu_id";
661 if (count($only_orgus_of_user_ids) > 0) {
662 $q .=
" WHERE " .
$DIC->database()->in(
'orgu_ua.user_id', $only_orgus_of_user_ids,
false,
'integer') .
" ";
667 $DIC->database()->manipulate($q);
669 return $temporary_table_name;
682 $q =
"DROP TABLE IF EXISTS " . $temporary_table_name;
683 $DIC->database()->manipulate($q);
An exception for terminatinating execution or to throw for unit testing.
hasCurrentUserAccessToLearningProgressInObject($ref_id=0)
dropTempTable($temporary_table_name)
buildTempTableOrguMemberships($temporary_table_name_prefix=self::TMP_DEFAULT_TABLE_NAME_PREFIX_ORGU_MEMBERS, array $only_orgus_of_user_ids=array())
hasCurrentUserAccessToUser($usr_id=0)
const DEFAULT_ORG_UNIT_OPERATION
const TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_USER_MATRIX
const TMP_DEFAULT_TABLE_NAME_PREFIX_CRS_MEMBERS
const TMP_DEFAULT_TABLE_NAME_PREFIX_ORGU_MEMBERS
countOrgusOfUserWithAtLeastOneOperation($user_id)
static $orgu_users_of_current_user_show_staff_permission
const TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_SPEC_PERMISSIONS
getUsersForUserOperationAndContext($user_id, $org_unit_operation_string=self::DEFAULT_ORG_UNIT_OPERATION, $context=self::DEFAULT_CONTEXT, $tmp_table_name_prefix=self::TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_USER_MATRIX)
const TMP_DEFAULT_TABLE_NAME_PREFIX_IL_ORGU_DEFAULT_PERMISSIONS
const TMP_DEFAULT_TABLE_NAME_PREFIX_IL_OBJ_DEFAULT_PERMISSIONS
getUsersForUser($user_id)
hasCurrentUserAccessToMyStaff()
hasCurrentUserAccessToCourseLearningProgressForAtLeastOneUser()
buildTempTableCourseMemberships($temporary_table_name_prefix=self::TMP_DEFAULT_TABLE_NAME_PREFIX_CRS_MEMBERS, array $only_courses_of_user_ids=array())
static findByOperationString($operation_string, $context_name)
const OP_ACCESS_ENROLMENTS
const OP_READ_LEARNING_PROGRESS
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.