如何在CA Agile Central(AKA Rally)自定义应用程序中使用其ObjectID获取单个对象详细信息?
我有一个从回看API获取数据的应用程序。我在数据中获得User ObjectID,但是我希望获取用户的DisplayName而不是ObjectID。拉力赛回顾API不允许水合用户字段,所以在加载回顾API数据时我不能拥有用户名。 我试图用用户对象ID过滤器创建商店来获取用户名,但我没有得到用户的名称,直到回顾API数据加载完成。到回顾API数据加载完成时,我的数据操作也完成了。所以在第一次加载后加载用户名是没有用的。我尝试将Store的异步属性设置为false/true,但没有成功。 任何方式来完成这与拉力SDK 2.0? 这里是代码块 -如何在CA Agile Central(AKA Rally)自定义应用程序中使用其ObjectID获取单个对象详细信息?
//Lookback call
_getStoriesByUser: function (user_story_ids, user_oids, user_story_state, users) {
this.acceptedByTM = [];
var scheduleStates = [];
scheduleStates.push('Accepted');
scheduleStates.push('Released to Prod');
var deferred = Ext.create('Deft.Deferred');
var me = this;
console.time("FetchingLBData");
var snapshotStore = Ext.create('Rally.data.lookback.SnapshotStore', {
"context": this.getContext().getDataContext(),
"fetch": ["ScheduleState", "_User", "_PreviousValues.ScheduleState"],
"hydrate": ["ScheduleState"],
"find": {
"ObjectID": { "$in": user_story_ids },
//"_User": { "$in": user_oids },
"_TypeHierarchy": "HierarchicalRequirement",
"ScheduleState": { "$in": scheduleStates },
"_PreviousValues.ScheduleState": { "$ne": null },
"Children": null
},
"sort": { "_ValidFrom": -1 }
});
snapshotStore.load({
callback: function (records, operation) {
if (operation.wasSuccessful()) {
console.timeEnd("FetchingLBData");
me.logger.log("LB US Count >>", records.length, records)
var total_us_accepted_by_tm = 0;
var tmAcceptedUS = 0;
var nontmAcceptedUS = 0;
var tm_accepted = [];
Ext.Array.each(user_story_state, function (uss) {
Ext.Array.each(records, function (rec) {
if ((rec.get('ObjectID') == uss.ObjectID && rec.get('ScheduleState') == 'Accepted') && (uss.ScheduleState == 'Accepted' || uss.ScheduleState == 'Released to Prod')) {
total_us_accepted_by_tm += 1;
tm_accepted.push({ ObjectID: rec.get('ObjectID'), UserObjectID: rec.get('_User') });
var userName;
//userName = me._fetchUserName(rec.get('_User')).value;
me._fetchUserName(rec.get('_User')).then({
success: function (records) {
userName = records[0].get('DisplayName')
},
failure: function (error) {
console.log('Error in Execution:', error)
}
}).always(function() {
console.log('Waiting for Update!');
});
//userName = rec.get('_User').DisplayName;
console.log('Accepted By Name: ', userName);
me.acceptedByTM.push({ ObjectID: rec.get('ObjectID'), UserObjectID: userName });
return false;
}
});
});
deferred.resolve(me.acceptedByTM);
} else {
deferred.reject('Problem querying lookback');
}
},
scope: me
});
return deferred;
},
//Get User Details for a given user
_fetchUserName: function (userObjId) {
var me = this;
var userName;
var userDetails;
var deferred = Ext.create('Deft.Deferred');
me.logger.log("Fetching User Information for User >>", userObjId);
var userFilter = Ext.create('Rally.data.wsapi.Filter', {
property: 'ObjectID',
value: userObjId
});
userDetails = Ext.create('Rally.data.wsapi.Store', {
model: 'User',
fetch: ['ObjectID', 'DisplayName'],
filters: userFilter,
limit: 1,
pageSize: 1
});
userDetails.load({
scope: this,
callback: function (records, operation, success) {
console.log("Operation Status: ", operation.synchronous);
if (success) {
//userName = records[0].get('DisplayName');
deferred.resolve(records);
} else {
deferred.reject(Ext.String.format("Error getting {0} count for {1}: {2}", 'User', userFilter.toString(), operation.error.errors.join(',')));
}
}
});
return deferred.promise;
}
为了简化事情,我很可能只是加载所有用户前面的和WSAPI通过OBJECTID在地图上标注他们。这样您就可以获得所有数据,并且可以在处理回溯快照时直接进行查找。
事情是这样的:
Ext.define('CustomApp', {
extend: 'Rally.app.App',
componentCls: 'app',
launch: function() {
this._loadUsersFromWsapi().then({
success: function (users) {
this.usersByOid = _.indexBy(users, function(user) {
return user.getId();
});
this._loadSnapshotData();
},
scope: this
});
},
_loadUsersFromWsapi: function() {
return Ext.create('Rally.data.wsapi.Store', {
model: 'user',
limit: Infinity,
pageSize: 2000,
fetch: ['ObjectID']
}).load();
},
_loadSnapshotData: function() {
//Now in here for any given snapshot you can get the user
//information by looking it up in the this.usersByOid map
var userName = this._usersByOid[userObjectID].get('_refObjectName');
}
});
非常感谢凯尔。它像一个魅力。但是,它会影响应用程序的性能,因为我们正在获取所有用户数据,这正是我所需要的。有没有其他方式可以用Lookback获取用户名?我知道我们无法保护用户字段,但有一些地方我们可以通过其对象ID获取所需的用户名,以保持应用程序的最佳性能。 – Lokesh
有没有办法通过回头来获取它。你可以做的是使用Deft.Promise.all并行回溯和用户请求,然后在成功处理程序中将数据重新拼接在一起,而不是像上面的代码那样连续地创建请求。^^ –
你能分享你到目前为止的代码?这样做不应该太难。一旦你的回顾商店被加载,你只需要遍历数据并从wsapi加载用户。这听起来像你已经有很多,也许只是需要一些帮助管理所有的异步代码? –
凯尔你好,我已经在原始文章中包含了代码。 – Lokesh
@KyleMorse,你有没有找到任何解决方案?我尝试通过在应用程序的加载中包含Deft.Promise.All将活动用户和禁用用户加载到本地变量中。但是,在完成回顾数据加载后,用户会被加载。 – Lokesh