Ejemplo n.º 1
0
        /// <summary>
        /// Gets the data that would normally be in the left-hand menu of Agilefant.
        /// </summary>
        /// <param name="session">The current login session for Agilefant.</param>
        /// <returns>An array of the items in the menu.</returns>
        internal static async Task <AgilefantMenuData[]> GetMenuData(AgilefantSession session)
        {
            var response = await session.Get("ajax/menuData.action");

            response.EnsureSuccessStatusCode();
            var json = await response.Content.ReadAsStringAsync();

            return(JsonConvert.DeserializeObject <AgilefantMenuData[]>(json));
        }
Ejemplo n.º 2
0
        public static async Task <Dictionary <int, AgilefantTeam> > GetTeams(AgilefantSession session)
        {
            var response = await session.Get("ajax/retrieveAllProductsWithStandalone.action");

            response.EnsureSuccessStatusCode();

            var json = await response.Content.ReadAsStringAsync();

            var summaries = JsonConvert.DeserializeObject <AgilefantBacklogProductSummary[]>(json);
            var menu      = await AgilefantMenuData.GetMenuData(session);

            var teams = new Dictionary <int, AgilefantTeam>();

            foreach (var summary in summaries)
            {
                var data = menu.FirstOrDefault(menuData => menuData.Title == summary.Name);
                if (data == null)
                {
                    continue;
                }
                var sprintData = await AgilefantSprint.GetSprints(data.Children[0].Id, session);

                var sprints = sprintData.Select(sprint => new Sprint(sprint.Name, sprint.Description, sprint.Id, sprint.StartDate, sprint.EndTime)).ToList();

                sprints.Sort((a, b) =>
                {
                    var ai = Regex.Match(a.Name, "[0-9]+");
                    var bi = Regex.Match(b.Name, "[0-9]+");
                    if (!ai.Success || !bi.Success)
                    {
                        return(string.Compare(a.Name, b.Name, StringComparison.Ordinal));
                    }
                    return(int.Parse(ai.Value).CompareTo(int.Parse(bi.Value)));
                });
                var sprint0 = Regex.Match(sprints.First().Name, "[0-9]+");
                if (sprint0.Success && int.Parse(sprint0.Value) == 0)
                {
                    sprints.RemoveAt(0);
                }

                var assignees = sprintData[0].Assignees;
                for (var i = 1; i < sprintData.Length && assignees.Length == 0; i++)
                {
                    assignees = sprintData[i].Assignees;    // sprint 0 sometimes does not have assignees
                }

                var name  = summary.Name;
                var match = Regex.Match(name, @"^\s*[0-9]+\s*[.:]");
                if (match.Success)
                {
                    name = name.Substring(match.Length);
                }

                teams.Add(summary.Id, new AgilefantTeam(name.Trim(), summary.Description, summary.Id, assignees, sprints.ToArray()));
            }
            return(teams);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Downloads the burndown image for a sprint.
        /// </summary>
        /// <param name="sprintId">ID of sprint to get burndown for.</param>
        /// <param name="session">Agilefant login session to use.</param>
        /// <returns>The burndown image.</returns>
        public static async Task <Image> GenerateBurndownImage(int sprintId, AgilefantSession session)
        {
            var url      = $"drawIterationBurndown.action?backlogId={sprintId}&timeZoneOffset=720";
            var response = await session.Get(url);

            response.EnsureSuccessStatusCode();
            var stream = await response.Content.ReadAsStreamAsync();

            return(Image.FromStream(stream));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Gets details about a sprint with a specified ID.
        /// </summary>
        /// <param name="sprintId">ID of the sprint to get.</param>
        /// <param name="session">Agilefant login session to use.</param>
        /// <returns>Details of the specified sprint.</returns>
        public static async Task <AgilefantSprint> GetSprint(int sprintId, AgilefantSession session)
        {
            var url      = $"ajax/iterationData.action?iterationId={sprintId}";
            var response = await session.Get(url);

            response.EnsureSuccessStatusCode();

            var json = await response.Content.ReadAsStringAsync();

            return(JsonConvert.DeserializeObject <AgilefantSprint>(json));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Gets all the effort entries for a backlog
        /// </summary>
        /// <param name="from">The backlog item to get the effort entries for</param>
        /// <param name="session">The session</param>
        /// <returns>The effort entries</returns>
        internal static async Task <IEnumerable <AgilefantEffortEntry> > GetEffortEntries(int from, AgilefantSession session)
        {
            var query    = $"ajax/retrieveTaskHourEntries.action?parentObjectId={@from}&limited=false";
            var response = await session.Get(query);

            var json = await response.Content.ReadAsStringAsync();

            var entries = JsonConvert.DeserializeObject <AgilefantEffortEntry[]>(json);

            return(entries);
        }