openproject-global_roles 1.0.0

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