Implement /user/$user/edits/rss, partially solves #1737
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Sun, 7 Jun 2009 01:32:19 +0000 (01:32 +0000)
committerÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Sun, 7 Jun 2009 01:32:19 +0000 (01:32 +0000)
app/controllers/changeset_controller.rb
app/views/changeset/list_user.rhtml
app/views/changeset/rss.rxml [new file with mode: 0644]
config/locales/en.yml
config/routes.rb

index ca42751..e8212d5 100644 (file)
@@ -1,7 +1,7 @@
 # The ChangesetController is the RESTful interface to Changeset objects
 
 class ChangesetController < ApplicationController
-  layout 'site'
+  layout 'site', :except => :rss
   require 'xml/libxml'
 
   before_filter :authorize_web, :only => [:list, :list_user, :list_bbox]
@@ -298,6 +298,31 @@ class ChangesetController < ApplicationController
       render :template => 'user/no_such_user', :status => :not_found
     end
   end
+
+  ##
+  # list edits (changesets) belonging to a user
+  def rss
+    user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
+    
+    if user
+      @display_name = user.display_name
+      if not user.data_public? and @user != user
+        @edits = nil
+        render
+      else
+        conditions = cond_merge conditions, ['user_id = ?', user.id]
+        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)
+      end
+    else
+      @not_found_user = params[:display_name]
+      render :template => 'user/no_such_user', :status => :not_found
+    end
+  end
   
   ##
   # list changesets in a bbox
index 7240e60..46f5ef3 100644 (file)
@@ -11,3 +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' %>
+
+<% content_for :head do %>
+<%= auto_discovery_link_tag :atom, :action => 'rss' %>
+<% end %>
diff --git a/app/views/changeset/rss.rxml b/app/views/changeset/rss.rxml
new file mode 100644 (file)
index 0000000..c62de30
--- /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 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.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)
+    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)
+        xml.comments url_for(:controller => "message", :action => "new", :id => changeset.user.id, :only_path => false)
+
+        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
+
index dbcaa65..306036b 100644 (file)
@@ -238,6 +238,9 @@ en:
       no_visible_edits_by: "No visible edits by {{name}}."
       for_all_changes: "For changes by all users see {{recent_changes_link}}"
       recent_changes: "Recent Changes"
+    list_user_rss:
+      title: "Edits by {{user}}"
+      description: "Recent changesets by {{user}}"
   diary_entry:
     new:
       title: New Diary Entry
index 4b11610..87d5841 100644 (file)
@@ -143,6 +143,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/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'