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
This commit is contained in:
parent
4aec8dc3a5
commit
c3bf919e3e
9 changed files with 120 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -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 += " [ "
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
49
app/views/map_bugs/rss.rss.builder
Normal file
49
app/views/map_bugs/rss.rss.builder
Normal file
|
@ -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 += "<B> Comment: </B><br>"
|
||||
description_text += htmlize(comment.comment)
|
||||
description_text += "<br>"
|
||||
end
|
||||
description_text += "<B> Full bug report: </B><br>"
|
||||
description_text += comment.map_bug.flatten_comment("<br>", 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
|
|
@ -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}})"
|
||||
|
|
|
@ -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+/
|
||||
|
|
14
db/migrate/054_add_map_bug_comment_event.rb
Normal file
14
db/migrate/054_add_map_bug_comment_event.rb
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue