protected static function loadMainFieldsFromUIDs(array $uids, $respect_order = true)
{
+ if (empty($uids)) {
+ return PlIteratorUtils::emptyIterator();
+ }
+
global $globals;
$joins = '';
$fields = array();
$uids = array_map(array('XDB', 'escape'), $uids);
return XDB::iterator('SELECT a.uid, a.hruid, a.registration_date, ah.alias AS homonym,
- CONCAT(af.alias, \'@' . $globals->mail->domain . '\') AS forlife,
+ IF (af.alias IS NULL, a.email, CONCAT(af.alias, \'@' . $globals->mail->domain . '\')) AS forlife,
CONCAT(af.alias, \'@' . $globals->mail->domain2 . '\') AS forlife_alternate,
- CONCAT(ab.alias, \'@' . $globals->mail->domain . '\') AS bestalias,
+ IF (ab.alias IS NULL, a.email, CONCAT(ab.alias, \'@' . $globals->mail->domain . '\')) AS bestalias,
CONCAT(ab.alias, \'@' . $globals->mail->domain2 . '\') AS bestalias_alternate,
- a.full_name, a.display_name, a.sex = \'female\' AS gender,
+ a.full_name, a.directory_name, a.display_name, a.sex = \'female\' AS gender,
IF(a.state = \'active\', at.perms, \'\') AS perms,
a.email_format, a.is_admin, a.state, a.type, a.skin,
FIND_IN_SET(\'watch\', a.flags) AS watch, a.comment,
WHERE a.uid = {?}', $this->id());
}
+ public function isActive()
+ {
+ return $this->state == 'active';
+ }
+
/** Overload PlUser::promo(): there no promo defined for a user in the current
* schema. The promo is a field from the profile.
*/
return $this->profile()->lastName();
}
+ public function fullName($with_promo = false)
+ {
+ if (!$this->hasProfile()) {
+ return $this->full_name;
+ }
+ return $this->profile()->fullName($with_promo);
+ }
+
+ public function directoryName()
+ {
+ if (!$this->hasProfile()) {
+ return $this->directory_name;
+ }
+ return $this->profile()->directory_name;
+ }
+
/** Return the main profile attached with this account if any.
*/
public function profile()
*/
private function fetchMarketingData()
{
- if (isset($this->last_known_email)) {
+ if (isset($this->pending_registration_date)) {
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);
+ $infos = XDB::fetchOneAssoc('SELECT rp.date AS pending_registration_date, rp.email AS pending_registration_email,
+ rm.last AS last_marketing_date, rm.email AS last_marketing_email
+ FROM accounts AS a
+ LEFT JOIN register_pending AS rp ON (rp.uid = a.uid)
+ LEFT JOIN register_marketing AS rm ON (rm.uid = a.uid AND rm.last != \'0000-00-00\')
+ WHERE a.uid = {?}
+ ORDER BY rm.last DESC', $this->id());
+ if (is_null($infos)) {
+ $infos = array(
+ 'pending_registration_date' => null,
+ 'pending_registration_email' => null,
+ 'last_marketing_date' => null,
+ 'last_marketing_email' => null
+ );
}
$this->fillFromArray($infos);
}
- public function lastMarketingRelance()
+ public function pendingRegistrationDate()
+ {
+ $this->fetchMarketingData();
+ return $this->pending_registration_date;
+ }
+
+ public function pendingRegistrationEmail()
+ {
+ $this->fetchMarketingData();
+ return $this->pending_registration_email;
+ }
+
+ public function lastMarketingDate()
+ {
+ $this->fetchMarketingData();
+ return $this->last_marketing_date;
+ }
+
+ public function lastMarketingEmail()
{
$this->fetchMarketingData();
- return $this->last_relance;
+ return $this->last_marketing_email;
}
public function lastKnownEmail()
{
$this->fetchMarketingData();
- return $this->last_known_email;
+ if ($this->pending_registration_email > $this->last_marketing_date) {
+ return $this->pending_registration_email;
+ }
+ return $this->last_marketing_email;
+ }
+
+
+ /** Format of the emails sent by the site
+ */
+ public function setEmailFormat($format)
+ {
+ Platal::assert($format == self::FORMAT_HTML || $format == self::FORMAT_TEXT,
+ "Invalid email format \"$format\"");
+ XDB::execute("UPDATE accounts
+ SET email_format = {?}
+ WHERE uid = {?}",
+ $format, $this->uid);
+ $this->email_format = $format;
}
return $this->watch_last;
}
+ public function invalidWatchCache()
+ {
+ unset($this->watch_actions);
+ unset($this->watch_users);
+ unset($this->watch_last);
+ unset($this->watch_promos);
+ }
+
// Contacts
private $contacts = null;
return isset($this->contacts[$profile->id()]);
}
+ public function isWatchedUser(Profile &$profile)
+ {
+ return in_array($profile->id(), $this->watchUsers());
+ }
+
// Groupes X
private $groups = null;
public function groups()
return $this->groups;
}
+ public function groupNames($institutions = false)
+ {
+ if ($institutions) {
+ $where = ' AND (g.cat = \'GroupesX\' OR g.cat = \'Institutions\')';
+ } else {
+ $where = '';
+ }
+ return XDB::fetchAllAssoc('SELECT g.diminutif, g.nom, g.site
+ FROM group_members AS gm
+ LEFT JOIN groups AS g ON (g.id = gm.asso_id)
+ WHERE gm.uid = {?}' . $where,
+ $this->id());
+ }
+
/**
* Clears a user.
* *always deletes in: account_lost_passwords, register_marketing,
*/
public function clear($clearAll = true)
{
- XDB::execute('DELETE FROM account_lost_passwords, register_marketing,
- register_pending, register_subs, watch_nonins,
- watch, watch_promo
- WHERE uid = {?}',
- $this->id());
+ $tables = array('account_lost_passwords', 'register_marketing',
+ 'register_pending', 'register_subs', 'watch_nonins',
+ 'watch', 'watch_promo');
+
+ foreach ($tables as $t) {
+ XDB::execute('DELETE FROM ' . $t . '
+ WHERE uid = {?}',
+ $this->id());
+ }
if ($clearAll) {
$groupIds = XDB::iterator('SELECT asso_id
}
}
- XDB::execute('DELETE FROM account_auth_openid, announce_read, contacts,
- email_options, email_send_save, emails,
- forum_innd, forum_profiles, forum_subs,
- gapps_accounts, gapps_nicknames, group_announces_read,
- group_members, group_member_sub_requests, reminder, requests,
- requests_hidden
- WHERE uid = {?}',
- $this->id());
+ $tables = array('account_auth_openid', 'gannounce_read', 'contacts',
+ 'email_options', 'gemail_send_save', 'emails',
+ 'forum_innd', 'gforum_profiles', 'forum_subs',
+ 'gapps_accounts', 'ggapps_nicknames', 'group_announces_read',
+ 'group_members', 'ggroup_member_sub_requests', 'reminder', 'requests',
+ 'requests_hidden');
+
+ foreach ($tables as $t) {
+ XDB::execute('DELETE FROM ' . $t . '
+ WHERE uid = {?}',
+ $this->id());
+ }
+
XDB::execute("UPDATE accounts
SET registration_date = 0, state = 'pending', password = NULL,
weak_password = NULL, token = NULL, is_admin = 0
$mmlist->kill($alias, $clearAll);
}
+ // Merge all infos in other user and then clean this one
+ public function mergeIn(User &$newuser) {
+ if ($this->profile() || !$newuser->id()) {
+ // don't disable user with profile in this way
+ return false;
+ }
+ // TODO check all tables to see if there is no other info to use
+
+ $newemail = $newuser->forlifeEmail();
+ if (!$newemail && $this->forlifeEmail()) {
+ XDB::execute("UPDATE accounts
+ SET email = {?}
+ WHERE uid = {?} AND email IS NULL",
+ $this->forlifeEmail(), $newuser->id());
+ $newemail = $this->forlifeEmail();
+ }
+
+ // change email used in aliases and mailing lists
+ if ($this->forlifeEmail() != $newemail && $this->forlifeEmail()) {
+ // virtual_redirect (email aliases)
+ XDB::execute("DELETE v1
+ FROM virtual_redirect AS v1, virtual_redirect AS v2
+ WHERE v1.vid = v2.vid AND v1.redirect = {?} AND v2.redirect = {?}",
+ $this->forlifeEmail(), $newemail);
+ XDB::execute("UPDATE virtual_redirect
+ SET redirect = {?}
+ WHERE redirect = {?}",
+ $newemail, $this->forlifeEmail());
+
+ // require_once 'mmlist.php';
+
+ // group mailing lists
+ $group_domains = XDB::fetchColumn("SELECT g.mail_domain
+ FROM groups AS g
+ INNER JOIN group_members AS gm ON(g.id = gm.asso_id)
+ WHERE g.mail_domain != '' AND gm.uid = {?}",
+ $this->id());
+ foreach ($group_domains as $mail_domain) {
+ $mmlist = new MMList($this, $mail_domain);
+ $mmlist->replace_email_in_all($this->forlifeEmail(), $newmail);
+ }
+ // main domain lists
+ $mmlist = new MMList($this);
+ $mmlist->replace_email_in_all($this->forlifeEmail(), $newmail);
+ }
+
+ // group_members (xnet group membership)
+ XDB::execute("DELETE g1
+ FROM group_members AS g1, group_members AS g2
+ WHERE g1.uid = {?} AND g2.uid = {?} AND g1.asso_id = g2.asso_id",
+ $this->id(), $newuser->id());
+ XDB::execute("UPDATE group_members
+ SET uid = {?}
+ WHERE uid = {?}",
+ $this->id(), $newuser->id());
+
+ XDB::execute("DELETE FROM accounts WHERE uid = {?}", $this->id());
+
+ return true;
+ }
+
// Return permission flags for a given permission level.
public static function makePerms($perms, $is_admin)
{
|| $dom == $globals->mail->alias_dom2;
}
+ /* Tries to find pending accounts with an hruid close to $login. */
+ public static function getPendingAccounts($login, $iterator = false)
+ {
+ global $globals;
+
+ if (strpos($login, '@') === false) {
+ return null;
+ }
+
+ list($login, $domain) = explode('@', $login);
+
+ if ($domain && $domain != $globals->mail->domain && $domain != $globals->mail->domain2) {
+ return null;
+ }
+
+ $sql = "SELECT uid, full_name
+ FROM accounts
+ WHERE state = 'pending' AND REPLACE(hruid, '-', '') LIKE
+ CONCAT('%', REPLACE(REPLACE(REPLACE({?}, ' ', ''), '-', ''), '\'', ''), '%')
+ ORDER BY full_name";
+ if ($iterator) {
+ return XDB::iterator($sql, $login);
+ } else {
+ $res = XDB::query($sql, $login);
+ return $res->fetchAllAssoc();
+ }
+ }
+
+
public static function iterOverUIDs($uids, $respect_order = true)
{
return new UserIterator(self::loadMainFieldsFromUIDs($uids, $respect_order));
$table = array();
if ($fetchProfile) {
$profiles = Profile::iterOverUIDS($uids, true);
- $profile = $profiles->next();
+ if ($profiles != null) {
+ $profile = $profiles->next();
+ } else {
+ $profile = null;
+ }
}
/** We iterate through the users, moving in
*/
while (($user = $users->next())) {
if ($fetchProfile) {
- if ($profile->owner_id == $user->id()) {
+ if ($profile != null && $profile->owner_id == $user->id()) {
$user->_profile = $profile;
$profile = $profiles->next();
}