diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index e2bd9777..84b08856 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -28,7 +28,7 @@ class DmsfController < ApplicationController before_action :authorize, except: [:expand_folder] before_action :find_folder, except: [:new, :create, :edit_root, :save_root, :add_email, :append_email, :autocomplete_for_user] - before_action :find_parent, only: [:new, :create] + before_action :find_parent, only: [:new, :create, :delete] before_action :permissions # Also try to lookup folder by title if this is an API call before_action :find_folder_by_title, only: [:show] @@ -284,7 +284,7 @@ class DmsfController < ApplicationController if commit redirect_to :back else - redirect_to dmsf_folder_path(id: @project, folder_id: @folder.dmsf_folder) + redirect_to dmsf_folder_path(id: @project, folder_id: @parent) end end format.api { result ? render_api_ok : render_validation_errors(@folder) } diff --git a/app/controllers/dmsf_files_controller.rb b/app/controllers/dmsf_files_controller.rb index f7e346a1..a0fc0a35 100644 --- a/app/controllers/dmsf_files_controller.rb +++ b/app/controllers/dmsf_files_controller.rb @@ -26,6 +26,7 @@ class DmsfFilesController < ApplicationController before_action :find_file, except: [:delete_revision, :obsolete_revision] before_action :find_revision, only: [:delete_revision, :obsolete_revision] + before_action :find_folder, only: [:delete, :create_revision] before_action :authorize before_action :permissions @@ -224,7 +225,7 @@ class DmsfFilesController < ApplicationController end respond_to do |format| format.html do - redirect_to dmsf_folder_path(id: @project, folder_id: @file.dmsf_folder) + redirect_to dmsf_folder_path(id: @project, folder_id: @folder) end format.api { result ? render_api_ok : render_validation_errors(@file) } end @@ -347,6 +348,12 @@ class DmsfFilesController < ApplicationController render_404 end + def find_folder + @folder = DmsfFolder.find params[:folder_id] if params[:folder_id].present? + rescue ActiveRecord::RecordNotFound + render_404 + end + def check_project(entry) if entry && entry.project != @project raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) diff --git a/app/controllers/dmsf_links_controller.rb b/app/controllers/dmsf_links_controller.rb index d2359238..bdd0e3f6 100644 --- a/app/controllers/dmsf_links_controller.rb +++ b/app/controllers/dmsf_links_controller.rb @@ -25,6 +25,7 @@ class DmsfLinksController < ApplicationController before_action :find_model_object, only: [:destroy, :restore] before_action :find_link_project + before_action :find_folder, only: [:destroy] before_action :authorize before_action :permissions @@ -150,7 +151,7 @@ class DmsfLinksController < ApplicationController respond_to do |format| format.html { if params[:dmsf_link][:type] == 'link_from' - redirect_to dmsf_folder_path(id: @project.id, folder_id: @dmsf_link.dmsf_folder_id) + redirect_to dmsf_folder_path(id: @project, folder_id: @dmsf_link.dmsf_folder_id) else if params[:dmsf_link][:dmsf_file_id].present? redirect_to dmsf_file_path(@dmsf_link.target_file) @@ -172,16 +173,14 @@ class DmsfLinksController < ApplicationController if @dmsf_link.delete(commit) flash[:notice] = l(:notice_successful_delete) else - @dmsf_link.errors.each do |_, msg| - flash[:error] = msg - end + flash[:error] = @dmsf_link.errors.full_messages.to_sentence end end rescue => e errors[:base] << e.message return false end - redirect_back fallback_location: dmsf_folder_path(id: @project, folder_id: @dmsf_link&.dmsf_folder) + redirect_back fallback_location: dmsf_folder_path(id: @project, folder_id: @folder) end def restore @@ -216,4 +215,10 @@ class DmsfLinksController < ApplicationController render_404 end + def find_folder + @folder = DmsfFolder.find params[:folder_id] if params[:folder_id].present? + rescue ActiveRecord::RecordNotFound + render_404 + end + end diff --git a/app/views/dmsf/_query_list.html.erb b/app/views/dmsf/_query_list.html.erb index 18cf89cb..5f495808 100644 --- a/app/views/dmsf/_query_list.html.erb +++ b/app/views/dmsf/_query_list.html.erb @@ -23,7 +23,7 @@ <% query_options = nil unless defined?(query_options) %> <% query_options ||= {} %> -<%= form_tag({}, data: { cm_url: query.deleted ? dmsf_trash_context_menu_path : dmsf_context_menu_path }) do %> +<%= form_tag({}, data: { cm_url: query.deleted ? dmsf_trash_context_menu_path : dmsf_context_menu_path(folder_id: folder) }) do %> <%= hidden_field_tag 'back_url', url_for(params: request.query_parameters), id: nil %> <%= query_columns_hidden_tags(query) %>
diff --git a/app/views/dmsf/show.html.erb b/app/views/dmsf/show.html.erb index 0821a29e..cf4c8d23 100644 --- a/app/views/dmsf/show.html.erb +++ b/app/views/dmsf/show.html.erb @@ -73,7 +73,7 @@ <% if @dmsf_count == 0 %>

<%= l(:label_no_data) %>

<% else %> - <%= render partial: 'query_list', locals: { query: @query, dmsf_pages: @dmsf_pages } %> + <%= render partial: 'query_list', locals: { query: @query, dmsf_pages: @dmsf_pages, folder: @folder } %> <%= pagination_links_full @dmsf_pages, @dmsf_count %> <% end %> <% end %> diff --git a/app/views/dmsf_context_menus/_file.html.erb b/app/views/dmsf_context_menus/_file.html.erb index 1f0a738e..4d4cbbfa 100644 --- a/app/views/dmsf_context_menus/_file.html.erb +++ b/app/views/dmsf_context_menus/_file.html.erb @@ -31,8 +31,7 @@ <% unless dmsf_link %>
  • <%= link_to l(:label_link_to), - new_dmsf_link_path(project_id: project.id, - dmsf_folder_id: dmsf_file.dmsf_folder ? dmsf_file.dmsf_folder.id : nil, + new_dmsf_link_path(project_id: project.id, dmsf_folder_id: dmsf_file.dmsf_folder&.id, dmsf_file_id: dmsf_file.id, type: 'link_to'), title: l(:title_create_link), class: 'icon icon-link' %>
  • @@ -80,7 +79,8 @@ disabled: url.blank? || locked %>
  • - <%= context_menu_link l(:button_delete), dmsf_link ? dmsf_link_path(dmsf_link) : dmsf_file_path(dmsf_file), - method: :delete, class: 'icon icon-del', data: { confirm: l(:text_are_you_sure) }, - id: 'dmsf-cm-delete', disabled: !allowed || locked %> + <%= context_menu_link l(:button_delete), + dmsf_link ? dmsf_link_path(id: dmsf_link, folder_id: folder) : dmsf_file_path(id: dmsf_file, folder_id: folder), + method: :delete, class: 'icon icon-del', data: { confirm: l(:text_are_you_sure) }, id: 'dmsf-cm-delete', + disabled: !allowed || locked %>
  • diff --git a/app/views/dmsf_context_menus/_folder.html.erb b/app/views/dmsf_context_menus/_folder.html.erb index e24ba4ad..9d507af5 100644 --- a/app/views/dmsf_context_menus/_folder.html.erb +++ b/app/views/dmsf_context_menus/_folder.html.erb @@ -59,13 +59,13 @@ id: 'dmsf-cm-download', disabled: false %>
  • - <%= context_menu_link l(:field_mail), entries_operations_dmsf_path(id: @project, folder_id: folder, + <%= context_menu_link l(:field_mail), entries_operations_dmsf_path(id: project, folder_id: folder, ids: params[:ids], email_entries: true), method: :post, class: 'icon icon-email', disabled: !email_allowed %>
  • <%= context_menu_link l(:button_delete), - dmsf_link ? dmsf_link_path(dmsf_link) : delete_dmsf_path(id: project, folder_id: dmsf_folder), - data: { confirm: l(:text_are_you_sure) }, method: :delete, class: 'icon icon-del', id: 'dmsf-cm-delete', - disabled: !allowed || locked %> + dmsf_link ? dmsf_link_path(id: dmsf_link, folder_id: folder) : delete_dmsf_path(id: project, folder_id: dmsf_folder, parent_id: folder), + data: { confirm: l(:text_are_you_sure) }, method: :delete, class: 'icon icon-del', id: 'dmsf-cm-delete', + disabled: !allowed || locked %>
  • diff --git a/test/fixtures/dmsf_links.yml b/test/fixtures/dmsf_links.yml index b9729b66..2ac82314 100644 --- a/test/fixtures/dmsf_links.yml +++ b/test/fixtures/dmsf_links.yml @@ -57,6 +57,7 @@ url_link: target_type: DmsfUrl name: url_link project_id: 1 + dmsf_folder_id: 1 external_url: 'https://www.kontron.com' deleted: 0 deleted_by_user_id: NULL diff --git a/test/functional/dmsf_controller_test.rb b/test/functional/dmsf_controller_test.rb index 9fce9c4b..c622f7af 100644 --- a/test/functional/dmsf_controller_test.rb +++ b/test/functional/dmsf_controller_test.rb @@ -107,9 +107,15 @@ class DmsfControllerTest < RedmineDmsf::Test::TestCase def test_delete_ok # Empty and not locked folder - @request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1.id, folder_id: @folder1.id) - get :delete, params: { id: @project1, folder_id: @folder1.id, commit: false } - assert_response :redirect + @request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder) + get :delete, params: { id: @project1, folder_id: @folder1, parent_id: @folder1.dmsf_folder, commit: false } + assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1.dmsf_folder) + end + + def test_delete_subfolder + @request.env['HTTP_REFERER'] = dmsf_folder_path(id: @project1, folder_id: @folder2.dmsf_folder) + get :delete, params: { id: @project1, folder_id: @folder2, parent_id: @folder2.dmsf_folder, commit: false } + assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder2.dmsf_folder) end def test_restore_forbidden diff --git a/test/functional/dmsf_files_controller_test.rb b/test/functional/dmsf_files_controller_test.rb index 92d5be1d..60465bdf 100644 --- a/test/functional/dmsf_files_controller_test.rb +++ b/test/functional/dmsf_files_controller_test.rb @@ -58,13 +58,13 @@ class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase get :show, params: { id: @file1.id } assert_response :forbidden end - + def test_view_file_ok # Permissions OK get :view, params: { id: @file1.id } assert_response :success end - + def test_view_file_forbidden # Missing permissions @role_manager.remove_permission! :view_dmsf_files @@ -75,22 +75,26 @@ class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase def delete_forbidden # Missing permissions @role_manager.remove_permission! :file_manipulation - delete @file1, params: { commit: false } + delete :delete, params: { id: @file1, folder_id: @file1.dmsf_folder, commit: false } assert_response :forbidden end def delete_locked # Permissions OK but the file is locked - delete @file2, params: { commit: false } + delete :delete, params: { id: @file2, folder_id: @file2.dmsf_folder, commit: false } assert_response :redirect assert_include l(:error_file_is_locked), flash[:error] end def delete_ok # Permissions OK and not locked - delete @file1, params: { commit: false } - assert_response :redirect - assert_equal 0, flash[:error].size + delete :delete, params: { id: @file1, folder_id: @file1.dmsf_folder, commit: false } + assert_redirected_to dmsf_folder_path(id: @file1.project, folder_id: @file1.dmsf_folder) + end + + def test_delete_in_subfolder + delete :delete, params: { id: @file4, folder_id: @file4.dmsf_folder, commit: false } + assert_redirected_to dmsf_folder_path(id: @file4.project, folder_id: @file4.dmsf_folder) end def test_obsolete_revision_ok diff --git a/test/functional/dmsf_links_controller_test.rb b/test/functional/dmsf_links_controller_test.rb index 6a3a9d65..7dac03b2 100644 --- a/test/functional/dmsf_links_controller_test.rb +++ b/test/functional/dmsf_links_controller_test.rb @@ -29,6 +29,7 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase def setup super @file_link = DmsfLink.find 1 + @url_link = DmsfLink.find 5 @request.session[:user_id] = @jsmith.id end @@ -93,7 +94,7 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id, folder_id: @folder1.id) + assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1) end def test_create_file_link_from_f2 @@ -109,14 +110,14 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id, folder_id: @folder1.id) + assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1) end def test_create_file_link_from_f3 # 3. File link in a root folder from another folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, + project_id: @project1, target_project_id: @project2.id, target_file_id: @file6.id, target_folder_id: @folder3.id, @@ -124,85 +125,85 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id) + assert_redirected_to dmsf_folder_path(id: @project1) end def test_create_file_link_from_f4 # 4. File link in a root folder from another root folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, + project_id: @project1, target_project_id: @project2.id, target_file_id: @file2.id, name: 'file_link', type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id) + assert_redirected_to dmsf_folder_path(id: @project1) end def test_create_folder_link_from_d1 # 1. Folder link in a folder from another folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, - dmsf_folder_id: @folder1.id, + project_id: @project1, + dmsf_folder_id: @folder1, target_project_id: @project2.id, target_folder_id: @folder3.id, name: 'folder_link', type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id, folder_id: @folder1.id) + assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1) end def test_create_folder_link_from_d2 # 2. Folder link in a folder from another root folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, - dmsf_folder_id: @folder1.id, + project_id: @project1, + dmsf_folder_id: @folder1, target_project_id: @project2.id, name: 'folder_link', type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id, folder_id: @folder1.id) + assert_redirected_to dmsf_folder_path(id: @project1, folder_id: @folder1) end def test_create_folder_link_from_d3 # 3. Folder link in a root folder from another folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, + project_id: @project1, target_project_id: @project2.id, target_folder_id: @folder3.id, name: 'folder_link', type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id) + assert_redirected_to dmsf_folder_path(id: @project1) end def test_create_folder_link_from_d4 # 4. Folder link in a root folder from another root folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, + project_id: @project1, target_project_id: @project2.id, name: 'folder_link', type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id) + assert_redirected_to dmsf_folder_path(id: @project1) end def test_create_file_link_to_f1 # 1. File link to a root folder from another folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, - dmsf_file_id: @file1.id, + project_id: @project1, + dmsf_file_id: @file1, target_project_id: @project2.id, target_folder_id: @folder3.id, name: 'file_link', @@ -216,8 +217,8 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase # 2. File link to a folder from another folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project2.id, - dmsf_folder_id: @folder3.id, + project_id: @project2, + dmsf_folder_id: @folder3, target_project_id: @project1.id, target_folder_id: @folder1.id, dmsf_file_id: @file6.id, @@ -232,7 +233,7 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase # 3. File link to a root folder from another root folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project2.id, + project_id: @project2, target_project_id: @project1.id, dmsf_file_id: @file6.id, name: 'file_link', @@ -246,8 +247,8 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase # 4. File link to a folder from another root folder assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project2.id, - dmsf_folder_id: @folder3.id, + project_id: @project2, + dmsf_folder_id: @folder3, target_project_id: @project1.id, dmsf_file_id: @file6.id, name: 'file_link', @@ -260,14 +261,14 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase def test_create_external_link_from assert_difference 'DmsfLink.count', +1 do post :create, params: { dmsf_link: { - project_id: @project1.id, + project_id: @project1, target_project_id: @project1.id, name: 'file_link', external_link: 'true', type: 'link_from' }} end - assert_redirected_to dmsf_folder_path(id: @project1.id) + assert_redirected_to dmsf_folder_path(id: @project1) end def test_create_folder_link_to_f1 @@ -301,23 +302,30 @@ class DmsfLinksControllerTest < RedmineDmsf::Test::TestCase def test_destroy assert_difference 'DmsfLink.visible.count', -1 do - delete :destroy, params: { project_id: @project1.id, id: @file_link.id } + delete :destroy, params: { project_id: @project1, id: @file_link } end - assert_redirected_to dmsf_folder_path(id: @file_link&.project, folder_id: @file_link&.dmsf_folder) + assert_redirected_to dmsf_folder_path(id: @file_link.project, folder_id: @file_link.dmsf_folder) + end + + def test_destroy_in_subfolder + assert_difference 'DmsfLink.visible.count', -1 do + delete :destroy, params: { project_id: @url_link.project, id: @url_link, folder_id: @url_link.dmsf_folder } + end + assert_redirected_to dmsf_folder_path(id: @url_link.project, folder_id: @url_link.dmsf_folder) end def test_restore_forbidden # Missing permissions - @request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1.id) + @request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1) @role_manager.remove_permission! :file_manipulation - get :restore, params: { project_id: @project1.id, id: @file_link.id } + get :restore, params: { project_id: @project1, id: @file_link } assert_response :forbidden end def test_restore_ok # Permissions OK - @request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1.id) - get :restore, params: { project_id: @project1.id, id: @file_link.id } + @request.env['HTTP_REFERER'] = trash_dmsf_path(id: @project1) + get :restore, params: { project_id: @project1, id: @file_link } assert_response :redirect end