From: Kai Krueger Date: Sun, 28 Feb 2010 09:30:40 +0000 (+0000) Subject: An initial (incomplete) "proof of concept" integration of an OpenStreetBugs interface... X-Git-Tag: live~5052^2~237 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/42822a8b89443d5fa6ec815d82684698d2d80b07?ds=sidebyside An initial (incomplete) "proof of concept" integration of an OpenStreetBugs interface into the rails port This is a (start of a) reimplementation of the api at http://github.com/emka/openstreetbugs/tree/master/api/0.1/ into rails The client side code is taken from http://wiki.openstreetmap.org/wiki/OpenStreetBugs/New_Client This is ment as a mockup to perhaps use as a basis to further discuss how best to integrate a map bug reporting system It currently uses (more or less) the openstreetbugs api specification. But this api feels rather inconsistent with the rest of the rails_port api, so depending on discussions might still need some significant changes. --- diff --git a/app/controllers/map_bugs_controller.rb b/app/controllers/map_bugs_controller.rb new file mode 100644 index 000000000..d3a62f553 --- /dev/null +++ b/app/controllers/map_bugs_controller.rb @@ -0,0 +1,102 @@ +class MapBugsController < ApplicationController + + before_filter :check_api_readable + before_filter :check_api_writable, :only => [:add_bug, :close_bug, :edit_bug] + after_filter :compress_output + around_filter :api_call_handle_error, :api_call_timeout + + # Help methods for checking boundary sanity and area size + include MapBoundary + + def get_bugs + + raise OSM::APIBadUserInput.new("No l was given") unless params['l'] + raise OSM::APIBadUserInput.new("No r was given") unless params['r'] + raise OSM::APIBadUserInput.new("No b was given") unless params['b'] + raise OSM::APIBadUserInput.new("No t was given") unless params['t'] + + min_lon = params['l'].to_f + max_lon = params['r'].to_f + min_lat = params['b'].to_f + max_lat = params['t'].to_f + + # check boundary is sane and area within defined + # see /config/application.yml + begin + check_boundaries(min_lon, min_lat, max_lon, max_lat) + rescue Exception => err + report_error(err.message) + return + end + + bugs = MapBug.find_by_area(min_lat, min_lon, max_lat, max_lon, :order => "last_changed DESC", :limit => 100, :conditions => "status != 'hidden'") + + resp = "" + + bugs.each do |bug| + resp += "putAJAXMarker(" + bug.id.to_s + ", " + bug.lon.to_s + ", " + bug.lat.to_s + " , '" + bug.text + "'," + (bug.status=="open"?"0":"1") + ");\n" + end + + render :text => resp, :content_type => "text/javascript" + end + + def add_bug + raise OSM::APIBadUserInput.new("No lat was given") unless params['lat'] + raise OSM::APIBadUserInput.new("No lon was given") unless params['lon'] + raise OSM::APIBadUserInput.new("No text was given") unless params['text'] + + lon = params['lon'].to_f + lat = params['lat'].to_f + comment = params['text'] + + bug = MapBug.create_bug(lat, lon, comment) + + render_ok + end + + def edit_bug + raise OSM::APIBadUserInput.new("No id was given") unless params['id'] + raise OSM::APIBadUserInput.new("No text was given") unless params['text'] + + id = params['id'].to_i + + bug = MapBug.find_by_id(id); + bug.text += "
" + params['text'] + bug.last_changed = Time.now.getutc; + bug.save; + + render_ok + end + + def close_bug + raise OSM::APIBadUserInput.new("No id was given") unless params['id'] + + id = params['id'].to_i + + bug = MapBug.find_by_id(id); + bug.close_bug; + + render_ok + end + + def render_ok + output_js = :false + output_js = :true if params['format'] == "js" + + if output_js == :true + render :text => "osbResponse();", :content_type => "text/javascript" + else + render :text => "ok\n", :content_type => "text/html" + end + + end + + def rss + ##TODO: needs to be implemented + end + + def gpx_bugs + ##TODO: needs to be implemented + end + +end diff --git a/app/models/map_bug.rb b/app/models/map_bug.rb new file mode 100644 index 000000000..61c9f145f --- /dev/null +++ b/app/models/map_bug.rb @@ -0,0 +1,32 @@ +class MapBug < ActiveRecord::Base + include GeoRecord + + set_table_name 'map_bugs' + + validates_presence_of :id, :on => :update + validates_uniqueness_of :id + validates_numericality_of :latitude, :only_integer => true + validates_numericality_of :longitude, :only_integer => true + validates_presence_of :date_created + validates_presence_of :last_changed + validates_inclusion_of :status, :in => [ "open", "closed", "hidden" ] + + + def self.create_bug(lat, lon, comment) + bug = MapBug.new(:lat => lat, :lon => lon); + raise OSM::APIBadUserInput.new("The node is outside this world") unless bug.in_world? + bug.text = comment + bug.date_created = Time.now.getutc + bug.last_changed = Time.now.getutc + bug.status = "open"; + bug.save; + return bug; + end + + def close_bug + self.status = "closed" + self.last_changed = Time.now.getutc + self.save; + end + +end diff --git a/app/views/site/index.html.erb b/app/views/site/index.html.erb index 636e6929c..9f99b0bc8 100644 --- a/app/views/site/index.html.erb +++ b/app/views/site/index.html.erb @@ -19,7 +19,8 @@
@@ -110,8 +111,11 @@ else end %> -<%= javascript_include_tag '/openlayers/OpenLayers.js' %> + + + <%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> +<%= javascript_include_tag 'openstreetbugs.js' %> <%= javascript_include_tag 'map.js' %>