<?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 *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
***************************************************************************/
-// {{{ DEFINES
-
define('SIZE_MAX', 32768);
-// }}}
-// {{{ class ValidateIterator
+global $globals;
+require_once $globals->spoolroot . '/core/classes/xdb.php';
/**
* Iterator class, that lists objects through the database
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);
// }}}
}
-// }}}
-// {{{ class Validate
-
-/** 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 $user;
+
+ 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 $_user user object
+ * @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(User &$_user, $_unique, $_type)
{
- global $globals;
- $this->uid = $_uid;
+ $this->user = &$_user;
$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
- 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();
}
-
+
// }}}
// {{{ 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()
{
- 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->user->id(), $this->type);
}
-
+
$this->stamp = date('YmdHis');
- $globals->xdb->execute('INSERT INTO requests (user_id, type, data, stamp) VALUES ({?}, {?}, {?}, {?})',
- $this->uid, $this->type, $this, $this->stamp);
+ XDB::execute('INSERT INTO requests (user_id, type, data, stamp) VALUES ({?}, {?}, {?}, {?})',
+ $this->user->id(), $this->type, $this, $this->stamp);
+ global $globals;
+ $globals->updateNbValid();
return true;
}
// }}}
// {{{ function update()
- function update ()
+ protected function update()
{
- global $globals;
- $globals->xdb->execute('UPDATE requests SET data={?}, stamp=stamp
- WHERE user_id={?} AND type={?} AND stamp={?}',
- $this, $this->uid, $this->type, $this->stamp);
-
+ XDB::execute('UPDATE requests SET data={?}, stamp=stamp
+ WHERE user_id={?} AND type={?} AND stamp={?}',
+ $this, $this->user->id(), $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()
{
global $globals;
+
if ($this->unique) {
- return $globals->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->user->id(), $this->type);
} else {
- return $globals->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->user->id(), $this->type, $this->stamp);
}
+ $globals->updateNbValid();
+ 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')) {
- $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::user()->login(), 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@{$globals->mail->domain}");
+ $mailer->addTo($globals->core->admin_email);
- $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";
+ $body = "Validation {$this->type} pour {$this->user->id()}\n\n"
+ . S::user()->login() . " 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();
$this->update();
- $this->trig('commentaire ajouté');
+ $this->trigSuccess('Commentaire ajouté');
return true;
}
if ($this->commit()) {
$this->sendmail(true);
$this->clean();
- $this->trig('mail envoyé');
+ $this->trigSuccess('Email de validation envoyé');
return true;
} else {
- $this->trig('erreur lors de la validation');
+ $this->trigError('Erreur lors de la validation');
return false;
}
}
if (Env::has('refuse')) {
- if (Env::get('comm')) {
+ if (Env::v('comm')) {
$this->sendmail(false);
$this->clean();
- $this->trig('mail envoyé');
+ $this->trigSuccess('Email de refus envoyé');
return true;
} else {
- $this->trig('pas de motivation pour le refus !!!');
+ $this->trigError('pas de motivation pour le refus !!!');
}
}
// }}}
// {{{ 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->addTo("\"{$this->user->fullName()}\" <{$this->user->bestEmail()}>");
$mailer->addCc("validation+{$this->type}@{$globals->mail->domain}");
- $body = "Cher(e) camarade,\n\n"
+ $body = ($this->user->isFemale() ? "Chère camarade,\n\n" : "Cher camarade,\n\n")
. $this->_mail_body($isok)
- . (Env::has('comm') ? "\n\n".Env::get('comm') : '')
- . "\n\nCordialement,\nL'équipe Polytechnique.org\n";
+ . (Env::has('comm') ? "\n\n".Env::v('comm') : '')
+ . "\n\nCordialement,\n\n-- \nL'équipe de Polytechnique.org\n";
$mailer->setTxtBody(wordwrap($body));
$mailer->send();
// }}}
// {{{ function trig()
-
- function trig($msg) {
- global $page;
- $page->trig($msg);
+
+ protected function trigError($msg)
+ {
+ Platal::page()->trigError($msg);
+ }
+
+ protected function trigWarning($msg)
+ {
+ Platal::page()->trigWarning($msg);
+ }
+
+ protected function trigSuccess($msg)
+ {
+ Platal::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)
{
- 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, 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);
}
// }}}
- // {{{ 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()
- function _mail_subj()
+ /** 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()
+
+ /** 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()
-// }}}
-// {{{ IMPLEMENTATIONS
+ /** nom du formulaire d'édition */
+ public function editor()
+ {
+ return null;
+ }
+
+ // }}}
+ // {{{ function answers()
+
+ /** automatic answers table for this type of validation */
+ 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);
+ $answers_table[$this->type] = $r->fetchAllAssoc($r);
+ }
+ return $answers_table[$this->type];
+ }
+
+ // }}}
+ // {{{ function id()
+
+ public function id()
+ {
+ return $this->user->id() . '_' . $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: */
?>