public
Description: Newsletter system based on Radiant CMS
Homepage: http://gravityblast.com/projects/radiant-newsletter-extension/
Clone URL: git://github.com/pilu/radiant-newsletter.git
Added a stats system [ Casper Fabricius ]

git-svn-id: 
http://dev.gravityblast.com/svn/projects/radiant/extensions/newsletter@83 
f0b21ff1-402e-e14f-a5c2-e6dc25fb685e
pilu (author)
Thu Mar 27 14:36:56 -0700 2008
commit  51ccb2ba7e099a1698d8b51aadb8eac5a3394fa2
tree    80c4c91c2f83e4f9d00095d684db23acceb4fac3
parent  c61b332788f79fc79df8d51e520e1c93980e1d33
...
10
11
12
13
 
14
15
16
...
40
41
42
43
44
45
 
 
 
46
47
48
49
 
50
51
52
53
54
55
56
57
58
 
 
 
59
60
61
62
 
63
64
65
 
66
67
68
...
10
11
12
 
13
14
15
16
...
40
41
42
 
 
 
43
44
45
46
47
48
 
49
50
51
52
53
54
55
 
 
 
56
57
58
59
60
61
 
62
63
64
 
65
66
67
68
0
@@ -10,7 +10,7 @@ class NewslettersController < ApplicationController
0
       if params[:test_email]
0
         if params[:address] =~ /^$|^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
0
           flash[:notice] = "Test email has been sent correctly"
0
- send_test_email(@newsletter, @page, params[:address])
0
+ send_test_email(@newsletter, @page, (NewsletterSubscriber.find_by_email(params[:address]) || NewsletterSubscriber.new(:email => params[:address])))
0
         else
0
           flash[:error] = "You must specify an email address"
0
           render :action => 'new' and return
0
@@ -40,29 +40,29 @@ private
0
   end
0
   
0
   def send_emails(newsletter, page)
0
- info = email_info(newsletter, page)
0
- newsletter.recipients.each do |address|
0
- email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], address, info[:from])
0
+ newsletter.active_subscribers.each do |subscriber|
0
+ info = email_info(newsletter, page, subscriber)
0
+ email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], subscriber.address, info[:from])
0
       NewsletterEmail.create({
0
         :page_id => page.id,
0
         :mail => email.encoded,
0
- :to => address,
0
+ :to => subscriber.address,
0
         :from => info[:from]
0
       })
0
     end
0
     page.update_attribute(:sent_as_newsletter_email_at, Time.now)
0
   end
0
   
0
- def send_test_email(newsletter, page, address)
0
- info = email_info(newsletter, page)
0
- email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], address, info[:from])
0
+ def send_test_email(newsletter, page, subscriber)
0
+ info = email_info(newsletter, page, subscriber)
0
+ email = NewsletterMailer.create_newsletter(info[:subject], info[:html_body], subscriber.address, info[:from])
0
     NewsletterMailer.deliver(email)
0
   end
0
     
0
- def email_info(newsletter, page)
0
+ def email_info(newsletter, page, subscriber)
0
     {
0
       :subject => "[#{newsletter.config["subject_prefix"]}] #{page.title}",
0
- :html_body => page.render,
0
+ :html_body => page.respond_to?(:render_with_subscriber) ? page.render_with_subscriber(subscriber) : page.render,
0
       :from => newsletter.config["from"]
0
     }
0
   end
...
94
95
96
97
 
98
99
100
...
138
139
140
 
141
142
143
...
94
95
96
 
97
98
99
100
...
138
139
140
141
142
143
144
0
@@ -94,7 +94,7 @@ class NewsletterPage < Page
0
   def cache?
0
     false
0
   end
0
-
0
+
0
   tag 'newsletter' do |tag|
0
     tag.expand
0
   end
0
@@ -138,6 +138,7 @@ class NewsletterPage < Page
0
     tag.locals.newsletter_subscriber.unsubscription_code if tag.locals.newsletter_subscriber
0
   end
0
 
0
+
0
 private
0
   
0
   def send_activation_email(newsletter_subscriber)
...
51
52
53
54
 
 
 
 
 
55
56
57
...
51
52
53
 
54
55
56
57
58
59
60
61
0
@@ -51,7 +51,11 @@ class NewsletterSubscriber < ActiveRecord::Base
0
   def unsubscribe
0
     update_attribute(:unsubscribed_at, Time.now)
0
   end
0
-
0
+
0
+ def address
0
+ "#{self.name} <#{self.email}>".gsub(/\s+/, ' ').strip
0
+ end
0
+
0
 private
0
 
0
   def generate_activation_code
...
18
19
20
 
 
 
 
 
 
21
22
23
...
18
19
20
21
22
23
24
25
26
27
28
29
0
@@ -18,6 +18,12 @@
0
             Sent at <%= @page.sent_as_newsletter_email_at.strftime("%I:%M <small>%p</small> on %B %d, %Y") %>.
0
             Email queue: <strong><%= NewsletterEmail.count(:conditions => ["page_id = ?", @page.id]) %></strong> |
0
             <%= link_to 'Logs', :controller => '/newsletter_logs' %>
0
+ <% if @page.is_a?(NewsletterEmailPage) %>
0
+ <br />
0
+ Subscribers that has read the newsletter: <%= @page.opened_count %> |
0
+ Subscribers that has clicked a link in the newsletter: <%= @page.clicked_count %>
0
+ <% end %>
0
+
0
         <% end -%>
0
         </p>
0
         <p>
...
11
12
13
 
 
14
15
16
17
18
 
 
19
20
21
...
11
12
13
14
15
16
17
18
 
19
20
21
22
23
24
0
@@ -11,11 +11,14 @@ class NewsletterExtension < Radiant::Extension
0
     map.connect 'admin/newsletters/:newsletter_id/subscribers/:action/:id', :controller => 'newsletter_subscribers'
0
     map.connect 'admin/newsletters/:newsletter_id/subscribers/:action/:id', :controller => 'newsletter_subscribers'
0
     map.connect 'admin/newsletters/:page_id/:action', :controller => 'newsletters'
0
+ map.connect 'newsletters/:id/track/:subscriber_id/open', :controller => 'newsletter_traces', :action => 'open'
0
+ map.connect 'newsletters/:id/track/:subscriber_id/click', :controller => 'newsletter_traces', :action => 'click'
0
   end
0
   
0
   def activate
0
- NewsletterPage
0
     Page.class_eval{ has_many :emails, :class_name => 'NewsletterEmail', :dependent => :delete_all }
0
+ NewsletterPage
0
+ NewsletterEmailPage
0
     admin.page.edit.add :main, "page_edit_main_newsletter", :after => 'edit_header'
0
   end
0
   
...
95
96
97
 
98
99
100
101
102
 
 
103
104
...
95
96
97
98
99
100
101
102
 
103
104
105
106
0
@@ -95,9 +95,11 @@ newsletter_config:
0
   content: |
0
     from: hello@example.com
0
     subject_prefix: My newsletter
0
+ base_url: http://localhost:3000
0
   page_id: 2
0
 first_email_for_newsletter_body:
0
   id: 13
0
   name: body
0
- content: Hello from the first newsletter
0
+ content: |
0
+ Hello from the first newsletter. Here is a link: <r:newsletter:tracking:link url="http://google.com">Google</r:newsletter:tracking:link>. Here is the bug: <r:newsletter:tracking:bug />.
0
   page_id: 4
0
\ No newline at end of file
...
32
33
34
 
35
36
37
...
32
33
34
35
36
37
38
0
@@ -32,6 +32,7 @@ first_email_for_newsletter:
0
   status_id: 100
0
   parent_id: 2
0
   published_at: <%= 1.day.ago.to_s :db %>
0
+ class_name: NewsletterEmailPage
0
 second_email_for_newsletter:
0
   id: 5
0
   title: Second email for Newsletter
...
64
65
66
 
 
 
 
 
 
 
67
68
69
...
64
65
66
67
68
69
70
71
72
73
74
75
76
0
@@ -64,6 +64,13 @@ class NewslettersControllerTest < Test::Unit::TestCase
0
       assert_equal 0, ActionMailer::Base.deliveries.size
0
     end
0
   end
0
+
0
+ def test_create_should_send_emails_with_subscriber_if_page_is_a_newsletter_email_page
0
+ post :create, :page_id => pages(:first_email_for_newsletter).id
0
+ body = NewsletterEmail.find(:first).mail
0
+ assert_match(%r{newsletters\/4\/track\/1\/click}, body) # Link
0
+ assert_match(%r{newsletters\/4\/track\/1\/open}, body) # Web beacon
0
+ end
0
   
0
   def test_should_send_test_email
0
     assert_difference NewsletterEmail, :count, 0 do
...
1
2
3
4
 
5
6
7
...
1
2
3
 
4
5
6
7
0
@@ -1,7 +1,7 @@
0
 require File.dirname(__FILE__) + '/../test_helper'
0
 
0
 class NewsletterPageTest < Test::Unit::TestCase
0
- fixtures :newsletter_subscribers, :pages, :page_parts
0
+ fixtures :newsletter_subscribers, :pages, :page_parts, :newsletter_traces
0
   
0
   def test_should_destroy_newsletter_subscriber
0
     assert_difference NewsletterSubscriber, :count, -4 do
...
126
127
128
 
 
 
 
129
130
131
...
126
127
128
129
130
131
132
133
134
135
0
@@ -126,6 +126,10 @@ class NewsletterSubscriberTest < Test::Unit::TestCase
0
      end
0
    end
0
    
0
+ def test_address
0
+ assert_equal "Tom <tom@example.com>", newsletter_subscribers(:tom).address
0
+ end
0
+
0
 private
0
 
0
   def create_newsletter_subscriber(options = {})

Comments

    No one has commented yet.