repository-manager 0.0.8 → 0.0.9
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.
- data/Gemfile.lock +1 -1
- data/README.md +72 -15
- data/app/models/repo_file.rb +1 -1
- data/app/models/repo_folder.rb +63 -9
- data/app/models/repo_item.rb +14 -5
- data/app/models/sharing.rb +1 -1
- data/lib/generators/repository_manager/templates/initializer.rb +4 -0
- data/lib/repository-manager.rb +5 -1
- data/lib/repository_manager/exceptions.rb +7 -0
- data/lib/repository_manager/has_repository.rb +117 -37
- data/lib/repository_manager/version.rb +1 -1
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/has_repository_spec.rb +2 -0
- data/spec/models/repository_spec.rb +18 -1
- metadata +3 -2
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -107,7 +107,7 @@ A `repo_item` is an item in a repository, it can be:
|
|
107
107
|
|
108
108
|
A folder can contains files and folders. Like in a real tree files and folders.
|
109
109
|
|
110
|
-
### How can I create/delete a repo_item (file or folder)
|
110
|
+
### How can I create/delete/move a repo_item (file or folder)
|
111
111
|
|
112
112
|
You just have to call the `has_repository` methods `create_file`, `create_folder`, or `delete_repo_item`.
|
113
113
|
|
@@ -136,7 +136,7 @@ user1.create_file(File.open('somewhere'), the_new_folder)
|
|
136
136
|
# user1 own repository :
|
137
137
|
# |-- 'Root folder'
|
138
138
|
# | |-- 'The new folder'
|
139
|
-
# | |
|
139
|
+
# | | |-- 'file.txt'
|
140
140
|
|
141
141
|
# user1 want to create a file on the root of his repository
|
142
142
|
file2 = user1.create_file(params[:file2])
|
@@ -144,16 +144,36 @@ file2 = user1.create_file(params[:file2])
|
|
144
144
|
# user1 own repository :
|
145
145
|
# |-- 'Root folder'
|
146
146
|
# | |-- 'The new folder'
|
147
|
-
# | |
|
148
|
-
# |-- 'file2'
|
147
|
+
# | | |-- 'file.txt'
|
148
|
+
# |-- 'file2.jpg'
|
149
|
+
|
150
|
+
# user1 want to create a folder on the root of his repository
|
151
|
+
test_folder = user1.create_folder('Test folder')
|
152
|
+
|
153
|
+
# user1 own repository :
|
154
|
+
# |-- 'Root folder'
|
155
|
+
# | |-- 'The new folder'
|
156
|
+
# | | |-- 'file.txt'
|
157
|
+
# |-- 'file2.jpg'
|
158
|
+
# |-- 'Test folder'
|
159
|
+
|
160
|
+
# user1 want to move 'The new folder' in 'Test folder'
|
161
|
+
user1.move(the_new_folder, test_folder)
|
162
|
+
|
163
|
+
# user1 own repository :
|
164
|
+
# |-- 'Root folder'
|
165
|
+
# |-- 'file2.jpg'
|
166
|
+
# |-- 'Test folder'
|
167
|
+
# | |-- 'The new folder'
|
168
|
+
# | | |-- 'file.txt'
|
149
169
|
|
150
170
|
# Delete a repo_item
|
151
171
|
# Note : user1 needs the ':can_delete => true' permission in the folder : the_new_folder (else the method returns `false`).
|
152
|
-
user1.delete_repo_item(
|
172
|
+
user1.delete_repo_item(test_folder)
|
153
173
|
|
154
174
|
# user1 own repository :
|
155
175
|
# |-- 'Root folder'
|
156
|
-
# |-- 'file2'
|
176
|
+
# |-- 'file2.jpg'
|
157
177
|
|
158
178
|
user1.delete_repo_item(file2)
|
159
179
|
|
@@ -202,6 +222,16 @@ user1.repo_items.all # => You get the repo_items that user1 has created
|
|
202
222
|
user2.shared_repo_items.all
|
203
223
|
```
|
204
224
|
|
225
|
+
If you only want to have the folders or the files, you can do it like that:
|
226
|
+
|
227
|
+
```ruby
|
228
|
+
# return only the own folders of user1
|
229
|
+
user1.repo_items.folders.all # => You get the repo_folders that user1 has created
|
230
|
+
|
231
|
+
# user2 want to get his shared repo_files
|
232
|
+
user2.shared_repo_items.files.all
|
233
|
+
```
|
234
|
+
|
205
235
|
Recall: a repo_item can be:
|
206
236
|
- A file
|
207
237
|
- A folder
|
@@ -276,11 +306,11 @@ sharing.remove_members({user2, group1})
|
|
276
306
|
#### Repository authorisations
|
277
307
|
|
278
308
|
The owner of a `repo_item` (file or folder) has all the authorisations on it. When he share this `repo_item`, he can choose what authorisation he gives to the share. The authorisations are :
|
279
|
-
- can_read?(repo_item) : The member can read (=download) this file/folder.
|
280
|
-
- can_create?(repo_item) : Can create in the repo_item (Note: if repo_item is nil (= root), always true).
|
281
|
-
- can_update?(repo_item) : Can update a repo_item.
|
282
|
-
- can_delete?(repo_item) : Can delete a repo_item.
|
283
|
-
- can_share?(repo_item) : Can share a repo_item.
|
309
|
+
- `can_read?(repo_item)` : The member can read (=download) this file/folder.
|
310
|
+
- `can_create?(repo_item)` : Can create in the repo_item (Note: if repo_item is nil (= root), always true).
|
311
|
+
- `can_update?(repo_item)` : Can update a repo_item.
|
312
|
+
- `can_delete?(repo_item)` : Can delete a repo_item.
|
313
|
+
- `can_share?(repo_item)` : Can share a repo_item.
|
284
314
|
|
285
315
|
To check if a user has one of this authorisation, you just have to write : `user1.can_read?(repo_item)`, `user1.can_share?(repo_item)`, etc (it returns `true` or `false`).
|
286
316
|
|
@@ -303,18 +333,45 @@ You can get all the authorisations with this method: `user1.get_authorisations(r
|
|
303
333
|
#### Sharing permissions
|
304
334
|
|
305
335
|
You can manage the permissions of a member in a sharing. The owner of the sharing has all the permissions. The permissions are:
|
306
|
-
- can_add_to?(sharing) : The member can add a new instance in this sharing.
|
307
|
-
- can_remove_from?(sharing) : Can remove an instance from this sharing.
|
336
|
+
- `can_add_to?(sharing)` : The member can add a new instance in this sharing.
|
337
|
+
- `can_remove_from?(sharing)` : Can remove an instance from this sharing.
|
308
338
|
|
309
339
|
To check if the object can add or remove an instance in the sharing, just write : `group1.can_add_to?(sharing)` or `group1.can_remove_from?(sharing)` (it returns `true` or `false`).
|
310
340
|
|
311
341
|
Like the repo_item authorisations, you can get the sharing authorisations with : `group1.get_sharing_authorisations(sharing)`.
|
312
342
|
|
343
|
+
### Download a repository
|
344
|
+
|
345
|
+
RepositoryManager make the download of a repo_item easy. If the user want to download a file, the `user.download(repo_item)` method returns you the path of the file (if the user `can_read` it).
|
346
|
+
If it want to download a folder, it automaticaly genere a zip file with all the contant that the user can_read. The method returns the path of this zip file.
|
347
|
+
|
348
|
+
```ruby
|
349
|
+
# user1 want to download the_folder
|
350
|
+
path_to_zip = user1.download(the_folder)
|
351
|
+
|
352
|
+
# Then you can do what you want with this path, you can use the send_file method from rails in your controller
|
353
|
+
send_file path_to_zip
|
354
|
+
|
355
|
+
# Don't forget to delete the zip file after the user has downloaded it (when his session end for instance)
|
356
|
+
# I created a method how delete all the download file path
|
357
|
+
user1.delete_download_path()
|
358
|
+
```
|
359
|
+
|
360
|
+
You can directly download the folder (without permission control):
|
361
|
+
|
362
|
+
```ruby
|
363
|
+
# Directly download all the folder
|
364
|
+
path = the_folder.download
|
365
|
+
|
366
|
+
# You can delete the zip file with
|
367
|
+
the_folder.delete_zip
|
368
|
+
```
|
369
|
+
|
313
370
|
## TODO
|
314
371
|
|
315
|
-
-
|
372
|
+
- Qu'on ne puisse pas créer un deuxième sous partage pour le même user (évite beaucoup de soucis)
|
373
|
+
- Write the methods : move, copy, share_link, rename.
|
316
374
|
- Snapshot the file if possible
|
317
|
-
- Flexible configuration of authorised extensions
|
318
375
|
- Versioning
|
319
376
|
- ...
|
320
377
|
|
data/app/models/repo_file.rb
CHANGED
data/app/models/repo_folder.rb
CHANGED
@@ -6,39 +6,93 @@ class RepoFolder < RepoItem
|
|
6
6
|
validates :name, presence: true
|
7
7
|
|
8
8
|
# Add a repo_item in the folder.
|
9
|
-
def add(repo_item)
|
9
|
+
def add!(repo_item)
|
10
10
|
# We check if this name already exist
|
11
|
+
#if repo_item.children.exists?(:name => repo_item.name)
|
11
12
|
if RepoItem.where(name: repo_item.name).where(id: child_ids).first
|
12
|
-
|
13
|
+
raise RepositoryManager::RepositoryManagerException.new("add failed. The repo_item '#{repo_item.name}' already exist in the folder '#{name}'")
|
13
14
|
false
|
14
15
|
else
|
15
16
|
repo_item.update_attribute :parent, self
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
def add(repo_item)
|
21
|
+
begin
|
22
|
+
add!(repo_item)
|
23
|
+
rescue RepositoryManager::RepositoryManagerException
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Download this folder (zip it first)
|
29
|
+
# Return the path to the folder.zip
|
30
|
+
# options can have :
|
31
|
+
# :object => Object : is the object that request the download
|
32
|
+
# If object = nil, it download all the folder
|
33
|
+
# if object is set, it download only the folder that the object `can_read`.
|
34
|
+
# :path => 'path/to/zip/' is the path where the zip is generated
|
35
|
+
def download!(options = {})
|
23
36
|
# Get all the children
|
24
37
|
children = RepoItem.find(child_ids)
|
25
38
|
|
26
39
|
# If something is in the array to add, we zip it
|
27
40
|
if children.length > 0
|
28
|
-
|
29
|
-
|
41
|
+
|
42
|
+
# Default values
|
43
|
+
options[:object]? object = options[:object]: object = nil
|
44
|
+
|
45
|
+
RepositoryManager.default_zip_path == true ? path = get_default_download_path(object): path = RepositoryManager.default_zip_path
|
46
|
+
path = options[:path] if options[:path]
|
47
|
+
|
48
|
+
full_path = "#{path}#{name}.zip"
|
49
|
+
|
50
|
+
# Create the directory if not exist
|
51
|
+
dir = File.dirname(full_path)
|
52
|
+
unless File.directory?(dir)
|
53
|
+
FileUtils.mkdir_p(dir)
|
54
|
+
end
|
55
|
+
# Delete the zip if it already exist
|
56
|
+
File.delete(full_path) if File.exist?(full_path)
|
57
|
+
|
58
|
+
Zip::File.open(full_path, Zip::File::CREATE) { |zf|
|
30
59
|
add_repo_item_to_zip(children, zf, object)
|
31
60
|
}
|
61
|
+
return full_path
|
32
62
|
else
|
33
63
|
# Nothing to download here
|
34
|
-
|
64
|
+
raise RepositoryManager::RepositoryManagerException.new("download failed. Folder #{name} is empty")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def download(options = {})
|
69
|
+
begin
|
70
|
+
download!(options)
|
71
|
+
rescue RepositoryManager::RepositoryManagerException
|
35
72
|
false
|
36
73
|
end
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
# Delete the zip file
|
78
|
+
def delete_zip(options = {})
|
79
|
+
options[:object]? object = options[:object]: object = nil
|
80
|
+
RepositoryManager.default_zip_path == true ? path = get_default_download_path(object): path = RepositoryManager.default_zip_path
|
81
|
+
path = options[:path] if options[:path]
|
37
82
|
|
83
|
+
# Delete the path
|
84
|
+
FileUtils.rm_rf(path)
|
38
85
|
end
|
39
86
|
|
40
87
|
private
|
41
88
|
|
89
|
+
# Returns the default path of the zip file
|
90
|
+
# object is the object that want to download this file
|
91
|
+
def get_default_download_path(object = nil)
|
92
|
+
object ? add_to_path = object.get_default_download_path(''): add_to_path = ''
|
93
|
+
"download/#{add_to_path}#{self.class.to_s.underscore}/#{self.id}/"
|
94
|
+
end
|
95
|
+
|
42
96
|
def add_repo_item_to_zip(children, zf, object = nil, prefix = nil)
|
43
97
|
children.each do |child|
|
44
98
|
# If this is a file, we just add this file to the zip
|
data/app/models/repo_item.rb
CHANGED
@@ -4,7 +4,7 @@ class RepoItem < ActiveRecord::Base
|
|
4
4
|
|
5
5
|
has_ancestry
|
6
6
|
|
7
|
-
# Associate with the User
|
7
|
+
# Associate with the User Class
|
8
8
|
belongs_to :owner, :polymorphic => true
|
9
9
|
has_many :sharings, :dependent => :destroy
|
10
10
|
#has_many :members, through: :sharings
|
@@ -30,13 +30,22 @@ class RepoItem < ActiveRecord::Base
|
|
30
30
|
#new_file
|
31
31
|
end
|
32
32
|
|
33
|
-
# Move
|
34
|
-
|
35
|
-
def move(target_folder)
|
33
|
+
# Move itself into the target_folder
|
34
|
+
def move!(target_folder)
|
36
35
|
if target_folder.type == 'RepoFolder'
|
37
36
|
self.update_attribute :parent, target_folder
|
37
|
+
else
|
38
|
+
raise RepositoryManager::RepositoryManagerException.new("move failed. target '#{name}' can't be a file")
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
42
|
+
def move(target_folder)
|
43
|
+
begin
|
44
|
+
move!(target_folder)
|
45
|
+
rescue RepositoryManager::RepositoryManagerException
|
46
|
+
false
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
41
50
|
|
42
|
-
end
|
51
|
+
end
|
data/app/models/sharing.rb
CHANGED
@@ -26,7 +26,7 @@ class Sharing < ActiveRecord::Base
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# Add members to the sharing
|
29
|
-
def add_members(members, sharing_permissions =
|
29
|
+
def add_members(members, sharing_permissions = RepositoryManager.default_sharing_permissions)
|
30
30
|
if members.kind_of?(Array)
|
31
31
|
# Add each member to this sharing
|
32
32
|
members.each do |i|
|
@@ -5,4 +5,8 @@ RepositoryManager.setup do |config|
|
|
5
5
|
|
6
6
|
# Default sharing permissions that an object has when he is added in a sharing.
|
7
7
|
config.default_sharing_permissions = { can_add: false, can_remove: false }
|
8
|
+
|
9
|
+
# Default path for generating the zip file when a user want to download a folder
|
10
|
+
# Default is : "download/#{member.class.to_s.underscore}/#{member.id}/#{self.class.to_s.underscore}/#{self.id}/"
|
11
|
+
#config.default_zip_path = true
|
8
12
|
end
|
data/lib/repository-manager.rb
CHANGED
@@ -8,6 +8,9 @@ module RepositoryManager
|
|
8
8
|
mattr_accessor :default_sharing_permissions
|
9
9
|
@@default_sharing_permissions = { can_add: false, can_remove: false }
|
10
10
|
|
11
|
+
mattr_accessor :default_zip_path
|
12
|
+
@@default_zip_path = true
|
13
|
+
|
11
14
|
class << self
|
12
15
|
def setup
|
13
16
|
yield self
|
@@ -20,4 +23,5 @@ module RepositoryManager
|
|
20
23
|
|
21
24
|
end
|
22
25
|
|
23
|
-
require 'repository_manager/engine'
|
26
|
+
require 'repository_manager/engine'
|
27
|
+
require 'repository_manager/exceptions'
|
@@ -35,7 +35,7 @@ module RepositoryManager
|
|
35
35
|
# options[:sharing_permissions] contains :
|
36
36
|
# <tt>:can_add</tt> - Specify if the member can add objects to the sharing
|
37
37
|
# <tt>:can_remove</tt> - Specify if the member can remove object to the sharing
|
38
|
-
def share(repo_item, members, options =
|
38
|
+
def share!(repo_item, members, options = {})
|
39
39
|
authorisations = get_authorisations(repo_item)
|
40
40
|
|
41
41
|
# Here we look if the instance has the authorisation for making a sharing
|
@@ -46,10 +46,8 @@ module RepositoryManager
|
|
46
46
|
sharing_permissions = RepositoryManager.default_sharing_permissions
|
47
47
|
|
48
48
|
# If there is options, we have to take it
|
49
|
-
if options
|
50
|
-
|
51
|
-
sharing_permissions = options[:sharing_permissions] if options[:sharing_permissions]
|
52
|
-
end
|
49
|
+
repo_item_permissions = options[:repo_item_permissions] if options[:repo_item_permissions]
|
50
|
+
sharing_permissions = options[:sharing_permissions] if options[:sharing_permissions]
|
53
51
|
|
54
52
|
repo_item_permissions = make_repo_item_permissions(repo_item_permissions, authorisations)
|
55
53
|
|
@@ -63,7 +61,14 @@ module RepositoryManager
|
|
63
61
|
sharing
|
64
62
|
else
|
65
63
|
# No permission => No sharing
|
66
|
-
|
64
|
+
raise RepositoryManager::AuthorisationException.new("sharing failed. You don't have the permission to share the repo_item '#{repo_item.name}'")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def share(repo_item, members, options = {})
|
69
|
+
begin
|
70
|
+
share!(repo_item, members, options)
|
71
|
+
rescue RepositoryManager::AuthorisationException
|
67
72
|
false
|
68
73
|
end
|
69
74
|
end
|
@@ -71,7 +76,7 @@ module RepositoryManager
|
|
71
76
|
# Create a folder with the name (name) in the directory (source_folder)
|
72
77
|
# Returns the object of the folder created if it is ok
|
73
78
|
# Returns false if the folder is not created (no authorisation)
|
74
|
-
def create_folder(name = 'New folder', source_folder = nil)
|
79
|
+
def create_folder!(name = 'New folder', source_folder = nil)
|
75
80
|
# If he want to create a folder in a directory, we have to check if he have the authorisation
|
76
81
|
if can_create?(source_folder)
|
77
82
|
|
@@ -85,22 +90,35 @@ module RepositoryManager
|
|
85
90
|
else
|
86
91
|
# The add didn't works, we delete the folder
|
87
92
|
folder.destroy
|
88
|
-
|
89
|
-
false
|
93
|
+
raise RepositoryManager::RepositoryManagerException.new("create_folder failed. The folder '#{name}' already exist in folder '#{source_folder.name}'")
|
90
94
|
end
|
91
95
|
else
|
92
|
-
|
93
|
-
|
96
|
+
raise RepositoryManager::AuthorisationException.new("create_folder failed. You don't have the permission to create a folder in '#{source_folder.name}'")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def create_folder(name = 'New folder', source_folder = nil)
|
101
|
+
begin
|
102
|
+
create_folder!(name, source_folder)
|
103
|
+
rescue RepositoryManager::AuthorisationException, RepositoryManager::RepositoryManagerException
|
104
|
+
false
|
94
105
|
end
|
95
106
|
end
|
96
107
|
|
97
108
|
# Delete the repo_item
|
98
|
-
def delete_repo_item(repo_item)
|
109
|
+
def delete_repo_item!(repo_item)
|
99
110
|
if can_delete?(repo_item)
|
100
111
|
repo_item.destroy
|
101
112
|
else
|
102
|
-
|
103
|
-
|
113
|
+
raise RepositoryManager::AuthorisationException.new("delete_repo_item failed. You don't have the permission to delete the repo_item '#{repo_item.name}'")
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def delete_repo_item(repo_item)
|
118
|
+
begin
|
119
|
+
delete_repo_item!(repo_item)
|
120
|
+
rescue RepositoryManager::AuthorisationException
|
121
|
+
false
|
104
122
|
end
|
105
123
|
end
|
106
124
|
|
@@ -108,7 +126,7 @@ module RepositoryManager
|
|
108
126
|
# Param file can be a File, or a instance of RepoFile
|
109
127
|
# Return the object of the file created if it is ok
|
110
128
|
# Return false if the file is not created (no authorisation)
|
111
|
-
def create_file(file, source_folder = nil)
|
129
|
+
def create_file!(file, source_folder = nil)
|
112
130
|
# If he want to create a file in a directory, we have to check if he have the authorisation
|
113
131
|
if can_create?(source_folder)
|
114
132
|
if file.class.name == 'File'
|
@@ -128,12 +146,19 @@ module RepositoryManager
|
|
128
146
|
else
|
129
147
|
# The add didn't works, we delete the file
|
130
148
|
file.destroy
|
131
|
-
|
132
|
-
return false
|
149
|
+
raise RepositoryManager::RepositoryManagerException.new("create_file failed. The file '#{name}' already exist in folder '#{source_folder.name}'")
|
133
150
|
end
|
134
151
|
else
|
135
152
|
#raise "create_file failed. You don't have the permission to create a file in the folder '#{source_folder.name}'"
|
136
|
-
|
153
|
+
raise RepositoryManager::AuthorisationException.new("create_file failed. The file '#{name}' already exist in folder '#{source_folder.name}'")
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def create_file(file, source_folder = nil)
|
158
|
+
begin
|
159
|
+
create_file!(file, source_folder)
|
160
|
+
rescue RepositoryManager::AuthorisationException, RepositoryManager::RepositoryManagerException
|
161
|
+
false
|
137
162
|
end
|
138
163
|
end
|
139
164
|
|
@@ -150,16 +175,11 @@ module RepositoryManager
|
|
150
175
|
if repo_item.owner == self
|
151
176
|
# You can do what ever you want :)
|
152
177
|
return true
|
153
|
-
|
154
|
-
elsif s = self.sharings.where(repo_item_id: repo_item.id).first
|
155
|
-
# Ok, give an array with the permission of the actual sharing
|
156
|
-
# (we can't share with more permission then we have)
|
157
|
-
return {can_share: s.can_share, can_read: s.can_read, can_create: s.can_create, can_update: s.can_update, can_delete: s.can_delete}
|
178
|
+
# Find if a sharing of this rep exist for the self instance or it ancestors
|
158
179
|
else
|
159
|
-
|
160
|
-
ancestor_ids = repo_item.ancestor_ids
|
180
|
+
path_ids = repo_item.path_ids
|
161
181
|
# Check the nearest sharing if it exist
|
162
|
-
if s = self.sharings.where(repo_item_id:
|
182
|
+
if s = self.sharings.where(repo_item_id: path_ids).last
|
163
183
|
return {can_share: s.can_share, can_read: s.can_read, can_create: s.can_create, can_update: s.can_update, can_delete: s.can_delete}
|
164
184
|
end
|
165
185
|
end
|
@@ -171,15 +191,51 @@ module RepositoryManager
|
|
171
191
|
# If it is a file, he download the file
|
172
192
|
# If it is a folder, we check witch repo_item is in it, and witch he can_read
|
173
193
|
# We zip all the content that the object has access.
|
174
|
-
|
194
|
+
# options
|
195
|
+
# :path => 'path/to/zip'
|
196
|
+
def download!(repo_item, options = {})
|
175
197
|
if can_download?(repo_item)
|
176
|
-
|
198
|
+
path = options[:path] if options[:path]
|
199
|
+
|
200
|
+
repo_item.download({object: self, path: path})
|
177
201
|
else
|
178
|
-
|
202
|
+
raise RepositoryManager::AuthorisationException.new("download failed. You don't have the permission to download the repo_item '#{repo_item.name}'")
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def download(repo_item, options = {})
|
207
|
+
begin
|
208
|
+
download!(repo_item, options)
|
209
|
+
rescue RepositoryManager::AuthorisationException
|
179
210
|
false
|
180
211
|
end
|
181
212
|
end
|
182
213
|
|
214
|
+
# Move the repo_item in the target_folder
|
215
|
+
def move_repo_item!(repo_item, target_folder)
|
216
|
+
unless can_delete?(repo_item)
|
217
|
+
raise RepositoryManager::AuthorisationException.new("move repo_item failed. You don't have the permission to delete the repo_item '#{repo_item.name}'")
|
218
|
+
end
|
219
|
+
unless can_create?(target_folder)
|
220
|
+
raise RepositoryManager::AuthorisationException.new("move repo_item failed. You don't have the permission to create in the target_folder '#{target_folder.name}'")
|
221
|
+
end
|
222
|
+
# If it has the permission, we move the repo_item in the target_folder
|
223
|
+
repo_item.move(target_folder)
|
224
|
+
end
|
225
|
+
|
226
|
+
def move_repo_item(repo_item, target_folder)
|
227
|
+
begin
|
228
|
+
move_repo_item!(repo_item, target_folder)
|
229
|
+
rescue RepositoryManager::AuthorisationException
|
230
|
+
false
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# Delete the download folder of the user
|
235
|
+
def delete_download_path
|
236
|
+
FileUtils.rm_rf(self.get_default_download_path())
|
237
|
+
end
|
238
|
+
|
183
239
|
#Return the authorisations of the sharing (can_add, can_remove)
|
184
240
|
def get_sharing_authorisations(sharing)
|
185
241
|
sharing.get_authorisations(self)
|
@@ -217,6 +273,11 @@ module RepositoryManager
|
|
217
273
|
can_do?('delete', repo_item, authorisations)
|
218
274
|
end
|
219
275
|
|
276
|
+
# Return true it has a sharing in the repo_item
|
277
|
+
def has_sharing?(repo_item)
|
278
|
+
|
279
|
+
end
|
280
|
+
|
220
281
|
# Return true if you can add a member in this sharing, false else
|
221
282
|
def can_add_to?(sharing)
|
222
283
|
can_do_to?('add', sharing)
|
@@ -229,28 +290,47 @@ module RepositoryManager
|
|
229
290
|
|
230
291
|
# You can here add new members in the sharing
|
231
292
|
# Param member could be an object or an array of object
|
232
|
-
def add_members_to(sharing, members, options =
|
293
|
+
def add_members_to!(sharing, members, options = RepositoryManager.default_sharing_permissions)
|
233
294
|
authorisations = get_sharing_authorisations(sharing)
|
234
295
|
if can_add_to?(sharing)
|
235
296
|
sharing_permissions = make_sharing_permissions(options, authorisations)
|
236
297
|
sharing.add_members(members, sharing_permissions)
|
237
298
|
else
|
238
|
-
|
239
|
-
return false
|
299
|
+
raise RepositoryManager::AuthorisationException.new("add members failed. You don't have the permission to add a member in this sharing")
|
240
300
|
end
|
241
301
|
end
|
242
302
|
|
243
|
-
|
303
|
+
def add_members_to(sharing, members, options = RepositoryManager.default_sharing_permissions)
|
304
|
+
begin
|
305
|
+
add_members_to!(sharing, members, options = RepositoryManager.default_sharing_permissions)
|
306
|
+
rescue RepositoryManager::AuthorisationException
|
307
|
+
false
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
# You can here add new members in the sharing
|
244
312
|
# Param member could be an object or an array of object
|
245
|
-
def remove_members_from(sharing, members)
|
313
|
+
def remove_members_from!(sharing, members)
|
246
314
|
if can_remove_from?(sharing)
|
247
315
|
sharing.remove_members(members)
|
248
316
|
else
|
249
|
-
|
250
|
-
return false
|
317
|
+
raise RepositoryManager::AuthorisationException.new("remove members failed. You don't have the permission to remove a member on this sharing")
|
251
318
|
end
|
252
319
|
end
|
253
320
|
|
321
|
+
def remove_members_from(sharing, members)
|
322
|
+
begin
|
323
|
+
remove_members_from!(sharing, members)
|
324
|
+
rescue RepositoryManager::AuthorisationException
|
325
|
+
false
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
# Get the download path of the member
|
330
|
+
def get_default_download_path(prefix = 'download/')
|
331
|
+
"#{prefix}#{self.class.to_s.underscore}/#{self.id}/"
|
332
|
+
end
|
333
|
+
|
254
334
|
private
|
255
335
|
|
256
336
|
# Return if you can do or not this action in the sharing
|
@@ -269,7 +349,7 @@ module RepositoryManager
|
|
269
349
|
# Return if you can do or not this action (what)
|
270
350
|
def can_do?(what, repo_item, authorisations = nil)
|
271
351
|
#If we pass no authorisations we have to get it
|
272
|
-
if authorisations
|
352
|
+
if authorisations == nil
|
273
353
|
authorisations = get_authorisations(repo_item)
|
274
354
|
end
|
275
355
|
|
data/spec/dummy/db/test.sqlite3
CHANGED
Binary file
|
data/spec/has_repository_spec.rb
CHANGED
@@ -223,12 +223,14 @@ describe 'HasRepository' do
|
|
223
223
|
#folder = @user1.repo_items.last
|
224
224
|
expect(folder.name).to eq('test folder')
|
225
225
|
expect(folder.type).to eq('RepoFolder')
|
226
|
+
expect(@user1.repo_items.folders.count).to eq(1)
|
226
227
|
end
|
227
228
|
|
228
229
|
it "can create a file" do
|
229
230
|
file = @user1.create_file(File.open("#{Rails.root}/../fixture/textfile.txt"))
|
230
231
|
expect(file.name).to eq('textfile.txt')
|
231
232
|
expect(@user1.repo_items.count).to eq(1)
|
233
|
+
expect(@user1.repo_items.files.count).to eq(1)
|
232
234
|
end
|
233
235
|
|
234
236
|
end
|
@@ -111,11 +111,28 @@ describe 'RepoItem' do
|
|
111
111
|
user1_file3.save
|
112
112
|
@user1.create_file(user1_file3, @user1_folder)
|
113
113
|
|
114
|
+
@user1.download(@user1_folder)
|
115
|
+
@user1.download(@user1_folder)
|
116
|
+
@user1_folder.download
|
114
117
|
|
115
|
-
|
118
|
+
@user1_folder.delete_zip
|
119
|
+
@user1.delete_download_path()
|
116
120
|
end
|
117
121
|
|
118
122
|
it 'can\'t add a repo_item with the same name in a folder' do
|
123
|
+
root_folder = @user1.create_folder('Root folder')
|
124
|
+
root_folder.add(@user1_folder)
|
125
|
+
|
126
|
+
root_test_folder = @user1.create_folder('root test folder')
|
127
|
+
test_folder = @user1.create_folder('Test folder', root_test_folder)
|
128
|
+
@user1.create_folder('Nested test folder', test_folder)
|
129
|
+
|
130
|
+
@user1.move_repo_item(test_folder, @user1_folder)
|
131
|
+
|
132
|
+
expect(test_folder.parent_id).to eq(@user1_folder.id)
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'can move a folder into another folder' do
|
119
136
|
folder = @user1.create_folder('Folder1', @user1_folder)
|
120
137
|
expect(@user1.repo_items.count).to eq(3)
|
121
138
|
folder2 = @user1.create_folder('Folder1', @user1_folder)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: repository-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-11-
|
12
|
+
date: 2013-11-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- lib/generators/repository_manager/templates/initializer.rb
|
156
156
|
- lib/repository-manager.rb
|
157
157
|
- lib/repository_manager/engine.rb
|
158
|
+
- lib/repository_manager/exceptions.rb
|
158
159
|
- lib/repository_manager/has_repository.rb
|
159
160
|
- lib/repository_manager/version.rb
|
160
161
|
- lib/tasks/repository_manager_tasks.rake
|