From ca822c2cabff7aa0690e6d46641dcaee61f6f3da Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Thu, 16 Nov 2017 12:25:53 +0100 Subject: [PATCH] Move folder #804 --- after_init.rb | 10 +- app/controllers/dmsf_controller.rb | 2 - app/controllers/dmsf_files_copy_controller.rb | 114 +++++------ .../dmsf_folders_copy_controller.rb | 104 ++++++---- app/models/dmsf_file.rb | 6 +- app/models/dmsf_folder.rb | 16 +- app/views/dmsf/edit.html.erb | 2 +- app/views/dmsf_files_copy/new.html.erb | 54 +---- app/views/dmsf_folders_copy/_form.html.erb | 58 ++++++ app/views/dmsf_folders_copy/new.html.erb | 41 +--- config/locales/cs.yml | 7 - config/locales/de.yml | 7 - config/locales/en.yml | 9 +- config/locales/es.yml | 7 - config/locales/fr.yml | 11 +- config/locales/hu.yml | 7 - config/locales/it.yml | 7 - config/locales/ja.yml | 7 - config/locales/pl.yml | 7 - config/locales/pt-BR.yml | 7 - config/locales/ru.yml | 7 - config/locales/sl.yml | 7 - config/locales/zh-TW.yml | 9 +- config/locales/zh.yml | 9 +- config/routes.rb | 6 +- test/functional/dmsf_files_controller_test.rb | 1 + .../dmsf_files_copy_controller_test.rb | 188 ++++++++++++++++++ .../dmsf_folders_copy_controller_test.rb | 186 +++++++++++++++++ 28 files changed, 601 insertions(+), 295 deletions(-) create mode 100644 app/views/dmsf_folders_copy/_form.html.erb create mode 100644 test/functional/dmsf_files_copy_controller_test.rb create mode 100644 test/functional/dmsf_folders_copy_controller_test.rb diff --git a/after_init.rb b/after_init.rb index 57a8f8a7..97643d10 100644 --- a/after_init.rb +++ b/after_init.rb @@ -21,15 +21,13 @@ def init pmap.permission :view_dmsf_file_revisions, :read => true pmap.permission :view_dmsf_folders, - {:dmsf => [:show], - :dmsf_folders_copy => [:new, :copy_to, :move_to]}, + {:dmsf => [:show]}, :read => true pmap.permission :user_preferences, {:dmsf_state => [:user_pref_save]} pmap.permission :view_dmsf_files, {:dmsf => [:entries_operation, :entries_email, :download_email_entries, :tag_changed], :dmsf_files => [:show, :view, :thumbnail], - :dmsf_files_copy => [:new, :create, :move], :dmsf_workflows => [:log]}, :read => true pmap.permission :email_documents, @@ -37,14 +35,16 @@ def init pmap.permission :folder_manipulation, {:dmsf => [:new, :create, :delete, :edit, :save, :edit_root, :save_root, :lock, :unlock, :notify_activate, :notify_deactivate, :restore], - :dmsf_folder_permissions => [:new, :append, :autocomplete_for_user]} + :dmsf_folder_permissions => [:new, :append, :autocomplete_for_user], + :dmsf_folders_copy => [:new, :copy, :move]} pmap.permission :file_manipulation, {:dmsf_files => [:create_revision, :lock, :unlock, :delete_revision, :notify_activate, :notify_deactivate, :restore], :dmsf_upload => [:upload_files, :upload_file, :upload, :commit_files, :commit, :delete_dmsf_attachment, :delete_dmsf_link_attachment], :dmsf_links => [:new, :create, :destroy, :restore, :autocomplete_for_project, - :autocomplete_for_folder] + :autocomplete_for_folder], + :dmsf_files_copy => [:new, :copy, :move], } pmap.permission :file_delete, { :dmsf => [:trash, :delete_entries], diff --git a/app/controllers/dmsf_controller.rb b/app/controllers/dmsf_controller.rb index fb31f17b..436f4da3 100644 --- a/app/controllers/dmsf_controller.rb +++ b/app/controllers/dmsf_controller.rb @@ -549,8 +549,6 @@ class DmsfController < ApplicationController def find_parent @parent = DmsfFolder.visible.find params[:parent_id] if params[:parent_id].present? - rescue DmsfAccessError - render_403 rescue ActiveRecord::RecordNotFound render_404 end diff --git a/app/controllers/dmsf_files_copy_controller.rb b/app/controllers/dmsf_files_copy_controller.rb index 65f3689d..ae18854b 100644 --- a/app/controllers/dmsf_files_copy_controller.rb +++ b/app/controllers/dmsf_files_copy_controller.rb @@ -24,89 +24,83 @@ class DmsfFilesCopyController < ApplicationController before_action :find_file before_action :authorize - before_action :permissions - - helper :all - - def permissions - if @file - render_403 unless DmsfFolder.permissions?(@file.dmsf_folder) - end - true - end + before_action :find_target_folder + before_action :check_target_folder, :only => [:copy, :move] def new - @target_project = DmsfFile.allowed_target_projects_on_copy.detect {|p| p.id.to_s == params[:target_project_id]} if params[:target_project_id] - @target_project ||= @project if User.current.allowed_to?(:file_manipulation, @project) - if DmsfFile.allowed_target_projects_on_copy.blank? - flash.now[:warning] = l(:warning_no_project_to_copy_file_to) - else - @target_project ||= DmsfFile.allowed_target_projects_on_copy[0] - end - + @projects = DmsfFile.allowed_target_projects_on_copy + @folders = DmsfFolder.directory_tree(@target_project, @folder) @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank? - @target_folder ||= @file.dmsf_folder if @target_project == @project - render :layout => !request.xhr? end - def create - @target_project = DmsfFile.allowed_target_projects_on_copy.detect {|p| p.id.to_s == params[:target_project_id]} if params[:target_project_id] - unless @target_project - render_403 - return - end - @target_folder = DmsfFolder.visible.find_by_id(params[:target_folder_id]) unless params[:target_folder_id].blank? - if @target_folder && (@target_folder.project != @target_project) - raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) - end - if (@target_folder && @target_folder == @file.dmsf_folder) || - (@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project) - flash[:error] = l(:error_target_folder_same) - redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder - return - end + def copy new_file = @file.copy_to(@target_project, @target_folder) unless new_file.errors.empty? - flash[:error] = "#{l(:error_file_cannot_be_copied)}: #{new_file.errors.full_messages.join(', ')}" - redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder + flash[:error] = new_file.errors.full_messages.join(', ') + redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, + :target_folder_id => @target_folder return end - flash[:notice] = l(:notice_file_copied) + flash[:notice] = l(:notice_successful_update) redirect_to dmsf_file_path(new_file) end def move - @target_project = DmsfFile.allowed_target_projects_on_copy.detect {|p| p.id.to_s == params[:target_project_id]} if params[:target_project_id] - unless @target_project && User.current.allowed_to?(:file_manipulation, @target_project) && User.current.allowed_to?(:file_manipulation, @project) - render_403 - return - end - @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank? - if @target_folder && @target_folder.project != @target_project - raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) - end - if (@target_folder && @target_folder == @file.dmsf_folder) || - (@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project) - flash[:error] = l(:error_target_folder_same) - redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder - return - end unless @file.move_to(@target_project, @target_folder) - flash[:error] = "#{l(:error_file_cannot_be_moved)}: #{@file.errors.full_messages.join(', ')}" - redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, :target_folder_id => @target_folder + flash[:error] = @file.errors.full_messages.join(', ') + redirect_to :action => 'new', :id => @file, :target_project_id => @target_project, + :target_folder_id => @target_folder return end - @file.reload - flash[:notice] = l(:notice_file_moved) + flash[:notice] = l(:notice_successful_update) redirect_to dmsf_file_path(@file) end private def find_file - @file = DmsfFile.visible.find_by_id params[:id] - @project = @file.project if @file + unless DmsfFile.where(:id => params[:id]).exists? + render_404 + return + end + @file = DmsfFile.visible.find params[:id] + @project = @file.project + rescue ActiveRecord::RecordNotFound + render_403 + end + + def find_target_folder + if params[:target_project_id].present? + @target_project = Project.find params[:target_project_id] + else + @target_project = @project + end + if params[:target_folder_id].present? + @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) + unless DmsfFolder.visible.where(params[:target_folder_id]).exists? + render_403 + return + end + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def check_target_folder + if (@target_folder && @target_folder == @file.dmsf_folder) || + (@target_folder.nil? && @file.dmsf_folder.nil? && @target_project == @file.project) + flash[:error] = l(:error_target_folder_same) + redirect_to :action => :new, :id => @file, :target_project_id => @target_project.id, + :target_folder_id => @target_folder + return + end + if (@target_folder && (@target_folder.locked_for_user? || !DmsfFolder.permissions?(@target_folder, false))) || + !@target_project.allows_to?(:file_manipulation) + raise DmsfAccessError + end + rescue DmsfAccessError + render_403 end end diff --git a/app/controllers/dmsf_folders_copy_controller.rb b/app/controllers/dmsf_folders_copy_controller.rb index 975628a0..1db820b3 100644 --- a/app/controllers/dmsf_folders_copy_controller.rb +++ b/app/controllers/dmsf_folders_copy_controller.rb @@ -1,6 +1,7 @@ # Redmine plugin for Document Management System "Features" # -# Copyright (C) 2011 Vít Jonáš +# Copyright (C) 2011 Vít Jonáš +# Copyright (C) 2011-17 Karel Pičman # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -23,60 +24,85 @@ class DmsfFoldersCopyController < ApplicationController before_action :find_folder before_action :authorize - before_action :permissions - - def permissions - render_403 unless DmsfFolder.permissions?(@folder) - true - end + before_action :find_target_folder + before_action :check_target_folder, :only => [:copy, :move] def new - @target_project = DmsfFolder.allowed_target_projects_on_copy.detect {|p| p.id.to_s == params[:target_project_id]} if params[:target_project_id] - @target_project ||= @project if User.current.allowed_to?(:folder_manipulation, @project) - if DmsfFile.allowed_target_projects_on_copy.blank? - flash.now[:warning] = l(:warning_no_project_to_copy_folder_to) - else - @target_project ||= DmsfFolder.allowed_target_projects_on_copy[0] - end - + @projects = DmsfFolder.allowed_target_projects_on_copy + @folders = DmsfFolder.directory_tree(@target_project, @folder) @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank? - @target_folder ||= @folder.dmsf_folder if @target_project == @project - render :layout => !request.xhr? end - def copy_to - @target_project = DmsfFile.allowed_target_projects_on_copy.detect {|p| p.id.to_s == params[:target_project_id]} if params[:target_project_id] - unless @target_project - render_403 - return - end - @target_folder = DmsfFolder.visible.find(params[:target_folder_id]) unless params[:target_folder_id].blank? - if !@target_folder.nil? && @target_folder.project != @target_project - raise DmsfAccessError, l(:error_entry_project_does_not_match_current_project) - end - if (@target_folder && @target_folder == @folder.dmsf_folder) || - (@target_folder.nil? && @folder.dmsf_folder.nil? && @target_project == @folder.project) - flash[:error] = l(:error_target_folder_same) - redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, :target_folder_id => @target_folder - return - end + def copy new_folder = @folder.copy_to(@target_project, @target_folder) unless new_folder.errors.empty? - flash[:error] = "#{l(:error_folder_cannot_be_copied)}: #{new_folder.errors.full_messages.join(', ')}" - redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, :target_folder_id => @target_folder + flash[:error] = new_folder.errors.full_messages.join(', ') + redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, + :target_folder_id => @target_folder return end - new_folder.reload - flash[:notice] = l(:notice_folder_copied) + flash[:notice] = l(:notice_successful_update) redirect_to dmsf_folder_path(:id => @target_project, :folder_id => new_folder) end + def move + @folder.project = @target_project + @folder.dmsf_folder = @target_folder + unless @folder.save + flash[:error] = @folder.errors.full_messages.join(', ') + redirect_to :action => 'new', :id => @folder, :target_project_id => @target_project, + :target_folder_id => @target_folder + else + flash[:notice] = l(:notice_successful_update) + redirect_to dmsf_folder_path(:id => @target_project, :folder_id => @folder) + end + end + private def find_folder - @folder = DmsfFolder.visible.find_by_id(params[:id]) - @project = @folder.project if @folder + unless DmsfFolder.where(:id => params[:id]).exists? + render_404 + return + end + @folder = DmsfFolder.visible.find params[:id] + @project = @folder.project + rescue ActiveRecord::RecordNotFound + render_403 + end + + def find_target_folder + if params[:target_project_id].present? + @target_project = Project.find params[:target_project_id] + else + @target_project = @project + end + if params[:target_folder_id].present? + @target_folder = DmsfFolder.find(params[:target_folder_id]) + unless DmsfFolder.visible.where(:id => params[:target_folder_id]).exists? + render_403 + return + end + end + rescue ActiveRecord::RecordNotFound + render_404 + end + + def check_target_folder + if (@target_folder && @target_folder == @folder.dmsf_folder) || + (@target_folder.nil? && @folder.dmsf_folder.nil? && @target_project == @folder.project) + flash[:error] = l(:error_target_folder_same) + redirect_to :action => :new, :id => @folder, :target_project_id => @target_project.id, + :target_folder_id => @target_folder + return + end + if (@target_folder && (@target_folder.locked_for_user? || !DmsfFolder.permissions?(@target_folder, false))) || + !@target_project.allows_to?(:folder_manipulation) + raise DmsfAccessError + end + rescue DmsfAccessError + render_403 end end diff --git a/app/models/dmsf_file.rb b/app/models/dmsf_file.rb index ea969158..8513b049 100644 --- a/app/models/dmsf_file.rb +++ b/app/models/dmsf_file.rb @@ -242,11 +242,12 @@ class DmsfFile < ActiveRecord::Base end # Must invalidate source parent folder cache before moving RedmineDmsf::Webdav::Cache.invalidate_item(propfind_cache_key) + source = "#{self.project.identifier}:#{self.dmsf_path_str}" self.project_id = project.id self.dmsf_folder = folder new_revision = self.last_revision.clone new_revision.dmsf_file = self - new_revision.comment = l(:comment_moved_from, :source => "#{self.project.identifier}:#{self.dmsf_path_str}") + new_revision.comment = l(:comment_moved_from, :source => source) new_revision.custom_values = [] self.last_revision.custom_values.each do |cv| new_revision.custom_values << CustomValue.new({:custom_field => cv.custom_field, :value => cv.value}) @@ -260,6 +261,7 @@ class DmsfFile < ActiveRecord::Base end def copy_to_filename(project, folder, filename) + source = "#{project.identifier}: #{self.dmsf_path_str}" file = DmsfFile.new file.dmsf_folder = folder file.project_id = project.id @@ -272,7 +274,7 @@ class DmsfFile < ActiveRecord::Base if File.exist? self.last_revision.disk_file FileUtils.cp self.last_revision.disk_file, new_revision.disk_file(false) end - new_revision.comment = l(:comment_copied_from, :source => "#{project.identifier}: #{self.dmsf_path_str}") + new_revision.comment = l(:comment_copied_from, :source => source) new_revision.custom_values = [] self.last_revision.custom_values.each do |cv| new_revision.custom_values << CustomValue.new({:custom_field => cv.custom_field, :value => cv.value}) diff --git a/app/models/dmsf_folder.rb b/app/models/dmsf_folder.rb index 95eac1f5..6b32fdbe 100644 --- a/app/models/dmsf_folder.rb +++ b/app/models/dmsf_folder.rb @@ -225,11 +225,12 @@ class DmsfFolder < ActiveRecord::Base project = Project.find_by_id project end tree = [[l(:link_documents), nil]] - DmsfFolder.where(:project_id => project.id).notsystem.visible(false).each do |folder| - unless folder == current_folder - tree.push(["...#{folder.title}", folder.id]) - DmsfFolder.directory_subtree(tree, folder, 2, current_folder) - end + folders = DmsfFolder.where(:project_id => project.id).notsystem.visible(false).to_a + folders.delete(current_folder) + folders = folders.delete_if{ |f| f.locked_for_user? } + folders.each do |folder| + tree.push(["...#{folder.title}", folder.id]) + DmsfFolder.directory_subtree(tree, folder, 2, current_folder) end return tree end @@ -580,7 +581,10 @@ class DmsfFolder < ActiveRecord::Base private def self.directory_subtree(tree, folder, level, current_folder) - DmsfFolder.where(:project_id => folder.project_id, :dmsf_folder_id => folder.id).notsystem.visible(false).each do |subfolder| + folders = DmsfFolder.where(:project_id => folder.project_id, :dmsf_folder_id => folder.id).notsystem.visible(false).to_a + folders.delete(current_folder) + folders.delete_if { |f| f.locked_for_user? } + folders.each do |subfolder| unless subfolder == current_folder tree.push(["#{'...' * level}#{subfolder.title}", subfolder.id]) DmsfFolder.directory_subtree(tree, subfolder, level + 1, current_folder) diff --git a/app/views/dmsf/edit.html.erb b/app/views/dmsf/edit.html.erb index 9e6fb06a..edb0dca8 100644 --- a/app/views/dmsf/edit.html.erb +++ b/app/views/dmsf/edit.html.erb @@ -50,7 +50,7 @@ <%= link_to(l(:label_link_to), new_dmsf_link_path(:project_id => @project.id, :dmsf_folder_id => @folder.id, :type => 'link_to'), :title => l(:title_create_link), :class => 'icon icon-link') %> - <%= link_to(l(:button_copy), copy_folder_path(:id => @folder), + <%= link_to("#{l(:button_copy)}/#{l(:button_move)}", copy_folder_path(:id => @folder), :title => l(:title_copy), :class => 'icon icon-copy') %> <% unless @folder.locked? %> <%= link_to(l(:button_delete), delete_dmsf_path(:id => @project, :folder_id => @folder), diff --git a/app/views/dmsf_files_copy/new.html.erb b/app/views/dmsf_files_copy/new.html.erb index 7f001d25..48e07bbd 100644 --- a/app/views/dmsf_files_copy/new.html.erb +++ b/app/views/dmsf_files_copy/new.html.erb @@ -22,47 +22,15 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. %> -<% html_title(l(:dmsf)) %> +<%= render(:partial => '/dmsf/path', :locals => { :folder => @file.dmsf_folder, :filename => @file.title, + :title => nil }) %> -<%= render(:partial => '/dmsf/path', - :locals => {:folder => @file.dmsf_folder, :filename => @file.title, - :title => "#{l(:button_copy)}/#{l(:button_move)}"}) %> - -<% if DmsfFile.allowed_target_projects_on_copy.present? %> - <%= form_tag({:action => 'create', :id => @file}, :id => 'copyForm') do |f| %> -
-

- <%= label_tag('target_project_id', l(:field_target_project)) %> - <%= select_tag('target_project_id', - project_tree_options_for_select(DmsfFile.allowed_target_projects_on_copy, - :selected => @target_project)) %> -

-

- <%= label_tag('target_folder_id', l(:field_target_folder)) %> - <%= select_tag('target_folder_id', - options_for_select(DmsfFolder.directory_tree(@target_project), - :selected => (@target_folder.id if @target_folder))) %> -

-
-

- <%= submit_tag(l(:button_copy)) %> - <% if !@file.locked? && User.current.allowed_to?(:file_manipulation, @project) %> - <%= submit_tag(l(:button_move), :id => 'move_button') %> - <% end %> -

- <% end %> -<% end %> - - \ No newline at end of file +<%= render(:partial => '/dmsf_folders_copy/form', :locals => { + :projects => @projects, + :project => @project, + :target_project => @target_project, + :folders => @folders, + :file_or_folder => @file, + :target_folder => @target_folder, + :permission => :file_manipulation +}) %> diff --git a/app/views/dmsf_folders_copy/_form.html.erb b/app/views/dmsf_folders_copy/_form.html.erb new file mode 100644 index 00000000..27d0723f --- /dev/null +++ b/app/views/dmsf_folders_copy/_form.html.erb @@ -0,0 +1,58 @@ +<% +# encoding: utf-8 +# +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011-17 Karel Pičman +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +%> + +<% if projects.present? %> + <%= form_tag({:action => 'copy', :id => file_or_folder}, :id => 'copyForm') do |f| %> +
+

+ <%= label_tag('target_project_id', l(:field_target_project)) %> + <%= select_tag('target_project_id', + project_tree_options_for_select(projects, :selected => target_project)) %> +

+

+ <%= label_tag('target_folder_id', l(:field_target_folder)) %> + <%= select_tag('target_folder_id', options_for_select(folders, + :selected => (target_folder.id if target_folder))) %> +

+
+

+ <%= submit_tag(l(:button_copy), :id => 'copy_button') %> + <% if !file_or_folder.locked? && User.current.allowed_to?(permission, project) %> + <%= submit_tag(l(:button_move), :id => 'move_button') %> + <% end %> +

+ <% end %> +<% end %> + + diff --git a/app/views/dmsf_folders_copy/new.html.erb b/app/views/dmsf_folders_copy/new.html.erb index 0ebf25d8..17a9299c 100644 --- a/app/views/dmsf_folders_copy/new.html.erb +++ b/app/views/dmsf_folders_copy/new.html.erb @@ -22,35 +22,14 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. %> -<% html_title(l(:dmsf)) %> +<%= render(:partial => '/dmsf/path', :locals => { :folder => @folder, :filename => nil, :title => nil }) %> -<%= render(:partial => '/dmsf/path', - :locals => {:folder => @folder, :filename => nil, :title => l(:button_copy)}) %> - -<% unless DmsfFolder.allowed_target_projects_on_copy.blank? %> - <%= form_tag({:action => 'copy_to', :id => @folder}, :id => 'copyForm') do |f| %> -
-

- - <%= select_tag('target_project_id', - project_tree_options_for_select(DmsfFolder.allowed_target_projects_on_copy, :selected => @target_project)) %> -

-

- <%= label_tag('target_folder_id', l(:field_target_folder)) %> - <%= select_tag('target_folder_id', - options_for_select(DmsfFolder.directory_tree(@target_project, @folder), - :selected => (@target_folder.id if @target_folder))) %> -

-
- <%= submit_tag(l(:button_copy)) %> - <% end %> -<% end %> - - \ No newline at end of file +<%= render(:partial => '/dmsf_folders_copy/form', :locals => { + :projects => @projects, + :project => @project, + :target_project => @target_project, + :folders => @folders, + :file_or_folder => @folder, + :target_folder => @target_folder, + :permission => :folder_manipulation + }) %> diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 013cfc12..8d363808 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -185,20 +185,13 @@ cs: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: Neexistuje projekt, do kterého můžete kopírovat comment_copied_from: "Zkopírováno z %{source}" - notice_file_copied: Soubor zkopírován - notice_file_moved: Soubor přesunut field_target_project: Cílový projekt field_target_folder: Cílová složka title_copy_or_move: Kopírovat/Přesunout label_dmsf_folder_plural: DMS Složky # Search options comment_moved_from: "Přesunuto z %{source}" error_target_folder_same: Cílový složka a projekt jsou stejné jako aktuální - error_file_cannot_be_moved: Soubor nemůže být přesunut - error_file_cannot_be_copied: Soubor nemůže být zkopírován - warning_no_project_to_copy_folder_to: Neexistuje projekt, do kterého můžete kopírovat title_copy: Kopírovat - error_folder_cannot_be_copied: Složka nemůže být zkopírována - notice_folder_copied: Složka zkopírována error_max_email_filesize_exceeded: "Přesáhli jste maximální velikost souboru, který lze poslat emailem. (%{number} MB)" note_maximum_email_filesize: Omezí se maximální velikost souboru, který může být poslán emailem. 0 znamená neomezený. Číslo je v MB. diff --git a/config/locales/de.yml b/config/locales/de.yml index f397900c..ba5a3d63 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -185,20 +185,13 @@ de: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: Kein Projekt, in das die Datei kopiert werden kann. comment_copied_from: "Kopiert aus %{source}" - notice_file_copied: Datei kopiert - notice_file_moved: Datei verschoben field_target_project: Zielprojekt field_target_folder: Zielordner title_copy_or_move: Kopieren/Verschieben label_dmsf_folder_plural: DMS Ordner # Search options comment_moved_from: "Verschoben aus %{source}" error_target_folder_same: Zielordner und Projekt sind dieselbe wie die aktuellen. - error_file_cannot_be_moved: Die Datei kann nicht verschoben werden. - error_file_cannot_be_copied: Die Datei kann nicht kopiert werden. - warning_no_project_to_copy_folder_to: Kein Projekt, in das der Ordner kopiert werden kann. title_copy: Kopieren - error_folder_cannot_be_copied: Der Ordner kann nicht kopiert werden. - notice_folder_copied: Ordner kopiert error_max_email_filesize_exceeded: "Maximale Dateigröße der Anlage wurde überschritten. (%{number} MB)" note_maximum_email_filesize: Maximale Dateigröße der Anhänge, die per E-mail verschickt werden können. 0 bedeutet keinen Limit. Angabe in MB. diff --git a/config/locales/en.yml b/config/locales/en.yml index 3a5581b4..755b0eee 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -185,20 +185,13 @@ en: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: No project to copy file to comment_copied_from: "Copied from %{source}" - notice_file_copied: File copied - notice_file_moved: File moved field_target_project: Target project field_target_folder: Target folder title_copy_or_move: Copy/Move label_dmsf_folder_plural: DMS Folders # Search options comment_moved_from: "Moved from %{source}" - error_target_folder_same: Target folder and project are the same as current - error_file_cannot_be_moved: "File can't be moved" - error_file_cannot_be_copied: "File can't be copied" - warning_no_project_to_copy_folder_to: No project to copy folder to + error_target_folder_same: Target folder and project are the same as the current one. title_copy: Copy - error_folder_cannot_be_copied: "Folder can't be copied" - notice_folder_copied: Folder copied error_max_email_filesize_exceeded: "You've exceeded the maximum filesize for sending via email. (%{number} MB)" note_maximum_email_filesize: Limits maximum filesize that can be sent via email. 0 means unlimited. Number is in MB. diff --git a/config/locales/es.yml b/config/locales/es.yml index 70375fdf..93b5ac47 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -185,20 +185,13 @@ es: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: No hay proyecto para copiar el archivo comment_copied_from: "Copiado desde %{source}" - notice_file_copied: Archivo copiado - notice_file_moved: Archivo movido field_target_project: Proyecto destino field_target_folder: Directorio destino title_copy_or_move: Copiar/Mover label_dmsf_folder_plural: DMS Directorio # Search options comment_moved_from: "Mover desde %{source}" error_target_folder_same: El directorio y proyecto destino son el actual - error_file_cannot_be_moved: "Los archivos no puesen ser movidos" - error_file_cannot_be_copied: "Los arvhicos no pueden ser copiados" - warning_no_project_to_copy_folder_to: No hay proyecto para copiar el directorio title_copy: Copiar - error_folder_cannot_be_copied: "El directorio no puede ser copiado" - notice_folder_copied: Directorio copiado error_max_email_filesize_exceeded: "Tamaño máximo de archivo excedido para ser enviado por email. (%{number} MB)" note_maximum_email_filesize: Límite máximo de archivo para ser enviado por email. 0 equivale a ilimitado. Unidad en MB. diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 89192845..58b7cbc6 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -185,20 +185,13 @@ fr: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: "Le projet de destination n'est pas défini" comment_copied_from: "Copie effectuée depuis %{source}" - notice_file_copied: Fichier copié - notice_file_moved: Fichier déplacé field_target_project: Projet cible field_target_folder: Dossier cible title_copy_or_move: Copie/Déplacement label_dmsf_folder_plural: DMS Les dossiers # Search options comment_moved_from: "Déplacé depuis %{source}" error_target_folder_same: Le projet et le dossier cible sont identiques au projet et dossier source - error_file_cannot_be_moved: Le fichier ne peut pas être déplacé - error_file_cannot_be_copied: Le fichier ne peut pas être copié - warning_no_project_to_copy_folder_to: "Le projet de destination n'est pas défini" title_copy: Copie - error_folder_cannot_be_copied: Le dossier ne peut pas être copié - notice_folder_copied: Dossier copié error_max_email_filesize_exceeded: "Vous avez dépassé la taille maximale des fichiers pouvant être transmis par mail (%{number} MB)" note_maximum_email_filesize: Taille maximale, en méga octets, des fichiers pouvant être transmis par mail. 0 indique aucune restriction @@ -347,7 +340,7 @@ fr: label_document_url: Url label_last_revision_id: Révision - + label_webdav_disable_versioning: Modèles de fichiers sans gestion de version note_webdav_disable_versioning: "Expression régulière qui désactive la gestion de version pour les fichiers correspondants. L'expression par défaut correspond aux fichiers temporaires créés par MsOffice." @@ -355,7 +348,7 @@ fr: note_dmsf_keep_documents_locked: Les documents seront maintenus verrouillés après approbation. note_global: (global) field_dmsf_not_inheritable: Ne peut être hérité - + label_webdav_use_project_names: Utiliser le nom de projet pour le dossier du projet note_webdav_use_project_names: "Utilise le nom du projet au lieu de l'identifiant projet pour le dossier du projet." diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 19e1d03c..eb740299 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -185,20 +185,13 @@ hu: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: Nincs projekt ahová másolható a fájl comment_copied_from: "Másolva %{source}" - notice_file_copied: Fájl másolva - notice_file_moved: Fájl áthelyezve field_target_project: Célprojekt field_target_folder: Cél mappa title_copy_or_move: Másolás/Elmozgatás label_dmsf_folder_plural: DMS Mappák # Search options comment_moved_from: "Elmozgatva %{source}" error_target_folder_same: A cél mappa és a projekt ugyanaz, mint a jelenlegi - error_file_cannot_be_moved: Fájl nem áthelyezhető - error_file_cannot_be_copied: Fájlt nem lehet másolni - warning_no_project_to_copy_folder_to: "Nincs projekt ahova a mappa másolható hibák miatt: %{files}" title_copy: Másolás - error_folder_cannot_be_copied: Mappa nem másolható - notice_folder_copied: Mappa másolásra került error_max_email_filesize_exceeded: "Túllépte a maximum fájlméretet ami emailen küldhető. (%{number} MB)" note_maximum_email_filesize: Korlátozza a maximális fájlméretet, amely küldhető email-ben. A 0 korlátlan méretet jelent, az érték MB-ban kerül megadásra. diff --git a/config/locales/it.yml b/config/locales/it.yml index 2c6a1e9c..a06b598d 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -185,20 +185,13 @@ it: # Italian strings thx 2 Matteo Arceci! project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: Nessun progetto nel quale copiare il documento comment_copied_from: "Copiato da %{source}" - notice_file_copied: Documento copiato - notice_file_moved: Documento spostato field_target_project: Progetto di destinazione field_target_folder: Cartella di destinazione title_copy_or_move: Copia/Sposta label_dmsf_folder_plural: DMS Cartelle # Search options comment_moved_from: "Spostato da %{source}" error_target_folder_same: La cartella di destinazione ed il progetto sono gli stessi di adesso - error_file_cannot_be_moved: "Il documento non può essere spostato" - error_file_cannot_be_copied: "Il documento non può essere copiato" - warning_no_project_to_copy_folder_to: Nessun progetto dove copiare la cartella title_copy: Copia - error_folder_cannot_be_copied: "La cartella non può essere copiata" - notice_folder_copied: Cartella copiata error_max_email_filesize_exceeded: "Hai superato la dimensione massima del file per l'invio tramite e-mail. (%{number} MB)" note_maximum_email_filesize: Limiti di dimensione massima dei file che possono essere inviati via e-mail. 0 significa illimitato. Il numero è in MB. diff --git a/config/locales/ja.yml b/config/locales/ja.yml index aa366299..9f513dc4 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -185,20 +185,13 @@ ja: project_module_dmsf: 文書管理 # Project module name warning_no_project_to_copy_file_to: ファイルをコピーするプロジェクトがありません comment_copied_from: "%{source} からコピーしました" - notice_file_copied: ファイルをコピーしました - notice_file_moved: ファイルを移動しました field_target_project: ターゲットプロジェクト field_target_folder: ターゲットフォルダ title_copy_or_move: コピー/移動 label_dmsf_folder_plural: DMS フォルダ # Search options comment_moved_from: "%{source} から移動しました" error_target_folder_same: コピー/移動先のフォルダとプロジェクトが現在と同じです - error_file_cannot_be_moved: ファイルを移動できません - error_file_cannot_be_copied: ファイルをコピーできません - warning_no_project_to_copy_folder_to: フォルダをコピーするプロジェクトがありません title_copy: コピー - error_folder_cannot_be_copied: フォルダをコピーできません - notice_folder_copied: フォルダをコピーしました error_max_email_filesize_exceeded: "電子メールで送信可能なファイルサイズの上限を越えています (%{number} MB)" note_maximum_email_filesize: "電子メールで送信可能なファイルサイズの上限。0は無制限。単位はMB。" diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 32b43f8d..0bbd6c73 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -185,20 +185,13 @@ pl: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: Brak projektu do skopiowania pliku comment_copied_from: "Skopiowano z %{source}" - notice_file_copied: Plik został skopiowany - notice_file_moved: Plik został przeniesiony field_target_project: Projekt docelowy field_target_folder: Folder docelowy title_copy_or_move: Kopiuj/Przenieś label_dmsf_folder_plural: DMS Foldery # Search options comment_moved_from: "Przeniesiono z %{source}" error_target_folder_same: Docelowy projekt i folder są identyczne z obecnym - error_file_cannot_be_moved: "Plik nie może zostać przeniesiony" - error_file_cannot_be_copied: "Plik nie może zostać skopiowany" - warning_no_project_to_copy_folder_to: No project to copy folder to title_copy: Kopiuj - error_folder_cannot_be_copied: "Folder nie może zostać skopiowany" - notice_folder_copied: Folder został skopiowany error_max_email_filesize_exceeded: "Maksymalny rozmiar pliku załącznika email został przekroczony. (%{number} MB)" note_maximum_email_filesize: Maksymalny rozmiar pliku, który może zostać wysłany przez email. 0 oznacza brak ograniczeń. Rozmiar w MB. diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 2be4dc13..07bdc292 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -185,20 +185,13 @@ pt-BR: project_module_dmsf: DMS warning_no_project_to_copy_file_to: Nenhum projeto para cópia do arquivo comment_copied_from: "Copiado de %{source}" - notice_file_copied: Arquivo copiado - notice_file_moved: Arquivo movido field_target_project: Projeto de destino field_target_folder: Pasta de destino title_copy_or_move: Copiar / Mover label_dmsf_folder_plural: DMS Pastas # Search options comment_moved_from: "Mover de %{source}" error_target_folder_same: A pasta e o projeto alvo são os mesmos que os atuais - error_file_cannot_be_moved: "Arquivo não pode ser movido" - error_file_cannot_be_copied: "Arquivo não pode ser copiado" - warning_no_project_to_copy_folder_to: Nenhum projeto para cópia da pasta title_copy: Copiar - error_folder_cannot_be_copied: "Pasta não pode ser copiada" - notice_folder_copied: Pasta copiada error_max_email_filesize_exceeded: "Você excedeu o tamanho máximo do arquivo para enviar via e-mail. (%{number} MB)" note_maximum_email_filesize: Limita o tamanho máximo de arquivos que pode ser enviado por e-mail. 0 significa ilimitado. O número está em MB. diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 714b7b47..14ee162d 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -185,20 +185,13 @@ ru: project_module_dmsf: DMS # Project module name warning_no_project_to_copy_file_to: Не выбран проект, в который нужно скопировать файл comment_copied_from: "Скопировано из %{source}" - notice_file_copied: Файл скопирован - notice_file_moved: Файл перемещен field_target_project: Целевой проект field_target_folder: Целевая папка title_copy_or_move: Копировать/Переместить label_dmsf_folder_plural: DMS Папки # Search options comment_moved_from: "Перемещен из %{source}" error_target_folder_same: Целевая папка и проект совпадают с текущими - error_file_cannot_be_moved: Файл не может быть перемещен - error_file_cannot_be_copied: Файл не может быть скопирован - warning_no_project_to_copy_folder_to: Не выбран проект, в который нужно скопировать папку title_copy: Копировать - error_folder_cannot_be_copied: Папка не может быть скопирована - notice_folder_copied: Папка скопирована error_max_email_filesize_exceeded: "Вы превысили максимальный размер для отправки по электронной почте. (%{number} Мб)" note_maximum_email_filesize: "Ограничение максимального размера файла, который можно отправить по электронной почте. 0 означает отсутствие ограничений. Значение в мегабайтах." diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 32b485c1..5a2beaf0 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -185,20 +185,13 @@ sl: project_module_dmsf: Arhiv # Project module name warning_no_project_to_copy_file_to: Ni projekta kamor bi kopiral datoteko comment_copied_from: "Skopirano iz %{source}" - notice_file_copied: Datoteka skopirana - notice_file_moved: Datoteka premaknjena field_target_project: Ciljni projekt field_target_folder: Ciljna mapa title_copy_or_move: Kopiraj/Premakni label_dmsf_folder_plural: DMS Arhivske mape # Search options comment_moved_from: "Premaknjeno iz %{source}" error_target_folder_same: Ciljna mapa in projekt sta ista kot izvorna (trenutna) - error_file_cannot_be_moved: Datoteka ne more biti premaknjena - error_file_cannot_be_copied: Datoteko ni možno skopirati - warning_no_project_to_copy_folder_to: Ni projekta v katerega bi skopiral mapo title_copy: Kopiraj - error_folder_cannot_be_copied: Mapo se ne da skopirati - notice_folder_copied: Mapa skopirana error_max_email_filesize_exceeded: "Presegli ste največjo velikost datoteke za pošiljanje po email-u. (%{number} MB)" note_maximum_email_filesize: Omejitev največje velikosti datoteke, ki se lahko pošlje po email-u. 0 pomeni neomejeno. Količina je v MB. diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 4e83fa55..d09a42d1 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -185,20 +185,13 @@ zh-TW: project_module_dmsf: 文件總管 # Project module name warning_no_project_to_copy_file_to: No project to copy file to comment_copied_from: "Copied from %{source}" - notice_file_copied: File copied - notice_file_moved: File moved field_target_project: Target project field_target_folder: Target folder title_copy_or_move: Copy/Move label_dmsf_folder_plural: DMS Folders # Search options comment_moved_from: "Moved from %{source}" - error_target_folder_same: Target folder and project are the same as current - error_file_cannot_be_moved: "File can't be moved" - error_file_cannot_be_copied: "File can't be copied" - warning_no_project_to_copy_folder_to: No project to copy folder to + error_target_folder_same: Target folder and project are the same as the current one. title_copy: Copy - error_folder_cannot_be_copied: "Folder can't be copied" - notice_folder_copied: Folder copied error_max_email_filesize_exceeded: "己經超出Email所能允許的最大檔案大小。 (%{number} MB)" note_maximum_email_filesize: 限制Email所允許的最大檔案大小。 0 表示沒有限制。 diff --git a/config/locales/zh.yml b/config/locales/zh.yml index dd33de62..11c0119c 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -185,20 +185,13 @@ zh: project_module_dmsf: 文档管家 # Project module name warning_no_project_to_copy_file_to: No project to copy file to comment_copied_from: "Copied from %{source}" - notice_file_copied: File copied - notice_file_moved: File moved field_target_project: Target project field_target_folder: Target folder title_copy_or_move: Copy/Move label_dmsf_folder_plural: DMS Folders # Search options comment_moved_from: "Moved from %{source}" - error_target_folder_same: Target folder and project are the same as current - error_file_cannot_be_moved: "File can't be moved" - error_file_cannot_be_copied: "File can't be copied" - warning_no_project_to_copy_folder_to: No project to copy folder to + error_target_folder_same: Target folder and project are the same as the current one. title_copy: Copy - error_folder_cannot_be_copied: "Folder can't be copied" - notice_folder_copied: Folder copied error_max_email_filesize_exceeded: "You've exceeded the maximum filesize for sending via email. (%{number} MB)" note_maximum_email_filesize: Limits maximum filesize that can be sent via email. 0 means unlimited. Number is in MB. diff --git a/config/routes.rb b/config/routes.rb index d4d78c82..f6adb688 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -103,7 +103,7 @@ if Redmine::Plugin.installed? :redmine_dmsf # files_copy controller # /dmsf/files//copy ## - post '/dmsf/files/:id/copy/create', :controller => 'dmsf_files_copy', :action => 'create' + post '/dmsf/files/:id/copy/copy', :controller => 'dmsf_files_copy', :action => 'copy' post '/dmsf/files/:id/copy/move', :controller => 'dmsf_files_copy', :action => 'move' get '/dmsf/files/:id/copy', :controller => 'dmsf_files_copy', :action => 'new', :as => 'copy_file' @@ -111,8 +111,8 @@ if Redmine::Plugin.installed? :redmine_dmsf # folders_copy controller # /dmsf/folders//copy ## - #verify :method => :post, :only => [:copy_to], :render => { :nothing => true, :status => :method_not_allowed } - post '/dmsf/folders/:id/copy/to', :controller => 'dmsf_folders_copy', :action => 'copy_to' + post '/dmsf/folders/:id/copy/copy', :controller => 'dmsf_folders_copy', :action => 'copy' + post '/dmsf/folders/:id/copy/move', :controller => 'dmsf_folders_copy', :action => 'move' get '/dmsf/folders/:id/copy', :controller => 'dmsf_folders_copy', :action => 'new', :as => 'copy_folder' # diff --git a/test/functional/dmsf_files_controller_test.rb b/test/functional/dmsf_files_controller_test.rb index 3c9e104f..1b8b72fd 100644 --- a/test/functional/dmsf_files_controller_test.rb +++ b/test/functional/dmsf_files_controller_test.rb @@ -38,6 +38,7 @@ class DmsfFilesControllerTest < RedmineDmsf::Test::TestCase end def test_truth + assert_kind_of Project, @project assert_kind_of DmsfFile, @file assert_kind_of Role, @role end diff --git a/test/functional/dmsf_files_copy_controller_test.rb b/test/functional/dmsf_files_copy_controller_test.rb new file mode 100644 index 00000000..1de3ac0f --- /dev/null +++ b/test/functional/dmsf_files_copy_controller_test.rb @@ -0,0 +1,188 @@ +# encoding: utf-8 +# +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011-17 Karel Pičman +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class DmsfFilesCopyControllerTest < RedmineDmsf::Test::TestCase + include Redmine::I18n + + fixtures :users, :dmsf_files, :dmsf_file_revisions, + :custom_fields, :custom_values, :projects, :roles, :members, :member_roles, + :enabled_modules, :dmsf_file_revisions, :dmsf_folders + + def setup + @project1 = Project.find_by_id 1 + @project2 = Project.find_by_id 2 + @project5 = Project.find_by_id 5 + assert_not_nil @project1 + @project1.enable_module! :dmsf + @file1 = DmsfFile.find_by_id 1 + @folder1 = DmsfFolder.find_by_id 1 + @user_admin = User.find_by_id 1 + @user_member = User.find_by_id 2 + @user_non_member = User.find_by_id 3 + @role_manager = Role.where(:name => 'Manager').first + User.current = nil + @request.session[:user_id] = 2 # John Smith - manager + Setting.plugin_redmine_dmsf['dmsf_storage_directory'] = File.expand_path '../../fixtures/files', __FILE__ + @project1.enable_module!(:dmsf) + @role_manager.add_permission! :file_manipulation + @role_manager.add_permission! :view_dmsf_folders + end + + def test_truth + assert_kind_of Project, @project1 + assert_kind_of Project, @project2 + assert_kind_of Project, @project5 + assert_kind_of DmsfFile, @file1 + assert_kind_of DmsfFolder, @folder1 + assert_kind_of User, @user_admin + assert_kind_of User, @user_member + assert_kind_of User, @user_non_member + assert_kind_of Role, @role_manager + end + + def test_authorize_admin + @request.session[:user_id] = @user_admin.id + get :new, :id => @file1.id + assert_response :success + assert_template 'new' + end + + def test_authorize_non_member + @request.session[:user_id] = @user_non_member.id + get :new, :id => @file1.id + assert_response :forbidden + end + + def test_authorize_member_no_module + @project1.disable_module!(:dmsf) + get :new, :id => @file1.id + assert_response :forbidden + end + + def test_authorize_forbidden + @role_manager.remove_permission! :file_manipulation + get :new, :id => @file1.id + assert_response :forbidden + end + + def test_target_folder + get :new, :id => @file1.id, :target_folder_id => @folder1.id + assert_response :success + assert_template 'new' + end + + def test_target_folder_forbidden + @role_manager.remove_permission! :view_dmsf_folders + get :new, :id => @file1.id, :target_folder_id => @folder1.id + assert_response :not_found + end + + def test_target_project + get :new, :id => @file1.id, :target_project_id => @project1.id + assert_response :success + assert_template 'new' + end + + def test_new + get :new, :id => @file1.id + assert_response :success + assert_template 'new' + end + + def test_copy + post :copy, :id => @file1.id, :target_project_id => @project1.id, :target_folder_id => @folder1.id + assert_response :redirect + assert_nil flash[:error] + end + + def test_copy_the_same_target + post :copy, :id => @file1.id, :target_project_id => @file1.project.id, :target_folder_id => @file1.dmsf_folder + assert_equal flash[:error], l(:error_target_folder_same) + assert_redirected_to :action => 'new', :target_project_id => @file1.project.id, :target_folder_id => @file1.dmsf_folder + end + + def test_copy_to_locked_folder + @folder1.lock! + post :copy, :id => @file1.id, :target_project_id => @file1.project.id, :target_folder_id => @folder1.id + assert_response :forbidden + end + + def test_copy_to_dmsf_not_enabled + post :copy, :id => @file1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :forbidden + end + + def test_copy_to_dmsf_enabled + @project5.enable_module!(:dmsf) + post :copy, :id => @file1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :redirect + assert_nil flash[:error] + end + + def test_copy_to_as_non_member + post :copy, :id => @file1.id, :target_project_id => @project2.id, :target_folder_id => nil + assert_response :forbidden + end + + def test_move + post :move, :id => @file1.id, :target_project_id => @project1.id, :target_folder_id => @folder1.id + assert_response :redirect + assert_nil flash[:error] + end + + def test_move_the_same_target + post :move, :id => @file1.id, :target_project_id => @file1.project.id, :target_folder_id => @file1.dmsf_folder + assert_equal flash[:error], l(:error_target_folder_same) + assert_redirected_to :action => 'new', :target_project_id => @file1.project.id, :target_folder_id => @file1.dmsf_folder + end + + def test_move_to_locked + @file1.lock! + post :move, :id => @file1.id, :target_project_id => @file1.project.id, :target_folder_id => @folder1.id + assert_response :redirect + assert_equal l(:error_file_is_locked), flash[:error] + end + + def test_move_to_locked_folder + @folder1.lock! + post :move, :id => @file1.id, :target_project_id => @file1.project.id, :target_folder_id => @folder1.id + assert_response :forbidden + end + + def test_move_to_dmsf_not_enabled + post :move, :id => @file1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :forbidden + end + + def test_move_to_dmsf_enabled + @project5.enable_module!(:dmsf) + post :move, :id => @file1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :redirect + assert_nil flash[:error] + end + + def test_move_to_as_non_member + post :move, :id => @file1.id, :target_project_id => @project2.id, :target_folder_id => nil + assert_response :forbidden + end + +end \ No newline at end of file diff --git a/test/functional/dmsf_folders_copy_controller_test.rb b/test/functional/dmsf_folders_copy_controller_test.rb new file mode 100644 index 00000000..a38f2e03 --- /dev/null +++ b/test/functional/dmsf_folders_copy_controller_test.rb @@ -0,0 +1,186 @@ +# encoding: utf-8 +# +# Redmine plugin for Document Management System "Features" +# +# Copyright (C) 2011-17 Karel Pičman +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require File.expand_path('../../test_helper', __FILE__) + +class DmsfFoldersCopyControllerTest < RedmineDmsf::Test::TestCase + include Redmine::I18n + + fixtures :users, :projects, :roles, :members, :member_roles,:enabled_modules, :dmsf_folders + + def setup + @project1 = Project.find_by_id 1 + @project2 = Project.find_by_id 2 + @project5 = Project.find_by_id 5 + assert_not_nil @project1 + @project1.enable_module! :dmsf + @folder1 = DmsfFolder.find_by_id 1 + @folder2 = DmsfFolder.find_by_id 2 + @folder6 = DmsfFolder.find_by_id 6 + @user_admin = User.find_by_id 1 + @user_member = User.find_by_id 2 + @user_non_member = User.find_by_id 3 + @role_manager = Role.where(:name => 'Manager').first + User.current = nil + @request.session[:user_id] = 2 # John Smith - manager + Setting.plugin_redmine_dmsf['dmsf_storage_directory'] = File.expand_path '../../fixtures/files', __FILE__ + @project1.enable_module!(:dmsf) + @role_manager.add_permission! :folder_manipulation + @role_manager.add_permission! :view_dmsf_folders + end + + def test_truth + assert_kind_of Project, @project1 + assert_kind_of Project, @project2 + assert_kind_of Project, @project5 + assert_kind_of DmsfFolder, @folder1 + assert_kind_of DmsfFolder, @folder2 + assert_kind_of DmsfFolder, @folder6 + assert_kind_of User, @user_admin + assert_kind_of User, @user_member + assert_kind_of User, @user_non_member + assert_kind_of Role, @role_manager + end + + def test_authorize_admin + @request.session[:user_id] = @user_admin.id + get :new, :id => @folder1.id + assert_response :success + assert_template 'new' + end + + def test_authorize_non_member + @request.session[:user_id] = @user_non_member.id + get :new, :id => @folder1.id + assert_response :forbidden + end + + def test_authorize_member_no_module + @project1.disable_module!(:dmsf) + get :new, :id => @folder1.id + assert_response :forbidden + end + + def test_authorize_forbidden + @role_manager.remove_permission! :folder_manipulation + get :new, :id => @folder1.id + assert_response :forbidden + end + + def test_target_folder + get :new, :id => @folder1.id, :target_folder_id => @folder2.id + assert_response :success + assert_template 'new' + end + + def test_target_folder_forbidden + @role_manager.remove_permission! :view_dmsf_folders + get :new, :id => @folder1.id, :target_folder_id => @folder2.id + assert_response :forbidden + end + + def test_target_project + get :new, :id => @folder1.id, :target_project_id => @project1.id + assert_response :success + assert_template 'new' + end + + def test_new + get :new, :id => @folder1.id + assert_response :success + assert_template 'new' + end + + def test_copy + post :copy, :id => @folder1.id, :target_project_id => @project1.id, :target_folder_id => @folder6.id + assert_response :redirect + assert_nil flash[:error] + end + + def test_copy_the_same_target + post :copy, :id => @folder1.id, :target_project_id => @folder1.project.id, :target_folder_id => @folder1.dmsf_folder + assert_equal flash[:error], l(:error_target_folder_same) + assert_redirected_to :action => 'new', :target_project_id => @folder1.project.id, + :target_folder_id => @folder1.dmsf_folder + end + + def test_copy_to_locked_folder + post :copy, :id => @folder1.id, :target_project_id => @folder1.project.id, :target_folder_id => @folder2.id + assert_response :forbidden + end + + def test_copy_to_dmsf_not_enabled + post :copy, :id => @folder1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :forbidden + end + + def test_copy_to_dmsf_enabled + @project5.enable_module!(:dmsf) + post :copy, :id => @folder1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :redirect + assert_nil flash[:error] + end + + def test_copy_to_as_non_member + post :copy, :id => @folder1.id, :target_project_id => @project2.id, :target_folder_id => nil + assert_response :forbidden + end + + def test_move + post :move, :id => @folder1.id, :target_project_id => @project1.id, :target_folder_id => @folder6.id + assert_response :redirect + assert_nil flash[:error] + end + + def test_move_the_same_target + post :move, :id => @folder1.id, :target_project_id => @folder1.project.id, :target_folder_id => @folder1.dmsf_folder + assert_equal flash[:error], l(:error_target_folder_same) + assert_redirected_to :action => 'new', :target_project_id => @folder1.project.id, :target_folder_id => @folder1.dmsf_folder + end + + def test_move_to_locked + @folder1.lock! + post :move, :id => @folder1.id, :target_project_id => @folder1.project.id, :target_folder_id => @folder2.id + assert_response :forbidden + end + + def test_move_to_locked_folder + post :move, :id => @folder1.id, :target_project_id => @folder2.project.id, :target_folder_id => @folder2.id + assert_response :forbidden + end + + def test_move_to_dmsf_not_enabled + post :move, :id => @folder1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :forbidden + end + + def test_move_to_dmsf_enabled + @project5.enable_module!(:dmsf) + post :move, :id => @folder1.id, :target_project_id => @project5.id, :target_folder_id => nil + assert_response :redirect + assert_nil flash[:error] + end + + def test_move_to_as_non_member + post :move, :id => @folder1.id, :target_project_id => @project2.id, :target_folder_id => nil + assert_response :forbidden + end + +end \ No newline at end of file