redmine_nonproject_modules 0.2.1 → 0.3.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 +4 -4
- data/app/controllers/group_merge_controller.rb +3 -0
- data/app/controllers/group_permissions_controller.rb +3 -1
- data/app/controllers/nonproject_modules_controller.rb +7 -0
- data/app/helpers/group_merge_helper.rb +8 -6
- data/app/models/group_merge.rb +11 -8
- data/app/models/group_permission.rb +12 -4
- data/app/models/group_permissions_setup.rb +2 -0
- data/app/views/layouts/_nonproject_modules_menu.html.erb +14 -0
- data/app/views/layouts/nonproject_modules.html.erb +5 -0
- data/app/views/nonproject_modules/index.html.erb +7 -0
- data/config/initializers/000_dependencies.rb +2 -0
- data/config/locales/en.yml +2 -0
- data/config/locales/pt-BR.yml +2 -0
- data/config/routes.rb +4 -1
- data/init.rb +6 -1
- data/lib/redmine_nonproject_modules/dispatcher_finder.rb +3 -1
- data/lib/redmine_nonproject_modules/patches/controller_patch.rb +5 -2
- data/lib/redmine_nonproject_modules/patches/group_patch.rb +3 -0
- data/lib/redmine_nonproject_modules/patches/redmine/menu_manager_patch.rb +7 -4
- data/lib/redmine_nonproject_modules/patches/user_patch.rb +2 -0
- data/lib/redmine_nonproject_modules/version.rb +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 814d3dfc718b68bc5fe007744f2a692d11d4b1a9cbd2ee927a87ce50fa2567f8
|
4
|
+
data.tar.gz: 5012e42e690df9bbcea7403a72b116e633e98dabcac7cadd18e3386c9511c3e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c20081f983fb4fcbe99dced67e283c7448294fd03a6667a867e7bf56e1aa49ec2660ad2449189c056972b069ea858960246fd7b54a6fe9b12a25ac309f6337d
|
7
|
+
data.tar.gz: b896a7c1706015d050b178fa5faaa4d8c1d68cd0fa9a0bfc1bc6e7bbfa7df5867651ba58facb47389b8cae46802659b289fe969cedc5930d554e1c58a71e279b
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class GroupMergeController < ApplicationController
|
2
4
|
require_permission 'group_merge'
|
3
5
|
helper GroupMergeHelper
|
@@ -10,6 +12,7 @@ class GroupMergeController < ApplicationController
|
|
10
12
|
def check
|
11
13
|
@group_merge = ::GroupMerge.new(check_parameters)
|
12
14
|
return if @group_merge.valid?
|
15
|
+
|
13
16
|
build_targets_list
|
14
17
|
render :index
|
15
18
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class GroupPermissionsController < ApplicationController
|
2
4
|
require_permission 'group_permissions'
|
3
|
-
before_action :set_group, only: [
|
5
|
+
before_action :set_group, only: %i[show update]
|
4
6
|
|
5
7
|
def index
|
6
8
|
@groups = Group.sorted
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module GroupMergeHelper
|
2
4
|
def group_merge_elements_sorted(group_merge)
|
3
5
|
r = group_merge.to_merge_elements.map do |x|
|
@@ -8,8 +10,8 @@ module GroupMergeHelper
|
|
8
10
|
r.sort_by { |x| [x[0], x[1]] }
|
9
11
|
end
|
10
12
|
|
11
|
-
def group_merge_element_class(
|
12
|
-
"GroupMergeHelper_element_#{
|
13
|
+
def group_merge_element_class(element)
|
14
|
+
"GroupMergeHelper_element_#{element[1]}"
|
13
15
|
end
|
14
16
|
|
15
17
|
def group_merge_type_element_label(element)
|
@@ -21,11 +23,11 @@ module GroupMergeHelper
|
|
21
23
|
respond_to?(m) ? send(m, element) : element.to_s
|
22
24
|
end
|
23
25
|
|
24
|
-
def group_merge_member_element_label(
|
25
|
-
"#{t(:label_project)}: #{
|
26
|
+
def group_merge_member_element_label(member)
|
27
|
+
"#{t(:label_project)}: #{member.project} (#{member.roles.to_a.join(', ')})"
|
26
28
|
end
|
27
29
|
|
28
|
-
def group_merge_group_permission_element_label(
|
29
|
-
|
30
|
+
def group_merge_group_permission_element_label(group_permission)
|
31
|
+
group_permission.permission
|
30
32
|
end
|
31
33
|
end
|
data/app/models/group_merge.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'virtus'
|
2
4
|
|
3
5
|
class GroupMerge
|
@@ -39,16 +41,17 @@ class GroupMerge
|
|
39
41
|
end
|
40
42
|
|
41
43
|
def associations_to_merge
|
42
|
-
[
|
44
|
+
%i[users memberships permissions]
|
43
45
|
end
|
44
46
|
|
45
47
|
private
|
46
48
|
|
47
|
-
def element_on_status(
|
48
|
-
return ON_BOTH if target_elements.include?(
|
49
|
-
return ONLY_ON_TARGET if target_elements.include?(
|
50
|
-
return ONLY_ON_SOURCE if source_elements.include?(
|
51
|
-
|
49
|
+
def element_on_status(element)
|
50
|
+
return ON_BOTH if target_elements.include?(element) && source_elements.include?(element)
|
51
|
+
return ONLY_ON_TARGET if target_elements.include?(element)
|
52
|
+
return ONLY_ON_SOURCE if source_elements.include?(element)
|
53
|
+
|
54
|
+
raise "Element is neither on source nor on target: #{element}"
|
52
55
|
end
|
53
56
|
|
54
57
|
def target_elements
|
@@ -68,8 +71,8 @@ class GroupMerge
|
|
68
71
|
end
|
69
72
|
|
70
73
|
def source_new_elements
|
71
|
-
source_elements.
|
72
|
-
|
74
|
+
source_elements.reject do |x|
|
75
|
+
target_elements.include?(x)
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'eac_ruby_utils/simple_cache'
|
2
4
|
|
3
5
|
class GroupPermission < ActiveRecord::Base
|
@@ -27,23 +29,26 @@ class GroupPermission < ActiveRecord::Base
|
|
27
29
|
|
28
30
|
def permission?(permission, user = false)
|
29
31
|
return permission_by_hash?(permission, user) if permission.is_a?(Hash)
|
32
|
+
|
30
33
|
permission(permission).user_has?(user || User.current)
|
31
34
|
end
|
32
35
|
|
33
36
|
def permission(key)
|
34
37
|
key = key.to_s
|
35
38
|
return permissions_hash[key] if permissions_hash.key?(key)
|
39
|
+
|
36
40
|
raise "Not found \"#{key}\" in GroupPermission::permissions"
|
37
41
|
end
|
38
42
|
|
39
43
|
private
|
40
44
|
|
41
45
|
def permissions_hash
|
42
|
-
@
|
46
|
+
@permissions_hash ||= {}.with_indifferent_access
|
43
47
|
end
|
44
48
|
|
45
49
|
def permission_by_hash?(hash, user)
|
46
|
-
raise 'Hasy should have :or parameter'
|
50
|
+
raise 'Hasy should have :or parameter' if hash[:or].blank?
|
51
|
+
|
47
52
|
ps = hash[:or].is_a?(Array) ? hash[:or] : [hash[:or]]
|
48
53
|
ps.any? { |p| permission?(p, user) }
|
49
54
|
end
|
@@ -53,8 +58,8 @@ class GroupPermission < ActiveRecord::Base
|
|
53
58
|
include ::EacRubyUtils::SimpleCache
|
54
59
|
|
55
60
|
class << self
|
56
|
-
def sanitize_key(
|
57
|
-
|
61
|
+
def sanitize_key(key)
|
62
|
+
key.to_s.downcase
|
58
63
|
end
|
59
64
|
end
|
60
65
|
|
@@ -75,11 +80,13 @@ class GroupPermission < ActiveRecord::Base
|
|
75
80
|
|
76
81
|
def user_has?(user)
|
77
82
|
return true if user.admin
|
83
|
+
|
78
84
|
GroupPermission.where(group: user_groups(user), permission: depends_recursive.to_a).any?
|
79
85
|
end
|
80
86
|
|
81
87
|
def depends_recursive(visited = Set.new)
|
82
88
|
return [] if visited.include?(key)
|
89
|
+
|
83
90
|
r = Set.new([key])
|
84
91
|
visited << key
|
85
92
|
depends.each do |d|
|
@@ -96,6 +103,7 @@ class GroupPermission < ActiveRecord::Base
|
|
96
103
|
|
97
104
|
def user_groups(user)
|
98
105
|
return [Group.anonymous] if user.anonymous?
|
106
|
+
|
99
107
|
[Group.anonymous, Group.non_member] + user.groups
|
100
108
|
end
|
101
109
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% any_available = false %>
|
2
|
+
<% ::Redmine::Plugin.registered_plugins.keys.each do |plugin_key| %>
|
3
|
+
<% content = render_menu plugin_key %>
|
4
|
+
<% if content %>
|
5
|
+
<% any_available = true %>
|
6
|
+
<div style="margin-bottom: 1.0em">
|
7
|
+
<h4><%= t("menu_#{plugin_key}") %></h4>
|
8
|
+
<%= content %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
<% end %>
|
12
|
+
<% unless any_available %>
|
13
|
+
<p><em><%= t(:none_module_available) %></em></p>
|
14
|
+
<% end %>
|
data/config/locales/en.yml
CHANGED
@@ -4,7 +4,9 @@ en:
|
|
4
4
|
in_both_group: In both groups.
|
5
5
|
label_group_permission: Group permission
|
6
6
|
label_group_permission_plural: Groups / Permissions
|
7
|
+
label_nonproject_modules: Non-project
|
7
8
|
merge: Merge
|
9
|
+
none_module_available: 'No modules available.'
|
8
10
|
group_will_receive_elements: 'The group "%{group}" will receive the following elements:'
|
9
11
|
only_in_group: 'Only in "%{group}".'
|
10
12
|
permission_group_permissions_description: Read/write access to groups' permissions.
|
data/config/locales/pt-BR.yml
CHANGED
@@ -5,7 +5,9 @@ pt-BR:
|
|
5
5
|
in_both_group: Em ambos os grupos.
|
6
6
|
label_group_permission: Permissão de grupo
|
7
7
|
label_group_permission_plural: Grupos / Permissões
|
8
|
+
label_nonproject_modules: Não-projetos
|
8
9
|
merge: Mesclar
|
10
|
+
none_module_available: 'Nenhum módulo disponível.'
|
9
11
|
group_will_receive_elements: 'O grupo "%{group}" receberá os seguintes elementos:'
|
10
12
|
only_in_group: 'Somente em "%{group}".'
|
11
13
|
permission_group_permissions_description: Visualização/modificação das
|
data/config/routes.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
RedmineApp::Application.routes.draw do
|
2
|
-
resources(:group_permissions, only: [
|
4
|
+
resources(:group_permissions, only: %i[index show update])
|
5
|
+
resources(:nonproject_modules, only: [:index])
|
3
6
|
get '/group/:id/merge', to: 'group_merge#index', as: :merge_group
|
4
7
|
post '/group/:id/merge_check', to: 'group_merge#check', as: :merge_check_group
|
5
8
|
post '/group/:id/merge_confirm', to: 'group_merge#confirm', as: :merge_confirm_group
|
data/init.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'active_scaffold'
|
4
4
|
|
@@ -24,6 +24,11 @@ Redmine::Plugin.register :redmine_nonproject_modules do
|
|
24
24
|
if: proc { GroupPermission.permission?('group_permissions') }
|
25
25
|
end
|
26
26
|
|
27
|
+
Redmine::MenuManager.map :top_menu do |menu|
|
28
|
+
menu.push :nonproject_modules, { controller: 'nonproject_modules', action: 'index', id: nil },
|
29
|
+
caption: :label_nonproject_modules
|
30
|
+
end
|
31
|
+
|
27
32
|
ActiveScaffold.delayed_setup = true
|
28
33
|
end
|
29
34
|
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'eac_ruby_utils/simple_cache'
|
2
4
|
|
3
5
|
module RedmineNonprojectModules
|
4
6
|
# https://stackoverflow.com/questions/12088025/detect-if-application-was-started-as...
|
5
7
|
# https://github.com/newrelic/rpm/blob/master/lib/new_relic/local_environment.rb
|
6
8
|
class DispatcherFinder
|
7
|
-
WEBSERVER_DISPATCHERS = %w
|
9
|
+
WEBSERVER_DISPATCHERS = %w[webrick passenger].freeze
|
8
10
|
DISPATCHERS = WEBSERVER_DISPATCHERS
|
9
11
|
|
10
12
|
class << self
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RedmineNonprojectModules
|
2
4
|
module Patches
|
3
5
|
module ControllerPatch
|
@@ -7,14 +9,15 @@ module RedmineNonprojectModules
|
|
7
9
|
end
|
8
10
|
|
9
11
|
module ClassMethods
|
10
|
-
def require_permission(permission)
|
11
|
-
before_action { |c| c.before_action_require_permission(permission) }
|
12
|
+
def require_permission(permission, options = {})
|
13
|
+
before_action(options) { |c| c.before_action_require_permission(permission) }
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
17
|
module InstanceMethods
|
16
18
|
def before_action_require_permission(permission)
|
17
19
|
return true if GroupPermission.permission?(permission)
|
20
|
+
|
18
21
|
deny_access
|
19
22
|
end
|
20
23
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RedmineNonprojectModules
|
2
4
|
module Patches
|
3
5
|
module GroupPatch
|
@@ -12,6 +14,7 @@ module RedmineNonprojectModules
|
|
12
14
|
def add_permission(permission)
|
13
15
|
permission = permission.permission if permission.is_a?(::GroupPermission)
|
14
16
|
return if permissions.pluck(:permission).include?(permission)
|
17
|
+
|
15
18
|
::GroupPermission.create!(group: self, permission: permission)
|
16
19
|
end
|
17
20
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RedmineNonprojectModules
|
2
4
|
module Patches
|
3
5
|
module Redmine
|
@@ -72,10 +74,11 @@ module RedmineNonprojectModules
|
|
72
74
|
controller_class.const_get('PERMISSIONS')
|
73
75
|
end
|
74
76
|
|
75
|
-
def parse_permissions(
|
76
|
-
return parse_permissions(
|
77
|
-
return
|
78
|
-
|
77
|
+
def parse_permissions(permission)
|
78
|
+
return parse_permissions(permission.values) if permission.is_a?(Hash)
|
79
|
+
return permission.flat_map { |v| parse_permissions(v) } if permission.is_a?(Enumerable)
|
80
|
+
|
81
|
+
[permission.to_s]
|
79
82
|
end
|
80
83
|
end
|
81
84
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redmine_nonproject_modules
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- 0.
|
7
|
+
- 0.3.0
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_scaffold
|
@@ -88,6 +88,7 @@ files:
|
|
88
88
|
- app/assets/stylesheets/redmine_nonproject_modules.css
|
89
89
|
- app/controllers/group_merge_controller.rb
|
90
90
|
- app/controllers/group_permissions_controller.rb
|
91
|
+
- app/controllers/nonproject_modules_controller.rb
|
91
92
|
- app/helpers/group_merge_helper.rb
|
92
93
|
- app/models/group_merge.rb
|
93
94
|
- app/models/group_permission.rb
|
@@ -98,6 +99,9 @@ files:
|
|
98
99
|
- app/views/group_permissions/_member_context.html.erb
|
99
100
|
- app/views/group_permissions/index.html.erb
|
100
101
|
- app/views/group_permissions/show.html.erb
|
102
|
+
- app/views/layouts/_nonproject_modules_menu.html.erb
|
103
|
+
- app/views/layouts/nonproject_modules.html.erb
|
104
|
+
- app/views/nonproject_modules/index.html.erb
|
101
105
|
- config/initializers/000_dependencies.rb
|
102
106
|
- config/locales/en.yml
|
103
107
|
- config/locales/pt-BR.yml
|