<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/controllers/newsletter_traces_controller.rb</filename>
    </added>
    <added>
      <filename>app/helpers/newsletter_traces_helper.rb</filename>
    </added>
    <added>
      <filename>app/models/newsletter_email_page.rb</filename>
    </added>
    <added>
      <filename>app/models/newsletter_trace.rb</filename>
    </added>
    <added>
      <filename>db/migrate/005_create_newsletter_traces.rb</filename>
    </added>
    <added>
      <filename>lib/assets/transparent.gif</filename>
    </added>
    <added>
      <filename>test/fixtures/newsletter_traces.yml</filename>
    </added>
    <added>
      <filename>test/functional/newsletter_traces_controller_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/newsletter_email_page_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/newsletter_trace_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -10,7 +10,7 @@ class NewslettersController &lt; ApplicationController
       if params[:test_email]
         if params[:address] =~ /^$|^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
           flash[:notice] = &quot;Test email has been sent correctly&quot;
-          send_test_email(@newsletter, @page, params[:address])
+          send_test_email(@newsletter, @page, (NewsletterSubscriber.find_by_email(params[:address]) || NewsletterSubscriber.new(:email =&gt; params[:address])))
         else
           flash[:error] = &quot;You must specify an email address&quot;
           render :action =&gt; 'new' and return
@@ -40,29 +40,29 @@ private
   end
   
   def send_emails(newsletter, page)
-    info = email_info(newsletter, page)
-    newsletter.recipients.each do |address|      
-      email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], address, info[:from])
+    newsletter.active_subscribers.each do |subscriber|      
+      info = email_info(newsletter, page, subscriber)
+      email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], subscriber.address, info[:from])
       NewsletterEmail.create({
         :page_id        =&gt; page.id,
         :mail           =&gt; email.encoded, 
-        :to             =&gt; address,
+        :to             =&gt; subscriber.address,
         :from           =&gt; info[:from]
       })
     end
     page.update_attribute(:sent_as_newsletter_email_at, Time.now)
   end     
   
-  def send_test_email(newsletter, page, address)
-    info = email_info(newsletter, page)
-    email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], address, info[:from])    
+  def send_test_email(newsletter, page, subscriber)
+    info = email_info(newsletter, page, subscriber)
+    email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], subscriber.address, info[:from])    
     NewsletterMailer.deliver(email)
   end
     
-  def email_info(newsletter, page)
+  def email_info(newsletter, page, subscriber)
     {
       :subject =&gt; &quot;[#{newsletter.config[&quot;subject_prefix&quot;]}] #{page.title}&quot;,
-      :html_body =&gt; page.render,
+      :html_body =&gt; page.respond_to?(:render_with_subscriber) ? page.render_with_subscriber(subscriber) : page.render,
       :from =&gt; newsletter.config[&quot;from&quot;]
     }
   end</diff>
      <filename>app/controllers/newsletters_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -94,7 +94,7 @@ class NewsletterPage &lt; Page
   def cache?
     false    
   end
-  
+
   tag 'newsletter' do |tag|
     tag.expand
   end
@@ -138,6 +138,7 @@ class NewsletterPage &lt; Page
     tag.locals.newsletter_subscriber.unsubscription_code if tag.locals.newsletter_subscriber
   end
 
+
 private
   
   def send_activation_email(newsletter_subscriber)</diff>
      <filename>app/models/newsletter_page.rb</filename>
    </modified>
    <modified>
      <diff>@@ -51,7 +51,11 @@ class NewsletterSubscriber &lt; ActiveRecord::Base
   def unsubscribe
     update_attribute(:unsubscribed_at, Time.now)
   end  
-    
+  
+  def address
+    &quot;#{self.name} &lt;#{self.email}&gt;&quot;.gsub(/\s+/, ' ').strip
+  end
+  
 private
 
   def generate_activation_code</diff>
      <filename>app/models/newsletter_subscriber.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,6 +18,12 @@
             Sent at &lt;%= @page.sent_as_newsletter_email_at.strftime(&quot;%I:%M &lt;small&gt;%p&lt;/small&gt; on %B %d, %Y&quot;) %&gt;.
             Email queue: &lt;strong&gt;&lt;%= NewsletterEmail.count(:conditions =&gt; [&quot;page_id = ?&quot;, @page.id]) %&gt;&lt;/strong&gt; |
             &lt;%= link_to 'Logs', :controller =&gt; '/newsletter_logs' %&gt;
+						&lt;% if @page.is_a?(NewsletterEmailPage) %&gt;
+							&lt;br /&gt;
+							Subscribers that has read the newsletter: &lt;%= @page.opened_count %&gt; |
+							Subscribers that has clicked a link in the newsletter: &lt;%= @page.clicked_count %&gt;
+						&lt;% end %&gt;
+						
         &lt;% end -%&gt;        
         &lt;/p&gt;
         &lt;p&gt;</diff>
      <filename>app/views/admin/page/_page_edit_main_newsletter.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -11,11 +11,14 @@ class NewsletterExtension &lt; Radiant::Extension
     map.connect 'admin/newsletters/:newsletter_id/subscribers/:action/:id',   :controller =&gt; 'newsletter_subscribers'
     map.connect 'admin/newsletters/:newsletter_id/subscribers/:action/:id',   :controller =&gt; 'newsletter_subscribers'
     map.connect 'admin/newsletters/:page_id/:action',                         :controller =&gt; 'newsletters'    
+    map.connect 'newsletters/:id/track/:subscriber_id/open',                  :controller =&gt; 'newsletter_traces', :action =&gt; 'open'    
+    map.connect 'newsletters/:id/track/:subscriber_id/click',                 :controller =&gt; 'newsletter_traces', :action =&gt; 'click'
   end
   
   def activate
-    NewsletterPage
     Page.class_eval{ has_many :emails, :class_name =&gt; 'NewsletterEmail', :dependent =&gt; :delete_all }
+    NewsletterPage
+    NewsletterEmailPage
     admin.page.edit.add :main, &quot;page_edit_main_newsletter&quot;, :after =&gt; 'edit_header'
   end
   </diff>
      <filename>newsletter_extension.rb</filename>
    </modified>
    <modified>
      <diff>@@ -95,9 +95,11 @@ newsletter_config:
   content: |
     from: hello@example.com
     subject_prefix: My newsletter
+    base_url: http://localhost:3000
   page_id: 2
 first_email_for_newsletter_body:
   id: 13
   name: body
-  content: Hello from the first newsletter
+  content:  |
+    Hello from the first newsletter. Here is a link: &lt;r:newsletter:tracking:link url=&quot;http://google.com&quot;&gt;Google&lt;/r:newsletter:tracking:link&gt;. Here is the bug: &lt;r:newsletter:tracking:bug /&gt;.
   page_id: 4
\ No newline at end of file</diff>
      <filename>test/fixtures/page_parts.yml</filename>
    </modified>
    <modified>
      <diff>@@ -32,6 +32,7 @@ first_email_for_newsletter:
   status_id: 100
   parent_id: 2
   published_at: &lt;%= 1.day.ago.to_s :db %&gt;
+  class_name: NewsletterEmailPage
 second_email_for_newsletter:
   id: 5
   title: Second email for Newsletter</diff>
      <filename>test/fixtures/pages.yml</filename>
    </modified>
    <modified>
      <diff>@@ -64,6 +64,13 @@ class NewslettersControllerTest &lt; Test::Unit::TestCase
       assert_equal 0, ActionMailer::Base.deliveries.size
     end    
   end
+
+  def test_create_should_send_emails_with_subscriber_if_page_is_a_newsletter_email_page
+    post :create, :page_id =&gt; pages(:first_email_for_newsletter).id
+    body = NewsletterEmail.find(:first).mail
+    assert_match(%r{newsletters\/4\/track\/1\/click}, body) # Link
+    assert_match(%r{newsletters\/4\/track\/1\/open}, body) # Web beacon    
+  end
   
   def test_should_send_test_email
     assert_difference NewsletterEmail, :count, 0 do</diff>
      <filename>test/functional/newsletters_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class NewsletterPageTest &lt; Test::Unit::TestCase
-  fixtures :newsletter_subscribers, :pages, :page_parts
+  fixtures :newsletter_subscribers, :pages, :page_parts, :newsletter_traces
   
   def test_should_destroy_newsletter_subscriber
     assert_difference NewsletterSubscriber, :count, -4 do</diff>
      <filename>test/unit/newsletter_page_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -126,6 +126,10 @@ class NewsletterSubscriberTest &lt; Test::Unit::TestCase
      end
    end
    
+   def test_address
+     assert_equal &quot;Tom &lt;tom@example.com&gt;&quot;, newsletter_subscribers(:tom).address
+   end
+   
 private
 
   def create_newsletter_subscriber(options = {})</diff>
      <filename>test/unit/newsletter_subscriber_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c61b332788f79fc79df8d51e520e1c93980e1d33</id>
    </parent>
  </parents>
  <author>
    <name>Andrea Franz</name>
    <email>andrea@gravityblast.com</email>
  </author>
  <url>http://github.com/pilu/radiant-newsletter/commit/51ccb2ba7e099a1698d8b51aadb8eac5a3394fa2</url>
  <id>51ccb2ba7e099a1698d8b51aadb8eac5a3394fa2</id>
  <committed-date>2008-03-27T14:36:56-07:00</committed-date>
  <authored-date>2008-03-27T14:36:56-07:00</authored-date>
  <message>Added a stats system [ Casper Fabricius ]

git-svn-id: http://dev.gravityblast.com/svn/projects/radiant/extensions/newsletter@83 f0b21ff1-402e-e14f-a5c2-e6dc25fb685e</message>
  <tree>80c4c91c2f83e4f9d00095d684db23acceb4fac3</tree>
  <committer>
    <name>Andrea Franz</name>
    <email>andrea@gravityblast.com</email>
  </committer>
</commit>
