Mails de refus d'évt envoyés au soumetteur et aux modérateurs

This commit is contained in:
echarp 2014-07-07 13:14:17 +02:00
parent 026aa24e8f
commit dbf2362399
15 changed files with 106 additions and 44 deletions

View File

@ -1,3 +1,5 @@
# Place all the behaviors and hooks related to the matching controller here. $(document).ready ->
# All this logic will automatically be available in application.js. $('body.moderations .field.closer input[type=radio]').click ->
# You can use CoffeeScript in this file: http://coffeescript.org/ $('body.moderations #reason_text').parent().slideUp()
$('body.moderations .field.opener input[type=radio]').click ->
$('body.moderations #reason_text').parent().slideDown()

View File

@ -115,7 +115,7 @@ body.events.index table
float: right float: right
width: 15em width: 15em
border: 1px solid #96CFFF border: 1px solid #96CFFF
margin: 5em 1.2em 0px margin: 0 1.2em
padding: 5px padding: 5px
font-size: 0.7em font-size: 0.7em
background-color: #D6ECFF background-color: #D6ECFF

View File

@ -57,7 +57,13 @@ class ModerationsController < ApplicationController
def destroy def destroy
if @moderation.destroy if @moderation.destroy
# Send a notification to its author # Send a notification to its author
@reason = 'pas cool' if params[:reason] == 'r_4'
@reason = params[:reason_text]
else
@reason = t("reason_#{params[:reason]}_long", scope: [:moderations, :refuse])
end
EventMailer.destroy(@moderation, current_user, @reason).deliver
ModerationMailer.destroy(@moderation, current_user, @reason).deliver ModerationMailer.destroy(@moderation, current_user, @reason).deliver
end end
respond_to do |format| respond_to do |format|

View File

@ -1,6 +1,4 @@
class EventMailer < ActionMailer::Base class EventMailer < ActionMailer::Base
default from: 'moderateurs@agendadulibre.org'
def create(event) def create(event)
@event = event @event = event
@ -13,8 +11,18 @@ class EventMailer < ActionMailer::Base
@event = event @event = event
@current_user = current_user @current_user = current_user
mail 'Message-ID' => "<event-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>", mail 'In-Reply-To' => "<event-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
to: event.contact, to: event.contact,
subject: t('event_mailer.accept.subject', subject: event.title) subject: t('event_mailer.accept.subject', subject: event.title)
end end
def destroy(event, current_user, reason)
@event = event
@current_user = current_user
@reason = reason
mail 'In-Reply-To' => "<event-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
to: event.contact,
subject: t('event_mailer.destroy.subject', subject: event.title)
end
end end

View File

@ -1,7 +1,4 @@
class ModerationMailer < ActionMailer::Base class ModerationMailer < ActionMailer::Base
default from: 'moderateurs@agendadulibre.org'
default to: 'moderateurs@agendadulibre.org'
def create(event) def create(event)
@event = event @event = event

View File

@ -1,6 +1,4 @@
class NoteMailer < ActionMailer::Base class NoteMailer < ActionMailer::Base
default from: 'moderateurs@agendadulibre.org'
def create(note) def create(note)
@note = note @note = note

View File

@ -0,0 +1,23 @@
=t '.title'
\
=t '.body', author: @current_user
\
= @reason
\
=t '.reclamation'
\
=t '.reminder'
=====================================================
#{Event.human_attribute_name :title}: #{@event.title}
#{Event.human_attribute_name :start_time}: #{l @event.start_time, format: :at}
#{Event.human_attribute_name :end_time}: #{l @event.end_time, format: :at}
#{Event.human_attribute_name :region}: #{@event.region}
#{Event.human_attribute_name :city}: #{@event.city}
#{Event.human_attribute_name :url}: #{@event.url}
#{Event.human_attribute_name :contact}: #{@event.contact}
#{Event.human_attribute_name :submitter}: #{@event.submitter}
#{Event.human_attribute_name :tags}: #{@event.tags}
#{Event.human_attribute_name :description}: #{raw @event.description}
=====================================================
\
=t '.signature'

View File

@ -1,6 +1,6 @@
=t '.title' =t '.title'
\ \
=t '.body', author: @current_user =t '.body', subject: @event.title, author: @current_user
\ \
= @reason = @reason
\ \

View File

@ -6,21 +6,28 @@
.box .box
%h2=t '.question' %h2=t '.question'
= form_for @moderation, method: :delete do |f| = form_tag moderation_path(@moderation), method: :delete do |f|
.field .field.closer(title="#{t '.reason_r_1_long'}")
= radio_button_tag :event, :contents_1, {}, value: t('.contents_1_long') = radio_button_tag :reason, :r_1, params[:event] == 'reason_r_1'
= label_tag :event_contents_1, t('.contents_1') = label_tag :reason_r_1, t('.reason_r_1')
.field
= radio_button_tag :event, :contents_2, {}, value: t('.contents_2_long')
= label_tag :event_contents_2, t('.contents_2')
.field
= radio_button_tag :event, :contents_3, {}, value: t('.contents_3_long')
= label_tag :event_contents_3, t('.contents_3')
.field
= radio_button_tag :event, :contents_4, {}, value: t('.contents_4_long')
= label_tag :event_contents_4, t('.contents_4')
= f.submit t('.ok') .field.closer(title="#{t '.reason_r_2_long'}")
= radio_button_tag :reason, :r_2, params[:event] == 'reason_r_2'
= label_tag :reason_r_2, t('.reason_r_2')
.field.closer(title="#{t '.reason_r_3_long'}")
= radio_button_tag :reason, :r_3, params[:event] == 'reason_r_3'
= label_tag :reason_r_3, t('.reason_r_3')
.field.opener(title="#{t '.reason_r_4_long'}")
= radio_button_tag :reason, :r_4, params[:event] == 'reason_r_4' || !params[:event]
= label_tag :reason_r_4, t('.reason_r_4')
.field
= label_tag :reason_text, t('.reason_text')
= text_area_tag :reason_text, nil, cols: 40, rows: 5
= submit_tag t '.ok'
= link_to t('.ko'), moderations_url, class: :button = link_to t('.ko'), moderations_url, class: :button
.box= render file: '/events/show' .box= render file: '/events/show'

View File

@ -24,6 +24,8 @@ module AgendaDuLibreRails
I18n.config.enforce_available_locales = true I18n.config.enforce_available_locales = true
config.action_mailer.default_options = {from: 'moderateurs@agendadulibre.org', to: 'moderateurs@agendadulibre.org'}
#config.quiet_assets = false #config.quiet_assets = false
end end
end end

View File

@ -208,14 +208,14 @@ fr:
question: Quel motif souhaitez-vous associer au rejet de cet évènement? question: Quel motif souhaitez-vous associer au rejet de cet évènement?
ok: Rejeter ok: Rejeter
ko: Annuler ko: Annuler
contents_1: Hors sujet reason_r_1: Hors sujet
contents_2: Pas assez d'informations reason_r_2: Pas assez d'informations
contents_3: Évènement déjà enregistré reason_r_3: Évènement déjà enregistré
contents_4: Raison spécifique (précisez) reason_r_4: Raison spécifique (précisez)
contents_1_long: Toutefois, l'évènement proposé n'a pour l'instant pas retenu l'attention des modérateurs. En effet, l'évènement proposé ne concerne pas le Logiciel Libre, ou bien le lien avec le Logiciel Libre n'est pas évident dans la formulation actuelle, ou alors il s'agit d'un évènement ou d'une formation payante et coûteuse. Si l'évènement concerne vraiment le Logiciel Libre et qu'il ne s'agit pas d'une formation payante, n'hésitez pas à le soumettre à nouveau avec une description plus claire. reason_r_1_long: Toutefois, l'évènement proposé n'a pour l'instant pas retenu l'attention des modérateurs. En effet, l'évènement proposé ne concerne pas le Logiciel Libre, ou bien le lien avec le Logiciel Libre n'est pas évident dans la formulation actuelle, ou alors il s'agit d'un évènement ou d'une formation payante et coûteuse. Si l'évènement concerne vraiment le Logiciel Libre et qu'il ne s'agit pas d'une formation payante, n'hésitez pas à le soumettre à nouveau avec une description plus claire.
contents_2_long: Votre évènement a tout à fait sa place dans l'Agenda du Libre, mais les modérateurs trouvent que la description de celui-ci n'est pas assez complète pour être validée.\n\nLa description doit être compréhensible par un nouveau venu dans le monde du Libre, et doit donc préciser le principe de la rencontre, le public visé, la rôle du ou des Logiciels Libres qui seront exposés, la date et le lieu précis de la rencontre. Même si il s'agit d'une rencontre régulière, n'hésitez pas à répéter à chaque fois ces informations, elles sont importantes.\n\nNous vous invitons donc vivement à soumettre à nouveau cet évènement avec une description plus complète. reason_r_2_long: Votre évènement a tout à fait sa place dans l'Agenda du Libre, mais les modérateurs trouvent que la description de celui-ci n'est pas assez complète pour être validée.\n\nLa description doit être compréhensible par un nouveau venu dans le monde du Libre, et doit donc préciser le principe de la rencontre, le public visé, la rôle du ou des Logiciels Libres qui seront exposés, la date et le lieu précis de la rencontre. Même si il s'agit d'une rencontre régulière, n'hésitez pas à répéter à chaque fois ces informations, elles sont importantes.\n\nNous vous invitons donc vivement à soumettre à nouveau cet évènement avec une description plus complète.
contents_3_long: Votre évènement a tout à fait sa place dans l'Agenda du Libre, mais il est déjà enregistré dans celui-ci. reason_r_3_long: Votre évènement a tout à fait sa place dans l'Agenda du Libre, mais il est déjà enregistré dans celui-ci.
contents_4_long: Toutefois, votre évènement n'a pour le moment pas retenu l'attention des modérateurs, pour la raison suivante reason: Votre raison
destroy: destroy:
ok: Évènement rejeté ok: Évènement rejeté
notes: notes:
@ -261,6 +261,13 @@ fr:
edit_link: "Vous pouvez modifier cet évènement ultérieurement pour y ajouter des précisions en vous rendant à l'adresse:" edit_link: "Vous pouvez modifier cet évènement ultérieurement pour y ajouter des précisions en vous rendant à l'adresse:"
delete_link: "Vous pouvez également l'annuler en vous rendant à l'adresse:" delete_link: "Vous pouvez également l'annuler en vous rendant à l'adresse:"
signature: "Merci de votre contribution à l'Agenda du Libre et à bientôt!\n\n-- \nL'équipe de modération" signature: "Merci de votre contribution à l'Agenda du Libre et à bientôt!\n\n-- \nL'équipe de modération"
destroy:
subject: "[Agenda du Libre] Évènement '%{subject}' refusé"
title: Bonjour,
body: Vous avez soumis l'évènement suivant dans l'Agenda du Libre, et nous vous remercions de cette contribution.
reminder: "Pour rappel, voici le contenu de votre évènement:"
reclamation: Pour toute réclamation, n'hésitez pas à contacter l'équipe de modérateurs.
signature: "Avec tous nos remerciements pour votre contribution,\n\n-- \nL'équipe de modération"
moderation_mailer: moderation_mailer:
create: create:
subject: "[Agenda du Libre] Nouvel évènement à modérer: '%{subject}'" subject: "[Agenda du Libre] Nouvel évènement à modérer: '%{subject}'"
@ -281,9 +288,9 @@ fr:
destroy: destroy:
subject: "[Agenda du Libre] Évènement '%{subject}' refusé" subject: "[Agenda du Libre] Évènement '%{subject}' refusé"
title: Bonjour, title: Bonjour,
body: Vous avez soumis l'évènement suivant dans l'Agenda du Libre, et nous vous remercions de cette contribution. body: "L'évènement '%{subject}' a été rejeté par %{author} pour la raison suivante:\n\n"
reminder: "Pour rappel, voici le contenu de votre évènement:" reminder: "Pour rappel, l'évènement:"
signature: "Avec tous nos remerciements pour votre contribution,\n\n-- \nL'équipe de modération" signature: "-- \nL'équipe des modérateurs de l'Agenda du Libre"
note_mailer: note_mailer:
create: create:
subject: "[Agenda du Libre] Demande d'informations sur l'évènement '%{subject}'" subject: "[Agenda du Libre] Demande d'informations sur l'évènement '%{subject}'"

View File

@ -20,7 +20,7 @@ class ModerationsControllerTest < ActionController::TestCase
test 'should accept event' do test 'should accept event' do
put :accept, id: @moderation put :accept, id: @moderation
assert assigns(:moderation).is_moderated? assert assigns(:moderation).moderated?
assert_empty assigns(:moderation).errors assert_empty assigns(:moderation).errors
assert_redirected_to moderations_path assert_redirected_to moderations_path
end end

View File

@ -14,8 +14,15 @@ class EventMailerTest < ActionMailer::TestCase
end end
test 'accept' do test 'accept' do
mail = EventMailer.accept Event.last mail = EventMailer.accept Event.last, User.last
assert_match(/\[Agenda du Libre\] Évènement: .* modéré/, mail.subject) assert_match(/\[Agenda du Libre\] É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'
assert_match(/\[Agenda du Libre\] Évènement .* refusé/, mail.subject)
assert_equal [Event.last.contact], mail.to assert_equal [Event.last.contact], mail.to
assert_equal ['moderateurs@agendadulibre.org'], mail.from assert_equal ['moderateurs@agendadulibre.org'], mail.from
end end

View File

@ -12,4 +12,10 @@ class EventMailerPreview < ActionMailer::Preview
ActionMailer::Base.default_url_options[:host] = 'localhost:3000' ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
EventMailer.accept Event.last, User.last EventMailer.accept Event.last, User.last
end 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'
end
end end

View File

@ -26,7 +26,6 @@ hello world'
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/destroy # Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/destroy
def destroy def destroy
ActionMailer::Base.default_url_options[:host] = 'localhost:3000' ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
@reason = 'pas cool' ModerationMailer.destroy Event.last, User.last, 'hello world'
ModerationMailer.destroy Event.last, User.last, @reason
end end
end end