From 450f52ef43fbe13bfa3cf8e7f12034f20d46cb57 Mon Sep 17 00:00:00 2001 From: echarp Date: Mon, 6 Jan 2014 11:22:39 +0100 Subject: [PATCH] =?UTF-8?q?Les=20=C3=A9crans=20de=20mod=C3=A9ration=20avan?= =?UTF-8?q?cent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/moderations.js.coffee | 3 ++ app/assets/stylesheets/moderations.css.sass | 39 +++++++++++++++ app/controllers/events_controller.rb | 9 +++- app/controllers/moderations_controller.rb | 44 ++++++++++++++++ app/helpers/moderations_helper.rb | 2 + app/models/event.rb | 1 + app/models/note.rb | 4 ++ app/models/user.rb | 1 + app/views/events/_form.html.haml | 50 +++++++++---------- app/views/events/new.html.haml | 5 ++ app/views/events/show.html.haml | 2 +- app/views/layouts/application.html.haml | 2 +- app/views/moderations/edit.html.haml | 13 +++++ app/views/moderations/index.html.haml | 49 ++++++++++++++++++ config/locales/fr.yml | 14 +++++- config/routes.rb | 1 + .../moderations_controller_test.rb | 7 +++ test/fixtures/notes.yml | 13 +++++ test/helpers/moderations_helper_test.rb | 4 ++ test/models/note_test.rb | 7 +++ 20 files changed, 239 insertions(+), 31 deletions(-) create mode 100644 app/assets/javascripts/moderations.js.coffee create mode 100644 app/assets/stylesheets/moderations.css.sass create mode 100644 app/controllers/moderations_controller.rb create mode 100644 app/helpers/moderations_helper.rb create mode 100644 app/models/note.rb create mode 100644 app/views/moderations/edit.html.haml create mode 100644 app/views/moderations/index.html.haml create mode 100644 test/controllers/moderations_controller_test.rb create mode 100644 test/fixtures/notes.yml create mode 100644 test/helpers/moderations_helper_test.rb create mode 100644 test/models/note_test.rb diff --git a/app/assets/javascripts/moderations.js.coffee b/app/assets/javascripts/moderations.js.coffee new file mode 100644 index 00000000..24f83d18 --- /dev/null +++ b/app/assets/javascripts/moderations.js.coffee @@ -0,0 +1,3 @@ +# 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/ diff --git a/app/assets/stylesheets/moderations.css.sass b/app/assets/stylesheets/moderations.css.sass new file mode 100644 index 00000000..19dd1c47 --- /dev/null +++ b/app/assets/stylesheets/moderations.css.sass @@ -0,0 +1,39 @@ +.moderations + table.list + width: 100% + margin-top: 15px + thead tr + background-color: transparent + td + padding-top: 0.5em + padding-bottom: 0.5em + &.empty + background-color: white + pre + width: 70% + margin: auto + padding: 5px + overflow: auto + text-align: left + background-color: #eee + em.author + display: block + font-size: smaller + text-align: right + font-style: italic + margin-top: 15px + + main > h3 + font-size: inherit + line-height: 1.3em + font-weight: normal + margin-left: 5em + margin-right: 5em + background-color: #CCC + + .box + width: 70% + margin: auto + padding: 1em + margin-bottom: 10px + background-color: #CCC diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index aa43e0c5..479997ed 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -55,6 +55,12 @@ class EventsController < InheritedResources::Base # PATCH/PUT /events/1 # PATCH/PUT /events/1.json def update + if params[:visu] + @event.attributes = params[:event] + 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]) @@ -80,6 +86,7 @@ class EventsController < InheritedResources::Base # 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) + params.require(:event) + .permit :title, :start_time, :end_time, :description, :city, :locality, :url, :contact, :submitter, :tags end end diff --git a/app/controllers/moderations_controller.rb b/app/controllers/moderations_controller.rb new file mode 100644 index 00000000..b7019065 --- /dev/null +++ b/app/controllers/moderations_controller.rb @@ -0,0 +1,44 @@ +class ModerationsController < InheritedResources::Base + before_action :set_event, only: [:show, :edit, :update, :destroy] + + def index + @events = Event.unscoped.where moderated: 0 + end + + # PATCH/PUT /moderations/1 + # PATCH/PUT /moderations/1.json + def update + if params[:visu] + @event.attributes = event_params + render action: 'edit' + return + end + + respond_to do |format| + if @event.update(event_params) + format.html { redirect_to moderations_path, notice: 'Event was successfully updated.' } + format.json { head :no_content } + else + format.html { render action: 'edit' } + format.json { render json: @event.errors, status: :unprocessable_entity } + end + end + end + + private + def permitted_params + params.permit event: [:title, :start_time, :end_time, :description, :city, :locality, :url, :contact, :submitter, :tags] + end + + # Use callbacks to share common setup or constraints between actions. + def set_event + @event = Event.unscoped.find params[:id] + @moderation = @event + end + + # 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 + end +end diff --git a/app/helpers/moderations_helper.rb b/app/helpers/moderations_helper.rb new file mode 100644 index 00000000..0c325e10 --- /dev/null +++ b/app/helpers/moderations_helper.rb @@ -0,0 +1,2 @@ +module ModerationsHelper +end diff --git a/app/models/event.rb b/app/models/event.rb index 55651638..51d0ae80 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -1,5 +1,6 @@ class Event < ActiveRecord::Base belongs_to :region, foreign_key: 'region' + has_many :notes validates_presence_of :region diff --git a/app/models/note.rb b/app/models/note.rb new file mode 100644 index 00000000..e7bf7fb8 --- /dev/null +++ b/app/models/note.rb @@ -0,0 +1,4 @@ +class Note < ActiveRecord::Base + belongs_to :event + belongs_to :author, class_name: User +end diff --git a/app/models/user.rb b/app/models/user.rb index 4a57cf07..e77bf44b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,2 +1,3 @@ class User < ActiveRecord::Base + has_many :notes end diff --git a/app/views/events/_form.html.haml b/app/views/events/_form.html.haml index 3c0509fe..f2732e6f 100644 --- a/app/views/events/_form.html.haml +++ b/app/views/events/_form.html.haml @@ -1,9 +1,4 @@ -- if @event && params[:visu] - %hr/ - = render file: '/events/show' - %hr/ - -= form_for @event do |f| += form_for @event, url: moderation_path(@event) do |f| - if @event.errors.any? #error_explanation %h2= "#{pluralize(@event.errors.count, "error")} prohibited this event from being saved:" @@ -11,29 +6,30 @@ - @event.errors.full_messages.each do |msg| %li= msg - :markdown - Cette page permet de soumettre un évènement dans l'Agenda du Libre. Celui-ci n'apparaîtra pas automatiquement dans l'Agenda, il sera tout d'abord validé par un modérateur. Un courrier électronique vous sera envoyé à l'adresse e-mail de contact donnée ci-dessous lorsque l'évènement aura été modéré. - - #advises - %h1 Recommandations importantes - + - unless @event.id :markdown - Ces quelques recommandations vous permettront de proposer un évènement qui sera validé plus rapidement, et dont la lisibilité sera meilleure pour les utilisateurs de l'Agenda du Libre. + Cette page permet de soumettre un évènement dans l'Agenda du Libre. Celui-ci n'apparaîtra pas automatiquement dans l'Agenda, il sera tout d'abord validé par un modérateur. Un courrier électronique vous sera envoyé à l'adresse e-mail de contact donnée ci-dessous lorsque l'évènement aura été modéré. - * L'évènement doit concerner le **Logiciel Libre**. L'agenda n'a pas vocation à publier d'autres types d'évènements. - * Le texte des évènements doit être rédigé en français, en **évitant les fautes de grammaire et d'orthographe**. - * Donnez une description **rédigée** de l'évènement, avec des phrases, plutôt qu'un style télégraphique. - * Commencez la description de votre évènement par une phrase reprenant les informations principales, telle que : _« L'association [Zorglub](http://www.asso-zorglub.org) organise une conférence sur le thème des **modèles économiques du Logiciel Libre** le samedi 21 mars de 18h à 20h à la médiathèque Champillion de Montpellier. »_ - * Pensez que le lecteur peut ne pas connaître votre association, le logiciel dont il sera question, etc., donc donnez à chaque fois toutes les informations nécessaires. Rappelez **le principe de l'évènement, le public visé, le lieu exact, la date, l'heure**, même si il est régulier (repas, rencontre régulière, etc.) et que vous avez déjà soumis un évènement du même type dans l'Agenda. - * **Égayez au maximum la description** de votre évènement: lien vers le site de votre association, vers le logiciel ou le langage dont il sera question, vers les organismes partenaires, etc. Pour cela, utilisez les balises HTML pour mettre en gras, en italique, faire des paragraphes et des liens. - * Ne mettez pas l'intégralité des mots en majuscule, que ce soit dans le titre, le nom de la ville ou la description. - * Donnez l'**adresse directe** d'un site Web donnant plus d'informations sur l'évènement. Si l'adresse est la page d'accueil du site de votre organisation, veillez à ce que l'évènement soit clairement visible, et que le lecteur n'ait pas à chercher trop longtemps avant de trouver l'information qu'il cherche. - * La description de l'évènement ne doit pas ressembler à une publicité éhontée pour votre entreprise, projet ou logiciel. Le ton d'un communiqué de presse, par exemple, ne convient pas pour l'Agenda du Libre. - * Les évènements de type professionnel sont acceptés dès lors qu'ils sont accessibles et ouverts à tous. Les évènements payants sont acceptés si le prix de l'entrée ne réserve pas l'évènement à un public uniquement professionnel. + #advises + %h1 Recommandations importantes - L'équipe de modération se réserve le droit de modifier la description de l'évènement pour la rendre plus complète, plus lisible ou plus attrayante. + :markdown + Ces quelques recommandations vous permettront de proposer un évènement qui sera validé plus rapidement, et dont la lisibilité sera meilleure pour les utilisateurs de l'Agenda du Libre. - Si vous soumettez souvent un évènement régulier dans l'Agenda du Libre, vous pouvez automatiser cette procédure à l'aide d'un [script que nous vous proposons](http://agendadulibre.org/submit-script-doc.php). + * L'évènement doit concerner le **Logiciel Libre**. L'agenda n'a pas vocation à publier d'autres types d'évènements. + * Le texte des évènements doit être rédigé en français, en **évitant les fautes de grammaire et d'orthographe**. + * Donnez une description **rédigée** de l'évènement, avec des phrases, plutôt qu'un style télégraphique. + * Commencez la description de votre évènement par une phrase reprenant les informations principales, telle que : _« L'association [Zorglub](http://www.asso-zorglub.org) organise une conférence sur le thème des **modèles économiques du Logiciel Libre** le samedi 21 mars de 18h à 20h à la médiathèque Champillion de Montpellier. »_ + * Pensez que le lecteur peut ne pas connaître votre association, le logiciel dont il sera question, etc., donc donnez à chaque fois toutes les informations nécessaires. Rappelez **le principe de l'évènement, le public visé, le lieu exact, la date, l'heure**, même si il est régulier (repas, rencontre régulière, etc.) et que vous avez déjà soumis un évènement du même type dans l'Agenda. + * **Égayez au maximum la description** de votre évènement: lien vers le site de votre association, vers le logiciel ou le langage dont il sera question, vers les organismes partenaires, etc. Pour cela, utilisez les balises HTML pour mettre en gras, en italique, faire des paragraphes et des liens. + * Ne mettez pas l'intégralité des mots en majuscule, que ce soit dans le titre, le nom de la ville ou la description. + * Donnez l'**adresse directe** d'un site Web donnant plus d'informations sur l'évènement. Si l'adresse est la page d'accueil du site de votre organisation, veillez à ce que l'évènement soit clairement visible, et que le lecteur n'ait pas à chercher trop longtemps avant de trouver l'information qu'il cherche. + * La description de l'évènement ne doit pas ressembler à une publicité éhontée pour votre entreprise, projet ou logiciel. Le ton d'un communiqué de presse, par exemple, ne convient pas pour l'Agenda du Libre. + * Les évènements de type professionnel sont acceptés dès lors qu'ils sont accessibles et ouverts à tous. Les évènements payants sont acceptés si le prix de l'entrée ne réserve pas l'évènement à un public uniquement professionnel. + + L'équipe de modération se réserve le droit de modifier la description de l'évènement pour la rendre plus complète, plus lisible ou plus attrayante. + + Si vous soumettez souvent un évènement régulier dans l'Agenda du Libre, vous pouvez automatiser cette procédure à l'aide d'un [script que nous vous proposons](http://agendadulibre.org/submit-script-doc.php). .field %p.helper @@ -66,11 +62,11 @@ .field = f.label Event.human_attribute_name :region = f.select :region, - options_from_collection_for_select(Region.all, 'id', 'name', params[:region]) + options_from_collection_for_select(Region.all, 'id', 'name', @event.region.id) .field = f.label Event.human_attribute_name :locality = f.select :locality, - options_for_select([[t('attributes.locality_0'), 0], [t('attributes.locality_1'), 1]], params[:locality]) + options_for_select([[t('attributes.locality_0'), 0], [t('attributes.locality_1'), 1]], @event.locality) .field %p.helper %em diff --git a/app/views/events/new.html.haml b/app/views/events/new.html.haml index ce881aa5..d257aa04 100644 --- a/app/views/events/new.html.haml +++ b/app/views/events/new.html.haml @@ -1,3 +1,8 @@ %h2=t '.title' +- if @event && params[:visu] + %hr/ + = render file: 'show' + %hr/ + = render 'form' diff --git a/app/views/events/show.html.haml b/app/views/events/show.html.haml index 3c8bbf38..1e9aa4e2 100644 --- a/app/views/events/show.html.haml +++ b/app/views/events/show.html.haml @@ -1,4 +1,4 @@ -- if request.format == 'text/html' +- if request.format == 'text/html' && controller.controller_name != 'moderations' %p#notice= notice #lug-list diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 1744ec5a..d1005263 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -66,4 +66,4 @@ = link_to t('.infos'), users_url = link_to t('.stats'), stats_regions_url = link_to t('.contact'), users_url - = link_to t('.moderation'), users_url + = link_to t('.moderation'), moderations_url diff --git a/app/views/moderations/edit.html.haml b/app/views/moderations/edit.html.haml new file mode 100644 index 00000000..eb779dee --- /dev/null +++ b/app/views/moderations/edit.html.haml @@ -0,0 +1,13 @@ +%h3 + = link_to t('.moderation'), moderations_path + >>> + =t '.preview' + +.box= render file: '/events/show' + +%h3 + = link_to t('.moderation'), moderations_path + >>> + =t '.edit' + +.box= render '/events/form' diff --git a/app/views/moderations/index.html.haml b/app/views/moderations/index.html.haml new file mode 100644 index 00000000..61915bbe --- /dev/null +++ b/app/views/moderations/index.html.haml @@ -0,0 +1,49 @@ +%h2=t '.title' + +%strong< + Modérateurs, merci de lire et de tenir compte des + = link_to 'recommandations de modération', 'http://agendadulibre.org/moderation-howto.php' + \. + +%table.list + %thead + %tr + %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 :submission_time + %th=t '.actions' + + %tbody + - @events.each do |event| + %tr + %td= event.title + %td + - if event.same_day? + Le #{l event.start_time.to_date, format: :long}, + de #{l event.start_time, format: :hours} à #{l event.end_time, format: :hours} + - else + Du + =l event.start_time, format: :at + au + #{l event.end_time, format: :at} + %td= event.city + %td= event.region.name + %td= time_ago_in_words event.submission_time.to_date + %td + = link_to t('edit'), edit_moderation_path(event) + \- + = link_to t('validate'), edit_moderation_path(event) + \- + = link_to t('refuse'), edit_moderation_path(event) + + - event.notes.each do |note| + %tr + %td.empty/ + %td(colspan="5") + =raw note.contents + %em.author + =t '.posted_by', + author: "#{note.author.firstname} #{note.author.lastname}", + date: l(note.date, format: :at) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 894c5935..f07bfc93 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1,9 +1,10 @@ fr: show: Voir edit: Éditer + validate: Valider + refuse: Refuser destroy: Supprimer - attributes: id: ID name: Nom @@ -50,6 +51,7 @@ fr: url: URL contact: Contact submitter: Soumetteur + submission_time: En attente depuis region: name_values: all: Toutes les régions @@ -133,3 +135,13 @@ fr: zero: one: "Dans le passé, %{count} évènement:" other: "Dans le passé, %{count} évènements:" + moderations: + index: + title: Évènements à modérer + actions: Actions + posted_by: Posté par %{author} le %{date} + date: Date + edit: + moderation: Modération + preview: Prévisualisation de l'évènement + edit: Édition de l'évènement diff --git a/config/routes.rb b/config/routes.rb index bf0f8092..24cfa2df 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,6 +6,7 @@ AgendaDuLibreRails::Application.routes.draw do resources :events resources :users resources :tags, only: [ :index, :show ] + resources :moderations get 'ical.php' => 'events#index', format: :ics get ':format.php' => 'events#index' diff --git a/test/controllers/moderations_controller_test.rb b/test/controllers/moderations_controller_test.rb new file mode 100644 index 00000000..f4940a3e --- /dev/null +++ b/test/controllers/moderations_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ModerationsControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/fixtures/notes.yml b/test/fixtures/notes.yml new file mode 100644 index 00000000..bff0a17c --- /dev/null +++ b/test/fixtures/notes.yml @@ -0,0 +1,13 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + contents: MyText + date: 2014-01-05 23:34:46 + event_id: + author_id: + +two: + contents: MyText + date: 2014-01-05 23:34:46 + event_id: + author_id: diff --git a/test/helpers/moderations_helper_test.rb b/test/helpers/moderations_helper_test.rb new file mode 100644 index 00000000..5302bae9 --- /dev/null +++ b/test/helpers/moderations_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class ModerationsHelperTest < ActionView::TestCase +end diff --git a/test/models/note_test.rb b/test/models/note_test.rb new file mode 100644 index 00000000..7bbab537 --- /dev/null +++ b/test/models/note_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class NoteTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end