Automation of the management of associations' mailing lists (Closes #817), Updates...
[platal.git] / include / validations.inc.php
index b3dddb1..9814510 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2006 Polytechnique.org                              *
+ *  Copyright (C) 2003-2008 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -21,6 +21,8 @@
 
 define('SIZE_MAX', 32768);
 
+require_once dirname(__FILE__) . '/../classes/xdb.php';
+
 /**
  * Iterator class, that lists objects through the database
  */
@@ -28,15 +30,15 @@ class ValidateIterator extends XOrgDBIterator
 {
     // {{{ constuctor
 
-    function ValidateIterator ()
+    public function __construct ()
     {
-        parent::XOrgDBIterator('SELECT data,stamp FROM requests ORDER BY stamp', MYSQL_NUM);
+        parent::__construct('SELECT data, DATE_FORMAT(stamp, "%Y%m%d%H%i%s") FROM requests ORDER BY stamp', MYSQL_NUM);
     }
 
     // }}}
     // {{{ function next()
 
-    function next ()
+    public function next ()
     {
         if (list($result, $stamp) = parent::next()) {
             $result = unserialize($result);
@@ -50,112 +52,127 @@ class ValidateIterator extends XOrgDBIterator
     // }}}
 }
 
-/** classe "virtuelle" à dériver pour chaque nouvelle implémentation
+/** classe "virtuelle" à dériver pour chaque nouvelle implémentation
  */
-class Validate
+abstract class Validate
 {
     // {{{ properties
-    
-    var $uid;
-    var $prenom;
-    var $nom;
-    var $promo;
-    var $bestalias;
-    var $forlife;
-
-    var $stamp;
-    var $unique;
+
+    public $uid;
+    public $prenom;
+    public $nom;
+    public $promo;
+    public $sexe;
+    public $bestalias;
+    public $forlife;
+
+    public $stamp;
+    public $unique;
     // enable the refuse button
-    var $refuse = true;
-    var $type;
-    var $comments = Array();
+    public $refuse = true;
+
+    public $type;
+    public $comments = Array();
     // the validations rules : comments for admins
-    var $rules = "Mieux vaut laisser une demande de validation à un autre admin que de valider une requête illégale ou que de refuser une demande légitime";
+    public $rules = "Mieux vaut laisser une demande de validation à un autre admin que de valider une requête illégale ou que de refuser une demande légitime";
 
     // }}}
     // {{{ constructor
-    
+
     /** constructeur
      * @param       $_uid       user id
-     * @param       $_unique    requête pouvant être multiple ou non
-     * @param       $_type      type de la donnée comme dans le champ type de x4dat.requests
+     * @param       $_unique    requête pouvant être multiple ou non
+     * @param       $_type      type de la donnée comme dans le champ type de x4dat.requests
      */
-    function Validate($_uid, $_unique, $_type)
+    public function __construct($_uid, $_unique, $_type)
     {
         $this->uid    = $_uid;
         $this->stamp  = date('YmdHis');
         $this->unique = $_unique;
         $this->type   = $_type;
         $res = XDB::query(
-                "SELECT  u.prenom, u.nom, u.promo, a.alias, b.alias
+                "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();
     }
-    
+
     // }}}
     // {{{ function submit()
 
-    /** fonction à utiliser pour envoyer les données à la modération
+    /** fonction à utiliser pour envoyer les données à la modération
      * cette fonction supprimme les doublons sur un couple ($user,$type) si $this->unique est vrai
      */
-    function submit ()
+    public function submit()
     {
         if ($this->unique) {
             XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}', $this->uid, $this->type);
         }
-       
+
         $this->stamp = date('YmdHis');
         XDB::execute('INSERT INTO requests (user_id, type, data, stamp) VALUES ({?}, {?}, {?}, {?})',
                 $this->uid, $this->type, $this, $this->stamp);
 
+        global $globals;
+        update_NbValid();
         return true;
     }
 
     // }}}
     // {{{ function update()
 
-    function update ()
+    protected function update()
     {
         XDB::execute('UPDATE requests SET data={?}, stamp=stamp
-                                 WHERE user_id={?} AND type={?} AND stamp={?}',
-                                 $this, $this->uid, $this->type, $this->stamp);
-
+                       WHERE user_id={?} AND type={?} AND stamp={?}',
+                     $this, $this->uid, $this->type, $this->stamp);
         return true;
     }
 
     // }}}
     // {{{ function clean()
-    
-    /** fonction à utiliser pour nettoyer l'entrée de la requête dans la table requests
-     * attention, tout est supprimé si c'est un unique
+
+    /** fonction à utiliser pour nettoyer l'entrée de la requête dans la table requests
+     * attention, tout est supprimé si c'est un unique
      */
-    function clean ()
+    public function clean()
     {
         if ($this->unique) {
-            return XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}',
-                    $this->uid, $this->type);
+            $success = XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?}',
+                                    $this->uid, $this->type);
         } else {
-            return XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?} AND stamp={?}',
-                    $this->uid, $this->type, $this->stamp);
+            $success =  XDB::execute('DELETE FROM requests WHERE user_id={?} AND type={?} AND stamp={?}',
+                                      $this->uid, $this->type, $this->stamp);
         }
+        update_NbValid();
+        return $success;
     }
 
     // }}}
     // {{{ function handle_formu()
-    
-    /** fonction à réaliser en cas de valistion du formulaire
+
+    /** fonction à réaliser en cas de validation du formulaire
      */
-    function handle_formu()
+    public function handle_formu()
     {
         if (Env::has('delete')) {
             $this->clean();
-            $this->trig('requete supprimée');
+            $this->trigSuccess('Requête supprimée');
             return true;
         }
 
+        // mise à jour des informations
+        if (Env::has('edit')) {
+            if ($this->handle_editor()) {
+                $this->update();
+                $this->trigSuccess('Requête mise à jour');
+                return true;
+            }
+            return false;
+        }
+
         // ajout d'un commentaire
         if (Env::has('hold') && Env::has('comm')) {
             $formid = Env::i('formid');
@@ -164,18 +181,20 @@ class Validate
                     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
+            // 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@staff.polytechnique.org");
+            $mailer->addTo($globals->core->admin_email);
 
             $body = "Validation {$this->type} pour {$this->prenom} {$this->nom}\n\n"
-              . S::v('bestalias')." a ajouté le commentaire :\n\n" 
+              . S::v('bestalias')." a ajouté le commentaire :\n\n"
               . Env::v('comm')."\n\n"
               . "cf la discussion sur : ".$globals->baseurl."/admin/validate";
 
@@ -183,7 +202,7 @@ class Validate
             $mailer->send();
 
             $this->update();
-            $this->trig('commentaire ajouté');
+            $this->trigSuccess('Commentaire ajouté');
             return true;
         }
 
@@ -191,10 +210,10 @@ class Validate
             if ($this->commit()) {
                 $this->sendmail(true);
                 $this->clean();
-                $this->trig('mail envoyé');
+                $this->trigSuccess('Mail de validation envoyé');
                 return true;
             } else {
-                $this->trig('erreur lors de la validation');
+                $this->trigError('Erreur lors de la validation');
                 return false;
             }
         }
@@ -203,10 +222,10 @@ class Validate
             if (Env::v('comm')) {
                 $this->sendmail(false);
                 $this->clean();
-                $this->trig('mail envoyé');
+                $this->trigSuccess('Mail de refus envoyé');
                 return true;
             } else {
-                $this->trig('pas de motivation pour le refus !!!');
+                $this->trigError('pas de motivation pour le refus !!!');
             }
         }
 
@@ -216,20 +235,19 @@ class Validate
     // }}}
     // {{{ function sendmail
 
-    function sendmail($isok)
+    protected 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::v('comm') : '')
-              . "\n\nCordialement,\nL'équipe Polytechnique.org\n";
+              . "\n\nCordialement,\n\n-- \nL'équipe de Polytechnique.org\n";
 
         $mailer->setTxtBody(wordwrap($body));
         $mailer->send();
@@ -237,29 +255,42 @@ class Validate
 
     // }}}
     // {{{ function trig()
-    
-    function trig($msg) {
+
+    protected function trigError($msg)
+    {
+        global $page;
+        $page->trigError($msg);
+    }
+
+    protected function trigWarning($msg)
+    {
+        global $page;
+        $page->trigWarning($msg);
+    }
+
+    protected function trigSuccess($msg)
+    {
         global $page;
-        $page->trig($msg);
+        $page->trigSuccess($msg);
     }
-    
+
     // }}}
-    // {{{ 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é
-     * @param   $type   le type de la requête
-     * @param   $stamp  le timestamp de la requête
+    /** fonction statique qui renvoie la requête de l'utilisateur d'id $uidau timestamp $t
+     * @param   $uid    l'id de l'utilisateur concerné
+     * @param   $type   le type de la requête
+     * @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 public function get_typed_request($uid, $type, $stamp = -1)
     {
         if ($stamp == -1) {
             $res = XDB::query('SELECT data FROM requests WHERE user_id={?} and type={?}', $uid, $type);
         } else {
-            $res = XDB::query("SELECT data, stamp FROM requests WHERE user_id={?} AND type={?} and stamp={?}", $uid, $type, $stamp);
+            $res = XDB::query('SELECT data, DATE_FORMAT(stamp, "%Y%m%d%H%i%s") FROM requests WHERE user_id={?} AND type={?} and stamp={?}', $uid, $type, $stamp);
         }
         if ($result = $res->fetchOneCell()) {
             $result = unserialize($result);
@@ -270,40 +301,78 @@ class Validate
     }
 
     // }}}
-    // {{{ function _mail_body
+    // {{{ function get_request_by_id()
 
-    function _mail_body($isok)
+    static public function get_request_by_id($id)
     {
+        list($uid, $type, $stamp) = explode('_', $id, 3);
+        return Validate::get_typed_request($uid, $type, $stamp);
     }
-    
+
     // }}}
-    // {{{ function _mail_subj
+    // {{{ function get_typed_requests()
+
+    /** same as get_typed_request() but return an array of objects
+     */
+    static public 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 get_typed_requests_count()
 
-    function _mail_subj()
+    /** same as get_typed_requests() but return the count of available requests.
+     */
+    static public function get_typed_requests_count($uid, $type)
     {
+        $res = XDB::query('SELECT COUNT(data) FROM requests WHERE user_id={?} and type={?}', $uid, $type);
+        return $res->fetchOneCell();
     }
-    
+
+    // }}}
+    // {{{ function _mail_body
+
+    abstract protected function _mail_body($isok);
+
+    // }}}
+    // {{{ function _mail_subj
+
+    abstract protected function _mail_subj();
+
     // }}}
     // {{{ function commit()
-    
-    /** fonction à utiliser pour insérer les données dans x4dat
-     * XXX la fonction est "virtuelle" XXX
+
+    /** fonction à utiliser pour insérer les données dans x4dat
      */
-    function commit ()
-    { }
+    abstract public function commit();
 
     // }}}
     // {{{ function formu()
-    
+
     /** nom du template qui contient le formulaire */
-    function formu()
-    { return null; }
+    abstract public function formu();
+
+    // }}}
+    // {{{ function editor()
+
+    /** nom du formulaire d'édition */
+    public function editor()
+    {
+        return null;
+    }
 
     // }}}
     // {{{ function answers()
 
     /** automatic answers table for this type of validation */
-    function answers() {
+    public 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);
@@ -313,11 +382,27 @@ class Validate
     }
 
     // }}}
+    // {{{ function id()
+
+    public function id()
+    {
+        return $this->uid . '_' . $this->type . '_' . $this->stamp;
+    }
+
+    // }}}
+    // {{{ function ruleText()
+
+    public function ruleText()
+    {
+        return str_replace('\'', '\\\'', $this->rules);
+    }
+
+    // }}}
 }
 
 foreach (glob(dirname(__FILE__).'/validations/*.inc.php') as $file) {
     require_once($file);
 }
 
-/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker: */
+/* vim: set expandtab shiftwidth=4 tabstop=4 softtabstop=4 foldmethod=marker enc=utf-8: */
 ?>