From 3d906fe8c6303c00e399ce2dfecc3471959fbe6e Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 31 May 2009 11:32:32 +0000 Subject: [PATCH] Merge 15165:15373 from trunk. --- app/controllers/amf_controller.rb | 13 ++- app/controllers/browse_controller.rb | 4 +- app/controllers/way_controller.rb | 17 ++-- app/models/old_relation.rb | 4 +- app/models/old_way.rb | 2 +- app/models/relation.rb | 47 ++++------ app/views/browse/_node_details.rhtml | 5 + app/views/browse/_tag.rhtml | 2 +- app/views/browse/_way_details.rhtml | 7 +- app/views/changeset/_changeset.rhtml | 6 +- app/views/export/start.rjs | 2 +- app/views/layouts/site.rhtml | 2 +- config/initializers/action_mailer.rb | 2 +- config/initializers/load_configs.rb | 6 -- config/lighttpd.conf | 13 +++ config/text_outputs/en.yml | 3 - db/migrate/005_tile_tracepoints.rb | 4 +- db/migrate/006_tile_nodes.rb | 4 +- lib/map_boundary.rb | 8 +- lib/osm.rb | 16 ++++ public/images/sotm.png | Bin 0 -> 45326 bytes public/javascripts/site.js | 2 +- public/potlatch/potlatch.swf | Bin 197437 -> 198457 bytes public/stylesheets/site.css | 17 ++++ test/functional/relation_controller_test.rb | 97 ++++++++++++++------ 25 files changed, 182 insertions(+), 101 deletions(-) delete mode 100644 config/text_outputs/en.yml create mode 100644 public/images/sotm.png diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 13f742381..5bc5e2832 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -127,8 +127,10 @@ class AmfController < ApplicationController results[index]=[-5,nil] else case message - when 'putway'; r=putway(renumberednodes,*args) - renumberednodes=r[4] + when 'putway'; orn=renumberednodes.dup + r=putway(renumberednodes,*args) + renumberednodes=r[4].dup + r[4].delete_if { |k,v| orn.has_key?(k) } if r[2] != r[3] then renumberedways[r[2]] = r[3] end results[index]=AMF.putdata(index,r) when 'putrelation'; results[index]=AMF.putdata(index,putrelation(renumberednodes, renumberedways, *args)) @@ -176,6 +178,7 @@ class AmfController < ApplicationController cs = Changeset.new cs.tags = cstags cs.user_id = user.id + if !closecomment.empty? then cs.tags['comment']=closecomment end # smsm1 doesn't like the next two lines and thinks they need to be abstracted to the model more/better cs.created_at = Time.now.getutc cs.closed_at = cs.created_at + Changeset::IDLE_TIMEOUT @@ -477,7 +480,7 @@ class AmfController < ApplicationController rels.push([rel.id, rel.tags, rel.members, rel.version]) end else - RelationTag.find(:all, :limit => 11, :conditions => ["match(v) against (?)", searchterm] ).each do |t| + RelationTag.find(:all, :limit => 11, :conditions => ["v like ?", "%#{searchterm}%"] ).each do |t| if t.relation.visible then rels.push([t.relation.id, t.relation.tags, t.relation.members, t.relation.version]) end @@ -592,9 +595,7 @@ class AmfController < ApplicationController if pointlist.length < 2 then return -2,"Server error - way is only #{points.length} points long." end originalway = originalway.to_i -logger.info("received #{pointlist} for #{originalway}") pointlist.collect! {|a| a.to_i } -logger.info("converted to #{pointlist}") way=nil # this is returned, so scope it outside the transaction nodeversions = {} @@ -634,11 +635,9 @@ logger.info("converted to #{pointlist}") # -- Save revised way -logger.info("renumberednodes is #{renumberednodes.inspect}") pointlist.collect! {|a| renumberednodes[a] ? renumberednodes[a]:a } # renumber nodes -logger.info("saving with #{pointlist}") new_way = Way.new new_way.tags = attributes new_way.nds = pointlist diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index c8242a29e..259ce0dc9 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -27,7 +27,7 @@ class BrowseController < ApplicationController end def way - @way = Way.find(params[:id]) + @way = Way.find(params[:id], :include => [:way_tags, {:changeset => :user}, {:nodes => [:node_tags, {:ways => :way_tags}]}, :containing_relation_members]) @next = Way.find(:first, :order => "id ASC", :conditions => [ "visible = true AND id > :id", { :id => @way.id }] ) @prev = Way.find(:first, :order => "id DESC", :conditions => [ "visible = true AND id < :id", { :id => @way.id }] ) rescue ActiveRecord::RecordNotFound @@ -36,7 +36,7 @@ class BrowseController < ApplicationController end def way_history - @way = Way.find(params[:id]) + @way = Way.find(params[:id], :include => [:way_tags, {:old_ways => {:changeset => :user}}]) rescue ActiveRecord::RecordNotFound @type = "way" render :action => "not_found", :status => :not_found diff --git a/app/controllers/way_controller.rb b/app/controllers/way_controller.rb index cc4f1fa38..2cd7abf60 100644 --- a/app/controllers/way_controller.rb +++ b/app/controllers/way_controller.rb @@ -60,18 +60,19 @@ class WayController < ApplicationController end def full - way = Way.find(params[:id]) + way = Way.find(params[:id], :include => {:nodes => :node_tags}) if way.visible - nd_ids = way.nds + [-1] - nodes = Node.find(:all, :conditions => ["visible = ? AND id IN (#{nd_ids.join(',')})", true]) - - # Render + changeset_cache = {} + user_display_name_cache = {} + doc = OSM::API.new.get_xml_doc - nodes.each do |node| - doc.root << node.to_xml_node() + way.nodes.each do |node| + if node.visible + doc.root << node.to_xml_node(changeset_cache, user_display_name_cache) + end end - doc.root << way.to_xml_node() + doc.root << way.to_xml_node(nil, changeset_cache, user_display_name_cache) render :text => doc.to_s, :content_type => "text/xml" else diff --git a/app/models/old_relation.rb b/app/models/old_relation.rb index b2fdf926e..ca43b5912 100644 --- a/app/models/old_relation.rb +++ b/app/models/old_relation.rb @@ -25,7 +25,7 @@ class OldRelation < ActiveRecord::Base save! clear_aggregation_cache clear_association_cache - @attributes.update(OldRelation.find(:first, :conditions => ['id = ? AND timestamp = ?', self.id, self.timestamp]).instance_variable_get('@attributes')) + @attributes.update(OldRelation.find(:first, :conditions => ['id = ? AND timestamp = ?', self.id, self.timestamp], :order => "version desc").instance_variable_get('@attributes')) # ok, you can touch from here on @@ -81,7 +81,7 @@ class OldRelation < ActiveRecord::Base # has_many :relation_tags, :class_name => 'OldRelationTag', :foreign_key => 'id' def old_members - OldRelationMember.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version]) + OldRelationMember.find(:all, :conditions => ['id = ? AND version = ?', self.id, self.version], :order => "sequence_id") end def old_tags diff --git a/app/models/old_way.rb b/app/models/old_way.rb index 425478a5b..dc5715693 100644 --- a/app/models/old_way.rb +++ b/app/models/old_way.rb @@ -30,7 +30,7 @@ class OldWay < ActiveRecord::Base save! clear_aggregation_cache clear_association_cache - @attributes.update(OldWay.find(:first, :conditions => ['id = ? AND timestamp = ?', self.id, self.timestamp]).instance_variable_get('@attributes')) + @attributes.update(OldWay.find(:first, :conditions => ['id = ? AND timestamp = ?', self.id, self.timestamp], :order => "version desc").instance_variable_get('@attributes')) # ok, you can touch from here on diff --git a/app/models/relation.rb b/app/models/relation.rb index 32dab6254..fda5e5677 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -208,7 +208,7 @@ class Relation < ActiveRecord::Base def add_member(type,id,role) @members = Array.new unless @members - @members += [[type,id,role]] + @members += [[type,id.to_i,role]] end def add_tag_keyval(k, v) @@ -385,21 +385,18 @@ class Relation < ActiveRecord::Base # changed members in an array, as the bounding box updates for # elements are per-element, not blanked on/off like for tags. changed_members = Array.new - members = Hash.new - self.members.each do |m| - # should be: h[[m.id, m.type]] = m.role, but someone prefers arrays - members[[m[1], m[0]]] = m[2] - end - relation_members.each do |old_member| - key = [old_member.member_id.to_s, old_member.member_type] - if members.has_key? key - members.delete key - else + members = self.members.clone + self.relation_members.each do |old_member| + key = [old_member.member_type, old_member.member_id, old_member.member_role] + i = members.index key + if i.nil? changed_members << key + else + members.delete_at i end end # any remaining members must be new additions - changed_members += members.keys + changed_members += members # update the members. first delete all the old members, as the new # members may be in a different order and i don't feel like implementing @@ -433,21 +430,17 @@ class Relation < ActiveRecord::Base changed_members.collect { |id,type| type == "relation" }. inject(false) { |b,s| b or s } - if tags_changed or any_relations - # add all non-relation bounding boxes to the changeset - # FIXME: check for tag changes along with element deletions and - # make sure that the deleted element's bounding box is hit. - self.members.each do |type, id, role| - if type != "Relation" - update_changeset_element(type, id) - end - end - else - # add only changed members to the changeset - changed_members.each do |id, type| - if type != "Relation" - update_changeset_element(type, id) - end + update_members = if tags_changed or any_relations + # add all non-relation bounding boxes to the changeset + # FIXME: check for tag changes along with element deletions and + # make sure that the deleted element's bounding box is hit. + self.members + else + changed_members + end + update_members.each do |type, id, role| + if type != "Relation" + update_changeset_element(type, id) end end diff --git a/app/views/browse/_node_details.rhtml b/app/views/browse/_node_details.rhtml index 55b9fe288..80680fcb1 100644 --- a/app/views/browse/_node_details.rhtml +++ b/app/views/browse/_node_details.rhtml @@ -2,6 +2,11 @@ <%= render :partial => "common_details", :object => node_details %> + + Coordinates: +
<%= h(node_details.lat) %>, <%= h(node_details.lon) %>
+ + <% unless node_details.ways.empty? and node_details.containing_relation_members.empty? %> <%= t 'browse.node_details.part_of' %> diff --git a/app/views/browse/_tag.rhtml b/app/views/browse/_tag.rhtml index 8a57387bf..a9a122e6d 100644 --- a/app/views/browse/_tag.rhtml +++ b/app/views/browse/_tag.rhtml @@ -1,3 +1,3 @@ - <%= h(tag[0]) %> = <%= h(tag[1]) %> + <%= h(tag[0]) %> = <%= sanitize(auto_link(tag[1])) %> diff --git a/app/views/browse/_way_details.rhtml b/app/views/browse/_way_details.rhtml index 3c90395b7..4dc7b2b2e 100644 --- a/app/views/browse/_way_details.rhtml +++ b/app/views/browse/_way_details.rhtml @@ -7,7 +7,12 @@ <% way_details.way_nodes.each do |wn| %> - + <% end %>
<%= link_to h(printable_name(wn.node)), :action => "node", :id => wn.node_id.to_s %>
+ <%= link_to h(printable_name(wn.node)), :action => "node", :id => wn.node_id.to_s %> + <% if wn.node.ways.size > 1 then %> + (also part of <%= wn.node.ways.reject { |w| w.id == way_details.id }.map { |w| link_to(h(printable_name(w)), :action => "way", :id => w.id.to_s) }.join(", ") %>) + <% end %> +
diff --git a/app/views/changeset/_changeset.rhtml b/app/views/changeset/_changeset.rhtml index ae7a495c2..75b94b4ef 100644 --- a/app/views/changeset/_changeset.rhtml +++ b/app/views/changeset/_changeset.rhtml @@ -5,14 +5,14 @@ #<%= changeset.id %> - + <% if changeset.closed_at > DateTime.now %> <%= t'changeset.changeset.still_editing' %> <% else %><%= changeset.closed_at.strftime("%d %b %Y %H:%M") %><% end %> <%if showusername %> - + <% if changeset.user.data_public? %> <%= link_to h(changeset.user.display_name), :controller => "changeset", :action => "list_user", :display_name => changeset.user.display_name %> <% else %> @@ -29,7 +29,7 @@ <% end %> - + <% if changeset.min_lat.nil? %> <%= t'changeset.changeset.no_edits' %> <% else diff --git a/app/views/export/start.rjs b/app/views/export/start.rjs index 47cf9ce6b..83db38002 100644 --- a/app/views/export/start.rjs +++ b/app/views/export/start.rjs @@ -327,7 +327,7 @@ page << <
- <%= t 'layouts.sotm' %> + <%= link_to image_tag("sotm.png", :alt => "State of the Map", :border => "0"), "http://www.stateofthemap.org/" %>
<%= yield :optionals %> diff --git a/config/initializers/action_mailer.rb b/config/initializers/action_mailer.rb index 98b599ce9..db6c1b9b7 100644 --- a/config/initializers/action_mailer.rb +++ b/config/initializers/action_mailer.rb @@ -1,4 +1,4 @@ -# Configure ActionMailer +# Configure ActionMailer SMTP settings ActionMailer::Base.smtp_settings = { :address => 'localhost', :port => 25, diff --git a/config/initializers/load_configs.rb b/config/initializers/load_configs.rb index 3f610cbec..a189ac860 100644 --- a/config/initializers/load_configs.rb +++ b/config/initializers/load_configs.rb @@ -2,9 +2,3 @@ # Load application config APP_CONFIG = YAML.load(File.read(RAILS_ROOT + "/config/application.yml"))[RAILS_ENV] -# This will let you more easily use helpers based on url_for in your mailers. -ActionMailer::Base.default_url_options[:host] = APP_CONFIG['host'] - -# Load texts in a particular language -TEXT = YAML.load(File.read(RAILS_ROOT + "/config/text_outputs/en.yml")) - diff --git a/config/lighttpd.conf b/config/lighttpd.conf index 22051eb44..80b941fa6 100644 --- a/config/lighttpd.conf +++ b/config/lighttpd.conf @@ -110,6 +110,19 @@ url.redirect = ( "^/wiki/(.*)$" => "http://wiki.openstreetmap.org/$1" ) +# +# Redirect everything except www.openstreetmap.org and +# api.openstreetmap.org to www.openstreetmap.org +# +$HTTP["host"] =~ "^api\." { + $HTTP["host"] != "api.openstreetmap.org" { + url.redirect = ( "^(.*)$" => "http://api.openstreetmap.org$1" ) + } +} +else $HTTP["host"] != "www.openstreetmap.org" { + url.redirect = ( "^(.*)$" => "http://www.openstreetmap.org$1" ) +} + # # Run anything with a .pl iextension as a CGI script # diff --git a/config/text_outputs/en.yml b/config/text_outputs/en.yml deleted file mode 100644 index cb3ab99e4..000000000 --- a/config/text_outputs/en.yml +++ /dev/null @@ -1,3 +0,0 @@ -boundary_parameter_required: "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat" - - diff --git a/db/migrate/005_tile_tracepoints.rb b/db/migrate/005_tile_tracepoints.rb index 9f17461b1..a4ac5f51a 100644 --- a/db/migrate/005_tile_tracepoints.rb +++ b/db/migrate/005_tile_tracepoints.rb @@ -6,9 +6,9 @@ class TileTracepoints < ActiveRecord::Migration add_index "gps_points", ["tile"], :name => "points_tile_idx" remove_index "gps_points", :name => "points_idx" - begin + if ENV["USE_DB_FUNCTIONS"] Tracepoint.update_all("latitude = latitude * 10, longitude = longitude * 10, tile = tile_for_point(latitude * 10, longitude * 10)") - rescue ActiveRecord::StatementInvalid => ex + else Tracepoint.find(:all).each do |tp| tp.latitude = tp.latitude * 10 tp.longitude = tp.longitude * 10 diff --git a/db/migrate/006_tile_nodes.rb b/db/migrate/006_tile_nodes.rb index 51b2502d7..4f40a5f39 100644 --- a/db/migrate/006_tile_nodes.rb +++ b/db/migrate/006_tile_nodes.rb @@ -2,7 +2,7 @@ require 'lib/migrate' class TileNodes < ActiveRecord::Migration def self.upgrade_table(from_table, to_table, model) - begin + if ENV["USE_DB_FUNCTIONS"] execute <<-END_SQL INSERT INTO #{to_table} (id, latitude, longitude, user_id, visible, tags, timestamp, tile) SELECT id, ROUND(latitude * 10000000), ROUND(longitude * 10000000), @@ -11,7 +11,7 @@ class TileNodes < ActiveRecord::Migration CAST(ROUND(longitude * 10000000) AS INTEGER)) FROM #{from_table} END_SQL - rescue ActiveRecord::StatementInvalid => ex + else execute <<-END_SQL INSERT INTO #{to_table} (id, latitude, longitude, user_id, visible, tags, timestamp, tile) SELECT id, ROUND(latitude * 10000000), ROUND(longitude * 10000000), diff --git a/lib/map_boundary.rb b/lib/map_boundary.rb index 153d65780..6ac7e9f3d 100644 --- a/lib/map_boundary.rb +++ b/lib/map_boundary.rb @@ -12,20 +12,20 @@ module MapBoundary def check_boundaries(min_lon, min_lat, max_lon, max_lat) # check the bbox is sane unless min_lon <= max_lon - raise("The minimum longitude must be less than the maximum longitude, but it wasn't") + raise OSM::APIBadBoundingBox.new("The minimum longitude must be less than the maximum longitude, but it wasn't") end unless min_lat <= max_lat - raise("The minimum latitude must be less than the maximum latitude, but it wasn't") + raise OSM::APIBadBoundingBox.new("The minimum latitude must be less than the maximum latitude, but it wasn't") end unless min_lon >= -180 && min_lat >= -90 && max_lon <= 180 && max_lat <= 90 # Due to sanitize_boundaries, it is highly unlikely we'll actually get here - raise("The latitudes must be between -90 and 90, and longitudes between -180 and 180") + raise OSM::APIBadBoundingBox.new("The latitudes must be between -90 and 90, and longitudes between -180 and 180") end # check the bbox isn't too large requested_area = (max_lat-min_lat)*(max_lon-min_lon) if requested_area > APP_CONFIG['max_request_area'] - raise("The maximum bbox size is " + APP_CONFIG['max_request_area'].to_s + + raise OSM::APIBadBoundingBox.new("The maximum bbox size is " + APP_CONFIG['max_request_area'].to_s + ", and your request was too large. Either request a smaller area, or use planet.osm") end end diff --git a/lib/osm.rb b/lib/osm.rb index 4c99de2f1..5be2da56a 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -218,6 +218,22 @@ module OSM end end + ## + # raised when bounding box is invalid + class APIBadBoundingBox < APIError + def initialize(message) + @message = message + end + + def status + :bad_request + end + + def to_s + @message + end + end + ## # raised when an API call is made using a method not supported on that URI class APIBadMethodError < APIError diff --git a/public/images/sotm.png b/public/images/sotm.png new file mode 100644 index 0000000000000000000000000000000000000000..3282d125cf2e1818d27166512eb0dd9e520453c2 GIT binary patch literal 45326 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%0A*Yic=<|I;wu79!bu;I({ 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 11) { + if (zoom >= 13) { var args = new Object(); args.lat = lat; args.lon = lon; diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index ad60cd4851a414e187d4aac8138b8a4e8c4075e4..19cac85c3c62995b72e113405c69ed932cded22b 100755 GIT binary patch delta 16910 zcmbt*2Ygh;_Wz!{_ipx*P8vxzJ*1OD4uimM8xtQDqRsN!v8xncQ?C%-+S->|MTIK*_kC z)o0{TcWKZIt`|E}p7mo*x`3+_5KpT)&@P9~6~h|L$uv+-Ex;8}ut2Y2SZHuk zAm)LMn!}y#qoO6acU(=4gd0>Rn0wk8K#3RQy_(|*N26hFefP0VP46uW()#F|Dn5Br zOBhaK&Lq7`;7Id`zq4z>rAF3@r(&$4Pd)UZRs3nRHR02^FacVs*Cb(PGhb_5PRR{` zAE%_3uk~3@4o4$7w0=O4h3OpT-K0CDY?E}w_uY!`ZhB2k(rV4I{emDmNymRFk9kxp z*a99$aAT+=2&EE^7vO$vh!~eCu_x))(ofTay364;JmFAONE=F6= z|0TwH@bmD9G7vCW4Bc}jQEv9KBEKkZRiS%AYQ$Uu zAR(f+ZYBo6%=;oAV>h6yS~p|-y82ijVR(<`;R2>cH{%0f7Ju0(Um({#p}vX#MdiNV zz4US~`A|e}YsHsE8O1Vz9RnM?~x~IlRZGS6rPdW{-I_@dK->G{>S!4FbTA%H?Evi-@(io%!>n@c>QfJND zo9F~D*5EJOSdZ=AF$Jy!w|3j^bKSi}47C`%O z-M09lwLUsV2#8h=gQN|bBRAFVyOn5^_1QO-?#uLkA^@aWZ*GmX+V3x-%dIQ+r_*Tb z*8Ms7{oMZ8iqX0|M$%XSLxyjpdV*yz7_H3vaunc2c)LCIDCyo~bXknGoZohcyFwbS zZAzd=+E6#0le;3HLKG zb7Qc>oTvwxqB>4-FkVqQ!5VX*easXcv^X4V01w9smw|Dz_3(jL;6Y=)ONUw-zDuL2 z)`su;p(X75*id*8q@rS4547Z=xAgn`_-VSigFIzI4M6BHuN2Ay;nS^~zb~=={(b96 zZ_iA-=W1)$_uZ1Nv1`*5b->Zjr^;DY&JQIt+q(RRjEw0meHplCgB1{?f?n5Jjx5ol zti1<9Hf{Z3ypyiAQVte|jS~31Q_rwQA55X^teXx_0^0ottMR+-Pu)q{R>pr}TNeLR zh>_cVDy5Mx{v1czY+cS80kPNwA;$b*UT2m4l1g)|vA=YZ#_X}4|0Tn18_8U2&o7zr zL-kr|Sf{Ycz`W;4QwEOVR@|WiYwDp`>#{?kVK?|#lwETVm3pzz?9ozF4cpgVGMFzi*uU)8OvV;mIi+; znBi7^ZK%VcIc83r>zFy~8pmi2{%tPPgIWW(Py4}TjS7L+8Wr7#e zBUY)~bkQW)R}Hu87$BES)G^av_1e(7MzJKS{ySRq|4sI*?ofw$rydmaA~}Mtg!_bu z@j!<0zTtPN;aCm@1bRTj3f;_va027uYcwQDbl$DQ4m@qe0{Rjdz&Z^^SE^_tNWv8N z=tE^nu)^AM)YEXc?&&)a5iQaooefnn7DF8}WpPV~Ua5O}h@mUQ3a*Gl&C+W_Bqnr= zx$o66yVv34Wl_zPZ_sOleSzvBJH|h(;<(b(Bf5&?k6NdX=eK=U zH=k6@E!CvotR-Y!VGiVzW;ex``J~nFM5V;=1)>{4Rs0KS|W(jiKFPzG(ISy~tgqgj;Fd^m}rtEy(K$p%jCjK;NaQKw2rO zv5Bg(KK;E0f=)Qq4uAWe>O#+2i%z9TK?BdTIuxU57ll1&3OEs2`fAOuuNvOmdZ5Tq zY=5p%^nvZbc8nIodbWh`t>Dq!w{Oa!Fyw3;k5a17_I3FnB zH|m2_Q9F1!qF5aqQckC_s-y zu7%>I=2Z-mZ(dRr?m$FiPp8vnYtiYnl$U`HY6Wc$^A9Rd5;@NS3YskH5WaQ%^Av0U z>DYQ$!C*1V<2p84O0%dv<)dBl)56YFRVb@@#PjyT{hZb3%=IwB*Usd^2>*4a1b^et zmW~%%6frqM#biGn`nCFL(67~Bf533LzxurUF6)J}9?ZJqY_hQHddZP>@@y8(vpnZk zP_6aMxxQ4l>EyW%L<6nd^J&IFeMoSKHGXfLHTC?6m{;r-Qo6wkWk^lduJdv9s`b

)T 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 delta 16092 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

uiT$a>?&LB% z^0qZJPw(t93%G18w)ll&o^tNC7WeVrtcBYZ@^5RgNiK1*w-7Mti)b6)ZeMTVmy{7&2%K)5%Et8nhRlghO;hdhS}gbo+b2X^hGx?MZ9Cz9!D zp8T7ZT8)>@VohRSA)gA!7ut}6{Yw3+zkv|zws#0N4E|Y$XB!Z#$}IM)?*DFNwHOML z0vn-J-b`!?JifQdc&mY&~JL!ga6$~W1 zS8bQ2tg(rc{jw;*B=UK=W~fs{oiAfJ>XG;pl9P@nv^+30`Gl75#7w;Sq!!JaPiW;q zF2gi%f5_g~;rN*+wI#ZSlYM^dB#wx_IH~=f5oDNzHP-LngYXzb)65`Mv19WrWQRkz zQ(7~e#f6;KHtVKgx|bbrcH)btwK>-}x{?AsHQ3)L7Na(#!D<&RRoF;T|4JJGqa7sG zBfywRKty?CpuE{}Mk|Z9`|lFR6ux8{%-LtP=X`wh=j?OZPxW6no!9Qv!wfT&J73oN zbB7CBbW%9B!Qktv)uL}4VR<)S&}L`bYsTL)%QY*8CN}u;%cJo{tt2YkFmF@#HWhV} z+zp3w)kSTh7H;sgDlN^xitzK`KTz+5bJI&&8k(X@S}#2uhZo%HtmfgTFKJ8t?BW5M z5^n!x4?A(&g^w)L_(*BmXMS zYnaJ~ndCoU6*6sRn28NKJcgOjpd;Qe;~I1{HO$xs9WjO(UEhIcA1>%uK5`FE!Mj<- iftjL2mud`@kM5h>m+)yE?s6UttqAnr9UKzmZ1sO_$t2_e diff --git a/public/stylesheets/site.css b/public/stylesheets/site.css index 6ef2446de..54a70a611 100644 --- a/public/stylesheets/site.css +++ b/public/stylesheets/site.css @@ -83,6 +83,11 @@ body { font-size: 14px; } +#sotm { + width: 170px; + padding: 0px; +} + .notice { width: 150px; margin: 10px; @@ -194,6 +199,18 @@ body { width: 100%; } +#changeset_list .date { + white-space: nowrap; +} + +#changeset_list .user { + white-space: nowrap; +} + +#changeset_list .area { + white-space: nowrap; +} + #changeset_list.th { font-weight: bold; } diff --git a/test/functional/relation_controller_test.rb b/test/functional/relation_controller_test.rb index bb562b24b..10762f48d 100644 --- a/test/functional/relation_controller_test.rb +++ b/test/functional/relation_controller_test.rb @@ -529,23 +529,36 @@ class RelationControllerTest < ActionController::TestCase # add a member to a relation and check the bounding box is only that # element. def test_add_member_bounding_box - check_changeset_modify([4,4,4,4]) do |changeset_id| - # add node 4 (4,4) to an existing relation - relation_xml = current_relations(:visible_relation).to_xml - relation_element = relation_xml.find("//osm/relation").first - new_member = XML::Node.new("member") - new_member['ref'] = current_nodes(:used_node_2).id.to_s - new_member['type'] = "node" - new_member['role'] = "some_role" - relation_element << new_member + relation_id = current_relations(:visible_relation).id + + [current_nodes(:used_node_1), + current_nodes(:used_node_2), + current_ways(:used_way), + current_ways(:way_with_versions) + ].each_with_index do |element, version| + bbox = element.bbox.collect { |x| x / SCALE } + check_changeset_modify(bbox) do |changeset_id| + relation_xml = Relation.find(relation_id).to_xml + relation_element = relation_xml.find("//osm/relation").first + new_member = XML::Node.new("member") + new_member['ref'] = element.id.to_s + new_member['type'] = element.class.to_s.downcase + new_member['role'] = "some_role" + relation_element << new_member - # update changeset ID to point to new changeset - update_changeset(relation_xml, changeset_id) + # update changeset ID to point to new changeset + update_changeset(relation_xml, changeset_id) - # upload the change - content relation_xml - put :update, :id => current_relations(:visible_relation).id - assert_response :success, "can't update relation for add node/bbox test" + # upload the change + content relation_xml + put :update, :id => current_relations(:visible_relation).id + assert_response :success, "can't update relation for add #{element.class}/bbox test: #{@response.body}" + + # get it back and check the ordering + get :read, :id => relation_id + assert_response :success, "can't read back the relation: #{@response.body}" + check_ordering(relation_xml, @response.body) + end end end @@ -617,14 +630,18 @@ OSM get :read, :id => relation_id assert_response :success, "can't read back the relation: #{@response.body}" check_ordering(doc, @response.body) + + # check the ordering in the history tables: + with_controller(OldRelationController.new) do + get :version, :id => relation_id, :version => 2 + assert_response :success, "can't read back version 2 of the relation #{relation_id}" + check_ordering(doc, @response.body) + end end ## # check that relations can contain duplicate members def test_relation_member_duplicates - ## First try with the private user - basic_authorization(users(:normal_user).email, "test"); - doc_str = < @@ -637,35 +654,59 @@ OSM OSM doc = XML::Parser.string(doc_str).parse + ## First try with the private user + basic_authorization(users(:normal_user).email, "test"); + content doc put :create assert_response :forbidden - ## Now try with the public user basic_authorization(users(:public_user).email, "test"); + content doc + put :create + assert_response :success, "can't create a relation: #{@response.body}" + relation_id = @response.body.to_i + + # get it back and check the ordering + get :read, :id => relation_id + assert_response :success, "can't read back the relation: #{relation_id}" + check_ordering(doc, @response.body) + end + + ## + # test that the ordering of elements in the history is the same as in current. + def test_history_ordering doc_str = < - - + + OSM doc = XML::Parser.string(doc_str).parse + basic_authorization(users(:public_user).email, "test"); content doc put :create assert_response :success, "can't create a relation: #{@response.body}" relation_id = @response.body.to_i - # get it back and check the ordering + # check the ordering in the current tables: get :read, :id => relation_id assert_response :success, "can't read back the relation: #{@response.body}" check_ordering(doc, @response.body) + + # check the ordering in the history tables: + with_controller(OldRelationController.new) do + get :version, :id => relation_id, :version => 1 + assert_response :success, "can't read back version 1 of the relation: #{@response.body}" + check_ordering(doc, @response.body) + end end # ============================================================ @@ -726,12 +767,12 @@ OSM with_controller(ChangesetController.new) do get :read, :id => changeset_id assert_response :success, "can't re-read changeset for modify test" - assert_select "osm>changeset", 1 - assert_select "osm>changeset[id=#{changeset_id}]", 1 - assert_select "osm>changeset[min_lon=#{bbox[0].to_f}]", 1 - assert_select "osm>changeset[min_lat=#{bbox[1].to_f}]", 1 - assert_select "osm>changeset[max_lon=#{bbox[2].to_f}]", 1 - assert_select "osm>changeset[max_lat=#{bbox[3].to_f}]", 1 + assert_select "osm>changeset", 1, "Changeset element doesn't exist in #{@response.body}" + assert_select "osm>changeset[id=#{changeset_id}]", 1, "Changeset id=#{changeset_id} doesn't exist in #{@response.body}" + assert_select "osm>changeset[min_lon=#{bbox[0].to_f}]", 1, "Changeset min_lon wrong in #{@response.body}" + assert_select "osm>changeset[min_lat=#{bbox[1].to_f}]", 1, "Changeset min_lat wrong in #{@response.body}" + assert_select "osm>changeset[max_lon=#{bbox[2].to_f}]", 1, "Changeset max_lon wrong in #{@response.body}" + assert_select "osm>changeset[max_lat=#{bbox[3].to_f}]", 1, "Changeset max_lat wrong in #{@response.body}" end end -- 2.43.2