From dbf236239948313a5999c2335badbceff01b3f9e Mon Sep 17 00:00:00 2001 From: echarp Date: Mon, 7 Jul 2014 13:14:17 +0200 Subject: [PATCH] =?UTF-8?q?Mails=20de=20refus=20d'=C3=A9vt=20envoy=C3=A9s?= =?UTF-8?q?=20au=20soumetteur=20et=20aux=20mod=C3=A9rateurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/moderations.js.coffee | 8 +++-- app/assets/stylesheets/events.css.sass | 2 +- app/controllers/moderations_controller.rb | 8 ++++- app/mailers/event_mailer.rb | 14 ++++++-- app/mailers/moderation_mailer.rb | 3 -- app/mailers/note_mailer.rb | 2 -- app/views/event_mailer/destroy.text.haml | 23 ++++++++++++ app/views/moderation_mailer/destroy.text.haml | 2 +- app/views/moderations/refuse.html.haml | 35 +++++++++++-------- config/application.rb | 2 ++ config/locales/fr.yml | 29 +++++++++------ .../moderations_controller_test.rb | 2 +- test/mailers/event_mailer_test.rb | 11 ++++-- test/mailers/previews/event_mailer_preview.rb | 6 ++++ .../previews/moderation_mailer_preview.rb | 3 +- 15 files changed, 106 insertions(+), 44 deletions(-) create mode 100644 app/views/event_mailer/destroy.text.haml diff --git a/app/assets/javascripts/moderations.js.coffee b/app/assets/javascripts/moderations.js.coffee index 24f83d18..72fb8b00 100644 --- a/app/assets/javascripts/moderations.js.coffee +++ b/app/assets/javascripts/moderations.js.coffee @@ -1,3 +1,5 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ +$(document).ready -> + $('body.moderations .field.closer input[type=radio]').click -> + $('body.moderations #reason_text').parent().slideUp() + $('body.moderations .field.opener input[type=radio]').click -> + $('body.moderations #reason_text').parent().slideDown() diff --git a/app/assets/stylesheets/events.css.sass b/app/assets/stylesheets/events.css.sass index b617edbb..b2a4407f 100644 --- a/app/assets/stylesheets/events.css.sass +++ b/app/assets/stylesheets/events.css.sass @@ -115,7 +115,7 @@ body.events.index table float: right width: 15em border: 1px solid #96CFFF - margin: 5em 1.2em 0px + margin: 0 1.2em padding: 5px font-size: 0.7em background-color: #D6ECFF diff --git a/app/controllers/moderations_controller.rb b/app/controllers/moderations_controller.rb index af93ea92..d009042d 100644 --- a/app/controllers/moderations_controller.rb +++ b/app/controllers/moderations_controller.rb @@ -57,7 +57,13 @@ class ModerationsController < ApplicationController def destroy if @moderation.destroy # 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 end respond_to do |format| diff --git a/app/mailers/event_mailer.rb b/app/mailers/event_mailer.rb index dceda4e3..52c73c34 100644 --- a/app/mailers/event_mailer.rb +++ b/app/mailers/event_mailer.rb @@ -1,6 +1,4 @@ class EventMailer < ActionMailer::Base - default from: 'moderateurs@agendadulibre.org' - def create(event) @event = event @@ -13,8 +11,18 @@ class EventMailer < ActionMailer::Base @event = event @current_user = current_user - mail 'Message-ID' => "", + mail 'In-Reply-To' => "", to: event.contact, subject: t('event_mailer.accept.subject', subject: event.title) end + + def destroy(event, current_user, reason) + @event = event + @current_user = current_user + @reason = reason + + mail 'In-Reply-To' => "", + to: event.contact, + subject: t('event_mailer.destroy.subject', subject: event.title) + end end diff --git a/app/mailers/moderation_mailer.rb b/app/mailers/moderation_mailer.rb index bc6d8d5b..c4b7a9d1 100644 --- a/app/mailers/moderation_mailer.rb +++ b/app/mailers/moderation_mailer.rb @@ -1,7 +1,4 @@ class ModerationMailer < ActionMailer::Base - default from: 'moderateurs@agendadulibre.org' - default to: 'moderateurs@agendadulibre.org' - def create(event) @event = event diff --git a/app/mailers/note_mailer.rb b/app/mailers/note_mailer.rb index 1f6ad8dc..4ec167a1 100644 --- a/app/mailers/note_mailer.rb +++ b/app/mailers/note_mailer.rb @@ -1,6 +1,4 @@ class NoteMailer < ActionMailer::Base - default from: 'moderateurs@agendadulibre.org' - def create(note) @note = note diff --git a/app/views/event_mailer/destroy.text.haml b/app/views/event_mailer/destroy.text.haml new file mode 100644 index 00000000..f76d973c --- /dev/null +++ b/app/views/event_mailer/destroy.text.haml @@ -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' diff --git a/app/views/moderation_mailer/destroy.text.haml b/app/views/moderation_mailer/destroy.text.haml index d9fbf68e..0d0d9731 100644 --- a/app/views/moderation_mailer/destroy.text.haml +++ b/app/views/moderation_mailer/destroy.text.haml @@ -1,6 +1,6 @@ =t '.title' \ -=t '.body', author: @current_user +=t '.body', subject: @event.title, author: @current_user \ = @reason \ diff --git a/app/views/moderations/refuse.html.haml b/app/views/moderations/refuse.html.haml index f3f9dcac..99e87014 100644 --- a/app/views/moderations/refuse.html.haml +++ b/app/views/moderations/refuse.html.haml @@ -6,21 +6,28 @@ .box %h2=t '.question' - = form_for @moderation, method: :delete do |f| - .field - = radio_button_tag :event, :contents_1, {}, value: t('.contents_1_long') - = label_tag :event_contents_1, t('.contents_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') + = form_tag moderation_path(@moderation), method: :delete do |f| + .field.closer(title="#{t '.reason_r_1_long'}") + = radio_button_tag :reason, :r_1, params[:event] == 'reason_r_1' + = label_tag :reason_r_1, t('.reason_r_1') - = 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 .box= render file: '/events/show' diff --git a/config/application.rb b/config/application.rb index e2ec89ed..04656fc1 100644 --- a/config/application.rb +++ b/config/application.rb @@ -24,6 +24,8 @@ module AgendaDuLibreRails I18n.config.enforce_available_locales = true + config.action_mailer.default_options = {from: 'moderateurs@agendadulibre.org', to: 'moderateurs@agendadulibre.org'} + #config.quiet_assets = false end end diff --git a/config/locales/fr.yml b/config/locales/fr.yml index f4918857..2e5a9cea 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -208,14 +208,14 @@ fr: question: Quel motif souhaitez-vous associer au rejet de cet évènement? ok: Rejeter ko: Annuler - contents_1: Hors sujet - contents_2: Pas assez d'informations - contents_3: Évènement déjà enregistré - contents_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. - 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. - 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. - contents_4_long: Toutefois, votre évènement n'a pour le moment pas retenu l'attention des modérateurs, pour la raison suivante + reason_r_1: Hors sujet + reason_r_2: Pas assez d'informations + reason_r_3: Évènement déjà enregistré + reason_r_4: Raison spécifique (précisez) + 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. + 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. + 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. + reason: Votre raison destroy: ok: Évènement rejeté 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:" 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" + 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: create: subject: "[Agenda du Libre] Nouvel évènement à modérer: '%{subject}'" @@ -281,9 +288,9 @@ fr: 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:" - signature: "Avec tous nos remerciements pour votre contribution,\n\n-- \nL'équipe de modération" + body: "L'évènement '%{subject}' a été rejeté par %{author} pour la raison suivante:\n\n" + reminder: "Pour rappel, l'évènement:" + signature: "-- \nL'équipe des modérateurs de l'Agenda du Libre" note_mailer: create: subject: "[Agenda du Libre] Demande d'informations sur l'évènement '%{subject}'" diff --git a/test/controllers/moderations_controller_test.rb b/test/controllers/moderations_controller_test.rb index 47cccb9f..48811458 100644 --- a/test/controllers/moderations_controller_test.rb +++ b/test/controllers/moderations_controller_test.rb @@ -20,7 +20,7 @@ class ModerationsControllerTest < ActionController::TestCase test 'should accept event' do put :accept, id: @moderation - assert assigns(:moderation).is_moderated? + assert assigns(:moderation).moderated? assert_empty assigns(:moderation).errors assert_redirected_to moderations_path end diff --git a/test/mailers/event_mailer_test.rb b/test/mailers/event_mailer_test.rb index 8cdbe2e2..a5d94e38 100644 --- a/test/mailers/event_mailer_test.rb +++ b/test/mailers/event_mailer_test.rb @@ -14,8 +14,15 @@ class EventMailerTest < ActionMailer::TestCase end test 'accept' do - mail = EventMailer.accept Event.last - assert_match(/\[Agenda du Libre\] Évènement: .* modéré/, mail.subject) + mail = EventMailer.accept Event.last, User.last + 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 ['moderateurs@agendadulibre.org'], mail.from end diff --git a/test/mailers/previews/event_mailer_preview.rb b/test/mailers/previews/event_mailer_preview.rb index 3e03007f..197bc894 100644 --- a/test/mailers/previews/event_mailer_preview.rb +++ b/test/mailers/previews/event_mailer_preview.rb @@ -12,4 +12,10 @@ class EventMailerPreview < ActionMailer::Preview ActionMailer::Base.default_url_options[:host] = 'localhost:3000' EventMailer.accept Event.last, User.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' + end end diff --git a/test/mailers/previews/moderation_mailer_preview.rb b/test/mailers/previews/moderation_mailer_preview.rb index 67591ee0..b22e5bc3 100644 --- a/test/mailers/previews/moderation_mailer_preview.rb +++ b/test/mailers/previews/moderation_mailer_preview.rb @@ -26,7 +26,6 @@ hello world' # Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/destroy def destroy ActionMailer::Base.default_url_options[:host] = 'localhost:3000' - @reason = 'pas cool' - ModerationMailer.destroy Event.last, User.last, @reason + ModerationMailer.destroy Event.last, User.last, 'hello world' end end