]> git.openstreetmap.org Git - rails.git/commitdiff
Merge 7452:7744 from trunk.
authorTom Hughes <tom@compton.nu>
Fri, 9 May 2008 23:22:26 +0000 (23:22 +0000)
committerTom Hughes <tom@compton.nu>
Fri, 9 May 2008 23:22:26 +0000 (23:22 +0000)
37 files changed:
app/controllers/amf_controller.rb
app/controllers/diary_entry_controller.rb
app/controllers/message_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/controllers/user_preference_controller.rb
app/helpers/application_helper.rb
app/models/notifier.rb
app/models/trace.rb
app/models/user_preference.rb
app/views/diary_entry/list.rhtml
app/views/diary_entry/new.rhtml
app/views/diary_entry/no_such_user.rhtml [new file with mode: 0644]
app/views/export/_start.rhtml
app/views/export/start.rjs
app/views/layouts/site.rhtml
app/views/message/new.rhtml
app/views/notifier/_gpx_description.rhtml [new file with mode: 0644]
app/views/notifier/gpx_failure.rhtml
app/views/notifier/gpx_success.rhtml
app/views/notifier/signup_confirm.text.html.rhtml
app/views/notifier/signup_confirm.text.plain.rhtml
app/views/site/_search.rhtml
app/views/site/edit.rhtml
app/views/site/index.rhtml
app/views/trace/_trace_header.rhtml
app/views/user/account.rhtml
app/views/user/no_such_user.rhtml [new file with mode: 0644]
config/lighttpd.conf
config/potlatch/autocomplete.txt
config/potlatch/presets.txt
config/routes.rb
lib/daemons/gpx_import.rb
public/export/embed.html [new file with mode: 0644]
public/javascripts/map.js
public/potlatch/potlatch.swf
public/stylesheets/site.css

index 4afba1484fd58fd9f39ff6dca1b7f6b3d7bf4afe..4214448696d6fb2d85f7f37fb1b0daec83ca30dd 100644 (file)
@@ -594,8 +594,8 @@ class AmfController < ApplicationController
        # the delete_with_relations_and_nodes_and_history method should do this,
        #   but at present it just throws a 'precondition failed'
     way=way.to_i 
-    db_now='@now'+(rand*100).to_i.to_s+uid.to_s+id.to_i.abs.to_s+Time.new.to_i.to_s
-       db_uqn='unin'+(rand*100).to_i.to_s+uid.to_s+way.to_i.abs.to_s+Time.new.to_i.to_s
+    db_now='@now'+(rand*100).to_i.to_s+uid.to_s+way.abs.to_s+Time.new.to_i.to_s
+       db_uqn='unin'+(rand*100).to_i.to_s+uid.to_s+way.abs.to_s+Time.new.to_i.to_s
     ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()")
        createuniquenodes(way,db_uqn,[])
        deleteuniquenoderelations(db_uqn,uid,db_now)
index 643728dc44a7408efb52944d03d4441947f0ec41..a3b37b931beabf3c7cd9fcbca435d62c41c37914 100644 (file)
@@ -30,11 +30,16 @@ class DiaryEntryController < ApplicationController
   def list
     if params[:display_name]
       @this_user = User.find_by_display_name(params[:display_name])
-      @title = @this_user.display_name + "'s diary"
-      @entry_pages, @entries = paginate(:diary_entries,
-                                        :conditions => ['user_id = ?', @this_user.id],
-                                        :order => 'created_at DESC',
-                                        :per_page => 20)
+      if @this_user
+        @title = @this_user.display_name + "'s diary"
+        @entry_pages, @entries = paginate(:diary_entries,
+                                          :conditions => ['user_id = ?', @this_user.id],
+                                          :order => 'created_at DESC',
+                                          :per_page => 20)
+      else
+        @not_found_user = params[:display_name]
+        render :action => 'no_such_user', :status => :not_found
+      end
     else
       @title = "Users' diaries"
       @entry_pages, @entries = paginate(:diary_entries,
index 9dc1d69229348291b9da97d5d9a7bd724c7ad210..85c0ac328f2fc0349bd733518f51dd343410a825 100644 (file)
@@ -17,13 +17,17 @@ class MessageController < ApplicationController
         Notifier::deliver_message_notification(@message)
         redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name
       end
+    else
+      @title = params[:title]
     end
   end
 
   def reply
     message = Message.find(params[:message_id], :conditions => ["to_user_id = ? or from_user_id = ?", @user.id, @user.id ])
-    title = message.title.sub(/^Re:\s*/, "Re: ")
-    redirect_to :action => 'new', :user_id => message.from_user_id, :title => title
+    @body = "On #{message.sent_on} #{message.sender.display_name} wrote:\n\n#{message.body.gsub(/^/, '> ')}" 
+    @title = "Re: #{message.title.sub(/^Re:\s*/, '')}"
+    @user_id = message.from_user_id
+    render :action => 'new'
   rescue ActiveRecord::RecordNotFound
     render :nothing => true, :status => :not_found
   end
index 4db6e8e15f4b80e4fafa6a33092d0cac60537a0d..cf35d00462c0c7461be2928737345048033dffdb 100644 (file)
@@ -83,14 +83,17 @@ class TraceController < ApplicationController
 
   def view
     @trace = Trace.find(params[:id])
-    @title = "Viewing trace #{@trace.name}"
-    if !@trace.visible?
-      render :nothing => true, :status => :not_found
-    elsif !@trace.public? and @trace.user.id != @user.id
-      render :nothing => true, :status => :forbidden
+
+    if @trace and @trace.visible? and
+       (@trace.public? or @trace.user.id == @user.id)
+      @title = "Viewing trace #{@trace.name}"
+    else
+      flash[:notice] = "Trace not found!"
+      redirect_to :controller => 'trace', :action => 'list'
     end
   rescue ActiveRecord::RecordNotFound
-    render :nothing => true, :status => :not_found
+    flash[:notice] = "Trace not found!"
+    redirect_to :controller => 'trace', :action => 'list'
   end
 
   def create
@@ -196,7 +199,7 @@ class TraceController < ApplicationController
       conditions[0] += " AND users.display_name = ?"
       conditions << params[:display_name]
     end
-    
+
     if params[:tag]
       conditions[0] += " AND EXISTS (SELECT * FROM gpx_file_tags AS gft WHERE gft.gpx_id = gpx_files.id AND gft.tag = ?)"
       conditions << params[:tag]
index bd0c143c0ce7f5866bb35c9668e09b3485633263..e998e83c69d86e843f4763f2e42e41bfd295034c 100644 (file)
@@ -11,6 +11,8 @@ class UserController < ApplicationController
     @title = 'create account'
     @user = User.new(params[:user])
 
+    @user.data_public = true
+      
     if @user.save
       token = @user.tokens.create
       flash[:notice] = "User was successfully created. Check your email for a confirmation note, and you\'ll be mapping in no time :-)<br>Please note that you won't be able to login until you've received and confirmed your email address."
@@ -179,7 +181,8 @@ class UserController < ApplicationController
     if @this_user
       @title = @this_user.display_name
     else
-      render :nothing => true, :status => :not_found
+      @not_found_user = params[:display_name]
+      render :action => 'no_such_user', :status => :not_found
     end
   end
 
index b22c522402e581cc54a1572cd6bee2757aaff42e..5594799293a1c9f79d492c54f79e128225369c04 100644 (file)
@@ -1,8 +1,41 @@
+# Update and read user preferences, which are arbitrayr key/val pairs
 class UserPreferenceController < ApplicationController
   before_filter :authorize
 
-  def read
+  def read_one
+    pref = UserPreference.find(@user.id, params[:preference_key])
+
+    if pref
+      render :text => pref.v.to_s
+    else
+      render :text => 'OH NOES! PREF NOT FOUND!', :status => 404
+    end
+  end
+
+  def update_one
+    begin
+      pref = UserPreference.find(@user.id, params[:preference_key])
+      pref.v = request.raw_post.chomp
+      pref.save
+    rescue ActiveRecord::RecordNotFound 
+      pref = UserPreference.new
+      pref.user = @user
+      pref.k = params[:preference_key]
+      pref.v = request.raw_post.chomp
+      pref.save
+    end
+
+    render :nothing => true
+  end
 
+  def delete_one
+    UserPreference.delete(@user.id, params[:preference_key])
+
+    render :nothing => true
+  end
+
+  # print out all the preferences as a big xml block
+  def read
     doc = OSM::API.new.get_xml_doc
 
     prefs = @user.preferences
@@ -15,9 +48,9 @@ class UserPreferenceController < ApplicationController
 
     doc.root << el1
     render :text => doc.to_s, :content_type => "text/xml"
-
   end
 
+  # update the entire set of preferences
   def update
     begin
       p = XML::Parser.new
@@ -30,12 +63,12 @@ class UserPreferenceController < ApplicationController
 
       doc.find('//preferences/preference').each do |pt|
         pref = UserPreference.new
-        
+
         unless keyhash[pt['k']].nil? # already have that key
           render :text => 'OH NOES! CAN HAS UNIQUE KEYS?', :status => :not_acceptable
           return
         end
-        
+
         keyhash[pt['k']] = 1
 
         pref.k = pt['k']
@@ -64,5 +97,4 @@ class UserPreferenceController < ApplicationController
 
     render :nothing => true
   end
-
 end
index 9c2b5fd3fe9376854d0d503edce6ef31f13ce29e..3119c8435469003a9433793005306b4be504df70 100644 (file)
@@ -2,4 +2,8 @@ module ApplicationHelper
   def htmlize(text)
     return sanitize(auto_link(simple_format(text), :urls))
   end
+
+  def rss_link_to(*args)
+    return link_to(image_tag("RSS.gif", :size => "16x16", :border => 0), Hash[*args], { :class => "rsssmall" });
+  end
 end
index b9b81a8893d53c354538c68b55f249f00270be42..84d097341c8dee7cd61162a5337fddef436386a9 100644 (file)
@@ -35,6 +35,8 @@ class Notifier < ActionMailer::Base
     headers "Auto-Submitted" => "auto-generated"
     body :trace_name => trace.name,
          :trace_points => trace.size,
+         :trace_description => trace.description,
+         :trace_tags => trace.tags,
          :possible_points => possible_points
   end
 
@@ -44,6 +46,8 @@ class Notifier < ActionMailer::Base
     subject "[OpenStreetMap] GPX Import failure"
     headers "Auto-Submitted" => "auto-generated"
     body :trace_name => trace.name,
+         :trace_description => trace.description,
+         :trace_tags => trace.tags,
          :error => error
   end
   
index ab99dc2900a2d1962f0316b542616b3dea2afc77..0e9e7bcc1598df1ffd54f447f18afa75d6fbae1a 100644 (file)
@@ -191,6 +191,7 @@ class Trace < ActiveRecord::Base
       if first
         f_lat = point['latitude']
         f_lon = point['longitude']
+        first = false
       end
 
       tp = Tracepoint.new
index 2a73f22331d7333f7a262c6d262dad0519a25824..3985a527ec5f62e83b53b948b72164a48789a08d 100644 (file)
@@ -1,4 +1,5 @@
 class UserPreference < ActiveRecord::Base
+  set_primary_keys :user_id, :k
   belongs_to :user
 
   # Turn this Node in to an XML Node without the <osm> wrapper.
index dd90de1697f70bc723265ba4ee313af1785224a8..e648e46f21c21b4cce6e02eeb56a4edccba84546 100644 (file)
@@ -28,5 +28,5 @@
 
 <br />
 
-<%= link_to(image_tag("RSS.gif", :size => "16x16", :border => 0), :action => 'rss') %>
-<%= auto_discovery_link_tag(:atom, :action => 'rss') %>
+<%= rss_link_to :action => 'rss' %>
+<%= auto_discovery_link_tag :atom, :action => 'rss' %>
index b46bb4d9ff14c68866ee80ca577f271f8b29fe75..0a5203a66053ce49f2e5c8eaf9f62974c6efa982 100644 (file)
       <td><%= f.text_area :body, :cols => 80 %></td>
     </tr>
     <tr valign="top">
-           <th>Location</th>
-           <td><a name="map"></a><div id="map" style="border: 1px solid black; position: relative; width : 90%; height : 400px; display: none;"></div>
-                 <span class="location">Latitude: <%= f.text_field :latitude, :size => 20, :id => "latitude" %> Longitude: <%= f.text_field :longitude, :size => 20, :id => "longitude" %></span> <a href="#map" id="usemap" onclick="document.getElementById('map').style.display = 'block'; document.getElementById('usemap').style.display = 'none';">use map</a> </td>
-         </tr>
+      <th>Location</th>
+      <td>
+        <div id="map" style="border: 1px solid black; position: relative; width : 90%; height : 400px; display: none;"></div>
+        <span class="location">Latitude: <%= f.text_field :latitude, :size => 20, :id => "latitude" %> Longitude: <%= f.text_field :longitude, :size => 20, :id => "longitude" %></span>
+        <a href="javascript:openMap()" id="usemap">use map</a>
+      </td>
+    </tr>
     <tr>
       <th></th>
       <td><%= submit_tag 'Save' %></td>
@@ -40,7 +43,7 @@
   <!--
   var marker;
 
-  function init(){
+  function init() {
     var centre = new OpenLayers.LonLat(<%= lon %>, <%= lat %>);
     var zoom = <%= zoom %>;
 
       removeMarkerFromMap(marker);
     }
 
-    marker = addMarkerToMap(merc, null, "Diary entry location");
+    marker = addMarkerToMap(lonlat, null, "Diary entry location");
+  }
+
+  function openMap() {
+    $("map").style.display = "block";
+    $("usemap").style.display = "none";
   }
 
   window.onload = init;
diff --git a/app/views/diary_entry/no_such_user.rhtml b/app/views/diary_entry/no_such_user.rhtml
new file mode 100644 (file)
index 0000000..7820b48
--- /dev/null
@@ -0,0 +1,2 @@
+<h2><%= h(@not_found_user) %></h2>
+<p>Sorry, there is no user with the name <%= @not_found_user -%>. Please check your spelling, or maybe the link you clicked is wrong.</p>
index 4da7544960d38573d3eead6a287abc770a335dc6..9776261ea3e9d356aa52321f4e2feeca940241ae 100644 (file)
 
   <div class="export_details">
     <p>
-      <%= radio_button_tag("format", "osm") %>OpenStreetMap XML Data
+      <%= radio_button_tag("format", "osm") %> OpenStreetMap XML Data
       <br/>
-      <%= radio_button_tag("format", "mapnik") %>Mapnik Image
+      <%= radio_button_tag("format", "mapnik") %> Mapnik Image
       <br/>
-      <%= radio_button_tag("format", "osmarender") %>Osmarender Image
+      <%= radio_button_tag("format", "osmarender") %> Osmarender Image
+      <br/>
+      <%= radio_button_tag("format", "html") %> Embeddable HTML
     </p>
   </div>
 
       <p>Zoom <%= select_tag("osmarender_zoom", options_for_select([4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])) %></p>
     </div>
   </div>
+  
+  <div id="export_html">
+    <p class="export_heading">Options</p>
+    <div class="export_details">
+      <p><a id="add_marker" href="#">Add a marker to the map</a></p>
+      <p id="marker_inputs" style="display:none">
+        Lat: <input type="text" id="marker_lat" size="9" />
+        Lon: <input type="text" id="marker_lon" size="9" />
+      </p>
+    </div>
+
+    <p class="export_heading">Output</p>
+    <div class="export_details">
+      <p><input type="text" id="export_html_text" style="width:95%" /></p>
+      <p>Paste HTML to embed in website</p>
+    </div>
+  </div>
 
   <div class="export_buttons">
     <p><%= submit_tag "Export", :id => "export_commit" %></p>
index 3f1d73d689be9a5c2309d5ba92bc974d6afd39ff..2babcc982e2d78ac5df6380d10836b21cfe94736 100644 (file)
@@ -3,6 +3,8 @@ page.replace_html :sidebar_content, :partial => 'start'
 page << <<EOJ
   var vectors;
   var box;
+  var markerLayer;
+  var markerControl;
 
   function startExport() {
     vectors = new OpenLayers.Layer.Vector("Vector Layer", {
@@ -22,11 +24,10 @@ page << <<EOJ
     map.addControl(box);
 
     map.events.register("moveend", map, mapMoved);
+    map.events.register("changebaselayer", map, htmlUrlChanged);
 
     openSidebar({ onclose: stopExport });
 
-    setBounds(map.getExtent());
-
     if (map.baseLayer.name == "Mapnik") {
       $("format_mapnik").checked = true;
     } else if (map.baseLayer.name == "Osmarender") {
@@ -34,6 +35,7 @@ page << <<EOJ
     }
 
     formatChanged();
+    setBounds(map.getExtent());
 
     $("viewanchor").className = "";
     $("exportanchor").className = "active";
@@ -44,7 +46,9 @@ page << <<EOJ
     $("exportanchor").className = "";
 
     clearBox();
+    clearMarker();
     map.events.unregister("moveend", map, mapMoved);
+    map.events.unregister("changebaselayer", map, htmlUrlChanged);
     map.removeLayer(vectors);
   }
 
@@ -93,6 +97,66 @@ page << <<EOJ
     $("drag_box").innerHTML = "Manually select a different area";
   }
 
+  function startMarker() {
+    $("add_marker").innerHTML='Click on the map to add a marker';
+
+    if (!markerLayer) {
+      markerLayer = new OpenLayers.Layer.Vector("",{
+        displayInLayerSwitcher: false,
+        style: { 
+          externalGraphic: OpenLayers.Util.getImagesLocation() + "marker.png",
+          graphicXOffset: -10.5,
+          graphicYOffset: -25, 
+          graphicWidth: 21,
+          graphicHeight: 25
+        } 
+      });
+      map.addLayer(markerLayer);
+
+      markerControl = new OpenLayers.Control.DrawFeature(markerLayer, OpenLayers.Handler.Point);
+      map.addControl(markerControl);
+
+      markerLayer.events.on({ "featureadded": endMarker });
+    }
+
+    markerLayer.destroyFeatures();
+    markerControl.activate();
+
+    return false;
+  }
+
+  $("add_marker").onclick = startMarker;
+
+  function endMarker(event) {
+    markerControl.deactivate();
+
+    $("add_marker").innerHTML = "Change marker position";
+    $("marker_inputs").style.display = "block";
+    
+    var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+    var epsg900913 = new OpenLayers.Projection("EPSG:900913");
+    var geom = event.feature.geometry.clone().transform(epsg900913, epsg4326);
+
+    $("marker_lon").value = geom.x.toFixed(5);
+    $("marker_lat").value = geom.y.toFixed(5);
+
+    htmlUrlChanged(); 
+  }
+
+  function clearMarker() {
+    $("marker_lon").value = "";
+    $("marker_lat").value = "";
+    $("marker_inputs").style.display = "none";
+    $("add_marker").innerHTML = "Add a marker to the map";
+
+    if (markerLayer) { 
+      markerControl.destroy();
+      markerLayer.destroy();
+      markerLayer = null;
+      markerControl = null;
+    }
+  }  
+
   function mapMoved() {
     setBounds(map.getExtent());
     validateControls();
@@ -110,6 +174,7 @@ page << <<EOJ
     $("maxlat").value = Math.round(bounds.top * decimals) / decimals;
 
     mapnikSizeChanged();
+    htmlUrlChanged();
   }
 
   function clearBox() {
@@ -160,7 +225,39 @@ page << <<EOJ
     }
   }
 
+  function htmlUrlChanged() {
+    var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
+    var layerName = map.baseLayer.name.toLowerCase();
+    var url = "http://#{SERVER_URL}/export/embed.html?bbox=" + bounds.toBBOX() + "&layer=" + layerName;
+    var markerUrl = "";
+
+    if ($("marker_lat").value && $("marker_lon").value) {
+      markerUrl = "&mlat=" + $("marker_lat").value + "&mlon=" + $("marker_lon").value;
+      url += "&marker=" + $("marker_lat").value + "," + $("marker_lon").value;
+    } 
+    
+    var html = '<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="'+url+'" style="border: 1px solid black"></iframe>';
+   
+    // Create "larger map" link
+    var center = bounds.getCenterLonLat();
+    var epsg4326 = new OpenLayers.Projection("EPSG:4326");
+    var epsg900913 = new OpenLayers.Projection("EPSG:900913");
+
+    bounds.transform(epsg4326, epsg900913);
+    var zoom = map.getZoomForExtent(bounds);
+    
+    html += '<br /><small><a href="http://#{SERVER_URL}/?lat='+center.lat+'&lon='+center.lon+'&zoom='+zoom+markerUrl+'">View Larger Map</a></small>';
+
+    $("export_html_text").value = html;
+
+    if ($("format_html").checked) {
+      $("export_html_text").select();
+    }
+  }
+
   function formatChanged() {
+    $("export_commit").style.display = "inline";
+
     if ($("format_osm").checked) {
       $("export_osm").style.display = "inline";
     } else {
@@ -183,12 +280,22 @@ page << <<EOJ
       $("export_osmarender").style.display = "none";
     }
 
+    if ($("format_html").checked) { 
+      $("export_html").style.display = "inline";
+      $("export_commit").style.display = "none";
+      $("export_html_text").select();
+    } else {
+      $("export_html").style.display = "none";
+      clearMarker();
+    }
+        
     validateControls();
   }
 
   $("format_osm").onclick = formatChanged;
   $("format_mapnik").onclick = formatChanged;
   $("format_osmarender").onclick = formatChanged;
+  $("format_html").onclick = formatChanged;
 
   function maxMapnikScale() {
     var bounds = new OpenLayers.Bounds($("minlon").value, $("minlat").value, $("maxlon").value, $("maxlat").value);
index db7fce0a6a25b975d7eeb3bd15a8c12789274ef6..33e02449d7dcab70a16a1347e26ec9ada740c3ea 100644 (file)
         <%= yield :left_menu %>
       </div>
 
+      <div id="sotm" class="left_menu">
+        <div id="sotminfo">
+        Come to the second OpenStreetMap Conference, <a href="http://www.stateofthemap.org">The State of the Map</a>: 12th-13th July 2008, Limerick, Ireland.
+        </div>
+      </div>
+
       <%= yield :optionals %>
       <div id="cclogo">
         <center>
index d66e7caedb8773d0aa4134cd812d27e8228f8603..214df8d31fd8f1de8130d335559d12590b961277 100644 (file)
@@ -1,5 +1,5 @@
-<% display_name = User.find_by_id(params[:user_id]).display_name %>
-<% title = params[:message] ? params[:message][:title] : params[:title] %>
+<% user_id = params[:user_id] || @user_id %>
+<% display_name = User.find_by_id(user_id).display_name %>
 
 <h2>Send a new message to <%= h(display_name) %></h2>
 
 
 <%= error_messages_for 'message' %>
 
-<% form_for :message do |f| %>
+<% form_for :message, :url => { :action => "new", :user_id => user_id } do |f| %>
   <table>
     <tr valign="top">
       <th>Subject</th>
-      <td><%= text_field_tag 'message[title]', title, :size => 60 %></td>
+      <td><%= f.text_field :title, :size => 60, :value => @title %></td>
     </tr>
     <tr valign="top">
       <th>Body</th>
-      <td><%= f.text_area :body, :cols => 80 %></td>
+      <td><%= f.text_area :body, :cols => 80, :value => @body %></td>
     </tr>
     <tr>
       <th></th>
-      <td><%= submit_tag 'Send' %></td>
+      <td><%= submit_tag 'Send', :action => 'new' %></td>
     </tr>
   </table>
 <% end %>
diff --git a/app/views/notifier/_gpx_description.rhtml b/app/views/notifier/_gpx_description.rhtml
new file mode 100644 (file)
index 0000000..b31c774
--- /dev/null
@@ -0,0 +1,14 @@
+Hi,
+
+It looks like your GPX file
+
+  <%= @trace_name %>
+
+with the description 
+
+  <%= @trace_description %>
+<% if @trace_tags.length>0 %>
+and the following tags:
+<% @trace_tags.each do |tag| %>
+  <%= tag.tag.rstrip %><% end %><% else %>
+and no tags.<% end %>
index 2a16bc49e880af046f164289bec03134d5f3a280..7035e45d180318432613f4ff35f0a204d42a2b26 100644 (file)
@@ -1,9 +1,4 @@
-Hi,
-
-It looks like your GPX file
-
-  <%= @trace_name %>
-
+<%= render :partial => "gpx_description" %>
 failed to import. Here's the error:
 
   <%= @error %>
index ae05bb83b2b9c41986b858262b725a58421a2ab3..2613d742971336e990a8f472ef214c79bd81d8ee 100644 (file)
@@ -1,8 +1,3 @@
-Hi,
-
-It looks like your GPX file
-
-  <%= @trace_name %>
-
+<%= render :partial => "gpx_description" %>
 loaded successfully with <%= @trace_points %> out of a possible
 <%= @possible_points %> points.
index bcb7d46bf42bc72e0e068f42b508c6e886d443bc..61ab877936f0d49fd4a6f97ba0d19cbb41fb3972 100644 (file)
@@ -6,3 +6,9 @@
 <p>If this is you, please click the link below to confirm that account.</p>
 
 <p><a href="<%= @url %>"><%= @url %></a></p>
+
+<p>You may also want to <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">sign up to the OpenStreetMap wiki</a>.</p>
+
+<p>It is recommended that you create a user wiki page, which includes category tags noting where you are, such as <a href="http://wiki.openstreetmap.org/index.php/Category:Users_in_London">[[Category:Users_in_London]]</a>.</p> 
+
+<p>A list of current users in categories, based on where in the world they are, is available from <a href="http://wiki.openstreetmap.org/index.php/Category:Users_by_geographical_region">Category:Users_by_geographical_region</a>.</p>
index c5584959f6dc94f6b460bd657bc50adae7ab1cce..5b93428574f21c6c77b7fb4baebeb837497692c2 100644 (file)
@@ -6,3 +6,15 @@ Someone (hopefully you) would like to create an account over at
 If this is you, please click the link below to confirm that account.
 
 <%= @url %>
+
+You may also want to sign up to the OpenStreetMap wiki at:
+
+http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page
+
+It is recommended that you create a user wiki page, which includes
+category tags noting where you are, such as [[Category:Users_in_London]].
+
+A list of current users in categories, based on where in the world
+they are, is available from:
+
+http://wiki.openstreetmap.org/index.php/Category:Users_by_geographical_region
index bdfc2fb57a44df4382054f82d520ad7420d34f93..f18587f737e2478dd4e0d77256f1d06a0df95930 100644 (file)
     <% form_remote_tag(:loading => "startSearch()",
                        :complete => "endSearch()",
                        :url => { :controller => :geocoder, :action => :search }) do %>
-      <%= text_field_tag :query, h(params[:query]) %>
+      <table>
+        <tr>
+          <td><%= text_field_tag :query, h(params[:query]) %></td>
+          <td></td>
+          <td><%= submit_tag 'Go' %></td>
+        </tr>
+      </table>
     <% end %>
     </span>
     <p id="search_active">Searching...</p>
index c72a3ab1d75ecff9f945f28fc104db6543630049..ac54cb5e5f74c101f962b92fdb3c32657e479bd6 100644 (file)
 <% session[:token] = @user.tokens.create.token unless session[:token] %>
 
 <% if params['mlon'] and params['mlat'] %>
-<% lon =  h(params['mlon']) %>
-<% lat =  h(params['mlat'])  %>
-<% zoom =  h(params['zoom'] || '14') %>
+       <% lon =  h(params['mlon']) %>
+       <% lat =  h(params['mlat'])  %>
+       <% zoom =  h(params['zoom'] || '14') %>
 <% elsif @user and params['lon'].nil? and params['lat'].nil? and params['gpx'].nil? %> 
-<% lon =  @user.home_lon %>
-<% lat =  @user.home_lat %>
-<% zoom = '14' %>
-<% elsif params['gpx'].nil? %>
-<% lon =  h(params['lon'] || '-0.1') %>
-<% lat =  h(params['lat'] || '51.5') %>
-<% zoom =  h(params['zoom'] || '14') %>
+       <% lon =  @user.home_lon %>
+       <% lat =  @user.home_lat %>
+       <% zoom = '14' %>
 <% else %>
-<% lon = nil %>
-<% lat = nil %>
-<% zoom = '14' %>
+       <% lon =  h(params['lon'] || 'null') %>
+       <% lat =  h(params['lat'] || 'null') %>
+       <% zoom =  h(params['zoom'] || '14') %>
 <% end %>
 
-<div id="map">You need a Flash player to use Potlatch, the
+<div id="map">
+       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/index.php/Editing">Several other options</a> are also available
     for editing OpenStreetMap.
 </div>
+
 <%= javascript_include_tag 'swfobject.js' %>
 <script type="text/javascript" defer="defer">
   var brokenContentSize = $("content").offsetWidth == 0;
@@ -68,7 +66,7 @@
     if (lat) { fo.addVariable('lat',lat); }
     if (lon) { fo.addVariable('long',lon); }
     <% if params['gpx'] %>
-    fo.addVariable('gpx','<%= h(params['gpx']) + "/data.xml" %>');
+               fo.addVariable('gpx','<%= h(params['gpx']) %>');
     <% end %>
     fo.write("map");
   }
index 94b24debf54d41162759c182f069ab03e29d8108..895885360f03bef6100ec927f5f71f07ca5a12ec 100644 (file)
@@ -21,7 +21,7 @@
 <tr>
 <td colspan="2" align="center">
 Licensed under the Creative Commons Attribution-Share Alike 2.0 license
-by the OpenStreetMap project and it's contributors.
+by the OpenStreetMap project and its contributors.
 </td>
 </table>
 </div>
index 179b79c32fccbe8541c345f93d470d93b31ad3ff..b4ef3f61273c125b1396f65618173e696f47e4de 100644 (file)
@@ -1,15 +1,24 @@
 <h1><%= h(@title) %></h1>
 
-<span class="rsssmall"><a href="<%= url_for :action => 'georss', :display_name => @display_name, :tag => @tag %>"><img src="/images/RSS.gif" border="0" alt="RSS" /></a></span>
-<% if @user.nil? or @display_name.nil? or @user.display_name != @display_name %>
- | <%= link_to 'See just your traces, or upload a trace', :action => 'mine' %>
-<% end %>
-<% if @tag or @display_name %>
- | <%= link_to 'See all traces', :controller => 'trace', :action => 'list' %>
-<% end %>
-<% if @tag and @user and @user.display_name == @display_name %>
- | <%= link_to 'See all your traces', :controller => 'trace', :action => 'mine' %>
-<% end %>
+<%= auto_discovery_link_tag :atom, :action => 'georss', :display_name => @display_name, :tag => @tag %>
 
-<br />
-<br />
+<p>
+  <%= rss_link_to :action => 'georss', :display_name => @display_name, :tag => @tag %>
+  <% if @user.nil? or @display_name.nil? or @user.display_name != @display_name %>
+    | <%= link_to 'See just your traces, or upload a trace', :action => 'mine' %>
+  <% end %>
+  <% if @tag or @display_name %>
+    | <%= link_to 'See all traces', :controller => 'trace', :action => 'list' %>
+  <% end %>
+  <% if @tag and @user and @user.display_name == @display_name %>
+    | <%= link_to 'See all your traces', :controller => 'trace', :action => 'mine' %>
+  <% end %>
+</p>
+
+<% if @user and @user.traces.count(:conditions => "inserted=0") > 4 %>
+  <p>
+    You have <%= @user.traces.count(:conditions => "inserted=0") %> traces 
+    waiting for upload. Please consider waiting for these to finish before 
+    uploading any more, so as not to block the queue for other users.
+  </p>
+<% end %>
index 76b4fbb34a5a15c7398b5c4039609377602e27d2..d8afa49999cb6c59c7a0908a41301ff4bbaa4161 100644 (file)
@@ -26,7 +26,9 @@
 <% if @user.data_public? %>
   All your edits are public.
 <% else %>
-  Currently your edits are anonymous and people can't send you messages or see your location. To show what you edited and allow people to contact you through the website, click the button below. <b>You will need to do this if you want to use the online editor</b> (<a href="http://wiki.openstreetmap.org/index.php/Disabling_anonymous_edits">find out why</a>). This action cannot be reversed.
+Currently your edits are anonymous and people can't send you messages or see your location. To show what you edited and allow people to contact you through the website, click the button below.
+<b>You will need to do this if you want to use the online editor and it is encouraged</b> (<a href="http://wiki.openstreetmap.org/index.php/Disabling_anonymous_edits">find out why</a>).
+This action cannot be reversed and all new users are now public by default.
   <br /><br />
-  <%= button_to "Make all my edits public, forever", :action => :go_public %>
+  <%= button_to "Make all my edits public", :action => :go_public %>
 <% end %>
diff --git a/app/views/user/no_such_user.rhtml b/app/views/user/no_such_user.rhtml
new file mode 100644 (file)
index 0000000..7820b48
--- /dev/null
@@ -0,0 +1,2 @@
+<h2><%= h(@not_found_user) %></h2>
+<p>Sorry, there is no user with the name <%= @not_found_user -%>. Please check your spelling, or maybe the link you clicked is wrong.</p>
index 5455e266d8b880f5251a225bc6fef3a29b5cf1bc..74aa6f38f3628f16dfdd7eb64154df738ba8282a 100644 (file)
@@ -83,9 +83,10 @@ compress.filetype = (
 # Set expiry for static content
 #
 expire.url = (
+  "/export/" => "access 7 days",
   "/images/" => "access 10 years",
   "/javascripts/" => "access 10 years",
-  "/openlayers/" => "access 10 years",
+  "/openlayers/" => "access 7 days",
   "/stylesheets/" => "access 10 years"
 )
 
index 3480355ee873908362e19e5392f21b52d21f08be..7417f839bcf4dca192c4ba2a8e8ea1bba4dab426 100755 (executable)
@@ -1,11 +1,11 @@
 # Potlatch autocomplete values
 # each line should be: key / way|point|POI (tab) list_of_values
 # '-' indicates no autocomplete for values
-highway/way            motorway,motorway_link,trunk,trunk_link,primary,primary_link,secondary,tertiary,unclassified,residential,service,bridleway,cycleway,footway,pedestrian,steps
-highway/point  mini_roundabout,traffic_signals,crossing,gate,stile,cattle_grid,toll_booth,incline,viaduct,motorway_junction,services,ford,bus_stop
+highway/way            motorway,motorway_link,trunk,trunk_link,primary,primary_link,secondary,tertiary,unclassified,residential,service,bridleway,cycleway,footway,pedestrian,steps,living_street,track
+highway/point  mini_roundabout,traffic_signals,crossing,gate,stile,cattle_grid,toll_booth,incline,viaduct,motorway_junction,services,ford,bus_stop,turning_circle
 junction/way   roundabout
 cycleway/way   lane,track,opposite_lane,opposite_track,opposite
-waterway/way   river,canal,stream,drain,dock
+waterway/way   river,canal,stream,drain,dock,riverbank
 waterway/point lock_gate,lock,turning_point,aqueduct,boatyard,water_point,waste_disposal,mooring,weir
 waterway/POI   boatyard,water_point,waste_disposal,mooring
 railway/way            rail,tram,light_rail,subway,preserved,disused,abandoned,narrow_gauge,monorail
@@ -20,12 +20,12 @@ man_made/point      works,beacon,survey_point,power_wind,power_hydro,power_fossil,pow
 man_made/way   reservoir_covered,pier
 leisure/POI            sports_centre,golf_course,stadium,marina,track,pitch,water_park,fishing,nature_reserve,park,playground,garden,common,slipway
 leisure/way            sports_centre,golf_course,stadium,marina,track,pitch,water_park,fishing,nature_reserve,park,playground,garden,common
-amenity/POI            pub,biergarten,cafe,nightclub,restaurant,fast_food,parking,bicycle_parking,bicycle_rental,car_rental,car_shasring,fuel,telephone,toilets,recycling,public_building,place_of_worship,grave_yard,post_office,post_box,school,university,college,pharmacy,hospital,library,police,fire_station,bus_station,theatre,cinema,arts_centre,courthouse,prison,bank,bureau_de_change,atm,town_hall
+amenity/POI            pub,biergarten,cafe,nightclub,restaurant,fast_food,parking,bicycle_parking,bicycle_rental,car_rental,car_sharing,fuel,telephone,toilets,recycling,public_building,place_of_worship,grave_yard,post_office,post_box,school,university,college,pharmacy,hospital,library,police,fire_station,bus_station,theatre,cinema,arts_centre,courthouse,prison,bank,bureau_de_change,atm,town_hall
 amenity/way            parking,bicycle_parking,car_rental,car_sharing,public_building,grave_yard,school,university,college,hospital,town_hall
 shop/POI               supermarket,convenience,bicycle,outdoor
 shop/way               supermarket
 tourism/POI            information,camp_site,caravan_site,caravan_site,picnic_site,viewpoint,theme_park,hotel,motel,guest_house,hostel,attraction,zoo
-tourism/way            camp_site,caravan_site,picnic_site,theme_parkattraction,zoo
+tourism/way            camp_site,caravan_site,picnic_site,theme_park,attraction,zoo
 historic/POI   castle,monument,memorial,museum,archaeological_site,icon,ruins
 historic/way   archaeological_site,ruins
 landuse/POI            farm,quarry,landfill,basin,reservoir,forest,allotments,residential,retail,commercial,industrial,brownfield,greenfield,cemetery,village_green,recreation_ground
index d7e1494f09e0987f604ecc3956aef05b9f8ba508..ecca87d724f7bc5f8ba40aa29fcedf92bf462871 100644 (file)
@@ -3,9 +3,10 @@ motorway: highway=motorway,ref=(type road number)
 trunk road: highway=trunk,ref=(type road number),name=(type road name)
 primary road: highway=primary,ref=(type road number),name=(type road name)
 secondary road: highway=secondary,ref=(type road number),name=(type road name)
-tertiary road: highway=tertiary,ref=,name=(type road name)
-residential road: highway=residential,ref=,name=(type road name)
+tertiary road: highway=tertiary,ref=(type road number),name=(type road name)
 unclassified road: highway=unclassified,ref=,name=(type road name)
+residential road: highway=residential,ref=,name=(type road name)
+service road: highway=service,ref=,name=
 
 way/footway
 footpath: highway=footway,foot=yes
index b6ab25c13a0d3ca660b28d80df26e4fa3e64dec6..c23509372c8a2c4c9ba761e433332729df242f43 100644 (file)
@@ -42,7 +42,10 @@ ActionController::Routing::Routes.draw do |map|
   
   map.connect "api/#{API_VERSION}/user/details", :controller => 'user', :action => 'api_details'
   map.connect "api/#{API_VERSION}/user/preferences", :controller => 'user_preference', :action => 'read', :conditions => { :method => :get }
+  map.connect "api/#{API_VERSION}/user/preferences/:preference_key", :controller => 'user_preference', :action => 'read_one', :conditions => { :method => :get }
   map.connect "api/#{API_VERSION}/user/preferences", :controller => 'user_preference', :action => 'update', :conditions => { :method => :put }
+  map.connect "api/#{API_VERSION}/user/preferences/:preference_key", :controller => 'user_preference', :action => 'update_one', :conditions => { :method => :put }
+  map.connect "api/#{API_VERSION}/user/preferences/:preference_key", :controller => 'user_preference', :action => 'delete_one', :conditions => { :method => :delete }
   map.connect "api/#{API_VERSION}/user/gpx_files", :controller => 'user', :action => 'api_gpx_files'
  
   map.connect "api/#{API_VERSION}/gpx/create", :controller => 'trace', :action => 'api_create'
index 07f4cd6a4c4e8fade28e1cf9c0aec65198d389f4..e24dc1ad5347e43b141ad9f69131a7ad53a852cc 100755 (executable)
@@ -23,14 +23,14 @@ while(true) do
       if gpx.actual_points > 0
         Notifier::deliver_gpx_success(trace, gpx.actual_points)
       else
-        trace.destroy
         Notifier::deliver_gpx_failure(trace, '0 points parsed ok. Do they all have lat,lng,alt,timestamp?')
+        trace.destroy
       end
     rescue Exception => ex
       logger.info ex.to_s
       ex.backtrace.each {|l| logger.info l }
-      trace.destroy
       Notifier::deliver_gpx_failure(trace, ex.to_s + "\n" + ex.backtrace.join("\n"))
+      trace.destroy
     end
 
     Signal.trap("TERM", "DEFAULT")
diff --git a/public/export/embed.html b/public/export/embed.html
new file mode 100644 (file)
index 0000000..ae82eb5
--- /dev/null
@@ -0,0 +1,75 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <style type="text/css">
+        #map {
+            width: 100%;
+            height: 100%;
+        }
+        .olControlAttribution {
+            bottom: 3px!important;
+        }
+    </style>
+    <script src="http://openstreetmap.org/openlayers/OpenLayers.js"></script>
+    <script src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        function init(){
+            map = new OpenLayers.Map ("map", {
+              controls: [
+                  new OpenLayers.Control.Attribution(),
+                  new OpenLayers.Control.Navigation()
+              ],
+              maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,
+                                               20037508.34,20037508.34),
+              numZoomLevels: 20,
+              maxResolution: 156543.0339,
+              displayProjection: new OpenLayers.Projection("EPSG:4326"),
+              units: 'm',
+              projection: new OpenLayers.Projection("EPSG:900913")
+            });
+
+            var attribution = 'Data by <a target="_parent" href="http://www.openstreetmap.org">OpenStreetMap</a>';
+            var args = OpenLayers.Util.getParameters();
+            if (!args.layer || args.layer == "mapnik") {
+                var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik", {
+                   displayOutsideMaxExtent: true,
+                   wrapDateLine: true,
+                   attribution: attribution
+                });
+                map.addLayer(mapnik);
+            } else {
+                var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender", {
+                   displayOutsideMaxExtent: true,
+                   wrapDateLine: true,
+                   attribution: attribution
+                });
+                map.addLayer(osmarender);
+            }
+
+            if (args.marker) {
+                var markers = new OpenLayers.Layer.Markers();
+                map.addLayer(markers);
+                markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(args.marker[1], args.marker[0]).transform(map.displayProjection, map.getProjectionObject())));
+                map.marker = true;
+            }
+
+            if (args.bbox) {
+                var bounds = OpenLayers.Bounds.fromArray(args.bbox).transform(map.displayProjection, map.getProjectionObject());
+                map.zoomToExtent(bounds)
+            } else {
+                map.zoomToMaxExtent();
+            }
+
+            var size = map.getSize();
+            if (size.h > 320) {
+                map.addControl(new OpenLayers.Control.PanZoomBar());
+            } else {
+                map.addControl(new OpenLayers.Control.PanZoom());
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="map"></div>
+  </body>
+</html>
index ccfa3b2559a0fa40d9c7fbb0f058642a6a87e9c0..c7f381d846df32e1b68863968d4ea9b3d5c566b3 100644 (file)
@@ -113,6 +113,10 @@ function setMapExtent(extent) {
    map.zoomToExtent(extent.clone().transform(epsg4326, map.getProjectionObject()));
 }
 
+function getMapExtent(extent) {
+   return map.getExtent().clone().transform(map.getProjectionObject(), epsg4326);
+}
+
 function getEventPosition(event) {
    return map.getLonLatFromViewPortPx(event.xy).clone().transform(map.getProjectionObject(), epsg4326);
 }
index bbea6ea233f0af35cd9012241c3a431316bf53eb..9f86b17bd30895e11a358720cf807d8b4100458f 100755 (executable)
Binary files a/public/potlatch/potlatch.swf and b/public/potlatch/potlatch.swf differ
index 4edff5793a04132765a94a12e7e9301bcb5968d4..801654877261033a8a79ca37b694de3162181576 100644 (file)
@@ -358,9 +358,14 @@ hides rule from IE5-Mac \*/
   width: 100%;
 }
 
+.optionalbox td {
+  margin: 0px;
+  padding: 0px;
+}
+
 .search_form {
   height: 16px;
-  padding-bottom: 2px;
+  padding-bottom: 6px;
 }
 
 #search_active {
@@ -525,7 +530,11 @@ hides rule from IE5-Mac \*/
   list-style: square;
 }
 
-input[type="text"] {
+input[type="text"], input[type="password"], textarea {
+  border: 1px solid black;
+}
+
+input[type="submit"] {
   border: 1px solid black;
 }
 
@@ -569,6 +578,14 @@ input[type="text"] {
   font-weight: normal;
 }
 
+#sotminfo a:link {
+  text-decoration: underline;
+}
+
+#sotminfo a:visited {
+  text-decoration: underline;
+}
+
 #permalink {
   z-index:10000;
   position:absolute;