Big changes related to mail management and events lifecycle
This commit is contained in:
parent
a1498ac05a
commit
1b6c5e16d2
@ -35,7 +35,7 @@ class EventsController < ApplicationController
|
||||
# POST /events.json
|
||||
def create
|
||||
respond_to do |format|
|
||||
if @event.save && send_creation_mails
|
||||
if @event.save
|
||||
format.html { redirect_to :root, notice: t('.ok') }
|
||||
# 201 means :created
|
||||
format.json { render action: 'show', status: 201, location: @event }
|
||||
@ -58,7 +58,7 @@ class EventsController < ApplicationController
|
||||
# PATCH/PUT /events/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @event.update(event_params) && send_update_mails
|
||||
if @event.update event_params
|
||||
format.html { redirect_to :root, notice: t('.ok') }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
@ -108,26 +108,14 @@ class EventsController < ApplicationController
|
||||
:contact, :submitter, :tags
|
||||
end
|
||||
|
||||
def locked
|
||||
redirect_to edit_event_url(@event, secret: @event.secret),
|
||||
alert: t('staleObjectError')
|
||||
end
|
||||
|
||||
# Check that you can only edit an existing event if you know its secret
|
||||
def check_secret
|
||||
redirect_to :root, alert: t(:forbidden, scope: [:events, :edit]) \
|
||||
unless params[:secret] == @event.secret
|
||||
end
|
||||
|
||||
def send_creation_mails
|
||||
# Send an event creation mail to its author
|
||||
EventMailer.create(@event).deliver_now
|
||||
# Send a mail to moderators
|
||||
ModerationMailer.create(@event).deliver_now
|
||||
end
|
||||
|
||||
def send_update_mails
|
||||
# Send an update mail to moderators
|
||||
ModerationMailer.update(@event, nil).deliver_now
|
||||
end
|
||||
|
||||
def locked
|
||||
redirect_to edit_event_url(@event, secret: @event.secret),
|
||||
alert: t('staleObjectError')
|
||||
end
|
||||
end
|
||||
|
@ -20,7 +20,7 @@ class ModerationsController < ApplicationController
|
||||
# PATCH/PUT /moderations/1.json
|
||||
def update
|
||||
respond_to do |format|
|
||||
if @moderation.update_attributes(moderation_params) && send_mails
|
||||
if @moderation.update_attributes moderation_params
|
||||
format.html { redirect_to :moderations, notice: t('.ok') }
|
||||
format.json { head :no_content }
|
||||
else
|
||||
@ -35,7 +35,6 @@ class ModerationsController < ApplicationController
|
||||
# PATCH/PUT /accept/1.json
|
||||
def accept
|
||||
@moderation.update moderated: true
|
||||
send_accept_mails
|
||||
respond_to do |format|
|
||||
format.html { redirect_to :moderations, notice: t('.ok') }
|
||||
format.json { head :no_content }
|
||||
@ -45,7 +44,8 @@ class ModerationsController < ApplicationController
|
||||
# DELETE /events/1
|
||||
# DELETE /events/1.json
|
||||
def destroy
|
||||
send_destroy_mails if @moderation.destroy
|
||||
@moderation.reason_for_deletion = get_reason_from_params params[:reason]
|
||||
@moderation.destroy!
|
||||
respond_to do |format|
|
||||
format.html { redirect_to :moderations, notice: t('.ok') }
|
||||
format.json { head :no_content }
|
||||
@ -74,45 +74,15 @@ class ModerationsController < ApplicationController
|
||||
ActionMailer::Base.default_url_options[:host] = request.host_with_port
|
||||
end
|
||||
|
||||
def send_mails
|
||||
# Send an update mail to moderators
|
||||
ModerationMailer.update(@moderation, current_user).deliver_now
|
||||
end
|
||||
|
||||
def send_accept_mails
|
||||
tweet
|
||||
|
||||
# Send an acceptation mail to its author
|
||||
EventMailer.accept(@moderation, current_user).deliver_now
|
||||
|
||||
# Send an acceptation mail to moderators
|
||||
ModerationMailer.accept(@moderation, current_user).deliver_now
|
||||
end
|
||||
|
||||
# Tweet this event, if configured using apache/system variables!
|
||||
def tweet
|
||||
client = Twitter::REST::Client.new do |config|
|
||||
config.consumer_key = ENV['TWITTER_CONSUMER_KEY']
|
||||
config.consumer_secret = ENV['TWITTER_CONSUMER_SECRET']
|
||||
config.access_token = ENV['TWITTER_ACCESS_TOKEN']
|
||||
config.access_token_secret = ENV['TWITTER_ACCESS_SECRET']
|
||||
end
|
||||
client.update "#{@event.to_tweet event_url(@event)}" if client.consumer_key
|
||||
end
|
||||
|
||||
def send_destroy_mails
|
||||
# Send a notification to its author
|
||||
if params[:reason] == 'r_4'
|
||||
@reason = params[:reason_text]
|
||||
else
|
||||
@reason = t "moderations.refuse.reason_#{params[:reason]}_long"
|
||||
end
|
||||
|
||||
EventMailer.destroy(@moderation, current_user, @reason).deliver_now
|
||||
ModerationMailer.destroy(@moderation, current_user, @reason).deliver_now
|
||||
end
|
||||
|
||||
def locked
|
||||
redirect_to edit_moderation_url(@moderation), alert: t('staleObjectError')
|
||||
end
|
||||
|
||||
def get_reason_from_params(reason)
|
||||
if reason == 'r_4'
|
||||
reason
|
||||
else
|
||||
t "moderations.refuse.reason_#{reason}_long"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -12,9 +12,9 @@ class EventMailer < ApplicationMailer
|
||||
subject: event.title}"
|
||||
end
|
||||
|
||||
def accept(event, current_user)
|
||||
def accept(event)
|
||||
@event = event
|
||||
@current_user = current_user
|
||||
@current_user = User.find_by id: event.paper_trail_originator
|
||||
|
||||
mail 'In-Reply-To' =>
|
||||
"<event-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
|
||||
@ -23,10 +23,9 @@ class EventMailer < ApplicationMailer
|
||||
subject: event.title}"
|
||||
end
|
||||
|
||||
def destroy(event, current_user, reason)
|
||||
def destroy(event)
|
||||
@event = event
|
||||
@current_user = current_user
|
||||
@reason = reason
|
||||
@current_user = User.find_by id: event.paper_trail_originator
|
||||
|
||||
mail 'In-Reply-To' =>
|
||||
"<event-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
|
||||
|
@ -11,9 +11,9 @@ class ModerationMailer < ApplicationMailer
|
||||
subject: event.title}"
|
||||
end
|
||||
|
||||
def update(event, current_user)
|
||||
def update(event)
|
||||
@event = event
|
||||
@current_user = current_user
|
||||
@current_user = User.find_by id: event.paper_trail_originator
|
||||
|
||||
mail 'In-Reply-To' =>
|
||||
"<mod-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
|
||||
@ -21,9 +21,9 @@ class ModerationMailer < ApplicationMailer
|
||||
subject: event.title}"
|
||||
end
|
||||
|
||||
def accept(event, current_user)
|
||||
def accept(event)
|
||||
@event = event
|
||||
@current_user = current_user
|
||||
@current_user = User.find_by id: event.paper_trail_originator
|
||||
|
||||
mail 'In-Reply-To' =>
|
||||
"<mod-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
|
||||
@ -31,10 +31,9 @@ class ModerationMailer < ApplicationMailer
|
||||
subject: event.title}"
|
||||
end
|
||||
|
||||
def destroy(event, current_user, reason)
|
||||
def destroy(event)
|
||||
@event = event
|
||||
@current_user = current_user
|
||||
@reason = reason
|
||||
@current_user = User.find_by id: event.paper_trail_originator
|
||||
|
||||
mail 'In-Reply-To' =>
|
||||
"<mod-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
|
||||
|
@ -23,6 +23,12 @@ class Event < ActiveRecord::Base
|
||||
# after_validation :geocode, if: -> (obj) { obj.address_changed? }
|
||||
after_validation :geocode
|
||||
|
||||
attr_accessor :reason_for_deletion
|
||||
|
||||
after_create EventCallbacks
|
||||
after_update EventCallbacks
|
||||
after_destroy EventCallbacks
|
||||
|
||||
scope :moderated, -> { where moderated: true }
|
||||
scope :unmoderated, -> { where moderated: false }
|
||||
scope :last_year, -> { where '? <= end_time', 1.year.ago }
|
||||
@ -72,19 +78,14 @@ class Event < ActiveRecord::Base
|
||||
end
|
||||
|
||||
before_update do
|
||||
if moderated? && moderated_was != moderated
|
||||
self.decision_time = Time.zone.now
|
||||
end
|
||||
self.decision_time = Time.zone.now if moderated? && moderated_changed?
|
||||
end
|
||||
|
||||
def as_json(_options = {})
|
||||
popup = "<a href=\"/#{self.class.name.downcase.pluralize}/#{id}\""
|
||||
popup += " >#{start_time.to_date} #{city}: #{title}</a>"
|
||||
{ type: 'Feature', properties: {
|
||||
id: id,
|
||||
name: title,
|
||||
tags: tags,
|
||||
popupContent: popup
|
||||
id: id, name: title, tags: tags, popupContent: popup
|
||||
}, geometry: {
|
||||
type: 'Point', coordinates: [longitude, latitude]
|
||||
} }
|
||||
|
38
app/models/event_callbacks.rb
Normal file
38
app/models/event_callbacks.rb
Normal file
@ -0,0 +1,38 @@
|
||||
# All the mail and tweet related callbacks to event's lifecycle
|
||||
class EventCallbacks
|
||||
def self.after_create(event)
|
||||
EventMailer.create(event).deliver_now!
|
||||
ModerationMailer.create(event).deliver_now!
|
||||
end
|
||||
|
||||
def self.after_update(event)
|
||||
if event.moderated_changed?
|
||||
tweet(event)
|
||||
|
||||
# Send an acceptation mail to its author
|
||||
EventMailer.accept(event).deliver_now
|
||||
|
||||
# Send an acceptation mail to moderators
|
||||
ModerationMailer.accept(event).deliver_now
|
||||
else
|
||||
# Send an update mail to moderators
|
||||
ModerationMailer.update(event).deliver_now
|
||||
end
|
||||
end
|
||||
|
||||
def self.after_destroy(event)
|
||||
EventMailer.destroy(event).deliver_now
|
||||
ModerationMailer.destroy(event).deliver_now
|
||||
end
|
||||
|
||||
# Tweet this event, if configured using apache/system variables!
|
||||
def self.tweet(event)
|
||||
client = Twitter::REST::Client.new do |config|
|
||||
config.consumer_key = ENV['TWITTER_CONSUMER_KEY']
|
||||
config.consumer_secret = ENV['TWITTER_CONSUMER_SECRET']
|
||||
config.access_token = ENV['TWITTER_ACCESS_TOKEN']
|
||||
config.access_token_secret = ENV['TWITTER_ACCESS_SECRET']
|
||||
end
|
||||
client.update "#{event.to_tweet event_url(event)}" if client.consumer_key
|
||||
end
|
||||
end
|
@ -1,6 +1,6 @@
|
||||
= t '.body', author: @current_user
|
||||
\
|
||||
= @reason
|
||||
= @event.reason_for_deletion
|
||||
\
|
||||
= t '.reclamation'
|
||||
\
|
||||
|
@ -48,11 +48,10 @@
|
||||
= raw t '.calendar_in',
|
||||
rss: link_to('RSS', events_path(:rss,
|
||||
tag: params[:tag], region: params[:region])),
|
||||
webcal: link_to('webcal', events_path(tag: params[:tag], protocol: 'webcal', format: :ics, tag: params[:tag],
|
||||
region: params[:region])),
|
||||
webcal: link_to('webcal', events_path(tag: params[:tag],
|
||||
protocol: 'webcal', format: :ics, region: params[:region])),
|
||||
ical: link_to('iCal', events_path(:rss,
|
||||
tag: params[:tag], format: :ics, tag: params[:tag],
|
||||
region: params[:region]))
|
||||
tag: params[:tag], format: :ics, region: params[:region]))
|
||||
|
||||
%a#banner(href='http://april.org/campagne')
|
||||
-# %img(src='http://www.april.org/campagne/images/priorite-logiciel-libre-je-soutiens-april.png'
|
||||
|
@ -1,6 +1,6 @@
|
||||
= t '.body', subject: @event.title, author: @current_user
|
||||
\
|
||||
= @reason
|
||||
= @event.reason_for_deletion
|
||||
\
|
||||
= t '.reminder'
|
||||
= render file: '/events/show'
|
||||
|
@ -16,14 +16,16 @@ class EventMailerTest < ActionMailer::TestCase
|
||||
end
|
||||
|
||||
test 'accept' do
|
||||
mail = EventMailer.accept Event.last, User.last
|
||||
mail = EventMailer.accept Event.last
|
||||
assert_match(/Événement .* modéré/, mail.subject)
|
||||
assert_equal [Event.last.contact], mail.to
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.from
|
||||
end
|
||||
|
||||
test 'destroy' do
|
||||
mail = EventMailer.destroy Event.last, User.last, 'hello world'
|
||||
event = Event.last
|
||||
event.reason_for_deletion = 'hello world'
|
||||
mail = EventMailer.destroy Event.last
|
||||
assert_match(/Événement .* refusé/, mail.subject)
|
||||
assert_equal [Event.last.contact], mail.to
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.from
|
||||
|
@ -25,7 +25,7 @@ class ModerationMailerTest < ActionMailer::TestCase
|
||||
event.description = event.description + '
|
||||
hello world'
|
||||
|
||||
mail = ModerationMailer.update event, User.last
|
||||
mail = ModerationMailer.update event
|
||||
assert_match(/Édition de l'événement .*/, mail.subject)
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.to
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.from
|
||||
@ -34,15 +34,16 @@ hello world'
|
||||
end
|
||||
|
||||
test 'accept' do
|
||||
mail = ModerationMailer.accept Event.unscoped.last, User.last
|
||||
mail = ModerationMailer.accept Event.unscoped.last
|
||||
assert_match(/Événement .* modéré/, mail.subject)
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.to
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.from
|
||||
end
|
||||
|
||||
test 'destroy' do
|
||||
mail = ModerationMailer.destroy Event.unscoped.last, User.last,
|
||||
'hello world'
|
||||
event = Event.unscoped.last
|
||||
event.reason_for_deletion = 'hello world'
|
||||
mail = ModerationMailer.destroy event
|
||||
assert_match(/Événement .* refusé/, mail.subject)
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.to
|
||||
assert_equal ['moderateurs@agendadulibre.org'], mail.from
|
||||
|
@ -9,12 +9,14 @@ class EventMailerPreview < ActionMailer::Preview
|
||||
# Preview this email at http://localhost:3000/rails/mailers/event_mailer/accept
|
||||
def accept
|
||||
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
|
||||
EventMailer.accept Event.last, User.last
|
||||
EventMailer.accept Event.last
|
||||
end
|
||||
|
||||
# Preview this email at http://localhost:3000/rails/mailers/event_mailer/destroy
|
||||
def destroy
|
||||
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
|
||||
EventMailer.destroy Event.last, User.last, 'hello world'
|
||||
event = Event.last
|
||||
event.reason_for_deletion = 'hello world'
|
||||
EventMailer.destroy event
|
||||
end
|
||||
end
|
||||
|
@ -9,25 +9,27 @@ class ModerationMailerPreview < ActionMailer::Preview
|
||||
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/update
|
||||
def update
|
||||
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
|
||||
event = Event.last
|
||||
event = Event.first
|
||||
|
||||
event.tags += ' ho'
|
||||
event.start_time += 1.day
|
||||
event.description = event.description + '
|
||||
hello world'
|
||||
|
||||
ModerationMailer.update event, nil
|
||||
ModerationMailer.update event
|
||||
end
|
||||
|
||||
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/accept
|
||||
def accept
|
||||
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
|
||||
ModerationMailer.accept Event.last, User.last
|
||||
ModerationMailer.accept Event.last
|
||||
end
|
||||
|
||||
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/destroy
|
||||
def destroy
|
||||
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
|
||||
ModerationMailer.destroy Event.last, User.last, 'hello world'
|
||||
event = Event.last
|
||||
event.reason_for_deletion = 'hello world'
|
||||
ModerationMailer.destroy event
|
||||
end
|
||||
end
|
||||
|
@ -24,6 +24,8 @@ class OrgaMailerPreview < ActionMailer::Preview
|
||||
# Preview this email at http://localhost:3000/rails/mailers/orga_mailer/destroy
|
||||
def destroy
|
||||
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
|
||||
OrgaMailer.destroy Orga.last, 'hello world'
|
||||
orga = Orga.last
|
||||
# orga.reason_for_deletion = 'hello world'
|
||||
OrgaMailer.destroy orga
|
||||
end
|
||||
end
|
||||
|
@ -3,6 +3,8 @@ require 'test_helper'
|
||||
# Test events, which are the application central part
|
||||
class EventTest < ActiveSupport::TestCase
|
||||
setup do
|
||||
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
|
||||
|
||||
@event = events :one
|
||||
end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user