Add name variants and binets in Profile
[platal.git] / classes / user.php
index 6d1987f..d6555af 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2009 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -24,11 +24,18 @@ class User extends PlUser
     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();
         }
@@ -145,7 +152,7 @@ class User extends PlUser
         $joins = '';
         $fields = array();
         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'));
+            $joins .= XDB::format("LEFT JOIN group_members 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';
         }
@@ -163,11 +170,15 @@ class User extends PlUser
                                       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))
+                           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) . ')
                             GROUP BY  a.uid');
@@ -446,6 +457,33 @@ class User extends PlUser
         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()]);
+    }
+
+    // Groupes X
+    private $groups = null;
+    public function groups()
+    {
+        if (is_null($this->groups)) {
+            $this->groups = XDB::fetchAllAssoc('asso_id', 'SELECT  asso_id, perms, comm
+                                                             FROM  #groupex#.membres
+                                                            WHERE  uid = {?}',
+                                                $this->id());
+        }
+        return $this->groups;
+    }
+
     // Return permission flags for a given permission level.
     public static function makePerms($perms, $is_admin)
     {
@@ -461,7 +499,7 @@ class User extends PlUser
     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));
@@ -496,21 +534,67 @@ class User extends PlUser
     }
 
     // Fetch a set of users from a list of UIDs
-    public static function getBulkUsersWithUIDs(array $uids)
+    public static function getBulkUsersWithUIDs(array $data, $orig = null, $dest = null, $fetchProfile = true)
     {
+        // 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 array();
+            return $data;
         }
         $fields = self::loadMainFieldsFromUIDs($uids);
         $table = array();
+        if ($fetchProfile) {
+            $profiles = Profile::getBulkProfilesWithUIDS($uids);
+        }
         while (($list = $fields->next())) {
-            $table[$list['uid']] = 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;
         }
-        $users = array();
-        foreach ($uids as $uid) {
-            $users[] = $table[$uid];
+
+        // 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);
     }
 }