public CardView MakeCardForStory(PivotalStory story) { var card = new CardView { Type = story.Type.ToString().ToLower(), CurrentState = TranslateState(story.CurrentState), Size = story.Estimate, Title = story.Name, Owner = GetOwner(story), AvatarUrl = GetAvatarUrl(story), Url = story.Url, ProjectName = GetProjectName(story), Id = story.Id }; CardBadge badge; foreach(var item in story.Labels) { if(TryGetBadge(item, out badge)) card.AddBadge(badge); else card.AddLabel(item); } if(TryGetBadge("type:" + story.Type, out badge)) card.AddBadge(badge); foreach(var item in story.Tasks) card.AddTask(new CardTask { Name = item.Description, IsComplete = item.IsComplete, ImageUrl = item.IsComplete ? TaskCompleteUrl : TaskPendingUrl }); return card; }
/// <summary> /// Creates a new comment on a story with from a pre-defined <see cref="PivotalStory"/> /// </summary> /// <param name="pivotalStory">The pre-defined <see cref="PivotalStory"/> to add the comment to.</param> /// <param name="bodyText">The main descrtiption text of the comment.</param> /// <returns></returns> public async Task <PivotalComment> CreateNewCommentAsync(PivotalStory pivotalStory, string bodyText) { // Attempts to get the story for our pivotalStory object var storyFromPivotal = await GetStoryByIdAsync(pivotalStory.ProjectId, pivotalStory.Id.GetValueOrDefault()); // Make sure our story actually exists, throws exception if false. if (storyFromPivotal != null) { // Setup a new comment to send to Pivotal var newComment = new PivotalComment { ProjectId = storyFromPivotal.ProjectId, StoryId = storyFromPivotal.Id.Value, Text = bodyText, FileAttachments = new List <PivotalAttachment>() }; // Try and add the comment to our story var response = await HttpService.PostAsync( StringUtil.PivotalCommentsUrl(storyFromPivotal.ProjectId, storyFromPivotal.Id.Value), newComment); return(HandleResponse <PivotalComment>(response)); } // Failure, our story does not exist on this project. throw new PivotalNotFoundException($"Story with Id {pivotalStory.Id} does not exist on project with Id {pivotalStory.ProjectId}"); }
/// <summary> /// Creates a new story in a project. /// </summary> /// <param name="projectId">Id of the project to create a story in.</param> /// <param name="pivotalStory">Pre-created story to create in the project.</param> /// <returns>Returns a completed PivotalStory.</returns> public async Task <PivotalStory> CreateNewStoryAsync(int?projectId, PivotalStory pivotalStory) { int properProjectId = GetProjectIdToUse(projectId); // Try and create a new PivotalStory var response = await HttpService.PostAsync(StringUtil.PivotalStoriesUrl(properProjectId), pivotalStory); return(HandleResponse <PivotalStory>(response)); }
/// <summary> /// Creates a new story in a project. /// </summary> /// <param name="projectId">Id of the project to create a story in.</param> /// <param name="name">The name you wish to give to the story.</param> /// <param name="storyType">Type of the story, eg feature, bug.</param> /// <param name="labels">Any labels you wish to give to the story.</param> /// <param name="description">(optional) Description of the story. Use this for additional info.</param> /// <returns>Returns a completed PivotalStory</returns> public async Task <PivotalStory> CreateNewStoryAsync(int?projectId, string name, StoryType storyType, List <string> labels = null, string description = null) { int properProjectId = GetProjectIdToUse(projectId); var story = new PivotalStory { Name = name, Description = description, StoryType = storyType.ToString() }; var response = await HttpService.PostAsync(StringUtil.PivotalStoriesUrl(properProjectId), story); return(HandleResponse <PivotalStory>(response)); }
string GetAvatarUrl(PivotalStory story) { if (string.IsNullOrEmpty(story.OwnedBy)) return ""; try { return Gravatar.FromEmail(members[story.OwnedBy].EmailAddress); } catch (Exception) { return "http://www.southparkgames.org/games/images/hulk_hogan.gif"; } }
public void multiple_stories() { var xml = new XPathDocument(GetType().Assembly.GetManifestResourceStream("CardWall.Specs.SampleStories.xml")); var storyNodes = xml.CreateNavigator().Select("//story"); var stories = new List<PivotalStory>(); while(storyNodes.MoveNext()) { Console.WriteLine(storyNodes.Current.OuterXml); var item = new PivotalStory(); (item as IXmlSerializable).ReadXml(storyNodes.Current.ReadSubtree()); stories.Add(item); } Verify.That(() => stories.Count == 2); Verify.That(() => stories[0].Id == 1); Verify.That(() => stories[1].Id == 2); Verify.That(() => stories[0].ProjectId == 12345); Verify.That(() => stories[1].ProjectId == 12345); }
public void LoadNotes(PivotalStory story) { story.LoadNotes(_user); }
public void LoadTasks(PivotalStory story) { story.LoadTasks(_user); }
// internal public PivotalStory GetStory(int projectId, int storyId) { return(PivotalStory.FetchStory(_user, projectId, storyId.ToString())); }
public PivotalStory GetUnestimatedStory(int projectId) { return(PivotalStory.FetchStories(_user, projectId).FirstOrDefault(ps => ps.Estimate == Unestimated)); }
string GetProjectName(PivotalStory story) { return projects[story.ProjectId].Name; }
string GetOwner(PivotalStory story) { if(string.IsNullOrEmpty(story.OwnedBy)) return ""; return story.OwnedBy; }
public void ReadSampleStory() { Story = new PivotalStory(); using(var xml = XmlReader.Create(GetType().Assembly.GetManifestResourceStream("CardWall.Specs.SampleStory.xml"))) (Story as IXmlSerializable).ReadXml(xml); }