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 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