Add name variants and binets in Profile
[platal.git] / classes / profile.php
index 6e68dc9..102f908 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,10 +24,37 @@ class Profile
     static private $v_values = array('public'  => array('public'),
                                      'ax'      => array('ax', 'public'),
                                      'private' => array('private', 'ax', 'public'));
+
     const VISIBILITY_PUBLIC  = 'public';
     const VISIBILITY_AX      = 'ax';
     const VISIBILITY_PRIVATE = 'private';
 
+    /* name tokens */
+    const LASTNAME  = 'lastname';
+    const FIRSTNAME = 'firstname';
+    const NICKNAME  = 'nickname';
+    const PSEUDONYM = 'pseudonym';
+    const NAME      = 'name';
+    /* name variants */
+    const VN_MARITAL  = 'marital';
+    const VN_ORDINARY = 'ordinary';
+    const VN_OTHER    = 'other';
+    const VN_INI      = 'ini';
+    /* display names */
+    const DN_FULL      = 'directory_name';
+    const DN_DISPLAY   = 'yourself';
+    const DN_YOURSELF  = 'yourself';
+    const DN_DIRECTORY = 'directory_name';
+    const DN_PRIVATE   = 'private_name';
+    const DN_PUBLIC    = 'public_name';
+    const DN_SHORT     = 'short_name';
+    const DN_SORT      = 'sort_name';
+
+    static public $name_variants = array(
+            self::LASTNAME => array(self::VN_MARITAL, self::VN_ORDINARY),
+            self::FIRSTNAME => array(self::VN_ORDINARY, self::VN_INI, self::VN_OTHER)
+        );
+
     const ADDRESS_MAIN       = 0x000001;
     const ADDRESS_PERSO      = 0x000002;
     const ADDRESS_PRO        = 0x000004;
@@ -119,11 +146,21 @@ class Profile
         return $this->firstname;
     }
 
+    public function firstNames()
+    {
+        return $this->nameVariants(self::FIRSTNAME);
+    }
+
     public function lastName()
     {
         return $this->lastname;
     }
 
+    public function lastNames()
+    {
+        return $this->nameVariants(self::LASTNAME);
+    }
+
     public function isFemale()
     {
         return $this->sex == PlUser::GENDER_FEMALE;
@@ -135,6 +172,19 @@ class Profile
         return $this->data;
     }
 
+    private function nameVariants($type)
+    {
+        $vals = array($this->$type);
+        foreach (self::$name_variants[$type] as $var) {
+            $vartype = $type . '_' . $var;
+            $varname = $this->$vartype;
+            if ($varname != null && $varname != "") {
+                $vals[] = $varname;
+            }
+        }
+        return array_unique($vals);
+    }
+
     public function __get($name)
     {
         if (property_exists($this, $name)) {
@@ -161,12 +211,38 @@ class Profile
             Platal::page()->kill("Visibility invalide: " . $visibility);
         }
         $this->visibility = self::$v_values[$visibility];
-        if ($this->mobile && !in_array($this->modbile_pub, $this->visibility)) {
+        if ($this->mobile && !in_array($this->mobile_pub, $this->visibility)) {
             unset($this->data['mobile']);
         }
     }
 
 
+    /* Photo
+     */
+    public function getPhoto($fallback = true)
+    {
+        /* TODO: migrate photo table to profile_photo, change uid to pid
+         */
+        $cond = '';
+        if ($this->visibility) {
+            $cond = ' AND pub IN ' . XDB::formatArray($this->visibility);
+        }
+        $res = XDB::query('SELECT  *
+                             FROM  photo
+                            WHERE  attachmime IN (\'jpeg\', \'png\')
+                                   ' . $cond . ' AND  uid = {?}',
+                          $this->id());
+        if ($res->numRows() > 0) {
+            $photo = $res->fetchOneAssoc();
+            return PlImage::fromData($photo['attach'], 'image/' . $photo['attachmime'],
+                                     $photo['x'], $photo['y']);
+        } else if ($fallback) {
+            return PlImage::fromFile(dirname(__FILE__).'/../htdocs/images/none.png',
+                                     'image/png');
+        }
+        return null;
+    }
+
     /* Addresses
      */
     public function getAddresses($flags, $limit = null)
@@ -304,11 +380,10 @@ class Profile
         return XDB::iterator('SELECT  pje.name, pje.acronym, pje.url, pje.email, pje.NAF_code,
                                       pj.description, pj.url AS user_site,
                                       IF (' . $cond . ', pj.email, NULL) AS user_email,
-                                      pjfe.name AS function, pjse.name AS sector,
-                                      pjsse.name AS subsector, pjssse.name AS subsubsector
+                                      pjse.name AS sector, pjsse.name AS subsector,
+                                      pjssse.name AS subsubsector
                                 FROM  profile_job AS pj
                           INNER JOIN  profile_job_enum AS pje ON (pje.id = pj.jobid)
-                           LEFT JOIN  profile_job_function_enum AS pjfe ON (pjfe.id = pj.functionid)
                            LEFT JOIN  profile_job_sector_enum AS pjse ON (pjse.id = pj.sectorid)
                            LEFT JOIN  profile_job_subsector_enum AS pjsse ON (pjsse.id = pj.subsectorid)
                            LEFT JOIN  profile_job_subsubsector_enum AS pjssse ON (pjssse.id = pj.subsubsectorid)
@@ -326,6 +401,15 @@ class Profile
         return $job->next();
     }
 
+    /* Binets
+     */
+    public function getBinets()
+    {
+        return XDB::fetchColumn('SELECT  binet_id
+                                   FROM  binets_ins
+                                  WHERE  user_id = {?}', $this->id());
+    }
+
 
     public function owner()
     {
@@ -339,24 +423,26 @@ class Profile
         }
         return XDB::fetchAllAssoc('SELECT  p.*, p.sex = \'female\' AS sex, pe.entry_year, pe.grad_year,
                                            pn_f.name AS firstname, pn_l.name AS lastname, pn_n.name AS nickname,
-                                           IF(pn_uf.name IS NULL, pn_f.name, pn_uf.name) AS firstname_usual,
-                                           IF(pn_ul.name IS NULL, pn_l.name, pn_ul.name) AS lastname_usual,
+                                           IF(pn_uf.name IS NULL, pn_f.name, pn_uf.name) AS firstname_ordinary,
+                                           IF(pn_ul.name IS NULL, pn_l.name, pn_ul.name) AS lastname_ordinary,
                                            pd.promo AS promo, pd.short_name, pd.directory_name AS full_name,
-                                           pp.display_tel AS mobile, pp.pub AS mobile_pub
+                                           pd.directory_name, pp.display_tel AS mobile, pp.pub AS mobile_pub,
+                                           ph.pub AS photo_pub
                                      FROM  profiles AS p
                                INNER JOIN  profile_display AS pd ON (pd.pid = p.pid)
                                INNER JOIN  profile_education AS pe ON (pe.uid = p.pid AND FIND_IN_SET(\'primary\', pe.flags))
                                INNER JOIN  profile_name AS pn_f ON (pn_f.pid = p.pid
-                                                                    AND pn_f.typeid = ' . self::getNameTypeId('lastname', true) . ')
+                                                                    AND pn_f.typeid = ' . self::getNameTypeId('firstname', true) . ')
                                INNER JOIN  profile_name AS pn_l ON (pn_l.pid = p.pid
-                                                                    AND pn_l.typeid = ' . self::getNameTypeId('firstname', true) . ')
+                                                                    AND pn_l.typeid = ' . self::getNameTypeId('lastname', true) . ')
                                 LEFT JOIN  profile_name AS pn_uf ON (pn_uf.pid = p.pid
-                                                                     AND pn_uf.typeid = ' . self::getNameTypeId('lastname_ordinary', true) . ')
+                                                                     AND pn_uf.typeid = ' . self::getNameTypeId('firstname_ordinary', true) . ')
                                 LEFT JOIN  profile_name AS pn_ul ON (pn_ul.pid = p.pid
-                                                                     AND pn_ul.typeid = ' . self::getNameTypeId('firstname_ordinary', true) . ')
+                                                                     AND pn_ul.typeid = ' . self::getNameTypeId('lastname_ordinary', true) . ')
                                 LEFT JOIN  profile_name AS pn_n ON (pn_n.pid = p.pid 
                                                                     AND pn_n.typeid = ' . self::getNameTypeId('nickname', true) . ')
                                 LEFT JOIN  profile_phones AS pp ON (pp.uid = p.pid AND pp.link_type = \'user\' AND tel_type = \'mobile\')
+                                LEFT JOIN  photo AS ph ON (ph.uid = p.pid)
                                     WHERE  p.pid IN ' . XDB::formatArray($pids) . '
                                  GROUP BY  p.pid');
     }
@@ -433,6 +519,14 @@ class Profile
         return self::getBulkProfilesWithPIDs($table);
     }
 
+    public static function isDisplayName($name)
+    {
+        return $name == self::DN_FULL || $name == self::DN_DISPLAY
+            || $name == self::DN_YOURSELF || $name == self::DN_DIRECTORY
+            || $name == self::DN_PRIVATE || $name == self::DN_PUBLIC
+            || $name == self::DN_SHORT || $name == self::DN_SORT;
+    }
+
     public static function getNameTypeId($type, $for_sql = false)
     {
         if (!S::has('name_types')) {