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;
67 /** @var int Store current Unix timestamp. */
68 protected int $now = 0;
73 * Use self::instance() instead to get cached copies of the class. Instances obtained
74 * through this constructor will not be cached.
76 * @param int|\stdClass $user User id
77 * @param \context|null $context
80 public function __construct($user, ?\context
$context = null) {
82 if (is_scalar($user)) {
83 $this->user
= new \
stdClass();
84 $this->user
->id
= $user;
89 if (!is_null($context)) {
90 $this->usercontext
= $context;
95 * Returns an analytics user instance.
97 * Lazy load of analysable data.
99 * @param int|\stdClass $user User object or user id
100 * @param \context|null $context
101 * @return \core_analytics\user
103 public static function instance($user, ?\context
$context = null) {
106 if (!is_scalar($userid)) {
110 if (self
::$cachedid === $userid) {
111 return self
::$cachedinstance;
114 $cachedinstance = new \core_analytics\
user($user, $context);
115 self
::$cachedinstance = $cachedinstance;
116 self
::$cachedid = (int)$userid;
117 return self
::$cachedinstance;
125 public function get_id() {
126 return $this->user
->id
;
130 * Loads the analytics user object.
134 protected function load() {
136 // The instance constructor could be already loaded with the full user object. Using email
137 // because it is a required user field.
138 if (empty($this->user
->email
)) {
139 $this->user
= \core_user
::get_user($this->user
->id
);
142 $this->usercontext
= $this->get_context();
146 // Flag the instance as loaded.
147 $this->loaded
= true;
151 * The user full name.
155 public function get_name() {
157 if (!$this->loaded
) {
160 return fullname($this->user
);
168 public function get_context() {
169 if ($this->usercontext
=== null) {
170 $this->usercontext
= \context_user
::instance($this->user
->id
);
172 return $this->usercontext
;
176 * Get the start timestamp.
180 public function get_start() {
182 if (!$this->loaded
) {
185 return $this->user
->timecreated
;
189 * Get the end timestamp.
193 public function get_end() {
194 return self
::MAX_TIME
;
198 * Returns a user plain object.
202 public function get_user_data() {
204 if (!$this->loaded
) {