Add RSS feed for global recent changes & changes within a bbox. Solves #1737
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.
This commit is contained in:
parent
bbc700b9ac
commit
0d16fd57d4
8 changed files with 123 additions and 10 deletions
|
@ -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
|
||||
#------------------------------------------------------------
|
||||
|
|
|
@ -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 %>
|
||||
|
|
|
@ -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 %>
|
||||
|
|
51
app/views/changeset/list_bbox_rss.rxml
Normal file
51
app/views/changeset/list_bbox_rss.rxml
Normal file
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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 %>
|
||||
|
|
|
@ -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}}."
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue