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,57 @@
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 File.dirname(__FILE__) + '/../spec_helper'
13
+
14
+ describe UsersController do
15
+ before(:each) do
16
+ @controller.stub!(:require_admin).and_return(true)
17
+ @controller.stub!(:check_if_login_required)
18
+ @controller.stub!(:set_localization)
19
+ @global_roles = [mock_model(GlobalRole), mock_model(GlobalRole)]
20
+ GlobalRole.stub!(:all).and_return(@global_roles)
21
+ user_mock = mock_model User
22
+ user_mock.stub!(:logged?).and_return(true)
23
+ User.stub!(:find).with(any_args()).and_return(user_mock)
24
+
25
+ disable_log_requesting_user
26
+ end
27
+
28
+ describe "get" do
29
+ before :each do
30
+ @params = {"id" => "1"}
31
+ end
32
+
33
+ describe :edit do
34
+ before :each do
35
+
36
+ end
37
+
38
+ describe "RESULT" do
39
+ before :each do
40
+
41
+ end
42
+
43
+ describe "html" do
44
+ before :each do
45
+ get "edit", @params
46
+ end
47
+
48
+ it { response.should be_success }
49
+ it { assigns(:global_roles).should eql @global_roles }
50
+ it { response.should render_template "users/edit"}
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,16 @@
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
+ FactoryGirl.define do
13
+ factory :global_role do |gr|
14
+ gr.name "global_role"
15
+ end
16
+ end
@@ -0,0 +1,17 @@
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
+ FactoryGirl.define do
13
+ factory :principal_role do |pr|
14
+ pr.association :role, :factory => :global_role
15
+ pr.association :principal, :factory => :user
16
+ end
17
+ end
@@ -0,0 +1,56 @@
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 File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
13
+
14
+ describe Redmine::AccessControl do
15
+ before(:each) do
16
+ stash_access_control_permissions
17
+
18
+ Redmine::AccessControl.map do |map|
19
+ map.permission :proj0, {:dont => :care}, :require => :member
20
+ map.permission :global0, {:dont => :care}, :global => true
21
+ map.permission :proj1, {:dont => :care}
22
+
23
+ map.project_module :global_module do |mod|
24
+ mod.permission :global1, {:dont => :care}, :global => true
25
+ end
26
+
27
+ map.project_module :project_module do |mod|
28
+ mod.permission :proj2, {:dont => :care}
29
+ end
30
+
31
+ map.project_module :mixed_module do |mod|
32
+ mod.permission :proj3, {:dont => :care}
33
+ mod.permission :global2, {:dont => :care}, :global => true
34
+ end
35
+ end
36
+ end
37
+
38
+ after(:each) do
39
+ restore_access_control_permissions
40
+ end
41
+
42
+ describe "class methods" do
43
+ describe :global_permissions do
44
+ it {Redmine::AccessControl.global_permissions.should have(3).items}
45
+ it {Redmine::AccessControl.global_permissions.collect(&:name).should include(:global0)}
46
+ it {Redmine::AccessControl.global_permissions.collect(&:name).should include(:global1)}
47
+ it {Redmine::AccessControl.global_permissions.collect(&:name).should include(:global2)}
48
+ end
49
+
50
+ describe :available_project_modules do
51
+ it {Redmine::AccessControl.available_project_modules.include?(:global_module).should be_false }
52
+ it {Redmine::AccessControl.available_project_modules.include?(:global_module).should be_false }
53
+ it {Redmine::AccessControl.available_project_modules.include?(:mixed_module).should be_true }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,84 @@
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 File.dirname(__FILE__) + '/../../../spec_helper'
13
+
14
+ describe OpenProject::GlobalRoles::PrincipalAllowanceEvaluator::Global do
15
+
16
+ let(:klass) { OpenProject::GlobalRoles::PrincipalAllowanceEvaluator::Global }
17
+ let(:user) { FactoryGirl.build(:user) }
18
+ let(:filter) { klass.new user }
19
+ let(:member) { FactoryGirl.build(:member) }
20
+ let(:principal_role) { FactoryGirl.build(:principal_role,
21
+ :role => role) }
22
+ let(:principal_role2) { FactoryGirl.build(:principal_role) }
23
+ let(:role) { FactoryGirl.build(:global_role) }
24
+ let(:project) { FactoryGirl.build(:project) }
25
+
26
+ describe :granted_for_project? do
27
+ it { filter.granted_for_project?(member, :action, project).should be_false }
28
+ end
29
+
30
+ describe :denied_for_project? do
31
+ it { filter.denied_for_project?(member, :action, project).should be_false }
32
+ end
33
+
34
+ describe :granted_for_global? do
35
+ describe "WHEN checking a Member" do
36
+ it { filter.granted_for_global?(member, :action, {}).should be_false }
37
+ end
38
+
39
+ describe "WHEN checking a PrincipalRole
40
+ WHEN the PrincipalRole has a Role that is allowed the action" do
41
+ before do
42
+ role.permissions = [:action]
43
+ end
44
+
45
+ it { filter.granted_for_global?(principal_role, :action, {}).should be_true }
46
+ end
47
+
48
+ describe "WHEN checking a PrincipalRole
49
+ WHEN the PrincipalRole has a Role that is not allowed the action" do
50
+ it { filter.granted_for_global?(principal_role, :action, {}).should be_false }
51
+ end
52
+ end
53
+
54
+ describe :denied_for_global? do
55
+ it { filter.denied_for_global?(principal_role, :action, {}).should be_false }
56
+ end
57
+
58
+ describe :project_granting_candidates do
59
+ it { filter.project_granting_candidates(project).should =~ [] }
60
+ end
61
+
62
+ describe :global_granting_candidates do
63
+ describe "WHEN the user has a PrincipalRole assigned" do
64
+ before do
65
+ user.principal_roles = [principal_role]
66
+ end
67
+
68
+ it { filter.global_granting_candidates =~ [principal_role] }
69
+ end
70
+
71
+ describe "WHEN the user has multiple PrincipalRole assigned" do
72
+ before do
73
+ user.principal_roles = [principal_role, principal_role2]
74
+ end
75
+
76
+ it { filter.global_granting_candidates =~ [principal_role, principal_role2] }
77
+ end
78
+
79
+ describe "WHEN the user has no PrincipalRoles assigned" do
80
+ it { filter.global_granting_candidates =~ [] }
81
+ end
82
+ end
83
+ end
84
+
@@ -0,0 +1,40 @@
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 File.dirname(__FILE__) + '/../spec_helper'
13
+
14
+ describe Redmine::DefaultData::Loader do
15
+
16
+ describe :load do
17
+ before :each do
18
+ stash_access_control_permissions
19
+ create_non_member_role
20
+ create_anonymous_role
21
+ Redmine::DefaultData::Loader.load
22
+ end
23
+
24
+ after(:each) do
25
+ restore_access_control_permissions
26
+ end
27
+
28
+ #describes only the results of load in the db
29
+ it {Role.find_by_name(I18n.t(:default_role_manager)).attributes["type"].should eql "Role"}
30
+
31
+ if Redmine::VERSION::MAJOR < 1
32
+ it {Role.find_by_name(I18n.t(:default_role_developper)).attributes["type"].should eql "Role"} #[sic]
33
+ else
34
+ it {Role.find_by_name(I18n.t(:default_role_developer)).attributes["type"].should eql "Role"} #[sic]
35
+ end
36
+
37
+ it {Role.find_by_name(I18n.t(:default_role_reporter)).attributes["type"].should eql "Role"}
38
+ end
39
+
40
+ end
@@ -0,0 +1,41 @@
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 File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
13
+
14
+ describe Redmine::AccessControl::Permission do
15
+ describe "WHEN setting global permission" do
16
+ describe "creating with", :new do
17
+ before {@permission = Redmine::AccessControl::Permission.new(:perm, {:cont => [:action]}, {:global => true})}
18
+ describe :global? do
19
+ it {@permission.global?.should be_true}
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "setting non_global" do
25
+ describe "creating with", :new do
26
+ before {@permission = Redmine::AccessControl::Permission.new :perm, {:cont => [:action]}, {:global => false}}
27
+
28
+ describe :global? do
29
+ it {@permission.global?.should be_false}
30
+ end
31
+ end
32
+
33
+ describe "creating with", :new do
34
+ before {@permission = Redmine::AccessControl::Permission.new :perm, {:cont => [:action]}, {}}
35
+
36
+ describe :global? do
37
+ it {@permission.global?.should be_false}
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,175 @@
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 File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
13
+
14
+ describe GlobalRole do
15
+ before {GlobalRole.create :name => "globalrole", :permissions => ["permissions"]} # for validate_uniqueness_of
16
+
17
+ it {should have_many :principals}
18
+ it {should have_many :principal_roles}
19
+ it {should validate_presence_of :name}
20
+ it {should validate_uniqueness_of :name}
21
+ it {should ensure_length_of(:name).is_at_most(30)}
22
+
23
+ describe "attributes" do
24
+ before {@role = GlobalRole.new}
25
+
26
+ subject {@role}
27
+
28
+ it {should respond_to :name}
29
+ it {should respond_to :permissions}
30
+ it {should respond_to :position}
31
+ end
32
+
33
+ describe "class methods" do
34
+ describe "WITH available global permissions defined" do
35
+ before (:each) do
36
+ @permission_options = [:perm1, :perm2, :perm3]
37
+ Redmine::AccessControl.stub!(:global_permissions).and_return(@permission_options)
38
+ end
39
+
40
+ describe :setable_permissions do
41
+ it {GlobalRole.setable_permissions.should eql @permission_options}
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "instance methods" do
47
+ before (:each) do
48
+ @role = GlobalRole.new
49
+
50
+ if costs_plugin_loaded?
51
+ @perm = Object.new
52
+ Redmine::AccessControl.stub!(:permission).and_return @perm
53
+ @perm.stub!(:inherited_by).and_return([])
54
+ @perm.stub!(:name).and_return(:perm)
55
+ @perm.stub!(:inherits).and_return([])
56
+ end
57
+ end
58
+
59
+ describe "WITH no attributes set" do
60
+ before (:each) do
61
+ @role = GlobalRole.new
62
+ end
63
+
64
+ describe :permissions do
65
+ subject {@role.permissions}
66
+
67
+ it {should be_an_instance_of(Array)}
68
+ it {should have(0).items}
69
+ end
70
+
71
+ describe :permissions= do
72
+ describe "WITH parameter" do
73
+ before {@role.should_receive(:write_attribute).with(:permissions, [:perm1, :perm2])}
74
+
75
+ it "should write permissions" do
76
+ @role.permissions = [:perm1, :perm2]
77
+ end
78
+
79
+ it "should write permissions only once" do
80
+ @role.permissions = [:perm1, :perm2, :perm2]
81
+ end
82
+
83
+ it "should write permissions as symbols" do
84
+ @role.permissions = ["perm1", "perm2"]
85
+ end
86
+
87
+ it "should remove empty perms" do
88
+ @role.permissions = [:perm1, :perm2, "", nil]
89
+ end
90
+ end
91
+
92
+ describe "WITHOUT parameter" do
93
+ before {@role.should_receive(:write_attribute).with(:permissions, nil)}
94
+
95
+ it "should write permissions" do
96
+ @role.permissions = nil
97
+ end
98
+ end
99
+ end
100
+
101
+ describe :has_permission? do
102
+ it {@role.has_permission?(:perm).should be_false}
103
+ end
104
+
105
+ describe :allowed_to? do
106
+ describe "WITH requested permission" do
107
+ it {@role.allowed_to?(:perm1).should be_false}
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "WITH set permissions" do
113
+ before{ @role = GlobalRole.new :permissions => [:perm1, :perm2, :perm3]}
114
+
115
+ describe :has_permission? do
116
+ it {@role.has_permission?(:perm1).should be_true}
117
+ it {@role.has_permission?("perm1").should be_true}
118
+ it {@role.has_permission?(:perm5).should be_false}
119
+ end
120
+
121
+ describe :allowed_to? do
122
+ describe "WITH requested permission" do
123
+ it {@role.allowed_to?(:perm1).should be_true}
124
+ it {@role.allowed_to?(:perm5).should be_false}
125
+ end
126
+ end
127
+ end
128
+
129
+ describe "WITH available global permissions defined" do
130
+ before (:each) do
131
+ @role = GlobalRole.new
132
+ @permission_options = [:perm1, :perm2, :perm3]
133
+ Redmine::AccessControl.stub!(:global_permissions).and_return(@permission_options)
134
+ end
135
+
136
+ describe :setable_permissions do
137
+ it {@role.setable_permissions.should eql @permission_options}
138
+ end
139
+ end
140
+
141
+ describe "WITH set name" do
142
+ before{ @role = GlobalRole.new :name => "name"}
143
+
144
+ describe :to_s do
145
+ it {@role.to_s.should eql("name")}
146
+ end
147
+ end
148
+
149
+ describe :destroy do
150
+ before {@role = GlobalRole.create :name => "global"}
151
+
152
+ it {@role.destroy}
153
+ end
154
+
155
+ describe :assignable do
156
+ it {@role.assignable.should be_false}
157
+ end
158
+
159
+ describe :assignable= do
160
+ it {lambda {@role.assignable = true}.should raise_error ArgumentError}
161
+ it {lambda {@role.assignable = false}.should_not raise_error ArgumentError}
162
+ end
163
+
164
+ describe :assignable_to? do
165
+ before(:each) do
166
+ @role = FactoryGirl.build(:global_role)
167
+ @user = FactoryGirl.build(:user)
168
+ end
169
+ it "always true global roles for now" do
170
+ @role.assignable_to?(@user).should be_true
171
+ end
172
+ end
173
+ end
174
+
175
+ end