Move folder #804

This commit is contained in:
Karel Picman 2017-11-16 12:25:53 +01:00
parent e0f07b25f0
commit ca822c2cab
28 changed files with 601 additions and 295 deletions

View File

@ -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],

View File

@ -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

View File

@ -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

View File

@ -1,6 +1,7 @@
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011 Vít Jonáš <vit.jonas@gmail.com>
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
#
# 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

View File

@ -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})

View File

@ -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)

View File

@ -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),

View File

@ -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| %>
<div class="box tabular">
<p>
<%= 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)) %>
</p>
<p>
<%= 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))) %>
</p>
</div>
<p>
<%= submit_tag(l(:button_copy)) %>
<% if !@file.locked? && User.current.allowed_to?(:file_manipulation, @project) %>
<%= submit_tag(l(:button_move), :id => 'move_button') %>
<% end %>
</p>
<% end %>
<% end %>
<script type="text/javascript">
$('#move_button').click(function(event) {
$('#copyForm').attr('action', "<%= url_for(:action => 'move', :id => @file) %>");
$('#copyForm').submit();
});
$('#target_project_id').change(function () {
$('#content').load("<%= url_for(:action => 'new') %>", $('#copyForm').serialize());
});
$('#target_project_id').select2();
$('#target_folder_id').select2();
</script>
<%= 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
}) %>

View File

@ -0,0 +1,58 @@
<%
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
#
# 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| %>
<div class="box tabular">
<p>
<%= label_tag('target_project_id', l(:field_target_project)) %>
<%= select_tag('target_project_id',
project_tree_options_for_select(projects, :selected => target_project)) %>
</p>
<p>
<%= 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))) %>
</p>
</div>
<p>
<%= 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 %>
</p>
<% end %>
<% end %>
<script type="text/javascript">
$('#move_button').click(function(event) {
$('#copyForm').attr('action', "<%= url_for(:action => 'move', :id => file_or_folder) %>");
$('#copyForm').submit();
});
$('#target_project_id').change(function () {
$('#content').load("<%= url_for(:action => 'new') %>", $('#copyForm').serialize());
});
$('#target_project_id').select2();
$('#target_folder_id').select2();
</script>

View File

@ -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| %>
<div class="box tabular">
<p>
<label for="target_project_id"><%= l(:field_target_project) %>:</label>
<%= select_tag('target_project_id',
project_tree_options_for_select(DmsfFolder.allowed_target_projects_on_copy, :selected => @target_project)) %>
</p>
<p>
<%= 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))) %>
</p>
</div>
<%= submit_tag(l(:button_copy)) %>
<% end %>
<% end %>
<script type="text/javascript">
$('#target_project_id').change(function () {
$('#content').load("<%= url_for(:action => 'new') %>", $('#copyForm').serialize());
});
$('#target_project_id').select2();
$('#target_folder_id').select2();
</script>
<%= 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
}) %>

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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."

View File

@ -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.

View File

@ -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.

View File

@ -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。"

View File

@ -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.

View File

@ -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.

View File

@ -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 означает отсутствие ограничений. Значение в мегабайтах."

View File

@ -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.

View File

@ -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 表示沒有限制。

View File

@ -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.

View File

@ -103,7 +103,7 @@ if Redmine::Plugin.installed? :redmine_dmsf
# files_copy controller
# /dmsf/files/<file id>/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/<folder id>/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'
#

View File

@ -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

View File

@ -0,0 +1,188 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
#
# 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

View File

@ -0,0 +1,186 @@
# encoding: utf-8
#
# Redmine plugin for Document Management System "Features"
#
# Copyright (C) 2011-17 Karel Pičman <karel.picman@kontron.com>
#
# 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