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.
Files changed (63) hide show
  1. checksums.yaml +15 -0
  2. data/CHANGELOG.md +22 -0
  3. data/README.md +89 -0
  4. data/app/assets/javascripts/global_roles/global_roles.js +91 -0
  5. data/app/assets/javascripts/global_roles/principal_roles.js +51 -0
  6. data/app/assets/stylesheets/global_roles/global_roles.css +18 -0
  7. data/app/controllers/principal_roles_controller.rb +139 -0
  8. data/app/models/global_role.rb +46 -0
  9. data/app/models/principal_role.rb +29 -0
  10. data/app/views/principal_roles/_errors.html.erb +13 -0
  11. data/app/views/principal_roles/_show_table_row.html.erb +28 -0
  12. data/app/views/principal_roles/index.html.erb +47 -0
  13. data/app/views/roles/_form.html.erb +52 -0
  14. data/app/views/roles/_global_attributes.html.erb +12 -0
  15. data/app/views/roles/_global_form.html.erb +12 -0
  16. data/app/views/roles/_member_attributes.html.erb +17 -0
  17. data/app/views/roles/_member_form.html.erb +39 -0
  18. data/app/views/roles/_permissions.html.erb +27 -0
  19. data/app/views/roles/edit.html.erb +20 -0
  20. data/app/views/roles/index.html.erb +57 -0
  21. data/app/views/roles/new.html.erb +18 -0
  22. data/app/views/shared/_global_roles_header.html.erb +16 -0
  23. data/app/views/users/_available_global_role.html.erb +14 -0
  24. data/app/views/users/_available_global_roles.html.erb +32 -0
  25. data/app/views/users/_global_roles.html.erb +33 -0
  26. data/config/locales/de.yml +11 -0
  27. data/config/locales/en.yml +11 -0
  28. data/config/routes.rb +14 -0
  29. data/db/migrate/001_sti_for_roles.rb +34 -0
  30. data/doc/COPYRIGHT.rdoc +16 -0
  31. data/doc/GPL.txt +674 -0
  32. data/lib/open_project/global_roles.rb +16 -0
  33. data/lib/open_project/global_roles/engine.rb +89 -0
  34. data/lib/open_project/global_roles/patches.rb +13 -0
  35. data/lib/open_project/global_roles/patches/access_control_patch.rb +41 -0
  36. data/lib/open_project/global_roles/patches/permission_patch.rb +49 -0
  37. data/lib/open_project/global_roles/patches/principal_patch.rb +24 -0
  38. data/lib/open_project/global_roles/patches/role_patch.rb +47 -0
  39. data/lib/open_project/global_roles/patches/roles_controller_patch.rb +62 -0
  40. data/lib/open_project/global_roles/patches/roles_helper_patch.rb +27 -0
  41. data/lib/open_project/global_roles/patches/user_patch.rb +24 -0
  42. data/lib/open_project/global_roles/patches/users_controller_patch.rb +34 -0
  43. data/lib/open_project/global_roles/patches/users_helper_patch.rb +39 -0
  44. data/lib/open_project/global_roles/principal_allowance_evaluator/global.rb +24 -0
  45. data/lib/open_project/global_roles/version.rb +16 -0
  46. data/lib/openproject-global_roles.rb +12 -0
  47. data/spec/controllers/principal_roles_controller_spec.rb +163 -0
  48. data/spec/controllers/roles_controller_spec.rb +315 -0
  49. data/spec/controllers/users_controller_spec.rb +57 -0
  50. data/spec/factories/global_role_factory.rb +16 -0
  51. data/spec/factories/principal_role_factory.rb +17 -0
  52. data/spec/lib/access_control_spec.rb +56 -0
  53. data/spec/lib/global_roles/principal_allowance_evaluator/global_spec.rb +84 -0
  54. data/spec/lib/loader_spec.rb +40 -0
  55. data/spec/lib/permission_spec.rb +41 -0
  56. data/spec/models/global_role_spec.rb +175 -0
  57. data/spec/models/principal_role_spec.rb +48 -0
  58. data/spec/models/principal_spec.rb +38 -0
  59. data/spec/models/role_spec.rb +43 -0
  60. data/spec/models/user_spec.rb +20 -0
  61. data/spec/plugin_spec_helper.rb +152 -0
  62. data/spec/spec_helper.rb +15 -0
  63. metadata +152 -0
@@ -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=
@@ -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
@@ -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