Initial work on support for multiple editors
authorMatt Amos <zerebubuth@gmail.com>
Sun, 14 Nov 2010 12:40:44 +0000 (12:40 +0000)
committerTom Hughes <tom@compton.nu>
Mon, 29 Nov 2010 12:20:21 +0000 (12:20 +0000)
13 files changed:
app/controllers/site_controller.rb
app/controllers/user_controller.rb
app/models/user.rb
app/views/site/_josm.html.erb [new file with mode: 0644]
app/views/site/_potlatch.html.erb [new file with mode: 0644]
app/views/site/edit.html.erb
app/views/user/account.html.erb
config/example.application.yml
config/locales/en.yml
db/migrate/20101114011429_add_editor_preference_to_user.rb [new file with mode: 0644]
lib/editors.rb [new file with mode: 0644]
test/functional/site_controller_test.rb
test/unit/user_test.rb

index 1478c57..0a1a553 100644 (file)
@@ -30,4 +30,38 @@ class SiteController < ApplicationController
   def key
     expires_in 7.days, :public => true
   end
+
+  def edit
+    session[:token] = @user.tokens.create.token unless session[:token] and UserToken.find_by_token(session[:token])
+    
+    @preferred_editor = @user.preferred_editor || DEFAULT_EDITOR
+
+    # Decide on a lat lon to initialise potlatch with. Various ways of doing this
+    if params['lon'] and params['lat']
+      @lon = params['lon'].to_f
+      @lat = params['lat'].to_f
+      @zoom = params['zoom'].to_i
+      
+    elsif params['mlon'] and params['mlat'] 
+      @lon = params['mlon'].to_f
+      @lat = params['mlat'].to_f
+      @zoom = params['zoom'].to_i
+      
+    elsif params['gpx']
+      #use gpx id to locate (dealt with below)
+      
+    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
+      
+    else
+      #catch all.  Do nothing.  lat=nil, lon=nil
+      #Currently this results in potlatch starting up at 0,0 (Atlantic ocean).
+    end
+
+    @zoom = '14' if @zoom.nil?
+  end
 end
index 19e8aeb..d73d38a 100644 (file)
@@ -109,6 +109,8 @@ class UserController < ApplicationController
       @user.home_lat = params[:user][:home_lat]
       @user.home_lon = params[:user][:home_lon]
 
+      @user.preferred_editor = params[:user][:preferred_editor]
+
       if @user.save
         set_locale
 
index 1a50f70..ecf93b6 100644 (file)
@@ -33,6 +33,7 @@ class User < ActiveRecord::Base
   validates_numericality_of :home_lat, :allow_nil => true
   validates_numericality_of :home_lon, :allow_nil => true
   validates_numericality_of :home_zoom, :only_integer => true, :allow_nil => true
+  validates_inclusion_of :preferred_editor, :in => Editors::ALL_EDITORS, :allow_nil => true
 
   before_save :encrypt_password
 
diff --git a/app/views/site/_josm.html.erb b/app/views/site/_josm.html.erb
new file mode 100644 (file)
index 0000000..16f33bd
--- /dev/null
@@ -0,0 +1,6 @@
+<div id="map">
+  <% query = "lat=#{@lat || 0}&lon=#{@lon || 0}&zoom=#{@zoom}" %>
+  <iframe src="http://127.0.0.1:8111/load_and_zoom?<%= query %>" width="100%" height="100%">
+    <p><%= t 'site.edit.no_iframe_support' %></p>
+  </iframe>
+</div>
diff --git a/app/views/site/_potlatch.html.erb b/app/views/site/_potlatch.html.erb
new file mode 100644 (file)
index 0000000..c255cef
--- /dev/null
@@ -0,0 +1,40 @@
+<div id="map">
+  <%= t 'site.edit.flash_player_required' %>
+</div>
+
+<%= javascript_include_tag 'swfobject.js' %>
+<script type="text/javascript" defer="defer">
+  var brokenContentSize = $("content").offsetWidth == 0;
+  var fo = new SWFObject("/potlatch/potlatch.swf?d="+Math.round(Math.random()*1000), "potlatch", "100%", "100%", "6", "#FFFFFF");
+  // 700,600 for fixed size, 100%,100% for resizable
+  var changesaved=true;
+  var winie=false; if (document.all && window.print) { winie=true; }
+  
+  window.onbeforeunload=function() {
+    if (!changesaved) {
+      return '<%= escape_javascript(t('site.edit.potlatch_unsaved_changes')) %>';
+    }
+  }
+
+  function markChanged(a) { changesaved=a; }
+
+  function doSWF(lat,lon,sc) {
+    if (sc < 11) sc = 11;
+    fo.addVariable('winie',winie);
+    fo.addVariable('scale',sc);
+    fo.addVariable('token','<%= session[:token] %>');
+    if (lat) { fo.addVariable('lat',lat); }
+    if (lon) { fo.addVariable('long',lon); }
+    <% if params['gpx']     %>fo.addVariable('gpx'     ,'<%= h(params['gpx']    ) %>');<% end %>
+    <% if params['way']     %>fo.addVariable('way'     ,'<%= h(params['way']    ) %>');<% end %>
+    <% if params['node']    %>fo.addVariable('node'    ,'<%= h(params['node']   ) %>');<% end %>
+    <% if params['tileurl'] %>fo.addVariable('custombg','<%= h(params['tileurl']) %>');<% end %>
+    fo.write("map");
+  }
+
+  doSWF(<%= @lat || 'null' %>,<%= @lon || 'null' %>,<%= @zoom %>);
+
+  function setPosition(lat, lon, zoom) {
+    doSWF(lat, lon, zoom || 15);
+  }
+</script>
index e5bffd1..b891844 100644 (file)
 <%= render :partial => 'sidebar', :locals => { :onopen => "resizeMap();", :onclose => "resizeMap();" } %>
 <%= render :partial => 'search' %>
 
-<%
-session[:token] = @user.tokens.create.token unless session[:token] and UserToken.find_by_token(session[:token])
+<%= render :partial => @preferred_editor %>
 
-# Decide on a lat lon to initialise potlatch with. Various ways of doing this
-if params['lon'] and params['lat']
-       lon =  h(params['lon']) 
-       lat =  h(params['lat']) 
-       zoom =  h(params['zoom'])
-
-elsif params['mlon'] and params['mlat'] 
-       lon =  h(params['mlon']) 
-       lat =  h(params['mlat']) 
-       zoom =  h(params['zoom'])
-       
-elsif params['gpx']
-       #use gpx id to locate (dealt with below)
-       
-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
-
-else
-       #catch all.  Do nothing.  lat=nil, lon=nil
-       #Currently this results in potlatch starting up at 0,0 (Atlantic ocean).
-end
-
-zoom='14' if zoom.nil?
-%>
-
-<div id="map">
-       <%= t 'site.edit.flash_player_required' %>
-</div>
-
-<%= javascript_include_tag 'swfobject.js' %>
 <script type="text/javascript" defer="defer">
-  var brokenContentSize = $("content").offsetWidth == 0;
-  var fo = new SWFObject("/potlatch/potlatch.swf?d="+Math.round(Math.random()*1000), "potlatch", "100%", "100%", "6", "#FFFFFF");
-  // 700,600 for fixed size, 100%,100% for resizable
-  var changesaved=true;
-  var winie=false; if (document.all && window.print) { winie=true; }
-  
-  window.onbeforeunload=function() {
-    if (!changesaved) {
-      return '<%= escape_javascript(t('site.edit.potlatch_unsaved_changes')) %>';
-    }
-  }
-
-  function markChanged(a) { changesaved=a; }
-
-  function doSWF(lat,lon,sc) {
-    if (sc < 11) sc = 11;
-    fo.addVariable('winie',winie);
-    fo.addVariable('scale',sc);
-    fo.addVariable('token','<%= session[:token] %>');
-    if (lat) { fo.addVariable('lat',lat); }
-    if (lon) { fo.addVariable('long',lon); }
-    <% if params['gpx']     %>fo.addVariable('gpx'     ,'<%= h(params['gpx']    ) %>');<% end %>
-    <% if params['way']     %>fo.addVariable('way'     ,'<%= h(params['way']    ) %>');<% end %>
-    <% if params['node']    %>fo.addVariable('node'    ,'<%= h(params['node']   ) %>');<% end %>
-    <% if params['tileurl'] %>fo.addVariable('custombg','<%= h(params['tileurl']) %>');<% end %>
-    fo.write("map");
-  }
-
-  doSWF(<%= lat || 'null' %>,<%= lon || 'null' %>,<%= zoom %>);
-
-  function setPosition(lat, lon, zoom) {
-    doSWF(lat, lon, zoom || 15);
-  }
-
   function resizeContent() {
     var content = $("content");
     var rightMargin = parseInt(getStyle(content, "right"));
index d5bcb38..f4523c5 100644 (file)
     <td><%= f.text_field :languages %></td>
   </tr>
 
+  <tr>
+    <td class="fieldName" valign="top"><%= t 'user.account.preferred editor' %></td>
+    <td><%= f.select :preferred_editor, Editors::ALL_EDITORS.collect { |e| [t('user.account.editor.'+e), e] } %></td>
+  </tr>
+
   <tr>
     <td class="fieldName" valign="top">
       <%= t 'user.account.image' %>
index ab5c9a8..5533b51 100644 (file)
@@ -57,6 +57,8 @@ standard_settings: &standard_settings
   oauth_10_support: true
   # URL of Nominatim instance to use for geocoding
   nominatim_url: "http://nominatim.openstreetmap.org/"
+  # Default editor
+  default_editor: "potlatch"
 
 development:
   <<: *standard_settings
index deef863..d5c82a7 100644 (file)
@@ -1235,6 +1235,7 @@ en:
       anon_edits_link_text: "Find out why this is the case."
       flash_player_required: 'You need a Flash player to use Potlatch, the OpenStreetMap Flash editor. You can <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">download Flash Player from Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Several other options</a> are also available for editing OpenStreetMap.'
       potlatch_unsaved_changes: "You have unsaved changes. (To save in Potlatch, you should deselect the current way or point, if editing in live mode, or click save if you have a save button.)"
+      no_iframe_support: "Your browser doesn't support HTML iframes, which are necessary for this feature."
     sidebar:
       search_results: Search Results
       close: Close
@@ -1640,6 +1641,7 @@ en:
         link text: "what is this?"
       profile description: "Profile Description:"
       preferred languages: "Preferred Languages:"
+      preferred editor: "Preferred Editor:"
       image: "Image:"
       new image: "Add an image"
       keep image: "Keep the current image"
@@ -1656,6 +1658,9 @@ en:
       return to profile: Return to profile
       flash update success confirm needed: "User information updated successfully. Check your email for a note to confirm your new email address."
       flash update success: "User information updated successfully."
+      editor:
+        potlatch: "Potlatch (in-browser editor)"
+        josm:     "JOSM (via remote-control plugin)"
     confirm:
       heading: Confirm a user account
       press confirm button: "Press the confirm button below to activate your account."
diff --git a/db/migrate/20101114011429_add_editor_preference_to_user.rb b/db/migrate/20101114011429_add_editor_preference_to_user.rb
new file mode 100644 (file)
index 0000000..7d39cd2
--- /dev/null
@@ -0,0 +1,9 @@
+class AddEditorPreferenceToUser < ActiveRecord::Migration
+  def self.up
+    add_column :users, :preferred_editor, :string
+  end
+
+  def self.down
+    remove_column :users, :preferred_editor
+  end
+end
diff --git a/lib/editors.rb b/lib/editors.rb
new file mode 100644 (file)
index 0000000..e3e17e5
--- /dev/null
@@ -0,0 +1,3 @@
+module Editors 
+  ALL_EDITORS = [ "potlatch", "josm" ]
+end
index c388870..bdd5428 100644 (file)
@@ -1,8 +1,9 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class SiteControllerTest < ActionController::TestCase
-  ## Lets check that we can get all the pages without any errors
-  
+  fixtures :users
+
+  ## Lets check that we can get all the pages without any errors  
   # Get the index
   def test_index
     get :index
@@ -39,4 +40,22 @@ class SiteControllerTest < ActionController::TestCase
     assert_template :partial => '_key', :count => count
     assert_template :partial => '_sidebar', :count => count
   end
+
+  # test the right editor gets used when the user hasn't set a preference
+  def test_edit_without_preference
+    get(:edit, nil, { 'user' => users(:public_user).id })
+    assert_response :success
+    assert_template :partial => "_#{DEFAULT_EDITOR}", :count => 1
+  end
+
+  # and when they have...
+  def test_edit_with_preference
+    user = users(:public_user)
+    user.preferred_editor = "josm"
+    user.save!
+
+    get(:edit, nil, { 'user' => user.id })
+    assert_response :success
+    assert_template :partial => "_josm", :count => 1
+  end    
 end
index ac2bd5e..7d5f8dc 100644 (file)
@@ -138,4 +138,15 @@ class UserTest < ActiveSupport::TestCase
     #Friend.delete(friend)
     #assert_equal 0, Friend.count
   end
+
+  def test_user_preferred_editor
+    user = users(:normal_user)
+    assert_equal nil, user.preferred_editor
+    user.preferred_editor = "potlatch"
+    assert_equal "potlatch", user.preferred_editor
+    user.save!
+
+    user.preferred_editor = "invalid_editor"
+    assert_raise(ActiveRecord::RecordInvalid) { user.save! }
+  end
 end