AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Class users_data_source.
*
* @package block_dash
* @copyright 2019 bdecent gmbh <https://bdecent.de>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace block_dash\local\data_source;
use block_dash\local\block_builder;
use block_dash\local\dash_framework\query_builder\builder;
use block_dash\local\dash_framework\query_builder\join;
use block_dash\local\dash_framework\structure\table;
use block_dash\local\dash_framework\structure\user_table;
use block_dash\local\data_grid\filter\current_course_participants_condition;
use block_dash\local\data_grid\filter\date_filter;
use block_dash\local\data_grid\filter\filter;
use block_dash\local\data_grid\filter\group_filter;
use block_dash\local\data_grid\filter\logged_in_user_condition;
use block_dash\local\data_grid\filter\filter_collection;
use block_dash\local\data_grid\filter\filter_collection_interface;
use block_dash\local\data_grid\filter\my_groups_condition;
use block_dash\local\data_grid\filter\participants_condition;
use block_dash\local\data_grid\filter\user_field_filter;
use block_dash\local\data_grid\filter\user_profile_field_filter;
use block_dash\local\data_grid\filter\current_course_condition;
use block_dash\local\data_grid\filter\bool_filter;
use coding_exception;
use context;
/**
* Class users_data_source.
*
* @package block_dash
*/
class users_data_source extends abstract_data_source {
/**
* Constructor.
*
* @param context $context
*/
public function __construct(context $context) {
$this->add_table(new user_table());
parent::__construct($context);
}
/**
* Get human readable name of data source.
*
* @return string
* @throws coding_exception
*/
public function get_name() {
return get_string('users');
}
/**
* Return query template for retrieving user info.
*
* @return builder
* @throws coding_exception
*/
public function get_query_template(): builder {
global $CFG, $DB;
require_once("$CFG->dirroot/user/profile/lib.php");
$builder = new builder();
$builder
->select('u.id', 'u_id')
->from('user', 'u')
->join('user_enrolments', 'ue', 'userid', 'u.id', join::TYPE_LEFT_JOIN)
->join('enrol', 'e', 'id', 'ue.enrolid', join::TYPE_LEFT_JOIN)
->join('course', 'c', 'id', 'e.courseid', join::TYPE_LEFT_JOIN)
->join('groups_members', 'gm', 'userid', 'u.id', join::TYPE_LEFT_JOIN)
->join('groups', 'g', 'id', 'gm.groupid', join::TYPE_LEFT_JOIN);
foreach (profile_get_custom_fields() as $field) {
$alias = 'u_pf_' . strtolower($field->shortname);
$builder
->join('user_info_data', $alias, 'userid', 'u.id', join::TYPE_LEFT_JOIN)
->join_condition($alias, "$alias.fieldid = $field->id");
}
$builder->where('u.deleted', [0]);
return $builder;
}
/**
* Group by columns.
*
* @return string
*/
public function get_groupby() {
return false;
}
/**
* Build and return filter collection.
*
* @return filter_collection_interface
* @throws coding_exception
*/
public function build_filter_collection() {
global $CFG;
require_once("$CFG->dirroot/user/profile/lib.php");
$filtercollection = new filter_collection(get_class($this), $this->get_context());
$filtercollection->add_filter(new group_filter('group', 'gm100.groupid'));
$filtercollection->add_filter(new user_field_filter('u_department', 'u.department', 'department',
get_string('department')));
$filtercollection->add_filter(new user_field_filter('u_institution', 'u.institution', 'institution',
get_string('institution')));
$filter = new date_filter('u_lastlogin', 'u.lastlogin', date_filter::DATE_FUNCTION_FLOOR,
get_string('lastlogin'));
$filter->set_operation(filter::OPERATION_GREATER_THAN_EQUAL);
$filtercollection->add_filter($filter);
$filter = new date_filter('u_firstaccess', 'u.firstaccess', date_filter::DATE_FUNCTION_FLOOR,
get_string('firstaccess'));
$filter->set_operation(filter::OPERATION_GREATER_THAN_EQUAL);
$filtercollection->add_filter($filter);
$filtercollection->add_filter(new logged_in_user_condition('current_user', 'u.id'));
$filtercollection->add_filter(new participants_condition('participants', 'u.id'));
$filtercollection->add_filter(new my_groups_condition('my_groups', 'gm300.groupid'));
$filtercollection->add_filter(new current_course_condition('current_course', 'c.id'));
if (block_dash_has_pro()) {
$filtercollection->add_filter(new \local_dash\data_grid\filter\parent_role_condition('parentrole', 'u.id'));
$filtercollection->add_filter(new \local_dash\data_grid\filter\cohort_condition('cohort', 'u.id'));
$filtercollection->add_filter(new \local_dash\data_grid\filter\users_mycohort_condition('users_mycohort', 'u.id'));
}
foreach (profile_get_custom_fields() as $field) {
$alias = 'u_pf_' . strtolower($field->shortname);
$select = $alias . '.data';
switch ($field->datatype) {
case 'checkbox':
$definitions[] = new bool_filter($alias, $select, $field->name);
break;
case 'datetime':
$filtercollection->add_filter(new date_filter($alias, $select, date_filter::DATE_FUNCTION_FLOOR,
$field->name));
break;
case 'textarea':
break;
default:
$filter = new user_profile_field_filter($alias, $alias . '.data', $field->id, $field->name);
$filter->set_label(format_string($field->name));
$filtercollection->add_filter($filter);
break;
}
}
return $filtercollection;
}
/**
* Set the default preferences of the User datasource, force the set the default settings.
*
* @param array $data
* @return array
*/
public function set_default_preferences(&$data) {
$configpreferences = $data['config_preferences'];
$configpreferences['available_fields']['u_firstname']['visible'] = true;
$configpreferences['available_fields']['u_lastname']['visible'] = true;
$configpreferences['available_fields']['u_email']['visible'] = true;
$configpreferences['available_fields']['u_lastlogin']['visible'] = true;
$data['config_preferences'] = $configpreferences;
}
}