X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=classes%2Fpluser.php;h=d1ba961972b1049141f72ee0d608b45f4ed53e63;hb=42522e2123d8092f2351bf03086024e6b6bb6ba8;hp=5b36897f6111a9942806096fe23590bda7587fd4;hpb=5421ab0971fa76a0ae98afbeffe899318c07780e;p=platal.git diff --git a/classes/pluser.php b/classes/pluser.php index 5b36897..d1ba961 100644 --- a/classes/pluser.php +++ b/classes/pluser.php @@ -1,6 +1,6 @@ !"), 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 + protected $email_format = null; // Acceptable values are FORMAT_HTML and FORMAT_TEXT + + // Permissions + protected $perms = null; + protected $perm_flags = null; // Other properties are listed in this key-value hash map. protected $data = array(); @@ -105,24 +123,60 @@ abstract class PlUser * Accessors to the main properties, ie. those available as top level * object variables. */ - public function id() { return $this->user_id; } - public function login() { return $this->hruid; } + public function id() + { + return $this->user_id; + } + + public function login() + { + return $this->hruid; + } + + public function bestEmail() + { + return $this->bestalias; + } + public function forlifeEmail() + { + return $this->forlife; + } + + public function displayName() + { + return $this->display_name; + } + public function fullName() + { + return $this->full_name; + } + + abstract public function password(); - public function bestEmail() { return $this->bestalias; } - public function forlifeEmail() { return $this->forlife; } + // Fallback value is GENDER_MALE. + public function isFemale() + { + return $this->gender == self::GENDER_FEMALE; + } - public function displayName() { return $this->display_name; } - public function fullName() { return $this->full_name; } + // Fallback value is FORMAT_TEXT. + public function isEmailFormatHtml() + { + return $this->email_format == self::FORMAT_HTML; + } /** * Other properties are available directly through the $data array, or as * standard object variables, using a getter. */ - public function data() { return $this->data; } + public function data() + { + return $this->data; + } public function __get($name) { - if (isset($this->$name)) { + if (property_exists($this, $name)) { return $this->$name; } @@ -135,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]); } /** @@ -158,6 +212,41 @@ 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. + */ + abstract protected function buildPerms(); + + /** + * Check wether the user got the given permission combination. + */ + public function checkPerms($perms) + { + if (is_null($this->perm_flags)) { + $this->buildPerms(); + } + if (is_null($this->perm_flags)) { + return false; + } + return $this->perm_flags->hasFlagCombination($perms); + } + /** * Returns a valid User object built from the @p id and optionnal @p values, @@ -181,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) { @@ -192,19 +286,26 @@ 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')); + } + /** - * Returns forlife emails corresponding to the @p logins. If @p strict mode - * is disabled, it also includes login for which no forlife was found (but - * still call the callback for them). + * Retrieves User objects corresponding to the @p logins, and eventually + * extracts and returns the @p property. If @p strict mode is disabled, it + * also includes logins for which no forlife was found (but it still calls + * the callback for them). * In all cases, email addresses which are not from the local domains are * kept. * * @param $logins Array of user logins. + * @param $property Property to retrieve from the User objects. * @param $strict Should unvalidated logins be returned as-is or discarded ? * @param $callback Callback to call when a login is unknown to the system. * @return Array of validated user forlife emails. */ - public static function getBulkForlifeEmails($logins, $strict = true, $callback = false) + private static function getBulkUserProperties($logins, $property, $strict, $callback) { if (!is_array($logins)) { if (strlen(trim($logins)) == 0) { @@ -222,8 +323,8 @@ abstract class PlUser } if (($user = User::get($login, $callback))) { - $list[$i] = $user->forlifeEmail(); - } else if (!$strict || User::isForeignEmailAddress($login)) { + $list[$i] = $user->$property(); + } else if (!$strict || (User::isForeignEmailAddress($login) && isvalid_email($login))) { $list[$i] = $login; } } @@ -233,6 +334,24 @@ abstract class PlUser } /** + * Returns hruid corresponding to the @p logins. See getBulkUserProperties() + * for details. + */ + public static function getBulkHruid($logins, $callback = false) + { + return self::getBulkUserProperties($logins, 'login', true, $callback); + } + + /** + * Returns forlife emails corresponding to the @p logins. See + * getBulkUserProperties() for details. + */ + public static function getBulkForlifeEmails($logins, $strict = true, $callback = false) + { + return self::getBulkUserProperties($logins, 'forlifeEmail', $strict, $callback); + } + + /** * Predefined callbacks for the user lookup; they are called when a given * login is found not to be associated with any valid user. Silent callback * does nothing; default callback is supposed to display an error message, @@ -250,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: