Empty system folders #1491
This commit is contained in:
parent
0604fe3983
commit
90f8f48683
@ -79,6 +79,8 @@ class DmsfFile < ApplicationRecord
|
|||||||
)
|
)
|
||||||
|
|
||||||
before_create :default_values
|
before_create :default_values
|
||||||
|
before_destroy :delete_system_folder_before
|
||||||
|
after_destroy :delete_system_folder_after
|
||||||
|
|
||||||
attr_writer :last_revision
|
attr_writer :last_revision
|
||||||
|
|
||||||
@ -95,7 +97,6 @@ class DmsfFile < ApplicationRecord
|
|||||||
|
|
||||||
def initialize(*args)
|
def initialize(*args)
|
||||||
super
|
super
|
||||||
@project = nil
|
|
||||||
self.watcher_user_ids = [] if new_record?
|
self.watcher_user_ids = [] if new_record?
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -689,4 +690,14 @@ class DmsfFile < ApplicationRecord
|
|||||||
def to_s
|
def to_s
|
||||||
name
|
name
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete_system_folder_before
|
||||||
|
@parent_folder = dmsf_folder
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_system_folder_after
|
||||||
|
return unless @parent_folder&.system && @parent_folder.dmsf_files.empty? && @parent_folder.dmsf_links.empty?
|
||||||
|
|
||||||
|
@parent_folder&.destroy
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -100,6 +100,8 @@ class DmsfFolder < ApplicationRecord
|
|||||||
validates :dmsf_folder, dmsf_folder_parent: true, if: proc { |folder| !folder.new_record? }
|
validates :dmsf_folder, dmsf_folder_parent: true, if: proc { |folder| !folder.new_record? }
|
||||||
|
|
||||||
before_create :default_values
|
before_create :default_values
|
||||||
|
before_destroy :delete_system_folder_before
|
||||||
|
after_destroy :delete_system_folder_after
|
||||||
|
|
||||||
def visible?(_user = User.current)
|
def visible?(_user = User.current)
|
||||||
return DmsfFolder.visible.exists?(id: id) if respond_to?(:type) && /^folder/.match?(type)
|
return DmsfFolder.visible.exists?(id: id) if respond_to?(:type) && /^folder/.match?(type)
|
||||||
@ -607,6 +609,16 @@ class DmsfFolder < ApplicationRecord
|
|||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete_system_folder_before
|
||||||
|
@parent_folder = dmsf_folder
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_system_folder_after
|
||||||
|
return unless @parent_folder&.system && @parent_folder.dmsf_files.empty? && @parent_folder.dmsf_links.empty?
|
||||||
|
|
||||||
|
@parent_folder.destroy
|
||||||
|
end
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def directory_subtree(tree, folder, level)
|
def directory_subtree(tree, folder, level)
|
||||||
folders = folder.dmsf_folders.visible.to_a
|
folders = folder.dmsf_folders.visible.to_a
|
||||||
|
|||||||
@ -39,6 +39,9 @@ class DmsfLink < ApplicationRecord
|
|||||||
scope :visible, -> { where(deleted: STATUS_ACTIVE) }
|
scope :visible, -> { where(deleted: STATUS_ACTIVE) }
|
||||||
scope :deleted, -> { where(deleted: STATUS_DELETED) }
|
scope :deleted, -> { where(deleted: STATUS_DELETED) }
|
||||||
|
|
||||||
|
before_destroy :delete_system_folder_before
|
||||||
|
after_destroy :delete_system_folder_after
|
||||||
|
|
||||||
def target_folder_id
|
def target_folder_id
|
||||||
if target_type == DmsfFolder.model_name.to_s
|
if target_type == DmsfFolder.model_name.to_s
|
||||||
target_id
|
target_id
|
||||||
@ -134,4 +137,14 @@ class DmsfLink < ApplicationRecord
|
|||||||
self.deleted_by_user = nil
|
self.deleted_by_user = nil
|
||||||
save validate: false
|
save validate: false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete_system_folder_before
|
||||||
|
@parent_folder = dmsf_folder
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_system_folder_after
|
||||||
|
return unless @parent_folder&.system && @parent_folder.dmsf_files.empty? && @parent_folder.dmsf_links.empty?
|
||||||
|
|
||||||
|
@parent_folder&.destroy
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
13
test/fixtures/dmsf_links.yml
vendored
13
test/fixtures/dmsf_links.yml
vendored
@ -76,4 +76,17 @@ file_link3:
|
|||||||
deleted: 0
|
deleted: 0
|
||||||
deleted_by_user_id: NULL
|
deleted_by_user_id: NULL
|
||||||
created_at: <%= DateTime.current %>
|
created_at: <%= DateTime.current %>
|
||||||
|
updated_at: <%= DateTime.current %>
|
||||||
|
|
||||||
|
file_link4:
|
||||||
|
id: 7
|
||||||
|
target_project_id: 1
|
||||||
|
target_id: 1
|
||||||
|
target_type: DmsfFile
|
||||||
|
name: file1_link
|
||||||
|
project_id: 1
|
||||||
|
dmsf_folder_id: 9
|
||||||
|
deleted: 0
|
||||||
|
deleted_by_user_id: NULL
|
||||||
|
created_at: <%= DateTime.current %>
|
||||||
updated_at: <%= DateTime.current %>
|
updated_at: <%= DateTime.current %>
|
||||||
@ -315,4 +315,13 @@ class DmsfFolderTest < RedmineDmsf::Test::UnitTest
|
|||||||
assert_not @folder1.any_child?(@folder6)
|
assert_not @folder1.any_child?(@folder6)
|
||||||
assert @folder1.any_child?(@folder2)
|
assert @folder1.any_child?(@folder2)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete_system_folder
|
||||||
|
# System folders
|
||||||
|
assert DmsfFolder.where(id: [8, 9]).exist?
|
||||||
|
@file_link7.destroy
|
||||||
|
@dmsf_file11.destroy
|
||||||
|
# System folders are empty and should have been deleted
|
||||||
|
assert_not DmsfFolder.where(id: [8, 9]).exist?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -24,12 +24,6 @@ require File.expand_path('../../test_helper', __FILE__)
|
|||||||
class DmsfLinksTest < RedmineDmsf::Test::UnitTest
|
class DmsfLinksTest < RedmineDmsf::Test::UnitTest
|
||||||
fixtures :dmsf_links, :dmsf_folders, :dmsf_files, :dmsf_file_revisions
|
fixtures :dmsf_links, :dmsf_folders, :dmsf_files, :dmsf_file_revisions
|
||||||
|
|
||||||
def setup
|
|
||||||
super
|
|
||||||
@folder_link = DmsfLink.find 1
|
|
||||||
@file_link = DmsfLink.find 2
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_create_folder_link
|
def test_create_folder_link
|
||||||
folder_link = DmsfLink.new
|
folder_link = DmsfLink.new
|
||||||
folder_link.target_project_id = @project1.id
|
folder_link.target_project_id = @project1.id
|
||||||
@ -67,42 +61,42 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_validate_name_length
|
def test_validate_name_length
|
||||||
@folder_link.name = ('a' * 256)
|
@folder_link1.name = ('a' * 256)
|
||||||
assert_not @folder_link.save, "Folder link #{@folder_link.name} should have not been saved"
|
assert_not @folder_link1.save, "Folder link #{@folder_link1.name} should have not been saved"
|
||||||
assert_equal 1, @folder_link.errors.size
|
assert_equal 1, @folder_link1.errors.size
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_validate_name_presence
|
def test_validate_name_presence
|
||||||
@folder_link.name = ''
|
@folder_link1.name = ''
|
||||||
assert_not @folder_link.save, "Folder link #{@folder_link.name} should have not been saved"
|
assert_not @folder_link1.save, "Folder link #{@folder_link1.name} should have not been saved"
|
||||||
assert_equal 1, @folder_link.errors.size
|
assert_equal 1, @folder_link1.errors.size
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_validate_external_url_length
|
def test_validate_external_url_length
|
||||||
@file_link.target_type = 'DmsfUrl'
|
@file_link2.target_type = 'DmsfUrl'
|
||||||
@file_link.external_url = "https://localhost/#{'a' * 256}"
|
@file_link2.external_url = "https://localhost/#{'a' * 256}"
|
||||||
assert_not @file_link.save, "External URL link #{@file_link.name} should have not been saved"
|
assert_not @file_link2.save, "External URL link #{@file_link2.name} should have not been saved"
|
||||||
assert_equal 1, @file_link.errors.size
|
assert_equal 1, @file_link2.errors.size
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_validate_external_url_presence
|
def test_validate_external_url_presence
|
||||||
@file_link.target_type = 'DmsfUrl'
|
@file_link2.target_type = 'DmsfUrl'
|
||||||
@file_link.external_url = ''
|
@file_link2.external_url = ''
|
||||||
assert_not @file_link.save, "External URL link #{@file_link.name} should have not been saved"
|
assert_not @file_link2.save, "External URL link #{@file_link2.name} should have not been saved"
|
||||||
assert_equal 1, @file_link.errors.size
|
assert_equal 1, @file_link2.errors.size
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_validate_external_url_invalid
|
def test_validate_external_url_invalid
|
||||||
@file_link.target_type = 'DmsfUrl'
|
@file_link2.target_type = 'DmsfUrl'
|
||||||
@file_link.external_url = 'htt ps://abc.xyz'
|
@file_link2.external_url = 'htt ps://abc.xyz'
|
||||||
assert_not @file_link.save, "External URL link #{@file_link.name} should have not been saved"
|
assert_not @file_link2.save, "External URL link #{@file_link2.name} should have not been saved"
|
||||||
assert_equal 1, @file_link.errors.size
|
assert_equal 1, @file_link2.errors.size
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_validate_external_url_valid
|
def test_validate_external_url_valid
|
||||||
@file_link.target_type = 'DmsfUrl'
|
@file_link2.target_type = 'DmsfUrl'
|
||||||
@file_link.external_url = 'https://www.google.com/search?q=寿司'
|
@file_link2.external_url = 'https://www.google.com/search?q=寿司'
|
||||||
assert @file_link.save
|
assert @file_link2.save
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_belongs_to_project
|
def test_belongs_to_project
|
||||||
@ -118,118 +112,119 @@ class DmsfLinksTest < RedmineDmsf::Test::UnitTest
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_target_folder_id
|
def test_target_folder_id
|
||||||
assert_equal 2, @file_link.target_folder_id
|
assert_equal 2, @file_link2.target_folder_id
|
||||||
assert_equal 1, @folder_link.target_folder_id
|
assert_equal 1, @folder_link1.target_folder_id
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_target_folder
|
def test_target_folder
|
||||||
assert_equal @folder2, @file_link.target_folder
|
assert_equal @folder2, @file_link2.target_folder
|
||||||
assert_equal @folder1, @folder_link.target_folder
|
assert_equal @folder1, @folder_link1.target_folder
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_target_file_id
|
def test_target_file_id
|
||||||
assert_equal 4, @file_link.target_file_id
|
assert_equal 4, @file_link2.target_file_id
|
||||||
assert_nil @folder_link.target_file
|
assert_nil @folder_link1.target_file
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_target_file
|
def test_target_file
|
||||||
assert_equal @file4, @file_link.target_file
|
assert_equal @file4, @file_link2.target_file
|
||||||
assert_nil @folder_link.target_file
|
assert_nil @folder_link1.target_file
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_target_project
|
def test_target_project
|
||||||
assert_equal @project1, @file_link.target_project
|
assert_equal @project1, @file_link2.target_project
|
||||||
assert_equal @project1, @folder_link.target_project
|
assert_equal @project1, @folder_link1.target_project
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_folder
|
def test_folder
|
||||||
assert_equal @folder1, @file_link.dmsf_folder
|
assert_equal @folder1, @file_link2.dmsf_folder
|
||||||
assert_nil @folder_link.dmsf_folder
|
assert_nil @folder_link1.dmsf_folder
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_title
|
def test_title
|
||||||
assert_equal @file_link.name, @file_link.title
|
assert_equal @file_link2.name, @file_link2.title
|
||||||
assert_equal @folder_link.name, @folder_link.title
|
assert_equal @folder_link1.name, @folder_link1.title
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_find_link_by_file_name
|
def test_find_link_by_file_name
|
||||||
file_link = DmsfLink.find_link_by_file_name(@file_link.project, @file_link.dmsf_folder, @file_link.target_file.name)
|
file_link = DmsfLink.find_link_by_file_name(@file_link2.project, @file_link2.dmsf_folder,
|
||||||
|
@file_link2.target_file.name)
|
||||||
assert file_link, 'File link not found by its name'
|
assert file_link, 'File link not found by its name'
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_path
|
def test_path
|
||||||
assert_equal 'folder1/folder2/test4.txt', @file_link.path
|
assert_equal 'folder1/folder2/test4.txt', @file_link2.path
|
||||||
assert_equal 'folder1', @folder_link.path
|
assert_equal 'folder1', @folder_link1.path
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_file_kink_copy_to
|
def test_file_kink_copy_to
|
||||||
file_link_copy = @file_link.copy_to @folder2.project, @folder2
|
file_link_copy = @file_link2.copy_to @folder2.project, @folder2
|
||||||
assert_not_nil file_link_copy, 'File link copying failed'
|
assert_not_nil file_link_copy, 'File link copying failed'
|
||||||
assert_equal file_link_copy.target_project_id, @file_link.target_project_id
|
assert_equal file_link_copy.target_project_id, @file_link2.target_project_id
|
||||||
assert_equal file_link_copy.target_id, @file_link.target_id
|
assert_equal file_link_copy.target_id, @file_link2.target_id
|
||||||
assert_equal file_link_copy.target_type, @file_link.target_type
|
assert_equal file_link_copy.target_type, @file_link2.target_type
|
||||||
assert_equal file_link_copy.name, @file_link.name
|
assert_equal file_link_copy.name, @file_link2.name
|
||||||
assert_equal file_link_copy.project_id, @folder2.project.id
|
assert_equal file_link_copy.project_id, @folder2.project.id
|
||||||
assert_equal file_link_copy.dmsf_folder_id, @folder2.id
|
assert_equal file_link_copy.dmsf_folder_id, @folder2.id
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_folder_link_copy_to
|
def test_folder_link_copy_to
|
||||||
folder_link_copy = @folder_link.copy_to @folder2.project, @folder2
|
folder_link_copy = @folder_link1.copy_to @folder2.project, @folder2
|
||||||
assert_not_nil folder_link_copy, 'Folder link copying failed'
|
assert_not_nil folder_link_copy, 'Folder link copying failed'
|
||||||
assert_equal folder_link_copy.target_project_id, @folder_link.target_project_id
|
assert_equal folder_link_copy.target_project_id, @folder_link1.target_project_id
|
||||||
assert_equal folder_link_copy.target_id, @folder_link.target_id
|
assert_equal folder_link_copy.target_id, @folder_link1.target_id
|
||||||
assert_equal folder_link_copy.target_type, @folder_link.target_type
|
assert_equal folder_link_copy.target_type, @folder_link1.target_type
|
||||||
assert_equal folder_link_copy.name, @folder_link.name
|
assert_equal folder_link_copy.name, @folder_link1.name
|
||||||
assert_equal folder_link_copy.project_id, @folder2.project.id
|
assert_equal folder_link_copy.project_id, @folder2.project.id
|
||||||
assert_equal folder_link_copy.dmsf_folder_id, @folder2.id
|
assert_equal folder_link_copy.dmsf_folder_id, @folder2.id
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_move_to_author
|
def test_move_to_author
|
||||||
assert_equal @admin.id, @file_link.user_id
|
assert_equal @admin.id, @file_link2.user_id
|
||||||
User.current = @jsmith
|
User.current = @jsmith
|
||||||
assert @file_link.move_to(@project1, @folder1)
|
assert @file_link2.move_to(@project1, @folder1)
|
||||||
assert_equal @admin.id, @file_link.user_id, "Author mustn't be updated when moving"
|
assert_equal @admin.id, @file_link2.user_id, "Author mustn't be updated when moving"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_copy_to_author
|
def test_copy_to_author
|
||||||
assert_equal @admin.id, @file_link.user_id
|
assert_equal @admin.id, @file_link2.user_id
|
||||||
User.current = @jsmith
|
User.current = @jsmith
|
||||||
l = @file_link.copy_to(@project1, @folder1)
|
l = @file_link2.copy_to(@project1, @folder1)
|
||||||
assert l
|
assert l
|
||||||
assert_equal @jsmith.id, l.user_id, 'Author must be updated when copying'
|
assert_equal @jsmith.id, l.user_id, 'Author must be updated when copying'
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_delete_file_link
|
def test_delete_file_link
|
||||||
assert @file_link.delete(commit: false), @file_link.errors.full_messages.to_sentence
|
assert @file_link2.delete(commit: false), @file_link2.errors.full_messages.to_sentence
|
||||||
assert @file_link.deleted?, "File link hasn't been deleted"
|
assert @file_link2.deleted?, "File link hasn't been deleted"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_restore_file_link
|
def test_restore_file_link
|
||||||
assert @file_link.delete(commit: false), @file_link.errors.full_messages.to_sentence
|
assert @file_link2.delete(commit: false), @file_link2.errors.full_messages.to_sentence
|
||||||
assert @file_link.deleted?, "File link hasn't been deleted"
|
assert @file_link2.deleted?, "File link hasn't been deleted"
|
||||||
assert @file_link.restore, @file_link.errors.full_messages.to_sentence
|
assert @file_link2.restore, @file_link2.errors.full_messages.to_sentence
|
||||||
assert_not @file_link.deleted?, "File link hasn't been restored"
|
assert_not @file_link2.deleted?, "File link hasn't been restored"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_delete_folder_link
|
def test_delete_folder_link
|
||||||
assert @folder_link.delete(commit: false), @folder_link.errors.full_messages.to_sentence
|
assert @folder_link1.delete(commit: false), @folder_link1.errors.full_messages.to_sentence
|
||||||
assert @folder_link.deleted?, "Folder link hasn't been deleted"
|
assert @folder_link1.deleted?, "Folder link hasn't been deleted"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_restore_folder_link
|
def test_restore_folder_link
|
||||||
assert @folder_link.delete(commit: false), @folder_link.errors.full_messages.to_sentence
|
assert @folder_link1.delete(commit: false), @folder_link1.errors.full_messages.to_sentence
|
||||||
assert @folder_link.deleted?, "Folder link hasn't been deleted"
|
assert @folder_link1.deleted?, "Folder link hasn't been deleted"
|
||||||
assert @folder_link.restore, @folder_link.errors.full_messages.to_sentence
|
assert @folder_link1.restore, @folder_link1.errors.full_messages.to_sentence
|
||||||
assert_not @folder_link.deleted?, "Folder link hasn't been restored"
|
assert_not @folder_link1.deleted?, "Folder link hasn't been restored"
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_destroy_file_link
|
def test_destroy_file_link
|
||||||
assert @file_link.delete(commit: true), @file_link.errors.full_messages.to_sentence
|
assert @file_link2.delete(commit: true), @file_link2.errors.full_messages.to_sentence
|
||||||
assert_nil DmsfLink.find_by(id: @file_link.id)
|
assert_nil DmsfLink.find_by(id: @file_link2.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_destroy_folder_link
|
def test_destroy_folder_link
|
||||||
assert @folder_link.delete(commit: true), @folder_link.errors.full_messages.to_sentence
|
assert @folder_link1.delete(commit: true), @folder_link1.errors.full_messages.to_sentence
|
||||||
assert_nil DmsfLink.find_by(id: @folder_link.id)
|
assert_nil DmsfLink.find_by(id: @folder_link1.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -52,7 +52,11 @@ module RedmineDmsf
|
|||||||
@file5 = DmsfFile.find 5
|
@file5 = DmsfFile.find 5
|
||||||
@file7 = DmsfFile.find 7
|
@file7 = DmsfFile.find 7
|
||||||
@file8 = DmsfFile.find 8
|
@file8 = DmsfFile.find 8
|
||||||
|
@file11 = DmsfFile.find 11
|
||||||
@file13 = DmsfFile.find 13
|
@file13 = DmsfFile.find 13
|
||||||
|
@folder_link1 = DmsfLink.find 1
|
||||||
|
@file_link2 = DmsfLink.find 2
|
||||||
|
@file_link7 = DmsfLink.find 7
|
||||||
@folder1 = DmsfFolder.find 1
|
@folder1 = DmsfFolder.find 1
|
||||||
@folder2 = DmsfFolder.find 2
|
@folder2 = DmsfFolder.find 2
|
||||||
@folder6 = DmsfFolder.find 6
|
@folder6 = DmsfFolder.find 6
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user