Skip to content

Commit

Permalink
Merge ba56b4e into f5c0702
Browse files Browse the repository at this point in the history
  • Loading branch information
voodoorai2000 committed Nov 8, 2018
2 parents f5c0702 + ba56b4e commit 4371817
Show file tree
Hide file tree
Showing 30 changed files with 803 additions and 2 deletions.
1 change: 1 addition & 0 deletions Gemfile
Expand Up @@ -40,6 +40,7 @@ gem 'uglifier', '>= 1.3.0'
gem 'rollbar', '>= 2.15.5'
gem 'premailer-rails'
gem 'whenever', :require => false
gem 'rinku', '~> 2.0.2'

group :development do
gem 'better_errors', '~> 2.1.1'
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Expand Up @@ -334,6 +334,7 @@ GEM
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
rinku (2.0.4)
rollbar (2.15.5)
multi_json
rsolr (1.0.12)
Expand Down Expand Up @@ -520,6 +521,7 @@ DEPENDENCIES
rails-i18n (~> 4.0, >= 4.0.9)
rails4-autocomplete
rails_layout (~> 1.0.26)
rinku (~> 2.0.2)
rollbar (>= 2.15.5)
rspec-rails (~> 3.7, >= 3.7.2)
rubocop (~> 0.51.0)
Expand Down
1 change: 1 addition & 0 deletions app/assets/stylesheets/admin.css.scss
Expand Up @@ -13,6 +13,7 @@
*= require all
*= require admin/agents
*= require admin/events
*= require admin/newsletters
*= require fixes
*= require foundation-icons
*= require 'jquery-ui/sortable'
Expand Down
10 changes: 10 additions & 0 deletions app/assets/stylesheets/admin/newsletters.scss
@@ -0,0 +1,10 @@
.margin-top {
margin-top: 24px;
}

.highlight {
background: #e7f2fc;
border: 1px solid #f3f8fd;
margin-bottom: 24px;
padding: 12px;
}
68 changes: 68 additions & 0 deletions app/controllers/admin/newsletters_controller.rb
@@ -0,0 +1,68 @@
module Admin
class NewslettersController < AdminController

def index
@newsletters = Newsletter.all
end

def show
@newsletter = Newsletter.find(params[:id])
end

def new
@newsletter = Newsletter.new
end

def create
@newsletter = Newsletter.new(newsletter_params)

if @newsletter.save
notice = t("backend.newsletters.create_success")
redirect_to [:admin, @newsletter], notice: notice
else
render :new
end
end

def edit
@newsletter = Newsletter.find(params[:id])
end

def update
@newsletter = Newsletter.find(params[:id])

if @newsletter.update(newsletter_params)
redirect_to [:admin, @newsletter], notice: t("backend.newsletters.update_success")
else
render :edit
end
end

def destroy
@newsletter = Newsletter.find(params[:id])
@newsletter.destroy

redirect_to admin_newsletters_path, notice: t("backend.newsletters.delete_success")
end

def deliver
@newsletter = Newsletter.find(params[:id])

if @newsletter.valid?
@newsletter.deliver
@newsletter.update(sent_at: Time.current)
flash[:notice] = t("backend.newsletters.send_success")
else
flash[:error] = t("admin.segment_recipient.invalid_recipients_segment")
end

redirect_to [:admin, @newsletter]
end

private

def newsletter_params
params.require(:newsletter).permit(:subject, :segment_recipient, :from, :body, :interest_id)
end
end
end
9 changes: 9 additions & 0 deletions app/helpers/text_with_links_helper.rb
@@ -0,0 +1,9 @@
require 'rails_rinku'
module TextWithLinksHelper

def safe_html_with_links(html)
return if html.nil?
Rinku.auto_link(html, :all, 'target="_blank" rel="nofollow"').html_safe
end

end
8 changes: 8 additions & 0 deletions app/mailers/user_mailer.rb
@@ -1,5 +1,7 @@
class UserMailer < ApplicationMailer

helper :text_with_links

def welcome(user)
@user = user
mail(to: @user.email, subject: t('mailers.welcome_user.subject'))
Expand All @@ -13,4 +15,10 @@ def infringement_email(infringement_email, attachment = nil)
mail(to: "buzonlobby@madrid.es", bcc: admin_emails, subject: infringement_email.subject)
end

def newsletter(newsletter, recipient_email)
@newsletter = newsletter

mail(to: recipient_email, subject: @newsletter.subject)
end

end
9 changes: 9 additions & 0 deletions app/models/log.rb
@@ -0,0 +1,9 @@
class Log < ActiveRecord::Base
belongs_to :actionable, polymorphic: true
belongs_to :organization

def self.activity(organization, action, actionable)
create(organization: organization, action: action.to_s, actionable: actionable)
end

end
41 changes: 41 additions & 0 deletions app/models/newsletter.rb
@@ -0,0 +1,41 @@
class Newsletter < ActiveRecord::Base
belongs_to :interest

validates :subject, presence: true
validates :body, presence: true
validates :interest_id, presence: true

def list_of_recipient_emails
Organization.where(organization_interests: { interest: interest })
.joins(:organization_interests)
.pluck(:email)
end

def draft?
sent_at.nil?
end

def deliver
list_of_recipient_emails.each do |recipient_email|
if valid_email?(recipient_email)
begin
UserMailer.newsletter(self, recipient_email).deliver_now
log_delivery(recipient_email)
rescue
log_delivery(recipient_email, :email_error)
end
end
end
end

private

def valid_email?(email)
email.match(/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i)
end

def log_delivery(recipient_email, action=:email)
organization = Organization.where(email: recipient_email).first
Log.activity(organization, action, self)
end
end
31 changes: 31 additions & 0 deletions app/views/admin/newsletters/_form.html.erb
@@ -0,0 +1,31 @@
<%= form_for [:admin, @newsletter] do |f| %>

<label><%= t('backend.newsletters.new.category') %></label>
<%= f.select :interest_id,
Interest.all.collect { |interest| [interest.name, interest.id] },
prompt: t('backend.newsletters.new.select_category') %>
<% if @newsletter.errors.any? %>
<div class="panel alert-box alert radius">
<strong>
<%= t('activerecord.errors.template.header',
:model => Newsletter.model_name.human,
:count => @newsletter.errors.count) %></strong>
<ul>
<% @newsletter.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.label :subject, t('backend.newsletters.new.subject') %>
<%= f.text_field :subject %>
<%= f.label :body, t('backend.newsletters.new.body') %>
<%= f.text_area :body, rows: 10 %>

<div class="margin-top">
<%= f.submit class: "button success" %>
</div>
<% end %>
7 changes: 7 additions & 0 deletions app/views/admin/newsletters/edit.html.erb
@@ -0,0 +1,7 @@
<%= link_to t('backend.back'),
admin_newsletters_path ,
class: "button tiny radius" %>

<h2><%= t("backend.newsletters.edit.title") %></h2>

<%= render "form" %>
48 changes: 48 additions & 0 deletions app/views/admin/newsletters/index.html.erb
@@ -0,0 +1,48 @@
<h2 class="inline-block"><%= t("backend.newsletters.index.title") %></h2>
<%= link_to t("backend.newsletters.index.new_newsletter"), new_admin_newsletter_path,
class: "button float-right" %>
<% if @newsletters.any? %>
<table id="newsletters">
<thead>
<tr>
<th class="small-2"><%= t("backend.newsletters.index.subject") %></th>
<th><%= t("backend.newsletters.index.sent") %></th>
<th><%= t("backend.newsletters.index.actions") %></th>
</tr>
</thead>
<tbody>
<% @newsletters.order(created_at: :desc).each do |newsletter| %>
<tr id="<%= dom_id(newsletter) %>" class="newsletter">
<td>
<%= newsletter.subject %>
</td>
<td>
<% if newsletter.draft? %>
<%= t("backend.newsletters.index.draft") %>
<% else %>
<%= l newsletter.sent_at.to_date %>
<% end %>
</td>
<td>
<%= link_to t("backend.newsletters.index.edit"),
edit_admin_newsletter_path(newsletter),
class: "button hollow expanded" %>
<%= link_to t("backend.newsletters.index.delete"),
admin_newsletter_path(newsletter),
method: :delete, class: "button hollow alert expanded" %>
<%= link_to t("backend.newsletters.index.preview"),
admin_newsletter_path(newsletter),
class: "button expanded" %>
</td>
</tr>
<% end %>
</tbody>
</table>
<% else %>
<div data-alert class="alert-box radius primary margin-top clear">
<%= t("backend.newsletters.index.empty_newsletters") %>
</div>
<% end %>
7 changes: 7 additions & 0 deletions app/views/admin/newsletters/new.html.erb
@@ -0,0 +1,7 @@
<%= link_to t('backend.back'),
admin_newsletters_path ,
class: "button tiny radius" %>

<h2><%= t("backend.newsletters.new.title") %></h2>

<%= render "form" %>
71 changes: 71 additions & 0 deletions app/views/admin/newsletters/show.html.erb
@@ -0,0 +1,71 @@
<%= link_to t('backend.back'),
admin_newsletters_path ,
class: "button tiny radius" %>

<h2><%= t("backend.newsletters.show.title") %></h2>

<% recipients_count = @newsletter.list_of_recipient_emails.count %>

<div class="small-12 column callout highlight">
<div class="small-12 medium-2 column">
<strong><%= t("backend.newsletters.show.sent_at") %></strong><br>
<% if @newsletter.draft? %>
<%= t("backend.newsletters.index.draft") %>
<% else %>
<%= l @newsletter.sent_at.to_date %>
<% end %>
</div>
<div class="small-12 medium-4 column">
<strong><%= t("backend.newsletters.show.subject") %></strong><br>
<%= @newsletter.subject %>
</div>
<div class="small-12 medium-4 column">
<strong><%= t("backend.newsletters.show.category") %></strong>
Asociaciones/Fundaciones
</div>
<div class="small-12 column margin-top">
<strong><%= t("backend.newsletters.show.segment_recipient") %></strong><br>
<%= t("backend.newsletters.show.affected_users", n: recipients_count) %>
</div>
</div>

<div class="small-12 column">
<strong><%= t("backend.newsletters.show.body") %></strong>
<p class="help-text" id="phase-description-help-text">
<%= t("backend.newsletters.show.body_help_text") %>
</p>
</div>

<div class="newsletter-body-content">

<table cellpadding="0" cellspacing="0" border="0" style="background: #fff; margin: 0 auto; max-width: 800px; width:100%;">
<thead>
<tr>
<th style="background: #013df5;">
<%= image_tag 'logo-email.jpg', alt:'¡Madrid' %>
</th>
</tr>
</thead>
<tbody>
<tr>
<%= render file: "app/views/user_mailer/newsletter.html.erb" %>
</tr>
<tr>
<td>
<p><%= t('mailers.footer', year: Date.current.year) %></p>
</td>
</tr>
</tbody>
</table>
</div>

<% if @newsletter.draft? %>
<div class="samll-12 column margin-top">
<%= link_to t("backend.newsletters.show.send"),
deliver_admin_newsletter_path(@newsletter),
"data-alert": t("backend.newsletters.show.send_alert", n: recipients_count),
method: :post,
id: "js-send-newsletter-alert",
class: "button success" %>
</div>
<% end %>
5 changes: 5 additions & 0 deletions app/views/layouts/_admin_sidebar.html.erb
Expand Up @@ -108,6 +108,11 @@
<% end %>
</li>
<% end %>
<li class="<%= active_menu('admin/newsletters') %>">
<%= link_to admin_newsletters_path do %>
<i class="fi-mail size-18"> <%= t("backend.newsletters.title") %></i>
<% end %>
</li>
<li>
<%= link_to help_by_role(current_user), target: "_blank" do %>
<i class="fi-magnifying-glass size-18"> <%= t("header.btn_help")%></i>
Expand Down
5 changes: 5 additions & 0 deletions app/views/user_mailer/newsletter.html.erb
@@ -0,0 +1,5 @@
<td style="padding-bottom: 20px; padding-left: 10px;">
<p style="font-family: 'Open Sans','Helvetica Neue',arial,sans-serif;font-size: 14px;line-height: 24px;">
<%= safe_html_with_links @newsletter.body.html_safe %>
</p>
</td>

0 comments on commit 4371817

Please sign in to comment.