Using Rally WsapiDataStore at a certain date

591 views Asked by At

I want to create a chart of how many tasks are in a given Schedule State during the length of the sprint. Is it possible to call WsapiDataStore on each day?

2

There are 2 answers

3
Tore On

What you are looking for is a lookback Snapshot Store , using the Lookback API - this allows you to specify a date or a point in time that you want to query by.

A typical use looks like this:

    Ext.create('Rally.data.lookback.SnapshotStore', {
        pageSize : 10000,
        fetch    : ['fetch'],
        filters  : [{
            property : '__At',
            value    : 'current'
        },{
            property : '_ItemHierarchy',
            value    : 'HierarchicalRequirement'
        }]
    }).load({
        callback : function(records) {
            Ext.Array.each(records, function(record) {
                // do something with each record
            });
        }
    });
0
nickm On

WsapiDataStore is not intended for historic data. You need to use Rally.data.lookback.SnapshotStore which retrieves data from the Lookback API.

Lookback API allows to see what any work item or collection of work items looked like in the past. This is different from using WS API directly (or via WsapiDataStore) which can provide you with the current state of objects, but does not have historical data.

LBAPI documentation is available here

As far as Rally release object's attributes see WS API object model here. But it is not clear from your comment what you mean by data for the entire release. If you are interested in getting back user stories assigned to a specific release then your query object should be hierarchical requirement and not release, and you may filter by release.

Here is an app that builds a chart using a Release dropdown. Based on the selection in the dropdown the chart is refreshed (it is destroyed and added):

Ext.define('CustomApp', {
                extend: 'Rally.app.TimeboxScopedApp',
                componentCls: 'app',
                scopeType: 'release',
                comboboxConfig: {
                                fieldLabel: 'Select a Release:',
                                labelWidth: 100,
                                width: 300
                },

                addContent: function() {
                                this._makeStore();
                },

                onScopeChange: function() {
                                this._makeStore();
                },

                _makeStore: function() {
                    Ext.create('Rally.data.WsapiDataStore', {
                        model: 'UserStory',
                        autoLoad: true,
                        filters: [this.getContext().getTimeboxScope().getQueryFilter()],
                        listeners: {
                            load: this._onDataLoaded,
                            scope: this
                        }
                    });

                },
                _onDataLoaded: function(store, data) {
                    var records = [];
                    var scheduleStateGroups = ["Defined","In-Progress","Completed","Accepted"]

                    // State count variables
                    var definedCount = 0;
                    var inProgressCount = 0;
                    var completedCount = 0;
                    var acceptedCount = 0;

                    // Loop through returned data and group/count by ScheduleState
                    Ext.Array.each(data, function(record) {
                        //Perform custom actions with the data here
                        //Calculations, etc.

                        scheduleState = record.get('ScheduleState');

                        switch(scheduleState)
                        {
                            case "Defined":
                                definedCount++;
                                break;
                            case "In-Progress":
                                inProgressCount++;
                                break;
                            case "Completed":
                                completedCount++;
                                break;
                            case "Accepted":
                                acceptedCount++;
                        }
                    });
                    if (this.down('#myChart')) {
                                this.remove('myChart');
                    }
                    this.add(
                        {
                            xtype: 'rallychart',
                            height: 400,
                            itemId: 'myChart',
                            chartConfig: {
                                chart: {
                                },
                                title: {
                                    text: 'User Story Schedule State Counts',
                                    align: 'center'
                                },
                                xField : 'ScheduleState',
                                xAxis: [
                                    {
                                        //categories: scheduleStateGroups,
                                        title: {
                                            text: 'ScheduleState'
                                        }
                                    }
                                ],
                                yAxis: {
                                    title: {
                                        text: 'Count'
                                    }
                                },
                                plotOptions : {
                                    column: {
                                        color: '#F00'
                                    },
                                    series : {
                                        animation : {
                                            duration : 2000,
                                            easing : 'swing'
                                        }
                                    }
                                }
                            },            
                            chartData: {
                                categories: scheduleStateGroups, 
                                series: [ 
                                    {   
                                        type: 'column',
                                        data: [definedCount, inProgressCount, completedCount, acceptedCount]
                                    }
                                ]
                            }
                        }
                    );
                    this.down('#myChart')._unmask(); 
                }
            });