X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;ds=sidebyside;f=include%2Fvalidations.inc.php;h=ab91cc5e9ed81964f6a84f439e471da061144efa;hb=5aed580a3a092b460ecfa5ea398c822b9aa904da;hp=863e7f4194b968fec0190bdbca5263b81b8ff1da;hpb=4407871adc4602864b294c50f82d6b89062835d4;p=platal.git diff --git a/include/validations.inc.php b/include/validations.inc.php index 863e7f4..ab91cc5 100644 --- a/include/validations.inc.php +++ b/include/validations.inc.php @@ -1,6 +1,6 @@ spoolroot . '/core/classes/xdb.php'; -/** - * Iterator class, that lists objects through the database - */ -class ValidateIterator extends XOrgDBIterator -{ - // {{{ constuctor - - public function __construct () - { - parent::__construct('SELECT data, DATE_FORMAT(stamp, "%Y%m%d%H%i%s") FROM requests ORDER BY stamp', MYSQL_NUM); - } - - // }}} - // {{{ function next() - - public function next () - { - if (list($result, $stamp) = parent::next()) { - $result = Validate::unserialize($result); - $result->stamp = $stamp; - return($result); - } else { - return null; - } - } - - // }}} -} -/** classe "virtuelle" à dériver pour chaque nouvelle implémentation +/** Virtual class to adapt for every possible implementation. */ abstract class Validate { @@ -63,21 +34,24 @@ abstract class Validate public $stamp; public $unique; - // enable the refuse button + // Enable the refuse button. public $refuse = true; public $type; public $comments = Array(); - // the validations rules : comments for admins - 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"; + // Validations rules: comments for administrators. + public $rules = 'Mieux vaut laisser une demande de validation à un autre administrateur que de valider une requête illégale ou que de refuser une demande légitime.'; + + // Unless differently stated, a validation must be done by a site administrator. + public $requireAdmin = true; // }}} // {{{ constructor - /** constructeur - * @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 + /** Constructor + * @param $_user: user object that required the validation. + * @param $_unique: set to false if a profile can have multiple requests of this type. + * @param $_type: request's type. */ public function __construct(User &$_user, $_unique, $_type) { @@ -91,8 +65,9 @@ abstract class Validate // }}} // {{{ function submit() - /** 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 + /** Sends data to validation. + * It also deletes multiple requests for a couple (profile, type) + * when $this->unique is set to true. */ public function submit() { @@ -105,7 +80,7 @@ abstract class Validate $this->stamp = date('YmdHis'); XDB::execute('INSERT INTO requests (uid, type, data, stamp) VALUES ({?}, {?}, {?}, {?})', - $this->user->id(), $this->type, $this, $this->stamp); + $this->user->id(), $this->type, $this, $this->stamp); global $globals; $globals->updateNbValid(); @@ -127,8 +102,8 @@ abstract class Validate // }}} // {{{ 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 + /** Deletes request from 'requests' table. + * If $this->unique is set, it deletes every requests of this type. */ public function clean() { @@ -150,27 +125,32 @@ abstract class Validate // }}} // {{{ function handle_formu() - /** fonction à réaliser en cas de validation du formulaire + /** Handles form validation. */ public function handle_formu() { + if ($this->requireAdmin && !S::admin()) { + $this->trigError('Vous n\'avez pas les permissions nécessaires pour valider cette demande.'); + return false; + } + if (Env::has('delete')) { $this->clean(); - $this->trigSuccess('Requête supprimée'); + $this->trigSuccess('Requête supprimée.'); return true; } - // mise à jour des informations + // Data updates. if (Env::has('edit')) { if ($this->handle_editor()) { $this->update(); - $this->trigSuccess('Requête mise à jour'); + $this->trigSuccess('Requête mise à jour.'); return true; } return false; } - // ajout d'un commentaire + // Comment addition. if (Env::has('hold') && Env::has('comm')) { $formid = Env::i('formid'); foreach ($this->comments as $comment) { @@ -181,9 +161,9 @@ abstract class Validate if (!strlen(trim(Env::v('comm')))) { return true; } - $this->comments[] = Array(S::user()->login(), Env::v('comm'), $formid); + $this->comments[] = array(S::user()->login(), Env::v('comm'), $formid); - // envoi d'un mail à hotliners + // Sends email to our hotline. global $globals; $mailer = new PlMailer(); $mailer->setSubject("Commentaires de validation {$this->type}"); @@ -199,7 +179,7 @@ abstract class Validate $mailer->send(); $this->update(); - $this->trigSuccess('Commentaire ajouté'); + $this->trigSuccess('Commentaire ajouté.'); return true; } @@ -219,7 +199,7 @@ abstract class Validate if (Env::v('comm')) { $this->sendmail(false); $this->clean(); - $this->trigSuccess('Email de refus envoyé'); + $this->trigSuccess('Email de refus envoyé.'); return true; } else { $this->trigError('Pas de motivation pour le refus !!!'); @@ -272,13 +252,12 @@ abstract class Validate // }}} // {{{ 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 + /** + * @param $pid: profile's pid + * @param $type: request's type + * @param $stamp: request's timestamp * - * XXX fonction "statique" XXX - * à utiliser uniquement pour récupérer un objet dans la BD avec Validate::get_typed_request(...) + * Should only be used to retrieve an object in the databse with Validate::get_typed_request(...) */ static public function get_typed_request($uid, $type, $stamp = -1) { @@ -313,7 +292,7 @@ abstract class Validate // }}} // {{{ function get_typed_requests() - /** same as get_typed_request() but return an array of objects + /** Same as get_typed_request() but return an array of objects. */ static public function get_typed_requests($uid, $type) { @@ -331,7 +310,7 @@ abstract class Validate // }}} // {{{ function get_typed_requests_count() - /** same as get_typed_requests() but return the count of available requests. + /** Same as get_typed_requests() but return the count of available requests. */ static public function get_typed_requests_count($uid, $type) { @@ -363,20 +342,20 @@ abstract class Validate // }}} // {{{ function commit() - /** fonction à utiliser pour insérer les données dans x4dat + /** Inserts data in database. */ abstract public function commit(); // }}} // {{{ function formu() - /** nom du template qui contient le formulaire */ + /** Retunrs the name of the form's template. */ abstract public function formu(); // }}} // {{{ function editor() - /** nom du formulaire d'édition */ + /** Returns the name of the edition form's template. */ public function editor() { return null; @@ -385,19 +364,22 @@ abstract class Validate // }}} // {{{ function answers() - /** automatic answers table for this type of validation */ + /** 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); + $r = XDB::query('SELECT id, title, answer + FROM requests_answers + WHERE category = {?}', + $this->type); $answers_table[$this->type] = $r->fetchAllAssoc(); } return $answers_table[$this->type]; } // }}} - // {{{ function id() + // {{{ function id() public function id() { @@ -417,16 +399,47 @@ abstract class Validate public static function unserialize($data) { - $obj = unserialize($data); - /* XXX: Temporary for hruid migration */ - if (!isset($obj->user) || !is_object($obj)) { - $obj->user =& User::get($obj->forlife); - } - /* XXX: End temporary block */ - return $obj; + return unserialize($data); } // }}} + + /** Return an iterator over the validation concerning the given type + * and the given user. + * + * @param type The type of the validations to fetch, null mean "any type" + * @param applyTo A User or a Profile object the validation applies to. + */ + public static function iterate($type = null, $applyTo = null) + { + function toValidation($elt) + { + list($result, $stamp) = $elt; + $result = Validate::unserialize($result); + $result->stamp = $stamp; + return $result; + } + + $where = array(); + if ($type) { + $where[] = XDB::format('type = {?}', $type); + } + if ($applyTo) { + if ($applyTo instanceof User) { + $where[] = XDB::format('uid = {?}', $applyTo->id()); + } else if ($applyTo instanceof Profile) { + $where[] = XDB::format('pid = {?}', $applyTo->id()); + } + } + if (!empty($where)) { + $where = 'WHERE ' . implode('AND', $where); + } + $it = XDB::iterRow('SELECT data, DATE_FORMAT(stamp, "%Y%m%d%H%i%s") + FROM requests + ' . $where . ' + ORDER BY stamp'); + return PlIteratorUtils::map($it, 'toValidation'); + } } /** Virtual class for profile related validation. @@ -438,11 +451,12 @@ abstract class ProfileValidate extends Validate public $profile; public $profileOwner; public $userIsProfileOwner; + public $ownerIsRegistered; // }}} // {{{ constructor - /** constructor + /** Constructor * @param $_user: user object that required the validation. * @param $_profile: profile object that is to be modified, * its owner (if exists) can differ from $_user. @@ -454,11 +468,9 @@ abstract class ProfileValidate extends Validate parent::__construct($_user, $_unique, $_type); $this->profile = &$_profile; $this->profileOwner = $this->profile->owner(); - if (!is_null($this->profileOwner) && $this->profileOwner->id() == $this->user->id()) { - $this->userIsProfileOwner = true; - } else { - $this->userIsProfileOwner = false; - } + $this->userIsProfileOwner = (!is_null($this->profileOwner) + && $this->profileOwner->id() == $this->user->id()); + $this->ownerIsRegistered = $this->profile->isActive(); } // }}} @@ -478,7 +490,7 @@ abstract class ProfileValidate extends Validate $this->stamp = date('YmdHis'); XDB::execute('INSERT INTO requests (uid, pid, type, data, stamp) - VALUES ({?}, {?}, {?}, {?})', + VALUES ({?}, {?}, {?}, {?}, {?})', $this->user->id(), $this->profile->id(), $this->type, $this, $this->stamp); global $globals; @@ -526,24 +538,23 @@ abstract class ProfileValidate extends Validate protected function sendmail($isok) { - global $globals; - $mailer = new PlMailer(); - $mailer->setSubject($this->_mail_subj()); - $mailer->setFrom("validation+{$this->type}@{$globals->mail->domain}"); - $mailer->addTo("\"{$this->profile->fullName()}\" <{$this->profile->bestEmail()}>"); - if (!$this->userIsProfileOwner) { - $mailer->addCc("\"{$this->user->fullName()}\" <{$this->user->bestEmail()}>"); - } - $mailer->addCc("validation+{$this->type}@{$globals->mail->domain}"); - - $body = ($this->profile->isFemale() ? "Chère camarade,\n\n" : "Cher camarade,\n\n") - . $this->_mail_body($isok) - . (Env::has('comm') ? "\n\n" . Env::v('comm') : '') - . "\n\nCordialement,\n-- \nL'équipe de Polytechnique.org\n" - . $this->_mail_ps($isok); + // Only sends email if the profile's owner exists and is registered. + if ($this->ownerIsRegistered) { + global $globals; - $mailer->setTxtBody(wordwrap($body)); - $mailer->send(); + $mailer = new PlMailer(); + $mailer->setSubject($this->_mail_subj()); + $mailer->setFrom("validation+{$this->type}@{$globals->mail->domain}"); + $mailer->addTo("\"{$this->profile->fullName()}\" <{$this->profileOwner->bestEmail()}>"); + $mailer->addCc("validation+{$this->type}@{$globals->mail->domain}"); + $body = ($this->profile->isFemale() ? "Chère camarade,\n\n" : "Cher camarade,\n\n") + . $this->_mail_body($isok) + . (Env::has('comm') ? "\n\n" . Env::v('comm') : '') + . "\n\nCordialement,\n-- \nL'équipe de Polytechnique.org\n" + . $this->_mail_ps($isok); + $mailer->setTxtBody(wordwrap($body)); + $mailer->send(); + } } // }}} @@ -595,7 +606,8 @@ abstract class ProfileValidate extends Validate { $res = XDB::iterRow('SELECT data FROM requests - WHERE pid = {?} and type = {?}', + WHERE pid = {?} and type = {?} + ORDER BY stamp', $pid, $type); $array = array(); while (list($data) = $res->next()) { @@ -619,7 +631,7 @@ abstract class ProfileValidate extends Validate } // }}} - // {{{ function id() + // {{{ function id() public function id() { @@ -627,14 +639,6 @@ abstract class ProfileValidate extends Validate } // }}} - // {{{ function unserialize() - - public static function unserialize($data) - { - return unserialize($data); - } - - // }}} } foreach (glob(dirname(__FILE__) . '/validations/*.inc.php') as $file) {