Code Snippet
- using Microsoft.TeamFoundation.Client;
- using Microsoft.TeamFoundation.Framework.Client;
- using Microsoft.TeamFoundation.Framework.Common;
- using Microsoft.TeamFoundation.ProcessConfiguration.Client;
- using Microsoft.TeamFoundation.Server;
- using Microsoft.TeamFoundation.WorkItemTracking.Client;
- using RazorTemplateingSample.RazorTemplating;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.IO;
- using System.Reflection;
- using System.Xml;
- namespace Centric.MVV.Tools.Reporting
- {
- public class SprintDocumentation
- {
- private readonly TfsTeamProjectCollection tfsServer;
- private readonly WorkItemStore tfsStore;
- private readonly Project tfsSProject;
- private TfsTeamService teamService;
- private TswaClientHyperlinkService hyperLinkService;
- private List<TeamFoundationTeam> allTeams;
- public delegate void DoLog(String aMessage, bool isError);
- public event DoLog Log;
- private string templatesPath;
- private void OnLog(String aMessage, bool isError)
- {
- if (Log != null)
- Log(aMessage, isError);
- }
- //public string[] ValidApplications { get; set; }
- private IRazorTemplateGenerator generator;
- public SprintDocumentation(string server, string project, string templatesPath)
- {
- tfsServer = new TfsTeamProjectCollection(new Uri(server));
- tfsStore = (WorkItemStore)tfsServer.GetService(typeof(WorkItemStore));
- tfsSProject = tfsStore.Projects[project];
- hyperLinkService = tfsServer.GetService<TswaClientHyperlinkService>();
- teamService = tfsServer.GetService<TfsTeamService>();
- this.templatesPath = templatesPath;
- }
- public List<Team> GetTeams()
- {
- List<Team> teams = new List<Team>();
- allTeams = teamService.QueryTeams(tfsSProject.Uri.AbsoluteUri) as List<TeamFoundationTeam>;
- allTeams.ForEach(t => teams.Add(new Team { Name = t.Name }));
- return teams;
- }
- public List<TeamMember> GetTeamMembers(string teamName)
- {
- List<TeamFoundationTeam> allTeams = teamService.QueryTeams(tfsSProject.Uri.AbsoluteUri) as List<TeamFoundationTeam>;
- var team = allTeams.Find(t => t.Name.Contains(teamName));
- TeamFoundationIdentity[] tfsMembers = team.GetMembers(tfsServer, MembershipQuery.Direct);
- List<TeamMember> members = new List<TeamMember>();
- for (int i = 0; i < tfsMembers.Length; i++)
- {
- members.Add(new TeamMember { Name = tfsMembers[i].DisplayName });
- }
- return members;
- }
- public List<WorkItemInfo> GetIterationWorkItems(string iteration, bool getChildren)
- {
- var workItems = GetWorkItemInfoListForIteration(iteration);
- List<WorkItemInfo> wis = new List<WorkItemInfo>();
- for (int i = 0; i < workItems.Count; i++)
- {
- WorkItem wi = workItems[i];
- WorkItemInfo wii = ProcessWorkItem(wi, getChildren);
- if (wii.Type != WorkItemType.Task)
- {
- wis.Add(wii);
- }
- }
- wis.Sort((x, y) => x.Priority.CompareTo(y.Priority));
- return wis;
- }
- private WorkItemCollection GetWorkItemInfoListForIteration(string iterationPath)
- {
- string select = String.Format(„SELECT System.ID FROM workitems WHERE [Iteration Path] = ‘” + iterationPath + „‘”);
- return tfsStore.Query(select);
- }
- private int ProcessWorkItemField(WorkItem wi, int fieldID, bool original, int defaultValue)
- {
- var field = wi.Fields.TryGetById(fieldID);
- if (field != null)
- {
- if (original)
- {
- return field.OriginalValue == null ? defaultValue : Int32.Parse(field.OriginalValue.ToString());
- }
- else
- {
- return field.Value == null ? defaultValue : Int32.Parse(field.Value.ToString());
- }
- }
- return defaultValue;
- }
- private string ProcessWorkItemField(WorkItem wi, int fieldID, bool original, string defaultValue)
- {
- var field = wi.Fields.TryGetById(fieldID);
- if (field != null)
- {
- if (original)
- {
- return field.OriginalValue == null ? defaultValue : field.OriginalValue.ToString();
- }
- else
- {
- return field.Value == null ? defaultValue : field.Value.ToString();
- }
- }
- return defaultValue;
- }
- private string GetWorkItemDescription(WorkItem wi, WorkItemType type)
- {
- string desc = String.Empty;
- switch (type)
- {
- case WorkItemType.Bug: desc = wi.Fields.TryGetById(10191).Value.ToString(); break;
- case WorkItemType.ChangeRequest: desc = wi.Fields.TryGetById(52).Value.ToString(); break;
- case WorkItemType.ProductBacklogItem:
- case WorkItemType.Task:
- case WorkItemType.TestCase:
- default: desc = wi.Fields.TryGetById(10212).Value.ToString(); break;
- }
- return desc;
- }
- private WorkItemInfo ProcessWorkItem(WorkItem wi, bool getChildren)
- {
- WorkItemInfo wii = new WorkItemInfo();
- WorkItemType type = (WorkItemType)Enum.Parse(typeof(WorkItemType), wi.Type.Name.Replace(” „, String.Empty));
- wii.ID = wi.Id;
- wii.Type = type;
- wii.TFSUrl = hyperLinkService.GetWorkItemEditorUrl(wii.ID).AbsoluteUri;
- wii.Title = wi.Title;
- wii.Description = GetWorkItemDescription(wi, type);
- wii.CreatedBy = wi.CreatedBy;
- wii.CreatedDate = wi.CreatedDate;
- wii.AssignedTo = ProcessWorkItemField(wi, 24, false, String.Empty);
- wii.Effort = ProcessWorkItemField(wi, 10213, false, 0);
- wii.OriginalEffort = ProcessWorkItemField(wi, 10213, true, 0);
- wii.Priority = ProcessWorkItemField(wi, 10211, false, 0);
- wii.OriginalPriority = ProcessWorkItemField(wi, 10211, true, 0);
- wii.AcceptanceCriteria = ProcessWorkItemField(wi, 10214, false, String.Empty);
- wii.State = wi.State;
- if (wi.Rev > 0)
- {
- wii.WorkedOn = new List<string>();
- foreach (Revision revision in wi.Revisions)
- {
- string val = revision.Fields[„Assigned To”].Value.ToString();
- if (!String.IsNullOrEmpty(val) && !wii.WorkedOn.Contains(val))
- {
- wii.WorkedOn.Add(val);
- }
- }
- }
- if (getChildren)
- {
- if (wi.WorkItemLinks.Count > 0)
- {
- wii.ChildWorkItems = new List<WorkItemInfo>();
- }
- foreach (WorkItemLink link in wi.WorkItemLinks)
- {
- if (link.BaseType == BaseLinkType.WorkItemLink && link.LinkTypeEnd.Name == „Child”)
- {
- WorkItem linkedWi = tfsStore.GetWorkItem(link.TargetId);
- wii.ChildWorkItems.Add(ProcessWorkItem(linkedWi, getChildren));
- }
- }
- }
- return wii;
- }
- public ProjectIterations GetAllIterations()
- {
- ProjectIterations result = new ProjectIterations();
- var configSvc = tfsServer.GetService<TeamSettingsConfigurationService>();
- var configs = configSvc.GetTeamConfigurationsForUser(new[] { tfsSProject.Uri.ToString() });
- ICommonStructureService4 css = tfsServer.GetService<ICommonStructureService4>();
- NodeInfo[] structures = css.ListStructures(tfsSProject.Uri.ToString());
- NodeInfo iterations = structures[0];
- XmlElement iterationTree = css.GetNodesXml(new[] { iterations.Uri }, true);
- BuildIterations(iterationTree.ChildNodes, css, ref result);
- result.Sort((x, y) => y.StartDate.Value.CompareTo(x.StartDate.Value));
- return result;
- }
- private void BuildIterations(XmlNodeList iterationsTree, ICommonStructureService4 css, ref ProjectIterations iterations)
- {
- foreach (XmlNode item in iterationsTree)
- {
- if (item.OuterXml.Contains(„YOUR_TEAM_NAME”))
- {
- var nodeId = GetNodeID(item.OuterXml);
- var nodeInfo = css.GetNode(nodeId);
- if (nodeInfo.StartDate != null && nodeInfo.FinishDate != null)
- {
- ProjectIteration pi = new ProjectIteration();
- pi.Name = nodeInfo.Name;
- pi.StartDate = nodeInfo.StartDate;
- pi.EndDate = nodeInfo.FinishDate;
- pi.IterationPath = nodeInfo.Path.Replace(„\\Iteration”, „”).TrimStart(‘\\’);
- iterations.Add(pi);
- }
- if (item.ChildNodes.Count > 0)
- {
- BuildIterations(item.ChildNodes, css, ref iterations);
- }
- }
- }
- }
- private string GetNodeID(string xml)
- {
- var first = „NodeID=\””;
- var start = xml.IndexOf(first) + first.Length;
- var end = xml.IndexOf(„\””, start);
- return xml.Substring(start, (end – start));
- }
- public List<string> GetTemplates()
- {
- List<string> templates = new List<string>();
- FileInfo[] files = new DirectoryInfo(templatesPath).GetFiles(„*.html”);
- foreach (FileInfo file in files)
- {
- templates.Add(file.Name.Replace(„.html”, String.Empty));
- }
- return templates;
- }
- public void InitTemplates()
- {
- if (generator == null)
- {
- generator = new RazorTemplateGenerator();
- FileInfo[] files = new DirectoryInfo(templatesPath).GetFiles(„*.html”);
- foreach (FileInfo file in files)
- {
- string t = file.OpenText().ReadToEnd();
- generator.RegisterTemplate<SprintDataModel>(file.Name.Replace(„.html”, String.Empty), t);
- }
- generator.CompileTemplates();
- }
- }
- public string Generate(string template, SprintDataModel model)
- {
- InitTemplates();
- return generator.GenerateOutput(model, template);
- }
- }
- }
Pingback: How to connect to TFS from C# — Felix Vătuiu