Merge branch 'install_master' of https://git.in.moodle.com/amosbot/moodle-install
[moodle.git] / analytics / classes / user.php
blob6dd83c73a2a2ad10cdf2318c391bde81b1475776
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
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.
8 //
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/>.
17 /**
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();
29 /**
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 {
38 /**
39 * @var bool Has this user data been already loaded.
41 protected $loaded = false;
43 /**
44 * @var int $cachedid self::$cachedinstance analysable id.
46 protected static $cachedid = 0;
48 /**
49 * @var \core_analytics\user $cachedinstance
51 protected static $cachedinstance = null;
53 /**
54 * User object
56 * @var \stdClass
58 protected $user = null;
60 /**
61 * The user context.
63 * @var \context_user
65 protected $usercontext = null;
67 /**
68 * Constructor.
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
75 * @return void
77 public function __construct($user, ?\context $context = null) {
79 if (is_scalar($user)) {
80 $this->user = new \stdClass();
81 $this->user->id = $user;
82 } else {
83 $this->user = $user;
86 if (!is_null($context)) {
87 $this->usercontext = $context;
91 /**
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) {
102 $userid = $user;
103 if (!is_scalar($userid)) {
104 $userid = $user->id;
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;
118 * get_id
120 * @return int
122 public function get_id() {
123 return $this->user->id;
127 * Loads the analytics user object.
129 * @return void
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();
141 $this->now = time();
143 // Flag the instance as loaded.
144 $this->loaded = true;
148 * The user full name.
150 * @return string
152 public function get_name() {
154 if (!$this->loaded) {
155 $this->load();
157 return fullname($this->user);
161 * get_context
163 * @return \context
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.
175 * @return int
177 public function get_start() {
179 if (!$this->loaded) {
180 $this->load();
182 return $this->user->timecreated;
186 * Get the end timestamp.
188 * @return int
190 public function get_end() {
191 return self::MAX_TIME;
195 * Returns a user plain object.
197 * @return \stdClass
199 public function get_user_data() {
201 if (!$this->loaded) {
202 $this->load();
205 return $this->user;