X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/898beb7b7f693cc21b329dab9a22268e3df77446..afe8dd51ece21325eea8a108515b9426764de5b2:/app/controllers/changeset_controller.rb?ds=sidebyside diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb index 8f882e80e..ebad59aa0 100644 --- a/app/controllers/changeset_controller.rb +++ b/app/controllers/changeset_controller.rb @@ -238,6 +238,7 @@ class ChangesetController < ApplicationController conditions = cond_merge conditions, conditions_user(params['user']) conditions = cond_merge conditions, conditions_time(params['time']) conditions = cond_merge conditions, conditions_open(params['open']) + conditions = cond_merge conditions, conditions_closed(params['closed']) # create the results document results = OSM::API.new.get_xml_doc @@ -291,21 +292,71 @@ class ChangesetController < ApplicationController render ex.render_opts end + + ## - # list edits belonging to a user + # list edits (open changesets) in reverse chronological order def list + conditions = conditions_nonempty + + + # @changesets = Changeset.find(:all, :order => "closed_at DESC", :conditions => ['closed_at < ?', DateTime.now], :limit=> 20) + + + #@edit_pages, @edits = paginate(:changesets, + # :include => [:user, :changeset_tags], + # :conditions => conditions, + # :order => "changesets.created_at DESC", + # :per_page => 20) + # + + @edits = Changeset.find(:all, + :order => "changesets.created_at DESC", + :conditions => conditions, + :limit => 20) + + end + + ## + # list edits (changesets) belonging to a user + def list_user + #find user by display name user = User.find(:first, :conditions => [ "visible = ? and display_name = ?", true, params[:display_name]]) + + conditions = conditions_user(user.id); + conditions = cond_merge conditions, conditions_nonempty @edit_pages, @edits = paginate(:changesets, :include => [:user, :changeset_tags], - :conditions => ["changesets.user_id = ? AND min_lat IS NOT NULL", user.id], + :conditions => conditions, :order => "changesets.created_at DESC", :per_page => 20) - @action = 'list' @display_name = user.display_name # FIXME needs rescues in here end - + + ## + # list changesets in a bbox + def list_bbox + # 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 = params['minlon'] + ',' + params['minlat'] + ',' + params['maxlon'] + ',' + params['maxlat'] + 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 #------------------------------------------------------------ # utility functions below. @@ -317,7 +368,7 @@ private if a and b a_str = a.shift b_str = b.shift - return [ a_str + " and " + b_str ] + a + b + return [ a_str + " AND " + b_str ] + a + b elsif a return a else b @@ -366,7 +417,7 @@ private end ## - # restrict changes to those during a particular time period + # restrict changes to those closed during a particular time period def conditions_time(time) unless time.nil? # if there is a range, i.e: comma separated, then the first is @@ -376,11 +427,11 @@ private times = time.split(/,/) raise OSM::APIBadUserInput.new("bad time range") if times.size != 2 - from, to = times.collect { |t| Time.parse(t) } + from, to = times.collect { |t| DateTime.parse(t) } return ['closed_at >= ? and created_at <= ?', from, to] else # if there is no comma, assume its a lower limit on time - return ['closed_at >= ?', Time.parse(time)] + return ['closed_at >= ?', DateTime.parse(time)] end else return nil @@ -394,9 +445,28 @@ private end ## - # restrict changes to those which are open + # return changesets which are open (haven't been closed yet) + # we do this by seeing if the 'closed at' time is in the future. Also if we've + # hit the maximum number of changes then it counts as no longer open. + # if parameter 'open' is nill then open and closed changsets are returned def conditions_open(open) - return open.nil? ? nil : ['closed_at >= ?', Time.now] + return open.nil? ? nil : ['closed_at >= ? and num_changes <= ?', + DateTime.now, Changeset::MAX_ELEMENTS] + end + + ## + # query changesets which are closed + # ('closed at' time has passed or changes limit is hit) + def conditions_closed(closed) + return closed.nil? ? nil : ['closed_at < ? and num_changes > ?', + DateTime.now, Changeset::MAX_ELEMENTS] end + ## + # eliminate empty changesets (where the bbox has not been set) + # this should be applied to all changeset list displays + def conditions_nonempty() + return ['min_lat IS NOT NULL'] + end + end