根据用户故事发布的所有缺陷的客户列表报告

时间:2015-07-30 21:52:35

标签: rally

我希望获得一个报告或自定义列表,其中显示缺陷环境为Production的所有缺陷,并且父/相关用户素材的版本与自定义屏幕上的版本下拉列表相匹配。

我发现这个故事并且我认为它很接近,但不确定如何将其链接到发布下拉列表,也不确定如何显示与缺陷相关的用户故事。

RALLY: Determine a parent User Story's release

输出应该是用户故事ID和名称以及缺陷ID和名称以及可能还有一些列。

我知道我可以通过API执行此操作,但是试图查看现有Rally工具中是否还有其他方法。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你好运!我没有像我想的那样编写应用程序,今天下午我有空闲时间,所以我为你扯了一些东西。只需创建一个发布范围的自定义页面,并将此代码添加到该页面上的自定义HTML应用程序中。

该应用程序包含一个字段选择器,用于更改显示的字段集。我从一些有用的开始做了最好的猜测。它还包括一个控件,以启用打印和导出。

<!DOCTYPE html>
<html>
<head>
<title>DefectsByStoryInRelease</title>

<script type="text/javascript" src="/apps/2.0/sdk.js"></script>

<script type="text/javascript">
    Rally.onReady(function () {
        Ext.define('DefectsByStoryInRelease', {
            extend: 'Rally.app.TimeboxScopedApp',
            componentCls: 'app',

            scopeType: 'release',

            onScopeChange: function () {
                Ext.create('Rally.data.wsapi.TreeStoreBuilder').build({
                    models: ['defect'],
                    autoLoad: true,
                    enableHierarchy: true,
                    filters: this._getFilters()
                }).then({
                    success: this._onStoreBuilt,
                    scope: this
                });
            },

            _onStoreBuilt: function (store) {
                var modelNames = ['defect'],
                        context = this.getContext(),
                        gridBoard = this.down('rallygridboard');

                if (gridBoard) {
                    gridBoard.destroy();
                }

                this.add({
                    xtype: 'rallygridboard',
                    height: this.getHeight() - ((this.getHeader() && this.getHeader().getHeight()) || 0),
                    context: context,
                    modelNames: modelNames,
                    toggleState: 'grid',
                    stateful: false,
                    plugins: [
                        {
                            ptype: 'rallygridboardfieldpicker',
                            headerPosition: 'left',
                            modelNames: modelNames,
                            stateful: true,
                            stateId: context.getScopedStateId('fields')
                        },
                        {
                            ptype: 'rallygridboardactionsmenu',
                            menuItems: [
                                {
                                    text: 'Export...',
                                    handler: function () {
                                        window.location = Rally.ui.grid.GridCsvExport.buildCsvExportUrl(
                                                this.down('rallygridboard').getGridOrBoard());
                                    },
                                    scope: this
                                },
                                {
                                    text: 'Print...',
                                    handler: function () {
                                        Ext.create('Rally.ui.grid.TreeGridPrintDialog', {
                                            grid: this.down('rallygridboard').getGridOrBoard(),
                                            treeGridPrinterConfig: {
                                                largeHeaderText: 'Defects'
                                            }
                                        });
                                    },
                                    scope: this
                                }
                            ],
                            buttonConfig: {
                                iconCls: 'icon-export'
                            }
                        }
                    ],
                    gridConfig: {
                        store: store,
                        columnCfgs: [
                            'Name',
                            'Requirement',
                            'State',
                            'Priority',
                            'Severity'
                        ]
                    }
                });
            },

            _getFilters: function () {
                var scope = this.getContext().getTimeboxScope(),
                        release = scope.getRecord(),
                        filters = [{
                            property: 'Environment',
                            value: 'Production'
                        }];

                if (release) {
                    filters = filters.concat([

                        {
                            property: 'Requirement.Release.Name',
                            value: release.get('Name')
                        },
                        {
                            property: 'Requirement.Release.ReleaseStartDate',
                            value: release.get('ReleaseStartDate')
                        },
                        {
                            property: 'Requirement.Release.ReleaseDate',
                            value: release.get('ReleaseDate')
                        }
                    ]);
                } else {
                    filters.push({
                        property: 'Requirement.Release',
                        value: null
                    });
                }

                return filters;
            }
        });


        Rally.launchApp('DefectsByStoryInRelease', {
            name: "DefectsByStoryInRelease",
            parentRepos: ""
        });

    });
</script>


<style type="text/css">
    .app {
        /* Add app styles here */
    }

</style>