2012-07-13 3 views
1

Я пытался получить некоторую информацию, такую ​​как имя пользователя, отображаемое имя, роль и емкость в зависимости от итерации. Запрос возвращает часть результата для указанного проекта, но не все для выбранной итерации. Я не уверен, что вызывает это. Вы можете найти мою работу до сих пор ниже.Ралли: информация о статусе команды не получает всю необходимую информацию

function iterationSelected(dropdown, eventArgs) { 

    console.log("Iteration Selected Callback"); 
    if(table != null){ 
     table.destroy(); 
    } 


    var queryByUser = { 
     key: "teamDataByUser", type: "User", 
     fetch: 'DisplayName,UserName', 
     query: '(ObjectID > 0)' 
    }; 
    rallyDataSource.findAll(queryByUser, queryTeamInformation); 


} 

function queryTeamInformation(results){ 
    console.log(results.teamDataByUser.length); 
    for(var i=0;i<results.teamDataByUser.length;i++){ 
     console.log(results.teamDataByUser[i].UserName + " " + results.teamDataByUser[i].DisplayName); 
    } 


    console.log(iterationDropdown.getSelectedName()); 
    var queryByUserName = { 
     key: "teamData", type: "UserIterationCapacity", 
     project: null, 
     fetch: "Capacity,User,Role,EmailAddress,DisplayName,UserName", 
     query: '((Iteration.Name = ' + '"' + iterationDropdown.getSelectedName() + '") AND (Project = /project/5564891653))' 
    }; 
    rallyDataSource.findAll(queryByUserName, processResults); 
    console.log("GH"); 

} 

function processResults(results){ 
    rally.forEach(results.teamData, 
    function(teamData) { 
     console.log(teamData._ref); 

    }); 
    console.log(results.teamData.length); 


     var tableDiv = document.getElementById('table'); 
     var config = { columns: 
      [{key: 'emailaddress', header: 'Team Member Email', width: 200}, 
      {key: 'displayname', header: 'Display name'}, 
      {key: 'username', header: 'User name'}, 
      {key: 'role', header: 'Role'}, 
      {key: 'cap', header: 'Capacity'}] }; 

     if(table != null){ 
      console.log("Got here"); 
      table.destroy(); 
     } 
     table = new rally.sdk.ui.Table(config); 
     for(var i=0;i<results.teamData.length;i++){ 

      var rowInfo = {'emailaddress': results.teamData[i].User.DisplayName, 'displayname': results.teamData[i].User.UserName, 'username': results.teamData[i].User.EmailAddress, 'role' : results.teamData[i].User.Role, 'cap' : results.teamData[i].Capacity}; 
      table.addRow(rowInfo); 
     } 



     table.display(tableDiv); 


} 



//======================================================================================================================== 
/* 
* Initializes all the page elements 
*/ 
function initPage() { 

    rallyDataSource = new rally.sdk.data.RallyDataSource('5410787910', '5948174836', 'false', 'true'); 

    var config = { label : "Select an iteration " }; 
    iterationDropdown = new rally.sdk.ui.IterationDropdown(config, rallyDataSource); 
    iterationDropdown.display("aDiv", iterationSelected); 
} 
rally.addOnLoad(initPage); 
+1

Возможно, вы немного угадали, исходя из вашего предыдущего сообщения, что вы хотите показать сводку информации о мощности для всех членов определенной команды для выбранного Спринта? И вы видите данные только для некоторых членов команды, но не для всех людей в конкретной команде, представляющей интерес? Если мои догадки о вашем желаемом выходе правильные - это, вероятно, потому, что вы запрашиваете UserIterationCapacity, который слеп к членству в команде. –

+1

I.E., если информация о емкости не определена вообще для конкретного члена команды, то нет объекта UserIterationCapacity, соответствующего вашему поиску, и ваш запрос не вернет никаких результатов для этого пользователя. –

+0

Спасибо Оценка за информацию. У вас есть хоть какой-то подход для достижения возможности для пользователя в зависимости от итерации без использования UserIterationCapacity? – user1133324

ответ

1

ОК - Я написал пример, который, на мой взгляд, иллюстрирует, что нужно, чтобы добраться туда, куда вы хотите отправиться. Он делает это, выполняя два запроса в массиве queryConfig: один для Пользователей и другой для UserIterationCapacity для Итерации, представляющей интерес. Тогда, в функции processResults, код создает три хэшей:

  • teamMembersByTeamName: строка членов команды для каждого проекта, hashkey: Team/проекта Имя
  • myTeamList: содержит пользовательские данные от пользователей (1-й) запрос, отобран для команды интереса, hashkey: UserName
  • userIterationCapacityByUser: содержит UserIterationCapacity данные из 2-го запроса, hashkey: UserName

Наконец, код делает кросс-прогулка по нику повторно конструкт емкости данные для всех членов TeamMembers, даже если у них нет мощности, определенной для Sprint. Если это так, Емкость отображается как «Н/Д».

Вам нужно будет настроить переменные workspaceOID, projectOID и myTeamSlashProjectName, чтобы заставить это работать в вашей среде. Вы, вероятно, захотите настроить и настроить - это всего лишь пример грубого кода. Но, надеюсь, достаточно, чтобы проиллюстрировать эту концепцию.

<!-- Copyright (c) 2012 Rally Software Development Corp. All rights reserved --> 
    <html> 
    <head> 
     <title>Team Capacity Summary Example</title> 
     <meta name="Name" content="App Example: Team Capacity Summary" /> 
     <meta name="Version" content="1.31" /> 
     <meta name="Vendor" content="Rally Labs" /> 

     <script type="text/javascript" src="https://rally1.rallydev.com/apps/1.31/sdk.js"></script> 
     <script type="text/javascript"> 

     var rallyDataSource = null; 
     var iterationDropdown = null; 
     var selectedIteration = "Iteration 1"; 
     var workspaceOID = "12345678910"; 
     var projectOID = "12345678911"; 
     var myTeamSlashProjectName = "My Project"; 
     var table; 

     function iterationSelected(dropdown, eventArgs) { 
       var selectedItem = eventArgs.item; 
       selectedIteration = eventArgs.value; 
       runMainQuery(); 
     } 

     function runMainQuery() { 

      var queryConfig = []; 

      var capacityQueryString = '((Iteration.Name = ' + '"' + 
        selectedIteration + 
        '") AND (Project.ObjectID = "' + 
        projectOID + 
        '"))'; 
      console.log(capacityQueryString); 

      queryConfig[0] = { 
       key: "usercapacities", 
       type: "UserIterationCapacity", 
       fetch: "Capacity,User,Role,EmailAddress,DisplayName,UserName", 
       query: capacityQueryString 
      }; 

      queryConfig[1] = { 
       type: "users", 
       key: "userdata", 
       fetch: "UserName,EmailAddress,DisplayName,UserName,UserPermissions,Project,Role,Name,TeamMemberships,Project,Name" 
      };   

      rallyDataSource.findAll(queryConfig, processResults); 

     } 

     function processResults(results) {  

      // Populate a hash of team members by team name 
      var teamMembersByTeamName= new Array(); 

      for (i=0;i<results.userdata.length;i++){ 
       myUser = results.userdata[i]; 
       myUserName = myUser.UserName; 
       myEmailAddress = myUser.EmailAddress; 
       myDisplayName = myUser.DisplayName; 
       myRole = "N/A"; 

       if (myUser.TeamMemberships) { 

        myTeamMemberships = myUser.TeamMemberships; 

        for (j=0;j<myTeamMemberships.length;j++) { 
         thisTeam = myTeamMemberships[j]; 
         thisTeamName = thisTeam.Name; 

         if (!(thisTeamName in teamMembersByTeamName)) { 
          teamMembersByTeamName[thisTeamName] = []; 
         } 

         var dataToPush = new Array(); 
         dataToPush["UserName"] = myUserName; 
         dataToPush["EmailAddress"] = myEmailAddress; 
         dataToPush["DisplayName"] = myDisplayName; 
         dataToPush["Role"] = myRole; 
         dataToPush["Capacity"] = "N/A"; 

         teamMembersByTeamName[thisTeamName].push(dataToPush); 
        } 
       } 
      } 

      // Now populate a hash of User Capacities 

      var userIterationCapacityByUser = new Array(); 

      for (i=0;i<results.usercapacities.length;i++) { 
       thisCapacityObject = results.usercapacities[i]; 
       thisUserName = thisCapacityObject.User.UserName; 
       if (!(thisUserName in userIterationCapacityByUser)) { 

        thisUser = thisCapacityObject.User; 
        thisCapacity = thisCapacityObject.Capacity; 

        userIterationCapacityByUser[thisUserName] = []; 

        var dataToPush = new Array(); 
        dataToPush["UserName"] = thisUser.UserName; 
        dataToPush["EmailAddress"] = thisUser.EmailAddress; 
        dataToPush["DisplayName"] = thisUser.DisplayName; 
        dataToPush["Role"] = thisUser.Role; 
        dataToPush["Capacity"] = thisCapacity; 

        userIterationCapacityByUser[thisUserName].push(dataToPush);    
       } 
      } 

      // Setup and configure the table 
      var tableDiv = document.getElementById('tableDiv'); 
      var tableConfig = { columns: 
       [{key: 'emailaddress', header: 'Team Member Email', width: 200}, 
       {key: 'displayname', header: 'Display name'}, 
       {key: 'username', header: 'User name'}, 
       {key: 'role', header: 'Role'}, 
       {key: 'cap', header: 'Capacity'}] }; 

      if(table != null){ 
       table.destroy(); 
      } 

      table = new rally.sdk.ui.Table(tableConfig);   

      // Finally cross-walk team membership by correlating the data from the two hashes 
      // Grab team list of interest 
      myTeamList = teamMembersByTeamName[myTeamSlashProjectName]; 

      for(i=0;i<myTeamList.length;i++) { 

       myTeamMemberData = myTeamList[i]; 
       myUserNameFromTeamList = myTeamMemberData["UserName"]; 

       // User has capacity information - populate data from that result set 
       if (myUserNameFromTeamList in userIterationCapacityByUser) {     
        myUserDataArray = userIterationCapacityByUser[myUserNameFromTeamList]; 
        myUserData = myUserDataArray[0];    
       } // User doesn't have capacity information - populate data from user query 
       else { 
        myUserData = myTeamMemberData; 
       } 

       var myUserName = myUserData["UserName"]; 
       var myEmailAddress = myUserData["EmailAddress"]; 
       var myDisplayName = myUserData["DisplayName"]; 
       var myRole = myUserData["Role"]; 
       var myCapacity = myUserData["Capacity"]; 

       if (myDisplayName) { 
        thisDisplayName = myDisplayName; 
       } else { 
        thisDisplayName = "N/A"; 
       } 

       var rowInfo = { 
        'emailaddress': myEmailAddress, 
        'displayname': thisDisplayName, 
        'username': myUserName, 
        'role' : myRole, 
        'cap' : myCapacity}; 
       table.addRow(rowInfo); 
      } 

      var tableDiv = document.getElementById("tableDiv");  
      table.display(tableDiv); 
     } 


     function onLoad() { 
      rallyDataSource = new rally.sdk.data.RallyDataSource('__WORKSPACE_OID__', 
                 '__PROJECT_OID__', 
                 '__PROJECT_SCOPING_UP__', 
                 '__PROJECT_SCOPING_DOWN__'); 
      var config = { 
       label : "Select an iteration ", 
       defaultDisplayValue: selectedIteration 
      }; 
      var iterationDropdown = new rally.sdk.ui.IterationDropdown(config, rallyDataSource); 
      iterationDropdown.display("aDiv", iterationSelected); 
     } 

      rally.addOnLoad(onLoad); 

     </script> 
    </head> 
     <body> 
     <div id="aDiv"></div> 
     <div id="tableDiv"></div> 
    </body> 
    </html>