Merge 7922:8377 from trunk.
authorTom Hughes <tom@compton.nu>
Sun, 22 Jun 2008 12:23:43 +0000 (12:23 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 22 Jun 2008 12:23:43 +0000 (12:23 +0000)
23 files changed:
app/controllers/amf_controller.rb
app/controllers/application.rb
app/controllers/diary_entry_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/models/node.rb
app/models/old_relation_member.rb
app/models/old_relation_tag.rb
app/models/relation.rb
app/models/relation_member.rb
app/models/trace.rb
app/models/way.rb
app/views/layouts/site.rhtml
app/views/site/edit.rhtml
app/views/site/index.rhtml
app/views/site/offline.rhtml [new file with mode: 0644]
app/views/trace/view.rhtml
app/views/user/confirm.rhtml
config/environment.rb
config/initializers/composite_primary_keys.rb
config/routes.rb
public/javascripts/map.js
public/potlatch/potlatch.swf

index 4eda7b00aa27456b246ee1b4d16ce39f4abba712..359b45326b99137b89bfaaba944959b15a45d503 100644 (file)
@@ -376,10 +376,11 @@ class AmfController < ApplicationController
 
     RAILS_DEFAULT_LOGGER.info("  Message: putway, id=#{originalway}")
 
-    # -- Check for null IDs or short ways
+    # -- Check for null IDs, short ways or lats=90
 
     points.each do |a|
       if a[2]==0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end
+      if coord2lat(a[1],masterscale,basey)==90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end
     end
     
     if points.length<2 then return -2,"Server error - way is only #{points.length} points long." end
index acb2f916291ab02aced0486022b4688c2b109677..7570fd82a072d2af2d2e70dd0e33cd2d83df391d 100644 (file)
@@ -2,6 +2,10 @@
 # Likewise, all the methods added will be available for all controllers.
 class ApplicationController < ActionController::Base
 
+  if OSM_STATUS == :database_offline
+    session :off
+  end
+
   def authorize_web
     if session[:user]
       @user = User.find(session[:user])
@@ -39,8 +43,14 @@ class ApplicationController < ActionController::Base
     end 
   end 
 
+  def check_database_availability
+    if OSM_STATUS == :database_offline
+      redirect_to :controller => 'site', :action => 'offline'
+    end
+  end
+
   def check_read_availability
-    if API_STATUS == :offline
+    if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline
       response.headers['Error'] = "Database offline for maintenance"
       render :nothing => true, :status => :service_unavailable
       return false
@@ -48,7 +58,7 @@ class ApplicationController < ActionController::Base
   end
 
   def check_write_availability
-    if API_STATUS == :offline or API_STATUS == :readonly
+    if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline or OSM_STATUS == :api_readonly
       response.headers['Error'] = "Database offline for maintenance"
       render :nothing => true, :status => :service_unavailable
       return false
index a3b37b931beabf3c7cd9fcbca435d62c41c37914..5159f73624b2bcf53f2c3344310da59ee5f147b3 100644 (file)
@@ -3,6 +3,7 @@ class DiaryEntryController < ApplicationController
 
   before_filter :authorize_web
   before_filter :require_user, :only => [:new]
+  before_filter :check_database_availability
 
   def new
     @title = 'new diary entry'
index cf35d00462c0c7461be2928737345048033dffdb..0467e66bac49028fff5a56f21c4d84b55fe1e8ba 100644 (file)
@@ -1,7 +1,10 @@
 class TraceController < ApplicationController
+  layout 'site'
+
   before_filter :authorize_web  
   before_filter :authorize, :only => [:api_details, :api_data, :api_create]
-  layout 'site'
+  before_filter :check_database_availability, :except => [:api_details, :api_data, :api_create]
+  before_filter :check_read_availability, :only => [:api_details, :api_data, :api_create]
  
   # Counts and selects pages of GPX traces for various criteria (by user, tags, public etc.).
   #  target_user - if set, specifies the user to fetch traces for.  if not set will fetch all traces
index e998e83c69d86e843f4763f2e42e41bfd295034c..5d26708fe0df2846058c3c869528192334346f48 100644 (file)
@@ -4,6 +4,8 @@ class UserController < ApplicationController
   before_filter :authorize, :only => [:api_details, :api_gpx_files]
   before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend, :remove_friend, :upload_image]
   before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image]
+  before_filter :check_database_availability, :except => [:api_details, :api_gpx_files]
+  before_filter :check_read_availability, :only => [:api_details, :api_gpx_files]
 
   filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
 
@@ -143,17 +145,19 @@ class UserController < ApplicationController
   end
 
   def confirm
-    token = UserToken.find_by_token(params[:confirm_string])
-    if token and !token.user.active?
-      @user = token.user
-      @user.active = true
-      @user.save!
-      token.destroy
-      flash[:notice] = 'Confirmed your account, thanks for signing up!'
-      session[:user] = @user.id
-      redirect_to :action => 'account', :display_name => @user.display_name
-    else
-      flash[:notice] = 'Something went wrong confirming that user.'
+    if params[:confirm_action]
+      token = UserToken.find_by_token(params[:confirm_string])
+      if token and !token.user.active?
+        @user = token.user
+        @user.active = true
+        @user.save!
+        token.destroy
+        flash[:notice] = 'Confirmed your account, thanks for signing up!'
+        session[:user] = @user.id
+        redirect_to :action => 'account', :display_name => @user.display_name
+      else
+        flash[:notice] = 'Something went wrong confirming that user.'
+      end
     end
   end
 
index cc646b768c1aeb82fd6ce62c0f26724ed5f6a55b..4393f252679e12cf7a6c606ecd1331ad938228a2 100644 (file)
@@ -10,11 +10,16 @@ class Node < GeoRecord
   validates_numericality_of :latitude, :longitude
   validate :validate_position
 
-  has_many :ways, :through => :way_nodes
+  belongs_to :user
+
   has_many :old_nodes, :foreign_key => :id
+
   has_many :way_nodes
-  belongs_to :user
+  has_many :ways, :through => :way_nodes
+
+  has_many :containing_relation_members, :as => :member
+  has_many :containing_relations, :through => :containing_relation_members
+
   # Sanity check the latitude and longitude and add an error if it's broken
   def validate_position
     errors.add_to_base("Node is not in the world") unless in_world?
index 9e2cce4c2ec8b76367edece77931f282e011936f..d8b68585428da54515eb579d9a31ca4f04f04576 100644 (file)
@@ -1,6 +1,3 @@
 class OldRelationMember < ActiveRecord::Base
-  belongs_to :user
-
   set_table_name 'relation_members'
-
 end
index 6ad4b452e4ed50790a340cd4c60a5eb35eb87d10..7ce6f694e633bb2a2110711229b1be8b6886e275 100644 (file)
@@ -1,6 +1,3 @@
 class OldRelationTag < ActiveRecord::Base
-  belongs_to :user
-
   set_table_name 'relation_tags'
-
 end
index cedfaf656250e25b01f148b8c8175f13153e035b..cd2d67cdde0b969020d88530fdc82748f6f19451 100644 (file)
@@ -1,14 +1,17 @@
 class Relation < ActiveRecord::Base
   require 'xml/libxml'
   
+  set_table_name 'current_relations'
+
   belongs_to :user
 
+  has_many :old_relations, :foreign_key => 'id', :order => 'version'
+
   has_many :relation_members, :foreign_key => 'id'
   has_many :relation_tags, :foreign_key => 'id'
 
-  has_many :old_relations, :foreign_key => 'id', :order => 'version'
-
-  set_table_name 'current_relations'
+  has_many :containing_relation_members, :as => :member
+  has_many :containing_relations, :through => :containing_relation_members
 
   def self.from_xml(xml, create=false)
     begin
index 79102853e9c218a362a52eedd5acf30b52233e19..9ff4f46f3b8b0b6ae4fb1b02ba49ccab25a71b66 100644 (file)
@@ -1,30 +1,23 @@
 class RelationMember < ActiveRecord::Base
   set_table_name 'current_relation_members'
-
-  # problem with RelationMember is that it may link to any one 
-  # object (a node, a way, another relation), and belongs_to is
-  # not flexible enough for that. So we do this, which is ugly,
-  # but fortunately rails won't actually run the SQL behind that
-  # unless someone really accesses .node, .way, or
-  # .relation - which is what we do below based on member_type.
-  # (and no: the :condition on belongs_to doesn't work here as
-  # it is a condition on the *referenced* object not the 
-  # *referencing* object!)
   
-  belongs_to :node, :foreign_key => "member_id"
-  belongs_to :way, :foreign_key => "member_id"
-  belongs_to :relation, :foreign_key => "member_id"
+  belongs_to :member, :polymorphic => true, :foreign_type => :member_class
+  belongs_to :relation, :foreign_key => :id
+
+  def after_find
+    self[:member_class] = self.member_type.capitalize
+  end
 
-  # so we define this "member" function that returns whatever it
-  # is.
-  def member()
-    return (member_type == "node") ? node : (member_type == "way") ? way : relation
+  def after_initialize
+    self[:member_class] = self.member_type.capitalize
   end
 
-  # NOTE - relations are SUBJECTS of memberships. The fact that nodes, 
-  # ways, and relations can be the OBJECT of a membership,
-  # i.e. a node/way/relation can be referenced throgh a
-  # RelationMember object, is NOT modelled in rails, i.e. these links
-  # have to be resolved manually, on demand. 
+  def before_save
+    self.member_type = self[:member_class].downcase
+  end
+
+  def member_type=(type)
+    self[:member_type] = type
+    self[:member_class] = type.capitalize
+  end
 end
index 0e9e7bcc1598df1ffd54f447f18afa75d6fbae1a..d28c2c6f42f98a1bf6bff40b769c9707b0e71515 100644 (file)
@@ -183,7 +183,7 @@ class Trace < ActiveRecord::Base
     # If there are any existing points for this trace then delete
     # them - we check for existing points first to avoid locking
     # the table in the common case where there aren't any.
-    if Tracepoint.exists?(['gpx_id = ?', self.id])
+    if Tracepoint.find(:first, :conditions => ['gpx_id = ?', self.id])
       Tracepoint.delete_all(['gpx_id = ?', self.id])
     end
 
index f1dc76eb4c6b65053214e1e80f6665f70ad10052..8ae6b40846944a41dca2ac03c542824fbb68fea1 100644 (file)
@@ -1,15 +1,19 @@
 class Way < ActiveRecord::Base
   require 'xml/libxml'
 
+  set_table_name 'current_ways'
+
   belongs_to :user
 
-  has_many :nodes, :through => :way_nodes, :order => 'sequence_id'
+  has_many :old_ways, :foreign_key => 'id', :order => 'version'
+
   has_many :way_nodes, :foreign_key => 'id', :order => 'sequence_id'
-  has_many :way_tags, :foreign_key => 'id'
+  has_many :nodes, :through => :way_nodes, :order => 'sequence_id'
 
-  has_many :old_ways, :foreign_key => 'id', :order => 'version'
+  has_many :way_tags, :foreign_key => 'id'
 
-  set_table_name 'current_ways'
+  has_many :containing_relation_members, :class_name => "RelationMember", :as => :member
+  has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation
 
   def self.from_xml(xml, create=false)
     begin
index 33e02449d7dcab70a16a1347e26ec9ada740c3ea..52e7b6b242847869e54c8feb7f2f1ab9530c74bb 100644 (file)
@@ -52,7 +52,7 @@
         <li><%= link_to 'Export', {:controller => 'site', :action => 'export'}, {:id => 'exportanchor', :title => 'export map data', :class => exportclass} %></li>
         <% end %>
         <li><%= link_to 'GPS Traces', {:controller => 'trace', :action => 'list'}, {:id => 'traceanchor', :title => 'manage traces', :class => traceclass} %></li>
-        <li><%= link_to 'User Diaries', {:controller => 'diary_entry', :action => 'list'}, {:id => 'diaryanchor', :title => 'view user diaries', :class => diaryclass} %></li>
+        <li><%= link_to 'User Diaries', {:controller => 'diary_entry', :action => 'list', :display_name => nil}, {:id => 'diaryanchor', :title => 'view user diaries', :class => diaryclass} %></li>
       </ul>
     </div>
 
       </div>
       <% end %>
 
-      <% if API_STATUS == :offline %>
+      <% if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline %>
       <div id="alert">
         The OpenStreetMap database is currently offline while
         essential database maintenance work is carried out.
       </div>
-      <% elsif API_STATUS == :readonly %>
+      <% elsif OSM_STATUS == :api_readonly %>
       <div id="alert">
         The OpenStreetMap database is currently in read-only mode while
         essential database maintenance work is carried out.
index afd33e4ae1cbb1371dfec634cfae140374d6ea57..a3896bc4824ea99966f5850592fb100c3ed1ac76 100644 (file)
@@ -1,8 +1,8 @@
-<% if API_STATUS == :offline %>
+<% if OSM_STATUS == :database_offline or OSM_STATUS == :api_offline %>
 <p>The OpenStreetMap database is currently offline while
    essential database maintenance work is carried out.
 </p>
-<% elsif API_STATUS == :readonly %>
+<% elsif OSM_STATUS == :api_readonly %>
 <p>The OpenStreetMap database is currently in read-only mode while
    essential database maintenance work is carried out.
 </p>
index 656db99c80008a3b8757d061bf25d12f52dad4d1..482ed85b89880744e8d556d5082c41a0f627889c 100644 (file)
@@ -58,8 +58,8 @@ by the OpenStreetMap project and its contributors.
 <% lat = h(params['mlat']) %>
 <% zoom =  h(params['zoom'] || '12') %>
 <% layers = h(params['layers']) %>
-<% elsif cookies.key?("location") %>
-<% lon,lat,zoom,layers = cookies["location"].split(",") %>
+<% elsif cookies.key?("_osm_location") %>
+<% lon,lat,zoom,layers = cookies["_osm_location"].split("|") %>
 <% elsif @user and !@user.home_lon.nil? and !@user.home_lat.nil? %> 
 <% lon =  @user.home_lon %>
 <% lat =  @user.home_lat %>
@@ -76,8 +76,8 @@ by the OpenStreetMap project and its contributors.
 <% lon =  '-0.1' %>
 <% lat =  '51.5' %>
 <% zoom =  h(params['zoom'] || '5') %>
-<% layers = h(params['layers']) %>
 <% end %>
+<% layers = h(params['layers']) %>
 <% end %>
 
 <%= javascript_include_tag '/openlayers/OpenLayers.js' %>
@@ -113,7 +113,7 @@ by the OpenStreetMap project and its contributors.
     setMapCenter(centre, zoom);
     <% end %>
 
-    <% if layers %>
+    <% if !layers.nil? and !layers.empty? %>
     setMapLayers("<%= layers %>");
     <% end %>
 
@@ -160,7 +160,7 @@ by the OpenStreetMap project and its contributors.
 
     updatelinks(lonlat.lon, lonlat.lat, zoom, layers);
 
-    document.cookie = "location=" + lonlat.lon + "," + lonlat.lat + "," + zoom + "," + layers;
+    document.cookie = "_osm_location=" + lonlat.lon + "|" + lonlat.lat + "|" + zoom + "|" + layers;
   }
 
   function resizeContent() {
diff --git a/app/views/site/offline.rhtml b/app/views/site/offline.rhtml
new file mode 100644 (file)
index 0000000..d97a6ca
--- /dev/null
@@ -0,0 +1,3 @@
+<p>The OpenStreetMap database is currently offline while
+   essential database maintenance work is carried out.
+</p>
index d4bdb9745522f9666834f5908c91906a3576bedb..f547f05db4ddeafd85fc1ad4e90888d5026317f9 100644 (file)
@@ -1,6 +1,10 @@
 <h2><%= h(@title) %></h2>
 
-<img src="<%= url_for :controller => 'trace', :action => 'picture', :id => @trace.id, :display_name => @trace.user.display_name %>">
+  <% if @trace.inserted %>
+    <img src="<%= url_for :controller => 'trace', :action => 'picture', :id => @trace.id, :display_name => @trace.user.display_name %>">
+  <% else %>
+    <span style="color:red">PENDING</span>
+  <% end %>
 
 <table border="0">
   <tr>
index 8b137891791fe96927ad78e64b0aad7bded08bdc..5577b7068889c6c2694644ed477bbea77cf21fd7 100644 (file)
@@ -1 +1,10 @@
+<h1>Confirm a user account</h1>
+
+<p>Press the confirm button below to activate your account.</p>
+
+<form method="post">
+<input type="hidden" name="confirm_string" value="<%= params[:confirm_string] %>">
+<input type="submit" name="confirm_action" value="Confrm">
+</form>
+
 
index 02d99f20c6095cca73e5138c70fb7a77e5aab37d..495f94d80a63f08b22f639bdcbaaace8c6d946e0 100644 (file)
@@ -5,8 +5,7 @@
 ENV['RAILS_ENV'] ||= 'production'
 
 # Specifies gem version of Rails to use when vendor/rails is not present
-# DO NOT BUMP THIS TO 2.0.2 AS THE LIVE SERVERS CAN'T RUN THAT
-RAILS_GEM_VERSION = '2.0.1' unless defined? RAILS_GEM_VERSION
+RAILS_GEM_VERSION = '2.0.2' unless defined? RAILS_GEM_VERSION
 
 # Set the server URL
 SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org'
@@ -14,9 +13,14 @@ SERVER_URL = ENV['OSM_SERVER_URL'] || 'www.openstreetmap.org'
 # Application constants needed for routes.rb - must go before Initializer call
 API_VERSION = ENV['OSM_API_VERSION'] || '0.5'
 
-# Set to :readonly to put the API in read-only mode or :offline to
-# take it completely offline
-API_STATUS = :online
+# Set application status - possible settings are:
+#
+#   :online - online and operating normally
+#   :api_readonly - site online but API in read-only mode
+#   :api_offline - site online but API offline
+#   :database_offline - database offline with site in emergency mode
+#
+OSM_STATUS = :online
 
 # Bootstrap the Rails environment, frameworks, and default configuration
 require File.join(File.dirname(__FILE__), 'boot')
@@ -29,7 +33,9 @@ Rails::Initializer.run do |config|
 
   # Skip frameworks you're not going to use (only works if using vendor/rails).
   # To use Rails without a database, you must remove the Active Record framework
-  # config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
+  if OSM_STATUS == :database_offline
+    config.frameworks -= [ :active_record ]
+  end
 
   # Only load the plugins named here, in the order given. By default, all plugins 
   # in vendor/plugins are loaded in alphabetical order.
index 8fc93577889287d385596897c027c9bd608c8168..430bcfac277d8d8e5113c74cf1c121821b43ef1e 100644 (file)
@@ -1 +1,3 @@
+require 'rubygems'
+gem 'composite_primary_keys', '= 0.9.93'
 require 'composite_primary_keys'
index c23509372c8a2c4c9ba761e433332729df242f43..52636b3859ec2e4b1dcbd71f61a923a717ffbb0e 100644 (file)
@@ -74,6 +74,7 @@ ActionController::Routing::Routes.draw do |map|
   map.connect '/export', :controller => 'site', :action => 'export'
   map.connect '/login', :controller => 'user', :action => 'login'
   map.connect '/logout', :controller => 'user', :action => 'logout'
+  map.connect '/offline', :controller => 'site', :action => 'offline'
   map.connect '/user/new', :controller => 'user', :action => 'new'
   map.connect '/user/save', :controller => 'user', :action => 'save'
   map.connect '/user/confirm', :controller => 'user', :action => 'confirm'
index 2bdba6229b589b8d52ae3a96fd8e21e5d8b361d9..291fd18fa29ff645520a1038b0dfa92e338d9bc6 100644 (file)
@@ -157,7 +157,11 @@ function setMapLayers(layerConfig) {
    for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
       var c = layerConfig.charAt(l++);
 
-      layers[i].setVisibility(c == "T");
+      if (c == "T") {
+         layers[i].setVisibility(true);
+      } else if(c == "F") {
+         layers[i].setVisibility(false);
+      }
    }
 }
 
index 8c3d0c9153c364a0c7efcc83c9eed2144e898d5a..721840fe4ec4d006d7b62d134313f7e90fffee54 100755 (executable)
Binary files a/public/potlatch/potlatch.swf and b/public/potlatch/potlatch.swf differ