openproject-global_roles 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|