eco-helpers 3.0.4 → 3.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +44 -4
- data/eco-helpers.gemspec +1 -1
- data/lib/eco/api/common/class_helpers.rb +24 -23
- data/lib/eco/api/common/class_meta_basics.rb +0 -2
- data/lib/eco/api/common/loaders/use_case.rb +1 -0
- data/lib/eco/api/common/people/entry_factory.rb +6 -4
- data/lib/eco/api/common/people/person_entry.rb +4 -6
- data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +25 -12
- data/lib/eco/api/common/people/person_parser.rb +8 -0
- data/lib/eco/api/common/session/base_session.rb +1 -1
- data/lib/eco/api/common/session/environment.rb +7 -0
- data/lib/eco/api/common/session/file_manager.rb +15 -8
- data/lib/eco/api/common/session/logger/cache.rb +14 -10
- data/lib/eco/api/common/session/logger/log.rb +8 -7
- data/lib/eco/api/common/session/mailer.rb +22 -13
- data/lib/eco/api/common/session/s3_uploader.rb +29 -20
- data/lib/eco/api/microcases/people_search.rb +1 -1
- data/lib/eco/api/organization/login_providers.rb +11 -4
- data/lib/eco/api/organization/node_classifications.rb +3 -0
- data/lib/eco/api/organization/presets_factory.rb +37 -31
- data/lib/eco/api/organization/tag_tree.rb +14 -5
- data/lib/eco/api/policies/default_policies/99_user_access_policy.rb +28 -18
- data/lib/eco/api/session/batch/errors.rb +38 -20
- data/lib/eco/api/session/batch/job.rb +252 -135
- data/lib/eco/api/session/batch/status.rb +55 -36
- data/lib/eco/api/session/batch.rb +2 -2
- data/lib/eco/api/session/config/base_config.rb +12 -11
- data/lib/eco/api/session/config/tagtree.rb +10 -14
- data/lib/eco/api/session/config/workflow.rb +15 -3
- data/lib/eco/api/session/config.rb +19 -26
- data/lib/eco/api/session.rb +13 -4
- data/lib/eco/api/usecases/cli.rb +4 -0
- data/lib/eco/api/usecases/default/locations/cli/codes_to_tags_cli.rb +18 -0
- data/lib/eco/api/usecases/default/locations/cli/csv_to_tree_cli.rb +12 -0
- data/lib/eco/api/usecases/default/locations/cli/tagtree_paths_cli.rb +12 -0
- data/lib/eco/api/usecases/default/locations/codes_to_tags_case.rb +32 -13
- data/lib/eco/api/usecases/default/locations/csv_to_tree_case.rb +15 -5
- data/lib/eco/api/usecases/default/locations/tagtree_extract_case.rb +6 -0
- data/lib/eco/api/usecases/default/locations/tagtree_paths_case.rb +51 -0
- data/lib/eco/api/usecases/default/locations.rb +1 -1
- data/lib/eco/api/usecases/default/people/amend/cli/reinvite_sync_cli.rb +8 -0
- data/lib/eco/api/usecases/default/people/amend/cli/reinvite_trans_cli.rb +11 -0
- data/lib/eco/api/usecases/default/people/amend/cli/restore_db_cli.rb +26 -0
- data/lib/eco/api/usecases/default/people/amend/reinvite_sync_case.rb +2 -0
- data/lib/eco/api/usecases/default/people/amend/reinvite_trans_case.rb +2 -0
- data/lib/eco/api/usecases/default/people/amend/restore_db_case.rb +3 -0
- data/lib/eco/api/usecases/default/people/treat/analyse_people_case.rb +15 -5
- data/lib/eco/api/usecases/default/people/treat/cli/analyse_people_cli.rb +66 -0
- data/lib/eco/api/usecases/default/people/treat/cli/org_data_convert_cli.rb +35 -0
- data/lib/eco/api/usecases/default/people/treat/cli/supers_cyclic_identify_cli.rb +15 -0
- data/lib/eco/api/usecases/default/people/treat/cli/supers_hierachy_cli.rb +15 -0
- data/lib/eco/api/usecases/default/people/treat/org_data_convert_case.rb +11 -5
- data/lib/eco/api/usecases/default/people/treat/supers_cyclic_identify_case.rb +28 -7
- data/lib/eco/api/usecases/default/people/treat/supers_hierarchy_case.rb +32 -9
- data/lib/eco/api/usecases/default/people/utils/set_default_tag_case.rb +2 -1
- data/lib/eco/api/usecases/default_cases/to_csv_case.rb +2 -2
- data/lib/eco/api/usecases/graphql/helpers/location/base/classifications_parser.rb +5 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/diffs/stages/commandable.rb +2 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/diffs/stages/diff_sortable.rb +2 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/result.rb +2 -1
- data/lib/eco/api/usecases/graphql/helpers/location/command/results.rb +3 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command.rb +1 -0
- data/lib/eco/api/usecases/graphql/helpers/location/tags_remap.rb +3 -0
- data/lib/eco/api/usecases/graphql/samples/location/command/service/tree_update.rb +2 -0
- data/lib/eco/api/usecases/graphql/samples/location/command/track_changed_ids.rb +1 -0
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_diff/convertible/parsing/classifications.rb +2 -0
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_diff.rb +6 -2
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_to_list/converter/parser.rb +6 -2
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_to_list/converter.rb +2 -0
- data/lib/eco/api/usecases/ooze_cases/export_register_case.rb +1 -0
- data/lib/eco/api/usecases/ooze_samples/helpers_migration/copying.rb +66 -29
- data/lib/eco/api/usecases/ooze_samples/ooze_base_case.rb +25 -3
- data/lib/eco/api/usecases/ooze_samples/register_update_case.rb +10 -0
- data/lib/eco/api/usecases/use_case.rb +3 -1
- data/lib/eco/cli/config/use_cases.rb +4 -0
- data/lib/eco/cli/scripting/args_helpers.rb +3 -2
- data/lib/eco/cli/scripting/argument.rb +2 -2
- data/lib/eco/cli_default/input.rb +49 -45
- data/lib/eco/cli_default/input_filters.rb +32 -17
- data/lib/eco/cli_default/options.rb +8 -4
- data/lib/eco/cli_default/people.rb +1 -1
- data/lib/eco/cli_default/people_filters.rb +32 -24
- data/lib/eco/cli_default/usecases.rb +8 -121
- data/lib/eco/cli_default/workflow.rb +6 -4
- data/lib/eco/csv/split.rb +2 -0
- data/lib/eco/csv/table.rb +13 -0
- data/lib/eco/data/files/encoding.rb +15 -8
- data/lib/eco/data/files/helpers.rb +6 -2
- data/lib/eco/data/hashes/diff_result.rb +5 -0
- data/lib/eco/data/locations/node_diff/nodes_diff.rb +13 -0
- data/lib/eco/data/locations/node_diff.rb +4 -0
- data/lib/eco/data/locations/node_level.rb +6 -0
- data/lib/eco/language/auxiliar_logger.rb +2 -0
- data/lib/eco/version.rb +1 -1
- data/lib/eco-helpers.rb +1 -1
- metadata +15 -6
- data/lib/eco/api/usecases/default/locations/create_tag_paths_case.rb +0 -25
- data/lib/eco/api/usecases/default/people/amend/reinvite_trans_cli.rb +0 -4
@@ -2,11 +2,13 @@ class Eco::API::UseCases::Default::Locations::CsvToTree < Eco::API::Common::Load
|
|
2
2
|
name "csv-to-tree"
|
3
3
|
type :other
|
4
4
|
|
5
|
+
require_relative 'cli/csv_to_tree_cli'
|
6
|
+
|
5
7
|
include Eco::Data::Locations::DSL
|
6
8
|
|
7
9
|
TIME_FORMAT = '%Y%m%dT%H%M%S'.freeze
|
8
10
|
|
9
|
-
def main(
|
11
|
+
def main(*_args)
|
10
12
|
options[:end_get] = false
|
11
13
|
tree_struct = org_tree(input_csv)
|
12
14
|
|
@@ -18,10 +20,6 @@ class Eco::API::UseCases::Default::Locations::CsvToTree < Eco::API::Common::Load
|
|
18
20
|
|
19
21
|
private
|
20
22
|
|
21
|
-
def output_file
|
22
|
-
@output_file ||= "#{active_enviro}_tree_#{timestamp}.json"
|
23
|
-
end
|
24
|
-
|
25
23
|
def input_csv
|
26
24
|
@input_csv ||= Eco::CSV.read(input_file, encoding: input_encoding)
|
27
25
|
end
|
@@ -34,6 +32,18 @@ class Eco::API::UseCases::Default::Locations::CsvToTree < Eco::API::Common::Load
|
|
34
32
|
options.dig(:input, :file, :encoding) || 'utf-8'
|
35
33
|
end
|
36
34
|
|
35
|
+
def output_file
|
36
|
+
@output_file ||= File.join(output_folder, output_base_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def output_base_name
|
40
|
+
"#{active_enviro}_tree_#{timestamp}.json"
|
41
|
+
end
|
42
|
+
|
43
|
+
def output_folder
|
44
|
+
File.dirname(input_file)
|
45
|
+
end
|
46
|
+
|
37
47
|
def timestamp(date = Time.now)
|
38
48
|
date.strftime(TIME_FORMAT)
|
39
49
|
end
|
@@ -116,6 +116,7 @@ class Eco::API::UseCases::Default::Locations::TagtreeExtract < Eco::API::UseCase
|
|
116
116
|
|
117
117
|
def input_csv
|
118
118
|
return unless file_as_source?
|
119
|
+
|
119
120
|
@input_csv ||= Eco::CSV.read(file_as_source, encoding: input_encoding)
|
120
121
|
end
|
121
122
|
|
@@ -125,6 +126,7 @@ class Eco::API::UseCases::Default::Locations::TagtreeExtract < Eco::API::UseCase
|
|
125
126
|
|
126
127
|
def file_as_source?
|
127
128
|
return true unless file_as_source.nil?
|
129
|
+
|
128
130
|
false
|
129
131
|
end
|
130
132
|
|
@@ -132,6 +134,7 @@ class Eco::API::UseCases::Default::Locations::TagtreeExtract < Eco::API::UseCase
|
|
132
134
|
@file_as_source ||= options.dig(:source, :file).tap do |file|
|
133
135
|
next if file.nil?
|
134
136
|
next if File.exist?(file)
|
137
|
+
|
135
138
|
log(:error) { "File '#{file}' does not exist" }
|
136
139
|
exit 1
|
137
140
|
end
|
@@ -177,6 +180,7 @@ class Eco::API::UseCases::Default::Locations::TagtreeExtract < Eco::API::UseCase
|
|
177
180
|
def csv(filename, header = [])
|
178
181
|
CSV.open(filename, "w") do |csv|
|
179
182
|
csv << header unless header.empty?
|
183
|
+
|
180
184
|
yield(csv)
|
181
185
|
end
|
182
186
|
ensure
|
@@ -203,9 +207,11 @@ class Eco::API::UseCases::Default::Locations::TagtreeExtract < Eco::API::UseCase
|
|
203
207
|
sheet = workbook.add_worksheet(name)
|
204
208
|
#end
|
205
209
|
sheet.auto_width = true
|
210
|
+
|
206
211
|
yield(sheet)
|
207
212
|
|
208
213
|
return unless header
|
214
|
+
|
209
215
|
sheet.set_row(0, 30, workbook.bold_format)
|
210
216
|
sheet.freeze_panes(1, 0)
|
211
217
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Eco::API::UseCases::Default::Locations::TagTreePaths < Eco::API::Common::Loaders::UseCase
|
2
|
+
name "tagtree-paths"
|
3
|
+
type :other
|
4
|
+
|
5
|
+
require_relative 'cli/tagtree_paths_cli'
|
6
|
+
|
7
|
+
OUT_FOLDER = "sftp".freeze
|
8
|
+
OUT_TIME_FORMAT = '%Y%m%dT%H%M%S'.freeze
|
9
|
+
OUT_FILENAME = "tag_paths".freeze
|
10
|
+
|
11
|
+
def main(*_args)
|
12
|
+
CSV.open(output_filename, "w") do |csv|
|
13
|
+
csv << %w[Tag Path]
|
14
|
+
tag_paths.each do |values|
|
15
|
+
csv << values
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
log(:info) {
|
20
|
+
"Generated file '#{output_filename}'"
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def tag_paths
|
27
|
+
@tag_paths ||= tagtree.tags.reverse.map do |tag|
|
28
|
+
[tag, tagtree.path(tag).join("|")]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def tagtree
|
33
|
+
session.tagtree
|
34
|
+
end
|
35
|
+
|
36
|
+
def output_file_format
|
37
|
+
'csv'
|
38
|
+
end
|
39
|
+
|
40
|
+
def output_filename(name = self.class::OUT_FILENAME)
|
41
|
+
File.join(output_folder, "#{timestamp}_#{config.active_enviro}_#{name}.#{output_file_format}")
|
42
|
+
end
|
43
|
+
|
44
|
+
def output_folder
|
45
|
+
"#{config.active_enviro}/#{self.class::OUT_FOLDER}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def timestamp(date = Time.now)
|
49
|
+
date.strftime(self.class::OUT_TIME_FORMAT)
|
50
|
+
end
|
51
|
+
end
|
@@ -10,7 +10,7 @@ module Eco
|
|
10
10
|
end
|
11
11
|
|
12
12
|
require_relative 'locations/codes_to_tags_case'
|
13
|
-
require_relative 'locations/
|
13
|
+
require_relative 'locations/tagtree_paths_case'
|
14
14
|
require_relative 'locations/csv_to_tree_case'
|
15
15
|
require_relative 'locations/tagtree_extract_case'
|
16
16
|
require_relative 'locations/tagtree_upload_case'
|
@@ -0,0 +1,8 @@
|
|
1
|
+
class Eco::API::UseCases::Default::People::Amend::ReinviteSyncCase
|
2
|
+
class Cli < Eco::API::UseCases::Default::People::Amend::ReinviteTransCase::Cli
|
3
|
+
str = "Re-sends invites to target users that have not accepted the invite as yet"
|
4
|
+
desc str
|
5
|
+
|
6
|
+
cli_name '-reinvite-from'
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Eco::API::UseCases::Default::People::Amend::ReinviteTransCase
|
2
|
+
class Cli < Eco::API::UseCases::Cli
|
3
|
+
str = "Re-sends invites to all filtered users that have not accepted the invite as yet"
|
4
|
+
desc str
|
5
|
+
|
6
|
+
str = "If also send an invite email to those that have accepted the invite"
|
7
|
+
add_option("-force", str) do |options|
|
8
|
+
options.deep_merge!(force: {invite: true})
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Eco::API::UseCases::Default::People::Amend::RestoreDBCase
|
2
|
+
class Cli < Eco::API::UseCases::Cli
|
3
|
+
str = "Restores the people manager by using a backup.json file"
|
4
|
+
desc str
|
5
|
+
|
6
|
+
callback do |input, session, _opts, _case|
|
7
|
+
unless input && input.is_a?(Eco::API::Organization::People)
|
8
|
+
file = SCR.get_file(cli_name, required: true)
|
9
|
+
input = Eco::API::Organization::People.new(JSON.parse(File.read(file)))
|
10
|
+
session.log(:info) {
|
11
|
+
"Source DB: loaded #{input.length} entries."
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
str = "If it should DELETE people that do not exist in the backup file"
|
17
|
+
add_option("-include-delete", str) do |options|
|
18
|
+
options.deep_merge!(include: {delete: true})
|
19
|
+
end
|
20
|
+
|
21
|
+
str = "If it should CREATE people that do not exist in the people manager"
|
22
|
+
add_option("-include-create", str) do |options|
|
23
|
+
options.deep_merge!(include: {create: true})
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -4,6 +4,8 @@ class Eco::API::UseCases::Default::People::Amend::RestoreDBCase < Eco::API::Comm
|
|
4
4
|
name "restore-db"
|
5
5
|
type :sync
|
6
6
|
|
7
|
+
require_relative 'cli/restore_db_cli'
|
8
|
+
|
7
9
|
def main(entries, people, session, options, usecase) # rubocop:disable Metrics/AbcSize
|
8
10
|
require_people_as_entries!(entries)
|
9
11
|
|
@@ -52,6 +54,7 @@ class Eco::API::UseCases::Default::People::Amend::RestoreDBCase < Eco::API::Comm
|
|
52
54
|
|
53
55
|
def account_copy(src, dst) # rubocop:disable Metrics/AbcSize
|
54
56
|
return unless src
|
57
|
+
|
55
58
|
dst.default_tag = src.default_tag unless options.dig(:exclude, :filter_tags)
|
56
59
|
dst.policy_group_ids = src.policy_group_ids unless options.dig(:exclude, :policy_groups)
|
57
60
|
dst.permissions_custom = src.permissions_custom unless options.dig(:exclude, :abilities)
|
@@ -2,6 +2,8 @@ class Eco::API::UseCases::Default::People::Treat::Analyse < Eco::API::Common::Lo
|
|
2
2
|
name "analyse-people"
|
3
3
|
type :export
|
4
4
|
|
5
|
+
require_relative 'cli/analyse_people_cli'
|
6
|
+
|
5
7
|
attr_reader :people
|
6
8
|
|
7
9
|
def main(_people, _session, options, _usecase)
|
@@ -26,12 +28,14 @@ class Eco::API::UseCases::Default::People::Treat::Analyse < Eco::API::Common::Lo
|
|
26
28
|
def identify_unnamed
|
27
29
|
similarity_analytics.unnamed.tap do |unnamed|
|
28
30
|
next unless unnamed.empty?
|
31
|
+
|
29
32
|
log(:info) { "There were no people with no name!!" }
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
33
36
|
def identify_duplicates
|
34
37
|
analysed = similarity_screening
|
38
|
+
|
35
39
|
if case_options[:ignore_matching_words]
|
36
40
|
log(:info) { "Fine tune results by ignoring matching words..." }
|
37
41
|
analysed = strict_similarity(analysed)
|
@@ -155,7 +159,9 @@ class Eco::API::UseCases::Default::People::Treat::Analyse < Eco::API::Common::Lo
|
|
155
159
|
|
156
160
|
def save!(data)
|
157
161
|
ext = File.extname(output_file).downcase.delete(".")
|
158
|
-
|
162
|
+
|
163
|
+
log(:info) { "Generating file '#{output_file}'" }
|
164
|
+
|
159
165
|
File.open(output_file, "w") do |fd|
|
160
166
|
case ext
|
161
167
|
when "txt"
|
@@ -184,11 +190,15 @@ class Eco::API::UseCases::Default::People::Treat::Analyse < Eco::API::Common::Lo
|
|
184
190
|
# A way to use command line to specify part
|
185
191
|
# => i.e. person.details[first-name]
|
186
192
|
def attribute_access(person, expression)
|
187
|
-
parts = expression.split(
|
193
|
+
parts = expression.split('.')
|
194
|
+
|
188
195
|
parts_to_value(person, parts).tap do |value|
|
189
|
-
|
190
|
-
|
191
|
-
|
196
|
+
next if value.is_a?(String)
|
197
|
+
next unless value
|
198
|
+
|
199
|
+
msg = "Something is wrong with #{expression} to parts #{parts}. "
|
200
|
+
msg << "Expecting String, obtained: #{value.class}"
|
201
|
+
raise msg
|
192
202
|
end
|
193
203
|
end
|
194
204
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
class Eco::API::UseCases::Default::People::Treat::Analyse
|
2
|
+
class Cli < Eco::API::UseCases::Cli
|
3
|
+
str = "Provides a set of tools to analyse a set of people (i.e. detect duplicates)"
|
4
|
+
desc str
|
5
|
+
|
6
|
+
callback do |_people, _session, options|
|
7
|
+
options.deep_merge!(output: {file: "people_analysis.txt"}) unless options.dig(:output, :file)
|
8
|
+
#unless options.dig(:usecase, :analyse_people, :use_field)
|
9
|
+
# options.deep_merge!(usecase: {analyse_people: {use_field: :name}})
|
10
|
+
#end
|
11
|
+
end
|
12
|
+
|
13
|
+
add_option("-to", "Specify the output file.") do |options|
|
14
|
+
file = SCR.get_file("-to", required: true, should_exist: false)
|
15
|
+
options.deep_merge!(output: {file: file})
|
16
|
+
end
|
17
|
+
|
18
|
+
str = "Generates a list of people with possible duplicates."
|
19
|
+
add_option("-identify-duplicates", str) do |options|
|
20
|
+
options.deep_merge!(usecase: {analyse_people: {identify_duplicates: true}})
|
21
|
+
end
|
22
|
+
|
23
|
+
str = "Works with -identify-duplicates. Sets field to be used in the comparison."
|
24
|
+
add_option("-use-field", str) do |options|
|
25
|
+
expression = SCR.get_arg("-use-field", with_param: true)
|
26
|
+
options.deep_merge!(usecase: {analyse_people: {use_field: expression}})
|
27
|
+
end
|
28
|
+
|
29
|
+
str = "Works with -identify-duplicates. Adds an additional layer of comparison."
|
30
|
+
add_option("-facet-field", str) do |options|
|
31
|
+
expression = SCR.get_arg("-facet-field", with_param: true)
|
32
|
+
options.deep_merge!(usecase: {analyse_people: {facet_field: expression}})
|
33
|
+
end
|
34
|
+
|
35
|
+
str = "Works with -identify-duplicates. Skips the rearrangement stage."
|
36
|
+
add_option("-only-screening", str) do |options|
|
37
|
+
options.deep_merge!(usecase: {analyse_people: {only_screening: true}})
|
38
|
+
end
|
39
|
+
|
40
|
+
str = "Works with -identify-duplicates. Re-adjust scores ignoring matching words."
|
41
|
+
add_option("-ignore-matching-words", str) do |options|
|
42
|
+
options.deep_merge!(usecase: {analyse_people: {ignore_matching_words: true}})
|
43
|
+
end
|
44
|
+
|
45
|
+
str = "Works with -identify-duplicates. Re-adjust the comparing strings to do not have repeated words."
|
46
|
+
add_option("-unique-words", str) do |options|
|
47
|
+
options.deep_merge!(usecase: {analyse_people: {unique_words: true}})
|
48
|
+
end
|
49
|
+
|
50
|
+
add_option("-identify-unnamed", "Identifies all people with no names.") do |options|
|
51
|
+
options.deep_merge!(usecase: {analyse_people: {identify_unnamed: true}})
|
52
|
+
end
|
53
|
+
|
54
|
+
str = "Generates a json file with all the people involved in the final results of the analysis."
|
55
|
+
add_option("-backup-people-results", str) do |options|
|
56
|
+
file = SCR.get_file("-backup-people-results", required: true, should_exist: false)
|
57
|
+
options.deep_merge!(usecase: {analyse_people: {backup_people: File.expand_path(file)}})
|
58
|
+
end
|
59
|
+
|
60
|
+
str = "Genarates a CSV file with all people of the final results."
|
61
|
+
add_option("-to-csv", str) do |options|
|
62
|
+
file = SCR.get_file("-to-csv", required: true, should_exist: false) || "Results.csv"
|
63
|
+
options.deep_merge!(usecase: {analyse_people: {csv_file: File.expand_path(file)}})
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Eco::API::UseCases::Default::People::Treat::OrgDataConvertCase
|
2
|
+
class Cli < Eco::API::UseCases::Cli
|
3
|
+
str = "Usage '#{cli_name} backup.json -restore-db-from'."
|
4
|
+
str << " Transforms an input .json file to the values of the destination environment "
|
5
|
+
str << " (names missmatch won't solve: i.e. usergroups)"
|
6
|
+
desc str
|
7
|
+
|
8
|
+
callback do |input, session, options|
|
9
|
+
unless input.is_a?(Eco::API::Organization::People)
|
10
|
+
file = SCR.get_file(cli_name, required: true)
|
11
|
+
input = Eco::API::Organization::People.new(JSON.parse(File.read(file)))
|
12
|
+
session.log(:info) {
|
13
|
+
"Source DB: loaded #{input.length} entries."
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
unless options[:source_enviro]
|
18
|
+
session.log(:error) {
|
19
|
+
"You need to specify a -source-enviro for the conversion to work out"
|
20
|
+
}
|
21
|
+
exit(1)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
str = "The defined -source-enviro API configuration that the backup file was generated from"
|
26
|
+
add_option("-source-enviro", str) do |options|
|
27
|
+
options.merge!(source_enviro: SCR.get_arg("-source-enviro", with_param: true))
|
28
|
+
end
|
29
|
+
|
30
|
+
str = "Prevents the script to crash when backup file has missing usergroups in the org"
|
31
|
+
add_option("-ignore-missing-policy-groups", str) do |options|
|
32
|
+
options.deep_merge!(ignore: {missing: {policy_groups: true}})
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Eco::API::UseCases::Default::People::Treat::SupersCyclicIdentify
|
2
|
+
class Cli < Eco::API::UseCases::Cli
|
3
|
+
str = "Provides a set of tools to analyse a set of people (i.e. detect duplicates)"
|
4
|
+
desc str
|
5
|
+
|
6
|
+
# callback do |_people, _session, options|
|
7
|
+
# options.deep_merge!(output: {file: "cyclic_supers.txt"}) unless options.dig(:output, :file)
|
8
|
+
# end
|
9
|
+
|
10
|
+
add_option("-to", "Specify the output file") do |options|
|
11
|
+
file = SCR.get_file("-to", required: true, should_exist: false)
|
12
|
+
options.deep_merge!(output: {file: file})
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Eco::API::UseCases::Default::People::Treat::SupersHierarchy
|
2
|
+
class Cli < Eco::API::UseCases::Cli
|
3
|
+
str = "Draws the Supervisors hiearchy in a file"
|
4
|
+
desc str
|
5
|
+
|
6
|
+
# callback do |_people, _session, options|
|
7
|
+
# options.deep_merge!(output: {file: "supers_hierarchy.txt"}) unless options.dig(:output, :file)
|
8
|
+
# end
|
9
|
+
|
10
|
+
add_option("-to", "Specify the output file") do |options|
|
11
|
+
file = SCR.get_file("-to", required: true, should_exist: false)
|
12
|
+
options.deep_merge!(output: {file: file})
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -2,6 +2,12 @@ class Eco::API::UseCases::Default::People::Treat::OrgDataConvertCase < Eco::API:
|
|
2
2
|
name "org-data-convert"
|
3
3
|
type :import
|
4
4
|
|
5
|
+
require_relative 'cli/org_data_convert_cli'
|
6
|
+
|
7
|
+
def main(people, _session, _options, _usecase)
|
8
|
+
org_data_convert(people)
|
9
|
+
end
|
10
|
+
|
5
11
|
def org_data_convert(people)
|
6
12
|
log(:info) {
|
7
13
|
"Going to convert data from '#{source_enviro}' to '#{ASSETS.active_config}'"
|
@@ -22,14 +28,11 @@ class Eco::API::UseCases::Default::People::Treat::OrgDataConvertCase < Eco::API:
|
|
22
28
|
people
|
23
29
|
end
|
24
30
|
|
25
|
-
def main(people, _session, _options, _usecase)
|
26
|
-
org_data_convert(people)
|
27
|
-
end
|
28
|
-
|
29
31
|
private
|
30
32
|
|
31
33
|
def account_convert!(person)
|
32
34
|
return unless (account = person.account)
|
35
|
+
|
33
36
|
account.policy_group_ids = policy_groups_convert(account.policy_group_ids)
|
34
37
|
account.doc.tap do |doc|
|
35
38
|
%w[login_provider_ids starred_ids landing_page_id].map do |attr|
|
@@ -40,6 +43,7 @@ class Eco::API::UseCases::Default::People::Treat::OrgDataConvertCase < Eco::API:
|
|
40
43
|
|
41
44
|
def details_convert!(person)
|
42
45
|
return unless person.details
|
46
|
+
|
43
47
|
person.details.as_json.tap do |details_doc|
|
44
48
|
details_doc["schema_id"] = session.schema.id
|
45
49
|
person.add_details(session.schema)
|
@@ -50,11 +54,13 @@ class Eco::API::UseCases::Default::People::Treat::OrgDataConvertCase < Eco::API:
|
|
50
54
|
def policy_groups_convert(ids)
|
51
55
|
ids.map do |id|
|
52
56
|
name = source_policy_groups.to_name(id)
|
57
|
+
|
53
58
|
unless name || ignore_missing_policy_groups?
|
54
59
|
msg = "Ops, do not know #{id} usergroup for source environment"
|
55
60
|
msg << "\nUse the option -ignore-missing-policy-groups if you do not care"
|
56
61
|
error(msg)
|
57
62
|
end
|
63
|
+
|
58
64
|
session.policy_groups.to_id(name).tap do |new_id|
|
59
65
|
unless new_id || ignore_missing_policy_groups?
|
60
66
|
msg = "Ops, do not know #{name} usergroup for destination environment"
|
@@ -88,7 +94,7 @@ class Eco::API::UseCases::Default::People::Treat::OrgDataConvertCase < Eco::API:
|
|
88
94
|
end
|
89
95
|
|
90
96
|
def error(msg)
|
91
|
-
|
97
|
+
log(:error) { msg }
|
92
98
|
exit(1)
|
93
99
|
end
|
94
100
|
end
|
@@ -1,7 +1,13 @@
|
|
1
1
|
class Eco::API::UseCases::Default::People::Treat::SupersCyclicIdentify < Eco::API::Common::Loaders::UseCase
|
2
|
-
name
|
2
|
+
name 'identify-cyclic-supers'
|
3
3
|
type :export
|
4
4
|
|
5
|
+
require_relative 'cli/supers_cyclic_identify_cli'
|
6
|
+
|
7
|
+
OUT_FOLDER = "sftp".freeze
|
8
|
+
OUT_TIME_FORMAT = '%Y%m%dT%H%M%S'.freeze
|
9
|
+
OUT_FILENAME = "cyclic_supers".freeze
|
10
|
+
|
5
11
|
attr_reader :people
|
6
12
|
|
7
13
|
def main(_people, _session, options, _usecase)
|
@@ -15,10 +21,6 @@ class Eco::API::UseCases::Default::People::Treat::SupersCyclicIdentify < Eco::AP
|
|
15
21
|
Eco::API::Common::People::SupervisorHelpers.identify_cyclic_chains(people)
|
16
22
|
end
|
17
23
|
|
18
|
-
def file
|
19
|
-
@file ||= options.dig(:output, :file) || "cyclic_supers.txt"
|
20
|
-
end
|
21
|
-
|
22
24
|
def save!(data)
|
23
25
|
if data.empty?
|
24
26
|
log(:info) { "There were no cyclic supervisors identified!!" }
|
@@ -29,7 +31,7 @@ class Eco::API::UseCases::Default::People::Treat::SupersCyclicIdentify < Eco::AP
|
|
29
31
|
|
30
32
|
case ext
|
31
33
|
when "txt"
|
32
|
-
create_file(data, file:
|
34
|
+
create_file(data, file: output_filename(ext: 'txt'), format: :txt)
|
33
35
|
when "html"
|
34
36
|
log(:warn) { "html is still not supported" }
|
35
37
|
exit(1)
|
@@ -45,7 +47,10 @@ class Eco::API::UseCases::Default::People::Treat::SupersCyclicIdentify < Eco::AP
|
|
45
47
|
File.open(file, "w") do |fd|
|
46
48
|
fd << sets_to_str(sets, format: format)
|
47
49
|
end
|
48
|
-
|
50
|
+
|
51
|
+
log(:info) {
|
52
|
+
"Generated file #{file}"
|
53
|
+
}
|
49
54
|
end
|
50
55
|
|
51
56
|
def sets_to_str(sets, format: :txt)
|
@@ -70,4 +75,20 @@ class Eco::API::UseCases::Default::People::Treat::SupersCyclicIdentify < Eco::AP
|
|
70
75
|
str << set_to_str(set, lev: lev + 1, format: format)
|
71
76
|
end
|
72
77
|
end
|
78
|
+
|
79
|
+
def output_filename(ext: nil)
|
80
|
+
@output_filename ||= options.dig(:output, :file) || default_output_filename(ext: ext)
|
81
|
+
end
|
82
|
+
|
83
|
+
def default_output_filename(name = self.class::OUT_FILENAME, ext: nil)
|
84
|
+
File.join(output_folder, "#{timestamp}_#{config.active_enviro}_#{name}.#{ext}")
|
85
|
+
end
|
86
|
+
|
87
|
+
def output_folder
|
88
|
+
"#{config.active_enviro}/#{self.class::OUT_FOLDER}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def timestamp(date = Time.now)
|
92
|
+
date.strftime(self.class::OUT_TIME_FORMAT)
|
93
|
+
end
|
73
94
|
end
|
@@ -2,13 +2,19 @@ class Eco::API::UseCases::Default::People::Treat::SupersHierarchy < Eco::API::Co
|
|
2
2
|
name "supers-hierarchy"
|
3
3
|
type :export
|
4
4
|
|
5
|
+
require_relative 'cli/supers_hierachy_cli'
|
6
|
+
|
7
|
+
OUT_FOLDER = "sftp".freeze
|
8
|
+
OUT_TIME_FORMAT = '%Y%m%dT%H%M%S'.freeze
|
9
|
+
OUT_FILENAME = "supers_hierarchy".freeze
|
10
|
+
|
5
11
|
attr_reader :people
|
6
12
|
|
7
13
|
def main(people, _session, options, _usecase)
|
8
14
|
options[:end_get] = false
|
9
15
|
@people = people
|
10
16
|
|
11
|
-
save!(hierarchy)
|
17
|
+
save!(hierarchy, file: output_filename)
|
12
18
|
end
|
13
19
|
|
14
20
|
private
|
@@ -17,11 +23,7 @@ class Eco::API::UseCases::Default::People::Treat::SupersHierarchy < Eco::API::Co
|
|
17
23
|
Eco::API::Common::People::SupervisorHelpers.supervisors_tree(people)
|
18
24
|
end
|
19
25
|
|
20
|
-
def file
|
21
|
-
@file ||= options.dig(:output, :file) || "supers_hierarchy.txt"
|
22
|
-
end
|
23
|
-
|
24
|
-
def save!(data)
|
26
|
+
def save!(data, file:)
|
25
27
|
ext = File.extname(file).downcase.delete(".")
|
26
28
|
|
27
29
|
case ext
|
@@ -42,18 +44,39 @@ class Eco::API::UseCases::Default::People::Treat::SupersHierarchy < Eco::API::Co
|
|
42
44
|
File.open(file, "w") do |fd|
|
43
45
|
fd << tree_to_str(tree, format: format)
|
44
46
|
end
|
45
|
-
|
47
|
+
|
48
|
+
log(:info) {
|
49
|
+
"Generated file #{file}"
|
50
|
+
}
|
46
51
|
end
|
47
52
|
|
48
53
|
def tree_to_str(tree, lev: 0, format: :txt)
|
49
|
-
|
54
|
+
msg = "Required Hash tree structure. Given: #{tree.class}"
|
55
|
+
raise msg unless tree.is_a?(Hash)
|
56
|
+
|
50
57
|
"".tap do |str|
|
51
58
|
tree.each do |entry, subtree|
|
52
59
|
str << "#{" " * lev}#{lev.positive? ? "+-#{lev}- " : ""}"
|
53
|
-
str << entry.name
|
60
|
+
str << (entry.name || entry.email || entry.external_id || entry.id)
|
54
61
|
str << " (#{entry.external_id}|#{entry.email}|#{entry.id})\n"
|
55
62
|
str << tree_to_str(subtree, lev: lev + 1, format: format) unless !subtree || subtree.empty?
|
56
63
|
end
|
57
64
|
end
|
58
65
|
end
|
66
|
+
|
67
|
+
def output_filename(ext: 'txt')
|
68
|
+
@output_filename ||= options.dig(:output, :file) || default_output_filename(ext: ext)
|
69
|
+
end
|
70
|
+
|
71
|
+
def default_output_filename(name = self.class::OUT_FILENAME, ext: nil)
|
72
|
+
File.join(output_folder, "#{timestamp}_#{config.active_enviro}_#{name}.#{ext}")
|
73
|
+
end
|
74
|
+
|
75
|
+
def output_folder
|
76
|
+
"#{config.active_enviro}/#{self.class::OUT_FOLDER}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def timestamp(date = Time.now)
|
80
|
+
date.strftime(self.class::OUT_TIME_FORMAT)
|
81
|
+
end
|
59
82
|
end
|
@@ -23,7 +23,7 @@ class Eco::API::UseCases::Default::People::Utils::SetDefaultTagCase < Eco::API::
|
|
23
23
|
return unless tagtree?
|
24
24
|
|
25
25
|
msg = "There is no locs struct defined. Aborting..."
|
26
|
-
|
26
|
+
log(:fatal) { msg }
|
27
27
|
raise msg
|
28
28
|
end
|
29
29
|
|
@@ -39,6 +39,7 @@ class Eco::API::UseCases::Default::People::Utils::SetDefaultTagCase < Eco::API::
|
|
39
39
|
|
40
40
|
def tagtree?
|
41
41
|
return false unless (tree = session.tagtree)
|
42
|
+
|
42
43
|
!tree.empty?
|
43
44
|
end
|
44
45
|
end
|
@@ -2,7 +2,7 @@ class Eco::API::UseCases::DefaultCases::ToCsvCase < Eco::API::Common::Loaders::U
|
|
2
2
|
name "to-csv"
|
3
3
|
type :export
|
4
4
|
|
5
|
-
OUT_FILENAME = 'pm'
|
5
|
+
OUT_FILENAME = 'pm'.freeze
|
6
6
|
|
7
7
|
attr_reader :people
|
8
8
|
|
@@ -30,7 +30,7 @@ class Eco::API::UseCases::DefaultCases::ToCsvCase < Eco::API::Common::Loaders::U
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def create_file!(filename = file, data = people)
|
33
|
-
|
33
|
+
session.log(:info) { "going to create file: #{filename}" }
|
34
34
|
|
35
35
|
CSV.open(filename, "w") do |csv|
|
36
36
|
csv << spot_header(data.first)
|