From c3bf919e3e8d20503c1ef39f87d674d1adf31553 Mon Sep 17 00:00:00 2001 From: Kai Krueger Date: Sun, 21 Mar 2010 12:12:05 +0000 Subject: [PATCH] Reuse the map_bug_comment table as a more general history table of map_bugs including close and reopen events This helps the rss feed to work on a per event basis rather than on a per bug basis --- app/controllers/map_bugs_controller.rb | 63 +++++++++++++++------ app/models/map_bug.rb | 5 +- app/models/map_bug_comment.rb | 2 + app/views/map_bugs/get_bugs.rss.builder | 2 +- app/views/map_bugs/read.rss.builder | 2 +- app/views/map_bugs/rss.rss.builder | 49 ++++++++++++++++ config/locales/en.yml | 3 +- config/routes.rb | 1 + db/migrate/054_add_map_bug_comment_event.rb | 14 +++++ 9 files changed, 120 insertions(+), 21 deletions(-) create mode 100644 app/views/map_bugs/rss.rss.builder create mode 100644 db/migrate/054_add_map_bug_comment_event.rb diff --git a/app/controllers/map_bugs_controller.rb b/app/controllers/map_bugs_controller.rb index 022653db7..8412d17f3 100644 --- a/app/controllers/map_bugs_controller.rb +++ b/app/controllers/map_bugs_controller.rb @@ -20,7 +20,7 @@ class MapBugsController < ApplicationController if bbox and bbox.count(',') == 3 bbox = bbox.split(',') - min_lon, min_lat, max_lon, max_lat = sanitise_boundaries(bbox) + @min_lon, @min_lat, @max_lon, @max_lat = sanitise_boundaries(bbox) else #Fallback to old style, this is deprecated and should not be used raise OSM::APIBadUserInput.new("No l was given") unless params['l'] @@ -28,17 +28,17 @@ class MapBugsController < ApplicationController 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 + @min_lon = params['l'].to_f + @max_lon = params['r'].to_f + @min_lat = params['b'].to_f + @max_lat = params['t'].to_f end limit = getLimit conditions = closedCondition - check_boundaries(min_lon, min_lat, max_lon, max_lat, :false) + check_boundaries(@min_lon, @min_lat, @max_lon, @max_lat, :false) - @bugs = MapBug.find_by_area_no_quadtile(min_lat, min_lon, max_lat, max_lon, :include => :map_bug_comment, :order => "last_changed DESC", :limit => limit, :conditions => conditions) + @bugs = MapBug.find_by_area_no_quadtile(@min_lat, @min_lon, @max_lat, @max_lon, :include => :map_bug_comment, :order => "last_changed DESC", :limit => limit, :conditions => conditions) respond_to do |format| format.html {render :template => 'map_bugs/get_bugs.js', :content_type => "text/javascript"} @@ -82,7 +82,7 @@ class MapBugsController < ApplicationController end @bug.save; - add_comment(@bug, comment, name); + add_comment(@bug, comment, name,"opened"); end render_ok @@ -101,7 +101,9 @@ class MapBugsController < ApplicationController raise OSM::APINotFoundError unless bug raise OSM::APIAlreadyDeletedError unless bug.visible - bug_comment = add_comment(bug, params['text'], name); + MapBug.transaction do + bug_comment = add_comment(bug, params['text'], name,"commented"); + end render_ok end @@ -110,20 +112,44 @@ class MapBugsController < ApplicationController raise OSM::APIBadUserInput.new("No id was given") unless params['id'] id = params['id'].to_i + name = "NoName"; + name = params['name'] if params['name']; bug = MapBug.find_by_id(id); raise OSM::APINotFoundError unless bug raise OSM::APIAlreadyDeletedError unless bug.visible - bug.close_bug; + MapBug.transaction do + bug.close_bug; + add_comment(bug,:nil,name,"closed") + end render_ok end def rss - request.format = :rss - get_bugs + + # Figure out the bbox + bbox = params['bbox'] + + if bbox and bbox.count(',') == 3 + bbox = bbox.split(',') + @min_lon, @min_lat, @max_lon, @max_lat = sanitise_boundaries(bbox) + else + @min_lon = -180.0 + @min_lat = -90.0 + @max_lon = 180.0 + @max_lat = 90.0 + end + limit = getLimit + conditions = closedCondition + conditions = cond_merge conditions, [OSM.sql_for_area_no_quadtile(@min_lat, @min_lon, @max_lat, @max_lon)] + + check_boundaries(@min_lon, @min_lat, @max_lon, @max_lat, :false) + + @comments = MapBugComment.find(:all, :limit => limit, :order => "date_created DESC", :joins => :map_bug, :include => :map_bug, :conditions => conditions); + render :template => 'map_bugs/rss.rss' end def gpx_bugs @@ -147,8 +173,12 @@ class MapBugsController < ApplicationController bug = MapBug.find(params['id']) raise OSM::APINotFoundError unless @bug raise OSM::APIAlreadyDeletedError unless @bug.visible - bug.status = "hidden" - bug.save + MapBug.transaction do + bug.status = "hidden"; + bug.save + add_comment(bug,:nil,name,"hidden") + end + render :text => "ok\n", :content_type => "text/html" end @@ -267,9 +297,10 @@ private return conditions end - def add_comment(bug, comment, name) + def add_comment(bug, comment, name,event) t = Time.now.getutc - bug_comment = bug.map_bug_comment.create(:date_created => t, :visible => true, :comment => comment); + bug_comment = bug.map_bug_comment.create(:date_created => t, :visible => true, :event => event); + bug_comment.comment = comment unless comment == :nil if @user bug_comment.commenter_id = @user.id bug_comment.commenter_name = @user.display_name diff --git a/app/models/map_bug.rb b/app/models/map_bug.rb index 74b6b3191..0effe38dd 100644 --- a/app/models/map_bug.rb +++ b/app/models/map_bug.rb @@ -12,7 +12,7 @@ class MapBug < ActiveRecord::Base validates_prensence_of :date_closed if :status == "closed" validates_inclusion_of :status, :in => [ "open", "closed", "hidden" ] - has_many :map_bug_comment, :foreign_key => :bug_id, :order => :date_created, :conditions => { :visible => true } + has_many :map_bug_comment, :foreign_key => :bug_id, :order => :date_created, :conditions => "visible = true and comment is not null" def self.create_bug(lat, lon) @@ -33,10 +33,11 @@ class MapBug < ActiveRecord::Base self.save; end - def flatten_comment ( separator_char ) + def flatten_comment ( separator_char, upto_timestamp = :nil) resp = "" comment_no = 1 self.map_bug_comment.each do |comment| + next if upto_timestamp != :nil and comment.date_created > upto_timestamp resp += (comment_no == 1 ? "" : separator_char) resp += comment.comment if comment.comment resp += " [ " diff --git a/app/models/map_bug_comment.rb b/app/models/map_bug_comment.rb index 945b1b2f7..166e3fb42 100644 --- a/app/models/map_bug_comment.rb +++ b/app/models/map_bug_comment.rb @@ -5,6 +5,8 @@ class MapBugComment < ActiveRecord::Base belongs_to :map_bug, :foreign_key => 'bug_id' belongs_to :user, :foreign_key => 'commenter_id' + validates_inclusion_of :event, :in => [ "opened", "closed", "reopened", "commented", "hidden" ] + validates_presence_of :id, :on => :update validates_uniqueness_of :id validates_presence_of :visible diff --git a/app/views/map_bugs/get_bugs.rss.builder b/app/views/map_bugs/get_bugs.rss.builder index 580cf93fe..a8ae98dc8 100644 --- a/app/views/map_bugs/get_bugs.rss.builder +++ b/app/views/map_bugs/get_bugs.rss.builder @@ -5,7 +5,7 @@ xml.rss("version" => "2.0", "xmlns:georss" => "http://www.georss.org/georss") do xml.channel do xml.title "OpenStreetBugs" - xml.description t('bugs.rss.description') + xml.description t('bugs.rss.description_area', :min_lat => @min_lat, :min_lon => @min_lon, :max_lat => @max_lat, :max_lon => @max_lon ) xml.link url_for(:controller => "site", :action => "index", :only_path => false) for bug in @bugs diff --git a/app/views/map_bugs/read.rss.builder b/app/views/map_bugs/read.rss.builder index f8503b1b0..501ed6bf8 100644 --- a/app/views/map_bugs/read.rss.builder +++ b/app/views/map_bugs/read.rss.builder @@ -5,7 +5,7 @@ xml.rss("version" => "2.0", "xmlns:georss" => "http://www.georss.org/georss") do xml.channel do xml.title "OpenStreetBugs" - xml.description t('bugs.rss.description') + xml.description t('bugs.rss.description_item',:id => @bug.id) xml.link url_for(:controller => "site", :action => "index", :only_path => false) xml.item do diff --git a/app/views/map_bugs/rss.rss.builder b/app/views/map_bugs/rss.rss.builder new file mode 100644 index 000000000..9fc6fd19c --- /dev/null +++ b/app/views/map_bugs/rss.rss.builder @@ -0,0 +1,49 @@ +xml.instruct! + +xml.rss("version" => "2.0", + "xmlns:geo" => "http://www.w3.org/2003/01/geo/wgs84_pos#", + "xmlns:georss" => "http://www.georss.org/georss") do + xml.channel do + xml.title "OpenStreetBugs" + xml.description t('bugs.rss.description_area', :min_lat => @min_lat, :min_lon => @min_lon, :max_lat => @max_lat, :max_lon => @max_lon ) + xml.link url_for(:controller => "site", :action => "index", :only_path => false) + + for comment in @comments + xml.item do + if comment.event == "closed" + xml.title t('bugs.rss.closed', :place => comment.map_bug.nearby_place) + else if comment.event == "commented" + xml.title t('bugs.rss.comment', :place => comment.map_bug.nearby_place) + else if comment.event == "opened" + xml.title t('bugs.rss.new', :place => comment.map_bug.nearby_place) + else + xml.title "unknown event" + end end end + + xml.link url_for(:controller => "browse", :action => "bug", :id => comment.map_bug.id, :only_path => false) + xml.guid url_for(:controller => "browse", :action => "bug", :id => comment.map_bug.id, :only_path => false) + + description_text = "" + if (comment.event == "commented") and (not comment.nil?) + description_text += " Comment:
" + description_text += htmlize(comment.comment) + description_text += "
" + end + description_text += " Full bug report:
" + description_text += comment.map_bug.flatten_comment("
", comment.date_created) + xml.description description_text + + if (comment.user.nil?) + xml.author comment.commenter_name + else + xml.author comment.user.dislay_name + end + + xml.pubDate comment.date_created.to_s(:rfc822) + xml.geo :lat, comment.map_bug.lat + xml.geo :long, comment.map_bug.lon + xml.georss :point, "#{comment.map_bug.lat} #{comment.map_bug.lon}" + end + end + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml index 979552819..abec2d991 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1637,7 +1637,8 @@ en: needs_view: "The user needs to log in before this block will be cleared." bugs: rss: - description: "A list of bugs, reported, commented on or closed in your area" + description_area: "A list of bugs, reported, commented on or closed in your area [({{min_lat}}|{{min_lon}}) -- ({{max_lat}}|{{max_lon}})]" + description_item: "An rss feed for bug {{id}}" closed: "closed bug (near {{place}})" new: "new bug (near {{place}})" comment: "new comment (near {{place}})" diff --git a/config/routes.rb b/config/routes.rb index 17eba541b..5975f48b7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -81,6 +81,7 @@ ActionController::Routing::Routes.draw do |map| map.connect "api/#{API_VERSION}/bugs", :controller => 'map_bugs', :action => 'get_bugs' map.connect "api/#{API_VERSION}/bugs/search", :controller => 'map_bugs', :action => 'search' + map.connect "api/#{API_VERSION}/bugs/rss", :controller =>'map_bugs', :action =>'rss' map.connect "api/#{API_VERSION}/bug/create", :controller => 'map_bugs', :action => 'add_bug' map.connect "api/#{API_VERSION}/bug/:id/comment", :controller => 'map_bugs', :action => 'edit_bug', :id => /\d+/ map.connect "api/#{API_VERSION}/bug/:id/close", :controller => 'map_bugs', :action => 'close_bug', :id => /\d+/ diff --git a/db/migrate/054_add_map_bug_comment_event.rb b/db/migrate/054_add_map_bug_comment_event.rb new file mode 100644 index 000000000..ff5f0b352 --- /dev/null +++ b/db/migrate/054_add_map_bug_comment_event.rb @@ -0,0 +1,14 @@ +require 'lib/migrate' + +class AddMapBugCommentEvent < ActiveRecord::Migration + def self.up + create_enumeration :map_bug_event_enum, ["opened", "closed","reopened","commented","hidden"] + add_column :map_bug_comment, :event, :map_bug_event_enum + end + + def self.down + + remove_column :map_bug_comment, :event + drop_enumeration :map_bug_event_enum + end +end -- 2.43.2