<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -4,8 +4,16 @@
 class MailReader &lt; ActionMailer::Base
 
   def receive(email)
+    
+    html_body = email.body.split(/&lt;(HTML|html)/)[0]
+    unless html_body.nil?
+      body = html_body
+    else
+      body = email.body
+    end
+    
     # find project
-    project_name = line_match(email.body, &quot;Project&quot;, '')
+    project_name = line_match(body, &quot;Project&quot;, '')
     @@project = Project.find_by_name project_name, :include =&gt; :enabled_modules , :conditions =&gt; &quot;enabled_modules.name='ticket_emailer'&quot;
     
     if @@project.nil?
@@ -15,29 +23,14 @@ class MailReader &lt; ActionMailer::Base
     
     # If the email exists for a user in the current project,
     # use that user as the author.  Otherwise, abort
-    author = User.find_by_mail @@from_email, :select=&gt;&quot;users.id&quot;, :joins=&gt;&quot;inner join members on members.user_id = users.id&quot;,
+    author = User.find_by_mail @@from_email, :joins=&gt;&quot;inner join members on members.user_id = users.id&quot;,
                               :conditions=&gt;[&quot;members.project_id=?&quot;, @@project.id]
     
     if author.nil?
-      RAILS_DEFAULT_LOGGER.debug &quot;Author not found with the email of #{from_email}&quot;
+      RAILS_DEFAULT_LOGGER.debug &quot;Author not found with the email of #{@@from_email}&quot;
       return false      
     end
     
-    status = IssueStatus.find_by_name(line_match(email.body, &quot;Status&quot;, '')) || IssueStatus.default
-    
-    # TODO: Refactor priorities
-    priorities = Enumeration.get_values('IPRI')
-    @DEFAULT_PRIORITY = priorities[0]
-    @PRIORITY_MAPPING = {}
-    priorities.each { |prio| @PRIORITY_MAPPING[prio.name] = prio }
-    priority = @PRIORITY_MAPPING[line_match(email.body, &quot;Priority&quot;, '')] || @DEFAULT_PRIORITY
-    
-    # Tracker
-    @DEFAULT_TRACKER = @@project.trackers.find_by_position(1) || Tracker.find_by_position(1)
-    tracker = @@project.trackers.find_by_name(line_match(email.body, &quot;Tracker&quot;, 'Bug')) || @DEFAULT_TRACKER
-
-    category = @@project.issue_categories.find_by_name(line_match(email.body, &quot;Category&quot;, ''))
-
     #check if the email subject includes an issue id
     issue_id = email.subject.scan(/#(\d+)/).flatten
  
@@ -50,6 +43,36 @@ class MailReader &lt; ActionMailer::Base
       end
     end
     
+    assigned_email = line_match(body, &quot;Assign&quot;, '')
+    unless assigned_email.nil?
+      assigned_to = User.find_by_mail(assigned_email, :joins=&gt;&quot;inner join members on members.user_id = users.id&quot;, :conditions=&gt;[&quot;members.project_id=?&quot;, @@project.id])
+    end                           
+    unless assigned_to.nil?
+      RAILS_DEFAULT_LOGGER.debug &quot;Ticket assigned to #{assigned_to.mail}&quot;
+    end
+    
+    # TODO: Refactor priorities
+    priorities = Enumeration.get_values('IPRI')
+    @DEFAULT_PRIORITY = priorities[0]
+    @PRIORITY_MAPPING = {}
+    priorities.each { |prio| @PRIORITY_MAPPING[prio.name] = prio }
+    
+    @DEFAULT_TRACKER = @@project.trackers.find_by_position(1) || Tracker.find_by_position(1)
+    
+    #Find attributes and assign defaults if they don't exist for new issues.
+    if issue.nil?                     
+      status = IssueStatus.find_by_name(line_match(body, &quot;Status&quot;, '')) || IssueStatus.default
+      priority = @PRIORITY_MAPPING[line_match(body, &quot;Priority&quot;, '')] || @DEFAULT_PRIORITY
+      tracker = @@project.trackers.find_by_name(line_match(body, &quot;Tracker&quot;, '')) || @DEFAULT_TRACKER
+    else
+      #Find attributes for existing issues.
+      status = IssueStatus.find_by_name(line_match(body, &quot;Status&quot;, ''))
+      priority = @PRIORITY_MAPPING[line_match(body, &quot;Priority&quot;, '')]
+      tracker = @@project.trackers.find_by_name(line_match(body, &quot;Tracker&quot;, ''))
+    end
+    
+    category = @@project.issue_categories.find_by_name(line_match(body, &quot;Category&quot;, ''))
+    
     if issue.nil?
        RAILS_DEFAULT_LOGGER.debug &quot;Creating new issue&quot;
       # TODO: Description is greedy and will take other keywords after itself.  e.g.
@@ -61,35 +84,72 @@ class MailReader &lt; ActionMailer::Base
       #   Subject: Issue subject
       # #=&gt; Description has 'Subject' in it
       issue = Issue.create(
-          :subject =&gt; line_match(email.body, &quot;Subject&quot;, email.subject),
-          :description =&gt; block_match(email.body, &quot;Description&quot;, ''),
-          :priority =&gt; priority,
+          :subject =&gt; line_match(body, &quot;Subject&quot;, email.subject),
+          :description =&gt; block_match(body, &quot;Description&quot;, ''),
+          :priority_id =&gt; priority.id,
           :project_id =&gt; @@project.id,
           :tracker =&gt; tracker,
-          :author =&gt; author,
+          :author_id =&gt; author.id,
+          :assigned_to =&gt; assigned_to,
           :category =&gt; category,
           :status =&gt; status
       )
+      Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added')
     else
+
       #using the issue found from subject, create a new note for the issue
       ic = Iconv.new('UTF-8', 'UTF-8')
       RAILS_DEFAULT_LOGGER.debug &quot;Issue ##{issue.id} exists adding comment&quot;
-      journal = Journal.new(:notes =&gt; ic.iconv(email.body.split(/&lt;(HTML|html)/)[0]),
+      journal = Journal.new(:notes =&gt; ic.iconv(block_match(body, &quot;Description&quot;, '')),
                      :journalized =&gt; issue,
-                     :user =&gt; author);
+                     :user_id =&gt; author.id);
       if(!journal.save)
          RAILS_DEFAULT_LOGGER.debug &quot;Failed to add comment&quot;
          return false
       end
-    
+      
+      unless priority.nil?
+        unless issue.priority_id == priority.id
+          JournalDetail.create(:journal_id =&gt; journal.id, :property =&gt; 'attr', :prop_key =&gt; 'priority_id', :old_value =&gt; issue.priority_id, :value =&gt; priority.id)
+          issue.update_attributes(:priority_id =&gt; priority.id)
+        end
+      end
+      unless tracker.nil?
+        unless issue.tracker_id == tracker.id
+          JournalDetail.create(:journal_id =&gt; journal.id, :property =&gt; 'attr', :prop_key =&gt; 'tracker_id', :old_value =&gt; issue.tracker.name, :value =&gt; tracker.name)
+          issue.update_attributes(:tracker_id =&gt; tracker.id)
+        end
+      end
+      unless assigned_to.nil?
+        unless issue.assigned_to_id == assigned_to.id
+          JournalDetail.create(:journal_id =&gt; journal.id, :property =&gt; 'attr', :prop_key =&gt; 'assigned_to_id', :old_value =&gt; issue.assigned_to_id, :value =&gt; assigned_to.id)
+          issue.update_attributes(:assigned_to_id =&gt; assigned_to.id)
+        end
+      end
+      unless category.nil?
+        unless issue.category_id == category.id
+          JournalDetail.create(:journal_id =&gt; journal.id, :property =&gt; 'attr', :prop_key =&gt; 'category_id', :old_value =&gt; issue.category_id, :value =&gt; category.id)
+          issue.update_attributes(:category_id =&gt; category.id)
+        end
+      end
+      unless status.nil?
+        unless issue.status_id == status.id
+          JournalDetail.create(:journal_id =&gt; journal.id, :property =&gt; 'attr', :prop_key =&gt; 'status_id', :old_value =&gt; issue.status_id, :value =&gt; status.id)
+          issue.update_attributes(:status_id =&gt; status.id)
+        end
+      end
+      
+      Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
+
     end
     
     if email.has_attachments?
         for attachment in email.attachments        
             Attachment.create(:container =&gt; issue, 
-                                  :file =&gt; attachment,
-                                  :description =&gt; &quot;&quot;,
-                                  :author =&gt; author)
+                :file =&gt; attachment,
+                :description =&gt; line_match(body, &quot;Attachment&quot;, ''),
+                :author =&gt; author
+            )
         end
     end
 
@@ -124,19 +184,6 @@ class MailReader &lt; ActionMailer::Base
     end
   end
   
-  def attach_files(obj, attachment)
-    attached = []
-    user = User.find 2
-    if attachment &amp;&amp; attachment.is_a?(Hash)
-        file = attachment['file']
-            Attachment.create(:container =&gt; obj, 
-                                  :file =&gt; file,
-                                  :author =&gt; user)
-        attached &lt;&lt; a unless a.new_record?
-    end
-    attached
-  end
-  
   def self.from_email_address(imap, msg_id) 
     env = imap.fetch(msg_id, &quot;ENVELOPE&quot;)[0].attr[&quot;ENVELOPE&quot;]
     mailbox = env.from[0].mailbox</diff>
      <filename>app/models/mail_reader.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>a8578e550607f7668ede4dcca930f3ec4d0fcda5</id>
    </parent>
    <parent>
      <id>234f77155cbfebe0535b3e8ca5aa26c83269d12a</id>
    </parent>
  </parents>
  <author>
    <name>Ben Allen</name>
    <email>ben@sysadminschronicles.com</email>
  </author>
  <url>http://github.com/unilogic/redmine_ticket_emailer/commit/f1be9eb1116755b5cfb8dd8a0112b3b2ab8567a4</url>
  <id>f1be9eb1116755b5cfb8dd8a0112b3b2ab8567a4</id>
  <committed-date>2009-05-19T19:53:09-07:00</committed-date>
  <authored-date>2009-05-19T19:53:09-07:00</authored-date>
  <message>Merge branch 'master' of git@github.com:unilogic/redmine_ticket_emailer

Conflicts:
	app/models/mail_reader.rb</message>
  <tree>c96751db5049bef7a0a1200186e92a72850b7092</tree>
  <committer>
    <name>Ben Allen</name>
    <email>ben@sysadminschronicles.com</email>
  </committer>
</commit>
