openproject-global_roles 1.0.0
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 +15 -0
- data/CHANGELOG.md +22 -0
- data/README.md +89 -0
- data/app/assets/javascripts/global_roles/global_roles.js +91 -0
- data/app/assets/javascripts/global_roles/principal_roles.js +51 -0
- data/app/assets/stylesheets/global_roles/global_roles.css +18 -0
- data/app/controllers/principal_roles_controller.rb +139 -0
- data/app/models/global_role.rb +46 -0
- data/app/models/principal_role.rb +29 -0
- data/app/views/principal_roles/_errors.html.erb +13 -0
- data/app/views/principal_roles/_show_table_row.html.erb +28 -0
- data/app/views/principal_roles/index.html.erb +47 -0
- data/app/views/roles/_form.html.erb +52 -0
- data/app/views/roles/_global_attributes.html.erb +12 -0
- data/app/views/roles/_global_form.html.erb +12 -0
- data/app/views/roles/_member_attributes.html.erb +17 -0
- data/app/views/roles/_member_form.html.erb +39 -0
- data/app/views/roles/_permissions.html.erb +27 -0
- data/app/views/roles/edit.html.erb +20 -0
- data/app/views/roles/index.html.erb +57 -0
- data/app/views/roles/new.html.erb +18 -0
- data/app/views/shared/_global_roles_header.html.erb +16 -0
- data/app/views/users/_available_global_role.html.erb +14 -0
- data/app/views/users/_available_global_roles.html.erb +32 -0
- data/app/views/users/_global_roles.html.erb +33 -0
- data/config/locales/de.yml +11 -0
- data/config/locales/en.yml +11 -0
- data/config/routes.rb +14 -0
- data/db/migrate/001_sti_for_roles.rb +34 -0
- data/doc/COPYRIGHT.rdoc +16 -0
- data/doc/GPL.txt +674 -0
- data/lib/open_project/global_roles.rb +16 -0
- data/lib/open_project/global_roles/engine.rb +89 -0
- data/lib/open_project/global_roles/patches.rb +13 -0
- data/lib/open_project/global_roles/patches/access_control_patch.rb +41 -0
- data/lib/open_project/global_roles/patches/permission_patch.rb +49 -0
- data/lib/open_project/global_roles/patches/principal_patch.rb +24 -0
- data/lib/open_project/global_roles/patches/role_patch.rb +47 -0
- data/lib/open_project/global_roles/patches/roles_controller_patch.rb +62 -0
- data/lib/open_project/global_roles/patches/roles_helper_patch.rb +27 -0
- data/lib/open_project/global_roles/patches/user_patch.rb +24 -0
- data/lib/open_project/global_roles/patches/users_controller_patch.rb +34 -0
- data/lib/open_project/global_roles/patches/users_helper_patch.rb +39 -0
- data/lib/open_project/global_roles/principal_allowance_evaluator/global.rb +24 -0
- data/lib/open_project/global_roles/version.rb +16 -0
- data/lib/openproject-global_roles.rb +12 -0
- data/spec/controllers/principal_roles_controller_spec.rb +163 -0
- data/spec/controllers/roles_controller_spec.rb +315 -0
- data/spec/controllers/users_controller_spec.rb +57 -0
- data/spec/factories/global_role_factory.rb +16 -0
- data/spec/factories/principal_role_factory.rb +17 -0
- data/spec/lib/access_control_spec.rb +56 -0
- data/spec/lib/global_roles/principal_allowance_evaluator/global_spec.rb +84 -0
- data/spec/lib/loader_spec.rb +40 -0
- data/spec/lib/permission_spec.rb +41 -0
- data/spec/models/global_role_spec.rb +175 -0
- data/spec/models/principal_role_spec.rb +48 -0
- data/spec/models/principal_spec.rb +38 -0
- data/spec/models/role_spec.rb +43 -0
- data/spec/models/user_spec.rb +20 -0
- data/spec/plugin_spec_helper.rb +152 -0
- data/spec/spec_helper.rb +15 -0
- metadata +152 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NzY4ODY4MzJmNGE5MjUxMzhlOTc2NDkzMzMxMmZkZWRkNGFmZDBhZQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
OWViNzBhZmU0NzFhZGIyOTllZTlhY2QwZjUxMWQ3MjU0YjUxYzQyMg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YTYzMzhjYzBiZjI0ZTdkMjg5YWU4NGEzOTg5MjQzYTE3M2JmMWNiMzA5OWNh
|
10
|
+
OTBkOTMwOTgyMzJmNzE0YWQwNTY0NmM4Y2NiZmZhMGU4ZmVkNGU2OTcwMTY4
|
11
|
+
NjUyZDRiODZmZGEyMjRmNzg2ZjFiMjA2MjFkMzMyNzI1NDM4ODI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MDIwNDQ3NDRiMjBmNWM2MzU0NzUwOGNkNzQzYWY2NTZkZTJhM2U5YzFlYWRj
|
14
|
+
NTk4NmU3YjVhOTZjN2ZiODBhMTMwN2ViNGM3OGExYzkxNjJiYzk3NzgyZTEw
|
15
|
+
MGQ3NGQ1ZWI3MmNlMmI5NmU4NjM5OWZlN2FjMTc0NGVmOTJlMWM=
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 1.0.0
|
4
|
+
|
5
|
+
* `#1643` Public Release of Global Roles Plugin
|
6
|
+
|
7
|
+
## 1.0.0.pre4
|
8
|
+
|
9
|
+
* adapted cukes to changed steps from core
|
10
|
+
|
11
|
+
## 1.0.0.pre3
|
12
|
+
|
13
|
+
* `#1461` Fix for: Integration Activity Plugin
|
14
|
+
|
15
|
+
## 1.0.0.pre2
|
16
|
+
|
17
|
+
* '#1319' Fix for failures on CI
|
18
|
+
|
19
|
+
## 1.0.0.pre1
|
20
|
+
|
21
|
+
* First rails 3 version
|
22
|
+
* `#1284` Created initial changelog
|
data/README.md
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
OpenProject Global Roles Plugin
|
2
|
+
==========================
|
3
|
+
|
4
|
+
|
5
|
+
This plugin adds global roles to [OpenProject](https://www.openproject.org).
|
6
|
+
A user can have a global role allowing to perform actions outside of the scope
|
7
|
+
of a specific project normally only allowed for administrators.
|
8
|
+
By assigning the permission to create projects to a global role,
|
9
|
+
non-administrators can create top-level projects.
|
10
|
+
|
11
|
+
To create a global role, go to the Administration view, select "Roles and permissions"
|
12
|
+
and click on "New Role". Afterwards, select the checkbox "Global Role" and choose the
|
13
|
+
permissions for this role. From the plugin, only "Create project" is available.
|
14
|
+
However, there are other plugins adding more permissions to be assigned to global
|
15
|
+
roles.
|
16
|
+
|
17
|
+
The created global roles can be assigned to individual users in the added "Global Roles"
|
18
|
+
tab of the user settings.
|
19
|
+
|
20
|
+
Requirements
|
21
|
+
------------
|
22
|
+
|
23
|
+
The Global Roles plugin currently requires the [OpenProject Core](https://github.com/opf/openproject/) in
|
24
|
+
version 3.0.0pre13 or newer.
|
25
|
+
|
26
|
+
|
27
|
+
Installation
|
28
|
+
------------
|
29
|
+
|
30
|
+
Please follow the default [plugin installation instructions for
|
31
|
+
OpenProject](https://www.openproject.org/projects/openproject/wiki/Installation#222-Add-plugins),
|
32
|
+
adding the following line to the Gemfile.plugins:
|
33
|
+
|
34
|
+
`gem "openproject-global_roles"`
|
35
|
+
|
36
|
+
Afterwards, run:
|
37
|
+
|
38
|
+
`bundle install`
|
39
|
+
|
40
|
+
This plugin contains migrations. To migrate the database, run:
|
41
|
+
|
42
|
+
`rake openproject_global_roles:install:migrations`
|
43
|
+
|
44
|
+
`rake db:migrate`
|
45
|
+
|
46
|
+
Deinstallation
|
47
|
+
--------------
|
48
|
+
|
49
|
+
Currently, there complete automatic uninstall is not supported.
|
50
|
+
Before the plugin can be removed, all global roles have to be deleted.
|
51
|
+
Afterwards, remove the line
|
52
|
+
|
53
|
+
`gem "openproject-global_roles"`
|
54
|
+
|
55
|
+
from the file `Gemfile.plugins` and run:
|
56
|
+
|
57
|
+
`bundle install`
|
58
|
+
|
59
|
+
Please not that this changes by the plugin in the database. Currently, we do not
|
60
|
+
support full uninstall of the plugin.
|
61
|
+
|
62
|
+
Bug Reporting
|
63
|
+
-------------
|
64
|
+
|
65
|
+
If you find any bugs, you can create a bug ticket at
|
66
|
+
|
67
|
+
https://www.openproject.org/projects/plugin-global-roles
|
68
|
+
|
69
|
+
Development
|
70
|
+
-----------
|
71
|
+
|
72
|
+
To contribute, you can create pull request on the official repository at
|
73
|
+
|
74
|
+
`https://github.com/finnlabs/openproject-global_roles`
|
75
|
+
|
76
|
+
Credits
|
77
|
+
-------
|
78
|
+
|
79
|
+
Special thanks go to
|
80
|
+
|
81
|
+
* Deutsche Telekom AG (opensource@telekom.de) for project sponsorship
|
82
|
+
|
83
|
+
License
|
84
|
+
-------
|
85
|
+
|
86
|
+
(c) 2010 - 2013 - Finn GmbH
|
87
|
+
|
88
|
+
This plugin is licensed under the GNU GPL v3. See doc/COPYRIGHT.rdoc and
|
89
|
+
doc/GPL.txt for details.
|
@@ -0,0 +1,91 @@
|
|
1
|
+
//-- copyright
|
2
|
+
// OpenProject is a project management system.
|
3
|
+
//
|
4
|
+
// Copyright (C) 2010-2013 the OpenProject Team
|
5
|
+
//
|
6
|
+
// This program is free software; you can redistribute it and/or
|
7
|
+
// modify it under the terms of the GNU General Public License version 3.
|
8
|
+
//
|
9
|
+
// See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
//++
|
11
|
+
|
12
|
+
//= require global_roles/principal_roles
|
13
|
+
|
14
|
+
var global_roles = {
|
15
|
+
init: function(){
|
16
|
+
global_roles.toggle_forms_on_click();
|
17
|
+
global_roles.activation_and_visibility_based_on_checked($('global_role'));
|
18
|
+
},
|
19
|
+
|
20
|
+
toggle_forms_on_click: function(){
|
21
|
+
$('global_role').observe("click", global_roles.toggle_forms);
|
22
|
+
},
|
23
|
+
|
24
|
+
toggle_forms: function(event){
|
25
|
+
global_roles.activation_and_visibility_based_on_checked(this)
|
26
|
+
},
|
27
|
+
|
28
|
+
activation_and_visibility_based_on_checked: function(element){
|
29
|
+
if($(element).checked){
|
30
|
+
global_roles.show_global_forms();
|
31
|
+
global_roles.hide_member_forms();
|
32
|
+
global_roles.enable_global_forms();
|
33
|
+
global_roles.disable_member_forms();
|
34
|
+
}
|
35
|
+
else{
|
36
|
+
global_roles.show_member_forms();
|
37
|
+
global_roles.hide_global_forms();
|
38
|
+
global_roles.disable_global_forms();
|
39
|
+
global_roles.enable_member_forms();
|
40
|
+
}
|
41
|
+
},
|
42
|
+
|
43
|
+
show_global_forms: function(){
|
44
|
+
$('global_attributes').show();
|
45
|
+
$('global_permissions').show();
|
46
|
+
},
|
47
|
+
|
48
|
+
show_member_forms: function(){
|
49
|
+
$('member_attributes').show();
|
50
|
+
$('member_permissions').show();
|
51
|
+
},
|
52
|
+
|
53
|
+
hide_global_forms: function(){
|
54
|
+
$('global_attributes').hide();
|
55
|
+
$('global_permissions').hide();
|
56
|
+
},
|
57
|
+
|
58
|
+
hide_member_forms: function(){
|
59
|
+
$('member_attributes').hide();
|
60
|
+
$('member_permissions').hide();
|
61
|
+
},
|
62
|
+
|
63
|
+
enable_global_forms: function(){
|
64
|
+
$$('#global_attributes input, #global_attributes input').each(global_roles.enable_element);
|
65
|
+
$$('#global_permissions input').each(global_roles.enable_element);
|
66
|
+
},
|
67
|
+
|
68
|
+
enable_member_forms: function(){
|
69
|
+
$$('#member_attributes input, #member_attributes input').each(global_roles.enable_element);
|
70
|
+
$$('#member_permissions input').each(global_roles.enable_element);
|
71
|
+
},
|
72
|
+
|
73
|
+
enable_element: function(element){
|
74
|
+
element.enable();
|
75
|
+
},
|
76
|
+
|
77
|
+
disable_global_forms: function(){
|
78
|
+
$$('#global_attributes input, #global_attributes input').each(global_roles.disable_element);
|
79
|
+
$$('#global_permissions input').each(global_roles.disable_element);;
|
80
|
+
},
|
81
|
+
|
82
|
+
disable_member_forms: function(){
|
83
|
+
$$('#member_attributes input, #member_attributes input').each(global_roles.disable_element);;
|
84
|
+
$$('#member_permissions input').each(global_roles.disable_element);;
|
85
|
+
},
|
86
|
+
|
87
|
+
disable_element: function(element){
|
88
|
+
element.disable();
|
89
|
+
}
|
90
|
+
};
|
91
|
+
document.observe("dom:loaded", global_roles.init);
|
@@ -0,0 +1,51 @@
|
|
1
|
+
//-- copyright
|
2
|
+
// OpenProject is a project management system.
|
3
|
+
//
|
4
|
+
// Copyright (C) 2010-2013 the OpenProject Team
|
5
|
+
//
|
6
|
+
// This program is free software; you can redistribute it and/or
|
7
|
+
// modify it under the terms of the GNU General Public License version 3.
|
8
|
+
//
|
9
|
+
// See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
//++
|
11
|
+
|
12
|
+
var principal_roles = {
|
13
|
+
init: function(){
|
14
|
+
principal_roles.set_table_visibility();
|
15
|
+
principal_roles.set_available_roles_visibility();
|
16
|
+
},
|
17
|
+
|
18
|
+
set_table_visibility: function(){
|
19
|
+
if ($$('#table_principal_roles_body tr').length > 0){
|
20
|
+
$('table_principal_roles').show();
|
21
|
+
$('no_data').hide();
|
22
|
+
}
|
23
|
+
else
|
24
|
+
{
|
25
|
+
$('table_principal_roles').hide();
|
26
|
+
$('no_data').show();
|
27
|
+
}
|
28
|
+
},
|
29
|
+
|
30
|
+
set_available_roles_visibility: function(){
|
31
|
+
if ($$('.principal_role_option').length > 0){
|
32
|
+
$('additional_principal_roles').show();
|
33
|
+
$('no_additional_principal_roles').hide();
|
34
|
+
}
|
35
|
+
else
|
36
|
+
{
|
37
|
+
$('additional_principal_roles').hide();
|
38
|
+
$('no_additional_principal_roles').show();
|
39
|
+
}
|
40
|
+
},
|
41
|
+
|
42
|
+
role_already_assigned: function(){
|
43
|
+
return ($$('.assigned_global_role_' + element.down('input').value).length > 0)
|
44
|
+
}
|
45
|
+
};
|
46
|
+
|
47
|
+
document.observe('dom:loaded', principal_roles.init);
|
48
|
+
|
49
|
+
Ajax.Responders.register({
|
50
|
+
onComplete: principal_roles.init
|
51
|
+
});
|
@@ -0,0 +1,18 @@
|
|
1
|
+
//-- copyright
|
2
|
+
// OpenProject is a project management system.
|
3
|
+
//
|
4
|
+
// Copyright (C) 2010-2013 the OpenProject Team
|
5
|
+
//
|
6
|
+
// This program is free software; you can redistribute it and/or
|
7
|
+
// modify it under the terms of the GNU General Public License version 3.
|
8
|
+
//
|
9
|
+
// See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
//++
|
11
|
+
|
12
|
+
span.label {
|
13
|
+
float:left;
|
14
|
+
margin-left: -180px;
|
15
|
+
text-align:right;
|
16
|
+
font-weight:bold;
|
17
|
+
width: 175px;
|
18
|
+
}
|
@@ -0,0 +1,139 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2010-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
class PrincipalRolesController < ApplicationController
|
13
|
+
|
14
|
+
def create
|
15
|
+
@principal_roles = new_principal_roles_from_params
|
16
|
+
@global_roles = GlobalRole.all
|
17
|
+
@user = Principal.find(params[:principal_role][:principal_id])
|
18
|
+
|
19
|
+
call_hook :principal_roles_controller_create_before_save,
|
20
|
+
{:principal_roles => @principal_roles}
|
21
|
+
|
22
|
+
@principal_roles.each{ |pr| pr.save } unless performed?
|
23
|
+
|
24
|
+
call_hook :principal_roles_controller_create_before_respond,
|
25
|
+
{:principal_roles => @principal_roles}
|
26
|
+
|
27
|
+
respond_to_create @principal_roles, @user, @global_roles unless performed?
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
@principal_role = PrincipalRole.find(params[:principal_role][:id])
|
32
|
+
|
33
|
+
call_hook :principal_roles_controller_update_before_save,
|
34
|
+
{:principal_role => @principal_role}
|
35
|
+
|
36
|
+
@principal_role.update_attributes(params[:principal_role]) unless performed?
|
37
|
+
|
38
|
+
call_hook :principal_roles_controller_update_before_respond,
|
39
|
+
{:principal_role => @principal_role}
|
40
|
+
|
41
|
+
respond_to_update @principal_role unless performed?
|
42
|
+
end
|
43
|
+
|
44
|
+
def destroy
|
45
|
+
@principal_role = PrincipalRole.find(params[:id])
|
46
|
+
@user = Principal.find(@principal_role.principal_id)
|
47
|
+
@global_roles = GlobalRole.all
|
48
|
+
|
49
|
+
call_hook :principal_roles_controller_destroy_before_destroy,
|
50
|
+
{:principal_role => @principal_role}
|
51
|
+
|
52
|
+
@principal_role.destroy unless performed?
|
53
|
+
|
54
|
+
call_hook :principal_roles_controller_destroy_before_respond,
|
55
|
+
{:principal_role => @principal_role}
|
56
|
+
|
57
|
+
respond_to_destroy @principal_role, @user, @global_roles unless performed?
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def new_principal_roles_from_params
|
63
|
+
pr_params = params[:principal_role].dup
|
64
|
+
role_ids = pr_params[:role_id] ? [pr_params.delete(:role_id)] : pr_params.delete(:role_ids)
|
65
|
+
principal_id = pr_params.delete(:principal_id)
|
66
|
+
|
67
|
+
roles = Role.find role_ids
|
68
|
+
|
69
|
+
principal_roles = []
|
70
|
+
role_ids.map(&:to_i).each do |role_id|
|
71
|
+
role = PrincipalRole.new(pr_params)
|
72
|
+
role.principal_id = principal_id
|
73
|
+
role.role = roles.detect {|r| r.id == role_id}
|
74
|
+
principal_roles << role
|
75
|
+
end
|
76
|
+
principal_roles
|
77
|
+
end
|
78
|
+
|
79
|
+
def respond_to_create principal_roles, user, global_roles
|
80
|
+
respond_to do |format|
|
81
|
+
format.js do
|
82
|
+
render(:update) do |page|
|
83
|
+
if principal_roles.all?{|r| r.valid?}
|
84
|
+
principal_roles.each do |role|
|
85
|
+
page.insert_html :top, 'table_principal_roles_body',
|
86
|
+
:partial => "principal_roles/show_table_row",
|
87
|
+
:locals => {:principal_role => role}
|
88
|
+
|
89
|
+
call_hook :principal_roles_controller_create_respond_js_role,
|
90
|
+
{:page => page, :principal_role => role}
|
91
|
+
end
|
92
|
+
|
93
|
+
page.replace "available_principal_roles",
|
94
|
+
:partial => "users/available_global_roles",
|
95
|
+
:locals => {:global_roles => global_roles,
|
96
|
+
:user => user}
|
97
|
+
else
|
98
|
+
page.insert_html :top, "tab-content-global_roles", :partial => 'errors'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def respond_to_update role
|
106
|
+
respond_to do |format|
|
107
|
+
format.js do
|
108
|
+
render(:update) do |page|
|
109
|
+
if role.valid?
|
110
|
+
page.replace "principal_role-#{role.id}",
|
111
|
+
:partial => "principal_roles/show_table_row",
|
112
|
+
:locals => {:principal_role => role}
|
113
|
+
else
|
114
|
+
page.insert_html :top, "tab-content-global_roles", :partial => 'errors'
|
115
|
+
end
|
116
|
+
|
117
|
+
call_hook :principal_roles_controller_update_respond_js_role,
|
118
|
+
{:page => page, :principal_role => role}
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def respond_to_destroy principal_role, user, global_roles
|
125
|
+
respond_to do |format|
|
126
|
+
format.js do
|
127
|
+
render(:update) do |page|
|
128
|
+
page.remove "principal_role-#{principal_role.id}"
|
129
|
+
page.replace "available_principal_roles",
|
130
|
+
:partial => "users/available_global_roles",
|
131
|
+
:locals => {:user => user, :global_roles => global_roles}
|
132
|
+
|
133
|
+
call_hook :principal_roles_controller_update_respond_js_role,
|
134
|
+
{:page => page, :principal_role => principal_role}
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2010-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
class GlobalRole < Role
|
13
|
+
has_many :principal_roles, :foreign_key => :role_id, :dependent => :destroy
|
14
|
+
has_many :principals, :through => :principal_roles
|
15
|
+
|
16
|
+
def initialize(*args)
|
17
|
+
super
|
18
|
+
self.assignable = false
|
19
|
+
end
|
20
|
+
|
21
|
+
def permissions=(perms)
|
22
|
+
perms = perms.collect {|p| p.to_sym unless p.blank? }.compact.uniq if perms
|
23
|
+
write_attribute(:permissions, perms)
|
24
|
+
end
|
25
|
+
|
26
|
+
def setable_permissions
|
27
|
+
Redmine::AccessControl.global_permissions
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.setable_permissions
|
31
|
+
Redmine::AccessControl.global_permissions
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
name
|
36
|
+
end
|
37
|
+
|
38
|
+
def assignable=(value)
|
39
|
+
raise ArgumentError if value == true
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
43
|
+
def assignable_to?(user)
|
44
|
+
true
|
45
|
+
end
|
46
|
+
end
|