Вопросы API TFS 11 2012: количество запросов и выходные дни

Мне нужно сделать несколько вещей с помощью TFS API. Среди них я должен прочитать информацию о планировании ресурсов для спринтов каждого проекта для отображения в пользовательском интерфейсе WPF.

Пометка вдоль это руководство, теперь у меня есть следующий метод:

    private TfsTeamService _teamService;
    private ICommonStructureService4 _structureService;
    TeamSettingsConfigurationService _teamSettingsConfigurationService;

    public void GetUserIterationAssignments(IList<ProjectInfo> projects)
    {
        foreach (ProjectInfo project in projects)
        {
            Console.WriteLine(project.Name);

            TeamFoundationTeam team = _teamService.QueryTeams(project.Uri).First();
            IList<Guid> teamGuids = new List<Guid>() { team.Identity.TeamFoundationId };
            TeamConfiguration config = _teamSettingsConfigurationService.GetTeamConfigurations(teamGuids).FirstOrDefault();
            if (config != null)
            {
                foreach (string nodePath in config.TeamSettings.IterationPaths)
                {
                    var projectNameIndex = nodePath.IndexOf("\\", 2);
                    var fullPath = nodePath.Insert(projectNameIndex, "\\Iteration");
                    var nodeInfo = _structureService.GetNodeFromPath(fullPath);
                    if (nodeInfo.StartDate != null &&
                       nodeInfo.FinishDate != null)
                    {
                        foreach (TeamFoundationIdentity member in team.GetMembers(_collection, MembershipQuery.Direct))
                        {
                            Console.WriteLine("{0} is in assigned to {1} from {2}", 
                                                    member.DisplayName, 
                                                    nodeInfo.Name,
                                                    nodeInfo.StartDate,
                                                    nodeInfo.FinishDate);
                        }
                    }
                }
            }
        }
    }

Что мне нужно напечатать в консоль (конечно, только для этого примера), так это большую часть информации, отображаемой в представлении «Емкость»:

введите здесь описание изображения

Чтобы быть более точным, мне нужно получить доступ

  • суточная производительность
  • выходные (участник)
  • выходные (группа)

Есть идеи, как это сделать?


person Sebastian Edelmeier    schedule 21.12.2012    source источник
comment
Попробуйте blogs.microsoft.co.il/blogs /shair/архив/теги/TFS+API/   -  person MrHinsh - Martin Hinshelwood    schedule 01.01.2013
comment
Да я уже пробовал. Приведенный выше код основан на работе Шай. К сожалению, он не входит в дееспособность.   -  person Sebastian Edelmeier    schedule 02.01.2013
comment
Не уверен, что вы нашли ответ на этот вопрос или нет, но я немного покопался и обнаружил, что в базе данных коллекции в таблицах tbl_TeamConfigurationCapacity и tbl_TeamConfigurationCapacityDaysOffRange можно найти вместимость и выходные дни (как для участников, так и для команд). Однако мне не удалось найти его в TFS SDK :(   -  person James Tupper    schedule 26.03.2013
comment
Спасибо, Джеймс, я уже нашел их. Вы, кажется, правы насчет API, какой позор....   -  person Sebastian Edelmeier    schedule 27.03.2013


Ответы (3)


Эти значения доступны только из серверной объектной модели (на данный момент нет эквивалентной клиентской объектной модели). Все интерфейсы и объекты сделаны Internal, поэтому даже на сервере вы не можете получить доступ к этим значениям.

internal TeamCapacity GetTeamIterationCapacity(Guid teamId, Guid iterationId);

Тип объявления: Microsoft.TeamFoundation.Server.WebAccess.WorkItemTracking.Common.DataAccess.TeamConfigurationComponent

Сборка: Microsoft.TeamFoundation.Server.WebAccess.WorkItemTracking.Common, Version=12.0.0.0

На данный момент единственный способ получить данные — через службу json (/tfs/{ProjectCollection}/{Team Project}/_api/_teamcapacity/updateteamcapacity/{Team}/{Iteration/Path}?__v=4), которую использует страница Team Capacity, или напрямую из базы данных ProjectCollection из таблиц, упомянутых Джеймсом Таппером.

Похоже, что служба json использует проверку запроса, что затрудняет ее использование из любой внешней системы.

Обязательный отказ от ответственности:

Серверные базы данных TFS не предназначены для расширения, любые прямые запросы к ним не поддерживаются, и модель может изменяться без предварительного уведомления даже между пакетами обновлений. Прямые запросы к базам данных TFS не поддерживаются. Изменение значений в базах данных TFS с помощью любых других средств, кроме официального API, приведет к тому, что ваш сервер TFS перейдет в неподдерживаемое состояние и может вызвать серьезные проблемы при последующем обновлении до более новой версии.

person jessehouwing    schedule 24.01.2014
comment
спасибо, Джесси, это означает - пока - ничего нового в этой части. - person Sebastian Edelmeier; 24.01.2014
comment
Просто подумал, что я бы добавил в качестве ответа на данный момент. - person jessehouwing; 24.01.2014
comment
вы правы, поэтому, хотя новые версии TFS могут добавлять дополнительные функции в клиентскую объектную модель, этот ответ останется верным для текущих версий. - person Sebastian Edelmeier; 25.01.2014

Это не поддерживаемый подход, и он может сломаться в будущем, если вы обновитесь до более новой версии TFS, но если вы хотите только читать данные, вы можете перейти непосредственно к базе данных SQL для вашей TFS. сервер.

Конкретные значения, которые вам нужны, находятся в (при условии, что вы используете DefaultCollection)

  • [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacity]
  • [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacityDaysOffRange]

Они имеют ссылки на итерации и пользователей через GUID.

  • GUID итерации можно найти в [Tfs_Warehouse].[dbo].[DimIteration]
  • GUID пользователя можно найти, выполнив поиск по имени пользователя/SSID в [Tfs_Configuration].[dbo].[tbl_Identity].

Вот краткий пример, который запрашивает мою производительность в часах в день для нашей январской итерации:

select Capacity from [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacity] as _cap
inner join [Tfs_Configuration].[dbo].[tbl_Identity] as _user
    on _user.[Id] = _cap.[TeamMemberId]
inner join [Tfs_Warehouse].[dbo].[DimIteration] as _iter
    on _iter.[IterationGUID] = _cap.[IterationId]
        where _iter.[IterationPath]='\Code\Current\401-Jan'
        and _user.[DisplayName]='Williams, Jason'

Вы можете использовать аналогичный подход для чтения диапазонов дат начала и окончания каждого праздника из файла tbl_TeamConfigurationCapacityDaysOffRange. Однако это несколько сложнее, так как есть выходные дни команды и выходные дни индивидуально.

Вот запрос, который я использую для достижения этой цели. (Кажется, работает, хотя после 6 месяцев работы для всех наших пользователей один из наших пользователей внезапно исчез из запроса, и я обнаружил, что без видимой причины мне теперь нужно искать его идентификатор в таблице IdentityMap. Радости реверс-инжиниринга из недокументированных источников :-(

select [StartTime],[EndTime] from [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacityDaysOffRange] as _cap1
    inner join [Tfs_Warehouse].[dbo].[DimIteration] as _iter1
      on _iter1.[IterationGUID] = _cap1.[IterationId]
          where _iter1.[IterationPath]='\Code\Current\401-Jan'
              and _cap1.[TeamMemberId]='00000000-0000-0000-0000-000000000000'
union
    select [StartTime],[EndTime] from [Tfs_DefaultCollection].[dbo].[tbl_TeamConfigurationCapacityDaysOffRange] as _cap2
        inner join [Tfs_DefaultCollection].[dbo].[tbl_IdentityMap] as _map
            on _map.[localId] = _cap2.[TeamMemberId]
        inner join [Tfs_Configuration].[dbo].[tbl_Identity] as _user2
            on _user2.[Id] = _map.[masterId]
        inner join [Tfs_Warehouse].[dbo].[DimIteration] as _iter2
            on _iter2.[IterationGUID] = _cap2.[IterationId]
                where _iter2.[IterationPath]='\Code\Current\401-Jan'
                    and (_user2.[DisplayName]='Williams, Jason')

Вам просто нужно будет заменить соответствующие значения для двух мест, в которых упоминается путь итерации и имя пользователя для запроса.

person Jason Williams    schedule 31.01.2014

Есть еще одна неподдерживаемая возможность. Посмотрите на сайте http://{tfs-server}:8080/tfs/DefaultCollection/{project}/_backlogs/Capacity/{iterationpath}. Данные позади содержат информацию о емкости в формате JSON (данные о емкости команды).

https://onedrive.live.com/redir?resid=88F0C013A4398D9B%21129

person user3794016    schedule 01.07.2014
comment
Очень полезно. 1 изменение заключалось в том, чтобы сделать поле емкости десятичным - person aqwert; 16.07.2014