diff --git a/Documentation/FullyAnnotatedConfigReference.xml b/Documentation/FullyAnnotatedConfigReference.xml
index 30bb1f2..5bd72fd 100644
--- a/Documentation/FullyAnnotatedConfigReference.xml
+++ b/Documentation/FullyAnnotatedConfigReference.xml
@@ -103,9 +103,12 @@
- Subject - The email subject
- MessageBody - The body of the email message converted to plain text (i.e. if the body was HTML,
it would be stripped to plain text)
- - MessageBodyWithSender - Similar to MessageBody, but with an added line at the bottom mentioning the
+ - MessageBodyWithSender - Similar to MessageBody, but with an added line at the top mentioning the
display name and email address of the sender. Useful to include indication of the person whose email
triggered the work item creation
+ - MessageLastReply - Last reply of the thread
+ - MessageLastReplyWithSender - Similar to MessageLastReply, but with an added line at the top mentioning the
+ display name and email address of the sender.
- RawMessageBody - The raw body of the email - i.e. if it's an HTML message, this would be the full
message HTML
- Now - Current date time in general ("g") date time format (see
@@ -126,6 +129,16 @@
+
+
+
+
+
+
+
true
diff --git a/Mail2Bug/Config.cs b/Mail2Bug/Config.cs
index 0e2647c..fe7c9e5 100644
--- a/Mail2Bug/Config.cs
+++ b/Mail2Bug/Config.cs
@@ -91,6 +91,7 @@ public enum ProcessingStrategyType
public string ConversationIndexFieldName { get; set; }
public List DefaultFieldValues { get; set; }
+ public List DefaultFieldValuesOnUpdate { get; set; }
public List Mnemonics { get; set; }
public List RecipientOverrides { get; set; }
public List DateBasedOverrides { get; set; }
diff --git a/Mail2Bug/MessageProcessingStrategies/SimpleBugStrategy.cs b/Mail2Bug/MessageProcessingStrategies/SimpleBugStrategy.cs
index 7d0a131..920dcba 100644
--- a/Mail2Bug/MessageProcessingStrategies/SimpleBugStrategy.cs
+++ b/Mail2Bug/MessageProcessingStrategies/SimpleBugStrategy.cs
@@ -104,6 +104,14 @@ private void InitWorkItemFields(IIncomingEmailMessage message, Dictionary workItemUpdates)
+ {
+ foreach (var defaultFieldValue in _config.WorkItemSettings.DefaultFieldValuesOnUpdate)
+ {
+ workItemUpdates[defaultFieldValue.Field] = resolver.Resolve(defaultFieldValue.Value);
+ }
+ }
+
private void TryApplyFieldOverrides(Dictionary overrides, int workItemId)
{
if (overrides.Count == 0)
@@ -115,7 +123,7 @@ private void TryApplyFieldOverrides(Dictionary overrides, int wo
try
{
Logger.DebugFormat("Overrides found. Calling 'ModifyWorkItem'");
- _workItemManager.ModifyWorkItem(workItemId, "", overrides);
+ _workItemManager.ModifyWorkItem(workItemId, overrides);
}
catch (Exception ex)
{
@@ -131,6 +139,8 @@ private void UpdateWorkItem(IIncomingEmailMessage message, int workItemId)
var resolver = new SpecialValueResolver(message, _workItemManager.GetNameResolver());
var workItemUpdates = new Dictionary();
+ InitWorkItemUpdateFields(resolver, workItemUpdates);
+
if (_config.WorkItemSettings.OverrideChangedBy)
{
workItemUpdates["Changed By"] = resolver.Sender;
@@ -146,8 +156,7 @@ private void UpdateWorkItem(IIncomingEmailMessage message, int workItemId)
overrides.ToList().ForEach(x => workItemUpdates[x.Key] = x.Value);
}
- // Construct the text to be appended
- _workItemManager.ModifyWorkItem(workItemId, message.GetLastMessageText(), workItemUpdates);
+ _workItemManager.ModifyWorkItem(workItemId, workItemUpdates);
ProcessAttachments(message, workItemId);
diff --git a/Mail2Bug/MessageProcessingStrategies/SpecialValueResolver.cs b/Mail2Bug/MessageProcessingStrategies/SpecialValueResolver.cs
index 7ca4f9a..d151b69 100644
--- a/Mail2Bug/MessageProcessingStrategies/SpecialValueResolver.cs
+++ b/Mail2Bug/MessageProcessingStrategies/SpecialValueResolver.cs
@@ -13,6 +13,8 @@ public class SpecialValueResolver
public const string SubjectKeyword = "##Subject";
public const string SenderKeyword = "##Sender";
+ public const string MessageLastReplyKeyword = "##MessageLastReply";
+ public const string MessageLastReplyWithSenderKeyword = "##MessageLastReplyWithSender";
public const string MessageBodyKeyword = "##MessageBody";
public const string MessageBodyWithSenderKeyword = "##MessageBodyWithSender";
public const string RawMessageBodyKeyword = "##RawMessageBody";
@@ -30,12 +32,12 @@ public SpecialValueResolver(IIncomingEmailMessage message, INameResolver resolve
_valueResolutionMap = new Dictionary();
_valueResolutionMap[SubjectKeyword] = GetValidSubject(message);
_valueResolutionMap[SenderKeyword] = GetSender(message);
+ _valueResolutionMap[MessageLastReplyKeyword] = TextUtils.FixLineBreaks(message.GetLastMessageText());
+ _valueResolutionMap[MessageLastReplyWithSenderKeyword] =
+ GetMessageWithSender(_valueResolutionMap[MessageLastReplyKeyword], message.SenderName, message.SenderAddress);
_valueResolutionMap[MessageBodyKeyword] = TextUtils.FixLineBreaks(message.PlainTextBody);
_valueResolutionMap[MessageBodyWithSenderKeyword] =
- String.Format("{0}\n\nCreated by: {1} ({2})",
- _valueResolutionMap[MessageBodyKeyword],
- message.SenderName,
- message.SenderAddress);
+ GetMessageWithSender(_valueResolutionMap[MessageBodyKeyword], message.SenderName, message.SenderAddress);
_valueResolutionMap[RawMessageBodyKeyword] = TextUtils.FixLineBreaks(message.RawBody);
_valueResolutionMap[NowKeyword] = DateTime.Now.ToString("g");
_valueResolutionMap[TodayKeyword] = DateTime.Now.ToString("d");
@@ -91,6 +93,13 @@ private static string GetValidSubject(IIncomingEmailMessage message)
return !string.IsNullOrEmpty(message.ConversationTopic) ? message.ConversationTopic : "NO SUBJECT";
}
+ private static string GetMessageWithSender(string message, string sender, string senderAddress)
+ {
+ var formatted = string.Format("Created by: {1} ({2})\n\n{0}", message, sender, senderAddress);
+
+ return formatted;
+ }
+
private string GetValidTimeString(DateTime? dateTime)
{
if (dateTime.HasValue)
diff --git a/Mail2Bug/WorkItemManagement/IWorkItemManager.cs b/Mail2Bug/WorkItemManagement/IWorkItemManager.cs
index c1c7aa1..bf5a9c1 100644
--- a/Mail2Bug/WorkItemManagement/IWorkItemManager.cs
+++ b/Mail2Bug/WorkItemManagement/IWorkItemManager.cs
@@ -16,9 +16,8 @@ public interface IWorkItemManager
int CreateWorkItem(Dictionary values);
/// The ID of the bug to modify
- /// Comment to add to description
/// List of fields to change
- void ModifyWorkItem(int workItemId, string comment, Dictionary values);
+ void ModifyWorkItem(int workItemId, Dictionary values);
INameResolver GetNameResolver();
}
diff --git a/Mail2Bug/WorkItemManagement/TFSWorkItemManager.cs b/Mail2Bug/WorkItemManagement/TFSWorkItemManager.cs
index d480cbf..49c73c1 100644
--- a/Mail2Bug/WorkItemManagement/TFSWorkItemManager.cs
+++ b/Mail2Bug/WorkItemManagement/TFSWorkItemManager.cs
@@ -241,9 +241,8 @@ public int CreateWorkItem(Dictionary values)
}
/// The ID of the work item to modify
- /// Comment to add to description
/// List of fields to change
- public void ModifyWorkItem(int workItemId, string comment, Dictionary values)
+ public void ModifyWorkItem(int workItemId, Dictionary values)
{
if (workItemId <= 0) return;
@@ -251,7 +250,6 @@ public void ModifyWorkItem(int workItemId, string comment, Dictionary");
foreach (var key in values.Keys)
{
TryApplyFieldValue(workItem, key, values[key]);
@@ -373,9 +371,9 @@ private static void TryApplyFieldValue(WorkItem workItem, string key, string val
return;
}
- if (field.FieldDefinition.FieldType == FieldType.Html)
+ if (field.FieldDefinition.FieldType == FieldType.Html || field.FieldDefinition.FieldType == FieldType.History)
{
- value = value.Replace("\n", "
");
+ value = value.Replace("\n", "
");
}
field.Value = value;
diff --git a/Mail2Bug/WorkItemManagement/WorkItemManagerMock.cs b/Mail2Bug/WorkItemManagement/WorkItemManagerMock.cs
index 2fdf7a0..9ff4f52 100644
--- a/Mail2Bug/WorkItemManagement/WorkItemManagerMock.cs
+++ b/Mail2Bug/WorkItemManagement/WorkItemManagerMock.cs
@@ -74,7 +74,7 @@ public int CreateWorkItem(Dictionary values)
return id;
}
- public void ModifyWorkItem(int workItemId, string comment, Dictionary values)
+ public void ModifyWorkItem(int workItemId, Dictionary values)
{
if (ThrowOnModifyBug != null) throw ThrowOnModifyBug;
@@ -89,13 +89,6 @@ public void ModifyWorkItem(int workItemId, string comment, Dictionary
+
+
+
EWSByRecipients