Merge commit 'origin/fusionax' into account
[platal.git] / modules / stats.php
index fbfb2b4..7fba02a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2006 Polytechnique.org                              *
+ *  Copyright (C) 2003-2009 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -42,6 +42,7 @@ class StatsModule extends PLModule
             'stats/graph/evolution'
                               => $this->make_hook('graph_evo', AUTH_COOKIE),
             'stats/promos'    => $this->make_hook('promos',    AUTH_COOKIE),
+            'stats/profile'   => $this->make_hook('profile',   AUTH_COOKIE),
 
             'stats/coupures'  => $this->make_hook('coupures',  AUTH_PUBLIC),
         );
@@ -50,40 +51,35 @@ class StatsModule extends PLModule
     function handler_stats(&$page)
     {
         $page->changeTpl('stats/index.tpl');
-        return PL_OK;
     }
 
     function handler_evolution(&$page, $jours = 365)
     {
         $page->changeTpl('stats/evolution_inscrits.tpl');
         $page->assign('jours', $jours);
-        return PL_OK;
     }
 
     function handler_graph_evo(&$page, $jours = 365)
     {
-        global $globals;
-
-        define('DUREEJOUR',24*3600);
+        define('DUREEJOUR', 24 * 3600);
 
         //recupere le nombre d'inscriptions par jour sur la plage concernée
-        $res = $globals->xdb->iterRow(
-                "SELECT  IF( date_ins>DATE_SUB(NOW(),INTERVAL $jours DAY),
-                             TO_DAYS(date_ins)-TO_DAYS(NOW()),
-                            ".(-($jours+1)).") AS jour,
-                         COUNT(user_id) AS nb
-                   FROM  auth_user_md5 
-                  WHERE  perms IN ('admin','user')
-               GROUP BY  jour");
+        // FIXME: don't count dead peaple
+        $res = XDB::iterRow('SELECT  IF(registration_date > DATE_SUB(NOW(), INTERVAL {?} DAY),
+                                        TO_DAYS(registration_date) - TO_DAYS(NOW()),
+                                        -{?}) AS jour,
+                                     COUNT(uid) AS nb
+                               FROM  accounts
+                              WHERE  state = \'active\'
+                           GROUP BY  jour', (int)$jours, 1 + (int)$jours);
 
         //genere des donnees compatibles avec GNUPLOT
         $inscrits='';
 
         // la première ligne contient le total des inscrits avant la date de départ (J - $jours)
         list(,$init_nb) = $res->next();
-        $total = $init_nb;
-
-        list($numjour, $nb) = $res->next();
+        $total    = $init_nb;
+        $numjour = - $jours - 1;
 
         for ($i = -$jours; $i<=0; $i++) {
             if ($numjour<$i) {
@@ -100,6 +96,7 @@ class StatsModule extends PLModule
         header( "Content-type: image/png");
 
         $delt = ($total - $init_nb)/10;
+        $delt = $delt ? $delt : 5;
         $ymin = round($init_nb - $delt,0);
         $ymax = round($total   + $delt,0);
 
@@ -127,18 +124,18 @@ EOF2;
 
     function handler_graph(&$page, $promo = null)
     {
-        global $globals;
-
         if ($promo == 'all') {
             // date de départ
-            $depart = 1920;
+            $depart = 1930;
 
             //recupere le nombre d'inscriptions par jour sur la plage concernée
-            $res = $globals->xdb->iterRow(
-                    "SELECT  promo, SUM(perms IN ('admin', 'user')) / COUNT(*) * 100
-                       FROM  auth_user_md5
-                      WHERE  promo >= $depart AND deces = 0
-                   GROUP BY  promo");
+            // XXX: Manage dead peaple...
+            $res = XDB::iterRow("SELECT  pe.entry_year AS promo, SUM(state = 'active') / COUNT(*) * 100
+                                   FROM  accounts AS a
+                             INNER JOIN  account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))
+                             INNER JOIN  profile_education AS pe ON (pe.uid = ap.pid AND FIND_IN_SET('primary', pe.flags))
+                                  WHERE  pe.entry_year >= {?}
+                               GROUP BY  promo", $depart);
 
             //genere des donnees compatibles avec GNUPLOT
             $inscrits='';
@@ -170,7 +167,7 @@ set timefmt "%d/%m/%y"
 set xr [$depart:$fin]
 set yr [0:100]
 
-set title "Nombre d'inscrits par promotion depuis $depart."
+set title "Proportion d'inscrits par promotion depuis $depart, en %."
 
 plot "-" using 1:2 title 'inscrits' with boxes;
 {$inscrits}
@@ -180,23 +177,26 @@ EOF2;
         } else {
             //nombre de jours sur le graph
             $jours = 365;
-            define('DUREEJOUR',24*3600);
-            $res = $globals->xdb->query("SELECT min(TO_DAYS(date_ins)-TO_DAYS(now()))
-                                           FROM auth_user_md5
-                                          WHERE promo = {?}
-                                                AND perms IN ('admin', 'user')",
-                                        $promo);
+            define('DUREEJOUR', 24 * 3600);
+
+            // XXX: And promo again \o/
+            $res = XDB::query("SELECT  MIN(TO_DAYS(a.registration_date) - TO_DAYS(NOW()))
+                                 FROM  accounts AS a
+                           INNER JOIN  account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))
+                           INNER JOIN  profile_education AS pe ON (pe.uid = ap.pid AND FIND_IN_SET('primary', pe.flags))
+                                WHERE  pe.entry_year = {?} AND a.state = 'active'", (int)$promo);
             $jours = -$res->fetchOneCell();
 
             //recupere le nombre d'inscriptions par jour sur la plage concernée
-            $res = $globals->xdb->iterRow(
-                    "SELECT  IF( date_ins>DATE_SUB(NOW(),INTERVAL $jours DAY),
-                                 TO_DAYS(date_ins)-TO_DAYS(NOW()),
-                                ".(-($jours+1)).") AS jour,
-                             COUNT(user_id) AS nb
-                       FROM  auth_user_md5 
-                      WHERE  promo = {?} AND perms IN ('admin','user')
-                   GROUP BY  jour", $promo);
+            $res = XDB::iterRow("SELECT  IF(a.registration_date > DATE_SUB(NOW(), INTERVAL {?} DAY),
+                                            TO_DAYS(a.registration_date) - TO_DAYS(NOW()),
+                                            -{?}) AS jour,
+                                         COUNT(a.uid) AS nb
+                                   FROM  accounts AS a
+                             INNER JOIN  account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))
+                             INNER JOIN  profile_education AS pe ON (pe.uid = ap.pid AND FIND_IN_SET('primary', pe.flags))
+                                  WHERE  pe.entry_year = {?} AND a.state = 'active'
+                               GROUP BY  jour", (int)$jours, 1 + (int)$jours, (int)$promo);
 
             //genere des donnees compatibles avec GNUPLOT
             $inscrits='';
@@ -250,16 +250,15 @@ EOF2;
 
     function handler_promos(&$page, $promo = null)
     {
-        global $globals;
-
         $page->changeTpl('stats/nb_by_promo.tpl');
 
-        $res = $globals->xdb->iterRow(
-                "SELECT  promo,COUNT(*)
-                   FROM  auth_user_md5
-                  WHERE  promo > 1900 AND perms IN ('admin','user')
-               GROUP BY  promo
-               ORDER BY  promo");
+        $res = XDB::iterRow('SELECT  pe.entry_year AS promo, COUNT(*)
+                               FROM  accounts AS a
+                         INNER JOIN  account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET(\'owner\', ap.perms))
+                         INNER JOIN  profile_education AS pe ON (pe.uid = ap.pid AND FIND_IN_SET(\'primary\', pe.flags))
+                              WHERE  pe.entry_year >= 1900  AND a.state = \'active\'
+                           GROUP BY  promo
+                           ORDER BY  promo');
         $max=0; $min=3000;
 
         while (list($p,$nb) = $res->next()) {
@@ -274,37 +273,61 @@ EOF2;
         $page->assign('min', $min-$min % 10);
         $page->assign('max', $max+10-$max%10);
         $page->assign('promo', $promo);
-
-        return PL_OK;
     }
 
     function handler_coupures(&$page, $cp_id = null)
     {
-        global $globals;
-
         $page->changeTpl('stats/coupure.tpl');
 
         if (!is_null($cp_id)) {
-            $res = $globals->xdb->query("SELECT  UNIX_TIMESTAMP(debut) AS debut,
-                                                 TIME_FORMAT(duree,'%kh%i') AS duree,
-                                                 resume, description, services
-                                           FROM  coupures
-                                          WHERE  id = {?}", $cp_id);
+            $res = XDB::query("SELECT  debut,
+                                       TIME_FORMAT(duree,'%kh%i') AS duree,
+                                       resume, description, services
+                                 FROM  coupures
+                                WHERE  id = {?}", $cp_id);
             $cp  = $res->fetchOneAssoc();
         }
 
-        if($cp) {
+        if(@$cp) {
             $cp['lg_services'] = serv_to_str($cp['services']);
             $page->assign_by_ref('cp',$cp);
         } else {
             $beginning_date = date("Ymd", time() - 3600*24*21) . "000000";
-            $sql = "SELECT  id, UNIX_TIMESTAMP(debut) AS debut, resume, services
+            $sql = "SELECT  id, debut, resume, services
                       FROM  coupures where debut > '$beginning_date' order by debut desc";
-            $page->assign('coupures', $globals->xdb->iterator($sql));
+            $page->assign('coupures', XDB::iterator($sql));
+            $res = XDB::iterator("SELECT  host, text
+                                    FROM  mx_watch
+                                   WHERE  state != 'ok'");
+            $page->assign('mxs', $res);
         }
+    }
 
-        return PL_OK;
+    function handler_profile(&$page, $period = 'overall')
+    {
+        $page->changeTpl('stats/profile.tpl');
+
+        $time = '';
+        switch ($period) {
+          case 'week': case 'month': case 'year':
+            $time = ' AND e.stamp > DATE_SUB(CURDATE(), INTERVAL 1 ' . strtoupper($period) . ')';
+            break;
+        }
+        // XXX: Need to be port to profile stuff
+        $rows = XDB::iterator("SELECT  IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom,
+                                       u.prenom, u.promo, e.data AS forlife, COUNT(*) AS count
+                                 FROM  logger.events AS e
+                           INNER JOIN  logger.actions AS act ON (e.action = act.id)
+                           INNER JOIN  aliases AS a ON (a.alias = e.data)
+                           INNER JOIN  auth_user_md5 AS u ON (u.user_id = a.id)
+                                WHERE  act.text = 'view_profile' $time
+                             GROUP BY  e.data
+                             ORDER BY  count DESC
+                                LIMIT  10");
+        $page->assign('profiles', $rows);
+        $page->assign('period', $period);
     }
 }
 
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
 ?>