newsly 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/MIT-LICENSE +0 -0
  2. data/README.rdoc +7 -0
  3. data/Rakefile +39 -0
  4. data/app/controllers/newsly/application_controller.rb +5 -0
  5. data/app/controllers/newsly/newsletters_controller.rb +57 -0
  6. data/app/controllers/newsly/snippets_controller.rb +10 -0
  7. data/app/controllers/newsly/templates_controller.rb +47 -0
  8. data/app/helpers/newsly/application_helper.rb +4 -0
  9. data/app/mailers/newsly/mailer.rb +51 -0
  10. data/app/models/newsly/newsletter.rb +13 -0
  11. data/app/models/newsly/template.rb +16 -0
  12. data/app/views/layouts/newsly/application.html.erb +20 -0
  13. data/app/views/layouts/newsly/mailer.html.erb +5 -0
  14. data/app/views/newsly/_navigation.html.erb +5 -0
  15. data/app/views/newsly/newsletters/_newsletter.html.liquid +26 -0
  16. data/app/views/newsly/newsletters/_sidebar.html.erb +28 -0
  17. data/app/views/newsly/newsletters/index.html.erb +20 -0
  18. data/app/views/newsly/newsletters/show.html.erb +9 -0
  19. data/app/views/newsly/snippets/index.html.erb +12 -0
  20. data/app/views/newsly/templates/index.html.erb +15 -0
  21. data/app/views/newsly/templates/show.html.erb +19 -0
  22. data/app/workers/newsly/newsletter_sender.rb +14 -0
  23. data/config/routes.rb +20 -0
  24. data/db/migrate/20110907161522_create_newsly_newsletters.rb +11 -0
  25. data/db/migrate/20110912110413_create_newsly_templates.rb +12 -0
  26. data/db/migrate/20110926113235_add_draft_column_to_templates.rb +6 -0
  27. data/db/migrate/20110927120903_add_text_body_fields.rb +6 -0
  28. data/db/migrate/20110929142039_remove_text_body_fields.rb +6 -0
  29. data/lib/newsly.rb +27 -0
  30. data/lib/newsly/engine.rb +19 -0
  31. data/lib/newsly/version.rb +3 -0
  32. data/lib/tasks/newsly_tasks.rake +7 -0
  33. data/public/javascripts/jquery.js +49 -0
  34. data/public/javascripts/newsletters.js +68 -0
  35. data/public/javascripts/rails.js +363 -0
  36. data/public/javascripts/templates.js +41 -0
  37. data/public/mercury/javascripts/mercury.min.js +16937 -0
  38. data/public/mercury/javascripts/mercury_dialogs.js +18 -0
  39. data/public/mercury/javascripts/mercury_loader.js +191 -0
  40. data/public/mercury/stylesheets/mercury.bundle.css +241 -0
  41. data/public/stylesheets/application.css +253 -0
  42. metadata +176 -0
data/MIT-LICENSE ADDED
File without changes
data/README.rdoc ADDED
@@ -0,0 +1,7 @@
1
+ ##Newsly lets you manage your rails mailer templates via liquid.
2
+ Included is the mercury editor (https://github.com/jejacks0n/mercury) for wysiwyg and are ready for
3
+ sending mails via resque.
4
+
5
+ Better description is coming... soon!
6
+
7
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Newsly'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+ Bundler::GemHelper.install_tasks
28
+
29
+ require 'rake/testtask'
30
+
31
+ Rake::TestTask.new(:test) do |t|
32
+ t.libs << 'lib'
33
+ t.libs << 'test'
34
+ t.pattern = 'test/**/*_test.rb'
35
+ t.verbose = false
36
+ end
37
+
38
+
39
+ task :default => :test
@@ -0,0 +1,5 @@
1
+ module Newsly
2
+ class ApplicationController < ActionController::Base
3
+ include ActionView::Helpers::DateHelper
4
+ end
5
+ end
@@ -0,0 +1,57 @@
1
+ module Newsly
2
+ class NewslettersController < ApplicationController
3
+
4
+ respond_to :html, :json
5
+ respond_to :text, :only => :preview
6
+
7
+
8
+ before_filter :get_newsletter, :except => [:index]
9
+
10
+ def index
11
+ @newsletters = Newsletter.all
12
+ end
13
+
14
+ def show
15
+ end
16
+
17
+ def new
18
+ render :show
19
+ end
20
+
21
+ def update
22
+ if @newsletter.update_attributes(params[:newsletter])
23
+ render :text => "Last saved #{distance_of_time_in_words_to_now(Time.now, true)} ago"
24
+ else
25
+ render :text => "Kunde inte sparas"
26
+ end
27
+ end
28
+
29
+ def send_test
30
+ if Newsly::Mailer.send_newsletter(@newsletter.id, params[:to], Newsly.test_data).deliver
31
+ render :text => "Okidoki"
32
+ end
33
+ end
34
+
35
+ def deliver
36
+ if params[:answer] == "DELIVER"
37
+ #Newsly::NewsletterSender.perform(@newsletter.id, params[:recipient_groups])
38
+ Resque.enqueue(Newsly::NewsletterSender, @newsletter.id, params[:recipient_groups])
39
+ @newsletter.sent = true
40
+ @newsletter.save
41
+ render :text => "NEWSLETTER DELIVERED"
42
+ else
43
+ render :text => "WARNING! Not sent, did you answer correctly?"
44
+ end
45
+ end
46
+
47
+ def destroy
48
+ @newsletter.destroy
49
+ redirect_to newsletters_url
50
+ end
51
+
52
+ protected
53
+ def get_newsletter
54
+ @newsletter = params[:id] ? Newsly::Newsletter.find(params[:id]) : Newsly::Newsletter.create(:title => "Nyhetsbrevs rubrik", :body => "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod.", :sent => false)
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,10 @@
1
+ module Newsly
2
+ class SnippetsController < ApplicationController
3
+
4
+ layout false
5
+
6
+ def index
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: UTF-8
2
+ module Newsly
3
+ class TemplatesController < ApplicationController
4
+
5
+ def index
6
+ @templates = Newsly::Template.where(:draft => false)
7
+ end
8
+
9
+ def show
10
+ @template = Newsly::Template.where(:parent_id => params[:id], :draft => true).first
11
+ if @template.nil?
12
+ @template = Newsly::Template.find(params[:id]).dup
13
+ @template.draft = true
14
+ @template.parent_id = params[:id]
15
+ @template.save
16
+ end
17
+ end
18
+
19
+ def update
20
+ @template = Newsly::Template.find(params[:id])
21
+ if @template.update_attributes(params[:template])
22
+ render :text => "Last saved #{distance_of_time_in_words_to_now(Time.now, true)} ago"
23
+ else
24
+ render :text => "Kunde inte sparas"
25
+ end
26
+ end
27
+
28
+ def send_test
29
+ @template = Newsly::Template.find(params[:id])
30
+ if Newsly::Mailer.send_mail(@template.id, params[:to], Newsly.test_data).deliver
31
+ render :text => "Okidoki"
32
+ end
33
+
34
+ end
35
+
36
+
37
+ def publish
38
+ @draft = Newsly::Template.find(params[:id])
39
+ @original = Newsly::Template.find(@draft.parent_id)
40
+ @original.subject = @draft.subject
41
+ @original.body = @draft.body
42
+ @original.save
43
+ render :text => "Published"
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,4 @@
1
+ module Newsly
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: UTF-8
2
+ module Newsly
3
+ class Mailer < ActionMailer::Base
4
+
5
+ default :from => "Newsly <noreply@newsly.com>"
6
+
7
+ def mail(headers = {}, &block)
8
+ caller = caller[0][/`.*'/][1..-2] if caller
9
+
10
+ template_data = headers.delete(:template_data)
11
+ template_id = headers.delete(:template_id)
12
+ template_name = headers.delete(:template_name)
13
+
14
+ tmpl = if template_id
15
+ Newsly::Template.find(template_id)
16
+ elsif template_name
17
+ Newsly::Template.where(:name => template_name, :draft => false).first
18
+ else
19
+ Newsly::Template.find_by_caller(self.class.to_s, caller).where(:draft => false).first
20
+ end
21
+
22
+ if tmpl
23
+ headers[:subject] ||= tmpl.subject
24
+ mail_body = tmpl.render(template_data).html_safe
25
+ super(headers) do |format|
26
+ #format.text { Premailer.new(mail_body, :with_html_string => true).to_plain_text }
27
+ format.html { render :inline => mail_body, :layout => true }
28
+ end
29
+ else
30
+ super(headers, &block)
31
+ end
32
+ end
33
+
34
+ def send_newsletter(newsletter_id, to, template_data = {})
35
+ @newsletter = Newsly::Newsletter.find(newsletter_id)
36
+ @template = Newsly::Template.where(:name => "newsletter", :draft => false).first
37
+ @template_data = template_data.merge({"newsletter" => {"body" => @newsletter.render(template_data)}})
38
+ mail(:to => to, :subject => "#{@newsletter.title}", :template_id => @template.id, :template_data => @template_data)
39
+ end
40
+
41
+ def send_mail(template_id, to, template_data = {})
42
+ mail(:to => to, :template_id => template_id, :template_data => template_data)
43
+ end
44
+
45
+ def self.render_body(template_name, template_type, template_data = {})
46
+ tpl = Newsly::Template.where(:name => template_name.to_s, :template_type => template_type, :draft => false).first
47
+ tpl.render(template_data)
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: UTF-8
2
+ module Newsly
3
+ class Newsletter < ActiveRecord::Base
4
+ liquid_methods :title, :body
5
+
6
+
7
+ #these 2 methods are duplicated in template.rb.. DRY up!
8
+ def render(options={})
9
+ Liquid::Template.parse(self.body).render options
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: UTF-8
2
+ module Newsly
3
+ class Template < ActiveRecord::Base
4
+ liquid_methods :body
5
+
6
+ scope :find_by_caller, lambda { |mailer, method|
7
+ where(:mailer => mailer, :method => method)
8
+ }
9
+
10
+ #these 2 methods are duplicated in newsletter.rb.. DRY up!
11
+ def render(options={})
12
+ Liquid::Template.parse(self.body).render options
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Newsly</title>
5
+ <%= javascript_include_tag "jquery", "rails" %>
6
+ <%= stylesheet_link_tag "application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <% if flash[:notice] %>
11
+ <div class="flash"> <%= flash[:notice] %> </div>
12
+ <div class="clearfix"></div>
13
+ <% end %>
14
+ <div id="flash" class="flash"></div>
15
+ <div id="page">
16
+ <%= yield %>
17
+ <div class="clearfix"></div>
18
+ </div>
19
+ </body>
20
+ </html>
@@ -0,0 +1,5 @@
1
+ <html>
2
+ <body>
3
+ <%= yield %>
4
+ </body>
5
+ </html>
@@ -0,0 +1,5 @@
1
+ <ul id="nav">
2
+ <li class="<%= "active" if params[:controller] == "newsly/newsletters" %>"><%= link_to t('Newsletters'), newsletters_path %></li>
3
+ <li class="<%= "active" if params[:controller] == "newsly/templates" %>"><%= link_to t('Templates'), templates_path %></li>
4
+ </ul>
5
+ <div class="clearfix"></div>
@@ -0,0 +1,26 @@
1
+ #THIS GOES IN DATABASE MOFO!
2
+ <style type="text/css">
3
+ .clearfix:before, .clearfix:after { content: "\0020"; display: block; height: 0; overflow: hidden; }
4
+ .clearfix:after { clear: both; }
5
+ .clearfix { zoom: 1; }
6
+ #newsletter{font-family: "Lucida Grande", sans-serif;}
7
+ h2, h3{ margin: 0; padding: 0;}
8
+ </style>
9
+ <div style="width: 650px; margin: 20px auto; background-color: #eee;">
10
+
11
+ <img src="http://minasidor.baraspara.se/images/web/my_pages/temp_logo2.png" style="float: left; margin: 20px 0 0 20px" class="editable"/>
12
+ <div class="editable"style="float: right; margin: 20px 20px 0 0; font-size: 11px; color: #777;">Ser brevet konstigt ut? <a href="#">L&auml;s det p&aring; webben</a> ist&auml;llet.</div>
13
+ <div class="clearfix"></div>
14
+ <div style="float: left; background-image: url('http://minasidor.baraspara.se/images/web/my_pages/mail_header_640.png'); width: 630px; padding: 10px 10px 0 0; background-repeat: no-repeat; margin: 20px 0 0 10px; height: 30px;">
15
+ <h4 class="title editable_block" id="title" style="font-weight: normal; font-size: 12px; text-align: right; margin: 0; padding: 0; color: #555;">{{newsletter.title}}</h4>
16
+ </div>
17
+ <div style="float: left; text-align: left;width: 618px; margin: 0 10px; font-size: 12px; line-height: 24px; color: #444; background: #fff; padding: 1px 10px; border: 1px solid #cecece; border-top: 0;" id="body">
18
+ {{newsletter.body}}
19
+ </div>
20
+ <div class="editable" style="width: 620px; margin: 0 10px; font-size: 11px; line-height: 18px; padding: 20px 5px; text-align: left; float: left;">
21
+ <b>Varf&ouml;r f&aring;r jag detta mail?</b>
22
+ <br />
23
+ Du f&aring;r detta nyhetsbrev eftersom du &auml;r medlem p&aring; Baraspara. Vill du inte ha fler nyhetsbrev kan du givetvis <a href="#">avsluta din prenumeration.</a>
24
+ </div>
25
+ <div class="clearfix"></div>
26
+ </div>
@@ -0,0 +1,28 @@
1
+ <div id="sidebar">
2
+ <ul class="links">
3
+ <% if !@newsletter.sent? and @newsletter.persisted?%>
4
+ <li class="button">
5
+ <%= link_to "<em>❖</em>Send test".html_safe, send_test_newsletter_path(@newsletter), :id => "send_test"%>
6
+ </li>
7
+ <% if Newsly.recipient_groups.count > 0 %>
8
+ <li class="groups">
9
+ <form id="groupform" class="groupform">
10
+ <ul>
11
+ <% for group in Newsly.recipient_groups %>
12
+ <li>
13
+ <input type="checkbox" name="<%=group[0].to_s%>" value="<%=group[0].to_s%>" id="group_<%=group[0].to_s%>" />
14
+ <label for="group_<%=group[0].to_s%>"><%= group[0].to_s.humanize %> (<%= group[1].call.count %>)</label>
15
+ </li>
16
+ <% end %>
17
+ </ul>
18
+ </form>
19
+ </li>
20
+ <li class="button">
21
+ <%= link_to "<em>✈</em>Deliver!".html_safe, deliver_newsletter_path(@newsletter), :id => "deliver"%>
22
+ </li>
23
+ <% end %>
24
+ <% end %>
25
+ <li><%= link_to '<em>☜</em> Back'.html_safe, newsletters_path %></li>
26
+ </ul>
27
+ <div id="saved"></div>
28
+ </div>
@@ -0,0 +1,20 @@
1
+ <%= render :partial => "/newsly/navigation" %>
2
+ <div id="content">
3
+ <h2><%= t("Newsletters")%></h2>
4
+ <table cellspacing="0" cellpadding="0">
5
+ <tbody>
6
+ <% @newsletters.each do |newsletter| %>
7
+ <tr>
8
+ <td class="<%= newsletter.sent? ? "sent": "draft" %>"><%= newsletter.sent? ? t("sent"): t("draft") %></td>
9
+ <td class="title"><%= link_to newsletter.title, newsletter %></td>
10
+ <td class="action"><%= link_to 'Destroy', newsletter, confirm: 'Are you sure?', method: :delete if !newsletter.sent?%></td>
11
+ </tr>
12
+ <% end %>
13
+ </tbody>
14
+ </table>
15
+ </div>
16
+ <div id="sidebar">
17
+ <ul class="links">
18
+ <li><%= link_to "<em>+</em>#{t('New Newsletter')}".html_safe, new_newsletter_path %></li>
19
+ </ul>
20
+ </div>
@@ -0,0 +1,9 @@
1
+ <div id="content">
2
+ <div id="newsletter" data-id="<%=@newsletter.id%>" data-url="<%=newsletter_path(@newsletter)%>">
3
+ <h2 id="title" class="mercury-region" data-type="markupable"><%= @newsletter.title.html_safe %></h2>
4
+ <div id="body" class="mercury-region" data-type="editable"><%= @newsletter.body.html_safe %></div>
5
+ </div>
6
+ </div>
7
+ <%= render 'sidebar' %>
8
+
9
+ <%= javascript_include_tag "/mercury/javascripts/mercury_loader.js", "newsletters" %>
@@ -0,0 +1,12 @@
1
+ <div class="mercury-snippet-panel">
2
+ <div class="filter">
3
+ <input class="filter" type="text">
4
+ </div>
5
+ <ul>
6
+ <li data-filter="name-snippet">
7
+ <img alt="Mottagarens namn" data-snippet="person_name" src="/assets/mercury/default-snippet.png"/>
8
+ <h4>Mottagarens namn</h4>
9
+ <div class="description">Mottagarens namn visas i mailet. t.ex "Kim F"</div>
10
+ </li>
11
+ </ul>
12
+ </div>
@@ -0,0 +1,15 @@
1
+ <%= render :partial => "/newsly/navigation" %>
2
+ <div id="content">
3
+ <h2><%= t("Templates")%></h2>
4
+ <table cellspacing="0" cellpadding="0">
5
+ <tbody>
6
+ <% @templates.each do |template| %>
7
+ <tr>
8
+ <td class="title"><%= link_to template.name, template %> (<%=t(template.template_type)%>)</td>
9
+ </tr>
10
+ <% end %>
11
+ </tbody>
12
+ </table>
13
+ </div>
14
+ <div id="sidebar">
15
+ </div>
@@ -0,0 +1,19 @@
1
+ <div id="content">
2
+ <div id="template" data-id="<%=@template.id%>" data-url="<%=template_path(@template)%>">
3
+ <h2 id="subject" class="mercury-region" data-type="markupable"><%= @template.subject.html_safe %></h2>
4
+ <div id="body" class="mercury-region" data-type="editable"><%= @template.body.html_safe %></div>
5
+ </div>
6
+ </div>
7
+ <div id="sidebar">
8
+ <ul class="links">
9
+ <li class="buttons">
10
+ <%= link_to "<em>❖</em>Test".html_safe, send_test_template_path(@template), :class => "remote" %>
11
+ <%= link_to "<em>✈</em>Publish".html_safe, publish_template_path(@template), :class => "remote", :id => "publish" %>
12
+ </li>
13
+
14
+ <li><%= link_to '<em>☜</em> Back'.html_safe, templates_path %></li>
15
+ </ul>
16
+ <div id="saved"></div>
17
+ </div>
18
+
19
+ <%= javascript_include_tag "/mercury/javascripts/mercury_loader.js", "templates" %>