/// <summary> /// Saves the issue history. /// </summary> /// <param name="issueHistoryToSave">The issue history to save.</param> /// <returns></returns> public static bool SaveOrUpdate(IssueHistory issueHistoryToSave) { if (issueHistoryToSave.Id > Globals.NEW_ID) return false; var tempId = DataProviderManager.Provider.CreateNewIssueHistory(issueHistoryToSave); if (tempId <= 0) return false; issueHistoryToSave.Id = tempId; return true; }
/// <summary> /// Deletes the IssueAttachment. /// </summary> /// <param name="issueAttachmentId">The issue attachment id.</param> /// <returns></returns> public static bool Delete(int issueAttachmentId) { var att = GetById(issueAttachmentId); var b = IssueManager.GetById(att.IssueId); var p = ProjectManager.GetById(b.ProjectId); if (DataProviderManager.Provider.DeleteIssueAttachment(issueAttachmentId)) { try { var history = new IssueHistory { IssueId = att.IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Attachment", "Attachment"), OldValue = att.FileName, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Deleted", "Deleted") }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> { history }; IssueNotificationManager.SendIssueNotifications(att.IssueId, changes); } catch (Exception ex) { if (Log.IsErrorEnabled) Log.Error(ex); } if (p.AttachmentStorageType == IssueAttachmentStorageTypes.FileSystem) { //delete IssueAttachment from file system. try { File.Delete(HttpContext.Current.Server.MapPath(string.Format("~{2}{0}\\{1}", p.UploadPath, att.FileName, Globals.UPLOAD_FOLDER))); } catch (Exception ex) { //set user to log4net context, so we can use %X{user} in the appenders if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated) MDC.Set("user", HttpContext.Current.User.Identity.Name); if (Log.IsErrorEnabled) Log.Error(String.Format("Error Deleting IssueAttachment - {0}", string.Format("{0}\\{1}", p.UploadPath, att.FileName)), ex); throw new ApplicationException(LoggingManager.GetErrorMessageResource("AttachmentDeleteError"), ex); } } } return true; }
/// <summary> /// Saves the issue history. /// </summary> /// <param name="issueHistoryToSave">The issue history to save.</param> /// <returns></returns> public static bool SaveOrUpdate(IssueHistory issueHistoryToSave) { if (issueHistoryToSave.Id > Globals.NEW_ID) return false; var tempId = DataProviderManager.Provider.CreateNewIssueHistory(issueHistoryToSave); if (tempId <= 0) return false; issueHistoryToSave.Id = tempId; if (issueHistoryToSave.TriggerLastUpdateChange) DataProviderManager.Provider.UpdateIssueLastUpdated(issueHistoryToSave.IssueId, issueHistoryToSave.CreatedUserName); return true; }
/// <summary> /// Creates the new issue history. /// </summary> /// <param name="newHistory">The new history.</param> /// <returns></returns> public override int CreateNewIssueHistory(IssueHistory newHistory) { // Validate Parameters if (newHistory == null) throw (new ArgumentNullException("newHistory")); using (var sqlCmd = new SqlCommand()) { AddParamToSqlCmd(sqlCmd, "@ReturnValue", SqlDbType.Int, 0, ParameterDirection.ReturnValue, null); AddParamToSqlCmd(sqlCmd, "@IssueId", SqlDbType.Int, 0, ParameterDirection.Input, newHistory.IssueId); AddParamToSqlCmd(sqlCmd, "@CreatedUserName", SqlDbType.NVarChar, 255, ParameterDirection.Input, newHistory.CreatedUserName); AddParamToSqlCmd(sqlCmd, "@FieldChanged", SqlDbType.NVarChar, 50, ParameterDirection.Input, newHistory.FieldChanged); AddParamToSqlCmd(sqlCmd, "@OldValue", SqlDbType.NVarChar, 50, ParameterDirection.Input, newHistory.OldValue); AddParamToSqlCmd(sqlCmd, "@NewValue", SqlDbType.NVarChar, 50, ParameterDirection.Input, newHistory.NewValue); SetCommandType(sqlCmd, CommandType.StoredProcedure, SP_ISSUEHISTORY_CREATENEWISSUEHISTORY); ExecuteScalarCmd(sqlCmd); return ((int)sqlCmd.Parameters["@ReturnValue"].Value); } }
public abstract int CreateNewIssueHistory(IssueHistory newHistory);
private static IssueHistory GetNewIssueHistory(IssueHistory history, string fieldChanged, string oldValue, string newValue) { return new IssueHistory { CreatedUserName = history.CreatedUserName, CreatorDisplayName = string.Empty, DateChanged = history.DateChanged, FieldChanged = fieldChanged, IssueId = history.IssueId, NewValue = newValue, OldValue = oldValue }; }
/// <summary> /// Gets the issue changes. /// </summary> /// <param name="originalIssue">The original issue.</param> /// <param name="issueToCompare">The issue to compare.</param> /// <returns></returns> public static List<IssueHistory> GetIssueChanges(Issue originalIssue, Issue issueToCompare) { var issueChanges = new List<IssueHistory>(); if (originalIssue != null && issueToCompare != null) { var history = new IssueHistory { CreatedUserName = issueToCompare.CreatorUserName, IssueId = originalIssue.Id, DateChanged = DateTime.Now }; if (originalIssue.Title.ToLower() != issueToCompare.Title.ToLower()) issueChanges.Add(GetNewIssueHistory(history, "Title", originalIssue.Title, issueToCompare.Title)); if (originalIssue.Description.ToLower() != issueToCompare.Description.ToLower()) issueChanges.Add(GetNewIssueHistory(history, "Description", originalIssue.Description, issueToCompare.Description)); if (originalIssue.CategoryId != issueToCompare.CategoryId) issueChanges.Add(GetNewIssueHistory(history, "Category", originalIssue.CategoryName, issueToCompare.CategoryName)); if (originalIssue.PriorityId != issueToCompare.PriorityId) issueChanges.Add(GetNewIssueHistory(history, "Priority", originalIssue.PriorityName, issueToCompare.PriorityName)); if (originalIssue.StatusId != issueToCompare.StatusId) issueChanges.Add(GetNewIssueHistory(history, "Status", originalIssue.StatusName, issueToCompare.StatusName)); if (originalIssue.MilestoneId != issueToCompare.MilestoneId) issueChanges.Add(GetNewIssueHistory(history, "Milestone", originalIssue.MilestoneName, issueToCompare.MilestoneName)); if (originalIssue.AffectedMilestoneId != issueToCompare.AffectedMilestoneId) issueChanges.Add(GetNewIssueHistory(history, "Affected Milestone", originalIssue.AffectedMilestoneName, issueToCompare.AffectedMilestoneName)); if (originalIssue.IssueTypeId != issueToCompare.IssueTypeId) issueChanges.Add(GetNewIssueHistory(history, "Issue Type", originalIssue.IssueTypeName, issueToCompare.IssueTypeName)); if (originalIssue.ResolutionId != issueToCompare.ResolutionId) issueChanges.Add(GetNewIssueHistory(history, "Resolution", originalIssue.ResolutionName, issueToCompare.ResolutionName)); var newAssignedUserName = String.IsNullOrEmpty(issueToCompare.AssignedUserName) ? Globals.UNASSIGNED_DISPLAY_TEXT : issueToCompare.AssignedUserName; if ((originalIssue.AssignedUserName != newAssignedUserName)) { // if the new assigned user is the unassigned user then don't trigger the new assignee notification originalIssue.SendNewAssigneeNotification = (newAssignedUserName != Globals.UNASSIGNED_DISPLAY_TEXT); originalIssue.NewAssignee = true; var newAssignedDisplayName = (newAssignedUserName == Globals.UNASSIGNED_DISPLAY_TEXT) ? newAssignedUserName : UserManager.GetUserDisplayName(newAssignedUserName); issueChanges.Add(GetNewIssueHistory(history, "Assigned to", originalIssue.AssignedDisplayName, newAssignedDisplayName)); } var newOwnerUserName = String.IsNullOrEmpty(issueToCompare.OwnerUserName) ? Globals.UNASSIGNED_DISPLAY_TEXT : issueToCompare.OwnerUserName; if (originalIssue.OwnerUserName != newOwnerUserName) { var newOwnerDisplayName = (newOwnerUserName == Globals.UNASSIGNED_DISPLAY_TEXT) ? newOwnerUserName : UserManager.GetUserDisplayName(issueToCompare.OwnerUserName); issueChanges.Add(GetNewIssueHistory(history, "Owner", originalIssue.OwnerDisplayName, newOwnerDisplayName)); } if (originalIssue.Estimation != issueToCompare.Estimation) issueChanges.Add(GetNewIssueHistory(history, "Estimation", Utilities.EstimationToString(originalIssue.Estimation), Utilities.EstimationToString(issueToCompare.Estimation))); if (originalIssue.Visibility != issueToCompare.Visibility) issueChanges.Add(GetNewIssueHistory(history, "Visibility", Utilities.GetBooleanAsString(originalIssue.Visibility.ToBool()), Utilities.GetBooleanAsString(issueToCompare.Visibility.ToBool()))); if (originalIssue.DueDate != issueToCompare.DueDate) { var originalDate = originalIssue.DueDate == DateTime.MinValue ? string.Empty : originalIssue.DueDate.ToShortDateString(); var newDate = issueToCompare.DueDate == DateTime.MinValue ? string.Empty : issueToCompare.DueDate.ToShortDateString(); issueChanges.Add(GetNewIssueHistory(history, "Due Date", originalDate, newDate)); } if (originalIssue.Progress != issueToCompare.Progress) issueChanges.Add(GetNewIssueHistory(history, "Progress", originalIssue.Progress.ToString("p"), issueToCompare.Progress.ToString("p"))); } else { throw new Exception("Unable to retrieve original issue data"); } return issueChanges; }
private static List<IssueHistory> GetCustomFieldChanges(int issueId, List<CustomField> originalFields, List<CustomField> newFields) { var fieldChanges = new List<IssueHistory>(); foreach(CustomField cf in newFields) { var field = originalFields.Find(f => f.Id == cf.Id); if(field != null && field.Value != cf.Value) { var history = new IssueHistory { CreatedUserName = Security.GetUserName(), IssueId = issueId, DateChanged = DateTime.Now }; fieldChanges.Add(GetNewIssueHistory(history, cf.Name, field.Value, cf.Value)); } else if(field == null) { // new field added - do we want to track history for this since a value wasn't selected var history = new IssueHistory { CreatedUserName = Security.GetUserName(), IssueId = issueId, DateChanged = DateTime.Now }; fieldChanges.Add(GetNewIssueHistory(history, cf.Name, string.Empty, cf.Value)); } } return fieldChanges; }
/// <summary> /// Deletes the IssueAttachment. /// </summary> /// <param name="issueAttachmentId">The issue attachment id.</param> /// <returns></returns> public static bool Delete(int issueAttachmentId) { var att = GetById(issueAttachmentId); var issue = IssueManager.GetById(att.IssueId); var project = ProjectManager.GetById(issue.ProjectId); if (DataProviderManager.Provider.DeleteIssueAttachment(issueAttachmentId)) { try { var history = new IssueHistory { IssueId = att.IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Attachment", "Attachment"), OldValue = att.FileName, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Deleted", "Deleted"), TriggerLastUpdateChange = true }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> { history }; IssueNotificationManager.SendIssueNotifications(att.IssueId, changes); } catch (Exception ex) { if (Log.IsErrorEnabled) Log.Error(ex); } if (HostSettingManager.Get(HostSettingNames.AttachmentStorageType, 0) == (int)IssueAttachmentStorageTypes.FileSystem) { //delete IssueAttachment from file system. try { var filePath = String.Format(@"{2}{0}\{1}", project.UploadPath, att.FileName, HostSettingManager.Get(HostSettingNames.AttachmentUploadPath)); if (filePath.StartsWith("~")) { filePath = HttpContext.Current.Server.MapPath(filePath); } if (File.Exists(filePath)) { File.Delete(filePath); } else { Log.Info(String.Format("Failed to locate file {0} to delete, it may have been moved or manually deleted", filePath)); } } catch (Exception ex) { //set user to log4net context, so we can use %X{user} in the appenders if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated) MDC.Set("user", HttpContext.Current.User.Identity.Name); if (Log.IsErrorEnabled) Log.Error(String.Format("Error Deleting IssueAttachment - {0}", String.Format("{0}\\{1}", project.UploadPath, att.FileName)), ex); throw new ApplicationException(LoggingManager.GetErrorMessageResource("AttachmentDeleteError"), ex); } } } return true; }
/// <summary> /// Uploads the document. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void UploadDocument(object sender, EventArgs e) { // get the current file var uploadFile = AspUploadFile.PostedFile; // if there was a file uploaded if (uploadFile.ContentLength > 0) { var inValidReason = string.Empty; var fileName = Path.GetFileName(uploadFile.FileName); var validFile = IssueAttachmentManager.IsValidFile(fileName, out inValidReason); if (validFile) { byte[] fileBytes; using (var input = uploadFile.InputStream) { fileBytes = new byte[uploadFile.ContentLength]; input.Read(fileBytes, 0, uploadFile.ContentLength); } var attachment = new IssueAttachment { Id = Globals.NEW_ID, Attachment = fileBytes, Description = AttachmentDescription.Text.Trim(), DateCreated = DateTime.Now, ContentType = uploadFile.ContentType, CreatorDisplayName = string.Empty, CreatorUserName = Security.GetUserName(), FileName = fileName, IssueId = IssueId, Size = fileBytes.Length }; if (!IssueAttachmentManager.SaveOrUpdate(attachment)) { AttachmentsMessage.ShowErrorMessage(string.Format(GetGlobalResourceObject("Exceptions", "SaveAttachmentError").ToString(), uploadFile.FileName)); if (Log.IsWarnEnabled) Log.Warn(string.Format(GetGlobalResourceObject("Exceptions", "SaveAttachmentError").ToString(), uploadFile.FileName)); return; } //add history record and send notifications var history = new IssueHistory { IssueId = IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Attachment", "Attachment"), OldValue = fileName, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Added", "Added") }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> {history}; IssueNotificationManager.SendIssueNotifications(IssueId, changes); BindAttachments(); } else AttachmentsMessage.ShowErrorMessage(inValidReason); } }
/// <summary> /// Handles the Click event of the cmdAddBugTimeEntry control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void AddTimeEntry_Click(object sender, EventArgs e) { if (DurationTextBox.Text.Trim().Length == 0) return; var selectedWorkDate = TimeEntryDate.SelectedValue == null ? DateTime.MinValue : (DateTime) TimeEntryDate.SelectedValue; var workDuration = Convert.ToDecimal(DurationTextBox.Text); var workReport = new IssueWorkReport { CommentText = CommentHtmlEditor.Text.Trim(), CreatorUserName = Context.User.Identity.Name, Duration = workDuration, IssueId = IssueId, WorkDate = selectedWorkDate }; IssueWorkReportManager.SaveOrUpdate(workReport); var history = new IssueHistory { IssueId = IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "TimeLogged", "Time Logged"), OldValue = string.Empty, NewValue = DurationTextBox.Text.Trim() }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> {history}; IssueNotificationManager.SendIssueNotifications(IssueId, changes); CommentHtmlEditor.Text = string.Empty; DurationTextBox.Text = string.Empty; BindTimeEntries(); }
/// <summary> /// Handles the ItemCommand event of the TimeEntriesDataGrid control. /// </summary> /// <param name="source">The source of the event.</param> /// <param name="e">The <see cref="T:System.Web.UI.WebControls.DataGridCommandEventArgs"/> instance containing the event data.</param> protected void TimeEntriesDataGrid_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) { var id = Convert.ToInt32(e.CommandArgument); if (!IssueWorkReportManager.Delete(id)) return; var history = new IssueHistory { IssueId = IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "TimeLogged", "Time Logged"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Deleted", "Deleted") }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> {history}; IssueNotificationManager.SendIssueNotifications(IssueId, changes); BindTimeEntries(); }
/// <summary> /// Handles the Click event of the cmdAddComment control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void CmdAddCommentClick(object sender, EventArgs e) { if (CommentHtmlEditor.Text.Trim().Length == 0) return; var comment = new IssueComment { IssueId = IssueId, Comment = CommentHtmlEditor.Text.Trim(), CreatorUserName = Security.GetUserName(), DateCreated = DateTime.Now }; var result = IssueCommentManager.SaveOrUpdate(comment); if(result) { //add history record var history = new IssueHistory { IssueId = IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Comment", "Comment"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Added", "Added"), TriggerLastUpdateChange = true }; IssueHistoryManager.SaveOrUpdate(history); } CommentHtmlEditor.Text = String.Empty; BindComments(); }
/// <summary> /// Gets the issue changes. /// </summary> /// <param name="originalIssue">The original issue.</param> /// <param name="issueToCompare">The issue to compare.</param> /// <returns></returns> public static List<IssueHistory> GetIssueChanges(Issue originalIssue, Issue issueToCompare) { var issueChanges = new List<IssueHistory>(); if (originalIssue != null && issueToCompare != null) { var history = new IssueHistory { CreatedUserName = issueToCompare.CreatorUserName, IssueId = originalIssue.Id, DateChanged = DateTime.Now }; if (originalIssue.Title.ToLower() != issueToCompare.Title.ToLower()) issueChanges.Add(GetNewIssueHistory(history, "Title", originalIssue.Title, issueToCompare.Title)); if (originalIssue.Description.ToLower() != issueToCompare.Description.ToLower()) issueChanges.Add(GetNewIssueHistory(history, "Description", originalIssue.Description, issueToCompare.Description)); if (originalIssue.CategoryId != issueToCompare.CategoryId) issueChanges.Add(GetNewIssueHistory(history, "Category", originalIssue.CategoryName, issueToCompare.CategoryName)); if (originalIssue.PriorityId != issueToCompare.PriorityId) issueChanges.Add(GetNewIssueHistory(history, "Priority", originalIssue.PriorityName, issueToCompare.PriorityName)); if (originalIssue.StatusId != issueToCompare.StatusId) issueChanges.Add(GetNewIssueHistory(history, "Status", originalIssue.StatusName, issueToCompare.StatusName)); if (originalIssue.MilestoneId != issueToCompare.MilestoneId) issueChanges.Add(GetNewIssueHistory(history, "Milestone", originalIssue.MilestoneName, issueToCompare.MilestoneName)); if (originalIssue.AffectedMilestoneId != issueToCompare.AffectedMilestoneId) issueChanges.Add(GetNewIssueHistory(history, "Affected Milestone", originalIssue.AffectedMilestoneName, issueToCompare.AffectedMilestoneName)); if (originalIssue.IssueTypeId != issueToCompare.IssueTypeId) issueChanges.Add(GetNewIssueHistory(history, "Issue Type", originalIssue.IssueTypeName, issueToCompare.IssueTypeName)); if (originalIssue.ResolutionId != issueToCompare.ResolutionId) issueChanges.Add(GetNewIssueHistory(history, "Resolution", originalIssue.ResolutionName, issueToCompare.ResolutionName)); var unassignedLiteral = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Unassigned", "Unassigned"); var newAssignedUserName = String.IsNullOrEmpty(issueToCompare.AssignedUserName) ? unassignedLiteral : issueToCompare.AssignedUserName; if (originalIssue.AssignedUserName != newAssignedUserName) { // if the new assigned user is the unassigned user then don't trigger the new assignee notification issueToCompare.SendNewAssigneeNotification = (newAssignedUserName != unassignedLiteral); issueToCompare.NewAssignee = true; var newAssignedDisplayName = (newAssignedUserName == unassignedLiteral) ? newAssignedUserName : UserManager.GetUserDisplayName(newAssignedUserName); issueChanges.Add(GetNewIssueHistory(history, "Assigned to", originalIssue.AssignedDisplayName, newAssignedDisplayName)); } var newOwnerUserName = String.IsNullOrEmpty(issueToCompare.OwnerUserName) ? unassignedLiteral : issueToCompare.OwnerUserName; if (originalIssue.OwnerUserName != newOwnerUserName) { var newOwnerDisplayName = (newOwnerUserName == unassignedLiteral) ? newOwnerUserName : UserManager.GetUserDisplayName(issueToCompare.OwnerUserName); issueChanges.Add(GetNewIssueHistory(history, "Owner", originalIssue.OwnerDisplayName, newOwnerDisplayName)); } if (originalIssue.Estimation != issueToCompare.Estimation) issueChanges.Add(GetNewIssueHistory(history, "Estimation", Utilities.EstimationToString(originalIssue.Estimation), Utilities.EstimationToString(issueToCompare.Estimation))); if (originalIssue.Visibility != issueToCompare.Visibility) issueChanges.Add(GetNewIssueHistory(history, "Visibility", Utilities.GetBooleanAsString(originalIssue.Visibility.ToBool()), Utilities.GetBooleanAsString(issueToCompare.Visibility.ToBool()))); if (originalIssue.DueDate != issueToCompare.DueDate) { var originalDate = originalIssue.DueDate == DateTime.MinValue ? string.Empty : originalIssue.DueDate.ToShortDateString(); var newDate = issueToCompare.DueDate == DateTime.MinValue ? string.Empty : issueToCompare.DueDate.ToShortDateString(); issueChanges.Add(GetNewIssueHistory(history, "Due Date", originalDate, newDate)); } if (originalIssue.Progress != issueToCompare.Progress) { var nfi = new NumberFormatInfo { PercentDecimalDigits = 0 }; var oldProgress = originalIssue.Progress.Equals(0) ? 0 : (originalIssue.Progress.To<double>() / 100); var newProgress = issueToCompare.Progress.Equals(0) ? 0 : (issueToCompare.Progress.To<double>() / 100); issueChanges.Add(GetNewIssueHistory(history, "Progress", oldProgress.ToString("P", nfi), newProgress.ToString("P", nfi))); } } else { throw new Exception("Unable to retrieve original issue data"); } return issueChanges; }
/// <summary> /// Adds the related issue. /// </summary> /// <param name="s">The s.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void AddRelatedIssue(Object s, EventArgs e) { if (IssueIdTextBox.Text == String.Empty) return; if (!Page.IsValid) return; SubIssuesMessage.Visible = false; var issueId = Utilities.ParseFullIssueId(IssueIdTextBox.Text.Trim()); if (issueId <= Globals.NEW_ID) return; RelatedIssueManager.CreateNewChildIssue(IssueId, issueId); var history = new IssueHistory { IssueId = IssueId, DateChanged = DateTime.Now, CreatedUserName = Security.GetUserName(), FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "ChildIssue", "Child Issue"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Added", "Added"), TriggerLastUpdateChange = true }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> {history}; IssueNotificationManager.SendIssueNotifications(IssueId, changes); IssueIdTextBox.Text = String.Empty; BindRelated(); }
/// <summary> /// GRDs the bugs item command. /// </summary> /// <param name="s">The s.</param> /// <param name="e">The <see cref="System.Web.UI.WebControls.DataGridCommandEventArgs"/> instance containing the event data.</param> protected void GrdBugsItemCommand(Object s, DataGridCommandEventArgs e) { var commandArgument = e.CommandArgument.ToString(); var commandName = e.CommandName.ToLower().Trim(); var currentIssueId = Globals.NEW_ID; switch (commandName) { case "delete": currentIssueId = int.Parse(commandArgument); RelatedIssueManager.DeleteParentIssue(IssueId, currentIssueId); break; } if (currentIssueId > Globals.NEW_ID) { var history = new IssueHistory { IssueId = IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "ParentIssue", "Parent Issue"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Deleted", "Deleted") }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> { history }; IssueNotificationManager.SendIssueNotifications(IssueId, changes); } BindRelated(); }
/// <summary> /// Adds the related issue. /// </summary> /// <param name="s">The s.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> protected void AddRelatedIssue(Object s, EventArgs e) { if (IssueIdTextBox.Text == String.Empty) return; if (!Page.IsValid) return; RelatedIssueManager.CreateNewParentIssue(IssueId, Int32.Parse(IssueIdTextBox.Text) ); var history = new IssueHistory { IssueId = IssueId, CreatedUserName = Security.GetUserName(), DateChanged = DateTime.Now, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "ParentIssue", "Parent Issue"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Added", "Added") }; IssueHistoryManager.SaveOrUpdate(history); var changes = new List<IssueHistory> {history}; IssueNotificationManager.SendIssueNotifications(IssueId, changes); IssueIdTextBox.Text = String.Empty; BindRelated(); }
private bool ProcessNewComment(List<string> recipients, POP3_ClientMessage message, Mail_Message mailHeader, MailboxReaderResult result) { string messageFrom = string.Empty; if (mailHeader.From.Count > 0) { messageFrom = string.Join("; ", mailHeader.From.ToList().Select(p => p.Address).ToArray()).Trim(); } bool processed = false; foreach (var address in recipients) { Regex isReply = new Regex(@"(.*)(\+iid-)(\d+)@(.*)"); Match commentMatch = isReply.Match(address); if (commentMatch.Success && commentMatch.Groups.Count >= 4) { // we are in a reply and group 4 must contain the id of the original issue int issueId; if (int.TryParse(commentMatch.Groups[3].Value, out issueId)) { var _currentIssue = IssueManager.GetById(issueId); if (_currentIssue != null) { var project = ProjectManager.GetById(_currentIssue.ProjectId); var mailbody = Mail_Message.ParseFromByte(message.MessageToByte()); bool isHtml; List<MIME_Entity> attachments = null; string content = GetMessageContent(mailbody, project, out isHtml, ref attachments); IssueComment comment = new IssueComment { IssueId = issueId, Comment = content, DateCreated = mailHeader.Date }; // try to find if the creator is valid user in the project, otherwise take // the user defined in the mailbox config var users = UserManager.GetUsersByProjectId(project.Id); var emails = messageFrom.Split(';').Select(e => e.Trim().ToLower()); var user = users.Find(x => emails.Contains(x.Email.ToLower())); if (user != null) { comment.CreatorUserName = user.UserName; } else { // user not found continue; } var saved = IssueCommentManager.SaveOrUpdate(comment); if (saved) { //add history record var history = new IssueHistory { IssueId = issueId, CreatedUserName = comment.CreatorUserName, DateChanged = comment.DateCreated, FieldChanged = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Comment", "Comment"), OldValue = string.Empty, NewValue = ResourceStrings.GetGlobalResource(GlobalResources.SharedResources, "Added", "Added"), TriggerLastUpdateChange = true }; IssueHistoryManager.SaveOrUpdate(history); var projectFolderPath = Path.Combine(Config.UploadsFolderPath, project.UploadPath); // save attachments as new files int attachmentsSavedCount = 1; foreach (MIME_Entity mimeEntity in attachments) { string fileName; var contentType = mimeEntity.ContentType.Type.ToLower(); var attachment = new IssueAttachment { Id = 0, Description = "File attached by mailbox reader", DateCreated = DateTime.Now, ContentType = mimeEntity.ContentType.TypeWithSubtype, CreatorDisplayName = user.DisplayName, CreatorUserName = user.UserName, IssueId = issueId, ProjectFolderPath = projectFolderPath }; attachment.Attachment = ((MIME_b_SinglepartBase)mimeEntity.Body).Data; if (contentType.Equals("attachment")) // this is an attached email { fileName = mimeEntity.ContentDisposition.Param_FileName; } else if (contentType.Equals("message")) // message has no filename so we create one { fileName = string.Format("Attached_Message_{0}.eml", attachmentsSavedCount); } else { fileName = string.IsNullOrWhiteSpace(mimeEntity.ContentType.Param_Name) ? string.Format("untitled.{0}", mimeEntity.ContentType.SubType) : mimeEntity.ContentType.Param_Name; } attachment.FileName = fileName; var saveFile = IsAllowedFileExtension(fileName); var fileSaved = false; // can we save the file? if (saveFile) { fileSaved = IssueAttachmentManager.SaveOrUpdate(attachment); if (fileSaved) { attachmentsSavedCount++; } else { LogWarning("MailboxReader: Attachment could not be saved, please see previous logs"); } } } processed = true; // add the entry if the save did not throw any exceptions result.MailboxEntries.Add(new MailboxEntry()); } } } } } return processed; }