<?php
/***************************************************************************
- * Copyright (C) 2003-2008 Polytechnique.org *
+ * Copyright (C) 2003-2009 Polytechnique.org *
* http://opensource.polytechnique.org/ *
* *
* This program is free software; you can redistribute it and/or modify *
private $_profile_fetched = false;
private $_profile = null;
+ // Additional fields (non core)
+ protected $promo = null;
+
// Implementation of the login to uid method.
protected function getLogin($login)
{
global $globals;
+ if (!$login) {
+ throw new UserNotFoundException();
+ }
+
+ if ($login instanceof User) {
+ $machin->id();
+ }
+
if ($login instanceof Profile) {
$this->_profile = $login;
$this->_profile_fetched = true;
throw new UserNotFoundException($res->fetchColumn(1));
}
- protected static function loadMainFieldsFromUIDs(array $uids, $sorted = null)
+ protected static function loadMainFieldsFromUIDs(array $uids)
{
global $globals;
$joins = '';
- $orderby = '';
$fields = array();
- if (!is_null($sorted)) {
- $order = array();
- $with_ap = false;
- $with_pd = false;
- foreach (explode(',', $sorted) as $part) {
- $desc = ($part[0] == '-');
- if ($desc) {
- $part = substr($desc, 1);
- }
- switch ($part) {
- case 'promo':
- $with_pd = true;
- $with_ap = true;
- $part = 'IF (pd.promo IS NULL, \'ext\', pd.promo)';
- break;
- case 'full_name':
- $part = 'a.full_name';
- break;
- case 'display_name':
- $part = 'a.display_name';
- break;
- default:
- $part = null;
- }
- if (!is_null($part)) {
- if ($desc) {
- $part .= ' DESC';
- }
- $order[] = $part;
- }
- }
- if (count($order) > 0) {
- if ($with_ap) {
- $joins .= "LEFT JOIN account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))\n";
- }
- if ($with_pd) {
- $joins .= "LEFT JOIN profile_display AS pd ON (pd.pid = ap.pid)\n";
- }
- $orderby = 'ORDER BY ' . implode(', ', $order);
- }
- }
if ($globals->asso('id')) {
$joins .= XDB::format("LEFT JOIN groupex.membres AS gpm ON (gpm.uid = a.uid AND gpm.asso_id = {?})\n", $globals->asso('id'));
$fields[] = 'gpm.perms AS group_perms';
+ $fields[] = 'gpm.comm AS group_comm';
}
if (count($fields) > 0) {
$fields = ', ' . implode(', ', $fields);
a.email_format, a.is_admin, a.state, a.type, a.skin,
FIND_IN_SET(\'watch\', a.flags) AS watch, a.comment,
a.weak_password IS NOT NULL AS weak_access,
- a.token IS NOT NULL AS token_access ' . $fields . '
+ a.token IS NOT NULL AS token_access,
+ (e.email IS NULL AND NOT FIND_IN_SET(\'googleapps\', eo.storage)) AND a.state != \'pending\' AS lost
+ ' . $fields . '
FROM accounts AS a
INNER JOIN account_types AS at ON (at.type = a.type)
LEFT JOIN aliases AS af ON (af.id = a.uid AND af.type = \'a_vie\')
LEFT JOIN aliases AS ab ON (ab.id = a.uid AND FIND_IN_SET(\'bestalias\', ab.flags))
- ' . $joins . '
+ LEFT JOIN emails AS e ON (e.uid = a.uid AND e.flags = \'active\')
+ LEFT JOIN email_options AS eo ON (eo.uid = a.uid)
+ ' . $joins . '
WHERE a.uid IN (' . implode(', ', $uids) . ')
- ' . $orderby);
+ GROUP BY a.uid');
}
// Implementation of the data loader.
return $this->profile()->promo();
}
+ public function firstName()
+ {
+ if (!$this->hasProfile()) {
+ return $this->displayName();
+ }
+ return $this->profile()->firstName();
+ }
+
+ public function lastName()
+ {
+ if (!$this->hasProfile()) {
+ return '';
+ }
+ return $this->profile()->lastName();
+ }
+
/** Return the main profile attached with this account if any.
*/
public function profile()
/** Get all the aliases the user belongs to.
*/
- public function emailAliases($domain = null)
+ public function emailAliases($domain = null, $type = 'user', $sub_state = false)
{
+ $join = XDB::format('(vr.redirect = {?} OR vr.redirect = {?}) ',
+ $this->forlifeEmail(), $this->m4xForlifeEmail());
$where = '';
if (!is_null($domain)) {
- $where = XDB::format(' AND alias LIKE CONCAT("%@", {?})', $domain);
+ $where = XDB::format('WHERE v.alias LIKE CONCAT("%@", {?})', $domain);
+ }
+ if (!is_null($type)) {
+ if (empty($where)) {
+ $where = XDB::format('WHERE v.type = {?}', $type);
+ } else {
+ $where .= XDB::format(' AND v.type = {?}', $type);
+ }
+ }
+ if ($sub_state) {
+ return XDB::fetchAllAssoc('alias', 'SELECT v.alias, vr.redirect IS NOT NULL AS sub
+ FROM virtual AS v
+ LEFT JOIN virtual_redirect AS vr ON (v.vid = vr.vid AND ' . $join . ')
+ ' . $where);
+ } else {
+ return XDB::fetchColumn('SELECT v.alias
+ FROM virtual AS v
+ INNER JOIN virtual_redirect AS vr ON (v.vid = vr.vid AND ' . $join . ')
+ ' . $where);
}
- return XDB::fetchColumn('SELECT v.alias
- FROM virtual AS v
- INNER JOIN virtual_redirect AS vr ON (v.vid = vr.vid)
- WHERE (vr.redirect = {?} OR vr.redirect = {?})
- ' . $where,
- $this->forlifeEmail(), $this->m4xForlifeEmail());
}
/** Get the alternative forlife email
return $this->login() . '@' . $globals->mail->domain2;
}
+
+ /** Get marketing informations
+ */
+ private function fetchMarketingData()
+ {
+ if (isset($this->last_known_email)) {
+ return;
+ }
+ $infos = XDB::fetchOneAssoc('SELECT IF (MAX(m.last) > p.relance, MAX(m.last), p.relance) AS last_relance,
+ p.email AS last_known_email
+ FROM register_pending AS p
+ LEFT JOIN register_marketing AS m ON (p.uid = m.uid)
+ WHERE p.uid = {?}
+ GROUP BY p.uid', $this->id());
+ if (!$infos) {
+ $infos = array('last_relance' => null, 'last_known_email' => null);
+ }
+ $this->fillFromArray($infos);
+ }
+
+ public function lastMarketingRelance()
+ {
+ $this->fetchMarketingData();
+ return $this->last_relance;
+ }
+
+ public function lastKnownEmail()
+ {
+ $this->fetchMarketingData();
+ return $this->last_known_email;
+ }
+
+
+ /** Get watch informations
+ */
+ private function fetchWatchData()
+ {
+ if (isset($this->watch_actions)) {
+ return;
+ }
+ $watch = XDB::fetchOneAssoc('SELECT flags AS watch_flags, actions AS watch_actions,
+ UNIX_TIMESTAMP(last) AS watch_last
+ FROM watch
+ WHERE uid = {?}', $this->id());
+ $watch['watch_flags'] = new PlFlagSet($watch['watch_flags']);
+ $watch['watch_actions'] = new PlFlagSet($watch['watch_actions']);
+ $watch['watch_promos'] = XDB::fetchColumn('SELECT promo
+ FROM watch_promo
+ WHERE uid = {?}', $this->id());
+ $watch['watch_users'] = XDB::fetchColumn('SELECT ni_id
+ FROM watch_nonins
+ WHERE uid = {?}', $this->id());
+ $this->fillFromArray($watch);
+ }
+
+ public function watch($type)
+ {
+ $this->fetchWatchData();
+ return $this->watch_actions->hasFlag($type);
+ }
+
+ public function watchContacts()
+ {
+ $this->fetchWatchData();
+ return $this->watch_flags->hasFlag('contacts');
+ }
+
+ public function watchEmail()
+ {
+ $this->fetchWatchData();
+ return $this->watch_flags->hasFlag('mail');
+ }
+
+ public function watchPromos()
+ {
+ $this->fetchWatchData();
+ return $this->watch_promos;
+ }
+
+ public function watchUsers()
+ {
+ $this->fetchWatchData();
+ return $this->watch_users;
+ }
+
+ public function watchLast()
+ {
+ $this->fetchWatchData();
+ return $this->watch_last;
+ }
+
+
+ // Contacts
+ private $contacts = null;
+ public function isContact(PlUser &$user)
+ {
+ if (is_null($this->contacts)) {
+ $this->contacts = XDB::fetchAllAssoc('contact', 'SELECT *
+ FROM contacts
+ WHERE uid = {?}',
+ $this->id());
+ }
+ return isset($this->contacts[$user->id()]);
+ }
+
// Return permission flags for a given permission level.
public static function makePerms($perms, $is_admin)
{
public static function _default_user_callback($login, $results)
{
$result_count = count($results);
- if ($result_count == 0 || !S::has_perms()) {
+ if ($result_count == 0 || !S::admin()) {
Platal::page()->trigError("Il n'y a pas d'utilisateur avec l'identifiant : $login");
} else {
Platal::page()->trigError("Il y a $result_count utilisateurs avec cet identifiant : " . join(', ', $results));
$dom != $globals->mail->alias_dom2;
}
+ public static function isVirtualEmailAddress($email)
+ {
+ global $globals;
+ if (strpos($email, '@') === false) {
+ return false;
+ }
+
+ list($user, $dom) = explode('@', $email);
+ return $dom == $globals->mail->alias_dom
+ || $dom == $globals->mail->alias_dom2;
+ }
+
// Fetch a set of users from a list of UIDs
- public static function getBuildUsersWithUIDs(array $uids, $sortby = null)
+ public static function getBulkUsersWithUIDs(array $data, $orig = null, $dest = null, $fetchProfile = true)
{
- $fields = self::loadMainFieldsFromUIDs($uids, $sortby);
- $users = array();
+ // Fetch the list of uids
+ if (is_null($orig)) {
+ $uids = $data;
+ } else {
+ if (is_null($dest)) {
+ $dest = $orig;
+ }
+ $uids = array();
+ foreach ($data as $key=>$entry) {
+ if (isset($entry[$orig])) {
+ $uids[] = $entry[$orig];
+ }
+ }
+ }
+
+ // Fetch users
+ if (count($uids) == 0) {
+ return $data;
+ }
+ $fields = self::loadMainFieldsFromUIDs($uids);
+ $table = array();
+ if ($fetchProfile) {
+ $profiles = Profile::getBulkProfilesWithUIDS($uids);
+ }
while (($list = $fields->next())) {
- $users[] = User::getSilentWithValues(null, $list);
+ $uid = $list['uid'];
+ $user = User::getSilentWithValues(null, $list);
+ if ($fetchProfile) {
+ if (isset($profiles[$uid])) {
+ $user->_profile = $profiles[$uid];
+ }
+ $user->_profile_fetched = true;
+ }
+ $table[$list['uid']] = $user;
+ }
+
+ // Build the result with respect to input order.
+ if (is_null($orig)) {
+ $users = array();
+ foreach ($uids as $key=>$uid) {
+ $users[$key] = $table[$uid];
+ }
+ return $users;
+ } else {
+ foreach ($data as $key=>$entry) {
+ if (isset($entry[$orig])) {
+ $entry[$dest] = $table[$entry[$orig]];
+ $data[$key] = $entry;
+ }
+ }
+ return $data;
}
- return $users;
+ }
+
+ public static function getBulkUsersFromDB($fetchProfile = true)
+ {
+ $args = func_get_args();
+ $uids = call_user_func_array(array('XDB', 'fetchColumn'), $args);
+ return self::getBulkUsersWithUIDs($uids, null, null, $fetchProfile);
}
}