]> git.openstreetmap.org Git - rails.git/commitdiff
Add node version pages
authorAnton Khorev <tony29@yandex.ru>
Sat, 13 Jan 2024 23:05:36 +0000 (02:05 +0300)
committerAnton Khorev <tony29@yandex.ru>
Tue, 23 Jan 2024 19:08:39 +0000 (22:08 +0300)
app/abilities/ability.rb
app/assets/javascripts/index.js
app/controllers/old_nodes_controller.rb [new file with mode: 0644]
app/views/browse/_common_details.html.erb
app/views/browse/_node.html.erb
app/views/browse/_tag_details.html.erb
app/views/old_nodes/not_found.html.erb [new file with mode: 0644]
app/views/old_nodes/show.html.erb [new file with mode: 0644]
config/locales/en.yml
config/routes.rb
test/controllers/old_nodes_controller_test.rb [new file with mode: 0644]

index c7080595c7b8d010f88a834dfa1b9862684b8ec3..b601e66f045130bc958219e04b2a28af887b52c5 100644 (file)
@@ -6,6 +6,7 @@ class Ability
   def initialize(user)
     can [:relation, :relation_history, :way, :way_history, :node, :node_history,
          :changeset, :query], :browse
   def initialize(user)
     can [:relation, :relation_history, :way, :way_history, :node, :node_history,
          :changeset, :query], :browse
+    can [:show], OldNode
     can [:show, :new], Note
     can :search, :direction
     can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :communities, :preview, :copyright, :key, :id], :site
     can [:show, :new], Note
     can :search, :direction
     can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :communities, :preview, :copyright, :key, :id], :site
index 706647ef51ff4415694c1f035cc58febaec42f6a..621054caf6a01c312fc9b6ae3e6402671cb13b90 100644 (file)
@@ -355,6 +355,16 @@ $(document).ready(function () {
     return page;
   };
 
     return page;
   };
 
+  OSM.OldBrowse = function () {
+    var page = {};
+
+    page.pushstate = page.popstate = function (path) {
+      OSM.loadSidebarContent(path);
+    };
+
+    return page;
+  };
+
   var history = OSM.History(map);
 
   OSM.router = OSM.Router(map, {
   var history = OSM.History(map);
 
   OSM.router = OSM.Router(map, {
@@ -369,6 +379,7 @@ $(document).ready(function () {
     "/user/:display_name/history": history,
     "/note/:id": OSM.Note(map),
     "/node/:id(/history)": OSM.Browse(map, "node"),
     "/user/:display_name/history": history,
     "/note/:id": OSM.Note(map),
     "/node/:id(/history)": OSM.Browse(map, "node"),
+    "/node/:id/history/:version": OSM.OldBrowse(),
     "/way/:id(/history)": OSM.Browse(map, "way"),
     "/relation/:id(/history)": OSM.Browse(map, "relation"),
     "/changeset/:id": OSM.Changeset(map),
     "/way/:id(/history)": OSM.Browse(map, "way"),
     "/relation/:id(/history)": OSM.Browse(map, "relation"),
     "/changeset/:id": OSM.Changeset(map),
diff --git a/app/controllers/old_nodes_controller.rb b/app/controllers/old_nodes_controller.rb
new file mode 100644 (file)
index 0000000..a5b9cf5
--- /dev/null
@@ -0,0 +1,19 @@
+class OldNodesController < ApplicationController
+  layout :map_layout
+
+  before_action :authorize_web
+  before_action :set_locale
+  before_action -> { check_database_readable(:need_api => true) }
+  before_action :require_oauth
+
+  authorize_resource
+
+  around_action :web_timeout
+
+  def show
+    @type = "node"
+    @feature = OldNode.preload(:old_tags, :changeset => [:changeset_tags, :user]).find([params[:id], params[:version]])
+  rescue ActiveRecord::RecordNotFound
+    render :action => "not_found", :status => :not_found
+  end
+end
index 4726799e7342966a5c018d1fe93fbaba4f225825..b28e72c752e652e7f4ebfe1a528b9be1874c6741 100644 (file)
@@ -19,7 +19,7 @@
   </li>
   <li>
     <%= t "browse.in_changeset" %>
   </li>
   <li>
     <%= t "browse.in_changeset" %>
-    #<%= link_to common_details.changeset_id, :action => :changeset, :id => common_details.changeset_id %>
+    #<%= link_to common_details.changeset_id, changeset_path(common_details.changeset) %>
   </li>
 
   <% if @type == "node" and common_details.visible? %>
   </li>
 
   <% if @type == "node" and common_details.visible? %>
@@ -33,4 +33,4 @@
   <% end %>
 </ul>
 
   <% end %>
 </ul>
 
-<%= render :partial => "tag_details", :object => common_details.tags %>
+<%= render :partial => "browse/tag_details", :object => common_details.tags %>
index 152223ae751089822fec7a32395fc9e203af6132..cc8597292d058f3360daef8a77c23af97a2507ba 100644 (file)
@@ -8,7 +8,7 @@
   </div>
 <% else %>
   <div class="browse-section browse-node">
   </div>
 <% else %>
   <div class="browse-section browse-node">
-    <%= render :partial => "common_details", :object => node %>
+    <%= render :partial => "browse/common_details", :object => node %>
 
     <% unless node.ways.empty? and node.containing_relation_members.empty? %>
       <h4><%= t "browse.part_of" %></h4>
 
     <% unless node.ways.empty? and node.containing_relation_members.empty? %>
       <h4><%= t "browse.part_of" %></h4>
@@ -17,7 +17,7 @@
           <summary><%= t "browse.part_of_ways", :count => node.ways.uniq.count %></summary>
           <ul class="list-unstyled">
             <% node.ways.uniq.each do |way| %>
           <summary><%= t "browse.part_of_ways", :count => node.ways.uniq.count %></summary>
           <ul class="list-unstyled">
             <% node.ways.uniq.each do |way| %>
-              <li><%= link_to printable_name(way), { :action => "way", :id => way.id.to_s }, { :class => link_class("way", way), :title => link_title(way) } %></li>
+              <li><%= link_to printable_name(way), way_path(way), { :class => link_class("way", way), :title => link_title(way) } %></li>
             <% end %>
           </ul>
         </details>
             <% end %>
           </ul>
         </details>
@@ -26,7 +26,7 @@
         <details <%= "open" if node.containing_relation_members.count < 10 %>>
           <summary><%= t "browse.part_of_relations", :count => node.containing_relation_members.uniq.count %></summary>
           <ul class="list-unstyled">
         <details <%= "open" if node.containing_relation_members.count < 10 %>>
           <summary><%= t "browse.part_of_relations", :count => node.containing_relation_members.uniq.count %></summary>
           <ul class="list-unstyled">
-            <%= render :partial => "containing_relation", :collection => node.containing_relation_members.uniq %>
+            <%= render :partial => "browse/containing_relation", :collection => node.containing_relation_members.uniq %>
           </ul>
         </details>
       <% end %>
           </ul>
         </details>
       <% end %>
index 9129ddaf5d23df457700f7adb63615340a1ca70f..cc08fe16af7fb76de94d39e6b86d10c2ce9e3f5c 100644 (file)
@@ -2,7 +2,7 @@
   <h4><%= t ".tags" %></h4>
   <div class='mb-3 border border-grey rounded overflow-hidden'>
     <table class='mb-0 browse-tag-list table align-middle text-break'>
   <h4><%= t ".tags" %></h4>
   <div class='mb-3 border border-grey rounded overflow-hidden'>
     <table class='mb-0 browse-tag-list table align-middle text-break'>
-      <%= render :partial => "tag", :collection => tag_details.sort %>
+      <%= render :partial => "browse/tag", :collection => tag_details.sort %>
     </table>
   </div>
 <% end %>
     </table>
   </div>
 <% end %>
diff --git a/app/views/old_nodes/not_found.html.erb b/app/views/old_nodes/not_found.html.erb
new file mode 100644 (file)
index 0000000..1ee5d9d
--- /dev/null
@@ -0,0 +1,7 @@
+<% set_title(t("browse.not_found.title")) %>
+
+<%= render "sidebar_header", :title => t("browse.not_found.title") %>
+
+<div>
+  <p><%= t ".sorry", :id => params[:id], :version => params[:version] %></p>
+</div>
diff --git a/app/views/old_nodes/show.html.erb b/app/views/old_nodes/show.html.erb
new file mode 100644 (file)
index 0000000..d3d0989
--- /dev/null
@@ -0,0 +1,5 @@
+<% set_title t("browse.node.title_html", :name => printable_name(@feature)) %>
+
+<%= render "sidebar_header", :title => t("browse.node.title_html", :name => printable_name(@feature)) %>
+
+<%= render :partial => "browse/node", :object => @feature %>
index a2347d4bc66c2cdfc1aca343218014fe66241679..6df0260cddc926914483b09d03b158fc4ae6965f 100644 (file)
@@ -428,6 +428,9 @@ en:
       introduction: "Click on the map to find nearby features."
       nearby: "Nearby features"
       enclosing: "Enclosing features"
       introduction: "Click on the map to find nearby features."
       nearby: "Nearby features"
       enclosing: "Enclosing features"
+  old_nodes:
+    not_found:
+      sorry: "Sorry, node #%{id} version %{version} could not be found."
   changesets:
     changeset_paging_nav:
       showing_page: "Page %{page}"
   changesets:
     changeset_paging_nav:
       showing_page: "Page %{page}"
index a38f8450ff052517e12238b8fb2e9a581f344d5d..29c260c9eefe09245f4d8a6bacc194856b26f6a3 100644 (file)
@@ -113,6 +113,7 @@ OpenStreetMap::Application.routes.draw do
   get "/way/:id/history" => "browse#way_history", :id => /\d+/, :as => :way_history
   get "/node/:id" => "browse#node", :id => /\d+/, :as => :node
   get "/node/:id/history" => "browse#node_history", :id => /\d+/, :as => :node_history
   get "/way/:id/history" => "browse#way_history", :id => /\d+/, :as => :way_history
   get "/node/:id" => "browse#node", :id => /\d+/, :as => :node
   get "/node/:id/history" => "browse#node_history", :id => /\d+/, :as => :node_history
+  resources :old_nodes, :path => "/node/:id/history", :id => /\d+/, :version => /\d+/, :param => :version, :only => :show
   get "/relation/:id" => "browse#relation", :id => /\d+/, :as => :relation
   get "/relation/:id/history" => "browse#relation_history", :id => /\d+/, :as => :relation_history
   get "/changeset/:id" => "browse#changeset", :as => :changeset, :id => /\d+/
   get "/relation/:id" => "browse#relation", :id => /\d+/, :as => :relation
   get "/relation/:id/history" => "browse#relation_history", :id => /\d+/, :as => :relation_history
   get "/changeset/:id" => "browse#changeset", :as => :changeset, :id => /\d+/
diff --git a/test/controllers/old_nodes_controller_test.rb b/test/controllers/old_nodes_controller_test.rb
new file mode 100644 (file)
index 0000000..80b8da9
--- /dev/null
@@ -0,0 +1,26 @@
+require "test_helper"
+
+class OldNodesControllerTest < ActionDispatch::IntegrationTest
+  def test_routes
+    assert_routing(
+      { :path => "/node/1/history/2", :method => :get },
+      { :controller => "old_nodes", :action => "show", :id => "1", :version => "2" }
+    )
+  end
+
+  def test_visible
+    node = create(:node, :with_history)
+    get old_node_path(node, 1)
+    assert_response :success
+    assert_template "old_nodes/show"
+    assert_template :layout => "map"
+  end
+
+  def test_not_found
+    get old_node_path(0, 0)
+    assert_response :not_found
+    assert_template "old_nodes/not_found"
+    assert_template :layout => "map"
+    assert_select "#sidebar_content", /node #0 version 0 could not be found/
+  end
+end