From: Anton Khorev Date: Sat, 4 Nov 2023 18:14:29 +0000 (+0300) Subject: Add link to unredacted element history for moderators X-Git-Tag: live~218^2~4 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/533816a3c2b373dbf1ea67c7071890ee27e18aa9 Add link to unredacted element history for moderators --- diff --git a/app/controllers/browse_controller.rb b/app/controllers/browse_controller.rb index 88871a9e1..e842d4872 100644 --- a/app/controllers/browse_controller.rb +++ b/app/controllers/browse_controller.rb @@ -6,6 +6,7 @@ class BrowseController < ApplicationController before_action -> { check_database_readable(:need_api => true) } before_action :require_oauth before_action :update_totp, :only => [:query] + before_action :require_moderator_for_unredacted_history, :only => [:relation_history, :way_history, :node_history] around_action :web_timeout authorize_resource :class => false @@ -77,4 +78,10 @@ class BrowseController < ApplicationController end def query; end + + private + + def require_moderator_for_unredacted_history + deny_access(nil) if params[:show_redactions] && !current_user&.moderator? + end end diff --git a/app/views/browse/feature.html.erb b/app/views/browse/feature.html.erb index cd333d3bf..9ee9f807f 100644 --- a/app/views/browse/feature.html.erb +++ b/app/views/browse/feature.html.erb @@ -18,6 +18,10 @@ · <% end %> <%= link_to t("browse.view_history"), :action => "#{@type}_history" %> + <% if current_user&.moderator? %> + · + <%= link_to(t("browse.view_unredacted_history"), :action => "#{@type}_history", :params => { :show_redactions => true }) %> + <% end %> <% if @feature.version > 1 %> · <%= link_to({ :controller => "old_#{@type.pluralize}", :action => :show, :version => @feature.version }, :class => "icon-link") do %> diff --git a/app/views/browse/history.html.erb b/app/views/browse/history.html.erb index bf11e8f1e..b557c339b 100644 --- a/app/views/browse/history.html.erb +++ b/app/views/browse/history.html.erb @@ -8,4 +8,11 @@ <%= link_to(t("browse.download_xml"), :controller => "api/old_#{@type.pluralize}", :action => "history") %> · <%= link_to(t("browse.view_details"), :action => @type) %> + <% if params[:show_redactions] %> + · + <%= link_to(t("browse.view_history"), :action => "#{@type}_history") %> + <% elsif current_user&.moderator? %> + · + <%= link_to(t("browse.view_unredacted_history"), :action => "#{@type}_history", :params => { :show_redactions => true }) %> + <% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 2f1e4d016..a674487a6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -329,6 +329,7 @@ en: other: "%{count} ways" download_xml: "Download XML" view_history: "View History" + view_unredacted_history: "View Unredacted History" view_details: "View Details" location: "Location:" common_details: diff --git a/test/controllers/browse_controller_test.rb b/test/controllers/browse_controller_test.rb index 2bb743636..a6fd3ef8d 100644 --- a/test/controllers/browse_controller_test.rb +++ b/test/controllers/browse_controller_test.rb @@ -235,6 +235,87 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest assert_template "browse/query" end + def test_anonymous_user_feature_page_secondary_actions + node = create(:node, :with_history) + get node_path(:id => node) + assert_response :success + assert_select ".secondary-actions a", :text => "View Details", :count => 0 + assert_select ".secondary-actions a", :text => "View History", :count => 1 + assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0 + end + + def test_regular_user_feature_page_secondary_actions + session_for(create(:user)) + node = create(:node, :with_history) + get node_path(:id => node) + assert_response :success + assert_select ".secondary-actions a", :text => "View Details", :count => 0 + assert_select ".secondary-actions a", :text => "View History", :count => 1 + assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0 + end + + def test_moderator_user_feature_page_secondary_actions + session_for(create(:moderator_user)) + node = create(:node, :with_history) + get node_path(:id => node) + assert_response :success + assert_select ".secondary-actions a", :text => "View Details", :count => 0 + assert_select ".secondary-actions a", :text => "View History", :count => 1 + assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 1 + end + + def test_anonymous_user_history_page_secondary_actions + node = create(:node, :with_history) + get node_history_path(:id => node) + assert_response :success + assert_select ".secondary-actions a", :text => "View Details", :count => 1 + assert_select ".secondary-actions a", :text => "View History", :count => 0 + assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0 + end + + def test_regular_user_history_page_secondary_actions + session_for(create(:user)) + node = create(:node, :with_history) + get node_history_path(:id => node) + assert_response :success + assert_select ".secondary-actions a", :text => "View Details", :count => 1 + assert_select ".secondary-actions a", :text => "View History", :count => 0 + assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0 + end + + def test_moderator_user_history_page_secondary_actions + session_for(create(:moderator_user)) + node = create(:node, :with_history) + get node_history_path(:id => node) + assert_response :success + assert_select ".secondary-actions a", :text => "View Details", :count => 1 + assert_select ".secondary-actions a", :text => "View History", :count => 0 + assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 1 + end + + def test_anonymous_user_unredacted_history_page_secondary_actions + node = create(:node, :with_history) + get node_history_path(:id => node, :params => { :show_redactions => true }) + assert_response :redirect + end + + def test_regular_user_unredacted_history_page_secondary_actions + session_for(create(:user)) + node = create(:node, :with_history) + get node_history_path(:id => node, :params => { :show_redactions => true }) + assert_response :redirect + end + + def test_moderator_user_unredacted_history_page_secondary_actions + session_for(create(:moderator_user)) + node = create(:node, :with_history) + get node_history_path(:id => node, :params => { :show_redactions => true }) + assert_response :success + assert_select ".secondary-actions a", :text => "View Details", :count => 1 + assert_select ".secondary-actions a", :text => "View History", :count => 1 + assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0 + end + private # This is a convenience method for most of the above checks