2 // This file is part of Moodle - http://moodle.org/
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18 * Moodle user analysable
20 * @package core_analytics
21 * @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 namespace core_analytics
;
27 defined('MOODLE_INTERNAL') ||
die();
30 * Moodle user analysable
32 * @package core_analytics
33 * @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
34 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36 class user
implements \core_analytics\analysable
{
39 * @var bool Has this user data been already loaded.
41 protected $loaded = false;
44 * @var int $cachedid self::$cachedinstance analysable id.
46 protected static $cachedid = 0;
49 * @var \core_analytics\user $cachedinstance
51 protected static $cachedinstance = null;
58 protected $user = null;
65 protected $usercontext = null;
70 * Use self::instance() instead to get cached copies of the class. Instances obtained
71 * through this constructor will not be cached.
73 * @param int|\stdClass $user User id
74 * @param \context|null $context
77 public function __construct($user, ?\context
$context = null) {
79 if (is_scalar($user)) {
80 $this->user
= new \
stdClass();
81 $this->user
->id
= $user;
86 if (!is_null($context)) {
87 $this->usercontext
= $context;
92 * Returns an analytics user instance.
94 * Lazy load of analysable data.
96 * @param int|\stdClass $user User object or user id
97 * @param \context|null $context
98 * @return \core_analytics\user
100 public static function instance($user, ?\context
$context = null) {
103 if (!is_scalar($userid)) {
107 if (self
::$cachedid === $userid) {
108 return self
::$cachedinstance;
111 $cachedinstance = new \core_analytics\
user($user, $context);
112 self
::$cachedinstance = $cachedinstance;
113 self
::$cachedid = (int)$userid;
114 return self
::$cachedinstance;
122 public function get_id() {
123 return $this->user
->id
;
127 * Loads the analytics user object.
131 protected function load() {
133 // The instance constructor could be already loaded with the full user object. Using email
134 // because it is a required user field.
135 if (empty($this->user
->email
)) {
136 $this->user
= \core_user
::get_user($this->user
->id
);
139 $this->usercontext
= $this->get_context();
143 // Flag the instance as loaded.
144 $this->loaded
= true;
148 * The user full name.
152 public function get_name() {
154 if (!$this->loaded
) {
157 return fullname($this->user
);
165 public function get_context() {
166 if ($this->usercontext
=== null) {
167 $this->usercontext
= \context_user
::instance($this->user
->id
);
169 return $this->usercontext
;
173 * Get the start timestamp.
177 public function get_start() {
179 if (!$this->loaded
) {
182 return $this->user
->timecreated
;
186 * Get the end timestamp.
190 public function get_end() {
191 return self
::MAX_TIME
;
195 * Returns a user plain object.
199 public function get_user_data() {
201 if (!$this->loaded
) {