пятница, 22 апреля 2011 г.

Как построить графики в TrackStudio по вашим данным

Внимание! Данный способ будет работать только в браузерах, поддерживающих HTML5
С помощью javascript-модуля visualize, созданного Filament Group в TrackStudio можно строить графики четырех типов:
  • столбчатые диаграммы (bar)
  • круговые диаграммы (pie)
  • линейные графики (area и line)

Плагин работает достаточно просто: он визуализирует по определенным правилам данные, представленные в html-таблице. Наша задача сводится к формированию этой таблицы и указанию параметров отрисовки.

Для примера построим столбчатую диаграмму отработанных часов пользователей, занятых в проекте (BarChart.java):


Этот скрипт собирает список пользователей, у которых есть доступ к проекту и возможность указывать потреченное время, и строит для них диаграмму распределения потраченного времени.

Также построим круговую диаграмму распределения задач в зависимости от состояния (PieChart.java):



И, наконец, график работы разработчиков над проектом, на котором показано распределение рабочих часов по ходу проекта и рост общего количества потраченного времени: (AreaChart.java)


Этот скрипт автоматически масштабирует интервалы времени: сначала он считает количество дней от начала проекта до его последнего обновления. Если их оказывается больше 40 (число можно поменять), скрипт считает количество недель. Если и таких интервалов много - количество месяцев. Затем скрипт суммирует потраченное на проект время по интервалам и выводит график.

Графики выводятся с помощью вычисляемого дополнительного поля типа Memo (Тест), с включенным отображением в HTML.
  1. Создайте в папке webapps/TrackStudio/html вашего экземпляра TrackStudio папку visualize.
  2. Перепишите в нее файлы jquery.min.js и visualize.jQuery.js, приложенные к этой странице.
  3. Распакуйте архив task_custom_field_value.zip в папку etc/plugins/scripts/task_custom_field_value вашего экземпляра TrackStudio
  4. Запустите TrackStudio.
  5. В задаче, в которой вы хотите видеть графики, создайте дополнительное поле типа Memo с отображением в HTML. Название может быть любым. Поле также можно привязать к процессу (Workflow). Настройте права на это поле, чтобы оно показывалось только тем пользователям, которым разрешено видеть график.
  6. Сделайте это поле вычисляемым (установите соответствующую галку) и назначьте ему скрипт, формирующий график. Кеширование значений нужно отключить.

Полезные советы


Собственно график из таблицы строится с помощью вызова javascript:
<script>
        $('table').visualize();
</script>
Просто так этот вызов использовать нельзя: плагин попробует отрисовать графики по всем таблицам на странице. Значит нужно указывать, какую именно таблицу отрисовывать:
<table id="piechartsource">
...

<script>
        $('table#piechartsource').visualize();
</script>

Заголовок графика берется из CAPTION таблицы. Метки - из ячеек TH.

Тип графика задается параметром type: 'bar', 'area', 'pie', 'line'. По-умолчанию выводится bar
<table id="piechartsource">
...

<script>
        $('table#piechartsource').visualize({type: 'area'});
</script>
По-умолчанию график рисуется точно таких же размеров (ширина и высота), как и исходная таблица. Чтобы отрисовать график нужного вам типа в нужном вам масштабе, укажите параметры:

<table id="piechartsource">
...

<script>
        $('table#piechartsource').visualize({type: 'area', width: '800px', height: '600px'});
</script>

При отрисовке исходная таблица не скрывается. Чтобы ее скрыть, укажите для нее свойство display: none
<table id="piechartsource" style="display: none">>
...

<script>
        $('table#piechartsource').visualize({type: 'area', width: '800px', height: '600px'});
</script>

Цвета отрисовки можно указать через параметр colors (это массив)
<table id="piechartsource" style="display: none">>
...

<script>
        $('table#piechartsource').visualize({type: 'area', width: '800px', height: '600px', colors: ['#be1e2d','#666699','#92d5ea','#ee8310','#8d10ee','#5a3b16','#26a4ed','#f45a90','#e9e744']});
</script>

Вы также можете управлять стилями графика, редактируя соответствующие параметры стилей (они приведены в исходных кодах скриптов).

пятница, 10 сентября 2010 г.

Копируем права доступа в другой проект одной кнопкой

Одна из самых популярных конфигураций TrackStudio: много однотипных проектов, права на которые задаются для разных команд по-разному. Эта конфигурация встречается и в HelpDesk, и в заказной разработке. При создании нового проекта приходится каждый раз настраивать права доступа. А что, если попробовать скопировать эти настройки из другого проекта, которым занимается та же команда разработчиков?
Это можно сделать одной кнопкой, по которой будет запускаться Add Message/Instead Of Trigger. Само сообщение при этом создаваться не будет. В теле сообщения указывается номер проекта, из которого нужно взять настройки.
package scripts.instead_of_add_message;

import com.trackstudio.app.adapter.AdapterManager;
import com.trackstudio.app.session.SessionContext;
import com.trackstudio.exception.GranException;
import com.trackstudio.external.OperationTrigger;
import com.trackstudio.secured.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.List;

/**
 * Копирует ACL из задачи, указанной в описании сообщения, в текущую.
 */
public class CopyAccessRules  implements OperationTrigger {

       public static Log log = LogFactory.getLog(CopyAccessRules.class);
    public SecuredMessageTriggerBean execute(SecuredMessageTriggerBean message) throws GranException
    {
        String taskNum = message.getDescription();
        SessionContext sc = message.getSecure();
        SecuredTaskBean task = AdapterManager.getInstance().getSecuredTaskAdapterManager().findTaskByNumber(sc, taskNum);
        if (task!=null){
        List targetAcl = AdapterManager.getInstance().getSecuredAclAdapterManager().getTaskAclList(sc,
                message.getTaskId());
        List sourceAcl = AdapterManager.getInstance().getSecuredAclAdapterManager().getTaskAclList(sc,
                task.getId());

        for (SecuredTaskAclBean tb: sourceAcl){
            if (tb.canManage() && tb.getTaskId().equals(task.getId())){

                SecuredPrstatusBean group = tb.getGroup();
                SecuredUserBean user = tb.getUser();
                SecuredPrstatusBean prstatus = tb.getPrstatus();
                boolean isOverride = tb.isOverride();
            boolean exists = false;
                if (!sc.getUser().equals(user)){
            for (SecuredTaskAclBean ta: targetAcl){
                SecuredPrstatusBean groupA = ta.getGroup();
                SecuredUserBean userA = ta.getUser();
                SecuredPrstatusBean prstatusA = ta.getPrstatus();
                boolean isOverrideA = ta.isOverride();
                if ((group!=null && groupA!=null && group.equals(groupA)) || (group==null && groupA == null))
                    if ((user!=null && userA!=null && user.equals(userA)) || (user==null && userA == null))
                        if ((prstatus!=null && prstatusA!=null && prstatus.equals(prstatusA)) || (prstatus==null && prstatusA == null))
                            if (isOverride==isOverrideA){
                                exists = true;
                                break;
                            }
            }
                if (!exists){
                    // create
                    String aclid = AdapterManager.getInstance().getSecuredAclAdapterManager().createAcl(sc, message.getTaskId(), null,
                            user!=null ? user.getId() : null, group!=null ? group.getId() : null);
                     AdapterManager.getInstance().getSecuredAclAdapterManager().updateTaskAcl(sc, aclid, prstatus.getId(), isOverride);

                }
            }
        }
        }
        }
        return message;
    }
}
Исходный код и скомпилированный класс скрипта

вторник, 3 августа 2010 г.

Scrum в TrackStudio

Наши пользователи спрашивали, есть ли в TrackStudio возможность использовать SCRUM как методологию разработки. Вот в Jira есть GreenHopper, а у нас, мол, ничего нет. А я как раз давно хотел, да и TrackStudio 4.0 вышла, нужны примеры и конфигураций, и скриптов. Вооружился толковой книжкой про SCRUM на русском языке, и приступил к созданию новой конфигурации.

GreenHopper я видел. И атлассиановскую The Wall of Death. И еще тогда не понимал, в чем прикол разрабатывать ПО и пользоваться инструментами уровня детского сада: ножницы, клей, фломастер и стена. Да и офисы не у всех просторные. У некоторых офисы вообще дома, а работать надо.
В Scrum ведь главное - не стена, а общение в команде. А для общения есть куча всевозможного софта и социальных сетей.

Своей задачей я видел реализацию в TrackStudio технической стороны SCRUM: ведение бэклога, планирование спринтов и анализ их хода.
С ведением бэклогов никаких проблем: сколько хочешь категорий, процессы любой сложности и полная иерархия задач. Плюс фильтры.
Роли в методологии четко прописаны, с ними тоже проблем нет: Product Owner, Scrum Master и Team для команды (конечно один и тот же человек может быть и Scrum Master и Team - отдельные учетные записи создавать не нужно).
Product Owner составляет истории, указывает их важность и как продемонстрировать результат (это могут так же и участники команды редактировать). Это реализуется встроенными полями и двумя дополнительными: Integer для важности и Text для описания способа демонстрации.

Дальше по сценарию участники команды должны оценить трудоемкость каждой истории. Нам нужно где-то хранить эти оценки, как-то их систематизировать и как-то показывать пользователю, оценил он уже историю или нет.
Хранить оценки удобнее всего в поле budget: оно есть и у задачи, и у операции, так что история оценок реализуется сама собой. Для систематизации нужно что-то наглядное: любимый поклонниками Jira dashboard.
У нас есть дополнительные поля типа Text, в которых может отображаться HTML, плюс любое поле можно сделать вычисляемым. Получается такой мини-dashboard, в котором можно что угодно выводить.

Дальше по сценарию Scrum Master создает спринт и переносит в него задачи. В некоторых красивых приложениях это сделано через drag'n'drop. Передо мной задачи сделать красиво не стояло. Главное - сделать, чтобы работало и было удобно пользоваться.
Задачи в TrackStudio переносятся методом cut/paste: вы выбираете несколько задач (можно на разных страницах списка), жмете кнопку "Вырезать", переходите через дерево или по списку на нужную задачу и там жмете "Вставить". Достаточно просто. Но т.к. нам нужно будет не только вносить задачи в спринт, но и убирать их оттуда, и переносить в другой спринт, удобнее будет, если это будет делаться изнутри задачи, при ее редактировании или выполнении операции. А это можно сделать с помощью триггеров.
Но как при этом указать, в какой спринт переносить? Нужен список существующих спринтов. А это уже довольно редко используемый lookup-скрипт: он выводит поле со списком значений и пользователь может выбрать нужное. Почему это называется lookup - не знаю.

Итак, как перенести истории в спринт мы решили. Но какие именно истории переносить? Тут все просто: наиболее важные - в фильтре "Истории" делаем сортировку по важности. И переносим в спринт уже оцененные разработчиками истории. Переносим "на глазок", все равно оценки еще изменятся и мы либо добавим историй в спринт, либо уберем часть.

Для планирования спринта нам также понадобится "dashboard", похожий на тот, что в историях. В нем нам нужно подсчитывать общий бюджет историй в спринте и сравнивать его с бюджетом спринта. Кроме того, нам понадобится знать кое-то о нашей команде: ни для кого не секрет, что разные люди работают по-разному. Кто-то бабахает по 80 часов в неделю, а у кого-то семья. А кто-то работает на трех работах. А часть тестировщиков вообще работает по 10 часов в неделю. И это нужно учитывать при планировании.
В разных книжках и на разных сайтах предлагают вводить какие-то коэффициенты, "ненастоящие часы" и т.п. Мы пойдем другим путем. Мы сделаем для участников команды специальное поле, в которое запишем, сколько же часов в неделю они будут работать. Это поле мы сможем потом изменять, если кто-то, например, заболеет.

Итак, у нас есть спринт с оцененными историями, команда со своими заморочками, отраженными в поле "Степень занятости" и Scrum Master. В нашем dashboard мы все соединим, чтобы мастер понял, как распределить задачи по команде. Он будет видеть, насколько загружен каждый разработчик и во сколько часов он оценил каждую конкретную историю (или вообще не оценил). Разумно предположить, что тот, кто указал наименьшую оценку либо хорошо понял, что делать, либо очень хочет получить именно эту историю.

Допустим, Scrum Master распределил задачи, все договорились об оценках и т.п. Если спринт вписывается в бюджет - можно его запускать, если не вписывается - предстоит еще один раунд торговли.

После того, как спринт начат, и Scrum Master и участники команды захотят увидеть burndown chart. Но, увы, пока не увидят. Вместо burndown-диаграммы они увидят индикатор, показывающий, опережает команда план или опаздывает (и на сколько часов).

Вот, в общем, и все. Дальше команда реализует истории, подходит время демонстрации, все показывается Product Owner'у - все ровно по методике.


Руководство по эксплуатации и сама конфигурация с исходниками (документированными!) прилагается

вторник, 22 июня 2010 г.

Juick vs Twitter || TrackStudio vs Jira

Обнаружил интересные параллели между Twitter/Jira и Juick/TrackStudio.
Первая пара - жутко популярные приложения, известные во всем мире. Вторая, прямо скажем, не преодолела пропасти (см. книгу "Преодоление пропасти: маркетинг и продажа хайтек-товаров массовому потребителю").
Первая пара создавалась достаточно известными в своей отрасли людьми, представителями "западного мира". Вторая - никому не известными парнями из Запорожья и Смоленска.
Первую пару отличает удобство и простота, но и достаточно ограниченная функциональность. Вторая пара - монстры возможностей, однако рассчитаны больше на гиков, чем на клерков.

Но ключевая штука, конечно, это преодоление пропасти. Мы уже закрепили канаты.

вторник, 15 июня 2010 г.

Выпустили TrackStudio 4.0

" - Строили мы строили, и, наконец, построили"

Более трех лет ушло у нас на разработку новой версии TrackStudio. Мир за это время изменился необычайно: прогремел и еще позвякивает медяками финансовый кризис, появились новые конкуренты, в команду приходили и уходили новые люди, у меня родилась дочка, Apple выпустил iPhone и iPad, вышла Windows 7 и много-много Ubuntu.
А мы все делали, делали. И вот.
Работа проделана действительно грандиозная. 1700 решенных задач, от громадных, занимавших месяцы, до миниатюрных, на пару минут.
Фактически мы используем эту версию уже несколько месяцев, так что она хорошо испытана не только на тестовых заданиях, но и на реальных данных. Поверьте, пользоваться TrackStudio стало значительно проще и удобнее.
Теперь мы сосредоточим свою работу над дополнительной документацией, примерами, конфигурациями, скриптами и всем тем, что делает из программы продукт. Следите за обновлениями на новом сайте TrackStudio

среда, 5 мая 2010 г.

Splashscreen TrackStudio

В связи с падением самолета под Смоленском придётся теперь менять splash для TrackStudio. Сейчас он вот такой.

пятница, 6 ноября 2009 г.

И о погоде

В Смоленске выпал первый снег. Традиционно, сотрудники TrackStudio в лице меня приехали на работу на велосипеде. Это здорово, скажу я вам. Вот взять, к примеру, лыжи: это снег и физические упражнения на свежем воздухе, плюс ветер в лицо. Велосипед зимой - это все то же самое, плюс ехать на работу, плюс как бы не упасть (покрышки нужно ставить правильные и дисковые тормоза в придачу), плюс взгляды прохожих... Взгляды словами не описать. Большее удивление на лицах вызывало только детское велокресло, но к креслам у нас уже более-менее привыкли. Пальцем уже не показывают.
Озлобленные подростки почему-то желали в спину упасть (на своем подростковом языке, конечно). Завидуют.