2006 => 2007 Happy New Year\!
[platal.git] / include / validations.inc.php
index 60cceff..b00fef3 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2006 Polytechnique.org                              *
+ *  Copyright (C) 2003-2007 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-// {{{ DEFINES
-
 define('SIZE_MAX', 32768);
 
-// }}}
-// {{{ class ValidateIterator
+require_once dirname(__FILE__) . '/../classes/xdb.php';
 
 /**
  * Iterator class, that lists objects through the database
@@ -32,10 +29,10 @@ define('SIZE_MAX', 32768);
 class ValidateIterator extends XOrgDBIterator
 {
     // {{{ constuctor
-    
+
     function ValidateIterator ()
     {
-        parent::XOrgDBIterator('SELECT data,stamp FROM requests ORDER BY stamp', MYSQL_NUM);
+        parent::__construct('SELECT data,stamp FROM requests ORDER BY stamp', MYSQL_NUM);
     }
 
     // }}}
@@ -55,9 +52,6 @@ class ValidateIterator extends XOrgDBIterator
     // }}}
 }
 
-// }}}
-// {{{ class Validate
-
 /** classe "virtuelle" à dériver pour chaque nouvelle implémentation
  */
 class Validate
@@ -68,6 +62,7 @@ class Validate
     var $prenom;
     var $nom;
     var $promo;
+    var $sexe;
     var $bestalias;
     var $forlife;
 
@@ -75,6 +70,7 @@ class Validate
     var $unique;
     // enable the refuse button
     var $refuse = true;
+    
     var $type;
     var $comments = Array();
     // the validations rules : comments for admins
@@ -90,18 +86,17 @@ class Validate
      */
     function Validate($_uid, $_unique, $_type)
     {
-        global $globals;
         $this->uid    = $_uid;
         $this->stamp  = date('YmdHis');
         $this->unique = $_unique;
         $this->type   = $_type;
-        $res = $globals->xdb->query(
-                "SELECT  u.prenom, u.nom, u.promo, a.alias, b.alias
+        $res = XDB::query(
+                "SELECT  u.prenom, u.nom, u.promo, FIND_IN_SET('femme', u.flags) AS sexe, a.alias, b.alias
                    FROM  auth_user_md5 AS u
              INNER JOIN  aliases       AS a ON ( u.user_id=a.id AND a.type='a_vie' )
              INNER JOIN  aliases       AS b ON ( u.user_id=b.id AND b.type!='homonyme' AND FIND_IN_SET('bestalias', b.flags) )
                   WHERE  u.user_id={?}", $_uid);
-        list($this->prenom, $this->nom, $this->promo, $this->forlife, $this->bestalias) = $res->fetchOneRow();
+        list($this->prenom, $this->nom, $this->promo, $this->sexe, $this->forlife, $this->bestalias) = $res->fetchOneRow();
     }
     
     // }}}
@@ -112,13 +107,12 @@ class Validate
      */
     function submit ()
     {
-        global $globals;
         if ($this->unique) {
-            $globals->xdb->execute('DELETE FROM requests WHERE user_id={?} AND type={?}', $this->uid, $this->type);
+            XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}', $this->uid, $this->type);
         }
        
         $this->stamp = date('YmdHis');
-        $globals->xdb->execute('INSERT INTO requests (user_id, type, data, stamp) VALUES ({?}, {?}, {?}, {?})',
+        XDB::execute('INSERT INTO requests (user_id, type, data, stamp) VALUES ({?}, {?}, {?}, {?})',
                 $this->uid, $this->type, $this, $this->stamp);
 
         return true;
@@ -129,8 +123,7 @@ class Validate
 
     function update ()
     {
-        global $globals;
-        $globals->xdb->execute('UPDATE requests SET data={?}, stamp=stamp
+        XDB::execute('UPDATE requests SET data={?}, stamp=stamp
                                  WHERE user_id={?} AND type={?} AND stamp={?}',
                                  $this, $this->uid, $this->type, $this->stamp);
 
@@ -145,12 +138,11 @@ class Validate
      */
     function clean ()
     {
-        global $globals;
         if ($this->unique) {
-            return $globals->xdb->execute('DELETE FROM requests WHERE user_id={?} AND type={?}',
+            return XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}',
                     $this->uid, $this->type);
         } else {
-            return $globals->xdb->execute('DELETE FROM requests WHERE user_id={?} AND type={?} AND stamp={?}',
+            return XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?} AND stamp={?}',
                     $this->uid, $this->type, $this->stamp);
         }
     }
@@ -168,22 +160,40 @@ class Validate
             return true;
         }
 
+        // mise à jour des informations
+        if (Env::has('edit')) {
+            if ($this->handle_editor()) {
+                $this->update();
+                $this->trig('requête mise à jour');
+                return true;
+            }
+            return false;
+        }
+
         // ajout d'un commentaire
         if (Env::has('hold') && Env::has('comm')) {
-            $this->comments[] = Array(Session::get('bestalias'), Env::get('comm'));
+            $formid = Env::i('formid');
+            foreach ($this->comments as $comment) {
+                if ($comment[2] === $formid) {
+                    return true;
+                }
+            }
+            if (!strlen(trim(Env::v('comm')))) {
+                return true;
+            }
+            $this->comments[] = Array(S::v('bestalias'), Env::v('comm'), $formid);
 
             // envoi d'un mail à hotliners
             global $globals;
-            require_once('diogenes/diogenes.hermes.inc.php');
-            $mailer = new HermesMailer;
+            $mailer = new PlMailer;
             $mailer->setSubject("Commentaires de validation {$this->type}");
             $mailer->setFrom("validation+{$this->type}@{$globals->mail->domain}");
-            $mailer->addTo("hotliners@{$globals->mail->domain}");
+            $mailer->addTo("hotliners@staff.polytechnique.org");
 
             $body = "Validation {$this->type} pour {$this->prenom} {$this->nom}\n\n"
-              . Session::get('bestalias')." a ajouté le commentaire :\n\n" 
-              . Env::get('comm')."\n\n"
-              . "cf la discussion sur : ".$globals->baseurl."/admin/valider.php";
+              . S::v('bestalias')." a ajouté le commentaire :\n\n" 
+              . Env::v('comm')."\n\n"
+              . "cf la discussion sur : ".$globals->baseurl."/admin/validate";
 
             $mailer->setTxtBody(wordwrap($body));
             $mailer->send();
@@ -206,7 +216,7 @@ class Validate
         }
 
         if (Env::has('refuse')) {
-            if (Env::get('comm')) {
+            if (Env::v('comm')) {
                 $this->sendmail(false);
                 $this->clean();
                 $this->trig('mail envoyé');
@@ -225,16 +235,15 @@ class Validate
     function sendmail($isok)
     {
         global $globals;
-        require_once('diogenes/diogenes.hermes.inc.php');
-        $mailer = new HermesMailer;
+        $mailer = new PlMailer();
         $mailer->setSubject($this->_mail_subj());
         $mailer->setFrom("validation+{$this->type}@{$globals->mail->domain}");
         $mailer->addTo("\"{$this->prenom} {$this->nom}\" <{$this->bestalias}@{$globals->mail->domain}>");
         $mailer->addCc("validation+{$this->type}@{$globals->mail->domain}");
 
-        $body = "Cher(e) camarade,\n\n"
+        $body = ($this->sexe ? "Chère camarade,\n\n" : "Cher camarade,\n\n")
               . $this->_mail_body($isok)
-              . (Env::has('comm') ? "\n\n".Env::get('comm') : '')
+              . (Env::has('comm') ? "\n\n".Env::v('comm') : '')
               . "\n\nCordialement,\nL'équipe Polytechnique.org\n";
 
         $mailer->setTxtBody(wordwrap($body));
@@ -250,7 +259,7 @@ class Validate
     }
     
     // }}}
-    // {{{ function get_request()
+    // {{{ function get_typed_request()
 
     /** fonction statique qui renvoie la requête de l'utilisateur d'id $uidau timestamp $t
      * @param   $uid    l'id de l'utilisateur concerné
@@ -258,15 +267,14 @@ class Validate
      * @param   $stamp  le timestamp de la requête
      *
      * XXX fonction "statique" XXX
-     * à utiliser uniquement pour récupérer un objet dans la BD avec Validate::get_request(...)
+     * à utiliser uniquement pour récupérer un objet dans la BD avec Validate::get_typed_request(...)
      */
-    function get_request($uid, $type, $stamp = -1)
+    static function get_typed_request($uid, $type, $stamp = -1)
     {
-        global $globals;
         if ($stamp == -1) {
-            $res = $globals->xdb->query('SELECT data FROM requests WHERE user_id={?} and type={?}', $uid, $type);
+            $res = XDB::query('SELECT data FROM requests WHERE user_id={?} and type={?}', $uid, $type);
         } else {
-            $res = $globals->xdb->query("SELECT data, stamp FROM requests WHERE user_id={?} AND type={?} and stamp={?}", $uid, $type, $stamp);
+            $res = XDB::query("SELECT data, stamp FROM requests WHERE user_id={?} AND type={?} and stamp={?}", $uid, $type, $stamp);
         }
         if ($result = $res->fetchOneCell()) {
             $result = unserialize($result);
@@ -277,6 +285,21 @@ class Validate
     }
 
     // }}}
+    // {{{ function get_typed_requests()
+
+    /** same as get_typed_request() but return an array of objects
+     */
+    static function get_typed_requests($uid, $type)
+    {
+        $res = XDB::iterRow('SELECT data FROM requests WHERE user_id={?} and type={?}', $uid, $type);
+        $array = array();
+        while (list($data) = $res->next()) {
+            $array[] = unserialize($data);
+        }
+        return $array;
+    }
+
+    // }}}
     // {{{ function _mail_body
 
     function _mail_body($isok)
@@ -307,16 +330,39 @@ class Validate
     { return null; }
 
     // }}}
-}
+    // {{{ function editor()
 
-// }}}
-// {{{ IMPLEMENTATIONS
+    /** nom du formulaire d'édition */
+    function editor()
+    { return null; }
+
+    // }}}
+    // {{{ function answers()
+
+    /** automatic answers table for this type of validation */
+    function answers() {
+        static $answers_table;
+        if (!isset($answers_table[$this->type])) {
+            $r = XDB::query("SELECT id, title, answer FROM requests_answers WHERE category = {?}", $this->type);
+            $answers_table[$this->type] = $r->fetchAllAssoc($r);
+        }
+        return $answers_table[$this->type];
+    }
+
+    // }}}
+    // {{{ function id()
+
+    function id()
+    {
+        return $this->uid . '_' . $this->type . '_' . $this->stamp;
+    }
+
+    // }}}
+}
 
 foreach (glob(dirname(__FILE__).'/validations/*.inc.php') as $file) {
     require_once($file);
 }
 
-// }}}
-
 /* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */
 ?>