Fix PTA webservice: visibility, friends, address, phone, job, diploma.
authorRaphaël Barrois <raphael.barrois@polytechnique.org>
Sun, 31 Jul 2011 21:02:00 +0000 (23:02 +0200)
committerRaphaël Barrois <raphael.barrois@polytechnique.org>
Tue, 9 Aug 2011 22:45:49 +0000 (00:45 +0200)
Signed-off-by: Raphaël Barrois <raphael.barrois@polytechnique.org>
classes/profile.php
classes/userfilter.php
classes/userfilter/conditions.inc.php
include/profilefields.inc.php
modules/ptawebservice/request.inc.php

index e9ff7b5..eb9839d 100644 (file)
@@ -1000,7 +1000,7 @@ class Profile implements PlExportable
                                      pd.yourself, pd.promo, pd.short_name, pd.public_name AS full_name,
                                      pd.directory_name, pd.public_name, pd.private_name,
                                      IF (pp.pub >= {?}, pp.display_tel, NULL) AS mobile,
-                                     (ph.pub >= {?} AND ph.attach IS NOT NULL) AS has_photo,
+                                     (ph.pub >= {?} AND ph.attach IS NOT NULL) AS has_photo, ph.pub as photo_pub,
                                      ph.x AS photo_width, ph.y AS photo_height,
                                      p.last_change < DATE_SUB(NOW(), INTERVAL 365 DAY) AS is_old,
                                      pm.expertise AS mentor_expertise,
index c46db70..236721d 100644 (file)
@@ -155,7 +155,7 @@ class UserFilter extends PlFilter
             // The $sub.display_levels cell will contain allowed display levels
             // for an access level of $this->visibility_field.
             $sub = $this->addVisibilityFieldFilter($this->visibility_field);
-            return XDB::format('FIND_IN_SET({?}, ' . $sub . '.display_levels', $level);
+            return XDB::format('FIND_IN_SET({?}, ' . $sub . '.display_levels)', $level);
         } else {
             if ($this->visibility->isVisible($level)) {
                 return 'TRUE';
@@ -643,36 +643,6 @@ class UserFilter extends PlFilter
         return $joins;
     }
 
-    /** VISIBILITY
-     */
-    private $vlevels = array();
-    private $vfields = array();
-    public function addVisibilityAbsoluteFilter($level)
-    {
-        $sub = 'pvel_' . $level;
-        $this->vlevels[$level] = $sub;
-        return $sub;
-    }
-
-    public function addVisibilityFieldFilter($field)
-    {
-        $sub = 'pvef_' . self::getDBSuffix($field);
-        $this->vfields[$field] = $sub;
-        return $sub;
-    }
-
-    protected function visibilityJoins()
-    {
-        $joins = array();
-        foreach ($this->vlevels as $level => $sub) {
-            $joins[$sub] = PlSqlJoin::inner('profile_visibility_enum', '$ME.access_level = {?}', $level);
-        }
-        foreach ($this->vfields as $field => $sub) {
-            $joins[$sub] = PlSqlJoin::inner('profile_visibility_enum', '$ME.access_level = ' . $field);
-        }
-        return $joins;
-    }
-
     /** PERMISSIONS
      */
     private $at = false;
@@ -1441,6 +1411,36 @@ class UserFilter extends PlFilter
         $sub = $this->addPartnerSharingFilter($partner_id);
         $this->visibility_field = $sub . '.sharing_level';
     }
+    /** VISIBILITY
+     */
+    private $vlevels = array();
+    private $vfields = array();
+    public function addVisibilityAbsoluteFilter($level)
+    {
+        $sub = 'pvel_' . $level;
+        $this->vlevels[$level] = $sub;
+        return $sub;
+    }
+
+    public function addVisibilityFieldFilter($field)
+    {
+        $sub = 'pvef_' . self::getDBSuffix($field);
+        $this->vfields[$field] = $sub;
+        return $sub;
+    }
+
+    protected function visibilityJoins()
+    {
+        $joins = array();
+        foreach ($this->vlevels as $level => $sub) {
+            $joins[$sub] = PlSqlJoin::inner('profile_visibility_enum', '$ME.access_level = {?}', $level);
+        }
+        foreach ($this->vfields as $field => $sub) {
+            $joins[$sub] = PlSqlJoin::inner('profile_visibility_enum', '$ME.access_level = ' . $field);
+        }
+        return $joins;
+    }
+
 }
 // }}}
 // {{{ class ProfileFilter
index bf060ca..cb8f5de 100644 (file)
@@ -1623,16 +1623,16 @@ class UFC_PartnerSharing extends UserFilterCondition
 {
     const PTA = 'pta';
 
-    private $partner;
+    private $partner_id;
 
-    public function __construct($partner)
+    public function __construct($partner_id)
     {
-        $this->partner = $partner;
+        $this->partner_id = $partner_id;
     }
 
     public function buildCondition(PlFilter $uf)
     {
-        $sub = $uf->addPartnerSharingFilter($this->partner);
+        $sub = $uf->addPartnerSharingFilter($this->partner_id);
         return XDB::format("$sub.exposed_uid IS NOT NULL");
     }
 }
@@ -1643,16 +1643,16 @@ class UFC_PartnerSharing extends UserFilterCondition
  */
 class UFC_PartnerSharingEmail extends UserFilterCondition
 {
-    private $partner;
+    private $partner_id;
 
-    public function __construct($partner)
+    public function __construct($partner_id)
     {
-        $this->partner = $partner;
+        $this->partner_id = $partner_id;
     }
 
     public function buildCondition(PlFilter $uf)
     {
-        $sub = $uf->addPartnerSharingFilter($this->partner);
+        $sub = $uf->addPartnerSharingFilter($this->partner_id);
         return XDB::format("$sub.allow_email IN ('digest', 'direct')");
     }
 }
@@ -1662,12 +1662,12 @@ class UFC_PartnerSharingEmail extends UserFilterCondition
  */
 class UFC_PartnerSharingID extends UserFilterCondition
 {
-    private $partner;
+    private $partner_id;
     private $ids;
 
-    public function __construct($partner)
+    public function __construct($partner_id)
     {
-        $this->partner = $partner;
+        $this->partner_id = $partner_id;
         $ids = func_get_args();
         array_shift($ids);
         $this->ids   = pl_flatten($ids);
@@ -1677,7 +1677,7 @@ class UFC_PartnerSharingID extends UserFilterCondition
     {
         $uf->requireProfiles();
         $ids = $this->ids;
-        $sub = $uf->addPartnerSharingFilter($this->partner);
+        $sub = $uf->addPartnerSharingFilter($this->partner_id);
         return XDB::format("$sub.exposed_uid IN {?}", $ids);
     }
 }
index 9500224..c1dd074 100644 (file)
@@ -193,6 +193,9 @@ class Job
     public $user_site;
     public $user_email;
 
+    public $pub;
+    public $email_pub;
+
     /** Fields are:
      * pid, id, company_id, description, url, email
      */
@@ -611,8 +614,7 @@ class ProfileJobs extends ProfileField
     public static function fetchData(array $pids, Visibility $visibility)
     {
         CompanyList::preload($pids);
-        $data = XDB::iterator('SELECT  id, pid, description, url as user_site, jobid,
-                                       IF(pve.best_display_level + 0 <= email_pub + 0, email, NULL) AS user_email
+        $data = XDB::iterator('SELECT  id, pid, description, url as user_site, jobid, pub,                                       IF(pve.best_display_level + 0 <= email_pub + 0, email, NULL) AS user_email, email_pub
                                  FROM  profile_job
                             LEFT JOIN  profile_visibility_enum AS pve ON (pve.access_level = {?})
                                 WHERE  pid IN {?} AND pve.best_display_level + 0 <= pub + 0
index a6c9d3a..44ef174 100644 (file)
@@ -85,7 +85,7 @@ class WSDirectoryRequest
         $profiles = array();
         if ($matches) {
             // TODO : improve fetching by passing an adequate FETCH field
-            $iter = $pf->iterProfiles(new PlLimit($this->amount), 0x0000, Visibility::VIEW_PRIVATE);
+            $iter = $pf->iterProfiles(new PlLimit($this->amount), 0x0000, Visibility::get(Visibility::VIEW_PRIVATE));
             while ($profile = $iter->next()) {
                 if ($profile->getPartnerSettings($this->partner->id)->exposed_uid !== 0) {
                     $profile_data = new WSRequestEntry($this->partner, $profile);
@@ -411,7 +411,7 @@ class WSRequestEntry
                 return null;
             }
         case WSRequestFields::MOBILE_PHONE:
-            $phones = $p->getPhones(Phone::TYPE_MOBILE);
+            $phones = $p->getPhones(Profile::PHONE_TYPE_MOBILE | Profile::PHONE_LINK_PROFILE);
             if (count($phones)) {
                 $phone = array_pop($phones);
                 if ($this->isVisible($phone->pub)) {
@@ -428,7 +428,7 @@ class WSRequestEntry
                                     WHERE  pid = {?}', $p->pid);
                 XDB::execute('INSERT INTO  profile_photo_tokens
                                       SET  pid = {?}, token = {?},
-                                           expires = ADDTIME(NOW(), \'0:05:00\'',
+                                           expires = ADDTIME(NOW(), \'0:05:00\')',
                                            $p->pid, $token);
                 $size_mappings = array(
                     WSRequestFields::PIC_SMALL => 'small',
@@ -445,14 +445,14 @@ class WSRequestEntry
         case WSRequestFields::CURRENT_CITY:
             $address = $p->getMainAddress();
             if ($address != null && $this->isVisible($address->pub)) {
-                return $address->localityName;
+                return $address->locality;
             } else {
                 return null;
             }
         case WSRequestFields::CURRENT_COUNTRY:
             $address = $p->getMainAddress();
             if ($address != null && $this->isVisible($address->pub)) {
-                return $address->countryId;
+                return $address->country;
             } else {
                 return null;
             }
@@ -477,10 +477,10 @@ class WSRequestEntry
             $res = array();
             foreach ($jobs as $job) {
                 if ($this->isVisible($job->pub)) {
-                    $jobs[] = $this->jobToResponse($job);
+                    $res[] = $this->jobToResponse($job);
                 }
             }
-            return $jobs;
+            return $res;
         case WSRequestFields::MINI_RESUME:
             if ($this->isVisible(Visibility::EXPORT_PRIVATE)) {
                 return $p->cv;
@@ -500,8 +500,13 @@ class WSRequestEntry
         case WSRequestFields::FRIENDS:
             $friends = array();
             if ($this->isVisible(Visibility::EXPORT_PRIVATE)) {
-                while ($contact = $p->owner()->iterContacts()) {
-                    $cps = $contact->getPartnerSettings(UFC_PartnerSharing::PTA);
+                $contacts = $p->owner()->iterContacts();
+                if ($contacts == null) {
+                    return $friends;
+                }
+
+                while ($contact = $contacts->next()) {
+                    $cps = $contact->getPartnerSettings($this->partner->id);
                     if ($cps->sharing_visibility->isVisible(Visibility::EXPORT_PRIVATE)) {
                         $friends[] = $cps->exposed_uid;
                     }
@@ -550,8 +555,8 @@ class WSRequestEntry
         $data = array();
         $data['street'] = $address->postalText;
         $data['zipcode'] = $address->postalCode;
-        $data['city'] = $address->localityName;
-        $data['country'] = $address->countryId;
+        $data['city'] = $address->locality;
+        $data['country'] = $address->country;
         $data['latitude'] = $address->latitude;
         $data['longitude'] = $address->longitude;
         return $data;
@@ -697,6 +702,10 @@ class WSRequestFields
     const GENDER_MAN = 'man';
     const GENDER_WOMAN = 'woman';
 
+    const DIPLOMA_ING = 'engineer';
+    const DIPLOMA_MASTER = 'master';
+    const DIPLOMA_PHD = 'phd';
+
     public static $CHOICES = array(
         self::UID,
         self::FIRSTNAME,