]> git.openstreetmap.org Git - rails.git/commitdiff
Move changeset show action to changesets controller
authorAnton Khorev <tony29@yandex.ru>
Sat, 10 Feb 2024 17:33:33 +0000 (20:33 +0300)
committerAnton Khorev <tony29@yandex.ru>
Fri, 1 Mar 2024 07:48:30 +0000 (10:48 +0300)
13 files changed:
app/abilities/ability.rb
app/controllers/browse_controller.rb
app/controllers/changesets_controller.rb
app/views/changeset_comments/_comments.rss.builder
app/views/changesets/_paging_nav.html.erb [moved from app/views/browse/_paging_nav.html.erb with 100% similarity]
app/views/changesets/show.html.erb [moved from app/views/browse/changeset.html.erb with 98% similarity]
app/views/dashboards/_contact.html.erb
config/locales/en.yml
config/routes.rb
test/controllers/browse_controller_test.rb
test/controllers/changesets_controller_test.rb
test/controllers/site_controller_test.rb
test/test_helper.rb

index 5e0e835d4da514438040ca07aff3f3d09affb8a6..ef4c0a778dc487dcadf7a5b014340599869d2c7d 100644 (file)
@@ -4,8 +4,7 @@ class Ability
   include CanCan::Ability
 
   def initialize(user)
-    can [:relation, :relation_history, :way, :way_history, :node, :node_history,
-         :changeset, :query], :browse
+    can [:relation, :relation_history, :way, :way_history, :node, :node_history, :query], :browse
     can [:show], OldNode
     can [:show], OldWay
     can [:show], OldRelation
@@ -17,7 +16,7 @@ class Ability
     can [:token, :request_token, :access_token, :test_request], :oauth
 
     if Settings.status != "database_offline"
-      can [:index, :feed], Changeset
+      can [:index, :feed, :show], Changeset
       can :index, ChangesetComment
       can [:confirm, :confirm_resend, :confirm_email], :confirmation
       can [:index, :rss, :show, :comments], DiaryEntry
index 88871a9e127b03b17249f86ad8b8b16b851d1f5d..82cbe6f9808e68083c44d71c9abd24fdc4e4952c 100644 (file)
@@ -57,24 +57,5 @@ class BrowseController < ApplicationController
     render :action => "not_found", :status => :not_found
   end
 
-  def changeset
-    @type = "changeset"
-    @changeset = Changeset.find(params[:id])
-    @comments = if current_user&.moderator?
-                  @changeset.comments.unscope(:where => :visible).includes(:author)
-                else
-                  @changeset.comments.includes(:author)
-                end
-    @node_pages, @nodes = paginate(:old_nodes, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "node_page")
-    @way_pages, @ways = paginate(:old_ways, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "way_page")
-    @relation_pages, @relations = paginate(:old_relations, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "relation_page")
-    if @changeset.user.active? && @changeset.user.data_public?
-      @next_by_user = @changeset.user.changesets.where("id > ?", @changeset.id).reorder(:id => :asc).first
-      @prev_by_user = @changeset.user.changesets.where("id < ?", @changeset.id).reorder(:id => :desc).first
-    end
-  rescue ActiveRecord::RecordNotFound
-    render :action => "not_found", :status => :not_found
-  end
-
   def query; end
 end
index 5eb14629ae231a4f6fb4d62386edc14f9a15e827..613a3ee2a9f919522a060361c063052c020ea879 100644 (file)
@@ -8,7 +8,8 @@ class ChangesetsController < ApplicationController
 
   before_action :authorize_web
   before_action :set_locale
-  before_action -> { check_database_readable(:need_api => true) }, :only => [:index, :feed]
+  before_action -> { check_database_readable(:need_api => true) }, :only => [:index, :feed, :show]
+  before_action :require_oauth, :only => :show
   before_action :check_database_writable, :only => [:subscribe, :unsubscribe]
 
   authorize_resource
@@ -75,6 +76,26 @@ class ChangesetsController < ApplicationController
     index
   end
 
+  def show
+    @type = "changeset"
+    @changeset = Changeset.find(params[:id])
+    @comments = if current_user&.moderator?
+                  @changeset.comments.unscope(:where => :visible).includes(:author)
+                else
+                  @changeset.comments.includes(:author)
+                end
+    @node_pages, @nodes = paginate(:old_nodes, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "node_page")
+    @way_pages, @ways = paginate(:old_ways, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "way_page")
+    @relation_pages, @relations = paginate(:old_relations, :conditions => { :changeset_id => @changeset.id }, :per_page => 20, :parameter => "relation_page")
+    if @changeset.user.active? && @changeset.user.data_public?
+      @next_by_user = @changeset.user.changesets.where("id > ?", @changeset.id).reorder(:id => :asc).first
+      @prev_by_user = @changeset.user.changesets.where("id < ?", @changeset.id).reorder(:id => :desc).first
+    end
+    render :layout => map_layout
+  rescue ActiveRecord::RecordNotFound
+    render :template => "browse/not_found", :status => :not_found, :layout => map_layout
+  end
+
   ##
   # subscribe to a changeset
   def subscribe
index 59973965f617ac0972c834c3d4c0a35d7e253d7d..b1344b4884d4317ce5698e484c9dd831672be78c 100644 (file)
@@ -2,8 +2,8 @@ comments.each do |comment|
   xml.item do
     xml.title t(".comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s)
 
-    xml.link url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
-    xml.guid url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
+    xml.link changeset_url(comment.changeset, :anchor => "c#{comment.id}")
+    xml.guid changeset_url(comment.changeset, :anchor => "c#{comment.id}")
 
     xml.description do
       xml.cdata! render(:partial => "comment", :object => comment, :formats => [:html])
similarity index 98%
rename from app/views/browse/changeset.html.erb
rename to app/views/changesets/show.html.erb
index db6b9c966e924a55db0840975df655281b611299..57a3fdb56b61f2b280597037f93f3eab8f2c1d88 100644 (file)
@@ -8,7 +8,7 @@
   </p>
   <p class="details"><%= changeset_details(@changeset) %></p>
 
-  <%= render :partial => "tag_details", :object => @changeset.tags.except("comment") %>
+  <%= render :partial => "browse/tag_details", :object => @changeset.tags.except("comment") %>
 
   <div class="row">
     <div class="col">
index 7e78a6895a59ddc0da7dedb136da0fa3157a8476..b789f721bc828eec29bbc7fc7da2303b6b6eb753 100644 (file)
@@ -25,9 +25,7 @@
       <% if changeset %>
         <%= t(".latest_edit_html", :ago => friendly_date_ago(changeset.created_at)) %>
         <% comment = changeset.tags["comment"].to_s == "" ? t("browse.no_comment") : changeset.tags["comment"] %>
-        <q><%= link_to(comment,
-                       { :controller => "browse", :action => "changeset", :id => changeset.id },
-                       { :title => t("changesets.changeset.view_changeset_details") }) %></q>
+        <q><%= link_to comment, changeset_path(changeset), :title => t("changesets.changeset.view_changeset_details") %></q>
       <% else %>
        <%= t "changesets.changeset.no_edits" %>
       <% end %>
index 2f1e4d016f717f96bb0f133456acea3e1348af62..616e350d3056a877107d156c5b7eec163cd3ad95 100644 (file)
@@ -334,7 +334,6 @@ en:
     common_details:
       coordinates_html: "%{latitude}, %{longitude}"
     changeset:
-      title: "Changeset: %{id}"
       belongs_to: "Author"
       node: "Nodes (%{count})"
       node_paginated: "Nodes (%{x}-%{y} of %{count})"
@@ -342,13 +341,6 @@ en:
       way_paginated: "Ways (%{x}-%{y} of %{count})"
       relation: "Relations (%{count})"
       relation_paginated: "Relations (%{x}-%{y} of %{count})"
-      hidden_comment_by_html: "Hidden comment from %{user} %{time_ago}"
-      comment_by_html: "Comment from %{user} %{time_ago}"
-      changesetxml: "Changeset XML"
-      osmchangexml: "osmChange XML"
-      join_discussion: "Log in to join the discussion"
-      discussion: Discussion
-      still_open: "Changeset still open - discussion will open once the changeset is closed."
     node:
       title_html: "Node: %{name}"
       history_title_html: "Node History: %{name}"
@@ -477,6 +469,15 @@ en:
       title: "No such changeset"
       heading: "No entry with the id: %{id}"
       body: "Sorry, there is no changeset with the id %{id}. Please check your spelling, or maybe the link you clicked is wrong."
+    show:
+      title: "Changeset: %{id}"
+      discussion: Discussion
+      join_discussion: "Log in to join the discussion"
+      still_open: "Changeset still open - discussion will open once the changeset is closed."
+      comment_by_html: "Comment from %{user} %{time_ago}"
+      hidden_comment_by_html: "Hidden comment from %{user} %{time_ago}"
+      changesetxml: "Changeset XML"
+      osmchangexml: "osmChange XML"
     timeout:
       sorry: "Sorry, the list of changesets you requested took too long to retrieve."
   changeset_comments:
index af5730d21ddfd2ce02ee550f5e7bc2f0294d03ac..98184e0e176661cf5dbd4baa90e848a39918cf19 100644 (file)
@@ -118,7 +118,7 @@ OpenStreetMap::Application.routes.draw do
   get "/relation/:id" => "browse#relation", :id => /\d+/, :as => :relation
   get "/relation/:id/history" => "browse#relation_history", :id => /\d+/, :as => :relation_history
   resources :old_relations, :path => "/relation/:id/history", :id => /\d+/, :version => /\d+/, :param => :version, :only => :show
-  get "/changeset/:id" => "browse#changeset", :as => :changeset, :id => /\d+/
+  resources :changesets, :path => "changeset", :id => /\d+/, :only => :show
   get "/changeset/:id/comments/feed" => "changeset_comments#index", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" }
   resources :notes, :path => "note", :only => [:show, :new]
 
index 2bb743636ce9d5f5845d0922ddf8a65c5eecf06a..e74345f6af2016da308ec1c2ca042581366cfed0 100644 (file)
@@ -28,10 +28,6 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
       { :path => "/relation/1/history", :method => :get },
       { :controller => "browse", :action => "relation_history", :id => "1" }
     )
-    assert_routing(
-      { :path => "/changeset/1", :method => :get },
-      { :controller => "browse", :action => "changeset", :id => "1" }
-    )
     assert_routing(
       { :path => "/query", :method => :get },
       { :controller => "browse", :action => "query" }
@@ -40,7 +36,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_read_relation
     relation = create(:relation)
-    browse_check :relation_path, relation.id, "browse/feature"
+    sidebar_browse_check :relation_path, relation.id, "browse/feature"
     assert_select "h4", /^Version/ do
       assert_select "a[href='#{old_relation_path relation, 1}']", :text => "1", :count => 1
     end
@@ -51,7 +47,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_multiple_version_relation_links
     relation = create(:relation, :with_history, :version => 2)
-    browse_check :relation_path, relation.id, "browse/feature"
+    sidebar_browse_check :relation_path, relation.id, "browse/feature"
     assert_select ".secondary-actions a[href='#{relation_history_path relation}']", :count => 1
     assert_select ".secondary-actions a[href='#{old_relation_path relation, 1}']", :count => 1
     assert_select ".secondary-actions a[href='#{old_relation_path relation, 2}']", :count => 1
@@ -59,7 +55,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_read_relation_history
     relation = create(:relation, :with_history)
-    browse_check :relation_history_path, relation.id, "browse/history"
+    sidebar_browse_check :relation_history_path, relation.id, "browse/history"
     assert_select "h4", /^Version/ do
       assert_select "a[href='#{old_relation_path relation, 1}']", :text => "1", :count => 1
     end
@@ -67,7 +63,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_read_way
     way = create(:way)
-    browse_check :way_path, way.id, "browse/feature"
+    sidebar_browse_check :way_path, way.id, "browse/feature"
     assert_select "h4", /^Version/ do
       assert_select "a[href='#{old_way_path way, 1}']", :text => "1", :count => 1
     end
@@ -78,7 +74,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_multiple_version_way_links
     way = create(:way, :with_history, :version => 2)
-    browse_check :way_path, way.id, "browse/feature"
+    sidebar_browse_check :way_path, way.id, "browse/feature"
     assert_select ".secondary-actions a[href='#{way_history_path way}']", :count => 1
     assert_select ".secondary-actions a[href='#{old_way_path way, 1}']", :count => 1
     assert_select ".secondary-actions a[href='#{old_way_path way, 2}']", :count => 1
@@ -86,7 +82,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_read_way_history
     way = create(:way, :with_history)
-    browse_check :way_history_path, way.id, "browse/history"
+    sidebar_browse_check :way_history_path, way.id, "browse/history"
     assert_select "h4", /^Version/ do
       assert_select "a[href='#{old_way_path way, 1}']", :text => "1", :count => 1
     end
@@ -94,7 +90,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_read_node
     node = create(:node)
-    browse_check :node_path, node.id, "browse/feature"
+    sidebar_browse_check :node_path, node.id, "browse/feature"
     assert_select "h4", /^Version/ do
       assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
     end
@@ -105,7 +101,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_multiple_version_node_links
     node = create(:node, :with_history, :version => 2)
-    browse_check :node_path, node.id, "browse/feature"
+    sidebar_browse_check :node_path, node.id, "browse/feature"
     assert_select ".secondary-actions a[href='#{node_history_path node}']", :count => 1
     assert_select ".secondary-actions a[href='#{old_node_path node, 1}']", :count => 1
     assert_select ".secondary-actions a[href='#{old_node_path node, 2}']", :count => 1
@@ -113,7 +109,7 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_read_deleted_node
     node = create(:node, :visible => false)
-    browse_check :node_path, node.id, "browse/feature"
+    sidebar_browse_check :node_path, node.id, "browse/feature"
     assert_select "h4", /^Version/ do
       assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
     end
@@ -122,35 +118,12 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
 
   def test_read_node_history
     node = create(:node, :with_history)
-    browse_check :node_history_path, node.id, "browse/history"
+    sidebar_browse_check :node_history_path, node.id, "browse/history"
     assert_select "h4", /^Version/ do
       assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
     end
   end
 
-  def test_read_changeset
-    user = create(:user)
-    changeset = create(:changeset, :user => user)
-    create(:changeset, :user => user)
-    browse_check :changeset_path, changeset.id, "browse/changeset"
-  end
-
-  def test_read_private_changeset
-    user = create(:user)
-    changeset = create(:changeset, :user => create(:user, :data_public => false))
-    create(:changeset, :user => user)
-    browse_check :changeset_path, changeset.id, "browse/changeset"
-  end
-
-  def test_read_changeset_element_links
-    changeset = create(:changeset)
-    node = create(:node, :with_history, :changeset => changeset)
-
-    browse_check :changeset_path, changeset.id, "browse/changeset"
-    assert_dom "a[href='#{node_path node}']", :count => 1
-    assert_dom "a[href='#{old_node_path node, 1}']", :count => 1
-  end
-
   ##
   #  Methods to check redaction.
   #
@@ -234,42 +207,4 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
     assert_response :success
     assert_template "browse/query"
   end
-
-  private
-
-  # This is a convenience method for most of the above checks
-  # First we check that when we don't have an id, it will correctly return a 404
-  # then we check that we get the correct 404 when a non-existant id is passed
-  # then we check that it will get a successful response, when we do pass an id
-  def browse_check(path, id, template)
-    path_method = method(path)
-
-    assert_raise ActionController::UrlGenerationError do
-      get path_method.call
-    end
-
-    assert_raise ActionController::UrlGenerationError do
-      get path_method.call(:id => -10) # we won't have an id that's negative
-    end
-
-    get path_method.call(:id => 0)
-    assert_response :not_found
-    assert_template "browse/not_found"
-    assert_template :layout => "map"
-
-    get path_method.call(:id => 0), :xhr => true
-    assert_response :not_found
-    assert_template "browse/not_found"
-    assert_template :layout => "xhr"
-
-    get path_method.call(:id => id)
-    assert_response :success
-    assert_template template
-    assert_template :layout => "map"
-
-    get path_method.call(:id => id), :xhr => true
-    assert_response :success
-    assert_template template
-    assert_template :layout => "xhr"
-  end
 end
index a0747a0cdd16dea2df9e65f931e759e69dcd8040..14aa743b6278bd9be1c245ba8e79d7c2cab4b441 100644 (file)
@@ -4,6 +4,10 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
   ##
   # test all routes which lead to this controller
   def test_routes
+    assert_routing(
+      { :path => "/changeset/1", :method => :get },
+      { :controller => "changesets", :action => "show", :id => "1" }
+    )
     assert_routing(
       { :path => "/user/name/history", :method => :get },
       { :controller => "changesets", :action => "index", :display_name => "name" }
@@ -252,6 +256,37 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
     assert_response :success
   end
 
+  def test_show
+    changeset = create(:changeset)
+    create(:changeset_tag, :changeset => changeset, :k => "comment", :v => "tested-changeset-comment")
+    commenting_user = create(:user)
+    changeset_comment = create(:changeset_comment, :changeset => changeset, :author => commenting_user, :body => "Unwanted comment")
+
+    sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
+    assert_dom "h2", :text => "Changeset: #{changeset.id}"
+    assert_dom "p", :text => "tested-changeset-comment"
+    assert_dom "li#c#{changeset_comment.id}" do
+      assert_dom "> small", :text => /^Comment from #{commenting_user.display_name}/
+    end
+  end
+
+  def test_show_private_changeset
+    user = create(:user)
+    changeset = create(:changeset, :user => create(:user, :data_public => false))
+    create(:changeset, :user => user)
+
+    sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
+  end
+
+  def test_show_element_links
+    changeset = create(:changeset)
+    node = create(:node, :with_history, :changeset => changeset)
+
+    sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
+    assert_dom "a[href='#{node_path node}']", :count => 1
+    assert_dom "a[href='#{old_node_path node, 1}']", :count => 1
+  end
+
   ##
   # This should display the last 20 non-empty changesets
   def test_feed
index cc155155fb7673771cf6c35e6a51afd7cbbdc5d2..eff9ce0938182fab6512c06ccb54ba33b312d13a 100644 (file)
@@ -147,7 +147,7 @@ class SiteControllerTest < ActionDispatch::IntegrationTest
 
     get permalink_path(:code => "wBz3--", :changeset => 4)
     assert_response :redirect
-    assert_redirected_to :controller => :browse, :action => :changeset, :id => 4, :anchor => "map=3/4.8779296875/3.955078125"
+    assert_redirected_to changeset_path(:id => 4, :anchor => "map=3/4.8779296875/3.955078125")
   end
 
   # Test the key page
index 60edf6e0c25a56caabe8a2bbb193b10d304fd86f..1d04f57da0c9cee215350f95e8a1e7a6e0b5118f 100644 (file)
@@ -383,5 +383,41 @@ module ActiveSupport
     ensure
       unfreeze_time
     end
+
+    # This is a convenience method for checks of resources rendered in a map view sidebar
+    # First we check that when we don't have an id, it will correctly return a 404
+    # then we check that we get the correct 404 when a non-existant id is passed
+    # then we check that it will get a successful response, when we do pass an id
+    def sidebar_browse_check(path, id, template)
+      path_method = method(path)
+
+      assert_raise ActionController::UrlGenerationError do
+        get path_method.call
+      end
+
+      assert_raise ActionController::UrlGenerationError do
+        get path_method.call(:id => -10) # we won't have an id that's negative
+      end
+
+      get path_method.call(:id => 0)
+      assert_response :not_found
+      assert_template "browse/not_found"
+      assert_template :layout => "map"
+
+      get path_method.call(:id => 0), :xhr => true
+      assert_response :not_found
+      assert_template "browse/not_found"
+      assert_template :layout => "xhr"
+
+      get path_method.call(:id => id)
+      assert_response :success
+      assert_template template
+      assert_template :layout => "map"
+
+      get path_method.call(:id => id), :xhr => true
+      assert_response :success
+      assert_template template
+      assert_template :layout => "xhr"
+    end
   end
 end