Moving to GitHub.
[platal.git] / classes / userfilter.php
index 2314915..dffa8a7 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2011 Polytechnique.org                              *
+ *  Copyright (C) 2003-2014 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -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;
@@ -1407,6 +1377,77 @@ class UserFilter extends PlFilter
             return array();
         }
     }
+
+
+    /** PARTNER SHARING
+     */
+
+    // Lists partner shortnames in use, as a $partner_shortname => true map.
+    private $ppss = array();
+
+    /** Add a filter on user having settings for a given partner.
+     * @param $partner_id the ID of the partner
+     * @return the name of the table to use in joins (e.g ppss_$partner_id).
+     */
+    public function addPartnerSharingFilter($partner_id)
+    {
+        $this->requireProfiles();
+        $sub = "ppss_" . $partner_id;
+        $this->ppss[$sub] = $partner_id;
+        return $sub;
+    }
+
+    protected function partnerSharingJoins()
+    {
+        $joins = array();
+        foreach ($this->ppss as $sub => $partner_id) {
+            $joins[$sub] = PlSqlJoin::left('profile_partnersharing_settings', '$ME.pid = $PID AND $ME.partner_id = {?} AND $ME.sharing_level != \'none\'', $partner_id);
+        }
+        return $joins;
+    }
+
+    public function restrictVisibilityForPartner($partner_id)
+    {
+        $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;
+    }
+
+    /** Since this method might perform inner joins on tables which have been
+     * joined previously (e.g when using addVisibilityFieldFilter), it has to
+     * come after the Joins() methods for those tables.
+     * This is due to the implementation logic for discovering joins and the
+     * ordering used by PHP introspection.
+     */
+    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
@@ -1439,5 +1480,5 @@ class ProfileFilter extends UserFilter
 }
 // }}}
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>