diff --git a/Gemfile b/Gemfile index bf26bf44..2843b36f 100644 --- a/Gemfile +++ b/Gemfile @@ -29,10 +29,6 @@ gem 'jbuilder', '~> 2.0' # bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', '~> 0.4.0', group: :doc -# Spring speeds up development by keeping your application running in the -# background. Read more: https://github.com/rails/spring -gem 'spring', group: :development - # Use ActiveModel has_secure_password # gem 'bcrypt-ruby', '~> 3.1.2' @@ -83,6 +79,8 @@ gem 'redcarpet' # Carte openstreetmap gem 'leaflet-rails' +gem 'geocoder' + # Tiny MCE integration gem 'tinymce-rails' gem 'tinymce-rails-langs' @@ -91,6 +89,10 @@ gem 'tinymce-rails-langs' gem 'meta-tags' group :development do + # Spring speeds up development by keeping your application running in the + # background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'sqlite3' gem 'guard-livereload' gem 'guard-bundler' diff --git a/Gemfile.lock b/Gemfile.lock index 66eed619..a987fb1a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -113,9 +113,10 @@ GEM font-awesome-rails (4.1.0.0) railties (>= 3.2, < 5.0) formatador (0.2.5) - formtastic (2.3.0.rc4) + formtastic (2.3.0) actionpack (>= 3.0) fssm (0.2.10) + geocoder (1.2.4) guard (2.6.1) formatador (>= 0.2.4) listen (~> 2.7) @@ -324,6 +325,7 @@ DEPENDENCIES differ email_validator font-awesome-rails + geocoder guard-brakeman guard-bundler guard-livereload diff --git a/app/assets/javascripts/maps.js.coffee b/app/assets/javascripts/maps.js.coffee index 5544393f..fa566f0e 100644 --- a/app/assets/javascripts/maps.js.coffee +++ b/app/assets/javascripts/maps.js.coffee @@ -1,14 +1,30 @@ $(document).ready -> - if $('#map').size() > 0 + $('.maps #map').each -> map = L.map('map').setView [46.5, 4], 6 L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', - #L.tileLayer('http://{s}.tile.cloudmade.com/{key}/{styleId}/256/{z}/{x}/{y}.png', - #L.tileLayer('http://otile{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpeg', - #attribution: 'Tiles Courtesy of MapQuest — Map data © OpenStreetMap contributors, CC-BY-SA', - attribution: '© OpenStreetMap contributors', - #subdomains: '1234' + attribution: '© OpenStreetMap' + ).addTo map + $.getJSON '/maps.json', (json) -> + points = [] + L.geoJson(json, + onEachFeature: (feature, layer) -> + points += [feature.geometry.coordinates[0], feature.geometry.coordinates[1]] + # Does this feature have a property named popupContent? + if (feature.properties && feature.properties.popupContent) + layer.bindPopup(feature.properties.popupContent) + ).addTo map + console.log L.bounds(points[0], points[1]) + + + $('.events #map').each -> + coord = [$(this).attr('latitude'), $(this).attr('longitude')] + + map = L.map('map').setView [coord[0], coord[1]], 16 + + L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', + attribution: '© OpenStreetMap' ).addTo map $.getJSON '/maps.json', (json) -> @@ -18,3 +34,5 @@ $(document).ready -> if (feature.properties && feature.properties.popupContent) layer.bindPopup(feature.properties.popupContent) ).addTo map + + marker = L.marker([coord[0], coord[1]]).addTo map diff --git a/app/assets/stylesheets/maps.css.sass b/app/assets/stylesheets/maps.css.sass index 58202b90..d48e2516 100644 --- a/app/assets/stylesheets/maps.css.sass +++ b/app/assets/stylesheets/maps.css.sass @@ -2,6 +2,11 @@ @import leaflet #map - height: 60em +box-shadow(0 0 1em SteelBlue) +transition(none) + +.maps #map + height: 60em + +.events #map + height: 20em diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index a7af4455..cdfcae38 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -107,8 +107,8 @@ class EventsController < ApplicationController # through. def event_params params.require(:event) - .permit :title, :start_time, :end_time, :description, :city, :region, - :locality, :url, :contact, :submitter, :tags + .permit :title, :start_time, :end_time, :description, :address, :city, + :region, :locality, :url, :contact, :submitter, :tags end # Check that you can only edit an existing event if you know its secret diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index 72ad23dd..818a9613 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -6,9 +6,7 @@ class MapsController < ApplicationController respond_to do |format| format.html format.json do - render json: Event.moderated.future - .joins(:related_city).includes(:related_city) - .map { |event| event.to_json } + render json: Event.moderated.future.map { |event| event.to_json } end end end diff --git a/app/controllers/moderations_controller.rb b/app/controllers/moderations_controller.rb index 0e824c25..b0473b9f 100644 --- a/app/controllers/moderations_controller.rb +++ b/app/controllers/moderations_controller.rb @@ -72,8 +72,8 @@ class ModerationsController < ApplicationController # through. def moderation_params params.require(:event) - .permit :title, :start_time, :end_time, :description, :city, :region, - :locality, :url, :contact, :submitter, :tags + .permit :title, :start_time, :end_time, :description, :address, :city, + :region, :locality, :url, :contact, :submitter, :tags end # Useful to manage absolute url in mails diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 448a6e5b..cc926a3e 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -19,8 +19,7 @@ module EventsHelper geo: { region: @event.related_region, placename: @event.city, - position: "#{@event.related_city.try :latitude};" \ - + "#{@event.related_city.try :longitude}" + position: "#{@event.latitude};#{@event.longitude}" } end diff --git a/app/models/event.rb b/app/models/event.rb index 1cbd1255..f2a8f452 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -16,6 +16,9 @@ class Event < ActiveRecord::Base validates :contact, email: true validates :submitter, email: true + geocoded_by :full_address, lookup: :nominatim + after_validation :geocode, if: -> (obj) { obj.address_changed? } + scope :moderated, -> { where moderated: true } scope :unmoderated, -> { where moderated: false } scope :last_year, -> { where 'start_time >= ?', 360.days.ago } @@ -76,8 +79,12 @@ class Event < ActiveRecord::Base }, geometry: { type: 'Point', - coordinates: [related_city.longitude, related_city.latitude] + coordinates: [longitude, latitude] } } end + + def full_address + [address, city, related_region.name].compact.join(', ') + end end diff --git a/app/views/events/_form.html.haml b/app/views/events/_form.html.haml index 64dfd1d7..c990ea0f 100644 --- a/app/views/events/_form.html.haml +++ b/app/views/events/_form.html.haml @@ -28,6 +28,9 @@ = f.label :description = f.text_area :description, rows: 25, cols: 90 + .field + = f.label :address + = f.text_field :address, size: 70 .field = f.label :city = f.text_field :city, required: true, size: 70, list: :cities @@ -42,6 +45,7 @@ = f.label :locality = f.select :locality, options_for_select([[t('attributes.locality_0'), 0], [t('attributes.locality_1'), 1]], @event.locality) + .field .helper :markdown diff --git a/app/views/events/show.html.haml b/app/views/events/show.html.haml index f0a10026..e3895999 100644 --- a/app/views/events/show.html.haml +++ b/app/views/events/show.html.haml @@ -31,6 +31,7 @@ =t '.cancel' %h3=t '.dateAndPlace' + %p - if @event.same_day? Le #{l @event.start_time.to_date, format: :long}, @@ -42,9 +43,13 @@ #{l @event.end_time, format: :at}. %p - =t '.at' - %em= link_to(@event.city, "http://fr.wikipedia.org/wiki/#{url_encode @event.city}") + ',' - = link_to @event.related_region.name, "http://fr.wikipedia.org/wiki/#{url_encode @event.related_region.name}" rescue nil + = raw [@event.address.present? ? @event.address : nil, + link_to(@event.city, "http://fr.wikipedia.org/wiki/#{url_encode @event.city}"), + link_to(@event.related_region.try(:name), + "http://fr.wikipedia.org/wiki/#{url_encode @event.related_region.name}")].compact.join(', ') + +- if @event.latitude && @event.longitude + #map(latitude="#{@event.latitude}" longitude="#{@event.longitude}") %h3=t '.description' .description diff --git a/app/views/events/show.ics.erb b/app/views/events/show.ics.erb index 584831a4..4b6adcb9 100644 --- a/app/views/events/show.ics.erb +++ b/app/views/events/show.ics.erb @@ -13,6 +13,6 @@ UID:<%= event.id %>@agendadulibre.org SUMMARY:<%= event.title %> URL:<%= event_url event %> DESCRIPTION:Un événement de l'Agenda du Libre -LOCATION:<%= event.city.gsub('-', ' ') %> +LOCATION:<%= event.address %> <%= event.city %> END:VEVENT END:VCALENDAR diff --git a/app/views/events/show.json.jbuilder b/app/views/events/show.json.jbuilder index 6dfd9c05..98d51ef2 100644 --- a/app/views/events/show.json.jbuilder +++ b/app/views/events/show.json.jbuilder @@ -1,4 +1,5 @@ -json.extract! @event, :id, :title, :description, :start_time, :end_time, :city, - :region_id, :locality, :url, :contact, :contact, :submitter, - :moderated, :tags, :secret, :decision_time, :submission_time, - :moderator_mail_id, :submitter_mail_id, :created_at, :updated_at +json.extract! @event, :id, :title, :description, :start_time, :end_time, + :address, :city, :region_id, :locality, :url, :contact, :contact, + :submitter, :moderated, :tags, :secret, :decision_time, + :submission_time, :moderator_mail_id, :submitter_mail_id, + :created_at, :updated_at diff --git a/app/views/events/show.text.haml b/app/views/events/show.text.haml index 3bdb4930..503ec5f2 100644 --- a/app/views/events/show.text.haml +++ b/app/views/events/show.text.haml @@ -2,8 +2,9 @@ #{Event.human_attribute_name(:title).concat(':').ljust 12 } #{@event.title} #{Event.human_attribute_name(:start_time).concat(':').ljust 12 } #{l @event.start_time, format: :at} #{Event.human_attribute_name(:end_time).concat(':').ljust 12 } #{l @event.end_time, format: :at} -#{Event.human_attribute_name(:region).concat(':').ljust 12 } #{@event.related_region} +#{Event.human_attribute_name(:address).concat(':').ljust 12 } #{@event.address} #{Event.human_attribute_name(:city).concat(':').ljust 12 } #{@event.city} +#{Event.human_attribute_name(:region).concat(':').ljust 12 } #{@event.related_region} #{Event.human_attribute_name(:url).concat(':').ljust 12 } #{@event.url} #{Event.human_attribute_name(:contact).concat(':').ljust 12 } #{@event.contact} #{Event.human_attribute_name(:submitter).concat(':').ljust 12 } #{@event.submitter} diff --git a/db/migrate/20140823111115_add_address_latitude_and_longitude_to_event.rb b/db/migrate/20140823111115_add_address_latitude_and_longitude_to_event.rb new file mode 100644 index 00000000..197b93d2 --- /dev/null +++ b/db/migrate/20140823111115_add_address_latitude_and_longitude_to_event.rb @@ -0,0 +1,8 @@ +# Add geocoding to events +class AddAddressLatitudeAndLongitudeToEvent < ActiveRecord::Migration + def change + add_column :events, :address, :text + add_column :events, :latitude, :float + add_column :events, :longitude, :float + end +end diff --git a/db/schema.rb b/db/schema.rb index 43ab93fe..99c7d3d5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,7 +12,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140403204748) do +ActiveRecord::Schema.define(version: 20140823111115) do create_table "active_admin_comments", force: true do |t| t.string "namespace" @@ -25,9 +25,9 @@ ActiveRecord::Schema.define(version: 20140403204748) do t.datetime "updated_at" end - add_index "active_admin_comments", ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id", using: :btree - add_index "active_admin_comments", ["namespace"], name: "index_active_admin_comments_on_namespace", using: :btree - add_index "active_admin_comments", ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id", using: :btree + add_index "active_admin_comments", ["author_type", "author_id"], name: "index_active_admin_comments_on_author_type_and_author_id" + add_index "active_admin_comments", ["namespace"], name: "index_active_admin_comments_on_namespace" + add_index "active_admin_comments", ["resource_type", "resource_id"], name: "index_active_admin_comments_on_resource_type_and_resource_id" create_table "admin_users", force: true do |t| t.string "email", default: "", null: false @@ -44,8 +44,8 @@ ActiveRecord::Schema.define(version: 20140403204748) do t.datetime "updated_at" end - add_index "admin_users", ["email"], name: "index_admin_users_on_email", unique: true, using: :btree - add_index "admin_users", ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true, using: :btree + add_index "admin_users", ["email"], name: "index_admin_users_on_email", unique: true + add_index "admin_users", ["reset_password_token"], name: "index_admin_users_on_reset_password_token", unique: true create_table "cities", force: true do |t| t.string "name", default: "", null: false @@ -57,6 +57,8 @@ ActiveRecord::Schema.define(version: 20140403204748) do t.float "longitude", limit: 24 end + add_index "cities", ["name"], name: "cities_name" + create_table "events", force: true do |t| t.string "title", default: "", null: false t.text "description", null: false @@ -75,8 +77,13 @@ ActiveRecord::Schema.define(version: 20140403204748) do t.datetime "submission_time", null: false t.string "moderator_mail_id", limit: 32 t.string "submitter_mail_id", limit: 32 + t.text "address" + t.float "latitude" + t.float "longitude" end + add_index "events", ["start_time", "end_time"], name: "events_date" + create_table "lugs", force: true do |t| t.integer "region", default: 0, null: false t.integer "department", default: 0, null: false @@ -108,8 +115,8 @@ ActiveRecord::Schema.define(version: 20140403204748) do t.string "login", default: "", null: false t.string "password", default: "", null: false t.string "email", default: "", null: false - t.string "firstname", default: "", null: false t.string "lastname", default: "", null: false + t.string "firstname", default: "", null: false end end