Modération presque terminée

recurrent
echarp 9 years ago
parent c30a74af25
commit 681d97a8b0
  1. 11
      app/assets/stylesheets/all.css.sass
  2. 4
      app/assets/stylesheets/events.css.sass
  3. 23
      app/controllers/events_controller.rb
  4. 56
      app/controllers/moderations_controller.rb
  5. 4
      app/controllers/notes_controller.rb
  6. 2
      app/controllers/regions_controller.rb
  7. 23
      app/mailers/moderation_mailer.rb
  8. 12
      app/models/event.rb
  9. 2
      app/models/lug.rb
  10. 6
      app/views/events/_form.html.haml
  11. 2
      app/views/events/cancel.html.haml
  12. 27
      app/views/events/index.html.haml
  13. 20
      app/views/events/show.html.haml
  14. 18
      app/views/moderation_mailer/accept.text.haml
  15. 22
      app/views/moderation_mailer/create.text.haml
  16. 21
      app/views/moderation_mailer/destroy.text.haml
  17. 18
      app/views/moderation_mailer/moderate.text.haml
  18. 4
      app/views/moderations/edit.html.haml
  19. 8
      app/views/moderations/index.html.haml
  20. 26
      app/views/moderations/refuse.html.haml
  21. 13
      app/views/moderations/validate.html.haml
  22. 4
      app/views/notes/_form.html.haml
  23. 51
      config/locales/fr.yml
  24. 2
      config/routes.rb
  25. 42
      test/controllers/events_controller_test.rb
  26. 36
      test/controllers/moderations_controller_test.rb
  27. 4
      test/fixtures/cities.yml
  28. 8
      test/fixtures/events.yml
  29. 8
      test/fixtures/lugs.yml
  30. 31
      test/mailers/moderation_mailer_test.rb
  31. 4
      test/mailers/note_mailer_test.rb
  32. 3
      test/mailers/previews/event_mailer_preview.rb
  33. 17
      test/mailers/previews/moderation_mailer_preview.rb
  34. 2
      test/mailers/previews/note_mailer_preview.rb
  35. 8
      test/models/event_test.rb

@ -121,17 +121,24 @@ main
margin: 10px 20px
input, textarea, select, a.button
color: black
margin: 3px 0
cursor: pointer
border: 1px solid #868686
font-family: georgia, serif
@include border-radius(0.1em)
&:focus
background-color: #F0F8FF
&[type=submit], &.button
color: black
border: none
padding: 0.2em 0.6em
font-size: larger
line-height: 1.1em
font-weight: normal
vertical-align: baseline
font-weight: bolder
vertical-align: middle
background-color: #9CC5EE
@include box-shadow(2px 2px 2px gray)
select, option
color: black
background-color: white

@ -163,6 +163,10 @@ body.events.index table
display: inline-block
&:after
content: ':'
input[type=radio] + label
width: 20em
&:after
content: ''
.actions
margin-left: 6.75em
margin-bottom: 10px

@ -4,11 +4,11 @@ class EventsController < ApplicationController
before_filter :set_mailer_host
def index
@events = Event.moderated
if (params[:region] && params[:region].present? && params[:region] != 'all')
@events = @events.region(params[:region])
@events = Event.all_moderated
if params[:region] && params[:region].present? && params[:region] != 'all'
@events = @events.region params[:region]
end
@events = @events.tag(params[:tag]) if (params[:tag])
@events = @events.tag(params[:tag]) if params[:tag]
respond_to do |format|
format.html {
@ -44,9 +44,7 @@ class EventsController < ApplicationController
# POST /events
# POST /events.json
def create
@event = Event.new(event_params)
# This is a special case, required to handle the region attribute with same foreign key name
@event.region = Region.find params[:event][:region]
@event = Event.new event_params
if params[:visu]
@event.valid?
@ -73,9 +71,6 @@ class EventsController < ApplicationController
# 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 = event_params
@event.valid?
@ -84,7 +79,7 @@ class EventsController < ApplicationController
end
respond_to do |format|
if @event.update(event_params)
if @event.update event_params
format.html { redirect_to @event, notice: t('.ok') }
format.json { head :no_content }
else
@ -99,7 +94,7 @@ class EventsController < ApplicationController
def destroy
@event.destroy
respond_to do |format|
format.html { redirect_to events_url }
format.html { redirect_to events_url, notice: t('.ok') }
format.json { head :no_content }
end
end
@ -110,7 +105,7 @@ class EventsController < ApplicationController
if params[:secret].present?
@event = Event.where secret: params[:secret]
else
@event = Event.moderated
@event = Event.all_moderated
end
@event = @event.find params[:id]
end
@ -118,7 +113,7 @@ class EventsController < ApplicationController
# Never trust parameters from the scary internet, only allow the white list through.
def event_params
params.require(:event)
.permit :title, :start_time, :end_time, :description, :city, :locality, :url, :contact, :submitter, :tags
.permit :title, :start_time, :end_time, :description, :city, :region, :locality, :url, :contact, :submitter, :tags
end
def check_secret

@ -2,8 +2,8 @@ require 'differ'
class ModerationsController < ApplicationController
before_filter :authenticate_user!
before_action :set_event, only: [:show, :edit, :update, :destroy]
before_filter :set_mailer_host, only: [:update, :destroy]
before_action :set_moderation, only: [:show, :edit, :update, :validate, :accept, :refuse, :destroy]
before_filter :set_mailer_host, only: [:update, :accept, :destroy]
def index
@events = Event.where moderated: 0
@ -12,44 +12,68 @@ class ModerationsController < ApplicationController
# 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
@moderation.attributes = moderation_params
render action: 'edit'
return
end
respond_to do |format|
if @event.update(event_params)
if @moderation.update(moderation_params)
# Send an update mail to its author
ModerationMailer.update(@event, current_user).deliver
ModerationMailer.update(@moderation, current_user).deliver
format.html { redirect_to moderations_path, notice: 'Event was successfully updated.' }
format.html { redirect_to moderations_path, notice: t('.ok') }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @event.errors, status: :unprocessable_entity }
format.json { render json: @moderation.errors, status: :unprocessable_entity }
end
end
end
private
def permitted_params
params.require(:event).permit(:title, :start_time, :end_time, :description, :city, :locality, :url, :contact, :submitter, :tags)
# PATCH/PUT /accept/1
# PATCH/PUT /accept/1.json
def accept
respond_to do |format|
if @moderation.update(moderated: 1)
# Send an update mail to its author
ModerationMailer.accept(@moderation, current_user).deliver
format.html { redirect_to moderations_path, notice: t('.ok') }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @moderation.errors, status: :unprocessable_entity }
end
end
end
# DELETE /events/1
# DELETE /events/1.json
def destroy
if @moderation.destroy
# Send a notification to its author
@reason = 'pas cool'
ModerationMailer.destroy(@moderation, current_user, @reason).deliver
end
respond_to do |format|
format.html { redirect_to moderations_url, notice: t('.ok') }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_event
def set_moderation
@event = Event.find params[:id]
@moderation = @event
end
# Never trust parameters from the scary internet, only allow the white list through.
def event_params
def moderation_params
params.require(:event)
.permit :title, :start_time, :end_time, :description, :city, :locality, :url, :contact, :submitter, :tags
.permit :title, :start_time, :end_time, :description, :city, :region, :locality, :url, :contact, :submitter, :tags
end
# Useful to manage absolute url in mails

@ -13,9 +13,11 @@ class NotesController < ApplicationController
respond_to do |format|
if @note.save
if (params[:envoiParMail] == 'oui')
if params[:envoiParMail] == 'oui'
# Send an update mail to its author
NoteMailer.create(@note).deliver
@note.contents = t('.sendByMailWrap', contents: @note.contents)
@note.save
end
format.html { redirect_to moderations_url, notice: t('.ok') }

@ -4,7 +4,7 @@ class RegionsController < InheritedResources::Base
end
def stats
@region_events = Event.joins(:region).group(:name).count(:name)
@region_events = Event.joins(:related_region).group(:name).count(:name)
@city_events = Event.group(:city).having('count(city) > 3').order('count(city) desc').count(:city)

@ -9,11 +9,6 @@ class ModerationMailer < ActionMailer::Base
subject: t('moderation_mailer.create.subject', subject: event.title)
end
# Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup:
#
# en.moderation_mailer.update.subject
#
def update(event, current_user)
@event = event
@current_user = current_user
@ -22,16 +17,20 @@ class ModerationMailer < ActionMailer::Base
subject: t('moderation_mailer.update.subject', subject: event.title)
end
# Subject can be set in your I18n file at config/locales/en.yml
# with the following lookup:
#
# en.moderation_mailer.moderate.subject
#
def moderate(event, current_user)
def accept(event, current_user)
@event = event
@current_user = current_user
mail 'In-Reply-To' => "<mod-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
subject: t('moderation_mailer.moderate.subject', subject: event.title)
subject: t('moderation_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' => "<mod-#{event.id}@#{ActionMailer::Base.default_url_options[:host]}>",
subject: t('moderation_mailer.destroy.subject', subject: event.title)
end
end

@ -1,17 +1,19 @@
# TODO migrate moderated column to a SQL bool type
class Event < ActiveRecord::Base
extend SimpleCalendar
belongs_to :region, foreign_key: 'region'
belongs_to :related_region, foreign_key: 'region', class_name: Region
has_many :notes, dependent: :destroy
has_one :related_city, foreign_key: :name, primary_key: :city, class_name: City
validates_presence_of :title, :description, :city, :region, :url, :contact
validates_presence_of :title, :description, :city, :related_region, :url, :contact
validates_format_of :url, with: /\Ahttps?:\/\/.*\z/
validates :contact, email: true
validates :submitter, email: true
scope :moderated, -> { where moderated: 1 }
scope :all_moderated, -> { where moderated: 1 }
scope :past, -> { where('end_time < now()').order(start_time: :desc) }
scope :future, -> { where('end_time >= now()').order(start_time: :asc) }
scope :future_30, -> {
@ -49,4 +51,8 @@ class Event < ActiveRecord::Base
def same_day?
start_time.to_date == end_time.to_date
end
def is_moderated?
moderated == 1
end
end

@ -1,4 +1,4 @@
class Lug < ActiveRecord::Base
belongs_to :region, foreign_key: 'region'
belongs_to :related_region, foreign_key: 'region', class_name: Region
has_one :related_city, foreign_key: :name, primary_key: :city, class_name: City
end

@ -1,4 +1,4 @@
= form_for @event do |f|
= form_for @event, url: (@moderation ? moderation_path(@moderation) : @event.persisted? ? event_path(@event) : nil) do |f|
- if @event.errors.any?
#error_explanation.error.flash
%h2= "#{pluralize(@event.errors.count, "error")} prohibited this event from being saved:"
@ -39,9 +39,9 @@
= f.label Event.human_attribute_name :city
= f.text_field :city, required: true, size: 70
.field
= f.label Event.human_attribute_name :region
= f.label Event.human_attribute_name :related_region
= f.select :region,
options_from_collection_for_select(Region.all, 'id', 'name', @event.region && @event.region.id)
options_from_collection_for_select(Region.all, 'id', 'name', @event.region)
.field
= f.label Event.human_attribute_name :locality
= f.select :locality,

@ -3,7 +3,7 @@
=t '.title'
.box
- if @event.moderated
- if @event.is_moderated?
%h3=t '.already_moderated'
= form_for @event, method: :delete do |f|

@ -1,3 +1,6 @@
-# Otherwise the simple calendar could be empty during the first hours of a new month
- Time.zone = 'Paris'
%form.region_selector
- if params[:start_date]
= hidden_field_tag :start_date, params[:start_date]
@ -11,9 +14,9 @@
- if params[:year]
-# Whole year calendar
%header.calendar-header.year
= link_to '<<', "?year=#{params[:year].to_i-1}"
= link_to '<<', year: params[:year].to_i-1, tag: params[:tag], region: params[:region]
= params[:year]
= link_to '>>', "?year=#{params[:year].to_i+1}"
= link_to '>>', year: params[:year].to_i+1, tag: params[:tag], region: params[:region]
- (1..12).each do |i|
- params[:start_date] = "#{params[:year]}-#{i}-01"
@ -27,25 +30,27 @@
- events.select { |e| e.start_time.to_date <= date and date <= e.end_time.to_date }.sort_by { |e| e.city }.each do |event|
%li.event
= link_to event do
%strong= event.city.gsub('-', ' ')
%strong= event.city.gsub '-', ' '
= event.title
- else
= month_calendar events: @events,
title: ->(start_date) { raw "#{I18n.t('date.month_names')[start_date.month]} #{link_to start_date.year, root_url(year: start_date.year), class: 'year_selector'}" },
previous_link: ->(param, date_range) { link_to '<<', { param => date_range.first - 1.day } },
next_link: ->(param, date_range) { link_to '>>', { param => date_range.last + 1.day } } do |date, events|
previous_link: ->(param, date_range) { link_to '<<', { param => date_range.first - 1.day, tag: params[:tag], region: params[:region] } },
next_link: ->(param, date_range) { link_to '>>', { param => date_range.last + 1.day, tag: params[:tag], region: params[:region] } } do |date, events|
.day_number= date.day
%ul.events
- events.select { |e| e.start_time.to_date <= date and date <= e.end_time.to_date }.sort_by { |e| e.city }.each do |event|
%li.event
= link_to event do
%strong= event.city.gsub('-', ' ')
%strong= event.city.gsub '-', ' '
= event.title
.formats
=t '.calendar_in'
= link_to('rss', events_url(:rss, tag: params[:tag], region: params[:region]))+','
= link_to 'iCal', events_url(:rss, tag: params[:tag], format: :ics, tag: params[:tag], region: params[:region])
ou
= link_to 'calendrier Google', "http://www.google.com/calendar/render?cid=#{events_url(format: :ics, tag: params[:tag], region: params[:region])}"
=raw t '.calendar_in',
rss: link_to('rss', events_url(:rss,
tag: params[:tag], region: params[:region])),
ical: link_to('iCal', events_url(:rss,
tag: params[:tag], format: :ics, tag: params[:tag], region: params[:region])),
googleCal: link_to('calendrier Google',
"http://www.google.com/calendar/render?cid=#{events_url(format: :ics, tag: params[:tag], region: params[:region])}")

@ -1,15 +1,25 @@
- if request.format == 'text/html' && controller.controller_name != 'moderations' && controller.controller_name != 'notes' && controller.action_name != 'edit' && controller.action_name != 'cancel'
#lug-list
%h1=t '.lug-list'
- if @event.region
- if @event.related_region
%ul
- @event.region.lugs.order(department: :asc).each do |lug|
- @event.related_region.lugs.order(department: :asc).each do |lug|
%li
= link_to lug.name, lug.url
(#{lug.department})
%h1=t '.actions'
= link_to t('.add_to_calendar'), root_url
= link_to root_url do
%em.fa.fa-calendar
=t '.add_to_calendar'
- if user_signed_in?
= link_to edit_moderation_path @event do
%em.fa.fa-pencil
=t '.edit'
%br/
= link_to cancel_event_path @event, secret: @event.secret do
%em.fa.fa-thumbs-down
=t '.cancel'
%h2
%em= @event.city + ':'
@ -29,7 +39,7 @@
%p
=t '.at'
%em= link_to(@event.city, "http://fr.wikipedia.org/wiki/#{url_encode @event.city}") + ','
= link_to @event.region.name, "http://fr.wikipedia.org/wiki/#{url_encode @event.region.name}" rescue nil
= link_to @event.related_region.name, "http://fr.wikipedia.org/wiki/#{url_encode @event.related_region.name}" rescue nil
%h3=t '.description'
.description
@ -45,7 +55,7 @@
%span.label= Event.human_attribute_name :contact
= mail_to @event.contact, nil, encode: :javascript, replace_at: ' CHEZ ', replace_dot: ' POINT '
- if (@event.tags && @event.tags.present?)
- if @event.tags && @event.tags.present?
%p.tags
%span.label= Event.human_attribute_name :tags
- @event.tags.split.each do |tag|

@ -0,0 +1,18 @@
=t '.title'
\
=t '.body', author: @current_user
\
=====================================================
#{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'

@ -1,17 +1,17 @@
=t '.title'
\
=t '.body', subject: @event.title, start_time: l(@event.start_time, format: :at)
= edit_moderation_url @event
= moderations_url
\
#{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}
#{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'

@ -0,0 +1,21 @@
=t '.title'
\
=t '.body', author: @current_user
\
= @reason
\
=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'

@ -1,18 +0,0 @@
=t '.title'
\
=t '.body', author: @current_user
\
=====================================================
#{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'

@ -3,6 +3,10 @@
>>>
=t '.preview'
- if @moderation.is_moderated?
.box
%h3=t '.warning'
.box= render file: '/events/show'
%h3

@ -9,7 +9,7 @@
%th= Event.human_attribute_name :title
%th=t '.date'
%th= Event.human_attribute_name :city
%th= Event.human_attribute_name :region
%th= Event.human_attribute_name :related_region
%th= Event.human_attribute_name :submission_time
%th=t '.actions'
@ -27,18 +27,18 @@
au
=l event.end_time, format: :at
%td= event.city
%td= event.region.name
%td= event.related_region.name
%td= time_ago_in_words event.submission_time.to_date
%th.actions
= link_to edit_moderation_path event do
%em.fa.fa-pencil
=t 'edit'
\-
= link_to edit_moderation_path event do
= link_to validate_moderation_path event do
%em.fa.fa-thumbs-up
=t 'validate'
\-
= link_to edit_moderation_path event do
= link_to refuse_moderation_path event do
%em.fa.fa-thumbs-down
=t 'refuse'
%br/

@ -0,0 +1,26 @@
%h3
= link_to t('.moderation'), moderations_path
>>>
=t '.title'
.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')
= f.submit t('.ok')
= link_to t('.ko'), moderations_url, class: :button
.box= render file: '/events/show'

@ -0,0 +1,13 @@
%h3
= link_to t('.moderation'), moderations_path
>>>
=t '.title'
.box
%h2=t '.question'
= form_for @moderation, url: { action: :accept }, html: { method: :put } do |f|
= f.submit t('.ok'), name: :yes
= link_to t('.ko'), moderations_url, class: :button
.box= render file: '/events/show'

@ -27,7 +27,9 @@
.actions
= f.submit t('.save')
= link_to t('.ko'), moderations_url, class: :button
- else
.actions
= f.submit t('save')
= f.submit t('.ok')
= link_to t('.ko'), moderations_url, class: :button

@ -18,6 +18,7 @@ fr:
created: Créé il y a %{date}
updated: Mis à jour il y a %{date}
# Base de données
activerecord:
models:
admin_user: Admin
@ -39,7 +40,7 @@ fr:
inseecode: Code INSEE
regioncode: Code région
lug:
region: Région
related_region: Région
department: Département
url: Adresse web
city: Cité
@ -49,7 +50,7 @@ fr:
end_time: Fin
description: Description
city: Ville
region: Région
related_region: Région
locality: Portée
url: URL
contact: Contact
@ -91,6 +92,7 @@ fr:
at: "%A %d %B %Y à %Hh%M"
hours: "%Hh%M"
# Traductions des écrans
layouts:
application:
login: Authentication
@ -112,7 +114,7 @@ fr:
moderation: Modération
events:
index:
calendar_in: Ce calendrier en
calendar_in: Ce calendrier en %{rss}, %{ical} ou %{googleCal}
all_regions: Toutes les régions
show:
lug-list: Groupes d'utilisateurs de la région
@ -122,6 +124,8 @@ fr:
description: Description
infos: Informations
actions: Actions
edit: Éditer événement
cancel: Annuler événement
new:
title: Soumettre un évènement
create:
@ -129,7 +133,6 @@ fr:
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:
@ -142,6 +145,8 @@ fr:
preview: Visualisation de l'évènement
ok: Oui
ko: Non
destroy:
ok: Votre événément a bien été annulé
regions:
index:
title: Liste des flux RSS
@ -183,16 +188,44 @@ fr:
edit:
moderation: Modération
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.
edit: Édition de l'évènement
update:
ok: Événement mis à jour
validate:
title: Validation de l'évènement
question: Confirmez-vous la validation de cet évènement?
ok: Oui
ko: Non
accept:
ok: Évènement accepté
refuse:
title: Rejet de l'évènement
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
destroy:
ok: Évènement rejeté
notes:
new:
back: Modération
title: Ajout d'une note de modération
create:
sendByMailWrap: "<p>Demande d'informations complémentaires:</p><pre>%{contents}</pre>"
ok: La note a bien été ajoutée, merci!
form:
title: Rédaction du message
save: Envoyer
ok: Enregistrer
ko: Annuler
maps:
index:
title: Carte des évènements
@ -226,13 +259,19 @@ fr:
update:
subject: "[Agenda du Libre] Édition de l'évènement '%{subject}'"
title: Bonjour,
body: "L'évènement '%{subject}' a été modifié par\n%{author}\n\nModifications apportées:"
body: "L'évènement '%{subject}' a été modifié par %{author}\n\nModifications apportées:"
signature: "Bonne journée\n\n-- \nL'équipe de modération"
moderate:
accept:
subject: "[Agenda du Libre] Évènement '%{subject}' modéré"
title: Bonjour,
body: L'évènement a été modéré par %{author}
signature: "-- \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:"
signature: "Avec tous nos remerciements pour votre contribution,\n\n-- \nL'équipe de modération"
note_mailer:
create:
subject: "[Agenda du Libre] Demande d'informations sur l'évènement '%{subject}'"

@ -13,6 +13,8 @@ Rails.application.routes.draw do
end
resources :moderations do
resources :notes, only: [:new, :create]
get :validate, :refuse, on: :member
put :accept, on: :member
end
resources :regions, only: [ :index ] do
get 'icallist', on: :collection

@ -1,103 +1,109 @@
require 'test_helper'
class EventsControllerTest < ActionController::TestCase
include Devise::TestHelpers
setup do
@event = events(:one)
@event = events :one
end
test "should get index" do
test 'should get index' do
get :index
assert_response :success
assert_not_nil assigns(:events)
end
test "should get new" do
test 'should get new' do
get :new
assert_response :success
end
test "should preview event" do
assert_no_difference('Event.count') do
test 'should preview event' do
assert_no_difference 'Event.count' do
post :create, visu: 'visualise', event: {
title: @event.title,
start_time: @event.start_time,
end_time: @event.end_time,
description: @event.description,
city: @event.city,
region: regions(:region_one),
region: @event.related_region,
locality: @event.locality,
url: @event.url,
contact: @event.contact,
submitter: @event.submitter,
tags: @event.tags
}
assert_empty assigns(:event).errors
end
assert_response :success
end
test "should create event" do
assert_difference('Event.count') do
test 'should create event' do
assert_difference 'Event.count' do
post :create, event: {
title: @event.title,
start_time: @event.start_time,
end_time: @event.end_time,
description: @event.description,
city: @event.city,
region: regions(:region_one),
region: @event.related_region,
locality: @event.locality,
url: @event.url,
contact: @event.contact,
submitter: @event.submitter,
tags: @event.tags
}
assert_empty assigns(:event).errors.messages
end
assert_redirected_to root_url
end
test "should show event" do
test 'should show event' do
get :show, id: @event
assert_response :success
end
test "should get edit" do
test 'should get edit' do
get :edit, id: @event, secret: 'MyString'
assert_response :success
end
test "should not get edit" do
test 'should not get edit' do
get :edit, id: @event
assert_redirected_to root_url
end
test "should update event" do
test 'should update event' do
patch :update, id: @event, secret: 'MyString', event: {
title: @event.title,
start_time: @event.start_time,
end_time: @event.end_time,
description: @event.description,
city: @event.city,
region: regions(:region_one),
region: @event.related_region,
locality: @event.locality,
url: @event.url,
contact: @event.contact,
moderated: @event.moderated,
moderator_mail_id: @event.moderator_mail_id,
secret: @event.secret,
submission_time: @event.submission_time,
submitter: @event.submitter,
submitter_mail_id: @event.submitter_mail_id,
tags: @event.tags }
assert_empty assigns(:event).errors.messages
assert_redirected_to event_path(assigns(:event))
end
test "should get cancel page" do
test 'should get cancel page' do
get :cancel, id: @event, secret: 'MyString'
assert_response :success
end
test "should destroy event" do
test 'should destroy event' do
assert_difference('Event.count', -1) do
delete :destroy, id: @event, secret: 'MyString'
end

@ -1,7 +1,37 @@
require 'test_helper'
class ModerationsControllerTest < ActionController::TestCase
# test "the truth" do
# assert true
# end
include Devise::TestHelpers
setup do
@moderation = events :one
sign_in users(:one)
end
test 'should edit event' do
put :update, id: @moderation, event: {
title: 'hello world',
related_region: regions(:region_one)
}
assert_redirected_to moderations_path
end
test 'should accept event' do
put :accept, id: @moderation
assert assigns(:moderation).is_moderated?
assert_empty assigns(:moderation).errors
assert_redirected_to moderations_path
end
test 'should reject event' do
assert_difference 'Event.count', -1 do
delete :destroy, id: @moderation
end
assert_empty assigns(:moderation).errors
assert_redirected_to moderations_path
end
end

@ -1,6 +1,6 @@
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
city_one:
name: Jolie ville
majname: JOLIE VILLE
postalcode: 1
@ -9,7 +9,7 @@ one:
latitude: 1.5
longitude: 1.5
two:
city_two:
name: Une autre ville
majname: UNE AUTRE VILLE
postalcode: 1

@ -5,8 +5,8 @@ one:
description: MyText
start_time: 2013-12-28 16:04:56
end_time: 2013-12-28 16:04:56
city: Jolie ville
region: region_one
city: city_one.name
related_region: region_one
locality: 1
url: http://exemple.com
contact: test@example.com
@ -24,8 +24,8 @@ two:
description: MyText
start_time: 2013-12-28 16:04:56
end_time: 2013-12-28 16:04:56
city: Une autre ville
region: region_one
city: city_two.name
related_region: region_two
locality: 1
url: http://exemple.com
contact: test2@example.com

@ -1,15 +1,15 @@
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
one:
region: region_one
related_region: region_one
city: Jolie ville
department: 1
name: MyString
url: MyString
city: MyString
two:
region: region_one
related_region: region_two
city: Jolie ville
department: 1
name: MyString
url: MyString
city: MyString

@ -5,24 +5,31 @@ class ModerationMailerTest < ActionMailer::TestCase
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
end
test "create" do
mail = ModerationMailer.create(Event.unscoped.last)
test 'create' do
mail = ModerationMailer.create Event.unscoped.last
assert_match(/\[Agenda du Libre\] Nouvel évènement à modérer: .*/, mail.subject)
assert_equal ["moderateurs@agendadulibre.org"], mail.to
assert_equal ["moderateurs@agendadulibre.org"], mail.from
assert_equal ['moderateurs@agendadulibre.org'], mail.to
assert_equal ['moderateurs@agendadulibre.org'], mail.from
end
test "update" do
mail = ModerationMailer.update(Event.unscoped.last, User.last)
test 'update' do
mail = ModerationMailer.update Event.unscoped.last, User.last
assert_match(/\[Agenda du Libre\] Édition de l'évènement .*/, mail.subject)
assert_equal ["moderateurs@agendadulibre.org"], mail.to
assert_equal ["moderateurs@agendadulibre.org"], mail.from
assert_equal ['moderateurs@agendadulibre.org'], mail.to
assert_equal ['moderateurs@agendadulibre.org'], mail.from
end
test "moderate" do
mail = ModerationMailer.moderate(Event.unscoped.last, User.last)
test 'accept' do
mail = ModerationMailer.accept Event.unscoped.last, User.last
assert_match(/\[Agenda du Libre\] Évènement .* modéré/, mail.subject)
assert_equal ["moderateurs@agendadulibre.org"], mail.to
assert_equal ["moderateurs@agendadulibre.org"], mail.from
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'
assert_match(/\[Agenda du Libre\] Évènement .* refusé/, mail.subject)
assert_equal ['moderateurs@agendadulibre.org'], mail.to
assert_equal ['moderateurs@agendadulibre.org'], mail.from
end
end

@ -5,8 +5,8 @@ class NoteMailerTest < ActionMailer::TestCase
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
end
test "create" do
mail = NoteMailer.create(Note.last)
test 'create' do
mail = NoteMailer.create Note.last
assert_match(/\[Agenda du Libre\] Demande d'informations sur l'évènement .*/, mail.subject)
assert_equal [Note.last.event.contact], mail.to
assert_equal ["moderateurs@agendadulibre.org"], mail.from

@ -4,7 +4,6 @@ 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)
EventMailer.create Event.last
end
end

@ -5,7 +5,7 @@ class ModerationMailerPreview < ActionMailer::Preview
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/create
def create
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
ModerationMailer.create(Event.last)
ModerationMailer.create Event.last
end
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/update
@ -14,12 +14,19 @@ class ModerationMailerPreview < ActionMailer::Preview
event = Event.last
event.description = event.description + '
hello world'
ModerationMailer.update(event, User.last)
ModerationMailer.update event, User.last
end
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/moderate
def moderate
# Preview this email at http://localhost:3000/rails/mailers/moderation_mailer/accept
def accept
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
ModerationMailer.moderate(Event.last, User.last)
ModerationMailer.accept Event.last, User.last
end
# 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
end
end

@ -3,6 +3,6 @@ class NoteMailerPreview < ActionMailer::Preview
# Preview this email at http://localhost:3000/rails/mailers/note_mailer/create
def create
ActionMailer::Base.default_url_options[:host] = 'localhost:3000'
NoteMailer.create(Note.last)
NoteMailer.create Note.last
end
end

@ -7,8 +7,8 @@ class EventTest < ActiveSupport::TestCase
start_time: Time.new(),
end_time: Time.new() + 1,
description: 'et hop!',
city: City.first().name,
region: Region.first(),
city: City.first(),
related_region: Region.first(),
url: 'http://example.com',
contact: 'contact@example.com',
submitter: 'submitter@example.com'
@ -26,8 +26,8 @@ class EventTest < ActiveSupport::TestCase
start_time: Time.new(),
end_time: Time.new() + 1,
description: 'et hop!',
city: City.first().name,
region: Region.first(),
city: City.first(),
related_region: Region.first(),
url: 'http://example.com',
contact: 'contact@example.com'
)

Loading…
Cancel
Save