From a76e23c1097f5dded0e9d7aaaea02ecf5d185919 Mon Sep 17 00:00:00 2001 From: echarp Date: Sun, 29 Dec 2013 20:42:00 +0100 Subject: [PATCH] Flux rss en place --- app/controllers/events_controller.rb | 33 +++++++++++---- app/models/event.rb | 1 + app/views/events/index.html.haml | 13 +++--- app/views/events/index.rss.builder | 54 +++++++++++++++++++++++++ app/views/events/show.html.haml | 5 +-- app/views/layouts/application.html.haml | 2 +- config/initializers/mime_types.rb | 2 + config/locales/fr.yml | 5 ++- 8 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 app/views/events/index.rss.builder diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 5ff0bf4b..de009e5b 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,13 +1,30 @@ class EventsController < InheritedResources::Base def index - if (params[:year] and !params[:month]) - # Whole year calendar - @events = Event.year(params[:year] || Date.today.year) - else - @events = Event.month(params[:year] || Date.today.year, params[:month] || Date.today.month) - end - if (params[:region] && params[:region].present?) - @events = @events.region(params[:region]) + respond_to do |format| + format.html { + if (params[:year] and !params[:month]) + # Whole year calendar + @events = Event.year(params[:year] || Date.today.year) + else + @events = Event.month(params[:year] || Date.today.year, params[:month] || Date.today.month) + end + if (params[:region] && params[:region].present? && params[:region] != 'all') + @events = @events.region(params[:region]) + end + if (params[:tag]) + @events = @events.tag(params[:tag]) + end + } + + format.rss { + @events = Event.where('start_time >= now()').order(start_time: :asc).limit(25) + if (params[:region] && params[:region].present? && params[:region] != 'all') + @events = @events.region(params[:region]) + end + if (params[:tag]) + @events = @events.tag(params[:tag]) + end + } end end diff --git a/app/models/event.rb b/app/models/event.rb index 07184c7a..a67bb94c 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -10,4 +10,5 @@ class Event < ActiveRecord::Base "#{year}-#{month.to_i-1}-1", "#{year}-#{month.to_i+2}-1" } scope :region, -> region { where region: region } + scope :tag, -> tag { where "tags like ?", "%#{tag}%" } end diff --git a/app/views/events/index.html.haml b/app/views/events/index.html.haml index 60915d8b..f2fbf29a 100644 --- a/app/views/events/index.html.haml +++ b/app/views/events/index.html.haml @@ -6,7 +6,7 @@ = label_tag :region, Region.model_name.human = select_tag :region, options_from_collection_for_select(Region.all, 'id', 'name', params[:region]), - prompt: t('region_selector') + prompt: t('.all_regions') - if (params[:year] and !params[:month]) -# Whole year calendar @@ -20,22 +20,23 @@ - params[:month] = i = calendar @events, { prev_text: '', next_text: '', start_day: :monday, - params: { region: params[:region] } } do |event| + params: { region: params[:region], tag: params[:tag] } } do |event| %ul.events %li.event - = link_to event.url do + = link_to event do %strong= event.city = event.title - else = calendar @events, { prev_text: '<<', next_text: '>>', start_day: :monday, - params: { region: params[:region] } } do |event| + params: { region: params[:region], tag: params[:tag] } } do |event| %ul.events %li.event - = link_to event.url do + = link_to event do %strong= event.city = event.title .formats =t '.calendar_in' - rss, iCal ou calendrier Google + = link_to 'rss', events_url(:rss) + , iCal ou calendrier Google diff --git a/app/views/events/index.rss.builder b/app/views/events/index.rss.builder new file mode 100644 index 00000000..28ff8ddc --- /dev/null +++ b/app/views/events/index.rss.builder @@ -0,0 +1,54 @@ +xml.instruct! + +xml.tag! 'rdf:RDF', 'xmlns:rdf' => "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + 'xmlns' => "http://purl.org/rss/1.0/", 'xmlns:dc' => "http://purl.org/dc/elements/1.1/", + 'xmlns:sy' => "http://purl.org/rss/1.0/modules/syndication/", + 'xmlns:admin' => "http://webns.net/mvcb/", 'xmlns:cc' => "http://web.resource.org/cc/", + 'xmlns:content' => "http://purl.org/rss/1.0/modules/content/", + 'xmlns:georss' => "http://www.georss.org/georss" do + xml.channel 'rdf:about' => root_url do + xml.title "Agenda du Libre [ #{params[:region].present? && params[:region] != 'all' ? Region.find(params[:region]).name : t('.all_regions')} ]" + xml.description 'Agenda des événements autour du Logiciel Libre' + xml.link 'http://www.agendadulibre.org' + xml.tag! 'dc:language', 'fr' + xml.tag! 'dc:creator', 'AgendaDuLibre.org' + + xml.items do + xml.tag! 'rdf:Seq' do + for event in @events + xml.tag! 'rdf:li', 'rdf:resource' => event_url(event) + end + end + end + end + + for event in @events + xml.item 'rdf:about' => event_url(event) do + xml.title "#{event.city}: #{event.title}, #{l event.start_time.to_date, format: :long}" + xml.link event_url event + xml.tag! 'dc:identifier', "#{event.id}@agendadulibre.org" + xml.tag! 'dc:date', event.start_time + xml.tag! 'georss:point', City.find_all_by_majname(event.city.upcase).collect { |c| "#{c.latitude} #{c.longitude}" }.first + + content = "

#{event.city}: #{event.title}

+

Date et lieu

+

#{l event.start_time.to_date, format: :long}, + de #{event.start_time.hour}h#{event.start_time.min} à #{event.end_time.hour}h#{event.end_time.min}.

+

À #{event.city}, + #{event.region.name}

+

Description

+ #{event.description} +

Informations

+

Site Web: #{event.url}

+

Contact: #{mail_to event.contact.sub('@', ' CHEZ ').sub('.', ' POINT '), event.contact.sub('@', ' CHEZ ').sub('.', ' POINT ')}

+ " + + if (event.tags && event.tags.present?) + content += "

Tags: #{event.tags.split.collect { |tag| link_to tag, events_url(tag: tag) }.join(', ')}

" + end + + xml.description strip_tags(content) + xml.tag! 'content:encoded', content + end + end +end diff --git a/app/views/events/show.html.haml b/app/views/events/show.html.haml index d70bc1c3..b95f38c9 100644 --- a/app/views/events/show.html.haml +++ b/app/views/events/show.html.haml @@ -17,7 +17,7 @@ = @event.city %p %b Region: - = @event.region + = @event.region.name %p %b Locality: = @event.locality @@ -27,9 +27,6 @@ %p %b Contact: = @event.contact -%p - %b Contact: - = @event.contact %p %b Submitter: = @event.submitter diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 969c4d4a..cd2bfcdb 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -59,7 +59,7 @@ %footer.bottom %nav = link_to t('.propose'), new_event_path - = link_to t('.rss'), users_url + = link_to t('.rss'), events_url(:rss) = link_to t('.ical'), users_url = link_to t('.map'), users_url = link_to t('.tags'), users_url diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index 72aca7e4..6139ff10 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -3,3 +3,5 @@ # Add new mime types for use in respond_to blocks: # Mime::Type.register "text/richtext", :rtf # Mime::Type.register_alias "text/html", :iphone + +Mime::Type.register "text/xml", :rss diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 71daeb14..2d37666a 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -2,7 +2,7 @@ fr: show: Voir edit: Éditer destroy: Supprimer - region_selector: Toutes les régions + attributes: id: ID @@ -52,6 +52,8 @@ fr: - Jeudi - Vendredi - Samedi + formats: + long: "le %A %d %B %Y" layouts: application: @@ -70,3 +72,4 @@ fr: events: index: calendar_in: Ce calendrier en + all_regions: Toutes les régions