1

有谁知道使用 sdk 2 拉出与史诗相关的所有缺陷的方法?我们所有的投资组合项目都分配给一个根,我们的开发团队分配给另一个。通过用户故事父级从一侧到另一侧有联系,但我还没有找到一种方法来查看与特定史诗相关的所有缺陷。建议?

4

1 回答 1

1

有不同的方法可以获取与投资组合项/功能间接相关的缺陷。这是一个示例,其中一个特征存储由当前版本创建和过滤,然后使用 Promise,它加载特征,然后是相关的史诗故事,然后是相关的子故事,然后是相关的缺陷,最后构建一个按以下方式分组的缺陷网格要求:

Ext.define('CustomApp', {
    extend: 'Rally.app.App',
    launch: function() {
        var that = this;
        var today = new Date().toISOString();
        var features = Ext.create('Rally.data.wsapi.Store', {
            model: 'PortfolioItem/Feature',
            fetch: ['UserStories'],
            filters: [
                {
                    property: 'Release.StartDate',
                    operator: '<=',
                    value: today
                },
                {
                    property: 'Release.ReleaseDate',
                    operator: '>=',
                    value: today
                }
            ]
        });
        features.load().then({
            success: this.loadStories,
            scope: this
        }).then({
            success: this.loadChildStories,
            scope: this
        }).then({
            success: this.loadDefects,
            scope: this
        }).then({
            success:function(results) {
                that.makeGrid(results);
            },
            failure: function(){
                console.log("oh noes!")
            }
        });
    },

    loadStories: function(features){
        console.log("features",features)
        var promises = [];
        _.each(features, function(feature){
            var stories = feature.get('UserStories');
            if (stories.Count > 0) {
                stories.store = feature.getCollection('UserStories',{fetch:['Name','FormattedID','Children','Defects','Feature']});
                promises.push(stories.store.load());
            }
        });
        return Deft.Promise.all(promises);
    },

    loadChildStories: function(stories){
        stories = _.flatten(stories);
        console.log("stories",stories);
        var promises = [];
         _.each(stories, function(story){
            var childStories = story.get('Children');
            if (childStories.Count > 0) {
                childStories.store = story.getCollection('Children',{fetch:['Name','ObjectID','FormattedID','Defects']});
                promises.push(childStories.store.load());
            }
        });
        return Deft.Promise.all(promises);
    },

    loadDefects: function(childStories){
        childStories = _.flatten(childStories);
        console.log("childStories",childStories);
        var promises = [];
         _.each(childStories, function(story){
            var defects = story.get('Defects');
            if (defects.Count > 0) {
                defects.store = story.getCollection('Defects',{fetch:['Name','ObjectID','FormattedID','Requirement','State']});
                promises.push(defects.store.load());
            }
        });
        return Deft.Promise.all(promises);
    },

    makeGrid: function(defects){
        defects = _.flatten(defects);
        console.log('defects', defects);
        var data = [];
        _.each(defects, function(defect){
            data.push(defect.data);
        });


        _.each(data, function(record){
            record.defectsParent = record.Requirement.FormattedID + " " + record.Requirement.Name;
        });
        this.add({
            xtype: 'rallygrid',
            showPagingToolbar: true,
            showRowActionsColumn: true,
            editable: false,
            store: Ext.create('Rally.data.custom.Store', {
                data: data,
                groupField: 'defectsParent',
            }),
            features: [{ftype:'groupingsummary'}],
            columnCfgs: [
                {
                    xtype: 'templatecolumn',text: 'ID',dataIndex: 'FormattedID',width: 100,
                    tpl: Ext.create('Rally.ui.renderer.template.FormattedIDTemplate')
                },
                {
                    text: 'Name',dataIndex: 'Name',
                },
                {
                    text: 'Story',dataIndex: 'Requirement',
                    renderer: function(val, meta, record) {
                        return '<a href="https://rally1.rallydev.com/#/detail/userstory/' + record.get('Requirement').ObjectID + '" target="_blank">' + record.get('Requirement').FormattedID + '</a>';
                    }
                },
            ]
        });
    }
});
于 2014-07-25T17:50:22.260 回答