Fixes the function that returns int in PlDict, adds count and merge to PlDict.
[platal.git] / classes / pluser.php
index 86cdf26..d1ba961 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -54,6 +54,9 @@ abstract class PlUser
      * By convention, null means the information hasn't been fetched yet, and
      * false means the information is not available.
      */
+
+    // user_id is internal user ID (potentially numeric), whereas hruid is a
+    // "human readable" unique ID
     protected $user_id = null;
     protected $hruid = null;
 
@@ -66,7 +69,6 @@ abstract class PlUser
     // <display name> !"), while full name is the official full name.
     protected $display_name = null;
     protected $full_name = null;
-    protected $promo = null;
 
     // Other important parameters used when sending emails.
     protected $gender = null;  // Acceptable values are GENDER_MALE and GENDER_FEMALE
@@ -149,10 +151,7 @@ abstract class PlUser
         return $this->full_name;
     }
 
-    public function promo()
-    {
-        return $this->promo;
-    }
+    abstract public function password();
 
     // Fallback value is GENDER_MALE.
     public function isFemale()
@@ -177,7 +176,7 @@ abstract class PlUser
 
     public function __get($name)
     {
-        if (isset($this->$name)) {
+        if (property_exists($this, $name)) {
             return $this->$name;
         }
 
@@ -190,7 +189,7 @@ abstract class PlUser
 
     public function __isset($name)
     {
-        return isset($this->$name) || isset($this->data[$name]);
+        return property_exists($this, $name) || isset($this->data[$name]);
     }
 
     /**
@@ -213,6 +212,21 @@ abstract class PlUser
         $this->data = array_merge($this->data, $values);
     }
 
+    /**
+     * Adds properties to the object; this method does not allow the caller to
+     * update core properties (id, ...).
+     *
+     * @param $values An associative array of non-core properties.
+     */
+    public function addProperties(array $values)
+    {
+        foreach ($values as $key => $value) {
+            if (!property_exists($this, $key)) {
+                $this->data[$key] = $value;
+            }
+        }
+    }
+
 
     /**
      * Build the permissions flags for the user.
@@ -256,6 +270,11 @@ abstract class PlUser
         }
     }
 
+    public static function getWithUID($uid, $callback = false)
+    {
+        return User::getWithValues(null, array('user_id' => $uid), $callback);
+    }
+
     // Same as above, but using the silent callback as default.
     public static function getSilent($login)
     {
@@ -267,6 +286,11 @@ abstract class PlUser
         return User::getWithValues($login, $values, array('User', '_silent_user_callback'));
     }
 
+    public static function getSilentWithUID($uid)
+    {
+        return User::getWithValues(null, array('user_id' => $uid), array('User', '_silent_user_callback'));
+    }
+
     /**
      * Retrieves User objects corresponding to the @p logins, and eventually
      * extracts and returns the @p property. If @p strict mode is disabled, it
@@ -300,7 +324,7 @@ abstract class PlUser
 
                 if (($user = User::get($login, $callback))) {
                     $list[$i] = $user->$property();
-                } else if (!$strict || User::isForeignEmailAddress($login)) {
+                } else if (!$strict || (User::isForeignEmailAddress($login) && isvalid_email($login))) {
                     $list[$i] = $login;
                 }
             }
@@ -345,6 +369,58 @@ abstract class PlUser
      * served locally by plat/al.
      */
     abstract public static function isForeignEmailAddress($email);
+
+    private static function stripBadChars($text)
+    {
+        return str_replace(array(' ', "'"), array('-', ''),
+                           strtolower(stripslashes(replace_accent(trim($text)))));
+    }
+
+    /** Creates a username from a first and last name
+     * @param $firstname User's firstname
+     * @param $lasttname User's lastname
+     * return STRING the corresponding username
+     */
+    public static function makeUserName($firstname, $lastname)
+    {
+        return self::stripBadChars($firstname) . '.' . self::stripBadChars($lastname);
+    }
+
+    /**
+     * Creates a user forlive identifier from:
+     * @param $firstname User's firstname
+     * @param $lasttname User's lastname
+     * @param $category  User's promotion or type of account
+     */
+    public static function makeHrid($firstname, $lastname, $category)
+    {
+        $cat = self::stripBadChars($category);
+        if (!cat) {
+            Platal::page()->kill("$category is not a suitable category.");
+        }
+
+        return self::makeUserName($firstname, $lastname) . '.' . $cat;
+    }
+
+    /** Reformats the firstname so that all letters are in lower case,
+     * except the first letter of each part of the name.
+     */
+    public static function fixFirstnameCase($firstname)
+    {
+        $firstname = strtolower($firstname);
+        $pieces = explode('-', $firstname);
+
+        foreach ($pieces as $piece) {
+            $subpieces = explode("'", $piece);
+            $usubpieces = '';
+
+            foreach ($subpieces as $subpiece) {
+                $usubpieces[] = ucwords($subpiece);
+            }
+            $upieces[] = implode("'", $usubpieces);
+        }
+        return implode('-', $upieces);
+    }
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: