在Rally上获取UserStory Milestones.TargetDate

时间:2015-09-01 13:01:24

标签: rally

我想做的是从我的故事中获取里程碑TargetDate。这就是我现在所拥有的:

    var estimatedTasksQuery = Ext.create('Rally.data.WsapiDataStore', {
                model: 'UserStory',
                limit: Infinity,
                fetch: [ 'Milestones', 'AcceptedDate', 'PlanEstimate', 'ScheduleState', 'Iteration'],
                filters: [ 
                    {property: 'DirectChildrenCount',
                     operator: '=',
                     value: '0'}
                ]
    });

    estimatedTasksQuery.load({
            callback: function(store) {
                    store.each(function(record) {
                        if (record.get('Milestones').Count != 0){
                           console.log(record.get('Milestones'));
                        }
                    });
            }
    });

正如您在"里程碑"结构如下,TargetDate属性不会出现。

控制台:

Count: 1
_rallyAPIMajor: "2"
_rallyAPIMinor: "0"
_ref: "https://rally1.rallydev.com/slm/webservice/v2.0/HierarchicalRequirement/123123/Milestones"
_tagsNameArray: Array[1]
    0: Object
       DisplayColor: "#848689"
       Name: "2.06"
       _ref: "/milestone/123123"
       __proto__: Object
    length: 1
    __proto__: Array[0]
_type: "Milestone"
__proto__: Object

1 个答案:

答案 0 :(得分:1)

目前无法使用API​​进行此操作。在每个返回的故事的Milestones集合上填充的_tagsNameArray是一个优化,通过包含有关每个里程碑的一些其他有用信息来防止其他客户端请求。

此处的一个选项是通过Rally的支持团队发出功能请求,将TargetDate添加到_tagsNameArray中的那组非规范化数据中。

与此同时,您最好的行动方案可能是创建一个额外的商店来阅读工作区中的里程碑,获取TargetDate然后使用该商店查找TargetDate以查找第一个商店中故事附带的任何里程碑。

以下是执行该查找的一些代码:

var estimatedTasksQuery = Ext.create('Rally.data.WsapiDataStore', {
    model: 'UserStory',
    limit: Infinity,
    fetch: [ 'Milestones', 'AcceptedDate', 'PlanEstimate', 'ScheduleState', 'Iteration'],
    filters: [ 
        {property: 'DirectChildrenCount',
         operator: '=',
         value: '0'}
    ]
});

estimatedTasksQuery.load({
    callback: function() {
        //load milestones
        var milestoneStore = Ext.create('Rally.data.wsapi.Store', {
            model: 'milestone',
            context: {
                project: null
            },
            fetch: ['TargetDate'],
            limit: Infinity
        });
        milestoneStore.load().then({
            success: function() {
                //loop over each story
                _.each(estimatedTasksQuery.getRange(), function(storyRecord) {
                    var milestones = storyRecord.get('Milestones');

                    //loop over each milestone in the tagsNameArray
                    _.each(milestones._tagsNameArray, function(milestone) {

                        //look up the full milestone data in the store
                        var id = Rally.util.Ref.getOidFromRef(milestone);
                        var fullMilestone = milestoneStore.getById(id);

                        //apply it into the story record
                        Ext.apply(milestone, fullMilestone.getData());
                    });
                }); 

                //at this point all the data should be stitched together
                //example:
                _.each(estimatedTasksQuery.getRange(), function(storyRecord) {
                    _.each(storyRecord.get('Milestones')._tagsNameArray, function(milestone) {
                        console.log(milestone);
                    });
                });
             }
        });
    }
});