gooddata 1.3.0-java → 1.3.1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +2 -0
- data/.document +0 -0
- data/.yardopts +0 -0
- data/CHANGELOG.md +48 -0
- data/CLI.md +0 -0
- data/CONTRIBUTING.md +19 -12
- data/Dockerfile +37 -0
- data/Guardfile +0 -0
- data/README.md +1 -1
- data/Rakefile +17 -1
- data/TODO.md +0 -0
- data/bin/run_brick.rb +31 -0
- data/dependency_decisions.yml +0 -0
- data/gooddata.gemspec +1 -0
- data/lib/gooddata/bricks/hello_world_brick.rb +21 -0
- data/lib/gooddata/bricks/middleware/gooddata_middleware.rb +12 -0
- data/lib/gooddata/bricks/middleware/logger_middleware.rb +12 -0
- data/lib/gooddata/bricks/pipeline.rb +12 -0
- data/lib/gooddata/exceptions/filter_maqlization.rb +0 -6
- data/lib/gooddata/extensions/class.rb +4 -0
- data/lib/gooddata/extensions/enumerable.rb +0 -3
- data/lib/gooddata/extensions/extensions.rb +0 -3
- data/lib/gooddata/extensions/false.rb +8 -16
- data/lib/gooddata/extensions/hash.rb +10 -41
- data/lib/gooddata/extensions/integer.rb +9 -3
- data/lib/gooddata/extensions/nil.rb +5 -13
- data/lib/gooddata/extensions/object.rb +0 -11
- data/lib/gooddata/extensions/string.rb +11 -5
- data/lib/gooddata/extensions/true.rb +8 -16
- data/lib/gooddata/helpers/global_helpers.rb +12 -0
- data/lib/gooddata/helpers/global_helpers_params.rb +5 -3
- data/lib/gooddata/lcm/actions/apply_custom_maql.rb +6 -0
- data/lib/gooddata/lcm/actions/base_action.rb +8 -2
- data/lib/gooddata/lcm/actions/collect_multiple_projects_column.rb +46 -0
- data/lib/gooddata/lcm/actions/collect_users_brick_users.rb +9 -2
- data/lib/gooddata/lcm/actions/execute_schedules.rb +0 -2
- data/lib/gooddata/lcm/actions/hello_world.rb +1 -1
- data/lib/gooddata/lcm/actions/synchronize_cas.rb +6 -0
- data/lib/gooddata/lcm/actions/synchronize_ldm.rb +6 -0
- data/lib/gooddata/lcm/actions/synchronize_user_filters.rb +70 -107
- data/lib/gooddata/lcm/actions/synchronize_users.rb +1 -13
- data/lib/gooddata/lcm/brick_logger.rb +26 -0
- data/lib/gooddata/lcm/lcm2.rb +46 -7
- data/lib/gooddata/lcm/types/base_type.rb +4 -0
- data/lib/gooddata/lcm/types/class/class.rb +2 -0
- data/lib/gooddata/lcm/types/complex/complex.rb +2 -0
- data/lib/gooddata/lcm/types/special/array.rb +2 -0
- data/lib/gooddata/mixins/is_folder.rb +0 -0
- data/lib/gooddata/mixins/to_json.rb +0 -0
- data/lib/gooddata/mixins/uri_getter.rb +0 -0
- data/lib/gooddata/models/blueprint/project_blueprint.rb +5 -5
- data/lib/gooddata/models/blueprint/to_manifest.rb +0 -2
- data/lib/gooddata/models/domain.rb +1 -0
- data/lib/gooddata/models/from_wire.rb +0 -2
- data/lib/gooddata/models/profile.rb +1 -1
- data/lib/gooddata/models/project.rb +5 -0
- data/lib/gooddata/models/user_filters/user_filter_builder.rb +49 -32
- data/lib/gooddata/models/user_group.rb +3 -0
- data/lib/gooddata/rest/README.md +0 -0
- data/lib/gooddata/rest/client.rb +4 -4
- data/lib/gooddata/rest/object.rb +2 -0
- data/lib/gooddata/version.rb +1 -1
- data/lib/templates/bricks/brick.rb.erb +0 -0
- data/lib/templates/bricks/main.rb.erb +0 -0
- data/lib/templates/project/Goodfile.erb +0 -0
- data/lib/templates/project/data/commits.csv +0 -0
- data/lib/templates/project/data/devs.csv +0 -0
- data/lib/templates/project/data/repos.csv +0 -0
- data/lib/templates/project/model/model.rb.erb +0 -0
- metadata +23 -5
- data/lib/gooddata/extensions/big_decimal.rb +0 -17
- data/lib/gooddata/extensions/numeric.rb +0 -15
- data/lib/gooddata/extensions/symbol.rb +0 -15
@@ -1,5 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
2
|
+
# This source code is licensed under the BSD-style license found in the
|
3
|
+
# LICENSE file in the root directory of this source tree.
|
4
|
+
|
5
|
+
module IntegerExtensions
|
6
|
+
refine Integer do
|
7
|
+
def to_b
|
8
|
+
self == 1
|
9
|
+
end
|
4
10
|
end
|
5
11
|
end
|
@@ -1,19 +1,11 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
#
|
3
1
|
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
2
|
# This source code is licensed under the BSD-style license found in the
|
5
3
|
# LICENSE file in the root directory of this source tree.
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def duplicable?
|
13
|
-
false
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_b
|
17
|
-
false
|
5
|
+
module NilExtensions
|
6
|
+
refine NilClass do
|
7
|
+
def to_b
|
8
|
+
false
|
9
|
+
end
|
18
10
|
end
|
19
11
|
end
|
@@ -1,9 +1,6 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
#
|
3
1
|
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
2
|
# This source code is licensed under the BSD-style license found in the
|
5
3
|
# LICENSE file in the root directory of this source tree.
|
6
|
-
|
7
4
|
class Object
|
8
5
|
class << self
|
9
6
|
def set_const(name, val)
|
@@ -12,14 +9,6 @@ class Object
|
|
12
9
|
end
|
13
10
|
end
|
14
11
|
|
15
|
-
def blank?
|
16
|
-
respond_to?(:empty?) ? empty? : !self
|
17
|
-
end
|
18
|
-
|
19
|
-
def duplicable?
|
20
|
-
true
|
21
|
-
end
|
22
|
-
|
23
12
|
def set_const(name, val)
|
24
13
|
send(:remove_const, name) if const_defined?(name)
|
25
14
|
send(:const_set, name, val)
|
@@ -1,7 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
2
|
+
# This source code is licensed under the BSD-style license found in the
|
3
|
+
# LICENSE file in the root directory of this source tree.
|
4
|
+
|
5
|
+
module StringExtensions
|
6
|
+
refine String do
|
7
|
+
def to_b
|
8
|
+
return true if self == true || self =~ (/(true|t|yes|y|1)$/i)
|
9
|
+
return false if self == false || blank? || self =~ (/(false|f|no|n|0)$/i)
|
10
|
+
raise ArgumentError, "invalid value for Boolean: \"#{self}\""
|
11
|
+
end
|
6
12
|
end
|
7
13
|
end
|
@@ -1,23 +1,15 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
#
|
3
1
|
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
2
|
# This source code is licensed under the BSD-style license found in the
|
5
3
|
# LICENSE file in the root directory of this source tree.
|
6
4
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def duplicable?
|
13
|
-
false
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_b
|
17
|
-
true
|
18
|
-
end
|
5
|
+
module TrueExtensions
|
6
|
+
refine TrueClass do
|
7
|
+
def to_b
|
8
|
+
true
|
9
|
+
end
|
19
10
|
|
20
|
-
|
21
|
-
|
11
|
+
def to_i
|
12
|
+
1
|
13
|
+
end
|
22
14
|
end
|
23
15
|
end
|
@@ -9,9 +9,21 @@ require 'pathname'
|
|
9
9
|
require 'hashie'
|
10
10
|
require 'openssl'
|
11
11
|
|
12
|
+
require 'active_support/core_ext/object/duplicable'
|
13
|
+
|
12
14
|
require_relative '../extensions/object'
|
13
15
|
require_relative 'global_helpers_params'
|
14
16
|
|
17
|
+
require 'gooddata/extensions/true'
|
18
|
+
require 'gooddata/extensions/false'
|
19
|
+
require 'gooddata/extensions/integer'
|
20
|
+
require 'gooddata/extensions/nil'
|
21
|
+
|
22
|
+
using TrueExtensions
|
23
|
+
using FalseExtensions
|
24
|
+
using IntegerExtensions
|
25
|
+
using NilExtensions
|
26
|
+
|
15
27
|
module GoodData
|
16
28
|
module Helpers
|
17
29
|
extend Hashie::Extensions::StringifyKeys::ClassMethods
|
@@ -1,14 +1,16 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
#
|
3
1
|
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
2
|
# This source code is licensed under the BSD-style license found in the
|
5
3
|
# LICENSE file in the root directory of this source tree.
|
4
|
+
require 'active_support/core_ext/hash/slice'
|
5
|
+
|
6
|
+
require 'gooddata/extensions/hash'
|
7
|
+
|
8
|
+
using HashExtensions
|
6
9
|
|
7
10
|
module GoodData
|
8
11
|
module Helpers
|
9
12
|
ENCODED_PARAMS_KEY = 'gd_encoded_params'
|
10
13
|
ENCODED_HIDDEN_PARAMS_KEY = 'gd_encoded_hidden_params'
|
11
|
-
|
12
14
|
class << self
|
13
15
|
# Encodes parameters for passing them to GD execution platform.
|
14
16
|
# Core types are kept and complex types (arrays, structures, etc) are
|
@@ -6,6 +6,12 @@
|
|
6
6
|
|
7
7
|
require_relative 'base_action'
|
8
8
|
|
9
|
+
using TrueExtensions
|
10
|
+
using FalseExtensions
|
11
|
+
using IntegerExtensions
|
12
|
+
using StringExtensions
|
13
|
+
using NilExtensions
|
14
|
+
|
9
15
|
module GoodData
|
10
16
|
module LCM2
|
11
17
|
# Applies custom MAQL DDL to all client projects so customized
|
@@ -1,8 +1,14 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
#
|
3
1
|
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
2
|
# This source code is licensed under the BSD-style license found in the
|
5
3
|
# LICENSE file in the root directory of this source tree.
|
4
|
+
require 'gooddata/extensions/class'
|
5
|
+
require 'gooddata/extensions/true'
|
6
|
+
require 'gooddata/extensions/false'
|
7
|
+
require 'gooddata/extensions/integer'
|
8
|
+
require 'gooddata/extensions/string'
|
9
|
+
require 'gooddata/extensions/nil'
|
10
|
+
|
11
|
+
require 'active_support/core_ext/hash/compact'
|
6
12
|
|
7
13
|
require_relative '../dsl/dsl'
|
8
14
|
require_relative '../helpers/helpers'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright (c) 2010-2017 GoodData Corporation. All rights reserved.
|
4
|
+
# This source code is licensed under the BSD-style license found in the
|
5
|
+
# LICENSE file in the root directory of this source tree.
|
6
|
+
require_relative 'base_action'
|
7
|
+
|
8
|
+
module GoodData
|
9
|
+
module LCM2
|
10
|
+
class CollectMultipleProjectsColumn < BaseAction
|
11
|
+
DESCRIPTION = 'Collect multiple_projects_column to be used in user actions'
|
12
|
+
|
13
|
+
PARAMS = define_params(self) do
|
14
|
+
description 'Client Used for Connecting to GD'
|
15
|
+
param :gdc_gd_client, instance_of(Type::GdClientType), required: true
|
16
|
+
|
17
|
+
description 'Identifier of column that identifies the relation to the projects in an user action input'
|
18
|
+
param :multiple_projects_column, instance_of(Type::StringType), required: false
|
19
|
+
|
20
|
+
description 'Synchronization Mode for user action (e.g. sync_one_project_based_on_pid)'
|
21
|
+
param :sync_mode, instance_of(Type::StringType), required: false
|
22
|
+
|
23
|
+
description 'Logger'
|
24
|
+
param :gdc_logger, instance_of(Type::GdLogger), required: true
|
25
|
+
end
|
26
|
+
|
27
|
+
CLIENT_ID_MODES = %w(
|
28
|
+
sync_domain_client_workspaces
|
29
|
+
sync_one_project_based_on_custom_id
|
30
|
+
sync_multiple_projects_based_on_custom_id
|
31
|
+
)
|
32
|
+
|
33
|
+
class << self
|
34
|
+
def call(params)
|
35
|
+
column = params.multiple_projects_column
|
36
|
+
column = CLIENT_ID_MODES.include?(params.sync_mode) ? 'client_id' : 'project_id' unless column
|
37
|
+
|
38
|
+
{
|
39
|
+
results: [{ multiple_projects_column: column }],
|
40
|
+
params: { multiple_projects_column: column }
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -16,6 +16,9 @@ module GoodData
|
|
16
16
|
'deletion of filters for a user that is to be removed.'
|
17
17
|
param :users_brick_config, instance_of(Type::UsersBrickConfig), required: true
|
18
18
|
|
19
|
+
description 'Column That Contains Target Project IDs'
|
20
|
+
param :multiple_projects_column, instance_of(Type::StringType), required: true
|
21
|
+
|
19
22
|
description 'Input Source'
|
20
23
|
param :input_source, instance_of(Type::HashType), required: false
|
21
24
|
end
|
@@ -36,11 +39,15 @@ module GoodData
|
|
36
39
|
headers: true,
|
37
40
|
return_headers: false,
|
38
41
|
encoding: 'utf-8') do |row|
|
39
|
-
users_brick_users << {
|
42
|
+
users_brick_users << {
|
43
|
+
login: row[login_column],
|
44
|
+
pid: row[params.multiple_projects_column]
|
45
|
+
}
|
40
46
|
end
|
41
47
|
|
42
48
|
{
|
43
|
-
results
|
49
|
+
# TODO; TMA-989 return the real results when print of results is fixed for large sets
|
50
|
+
results: [{ status: 'ok' }],
|
44
51
|
params: {
|
45
52
|
users_brick_users: users_brick_users
|
46
53
|
}
|
@@ -13,7 +13,7 @@ module GoodData
|
|
13
13
|
|
14
14
|
PARAMS = define_params(self) do
|
15
15
|
description 'Message to be printed'
|
16
|
-
param :message, instance_of(Type::StringType), required:
|
16
|
+
param :message, instance_of(Type::StringType), required: false
|
17
17
|
|
18
18
|
description 'Number of Iterations'
|
19
19
|
param :iterations, instance_of(Type::IntegerType), required: false, default: 1
|
@@ -6,6 +6,12 @@
|
|
6
6
|
|
7
7
|
require_relative 'base_action'
|
8
8
|
|
9
|
+
using TrueExtensions
|
10
|
+
using FalseExtensions
|
11
|
+
using IntegerExtensions
|
12
|
+
using StringExtensions
|
13
|
+
using NilExtensions
|
14
|
+
|
9
15
|
module GoodData
|
10
16
|
module LCM2
|
11
17
|
class SynchronizeUserFilters < BaseAction
|
@@ -64,7 +70,7 @@ module GoodData
|
|
64
70
|
param :gdc_project_id, instance_of(Type::StringType), required: false
|
65
71
|
|
66
72
|
description 'User brick users'
|
67
|
-
param :users_brick_users, instance_of(Type::ObjectType), required: false
|
73
|
+
param :users_brick_users, instance_of(Type::ObjectType), required: false, default: []
|
68
74
|
|
69
75
|
description 'Makes the brick run without altering user filters'
|
70
76
|
param :dry_run, instance_of(Type::StringType), required: false, default: false
|
@@ -91,36 +97,19 @@ module GoodData
|
|
91
97
|
fail "Either project or project_id has to be specified in params" unless project
|
92
98
|
data_product = params.data_product
|
93
99
|
|
94
|
-
data_source = GoodData::Helpers::DataSource.new(params.input_source)
|
95
|
-
|
96
100
|
config = params.filters_config
|
97
101
|
fail 'User filters brick requires configuration how the filter should be setup. For this use the param "filters_config"' if config.blank?
|
98
102
|
symbolized_config = GoodData::Helpers.deep_dup(config)
|
99
103
|
symbolized_config = GoodData::Helpers.symbolize_keys(symbolized_config)
|
100
104
|
symbolized_config[:labels] = symbolized_config[:labels].map { |l| GoodData::Helpers.symbolize_keys(l) }
|
101
|
-
|
105
|
+
multiple_projects_column = params.multiple_projects_column
|
102
106
|
|
103
107
|
mode = params.sync_mode
|
104
108
|
unless MODES.include?(mode)
|
105
109
|
fail "The parameter \"sync_mode\" has to have one of the values #{MODES.map(&:to_s).join(', ')} or has to be empty."
|
106
110
|
end
|
107
|
-
filters = []
|
108
|
-
|
109
|
-
csv_with_headers = if GoodData::UserFilterBuilder.row_based?(symbolized_config)
|
110
|
-
false
|
111
|
-
else
|
112
|
-
headers_in_options
|
113
|
-
end
|
114
111
|
|
115
|
-
|
116
|
-
unless multiple_projects_column
|
117
|
-
client_modes = %w(sync_domain_client_workspaces sync_one_project_based_on_custom_id sync_multiple_projects_based_on_custom_id)
|
118
|
-
multiple_projects_column = if client_modes.include?(mode)
|
119
|
-
'client_id'
|
120
|
-
else
|
121
|
-
'project_id'
|
122
|
-
end
|
123
|
-
end
|
112
|
+
user_filters = load_data(params, symbolized_config)
|
124
113
|
|
125
114
|
run_params = {
|
126
115
|
restrict_if_missing_all_values: params.restrict_if_missing_all_values == 'true',
|
@@ -133,85 +122,27 @@ module GoodData
|
|
133
122
|
|
134
123
|
puts "Synchronizing in mode \"#{mode}\""
|
135
124
|
case mode
|
136
|
-
when 'sync_project'
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
end
|
142
|
-
filters_to_load = GoodData::UserFilterBuilder.get_filters(filters, symbolized_config)
|
143
|
-
puts "Synchronizing #{filters_to_load.count} filters"
|
144
|
-
project.add_data_permissions(filters_to_load, run_params)
|
145
|
-
when 'sync_one_project_based_on_pid'
|
146
|
-
without_check(PARAMS, params) do
|
147
|
-
CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
|
148
|
-
filters << row if row[multiple_projects_column] == project.pid
|
149
|
-
end
|
150
|
-
end
|
151
|
-
filters_to_load = GoodData::UserFilterBuilder.get_filters(filters, symbolized_config)
|
152
|
-
puts "Synchronizing #{filters_to_load.count} filters"
|
153
|
-
project.add_data_permissions(filters_to_load, run_params)
|
154
|
-
when 'sync_multiple_projects_based_on_pid'
|
155
|
-
without_check(PARAMS, params) do
|
156
|
-
CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
|
157
|
-
filters << row.to_hash
|
158
|
-
end
|
159
|
-
end
|
160
|
-
if filters.empty?
|
161
|
-
fail 'The filter set can not be empty when using sync_multiple_projects_* mode as the filters contain \
|
162
|
-
the project ids in which the permissions should be changed'
|
163
|
-
end
|
164
|
-
filters.group_by { |u| u[multiple_projects_column] }.flat_map do |project_id, new_filters|
|
165
|
-
fail "Project id cannot be empty" if project_id.blank?
|
166
|
-
project = client.projects(project_id)
|
167
|
-
filters_to_load = GoodData::UserFilterBuilder.get_filters(new_filters, symbolized_config)
|
168
|
-
puts "Synchronizing #{filters_to_load.count} filters in project #{project.pid}"
|
169
|
-
project.add_data_permissions(filters_to_load, run_params)
|
125
|
+
when 'sync_project', 'sync_one_project_based_on_pid', 'sync_one_project_based_on_custom_id'
|
126
|
+
if mode == 'sync_one_project_based_on_pid'
|
127
|
+
filter = project.pid
|
128
|
+
elsif mode == 'sync_one_project_based_on_custom_id'
|
129
|
+
filter = UserBricksHelper.resolve_client_id(domain, project, params.data_product)
|
170
130
|
end
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
if filters.empty?
|
183
|
-
params.gdc_logger.warn "Project \"#{project.pid}\" does not match with any client ids in input source (both GOODOT_CUSTOM_PROJECT_ID and SEGMENT/CLIENT). \
|
184
|
-
Unable to get the value to filter users."
|
185
|
-
end
|
186
|
-
|
187
|
-
filters_to_load = GoodData::UserFilterBuilder.get_filters(filters, symbolized_config)
|
188
|
-
puts "Synchronizing #{filters_to_load.count} filters"
|
189
|
-
project.add_data_permissions(filters_to_load, run_params)
|
190
|
-
when 'sync_multiple_projects_based_on_custom_id'
|
191
|
-
without_check(PARAMS, params) do
|
192
|
-
CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
|
193
|
-
filters << row.to_hash
|
131
|
+
user_filters = user_filters.select { |f| f[:pid] == filter } if filter
|
132
|
+
sync_user_filters(project, user_filters, run_params, symbolized_config)
|
133
|
+
when 'sync_multiple_projects_based_on_pid', 'sync_multiple_projects_based_on_custom_id'
|
134
|
+
users_by_project = run_params[:users_brick_input].group_by { |u| u[:pid] }
|
135
|
+
user_filters.group_by { |u| u[:pid] }.flat_map.pmap do |id, new_filters|
|
136
|
+
users = users_by_project[id]
|
137
|
+
fail "The #{multiple_projects_column} cannot be empty" if id.blank?
|
138
|
+
if mode == 'sync_multiple_projects_based_on_custom_id'
|
139
|
+
current_project = domain.clients(id, data_product).project
|
140
|
+
elsif mode == 'sync_multiple_projects_based_on_pid'
|
141
|
+
current_project = client.projects(id)
|
194
142
|
end
|
195
|
-
|
196
|
-
if filters.empty?
|
197
|
-
fail 'The filter set can not be empty when using sync_multiple_projects_* mode as the filters contain \
|
198
|
-
the project ids in which the permissions should be changed'
|
199
|
-
end
|
200
|
-
filters.group_by { |u| u[multiple_projects_column] }.flat_map do |client_id, new_filters|
|
201
|
-
fail "Client id cannot be empty" if client_id.blank?
|
202
|
-
project = domain.clients(client_id, data_product).project
|
203
|
-
fail "Client #{client_id} does not have project." unless project
|
204
|
-
filters_to_load = GoodData::UserFilterBuilder.get_filters(new_filters, symbolized_config)
|
205
|
-
puts "Synchronizing #{filters_to_load.count} filters in project #{project.pid} of client #{client_id}"
|
206
|
-
project.add_data_permissions(filters_to_load, run_params)
|
143
|
+
sync_user_filters(current_project, new_filters, run_params.merge(users_brick_input: users), symbolized_config)
|
207
144
|
end
|
208
145
|
when 'sync_domain_client_workspaces'
|
209
|
-
without_check(PARAMS, params) do
|
210
|
-
CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
|
211
|
-
filters << row.to_hash
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
146
|
domain_clients = domain.clients(:all, data_product)
|
216
147
|
if params.segments
|
217
148
|
segment_uris = params.segments.map(&:uri)
|
@@ -220,20 +151,20 @@ module GoodData
|
|
220
151
|
|
221
152
|
working_client_ids = []
|
222
153
|
|
154
|
+
users_by_project = run_params[:users_brick_input].group_by { |u| u[:pid] }
|
223
155
|
results = []
|
224
|
-
|
156
|
+
user_filters.group_by { |u| u[multiple_projects_column] }.flat_map.pmap do |client_id, new_filters|
|
157
|
+
users = users_by_project[client_id]
|
225
158
|
fail "Client id cannot be empty" if client_id.blank?
|
226
159
|
c = domain.clients(client_id, data_product)
|
227
160
|
if params.segments && !segment_uris.include?(c.segment_uri)
|
228
161
|
puts "Client #{client_id} is outside segments_filter #{params.segments}"
|
229
162
|
next
|
230
163
|
end
|
231
|
-
|
232
|
-
fail "Client #{client_id} does not have project." unless
|
164
|
+
current_project = c.project
|
165
|
+
fail "Client #{client_id} does not have project." unless current_project
|
233
166
|
working_client_ids << client_id
|
234
|
-
|
235
|
-
puts "Synchronizing #{filters_to_load.count} filters in project #{project.pid} of client #{client_id}"
|
236
|
-
partial_results = project.add_data_permissions(filters_to_load, run_params)
|
167
|
+
partial_results = sync_user_filters(current_project, new_filters, run_params.merge(users_brick_input: users), symbolized_config)
|
237
168
|
results.concat(partial_results[:results])
|
238
169
|
end
|
239
170
|
|
@@ -241,22 +172,23 @@ module GoodData
|
|
241
172
|
domain_clients.each do |c|
|
242
173
|
next if working_client_ids.include?(c.client_id)
|
243
174
|
begin
|
244
|
-
|
175
|
+
current_project = c.project
|
245
176
|
rescue => e
|
246
177
|
puts "Error when accessing project of client #{c.client_id}. Error: #{e}"
|
247
178
|
next
|
248
179
|
end
|
249
|
-
unless
|
180
|
+
unless current_project
|
250
181
|
puts "Client #{c.client_id} has no project."
|
251
182
|
next
|
252
183
|
end
|
253
|
-
if
|
254
|
-
puts "Project #{
|
184
|
+
if current_project.deleted?
|
185
|
+
puts "Project #{current_project.pid} of client #{c.client_id} is deleted."
|
255
186
|
next
|
256
187
|
end
|
257
188
|
|
258
|
-
puts "Delete all filters in project #{
|
259
|
-
|
189
|
+
puts "Delete all filters in project #{current_project.pid} of client #{c.client_id}"
|
190
|
+
users = users_by_project[c.client_id]
|
191
|
+
delete_results = current_project.add_data_permissions([], run_params.merge(users_brick_input: users))
|
260
192
|
results.concat(delete_results[:results])
|
261
193
|
end
|
262
194
|
end
|
@@ -266,6 +198,37 @@ module GoodData
|
|
266
198
|
}
|
267
199
|
end
|
268
200
|
end
|
201
|
+
|
202
|
+
def sync_user_filters(project, filters, params, filters_config)
|
203
|
+
# Do not change this line -> can cause paralelisation errors in jRuby viz TMA-963
|
204
|
+
project.add_data_permissions(GoodData::UserFilterBuilder.get_filters(filters, filters_config), params)
|
205
|
+
end
|
206
|
+
|
207
|
+
def load_data(params, symbolized_config)
|
208
|
+
filters = []
|
209
|
+
headers_in_options = params.csv_headers == 'false' || true
|
210
|
+
csv_with_headers = if GoodData::UserFilterBuilder.row_based?(symbolized_config)
|
211
|
+
false
|
212
|
+
else
|
213
|
+
headers_in_options
|
214
|
+
end
|
215
|
+
|
216
|
+
multiple_projects_column = params.multiple_projects_column
|
217
|
+
data_source = GoodData::Helpers::DataSource.new(params.input_source)
|
218
|
+
|
219
|
+
without_check(PARAMS, params) do
|
220
|
+
CSV.foreach(File.open(data_source.realize(params), 'r:UTF-8'), headers: csv_with_headers, return_headers: false, encoding: 'utf-8') do |row|
|
221
|
+
filters << row.to_hash.merge(pid: row[multiple_projects_column])
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
if filters.empty? && %w(sync_multiple_projects_based_on_pid sync_multiple_projects_based_on_custom_id).include?(params.sync_mode)
|
226
|
+
fail 'The filter set can not be empty when using sync_multiple_projects_* mode as the filters contain \
|
227
|
+
the project ids in which the permissions should be changed'
|
228
|
+
end
|
229
|
+
|
230
|
+
filters
|
231
|
+
end
|
269
232
|
end
|
270
233
|
end
|
271
234
|
end
|