Reuse the map_bug_comment table as a more general history table of map_bugs including...
authorKai Krueger <kakrueger@gmail.com>
Sun, 21 Mar 2010 12:12:05 +0000 (12:12 +0000)
committerKai Krueger <kakrueger@gmail.com>
Sun, 21 Mar 2010 12:12:05 +0000 (12:12 +0000)
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
app/models/map_bug.rb
app/models/map_bug_comment.rb
app/views/map_bugs/get_bugs.rss.builder
app/views/map_bugs/read.rss.builder
app/views/map_bugs/rss.rss.builder [new file with mode: 0644]
config/locales/en.yml
config/routes.rb
db/migrate/054_add_map_bug_comment_event.rb [new file with mode: 0644]

index 022653db7c1d67e37747576499271d02983cf962..8412d17f37496f0192cd49645de7d685b66cb24c 100644 (file)
@@ -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
index 74b6b31919732ace19ac31286a5ea3f90002a411..0effe38dd99c46ea710247d169a660eac5a67887 100644 (file)
@@ -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 += " [ " 
index 945b1b2f755f9d21192e81a9418c2c40dea59951..166e3fb42927f2308a025751c4dbb62a61681abf 100644 (file)
@@ -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
index 580cf93fe48af4cced80992dea9476896143543e..a8ae98dc8d2bb62f2ebbf7546b310ccf2a40dcdd 100644 (file)
@@ -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
index f8503b1b01fbfefd4269e122758a95a233e70040..501ed6bf8ef549e7e2f82317c3bb37d8dada18bc 100644 (file)
@@ -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 (file)
index 0000000..9fc6fd1
--- /dev/null
@@ -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
index 9795528192bfb1e7c1a7b714855321c71cdd72bd..abec2d991f1af9fce042d66e9070fc39ee628cf2 100644 (file)
@@ -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}})"
index 17eba541b6a282649b2c318378896bd539d5e279..5975f48b7ed69bafab2a190cdda7efb6819810c7 100644 (file)
@@ -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 (file)
index 0000000..ff5f0b3
--- /dev/null
@@ -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