From b13af2ea6ac736a08b327b719296d57c84fc5d6e Mon Sep 17 00:00:00 2001 From: echarp Date: Sun, 25 May 2014 23:59:03 +0200 Subject: [PATCH] =?UTF-8?q?Envoi=20de=20mail=20pour=20chaque=20cr=C3=A9ati?= =?UTF-8?q?on=20d'=C3=A9v=C3=A9nement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/all.css.sass | 11 ++++++- app/assets/stylesheets/moderations.css.sass | 2 +- app/controllers/events_controller.rb | 31 ++++++++++++++++--- app/controllers/moderations_controller.rb | 3 ++ app/mailers/event_mailer.rb | 13 ++++++++ app/models/event.rb | 6 ++++ app/views/event_mailer/create.text.haml | 21 +++++++++++++ app/views/events/_form.html.haml | 3 ++ app/views/events/cancel.html.haml | 21 +++++++++++++ app/views/events/edit.html.haml | 16 ++++++++-- app/views/events/show.html.haml | 2 -- app/views/users/show.html.haml | 2 -- .../initializers/override_mail_recipient.rb | 9 ++++++ config/locales/fr.yml | 25 +++++++++++++++ config/routes.rb | 4 ++- test/controllers/events_controller_test.rb | 16 ++++++++-- test/mailers/event_mailer_test.rb | 16 ++++++++++ test/mailers/previews/event_mailer_preview.rb | 10 ++++++ test/models/event_test.rb | 18 +++++++++-- 19 files changed, 208 insertions(+), 21 deletions(-) create mode 100644 app/mailers/event_mailer.rb create mode 100644 app/views/event_mailer/create.text.haml create mode 100644 app/views/events/cancel.html.haml create mode 100644 config/initializers/override_mail_recipient.rb create mode 100644 test/mailers/event_mailer_test.rb create mode 100644 test/mailers/previews/event_mailer_preview.rb diff --git a/app/assets/stylesheets/all.css.sass b/app/assets/stylesheets/all.css.sass index 225b6485..9367175f 100644 --- a/app/assets/stylesheets/all.css.sass +++ b/app/assets/stylesheets/all.css.sass @@ -94,11 +94,20 @@ main hr margin: 10px 20px - input, textarea, select + input, textarea, select, a.button margin: 3px 0 border: 1px solid #868686 &:focus background-color: #F0F8FF + &[type=submit], &.button + color: black + padding: 0.2em 0.6em + font-size: larger + line-height: 1.1em + font-weight: normal + vertical-align: baseline + background-color: buttonface + /* input, textarea, select color: black diff --git a/app/assets/stylesheets/moderations.css.sass b/app/assets/stylesheets/moderations.css.sass index 5e684ebc..5f0db2ef 100644 --- a/app/assets/stylesheets/moderations.css.sass +++ b/app/assets/stylesheets/moderations.css.sass @@ -1,4 +1,4 @@ -.moderations, .notes +.events.edit, .events.update, .events.cancel, .moderations, .notes table.list width: 100% margin-top: 15px diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 925fc9be..f695dea4 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,5 +1,7 @@ class EventsController < InheritedResources::Base - before_action :set_event, only: [:show, :edit, :update, :destroy] + before_action :set_event, only: [:show, :edit, :update, :cancel, :destroy] + before_action :check_secret, only: [:edit, :update, :cancel, :destroy] + before_filter :set_mailer_host def index @events = Event @@ -43,6 +45,9 @@ class EventsController < InheritedResources::Base respond_to do |format| if @event.save + # Send an event creation mail to its author + EventMailer.create(@event).deliver + format.html { redirect_to @event, notice: 'Event was successfully created.' } format.json { render action: 'show', status: :created, location: @event } else @@ -55,15 +60,16 @@ class EventsController < InheritedResources::Base # PATCH/PUT /events/1 # PATCH/PUT /events/1.json def update + # This is a special case, required to handle the region attribute with same foreign key name + @event.region = Region.find(params[:event][:region]) + if params[:visu] - @event.attributes = params[:event] + @event.attributes = event_params render action: :edit return end respond_to do |format| - # This is a special case, required to handle the region attribute with same foreign key name - @event.region = Region.find(params[:event][:region]) if @event.update(event_params) format.html { redirect_to @event, notice: 'Event was successfully updated.' } format.json { head :no_content } @@ -81,7 +87,11 @@ class EventsController < InheritedResources::Base # Use callbacks to share common setup or constraints between actions. def set_event - @event = Event.find(params[:id]) + if (params[:secret].present?) + @event = Event.unscoped.where(secret: params[:secret]).find(params[:id]) + else + @event = Event.find(params[:id]) + end end # Never trust parameters from the scary internet, only allow the white list through. @@ -89,4 +99,15 @@ class EventsController < InheritedResources::Base params.require(:event) .permit :title, :start_time, :end_time, :description, :city, :locality, :url, :contact, :submitter, :tags end + + def check_secret + if (params[:secret] != @event.secret) + redirect_to @event, notice: t(:forbidden, scope: [:events, :edit]) + end + end + + # Useful to manage absolute url in mails + def set_mailer_host + ActionMailer::Base.default_url_options[:host] = request.host_with_port + end end diff --git a/app/controllers/moderations_controller.rb b/app/controllers/moderations_controller.rb index f0fbd8ea..aa93838b 100644 --- a/app/controllers/moderations_controller.rb +++ b/app/controllers/moderations_controller.rb @@ -9,6 +9,9 @@ class ModerationsController < InheritedResources::Base # PATCH/PUT /moderations/1 # PATCH/PUT /moderations/1.json def update + # This is a special case, required to handle the region attribute with same foreign key name + @event.region = Region.find(params[:event][:region]) + if params[:visu] @event.attributes = event_params render action: 'edit' diff --git a/app/mailers/event_mailer.rb b/app/mailers/event_mailer.rb new file mode 100644 index 00000000..200c11bf --- /dev/null +++ b/app/mailers/event_mailer.rb @@ -0,0 +1,13 @@ +class EventMailer < ActionMailer::Base + default from: 'moderateurs@agendadulibre.org' + + # Subject can be set in your I18n file at config/locales/en.yml + # with the following lookup: + # + # en.event_mailer.create.subject + # + def create(event) + @event = event + mail to: "to@example.org", subject: t('event_mailer.create.subject', subject: event.title) + end +end diff --git a/app/models/event.rb b/app/models/event.rb index 1fb9d86e..4782be0e 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -30,6 +30,12 @@ class Event < ActiveRecord::Base self.decision_time = Date.today end + before_create do + self.secret = SecureRandom.urlsafe_base64(32)[0...32] + self.moderator_mail_id = SecureRandom.urlsafe_base64(32)[0...32] + self.submitter_mail_id = SecureRandom.urlsafe_base64(32)[0...32] + end + def same_day? start_time.to_date == end_time.to_date end diff --git a/app/views/event_mailer/create.text.haml b/app/views/event_mailer/create.text.haml new file mode 100644 index 00000000..3c805e0a --- /dev/null +++ b/app/views/event_mailer/create.text.haml @@ -0,0 +1,21 @@ +=t '.title' + +\ + +=t '.body', subject: @event.title, start_time: l(@event.start_time, format: :at) + +\ + += edit_event_url @event, secret: @event.secret + +\ + +=t '.delete_link' + +\ + += cancel_event_url @event, secret: @event.secret + +\ + +=t '.signature' diff --git a/app/views/events/_form.html.haml b/app/views/events/_form.html.haml index 0507dea8..87c440b2 100644 --- a/app/views/events/_form.html.haml +++ b/app/views/events/_form.html.haml @@ -13,6 +13,9 @@ #advises= raw markdown.render t '.advises' + - else + = hidden_field_tag :secret, params[:secret] + .field .helper= raw markdown.render t '.title_helper' = f.label :title diff --git a/app/views/events/cancel.html.haml b/app/views/events/cancel.html.haml new file mode 100644 index 00000000..fd87101d --- /dev/null +++ b/app/views/events/cancel.html.haml @@ -0,0 +1,21 @@ +%h3 + >>> + =t '.title' + +.box + - if @event.moderated + %h3=t '.already_moderated' + + = form_for @event, method: :delete do |f| + = hidden_field_tag :secret, params[:secret] + .confirm=t '.confirm' + %br/ + + = f.submit t('.ok'), name: :yes + = link_to t('.ko'), @event, class: :button + +%h3 + >>> + =t '.preview' + +.box= render file: '/events/show' diff --git a/app/views/events/edit.html.haml b/app/views/events/edit.html.haml index f2f8ab47..1fb778b7 100644 --- a/app/views/events/edit.html.haml +++ b/app/views/events/edit.html.haml @@ -1,5 +1,15 @@ -%h2=t '.title' +%h3 + >>> + =t '.preview' -= render 'form' +.box + %h3=t '.warning' -= link_to 'Show', @event +.box= render file: '/events/show' + +%h3 + = link_to t('.moderation'), moderations_path + >>> + =t '.edit' + +.box= render '/events/form' diff --git a/app/views/events/show.html.haml b/app/views/events/show.html.haml index c47b2751..09a43ae4 100644 --- a/app/views/events/show.html.haml +++ b/app/views/events/show.html.haml @@ -1,6 +1,4 @@ - if request.format == 'text/html' && controller.controller_name != 'moderations' && controller.controller_name != 'notes' - %p#notice= notice - #lug-list %h1=t '.lug-list' - if @event.region diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 9bd6bfbe..12e5312c 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -1,5 +1,3 @@ -%p#notice= notice - %p %b Login: = @user.login diff --git a/config/initializers/override_mail_recipient.rb b/config/initializers/override_mail_recipient.rb new file mode 100644 index 00000000..886dc0ef --- /dev/null +++ b/config/initializers/override_mail_recipient.rb @@ -0,0 +1,9 @@ +# config/initializers/override_mail_recipient.rb +if Rails.env.development? + class OverrideMailRecipient + def self.delivering_email(mail) + mail.to = 'manu@localhost' + end + end + ActionMailer::Base.register_interceptor(OverrideMailRecipient) +end diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 74907b4f..20643008 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -116,9 +116,20 @@ fr: title: Soumettre un évènement edit: title: Éditer un évènement + preview: Prévisualisation de l'évènement + warning: Attention, cet évènement est déjà modéré. Toute modification sera immédiatement visible sur le site. + forbidden: Vous n'êtes pas authorisé à modifier cet événement + edit: Édition de l'évènement form: save: Valider visualise: Visualiser + cancel: + title: Annulation de l'événement + already_moderated: Attention, cet évènement est déjà modéré. Cette annulation le fera disparaître de l'Agenda du Libre. + confirm: Confirmez-vous l'annulation de cet évènement? + preview: Visualisation de l'évènement + ok: Oui + ko: Non regions: index: title: Liste des flux RSS @@ -180,3 +191,17 @@ fr: new: title: Identification sign_in: Identifier + event_mailer: + create: + title: Nouvel événement + + event_mailer: + create: + subject: "[Agenda du Libre] Votre évènement: '%{subject}' est en attente de modération" + title: Bonjour, + body: "Votre évènement intitulé '%{subject}', +\nqui aura lieu le '%{start_time}' a bien été enregistré dans l'Agenda du Libre. +\n\nL'équipe de modération le prendra en charge très prochainement. +\n\nPendant la modération et après celle-ci si votre évènement est validé, vous pouvez éditer votre évènement à l'adresse:" + delete_link: "et vous pouvez l'annuler en utilisant l'adresse:" + signature: "Merci de votre participation!\n\n-- \nAgenda du Libre" diff --git a/config/routes.rb b/config/routes.rb index 466a2d45..93337820 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,7 +7,9 @@ Rails.application.routes.draw do get 'application/contact' resources :users - resources :events + resources :events do + get :cancel, on: :member + end resources :moderations do resources :notes, only: [:new, :create] end diff --git a/test/controllers/events_controller_test.rb b/test/controllers/events_controller_test.rb index 795f3550..9a54c67f 100644 --- a/test/controllers/events_controller_test.rb +++ b/test/controllers/events_controller_test.rb @@ -64,12 +64,17 @@ class EventsControllerTest < ActionController::TestCase end test "should get edit" do - get :edit, id: @event + get :edit, id: @event, secret: 'MyString' assert_response :success end + test "should not get edit" do + get :edit, id: @event + assert_redirected_to event_path(assigns(:event)) + end + test "should update event" do - patch :update, id: @event, event: { + patch :update, id: @event, secret: 'MyString', event: { title: @event.title, start_time: @event.start_time, end_time: @event.end_time, @@ -89,9 +94,14 @@ class EventsControllerTest < ActionController::TestCase assert_redirected_to event_path(assigns(:event)) end + test "should get cancel page" do + get :cancel, id: @event, secret: 'MyString' + assert_response :success + end + test "should destroy event" do assert_difference('Event.count', -1) do - delete :destroy, id: @event + delete :destroy, id: @event, secret: 'MyString' end assert_redirected_to events_path diff --git a/test/mailers/event_mailer_test.rb b/test/mailers/event_mailer_test.rb new file mode 100644 index 00000000..0731444b --- /dev/null +++ b/test/mailers/event_mailer_test.rb @@ -0,0 +1,16 @@ +require 'test_helper' + +class EventMailerTest < ActionMailer::TestCase + setup do + ActionMailer::Base.default_url_options[:host] = 'localhost:3000' + end + + test "create" do + mail = EventMailer.create(Event.last) + assert_match(/\[Agenda du Libre\] Votre évènement: .* est en attente de modération/, mail.subject) + assert_equal ["to@example.org"], mail.to + assert_equal ["moderateurs@agendadulibre.org"], mail.from + assert_match(/Bonjour.*/, mail.body.encoded) + end + +end diff --git a/test/mailers/previews/event_mailer_preview.rb b/test/mailers/previews/event_mailer_preview.rb new file mode 100644 index 00000000..e0f2de84 --- /dev/null +++ b/test/mailers/previews/event_mailer_preview.rb @@ -0,0 +1,10 @@ +# Preview all emails at http://localhost:3000/rails/mailers/event_mailer +class EventMailerPreview < ActionMailer::Preview + + # Preview this email at http://localhost:3000/rails/mailers/event_mailer/create + def create + ActionMailer::Base.default_url_options[:host] = 'localhost:3000' + EventMailer.create(Event.last) + end + +end diff --git a/test/models/event_test.rb b/test/models/event_test.rb index c6f15668..2d0587a6 100644 --- a/test/models/event_test.rb +++ b/test/models/event_test.rb @@ -1,7 +1,19 @@ require 'test_helper' class EventTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + test "basic event" do + @event = Event.new( + title: 'hello world', + start_time: Time.new(), + end_time: Time.new() + 1, + description: 'et hop!', + region: Region.first() + ) + assert @event.save() + + assert_equal 32, @event.secret.size() + assert_equal 32, @event.moderator_mail_id.size() + assert_equal 32, @event.submitter_mail_id.size() + end + end