redmine_nonproject_modules 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5376c3a5a50a27ab5825bf4c0d6c6cadc2d672047808792d8b7b2d5b47118443
4
- data.tar.gz: b173b20f273e8236950d0ac67641e40b23a88395ad35a7157828a6c29dddc296
3
+ metadata.gz: 814d3dfc718b68bc5fe007744f2a692d11d4b1a9cbd2ee927a87ce50fa2567f8
4
+ data.tar.gz: 5012e42e690df9bbcea7403a72b116e633e98dabcac7cadd18e3386c9511c3e1
5
5
  SHA512:
6
- metadata.gz: 3b78a4ccfc86da2be65496081ad35730be443faec2b2da9a299ceb4ae8a31e89ede3f94a8b16098484fc5be448b7835179a386c8d494a2201e31173d92ab1446
7
- data.tar.gz: 57bf1adcd605ee92b9d1be876d67c279cee75b90cc49017996c955dd61c81e61a31370958de94db143ac1fdde6b73c2a4152fcc8714aae1edfc90cfb72f1ed47
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: [:show, :update]
5
+ before_action :set_group, only: %i[show update]
4
6
 
5
7
  def index
6
8
  @groups = Group.sorted
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class NonprojectModulesController < ApplicationController
4
+ layout 'nonproject_modules'
5
+
6
+ def index; end
7
+ end
@@ -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(x)
12
- "GroupMergeHelper_element_#{x[1]}"
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(m)
25
- "#{t(:label_project)}: #{m.project} (#{m.roles.to_a.join(', ')})"
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(gp)
29
- gp.permission
30
+ def group_merge_group_permission_element_label(group_permission)
31
+ group_permission.permission
30
32
  end
31
33
  end
@@ -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
- [:users, :memberships, :permissions]
44
+ %i[users memberships permissions]
43
45
  end
44
46
 
45
47
  private
46
48
 
47
- def element_on_status(x)
48
- return ON_BOTH if target_elements.include?(x) && source_elements.include?(x)
49
- return ONLY_ON_TARGET if target_elements.include?(x)
50
- return ONLY_ON_SOURCE if source_elements.include?(x)
51
- raise "Element is neither on source nor on target: #{x}"
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.select do |x|
72
- !target_elements.include?(x)
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
- @permissions ||= {}.with_indifferent_access
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' unless hash[:or].present?
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(k)
57
- k.to_s.downcase
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
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class GroupPermissionsSetup
2
4
  include ActiveModel::Model
3
5
 
@@ -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 %>
@@ -0,0 +1,5 @@
1
+ <% content_for :sidebar do %>
2
+ <h3><%= t(:label_nonproject_modules) %></h3>
3
+ <%= render partial: 'layouts/nonproject_modules_menu' %>
4
+ <% end %>
5
+ <%= render :file => "layouts/base" %>
@@ -0,0 +1,7 @@
1
+ <h2><%= t(:label_nonproject_modules) %></h2>
2
+ <% if User.current.anonymous? %>
3
+ <p>Faça o <%= link_to('login', signin_path) %> para que o acesso aos módulos
4
+ apareçam à direita.</p>
5
+ <% else %>
6
+ <p>Navegue pelo menu à direita.</p>
7
+ <% end %>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Redmine::Plugin.post_register :redmine_nonproject_modules do
2
4
  # Source: https://github.com/esquilo-azul/redmine_plugins_helper
3
5
  requires_redmine_plugin(:redmine_plugins_helper, version_or_higher: '0.5.2')
@@ -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.
@@ -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: [:index, :show, :update])
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
- # coding: utf-8
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(webrick passenger).freeze
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(p)
76
- return parse_permissions(p.values) if p.is_a?(Hash)
77
- return p.flat_map { |v| parse_permissions(v) } if p.is_a?(Enumerable)
78
- [p.to_s]
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RedmineNonprojectModules
2
4
  module Patches
3
5
  module UserPatch
@@ -4,5 +4,5 @@ module RedmineNonprojectModules
4
4
  AUTHOR = 'Eduardo Henrique Bogoni'
5
5
  HOMEPAGE = 'https://github.com/esquilo-azul/redmine_nonproject_modules'
6
6
  SUMMARY = 'Support to non-project modules.'
7
- VERSION = '0.2.1'
7
+ VERSION = '0.3.0'
8
8
  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.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
- - 0.2.1
7
+ - 0.3.0
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-26 00:00:00.000000000 Z
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