Only uses autoload to require validation classes.
[platal.git] / classes / group.php
index 62236db..e3f3b62 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   *
@@ -25,9 +25,6 @@ class Group
     public $shortname;
     private $data = array();
 
-    private $members = null;
-    private $admins  = null;
-
     private function __construct(array $data)
     {
         foreach ($data as $key=>$value) {
@@ -55,63 +52,67 @@ class Group
         return property_exists($this, $name) || isset($this->data[$name]);
     }
 
-    public function getMemberUIDs()
+    private function getUF($admin = false, $extra_cond = null, $sort = null)
     {
-        if (is_null($this->members)) {
-            $this->members = XDB::fetchColumn('SELECT  uid
-                                                 FROM  groupex.membres
-                                                WHERE  asso_id = {?}', $this->id);
+        $cond = new UFC_Group($this->id, $admin);
+        if (!is_null($extra_cond)) {
+            $cond = new PFC_And($cond, $extra_cond);
         }
-        return $this->members;
+        return new UserFilter($cond, $sort);
     }
 
-    public function getMembers($sortby = null, $count = null, $offset = null)
+    public function getMembersFilter($extra_cond = null, $sort = null)
     {
-        return User::getBuildUsersWithUIDs($this->getMemberUIDs(), $sortby, $count, $offset);
+        return $this->getUF(false, $extra_cond, $sort);
     }
 
-    public function getMemberCount()
+    public function getAdminsFilter($extra_cond = null, $sort = null)
     {
-        return count($this->getMemberUIDs());
+        return $this->getUF(true, $extra_cond, $sort);
     }
 
-    public function getAdminUIDs()
+    public function iterMembers($extra_cond = null, $sort = null, $limit = null)
     {
-        if (is_null($this->admins)) {
-            $this->admins = XDB::fetchColumn('SELECT  uid
-                                                FROM  groupex.membres
-                                               WHERE  asso_id = {?} AND perms = \'admin\'', $this->id);
-        }
-        return $this->admins;
+        $uf = $this->getMembersFilter($extra_cond, $sort);
+        return $uf->iterUsers($limit);
     }
 
-    public function getAdmins($sortby = null, $count = null, $offset = null)
+    public function iterAdmins($extra_cond = null, $sort = null, $limit = null)
     {
-        return User::getBuildUsersWithUIDs($this->getAdminUIDs(), $sortby, $count, $offset);
+        $uf = $this->getAdminsFilter($extra_cond, $sort);
+        return $uf->iterUsers($limit);
     }
 
-    public function getAdminCount()
+    public function getLogo($fallback = true)
     {
-        return count($this->getAdminUIDs());
+        if (!empty($this->logo)) {
+            return PlImage::fromData($this->logo, $this->logo_mime);
+        } else if ($fallback) {
+            return PlImage::fromFile(dirname(__FILE__).'/../htdocs/images/dflt_carre.jpg', 'image/jpeg');
+        }
+        return null;
     }
 
-    static public function get($id)
+    static public function get($id, $can_be_shortname = true)
     {
         if (!$id) {
             return null;
         }
-        if (ctype_digit($id)) {
-            $where = XDB::format('id = {?}', $id);
+        if (!$can_be_shortname) {
+            $where = XDB::format('a.id = {?}', $id);
         } else {
-            $where = XDB::format('diminutif = {?}', $id);
+            $where = XDB::format('a.diminutif = {?}', $id);
         }
         $res = XDB::query('SELECT  a.*, d.nom AS domnom,
                                    FIND_IN_SET(\'wiki_desc\', a.flags) AS wiki_desc,
                                    FIND_IN_SET(\'notif_unsub\', a.flags) AS notif_unsub
-                             FROM  groupex.asso AS a
-                        LEFT JOIN  groupex.dom  AS d ON d.id = a.dom
+                             FROM  groups AS a
+                        LEFT JOIN  group_dom  AS d ON d.id = a.dom
                             WHERE  ' . $where);
         if ($res->numRows() != 1) {
+            if ($can_be_shortname && (is_int($id) || ctype_digit($id))) {
+                return Group::get($id, false);
+            }
             return null;
         }
         return new Group($res->fetchOneAssoc());