repository-manager 0.2.1 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +11 -1
- data/app/models/repository_manager/repo_file.rb +29 -13
- data/app/models/repository_manager/repo_folder.rb +56 -23
- data/app/models/repository_manager/repo_item.rb +29 -6
- data/db/migrate/20131018214212_create_repository_manager.rb +2 -1
- data/lib/generators/repository_manager/templates/initializer.rb +9 -1
- data/lib/repository-manager.rb +5 -3
- data/lib/repository_manager/has_repository.rb +58 -18
- data/lib/repository_manager/version.rb +1 -1
- data/repository-manager.gemspec +1 -0
- data/spec/dummy/Gemfile +3 -0
- data/spec/dummy/db/migrate/20131018214212_create_repository_manager.rb +2 -1
- data/spec/dummy/doc/controllers_brief.svg +26 -0
- data/spec/dummy/doc/controllers_complete.svg +37 -0
- data/spec/dummy/doc/models_brief.svg +207 -0
- data/spec/dummy/doc/models_complete.svg +327 -0
- data/spec/has_repository_spec.rb +0 -1
- data/spec/models/repository_spec.rb +55 -4
- metadata +43 -29
- data/config/locales/en/repository_manager.en.yml +0 -19
- data/config/locales/fr/repository_manager.fr.yml +0 -19
- data/spec/dummy/db/schema.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dbf60a439b0b337f819cdc38e21b42351783a93f
|
4
|
+
data.tar.gz: e366f2254bbb226188a71f07f0457139aac5641a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46e363948f796a7f6830bf0a13d38e54a525a0484d3f3036597d14f55ac9f2dbc1923b28677364707d9e43298a857eb13da88fb6809b5661218f825c178b3190
|
7
|
+
data.tar.gz: 81cf606e9e4a4624fd484da3838396fb166a0af557db84575bb805747e2e33ecc84ae8f59b4b4e58d40ff767bf5eef49cc11277746aa825ead2a5f382a8bbbe5
|
data/README.md
CHANGED
@@ -55,18 +55,25 @@ RepositoryManager.setup do |config|
|
|
55
55
|
# Default path for generating the zip file when a user want to download a folder
|
56
56
|
# Default is : "download/#{member.class.to_s.underscore}/#{member.id}/#{self.class.to_s.underscore}/#{self.id}/"
|
57
57
|
#config.default_zip_path = true
|
58
|
+
|
59
|
+
# Define if we enable or not the versioning on the repo_item
|
60
|
+
config.has_paper_trail = false
|
58
61
|
end
|
59
62
|
```
|
60
63
|
|
61
|
-
For instance, if you want that a default sharing is totally free (for edit, delete, etc), just put all default parameters to `true
|
64
|
+
For instance, if you want that a default sharing is totally free (for edit, delete, etc), just put all default parameters to `true`. We want that paper_trail is activate:
|
62
65
|
|
63
66
|
```ruby
|
64
67
|
RepositoryManager.setup do |config|
|
65
68
|
config.default_repo_item_permissions = { can_read: true, can_create: true, can_update: true, can_delete: true, can_share: true }
|
66
69
|
config.default_sharing_permissions = { can_add: true, can_remove: true }
|
70
|
+
config.has_paper_trail = true
|
67
71
|
end
|
68
72
|
```
|
69
73
|
|
74
|
+
NOTE : If you want to add paper_trail to the repo_item model. You first have to install PaperTrail in you project.
|
75
|
+
More informations on the [documentation of the PaperTrail gem](https://github.com/airblade/paper_trail)
|
76
|
+
|
70
77
|
|
71
78
|
See the chapter [Permissions](#permissions) for more details about the permissions.
|
72
79
|
|
@@ -522,6 +529,9 @@ end
|
|
522
529
|
# repo_item.errors ==> Contains the errors
|
523
530
|
```
|
524
531
|
|
532
|
+
## Documentation
|
533
|
+
|
534
|
+
For more documentation go on the [Repository Manager Doc](http://rubydoc.info/gems/repository-manager/index).
|
525
535
|
|
526
536
|
## TODO
|
527
537
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
class RepositoryManager::RepoFile < RepositoryManager::RepoItem
|
2
|
-
attr_accessible :file, :content_type, :file_size if RepositoryManager.protected_attributes?
|
2
|
+
attr_accessible :file, :content_type, :file_size, :checksum if RepositoryManager.protected_attributes?
|
3
3
|
|
4
4
|
validates_presence_of :file
|
5
5
|
mount_uploader :file, RepoFileUploader
|
@@ -29,24 +29,39 @@ class RepositoryManager::RepoFile < RepositoryManager::RepoItem
|
|
29
29
|
# :source_folder = the folder in witch you copy this item
|
30
30
|
# :owner = the owner of the item
|
31
31
|
# :sender = the sender of the item (if you don't specify sender.. The sender is still the same)
|
32
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
32
33
|
def copy!(options = {})
|
34
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
35
|
+
|
33
36
|
new_item = RepositoryManager::RepoFile.new
|
34
37
|
new_item.file = File.open(self.file.current_path)
|
35
|
-
|
36
|
-
if options[:source_folder]
|
37
|
-
options[:source_folder].add!(new_item)
|
38
|
-
elsif options[:owner].repo_item_name_exist_in_root?(new_item.name)
|
39
|
-
self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
40
|
-
raise RepositoryManager::ItemExistException.new("copy failed. The repo_file '#{new_item.name}' already exist in root.")
|
41
|
-
end
|
38
|
+
new_item.name = self.name
|
42
39
|
|
43
40
|
options[:owner] ? new_item.owner = options[:owner] : new_item.owner = self.owner
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
41
|
+
options[:sender] ? new_item.sender = options[:sender] : new_item.sender = self.sender
|
42
|
+
|
43
|
+
if options[:source_folder]
|
44
|
+
new_item = options[:source_folder].add!(new_item, do_not_save: true, overwrite: overwrite )
|
45
|
+
elsif options[:owner]
|
46
|
+
repo_item_with_same_name = options[:owner].get_item_in_root_by_name(new_item.name)
|
47
|
+
if repo_item_with_same_name and !overwrite
|
48
|
+
self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
49
|
+
raise RepositoryManager::ItemExistException.new("copy failed. The repo_file '#{new_item.name}' already exist in root.")
|
50
|
+
elsif repo_item_with_same_name and overwrite
|
51
|
+
repo_item_with_same_name.file = new_item.file
|
52
|
+
repo_item_with_same_name.sender = new_item.sender
|
53
|
+
new_item = repo_item_with_same_name
|
54
|
+
end
|
48
55
|
else
|
49
|
-
|
56
|
+
repo_item_with_same_name = self.owner.get_item_in_root_by_name(new_item.name)
|
57
|
+
if repo_item_with_same_name and !overwrite
|
58
|
+
self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
59
|
+
raise RepositoryManager::ItemExistException.new("copy failed. The repo_file '#{new_item.name}' already exist in root.")
|
60
|
+
elsif repo_item_with_same_name and overwrite
|
61
|
+
repo_item_with_same_name.file = new_item.file
|
62
|
+
repo_item_with_same_name.sender = new_item.sender
|
63
|
+
new_item = repo_item_with_same_name
|
64
|
+
end
|
50
65
|
end
|
51
66
|
|
52
67
|
new_item.save!
|
@@ -67,6 +82,7 @@ class RepositoryManager::RepoFile < RepositoryManager::RepoItem
|
|
67
82
|
if file.present? && file_changed?
|
68
83
|
self.content_type = file.file.content_type
|
69
84
|
self.file_size = file.file.size
|
85
|
+
self.checksum = Digest::MD5.file(file.path).hexdigest
|
70
86
|
end
|
71
87
|
end
|
72
88
|
|
@@ -5,23 +5,42 @@ class RepositoryManager::RepoFolder < RepositoryManager::RepoItem
|
|
5
5
|
validates :name, presence: true
|
6
6
|
|
7
7
|
# Add a repo_item in the folder.
|
8
|
-
#
|
9
|
-
|
8
|
+
# options
|
9
|
+
# :destroy_if_fail = false // the repo_item if it can't move it.
|
10
|
+
# :do_not_save = false // Save the repo_item after changing his param
|
11
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
12
|
+
# second param destroy the repo_item if it can't move it.
|
13
|
+
def add!(repo_item, options = {})
|
14
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
15
|
+
|
10
16
|
# We check if this name already exist
|
11
|
-
|
12
|
-
if
|
17
|
+
repo_item_with_same_name = get_children_by_name(repo_item.name)
|
18
|
+
if repo_item_with_same_name && !overwrite
|
13
19
|
# we delete the repo if asked
|
14
|
-
repo_item.destroy if destroy_if_fail
|
20
|
+
repo_item.destroy if options[:destroy_if_fail]
|
15
21
|
raise RepositoryManager::ItemExistException.new("add failed. The repo_item '#{repo_item.name}' already exist in the folder '#{name}'")
|
22
|
+
elsif repo_item_with_same_name && overwrite
|
23
|
+
# We destroy it
|
24
|
+
if repo_item_with_same_name.is_file?
|
25
|
+
#p "add: updates the file #{repo_item.name}"
|
26
|
+
repo_item_with_same_name.file = repo_item.file
|
27
|
+
repo_item_with_same_name.sender = repo_item.sender
|
28
|
+
repo_item_with_same_name.owner = repo_item.owner
|
29
|
+
repo_item = repo_item_with_same_name
|
30
|
+
else
|
31
|
+
repo_item_with_same_name.destroy!
|
32
|
+
end
|
16
33
|
else
|
17
|
-
repo_item.
|
34
|
+
repo_item.parent = self
|
35
|
+
repo_item.save! unless options[:do_not_save]
|
18
36
|
end
|
37
|
+
repo_item
|
19
38
|
end
|
20
39
|
|
21
40
|
def add(repo_item)
|
22
41
|
begin
|
23
42
|
add!(repo_item)
|
24
|
-
rescue RepositoryManager::ItemExistException
|
43
|
+
rescue RepositoryManager::ItemExistException, ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved
|
25
44
|
false
|
26
45
|
end
|
27
46
|
end
|
@@ -31,31 +50,41 @@ class RepositoryManager::RepoFolder < RepositoryManager::RepoItem
|
|
31
50
|
# :source_folder = the folder in witch you copy this item
|
32
51
|
# :owner = the owner of the item
|
33
52
|
# :sender = the sender of the item (if you don't specify sender.. The sender is still the same)
|
53
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
34
54
|
def copy!(options = {})
|
55
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
56
|
+
|
35
57
|
new_item = RepositoryManager::RepoFolder.new
|
36
58
|
new_item.name = self.name
|
37
59
|
|
38
|
-
if options[:source_folder]
|
39
|
-
options[:source_folder].add!(new_item)
|
40
|
-
elsif options[:owner].repo_item_name_exist_in_root?(new_item.name)
|
41
|
-
self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
42
|
-
raise RepositoryManager::ItemExistException.new("copy failed. The repo_folder '#{new_item.name}' already exist in root.")
|
43
|
-
end
|
44
|
-
|
45
60
|
options[:owner] ? new_item.owner = options[:owner] : new_item.owner = self.owner
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
61
|
+
options[:sender] ? new_item.sender = options[:sender] : new_item.sender = self.sender
|
62
|
+
|
63
|
+
if options[:source_folder]
|
64
|
+
options[:source_folder].add!(new_item, do_not_save: true)
|
65
|
+
elsif options[:owner]
|
66
|
+
repo_item_with_same_name = options[:owner].get_item_in_root_by_name(new_item.name)
|
67
|
+
if repo_item_with_same_name and !overwrite
|
68
|
+
self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
69
|
+
raise RepositoryManager::ItemExistException.new("copy failed. The repo_folder '#{new_item.name}' already exist in root.")
|
70
|
+
elsif repo_item_with_same_name and overwrite
|
71
|
+
repo_item_with_same_name.destroy!
|
72
|
+
end
|
50
73
|
else
|
51
|
-
|
74
|
+
repo_item_with_same_name = self.owner.get_item_in_root_by_name(new_item.name)
|
75
|
+
if repo_item_with_same_name and !overwrite
|
76
|
+
self.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
77
|
+
raise RepositoryManager::ItemExistException.new("copy failed. The repo_file '#{new_item.name}' already exist in root.")
|
78
|
+
elsif repo_item_with_same_name and overwrite
|
79
|
+
repo_item_with_same_name.destroy!
|
80
|
+
end
|
52
81
|
end
|
53
82
|
|
54
|
-
new_item.save
|
83
|
+
new_item.save
|
55
84
|
|
56
|
-
# Recursive method
|
85
|
+
# Recursive method which copy all children.
|
57
86
|
children.each do |c|
|
58
|
-
c.copy!(source_folder: new_item, owner: options[:owner], sender: options[:sender])
|
87
|
+
c.copy!(source_folder: new_item, owner: options[:owner], sender: options[:sender], overwrite: overwrite)
|
59
88
|
end
|
60
89
|
|
61
90
|
new_item
|
@@ -134,7 +163,11 @@ class RepositoryManager::RepoFolder < RepositoryManager::RepoItem
|
|
134
163
|
# Returns true or false if the name exist in this folder
|
135
164
|
def name_exist_in_children?(name)
|
136
165
|
#RepositoryManager::RepoItem.where(name: name).where(id: child_ids).first ? true : false
|
137
|
-
|
166
|
+
get_children_by_name(name) ? true : false
|
167
|
+
end
|
168
|
+
|
169
|
+
def get_children_by_name(name)
|
170
|
+
RepositoryManager::RepoItem.where('name = ?', name).where(id: child_ids).first
|
138
171
|
end
|
139
172
|
|
140
173
|
private
|
@@ -5,6 +5,10 @@ class RepositoryManager::RepoItem < ActiveRecord::Base
|
|
5
5
|
|
6
6
|
before_save :put_sender
|
7
7
|
|
8
|
+
if RepositoryManager.has_paper_trail
|
9
|
+
has_paper_trail
|
10
|
+
end
|
11
|
+
|
8
12
|
has_ancestry cache_depth: true
|
9
13
|
|
10
14
|
# Associate with the User Class
|
@@ -31,23 +35,42 @@ class RepositoryManager::RepoItem < ActiveRecord::Base
|
|
31
35
|
# options
|
32
36
|
# :source_folder = the folder in witch you copy this item
|
33
37
|
# :owner = the owner of the item
|
38
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
34
39
|
# If :source_folder = nil, move to the root (of same owner)
|
35
40
|
def move!(options = {})
|
36
|
-
|
41
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
42
|
+
|
43
|
+
# If we are in source_folder, we check if it's a folder
|
37
44
|
if options[:source_folder]
|
38
45
|
unless options[:source_folder].is_folder?
|
39
46
|
raise RepositoryManager::RepositoryManagerException.new("move failed. target '#{options[:source_folder].name}' can't be a file")
|
40
47
|
end
|
41
|
-
|
48
|
+
|
49
|
+
children_with_same_name = options[:source_folder].get_children_by_name(self.name)
|
50
|
+
# If the name exist and we don't want to overwrite, we raise an error
|
51
|
+
if children_with_same_name and !overwrite
|
42
52
|
self.errors.add(:move, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
43
53
|
raise RepositoryManager::ItemExistException.new("move failed. The repo_item '#{name}' already exist ine the folder '#{options[:source_folder].name}'")
|
54
|
+
elsif children_with_same_name and overwrite
|
55
|
+
# If a children with the same name exist and we want to overwrite, we have to destroy it
|
56
|
+
children_with_same_name.destroy!
|
44
57
|
end
|
45
58
|
# We are in root, we check if name exist in root
|
46
59
|
# We stay in the same owner
|
47
|
-
|
48
|
-
|
49
|
-
|
60
|
+
else
|
61
|
+
# We check if a children with same name exist
|
62
|
+
children_with_same_name = self.owner.get_item_in_root_by_name(self.name)
|
63
|
+
|
64
|
+
# If it exist and we don t want to overwrite, we raise an error
|
65
|
+
if children_with_same_name and !overwrite
|
66
|
+
self.errors.add(:move, I18n.t('repository_manager.errors.repo_item.item_exist'))
|
67
|
+
raise RepositoryManager::ItemExistException.new("move failed. The repo_item '#{name}' already exist ine the root")
|
68
|
+
# else we destroy it
|
69
|
+
elsif children_with_same_name and overwrite
|
70
|
+
children_with_same_name.destroy!
|
71
|
+
end
|
50
72
|
end
|
73
|
+
|
51
74
|
# here, all is ok
|
52
75
|
# We change the owner if another one is specify
|
53
76
|
if options[:owner]
|
@@ -56,7 +79,7 @@ class RepositoryManager::RepoItem < ActiveRecord::Base
|
|
56
79
|
self.owner = options[:source_folder].owner
|
57
80
|
end
|
58
81
|
# we update the tree with the new parent
|
59
|
-
self.
|
82
|
+
self.parent = options[:source_folder]
|
60
83
|
self.save!
|
61
84
|
self
|
62
85
|
end
|
@@ -23,13 +23,14 @@ class CreateRepositoryManager < ActiveRecord::Migration
|
|
23
23
|
create_table :rm_repo_items do |t|
|
24
24
|
t.references :owner, polymorphic: true, index: true
|
25
25
|
t.references :sender, polymorphic: true, index: true
|
26
|
-
t.string :ancestry
|
26
|
+
t.string :ancestry, index: true
|
27
27
|
t.integer :ancestry_depth, :default => 0
|
28
28
|
t.string :name
|
29
29
|
t.float :file_size
|
30
30
|
t.string :content_type
|
31
31
|
t.string :file
|
32
32
|
t.string :type
|
33
|
+
t.string :checksum
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
RepositoryManager.setup do |config|
|
2
2
|
|
3
3
|
# Default repo_item permissions that an object has on the repo_item after a sharing.
|
4
|
-
config.default_repo_item_permissions = {
|
4
|
+
config.default_repo_item_permissions = {
|
5
|
+
can_read: true, can_create: false, can_update:false, can_delete:false, can_share: false
|
6
|
+
}
|
5
7
|
|
6
8
|
# Default sharing permissions that an object has when he is added in a sharing.
|
7
9
|
config.default_sharing_permissions = { can_add: false, can_remove: false }
|
@@ -10,4 +12,10 @@ RepositoryManager.setup do |config|
|
|
10
12
|
# WARNING: DO NOT CHANGE IF YOU DON'T KNOW WHAT YOU ARE DOING
|
11
13
|
# Default is : "download/#{member.class.to_s.underscore}/#{member.id}/#{self.class.to_s.underscore}/#{self.id}/"
|
12
14
|
#config.default_zip_path = true
|
15
|
+
|
16
|
+
# Define if we enable or not the versioning on the repo_item
|
17
|
+
config.has_paper_trail = false
|
18
|
+
|
19
|
+
# Define if a repo item with the same name will be automaticaly overwrited when a new item is create
|
20
|
+
config.auto_overwrite_item = false
|
13
21
|
end
|
data/lib/repository-manager.rb
CHANGED
@@ -14,9 +14,11 @@ module RepositoryManager
|
|
14
14
|
mattr_accessor :accept_nested_sharing
|
15
15
|
@@accept_nested_share = false
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
mattr_accessor :has_paper_trail
|
18
|
+
@@has_paper_trail = false
|
19
|
+
|
20
|
+
mattr_accessor :auto_overwrite_item
|
21
|
+
@@auto_overwrite_item = false
|
20
22
|
|
21
23
|
class << self
|
22
24
|
def setup
|
@@ -101,6 +101,7 @@ module RepositoryManager
|
|
101
101
|
# options :
|
102
102
|
# :source_folder = The directory in with the folder is created
|
103
103
|
# :sender = The object of the sender (ex : current_user)
|
104
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
104
105
|
# Returns the object of the folder created if it is ok
|
105
106
|
# Returns an Exception if the folder is not created
|
106
107
|
# RepositoryManagerException if the name already exist
|
@@ -113,6 +114,8 @@ module RepositoryManager
|
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
117
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
118
|
+
|
116
119
|
# If he want to create a folder in a directory, we have to check if he have the permission
|
117
120
|
if can_create?(source_folder)
|
118
121
|
|
@@ -126,13 +129,19 @@ module RepositoryManager
|
|
126
129
|
folder.sender = options[:sender]
|
127
130
|
|
128
131
|
# If we are in root path we check if we can add this folder name
|
129
|
-
if !source_folder
|
130
|
-
|
132
|
+
if !source_folder
|
133
|
+
repo_item_with_same_name = get_item_in_root_by_name(name)
|
134
|
+
if repo_item_with_same_name && !overwrite
|
135
|
+
raise RepositoryManager::ItemExistException.new("create folder failed. The repo_item '#{name}' already exist in the root folder.")
|
136
|
+
elsif repo_item_with_same_name && overwrite
|
137
|
+
# We destroy the item with same name for overwrite it
|
138
|
+
repo_item_with_same_name.destroy!
|
139
|
+
end
|
140
|
+
else
|
141
|
+
# It raise an error if name already exist and destroy the folder
|
142
|
+
source_folder.add!(folder, do_not_save: true, overwrite: overwrite)
|
131
143
|
end
|
132
144
|
|
133
|
-
# It raise an error if name already exist and destroy the folder
|
134
|
-
source_folder.add!(folder) if source_folder
|
135
|
-
|
136
145
|
folder.save!
|
137
146
|
else
|
138
147
|
raise RepositoryManager::PermissionException.new("create_folder failed. You don't have the permission to create a folder in '#{source_folder.name}'")
|
@@ -181,7 +190,8 @@ module RepositoryManager
|
|
181
190
|
# :source_folder = The directory in with the folder is created
|
182
191
|
# :sender = The object of the sender (ex : current_user)
|
183
192
|
# :filename = The name of the file (if you want to rename it directly)
|
184
|
-
#
|
193
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
194
|
+
|
185
195
|
# Param file can be a File, or a instance of RepoFile
|
186
196
|
# Returns the object of the file created if it is ok
|
187
197
|
# Returns an Exception if the folder is not created
|
@@ -195,6 +205,8 @@ module RepositoryManager
|
|
195
205
|
end
|
196
206
|
end
|
197
207
|
|
208
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
209
|
+
|
198
210
|
# If he want to create a file in a directory, we have to check if he have the permission
|
199
211
|
if can_create?(source_folder)
|
200
212
|
|
@@ -207,20 +219,39 @@ module RepositoryManager
|
|
207
219
|
repo_file = RepositoryManager::RepoFile.new(file)
|
208
220
|
end
|
209
221
|
|
210
|
-
options[:filename] ?
|
222
|
+
options[:filename] ? file_name = options[:filename] : file_name = repo_file.file.url.split('/').last
|
211
223
|
|
224
|
+
repo_file.name = file_name
|
212
225
|
repo_file.owner = self
|
213
226
|
repo_file.sender = options[:sender]
|
214
227
|
|
215
|
-
|
216
228
|
# If we are in root path we check if we can add this file name
|
217
|
-
if !source_folder
|
218
|
-
|
229
|
+
if !source_folder
|
230
|
+
repo_item_with_same_name = get_item_in_root_by_name(file_name)
|
231
|
+
if repo_item_with_same_name && !overwrite
|
232
|
+
raise RepositoryManager::ItemExistException.new("create file failed. The repo_item '#{file_name}' already exist in the root folder.")
|
233
|
+
elsif repo_item_with_same_name && overwrite
|
234
|
+
#We do not destroy, we update it !
|
235
|
+
|
236
|
+
# We update the file
|
237
|
+
repo_item_with_same_name.file = file
|
238
|
+
|
239
|
+
if file.class.name == 'RepositoryManager::RepoFile'
|
240
|
+
repo_item_with_same_name.file = file.file
|
241
|
+
elsif file.class.name == 'File' || file.class.name == 'ActionDispatch::Http::UploadedFile'
|
242
|
+
repo_item_with_same_name.file = file
|
243
|
+
else # "ActionController::Parameters"
|
244
|
+
repo_item_with_same_name.assign_attributes(file)
|
245
|
+
end
|
246
|
+
repo_item_with_same_name.sender = options[:sender]
|
247
|
+
#p "source: updates the file #{repo_item_with_same_name.name}"
|
248
|
+
|
249
|
+
repo_file = repo_item_with_same_name
|
250
|
+
end
|
251
|
+
else
|
252
|
+
# It raise an error if name already exist and destroy the file
|
253
|
+
repo_file = source_folder.add!(repo_file, do_not_save: true, overwrite: overwrite)
|
219
254
|
end
|
220
|
-
|
221
|
-
# It raise an error if name already exist and destroy the file
|
222
|
-
source_folder.add!(repo_file) if source_folder
|
223
|
-
|
224
255
|
repo_file.save!
|
225
256
|
else
|
226
257
|
raise RepositoryManager::PermissionException.new("create_file failed. You don't have the permission to create a file")
|
@@ -316,7 +347,9 @@ module RepositoryManager
|
|
316
347
|
# options
|
317
348
|
# :source_folder => move into this source_folder
|
318
349
|
# if :source_folder == nil, move to the root
|
350
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
319
351
|
def move_repo_item!(repo_item, options = {})
|
352
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
320
353
|
target = options[:source_folder]
|
321
354
|
|
322
355
|
if !can_read?(repo_item)
|
@@ -348,7 +381,7 @@ module RepositoryManager
|
|
348
381
|
end
|
349
382
|
end
|
350
383
|
# If it has the permission, we move the repo_item in the source_folder
|
351
|
-
repo_item.move!(source_folder: target)
|
384
|
+
repo_item.move!(source_folder: target, overwrite: overwrite)
|
352
385
|
end
|
353
386
|
|
354
387
|
def move_repo_item(repo_item, options = {})
|
@@ -366,7 +399,10 @@ module RepositoryManager
|
|
366
399
|
# options
|
367
400
|
# :source_folder => the folder in witch we want to copy the repo item
|
368
401
|
# :sender => the new sender (by default => still the old sender)
|
402
|
+
# :overwrite = overwrite an item with the same name (default : see config 'auto_overwrite_item')
|
369
403
|
def copy_repo_item!(repo_item, options = {})
|
404
|
+
!!options[:overwrite] == options[:overwrite] ? overwrite = options[:overwrite] : overwrite = RepositoryManager.auto_overwrite_item
|
405
|
+
|
370
406
|
target = options[:source_folder]
|
371
407
|
|
372
408
|
unless can_read?(repo_item)
|
@@ -374,7 +410,7 @@ module RepositoryManager
|
|
374
410
|
raise RepositoryManager::PermissionException.new("copy repo_item failed. You don't have the permission to read the repo_item '#{repo_item.name}'")
|
375
411
|
end
|
376
412
|
|
377
|
-
if target &&
|
413
|
+
if target && !can_create?(target)
|
378
414
|
repo_item.errors.add(:copy, I18n.t('repository_manager.errors.repo_item.copy.no_permission'))
|
379
415
|
raise RepositoryManager::PermissionException.new("copy repo_item failed. You don't have the permission to create in the source_folder '#{target.name}'")
|
380
416
|
end
|
@@ -387,7 +423,7 @@ module RepositoryManager
|
|
387
423
|
end
|
388
424
|
|
389
425
|
# If it has the permission, we move the repo_item in the source_folder
|
390
|
-
repo_item.copy!(source_folder: target, owner: owner, sender: options[:sender])
|
426
|
+
repo_item.copy!(source_folder: target, owner: owner, sender: options[:sender], overwrite: overwrite)
|
391
427
|
end
|
392
428
|
|
393
429
|
def copy_repo_item(repo_item, options = {})
|
@@ -516,7 +552,11 @@ module RepositoryManager
|
|
516
552
|
|
517
553
|
# Returns true of false if the name exist in the root path of this instance
|
518
554
|
def repo_item_name_exist_in_root?(name)
|
519
|
-
|
555
|
+
get_item_in_root_by_name(name) ? true : false
|
556
|
+
end
|
557
|
+
|
558
|
+
def get_item_in_root_by_name(name)
|
559
|
+
RepoItem.where('name = ?', name).where(owner: self).where(ancestry: nil).first
|
520
560
|
end
|
521
561
|
|
522
562
|
private
|