如何在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; 
} 
+0

你能分享你到目前为止的代码?这样做不应该太难。一旦你的回顾商店被加载,你只需要遍历数据并从wsapi加载用户。这听起来像你已经有很多,也许只是需要一些帮助管理所有的异步代码? –

+0

凯尔你好,我已经在原始文章中包含了代码。 – Lokesh

+0

@KyleMorse,你有没有找到任何解决方案?我尝试通过在应用程序的加载中包含Deft.Promise.All将活动用户和禁用用户加载到本地变量中。但是,在完成回顾数据加载后,用户会被加载。 – Lokesh

为了简化事情,我很可能只是加载所有用户前面的和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'); 
    } 
}); 
+0

非常感谢凯尔。它像一个魅力。但是,它会影响应用程序的性能,因为我们正在获取所有用户数据,这正是我所需要的。有没有其他方式可以用Lookback获取用户名?我知道我们无法保护用户字段,但有一些地方我们可以通过其对象ID获取所需的用户名,以保持应用程序的最佳性能。 – Lokesh

+0

有没有办法通过回头来获取它。你可以做的是使用Deft.Promise.all并行回溯和用户请求,然后在成功处理程序中将数据重新拼接在一起,而不是像上面的代码那样连续地创建请求。^^ –