Add RSS feed for global recent changes & changes within a bbox. Solves #1737
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Sun, 7 Jun 2009 02:39:45 +0000 (02:39 +0000)
committerÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Sun, 7 Jun 2009 02:39:45 +0000 (02:39 +0000)
This has so much copy/paste code it hurts, the new list*_rss methods
are just copies of the old list* methods, but see #1927 for that.

app/controllers/changeset_controller.rb
app/views/changeset/list.rhtml
app/views/changeset/list_bbox.rhtml
app/views/changeset/list_bbox_rss.rxml [new file with mode: 0644]
app/views/changeset/list_rss.rxml [moved from app/views/changeset/rss.rxml with 75% similarity]
app/views/changeset/list_user.rhtml
config/locales/en.yml
config/routes.rb

index e8212d510a072b8b35b706876e7a2b8929c0cbfc..959957463097d53ae93de2588c52ba4bc94f1c32 100644 (file)
@@ -1,7 +1,7 @@
 # The ChangesetController is the RESTful interface to Changeset objects
 
 class ChangesetController < ApplicationController
-  layout 'site', :except => :rss
+  layout 'site', :except => [ :list_rss, :list_user_rss, :list_bbox_rss ]
   require 'xml/libxml'
 
   before_filter :authorize_web, :only => [:list, :list_user, :list_bbox]
@@ -273,6 +273,18 @@ class ChangesetController < ApplicationController
                                    :limit => 20)
     
   end
+
+  ##
+  # list edits (open changesets) in reverse chronological order
+  def list_rss
+    conditions = conditions_nonempty
+
+    @edits =  Changeset.find(:all,
+                             :order => "changesets.created_at DESC",
+                             :conditions => conditions,
+                             :limit => 20)
+    
+  end
   
   ##
   # list edits (changesets) belonging to a user
@@ -301,7 +313,7 @@ class ChangesetController < ApplicationController
 
   ##
   # list edits (changesets) belonging to a user
-  def rss
+  def list_user_rss
     user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
     
     if user
@@ -352,6 +364,35 @@ class ChangesetController < ApplicationController
                                    
     @bbox = sanitise_boundaries(bbox.split(/,/)) unless bbox==nil
   end
+
+  ##
+  # list changesets in a bbox
+  def list_bbox_rss
+    # support 'bbox' param or alternatively 'minlon', 'minlat' etc       
+    if params['bbox']
+       bbox = params['bbox']
+    elsif params['minlon'] and params['minlat'] and params['maxlon'] and params['maxlat']
+       bbox = h(params['minlon']) + ',' + h(params['minlat']) + ',' + h(params['maxlon']) + ',' + h(params['maxlat'])
+    else
+      #TODO: fix bugs in location determination for history tab (and other tabs) then uncomment this redirect
+      #redirect_to :action => 'list'
+      
+      # For now just render immediately, and skip the db
+      render
+      return
+    end
+       
+    conditions = conditions_bbox(bbox);
+    conditions = cond_merge conditions, conditions_nonempty
+    
+    @edit_pages, @edits = paginate(:changesets,
+                                   :include => [:user, :changeset_tags],
+                                   :conditions => conditions,
+                                   :order => "changesets.created_at DESC",
+                                   :per_page => 20)
+                                   
+    @bbox = sanitise_boundaries(bbox.split(/,/)) unless bbox==nil
+  end
   
 private
   #------------------------------------------------------------
index cfe4afd3faa5d0d9de765505f5a797220a3202ec..affe10cc635dfb4dc385b742d105581225fabd49 100644 (file)
@@ -5,3 +5,9 @@
 
 <p><%= t'changeset.list.for_more_changesets' %></p>
 <br>
+
+<%= rss_link_to :action => 'list_rss' %>
+
+<% content_for :head do %>
+<%= auto_discovery_link_tag :atom, :controller => 'changeset', :action => 'list_rss' %>
+<% end %>
index 87c61790cb188bbe7959a128bbab3eccb1c4ec08..354f77727e80a88d415236d04634f9d3bb6119e7 100644 (file)
@@ -39,3 +39,8 @@ end
 %>
 <br>
 
+<%= rss_link_to :action => 'list_bbox_rss', :bbox => @bbox.join(",") %>
+
+<% content_for :head do %>
+<%= auto_discovery_link_tag :atom, :controller => 'changeset', :action => 'list_bbox_rss', :bbox => @bbox.join(",") %>
+<% end %>
diff --git a/app/views/changeset/list_bbox_rss.rxml b/app/views/changeset/list_bbox_rss.rxml
new file mode 100644 (file)
index 0000000..73e705f
--- /dev/null
@@ -0,0 +1,51 @@
+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 t('changeset.list_bbox_rss.title', :bbox => @bbox.join(","))
+    xml.description t('changeset.list_bbox_rss.description', :bbox => @bbox.join(","))
+    xml.link url_for(:controller => "history", :bbox => @bbox.join(","), :only_path => false)
+    xml.image do
+      xml.url "http://www.openstreetmap.org/images/mag_map-rss2.0.png"
+      xml.title "OpenStreetMap"
+      xml.width "100"
+      xml.height "100"
+      xml.link url_for(:controller => "history", :bbox => @bbox.join(","), :only_path => false)
+    end
+
+
+    for changeset in @edits
+      xml.item do
+        xml.title t('browse.changeset.title') + " " + h(changeset.id)
+        xml.link url_for(:controller => 'browse', :action => "changeset", :id => changeset.id, :only_path => false)
+        xml.guid url_for(:controller => 'browse', :action => "changeset", :id => changeset.id, :only_path => false)
+        if changeset.user.data_public?
+          xml.author changeset.user.display_name
+        end
+        if changeset.tags['comment']
+          xml.description changeset.tags['comment']
+        end
+        xml.pubDate changeset.created_at.to_s(:rfc822)
+        if changeset.user.data_public?
+          xml.comments url_for(:controller => "message", :action => "new", :id => changeset.user.id, :only_path => false)
+        end
+
+        unless changeset.min_lat.nil?
+          minlon = changeset.min_lon/GeoRecord::SCALE.to_f
+          minlat = changeset.min_lat/GeoRecord::SCALE.to_f
+          maxlon = changeset.max_lon/GeoRecord::SCALE.to_f
+          maxlat = changeset.max_lat/GeoRecord::SCALE.to_f
+
+          # See http://georss.org/Encodings#Geometry
+          lower_corner = "#{minlat} #{minlon}"
+          upper_corner = "#{maxlat} #{maxlon}"
+
+          xml.georss :box, lower_corner + " " + upper_corner
+        end
+      end
+    end
+  end
+end
+
similarity index 75%
rename from app/views/changeset/rss.rxml
rename to app/views/changeset/list_rss.rxml
index c62de3044a3f63533bc690a25883065c67d00ffe..a22d834ea396e9c74945e13e96d43cf2e7b4b1c9 100644 (file)
@@ -4,15 +4,15 @@ 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 t('changeset.list_user_rss.title', :user => @display_name)
-    xml.description t('changeset.list_user_rss.description', :user => @display_name)
-    xml.link url_for(:controller => "user", :action => "edits", :id => @display_name, :only_path => false)
+    xml.title t('changeset.list_rss.title')
+    xml.description t('changeset.list_rss.description')
+    xml.link url_for(:controller => "browse", :action => "changesets", :only_path => false)
     xml.image do
       xml.url "http://www.openstreetmap.org/images/mag_map-rss2.0.png"
       xml.title "OpenStreetMap"
       xml.width "100"
       xml.height "100"
-      xml.link url_for(:controller => "user", :action => "edits", :id => @display_name, :only_path => false)
+      xml.link url_for(:controller => "browse", :action => "changesets", :only_path => false)
     end
 
 
@@ -28,7 +28,9 @@ xml.rss("version" => "2.0",
           xml.description changeset.tags['comment']
         end
         xml.pubDate changeset.created_at.to_s(:rfc822)
-        xml.comments url_for(:controller => "message", :action => "new", :id => changeset.user.id, :only_path => false)
+        if changeset.user.data_public?
+          xml.comments url_for(:controller => "message", :action => "new", :id => changeset.user.id, :only_path => false)
+        end
 
         unless changeset.min_lat.nil?
           minlon = changeset.min_lon/GeoRecord::SCALE.to_f
index 46f5ef39e892085dff8b9b2e0c3ed1947b50f469..6f246f9d4f5502a1e888fc857866700576b93b79 100644 (file)
@@ -11,8 +11,8 @@
 <p><%= t'changeset.list_user.for_all_changes', :recent_changes_link => link_to(t('changeset.list_user.recent_changes'), :controller => "browse", :action => "changesets") %></p>
 <br>
 
-<%= rss_link_to :action => 'rss' %>
+<%= rss_link_to :action => 'list_user_rss' %>
 
 <% content_for :head do %>
-<%= auto_discovery_link_tag :atom, :action => 'rss' %>
+<%= auto_discovery_link_tag :atom, :controller => 'changeset', :action => 'list_user_rss' %>
 <% end %>
index 306036b52fdeaefc9a1d508cb3b48264859eb209..a4b0f352cc5954df2b336f8bb7348e446dddc679 100644 (file)
@@ -233,6 +233,12 @@ en:
       recent_changes: "Recent Changes"
       recently_edited_changesets: "Recently edited changesets:"
       for_more_changesets: "For more changesets, select a user and view their edits, or see the editing 'history' of a specific area."
+    list_rss:
+      title: "Recent changes"
+      description: "Recently edited changesets"
+    list_bbox_rss:
+      title: "Recent changesets within {{bbox}}"
+      description: "Recently edited changesets within the area {{bbox}}"
     list_user:
       edits_by_username: "Edits by {{username_link}}"
       no_visible_edits_by: "No visible edits by {{name}}."
index 87d5841d4b2effc580c8363c34cc7fa00a2761b6..aead14cf94c943c1e12133017db16b2380ed12f8 100644 (file)
@@ -83,12 +83,14 @@ ActionController::Routing::Routes.draw do |map|
   map.connect '/browse/relation/:id/history', :controller => 'browse', :action => 'relation_history', :id => /\d+/
   map.connect '/browse/changeset/:id', :controller => 'browse', :action => 'changeset', :id => /\d+/
   map.connect '/browse/changesets', :controller => 'changeset', :action => 'list'
+  map.connect '/browse/changesets/rss', :controller => 'changeset', :action => 'list_rss'
   
   # web site
   map.root :controller => 'site', :action => 'index'
   map.connect '/', :controller => 'site', :action => 'index'
   map.connect '/edit', :controller => 'site', :action => 'edit'
   map.connect '/history', :controller => 'changeset', :action => 'list_bbox'
+  map.connect '/history/rss', :controller => 'changeset', :action => 'list_bbox_rss'
   map.connect '/export', :controller => 'site', :action => 'export'
   map.connect '/login', :controller => 'user', :action => 'login'
   map.connect '/logout', :controller => 'user', :action => 'logout'
@@ -143,7 +145,7 @@ ActionController::Routing::Routes.draw do |map|
   # user pages
   map.connect '/user/:display_name', :controller => 'user', :action => 'view'
   map.connect '/user/:display_name/edits', :controller => 'changeset', :action => 'list_user'
-  map.connect '/user/:display_name/edits/rss', :controller => 'changeset', :action => 'rss'
+  map.connect '/user/:display_name/edits/rss', :controller => 'changeset', :action => 'list_user_rss'
   map.connect '/user/:display_name/make_friend', :controller => 'user', :action => 'make_friend'
   map.connect '/user/:display_name/remove_friend', :controller => 'user', :action => 'remove_friend'
   map.connect '/user/:display_name/diary', :controller => 'diary_entry', :action => 'list'