我通过Ruby使用Rally API(http://developer.help.rallydev.com/ruby-toolkit-rally-rest-api-json)。我想查询Portfolio项目的属性(字段?)。我有工作代码,例如这个工作正常(虽然它似乎显示了名称,而不是ID - 我期待的东西像'T30',但这显示'这是我的倡议的名称'):
pi_query.order = "FormattedID Asc"
通过反复试验,我也看到了
pi_query.order = "Name Asc"
也有效。我的问题:我可以在这里使用什么价值观?我找了几个小时。名称,FormattedID和描述工作;家长没有。我找不到参考文档。
(我正在尝试编写一个自定义报告,显示项目组合项目是一种更易读的方式 - 以我可以打印的某种嵌套方式显示的主题,主动性和功能.Rally中的Portfolio Hierarchy应用程序没有提供可打印的视图,所以我希望为它编写一个快速脚本。我不需要太多,主要是名称,以及这个东西是主题,主动性还是功能。这样的东西:)< / p>
T30 My first theme
I65 The first initiative
F44 The first feature under that
F45 Another feature
I66 Another initiative
T31 My second theme
I67 Yet another initiative
答案 0 :(得分:2)
我找到了。以下是文档的正确链接:
https://rally1.rallydev.com/slm/doc/webservice/
如果您点击左侧的“允许的权利广告”,您将获得一个属性列表。按Ctrl-F并搜索“投资组合”。当您进入标题为“Portfolio Item(非创建类型)”的主标题时,会出现“获取完整对象”和“美化JSON输出”的复选框。检查两者,然后点击下面的“查询”按钮。您将在新窗口中获得对象模型。
在这个新窗口中,您可以看到所有有效的属性。例如,搜索“Parent”,您可以看到Parent哈希的有效值。其中一个键是_refObjectName,它为您提供父节点的名称。
这是一个工作示例,它会查询计划并显示其名称及其父级名称。
require 'rally_api'
config = {:base_url => "https://rally1.rallydev.com/slm"}
config[:username] = "REPLACE"
config[:password] = "REPLACE"
config[:workspace] = "REPLACE"
config[:project] = "REPLACE"
@rally = RallyAPI::RallyRestJson.new(config)
pi_query = RallyAPI::RallyQuery.new()
pi_query.type = "portfolioitem/initiative"
pi_query.fetch = "Name,FormattedID,Description,PortfolioItemTypeName,Parent"
pi_query.project_scope_up = true
pi_query.project_scope_down = true
pi_query.order = "FormattedID Asc"
pi_results = @rally.find(pi_query)
pi_results.each do |result|
parent_name = (result.Parent == nil)? "" : "has parent \"" + result.Parent["_refObjectName"] + "\""
puts result.FormattedID + " " + result.Name + " " + parent_name
end
答案 1 :(得分:1)
这是一个更完整的版本,它以缩进输出的形式显示主题,主动性和功能。可能有一种更有效的输出方式,但这种方法确实可以为我的项目生成正确的输出。
require 'rally_api'
config = {:base_url => "https://rally1.rallydev.com/slm"}
config[:username] = "REPLACE"
config[:password] = "REPLACE"
config[:workspace] = "REPLACE"
config[:project] = "REPLACE"
@rally = RallyAPI::RallyRestJson.new(config)
pi_query = RallyAPI::RallyQuery.new()
pi_query.project_scope_up = false
pi_query.project_scope_down = true
pi_query.order = "FormattedID Asc"
# Themes
pi_query.type = "portfolioitem/theme"
pi_query.fetch = "Name,FormattedID"
pi_results = @rally.find(pi_query)
themes = []
pi_results.each { |theme| themes << [ theme.FormattedID, theme.Name ] }
# Initiatives
pi_query.type = "portfolioitem/initiative"
pi_query.fetch = "Name,FormattedID,Parent"
pi_results = @rally.find(pi_query)
initiatives = []
pi_results.each do |initiative|
parent_name = (initiative.Parent == nil)? "" : initiative.Parent["_refObjectName"]
initiatives << [ initiative.FormattedID, initiative.Name, parent_name]
end
# Features
pi_query.type = "portfolioitem/feature"
pi_query.fetch = "Name,FormattedID,Parent"
pi_results = @rally.find(pi_query)
features = []
pi_results.each do |feature|
parent_name = (feature.Parent == nil)? "" : feature.Parent["_refObjectName"]
features << [ feature.FormattedID, feature.Name, parent_name]
end
# Output
themes.each do |theme|
puts theme[0] + " " + theme[1]
initiatives.each do |initiative|
if (initiative[2] == theme[1])
puts " " + initiative[0] + " " + initiative[1]
features.each do |feature|
if (feature[2] == initiative[1])
puts " " + feature[0] + " " + feature[1]
end
end
end
end
end