Fixes non-x members of groups. Closes #1087
[platal.git] / classes / user.php
index 3254b73..9d95fa4 100644 (file)
@@ -171,9 +171,9 @@ class User extends PlUser
         $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,
                                       IF(a.state = \'active\', at.perms, \'\') AS perms,
@@ -462,6 +462,14 @@ class User extends PlUser
         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;
@@ -493,6 +501,11 @@ class User extends PlUser
         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()
@@ -506,6 +519,20 @@ class User extends PlUser
         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,
@@ -534,11 +561,30 @@ class User extends PlUser
                      $this->id());
 
         if ($clearAll) {
+            $groupIds = XDB::iterator('SELECT  asso_id
+                                         FROM  group_members
+                                        WHERE  uid = {?}',
+                                      $this->id());
+            while ($groupId = $groupIds->next()) {
+                $group = Group::get($groupId);
+                if ($group->notif_unsub) {
+                    $mailer = new PlMailer('xnetgrp/unsubscription-notif.mail.tpl');
+                    $admins = $group->iterAdmins();
+                    while ($admin = $admins->next()) {
+                        $mailer->addTo($admin);
+                    }
+                    $mailer->assign('group', $group->shortname);
+                    $mailer->assign('user', $this);
+                    $mailer->assign('selfdone', false);
+                    $mailer->send();
+                }
+            }
+
             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_member_sub_requests, reminder, requests,
+                                       group_members, group_member_sub_requests, reminder, requests,
                                        requests_hidden
                                 WHERE  uid = {?}',
                          $this->id());
@@ -620,6 +666,35 @@ class User extends PlUser
             || $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));