Fix French typo: s/formatté/formaté/
[platal.git] / modules / survey / survey.inc.php
index c50cc12..784dd89 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2009 Polytechnique.org                              *
+ *  Copyright (C) 2003-2014 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -65,6 +65,7 @@ class Survey
     private $promos;
     private $valid;
     private $questions;
+    private $creator;
 
     public function __construct($args, $id = -1, $valid = false, $questions = null)
     {
@@ -79,12 +80,19 @@ class Survey
         $this->title       = $args['title'];
         $this->description = $args['description'];
         $this->end         = $args['end'];
-        $this->mode    = (isset($args['mode']))? $args['mode'] : self::MODE_ALL;
+        $this->mode        = (isset($args['mode']))? $args['mode'] : self::MODE_ALL;
+        $this->creator     = $args['uid'];
         if ($this->mode == self::MODE_ALL) {
             $args['promos'] = '';
         }
+        $args['promos'] = str_replace(' ', '', $args['promos']);
         $this->promos  = ($args['promos'] == '' || preg_match('#^(\d{4}-?|(\d{4})?-\d{4})(,(\d{4}-?|(\d{4})?-\d{4}))*$#', $args['promos']))? $args['promos'] : '#';
     }
+
+    public function canSeeEarlyResults(User $user)
+    {
+        return $user->id() == $this->creator || $user->checkPerms('admin');
+    }
     // }}}
 
     // {{{ functions to access general information
@@ -103,7 +111,9 @@ class Survey
             if ((preg_match('#^\d{4}$#', $p) && $p == $promo) ||
                 (preg_match('#^\d{4}-$#', $p) && intval(substr($p, 0, 4)) <= $promo) ||
                 (preg_match('#^-\d{4}$#', $p) && intval(substr($p, 1)) >= $promo) ||
-                (preg_match('#^\d{4}-\d{4}$#', $p) && intval(substr($p, 0, 4)) <= $promo && intval(substr($p, 5)) >= $promo)) {
+                (preg_match('#^\d{4}-\d{4}$#', $p) &&
+                    (intval(substr($p, 0, 4)) <= $promo && intval(substr($p, 5)) >= $promo ||
+                     intval(substr($p, 0, 4)) >= $promo && intval(substr($p, 5)) <= $promo ))) {
                     return true;
             }
         }
@@ -189,38 +199,32 @@ class Survey
         $nbf = count($line);
         $users = array();
         if ($this->isMode(self::MODE_XIDENT)) { // if the mode is non anonymous
-            $sql = 'SELECT v.id AS vid, a.nom, a.prenom, a.promo
-                      FROM survey_votes AS v
-                INNER JOIN auth_user_md5 AS a
-                        ON a.user_id=v.user_id
-                     WHERE v.survey_id={?}
-                  ORDER BY vid ASC;';
-            $res = XDB::iterator($sql, $this->id); // retrieves all users data
-            for ($u = $res->next(); $u != null; $u = $res->next()) {
-                $users[$u['vid']] = array('nom' => $u['nom'], 'prenom' => $u['prenom'], 'promo' => $u['promo']);
-            }
+            $users = XDB::fetchAllAssoc('vid', 'SELECT  v.id AS vid, v.uid
+                                                  FROM  survey_votes AS v
+                                                 WHERE  v.survey_id = {?}
+                                            ORDER BY  vid ASC',
+                                                $this->id);
         }
         $sql = 'SELECT v.id AS vid, a.question_id AS qid, a.answer AS answer
                   FROM survey_votes AS v
-             LEFT JOIN survey_answers AS a
-                    ON a.vote_id=v.id
+            INNER JOIN survey_answers AS a ON a.vote_id=v.id
                  WHERE v.survey_id={?}
-              ORDER BY vid ASC, qid ASC, answer ASC;';
+              ORDER BY vid ASC, qid ASC, answer ASC';
         $res = XDB::iterator($sql, $this->id); // retrieves all answers from database
-        $cur = $res->next();
         $vid = -1;
         $vid_ = 0;
-        while ($cur != null) {
+        while (($cur = $res->next()) != null) {
             if ($vid != $cur['vid']) { // if the vote id changes, then starts a new line
                 fputcsv($csv, $line, $sep, $enc); // stores the former line into $csv_output
                 $vid = $cur['vid'];
                 $line = array_fill(0, $nbf, ''); // creates an array full of empty string
                 $line[0] = $vid_; // the first field is a 'clean' vote id (not the one stored in database)
                 if ($this->isMode(self::MODE_XIDENT)) { // if the mode is non anonymous
-                    if (array_key_exists($vid, $users) && is_array($users[$vid])) { // and if the user data can be found
-                        $line[1] = $users[$vid]['nom']; // adds the user data (in the first fields of the line)
-                        $line[2] = $users[$vid]['prenom'];
-                        $line[3] = $users[$vid]['promo'];
+                    if (array_key_exists($vid, $users)) { // and if the user data can be found
+                        $user=PlUser::getWithUID($users[$vid]);
+                        $line[1] = $user->lastName(); // adds the user data (in the first fields of the line)
+                        $line[2] = $user->firstName();
+                        $line[3] = $user->promo();
                     }
                 }
                 $vid_++;
@@ -239,7 +243,6 @@ class Survey
                 }
                 $line[$fid] .= $a; // adds the current answer to the correct field
             }
-            $cur = $res->next(); // gets next answer
         }
         fputcsv($csv, $line, $sep, $enc); // stores the last line into $csv_output
         return $csv_output;
@@ -312,7 +315,7 @@ class Survey
     // {{{ function checkSyntax() : checks syntax of the questions (currently the root only) before storing the survey in database
     private static $errorMessages = array(
         "datepassed"  => "la date de fin de sondage est déjà dépassée : vous devez préciser une date future",
-        "promoformat" => "les restrictions à certaines promotions sont mal formattées"
+        "promoformat" => "les restrictions à certaines promotions sont mal formatées"
     );
 
     public function checkSyntax()
@@ -346,8 +349,11 @@ class Survey
         default:
             return null;
         }
-        $sql = 'SELECT id, title, end, mode
-                  FROM survey_surveys
+        if (!S::user()->checkPerms(PERMS_USER)) {
+            $where .=  XDB::format(' AND mode = {?}', self::MODE_ALL);
+        }
+        $sql = 'SELECT id, title, uid, end, mode
+                  FROM surveys
                  WHERE '.$where.'
               ORDER BY end DESC;';
         if ($tpl) {
@@ -361,8 +367,8 @@ class Survey
     // {{{ static function retrieveSurvey() : gets a survey in database (and unserialize the survey object structure)
     public static function retrieveSurvey($sid)
     {
-        $sql = 'SELECT questions, title, description, end, mode, promos
-                  FROM survey_surveys
+        $sql = 'SELECT questions, title, description, end, mode, promos, uid
+                  FROM surveys
                  WHERE id={?}';
         $res = XDB::query($sql, $sid);
         $data = $res->fetchOneAssoc();
@@ -378,7 +384,7 @@ class Survey
     public static function retrieveSurveyInfo($sid)
     {
         $sql = 'SELECT title, description, end, mode, promos
-                  FROM survey_surveys
+                  FROM surveys
                  WHERE id={?}';
         $res = XDB::query($sql, $sid);
         return $res->fetchOneAssoc();
@@ -388,7 +394,6 @@ class Survey
     // {{{ static function retrieveSurveyReq() : gets a survey request to validate
     public static function retrieveSurveyReq($id)
     {
-        require_once 'validations.inc.php';
         $surveyreq = Validate::get_request_by_id($id);
         if ($surveyreq == null) {
             return null;
@@ -406,7 +411,6 @@ class Survey
     // {{{ function proposeSurvey() : stores a proposition of survey in database (before validation)
     public function proposeSurvey()
     {
-        require_once 'validations.inc.php';
         $surveyreq = new SurveyReq($this->title, $this->description, $this->end, $this->mode, $this->promos, $this->questions, S::user());
         return $surveyreq->submit();
     }
@@ -416,7 +420,7 @@ class Survey
     public function updateSurvey()
     {
         if ($this->valid) {
-            $sql = 'UPDATE survey_surveys
+            $sql = 'UPDATE surveys
                        SET questions={?},
                            title={?},
                            description={?},
@@ -426,7 +430,6 @@ class Survey
                      WHERE id={?};';
             return XDB::execute($sql, serialize($this->questions), $this->title, $this->description, $this->end, $this->mode, $this->promos, $this->id);
         } else {
-            require_once 'validations.inc.php';
             $surveyreq = Validate::get_request_by_id($this->id);
             if ($surveyreq == null) {
                 return false;
@@ -439,8 +442,9 @@ class Survey
     // {{{ functions vote() and hasVoted() : handles vote to a survey
     public function vote($uid, $args)
     {
-        XDB::execute('INSERT INTO survey_votes
-                              SET survey_id={?}, user_id={?};', $this->id, $uid); // notes the user as having voted
+        XDB::execute('INSERT INTO  survey_votes
+                              SET  survey_id = {?}, uid = {?}',
+                     $this->id, ($uid == 0) ? null : $uid); // notes the user as having voted
         $vid = XDB::insertId();
         for ($i = 0; $i < count($this->questions); $i++) {
             $ans = $this->questions[$i]->checkAnswer($args[$i]);
@@ -457,9 +461,9 @@ class Survey
 
     public function hasVoted($uid)
     {
-        $res = XDB::query('SELECT id
-                             FROM survey_votes
-                            WHERE survey_id={?} AND user_id={?};', $this->id, $uid); // checks whether the user has already voted
+        $res = XDB::query('SELECT  id
+                             FROM  survey_votes
+                            WHERE  survey_id = {?} AND uid = {?};', $this->id, $uid); // checks whether the user has already voted
         return ($res->numRows() != 0);
     }
     // }}}
@@ -468,7 +472,7 @@ class Survey
     public static function deleteSurvey($sid)
     {
         $sql = 'DELETE s.*, v.*, a.*
-                  FROM survey_surveys AS s
+                  FROM surveys AS s
              LEFT JOIN survey_votes AS v
                     ON v.survey_id=s.id
              LEFT JOIN survey_answers AS a
@@ -819,5 +823,5 @@ class SurveyCheckboxTable extends SurveyTable
 // }}}
 // }}}
 
-// vim:set et sw=4 sts=4 ts=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 ts=4 foldmethod=marker fenc=utf-8:
 ?>