Как стать автором
Обновить

Наблюдение за жуками ( Mantis + Google Visualization )

Время на прочтение8 мин
Количество просмотров3.4K
В моей работе нужно анализировать качество проектов и иметь полное понимание о том, как мы учимся не наступать на одни и теже грабли. Для этой цели есть много инструментария, но я хочу поделиться опытом с теми, кто как и наша студия использует в роли багтрекинга Mantis 1.1.1 (написан на PHP, БД- MySQL)



image Мне надоело наблюдать сравнительные таблицы с сухими данными об ошибках по проектам. Решил всю эту информацию визуализировать.
Потратил немного времени на поиск аддона к Mantis по визуализации- ничего не нашел( а есть ли такой? ). По этой причине не стал продолжать поиски, а предпочел «взять быка за рога» и подправить код Mantis, добавив свою функцию.

Зашел на code.google.com/apis/visualization и выбрал одно из представлений.

Bar Chart (http://code.google.com/apis/visualization/documentation/gallery/barchart.html)

Что я получил за свои труды: в Mantis -е в разделе «Статистика» приятный визуальный график, который отображает картину по имеющимся багам. Принципиально нового он Вам ничего не покажет… он просто отобразит в приятной форме то, что так упускается из виду при просмотре табличных данных с сухими цифрами.

Итак поправки в Mantis:
  1. /core/html_api.php
  2. /core/summary_api.php


Открываем /core/html_api.php и добавляем в функцию function html_head_javascript() {… }
следующий код:
echo "\t". '<script type=«text/javascript» src=«www.google.com/jsapi»></script>'. "\n";

Затем правим /core/summary_api.php

Во-первых нужно добавить свою функцию

   function built_Visualizations( $data_of_projects ) {

      //die ( print_r($data_of_projects ));

      ?>
      <tr>
         <td colspan=«5»>
            <div id=«chart_div» style=«border: 1px solid #c00»></div>
         </td>
      </tr>
      
      <script type=«text/javascript»>
      google.load(«visualization», «1», {packages:[«barchart»]});
      google.setOnLoadCallback(drawChart); // Set callback to run when API is loaded   
      function drawChart() {    
         var data = new google.visualization.DataTable();
         data.addColumn('string', 'Project');
         data.addColumn('number', 'resolved');    
         data.addColumn('number', 'closed');    
         data.addColumn('number', 'open');    
         data.addRows(<?=count($data_of_projects)?>);
         <?
         $a = 0;
         foreach($data_of_projects as $project => $data){
            ?>

            data.setValue(<?=(int)$a?>, 0, '<?=$project?>');
            data.setValue(<?=(int)$a?>, 1, <?=(int)$data_of_projects[$project]['t_pdata']['resolved']?>);    
            data.setValue(<?=(int)$a?>, 2, <?=(int)$data_of_projects[$project]['t_pdata']['closed']?>);
            data.setValue(<?=(int)$a?>, 3, <?=(int)$data_of_projects[$project]['t_pdata']['open']?>);
            
            <?
            $a++;
         }
         
         ?>
                
         var chart = new google.visualization.BarChart(document.getElementById('chart_div'));    
         chart.draw(data, {width: 700, height: 500, is3D: false, title: 'Report of bugs', isStacked: true, legend: 'top',legendBackgroundColor: '#ccc'}); 
         }  
         </script>

         

      <?
   }
:

Во-вторых нужно заменить
function summary_print_by_project( $p_projects = null, $p_level = 0, $p_cache = null ) {… }


на

   function summary_print_by_project( $p_projects = null, $p_level = 0, $p_cache = null ) {
      $t_mantis_bug_table    = config_get( 'mantis_bug_table' );
      $t_mantis_project_table = config_get( 'mantis_project_table' );

      $t_project_id = helper_get_current_project();

      if ( null == $p_projects ) {
         if ( ALL_PROJECTS == $t_project_id ) {
            $p_projects = current_user_get_accessible_projects();
         } else {
            $p_projects = Array( $t_project_id );
         }
      }

      # Retrieve statistics one time to improve performance.
      if ( null === $p_cache ) {
         $query = «SELECT project_id, status, COUNT( status ) AS bugcount
               FROM $t_mantis_bug_table
               GROUP BY project_id, status»
;

         $result = db_query( $query );
         $p_cache = Array();

         $t_resolved_val = RESOLVED;
         $t_closed_val = CLOSED;

         while ( $row = db_fetch_array( $result ) ) {
            extract( $row, EXTR_PREFIX_ALL, 'v' );
            if ( $t_closed_val <= $v_status ) {
               if ( isset( $p_cache[ $v_project_id ][ 'closed'  ] ) ) {
                  $p_cache[ $v_project_id ][ 'closed'  ] += $v_bugcount;
               } else {
                  $p_cache[ $v_project_id ][ 'closed'  ] = $v_bugcount;
               }
            } else if ( $t_resolved_val <= $v_status ) {
               if ( isset( $p_cache[ $v_project_id ][ 'resolved' ] ) ) {
                  $p_cache[ $v_project_id ][ 'resolved' ] += $v_bugcount;
               } else {
                  $p_cache[ $v_project_id ][ 'resolved' ] = $v_bugcount;
               }
            } else {
               if ( isset( $p_cache[ $v_project_id ][ 'open'   ] ) ) {
                  $p_cache[ $v_project_id ][ 'open'   ] += $v_bugcount;
               } else {
                  $p_cache[ $v_project_id ][ 'open'   ] = $v_bugcount;
               }
            }
         }
      }

      $data_of_projects = array();
      foreach ( $p_projects as $t_project ) {
         $t_name = str_repeat( "» ", $p_level ). project_get_name( $t_project );
         

         $t_pdata = isset( $p_cache[ $t_project ] )? $p_cache[ $t_project ]
               : array( 'open' => 0, 'resolved' => 0, 'closed' => 0 );

         
         $t_bugs_open   = isset( $t_pdata['open'] )? $t_pdata['open']: 0;
         $t_bugs_resolved = isset( $t_pdata['resolved'] )? $t_pdata['resolved']: 0;
         $t_bugs_closed  = isset( $t_pdata['closed'] )? $t_pdata['closed']: 0;
         $t_bugs_total  = $t_bugs_open + $t_bugs_resolved + $t_bugs_closed;

         //added Abbasov Alexander
         $data_of_projects[$t_name]['t_pdata'] = $t_pdata;
         $data_of_projects[$t_name]['t_bugs_resolved'] = $t_bugs_resolved;
         $data_of_projects[$t_name]['t_bugs_closed'] = $t_bugs_closed;
         $data_of_projects[$t_name]['t_bugs_total'] = $t_bugs_total;

         summary_helper_print_row( $t_name, $t_bugs_open, $t_bugs_resolved, $t_bugs_closed, $t_bugs_total );
         
         $t_subprojects = current_user_get_accessible_subprojects( $t_project );

         if ( count( $t_subprojects ) > 0 ) {
            summary_print_by_project( $t_subprojects, $p_level + 1, $p_cache );
         }
      }
      //added Abbasov Alexander
      built_Visualizations( $data_of_projects );

   }
Теги:
Хабы:
+59
Комментарии25

Публикации

Истории

Работа

Ближайшие события