eco-helpers 2.0.13 → 2.0.14
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/CHANGELOG.md +12 -2
- data/lib/eco/api/common/people/person_entry.rb +5 -0
- data/lib/eco/api/error.rb +5 -3
- data/lib/eco/api/organization/presets_factory.rb +145 -82
- data/lib/eco/api/organization/presets_integrity.json +52 -0
- data/lib/eco/api/session/batch/job.rb +3 -0
- data/lib/eco/api/usecases/default_cases/to_csv_case.rb +41 -21
- data/lib/eco/cli/config/default/usecases.rb +2 -2
- data/lib/eco/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 697d71754e809691a39f62a86d5fc46e2988578c19c965945e1c06ea73b290b6
|
4
|
+
data.tar.gz: 01ef5ca1a9bcf941d44b5f7088f54dd9c2cba950cc562ed0516400811df60f12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b24db6ddf741e3f0dcc3f080dba19132d7926c85cf211ae0f98c090c7a3cd93f513b6e977ac21ca24d5c2092d524cc1e7ef3d04250bb29ae672400623c823964
|
7
|
+
data.tar.gz: 9585e95676aab71322af2f174d06aed7d6226502bed1e2560cfd0915643e682c02fb857c33310f7c5f1b6d083b83267d14194f0f1e315c940048ef1c3c43faff
|
data/CHANGELOG.md
CHANGED
@@ -1,14 +1,24 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [2.0.14] - 2021-03-xx
|
5
|
+
|
6
|
+
### Added
|
7
|
+
- `Eco::API::UseCases::DefaultCases::ToCsvCase` added option `-internal-names` to avoid overriding data on export
|
8
|
+
- `Eco::API::Common::People::PersonEntry#mapped_entry` exposed method for raw `csv` generation
|
9
|
+
- `Eco::API::Organization::PresetsFactory` added integrity validation for `person_*` abilities
|
10
|
+
- `Eco::API::Session::Batch::Job` more debug info on erron handlers
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
### Fixed
|
14
|
+
- `Eco::API::Error.get_type` was almost always matching `Eco::API::Error::Unclassified` -> fixed
|
15
|
+
|
4
16
|
## [2.0.13] - 2021-03-31
|
5
17
|
|
6
18
|
### Added
|
7
19
|
- Stats on the `Eco::API::Session::Batch`
|
8
20
|
- Allow to inherit and re-use the `Eco::API::UseCases::DefaultCase::HrisCase`
|
9
21
|
|
10
|
-
### Changed
|
11
|
-
|
12
22
|
### Fixed
|
13
23
|
- Ensure auto-loading for `Eco::API::UseCases`
|
14
24
|
|
@@ -57,6 +57,11 @@ module Eco
|
|
57
57
|
@internal_entry
|
58
58
|
end
|
59
59
|
|
60
|
+
# @return [Hash] entry `Hash` with **internal** attribute names, but **external** types and values.
|
61
|
+
def mapped_entry
|
62
|
+
@mapped_entry
|
63
|
+
end
|
64
|
+
|
60
65
|
# @note values ready to be set to a person.
|
61
66
|
# @return [Hash] entry `Hash` with **internal** attribute names, values and types.
|
62
67
|
def final_entry
|
data/lib/eco/api/error.rb
CHANGED
@@ -80,6 +80,7 @@ module Eco
|
|
80
80
|
next 1 if k1 < k2
|
81
81
|
0
|
82
82
|
end.tap do |siblings|
|
83
|
+
siblings.delete(Unclassified)
|
83
84
|
if direct
|
84
85
|
siblings.reject! do |si|
|
85
86
|
siblings.any? {|s| si < s}
|
@@ -96,17 +97,18 @@ module Eco
|
|
96
97
|
err_msg =~ @match
|
97
98
|
end
|
98
99
|
|
99
|
-
def get_type(err_msg)
|
100
|
+
def get_type(err_msg, first: true)
|
100
101
|
type = nil
|
101
102
|
descendants(direct: true).reverse.each do |klass|
|
102
103
|
if klass.err_match?(err_msg)
|
103
104
|
type = klass
|
104
105
|
if klass.descendants?(direct: true)
|
105
|
-
type = klass.get_type(err_msg) || type
|
106
|
+
type = klass.get_type(err_msg, first: false) || type
|
106
107
|
end
|
107
108
|
end
|
108
109
|
end
|
109
|
-
type
|
110
|
+
return type unless first
|
111
|
+
type || Unclassified
|
110
112
|
end
|
111
113
|
|
112
114
|
def known_err_class?(klass)
|
@@ -4,38 +4,27 @@ module Eco
|
|
4
4
|
|
5
5
|
class PresetsFactory
|
6
6
|
ABILITIES = File.join(__dir__, 'presets_values.json')
|
7
|
+
INTEGRITY = File.join(__dir__, 'presets_integrity.json')
|
7
8
|
DEFAULT_CUSTOM = 'presets_custom.json'
|
8
9
|
DEFAULT_MAP = 'presets_map.json'
|
9
10
|
|
10
11
|
def initialize(presets_custom: DEFAULT_CUSTOM, presets_map: DEFAULT_MAP, enviro: nil, policy_groups: nil)
|
11
|
-
@abilities = JSON.load(File.open(ABILITIES))
|
12
|
-
@habilities = @abilities.map do |key, values|
|
13
|
-
h_values = values.map { |v| [v, true] }.to_h
|
14
|
-
[key, h_values]
|
15
|
-
end.to_h
|
16
|
-
|
17
12
|
fatal("Expecting Environment object. Given: #{enviro}") if enviro && !enviro.is_a?(Eco::API::Common::Session::Environment)
|
18
|
-
@enviro
|
19
|
-
|
20
|
-
policy_groups = policy_groups || @enviro&.api&.policy_groups.to_a
|
21
|
-
if policy_groups.is_a?(Eco::API::Organization::PolicyGroups)
|
22
|
-
@policy_groups = policy_groups
|
23
|
-
else
|
24
|
-
@policy_groups = Eco::API::Organization::PolicyGroups.new(policy_groups)
|
25
|
-
end
|
13
|
+
@enviro = enviro
|
26
14
|
|
27
|
-
|
28
|
-
|
15
|
+
@policy_groups = policy_groups
|
16
|
+
@presets_custom_file = presets_custom || DEFAULT_CUSTOM
|
17
|
+
@presets_map_file = presets_map || DEFAULT_MAP
|
29
18
|
end
|
30
19
|
|
31
20
|
def new(*policy_group_ids_or_names)
|
32
21
|
|
33
22
|
names = policy_group_ids_or_names.map do |id_name|
|
34
|
-
|
23
|
+
policy_groups.to_name(id_name)&.downcase
|
35
24
|
end.compact
|
36
25
|
|
37
|
-
if
|
38
|
-
preset_names = names.map { |name|
|
26
|
+
if presets_map
|
27
|
+
preset_names = names.map { |name| presets_map.fetch(name, nil) }
|
39
28
|
else # option to do not use preset mapping (so just the policy group name)
|
40
29
|
preset_names = names
|
41
30
|
end
|
@@ -44,69 +33,11 @@ module Eco
|
|
44
33
|
|
45
34
|
# @return [Array<String>] all the abilities
|
46
35
|
def keys
|
47
|
-
|
36
|
+
abilities_model.keys
|
48
37
|
end
|
49
38
|
|
50
39
|
private
|
51
40
|
|
52
|
-
def init_custom(file = DEFAULT_CUSTOM)
|
53
|
-
@presets_custom = nil
|
54
|
-
|
55
|
-
return if !file
|
56
|
-
file = File.expand_path(file)
|
57
|
-
|
58
|
-
if File.exists?(file)
|
59
|
-
@presets_custom = JSON.load(File.open(file))
|
60
|
-
|
61
|
-
errors = @presets_custom.map do |key, preset|
|
62
|
-
(err = preset_errors(preset)) ? "{ '#{key}' preset -> #{err}}": nil
|
63
|
-
end.compact
|
64
|
-
|
65
|
-
fatal("File '#{file}' contains invalid presets:\n #{errors.join("\n ")}") if errors.length > 0
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
def init_map(file = DEFAULT_MAP)
|
71
|
-
@presets_map = nil
|
72
|
-
|
73
|
-
return if !file
|
74
|
-
file = File.expand_path(file)
|
75
|
-
|
76
|
-
if File.exists?(file)
|
77
|
-
fatal("Maps file specified without custom presets file. Aborting!") if !@presets_custom
|
78
|
-
@presets_map = JSON.load(File.open(file))
|
79
|
-
|
80
|
-
errors = []
|
81
|
-
if @policy_groups.length > 0
|
82
|
-
errors = @policy_groups.map do |pg|
|
83
|
-
exists = @presets_map[pg.name.downcase] || @presets_custom[pg.name.downcase]
|
84
|
-
exists ? nil : "'#{pg.name}'"
|
85
|
-
end.compact
|
86
|
-
|
87
|
-
warn("No maps or no preset for policy group(s): #{errors.join(", ")}") if errors.length > 0
|
88
|
-
end
|
89
|
-
|
90
|
-
errors = @presets_map.map do |source, dest|
|
91
|
-
@presets_custom[dest] ? nil : "'#{dest}'"
|
92
|
-
end.compact
|
93
|
-
|
94
|
-
warn("Unexisting mapped preset(s): #{errors.uniq.join(", ")}") if errors.length > 0
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
|
99
|
-
def fatal(msg)
|
100
|
-
raise msg if !@enviro
|
101
|
-
@enviro.logger.fatal(msg)
|
102
|
-
raise msg
|
103
|
-
end
|
104
|
-
|
105
|
-
def warn(msg)
|
106
|
-
raise msg if !@enviro
|
107
|
-
@enviro.logger.warn(msg)
|
108
|
-
end
|
109
|
-
|
110
41
|
def compile(*preset_names)
|
111
42
|
fatal("You need to specify an existing file for the custom presets.") if !@presets_custom
|
112
43
|
@presets_custom.values_at(*preset_names).compact.reduce({}) do |p1, p2|
|
@@ -117,7 +48,7 @@ module Eco
|
|
117
48
|
def merge(preset1, preset2)
|
118
49
|
keys = preset1.keys | preset2.keys
|
119
50
|
|
120
|
-
|
51
|
+
abilities_model.each_with_object({}) do |(key, values), result|
|
121
52
|
next unless keys.include?(key)
|
122
53
|
idx = [
|
123
54
|
values.index(preset1[key]),
|
@@ -129,17 +60,149 @@ module Eco
|
|
129
60
|
|
130
61
|
# unsused: only play with the given abilities
|
131
62
|
def empty_model
|
132
|
-
JSON.parse(
|
63
|
+
JSON.parse(abilities_model.to_json).transform_values {|v| nil }
|
133
64
|
end
|
134
65
|
|
135
66
|
def preset_errors(preset)
|
136
67
|
return "No preset given" if !preset
|
137
68
|
errors = preset.map do |k, v|
|
138
|
-
|
69
|
+
value_exists?(k, v) ? nil : "#{k}:#{v}"
|
139
70
|
end.compact
|
140
|
-
return "
|
71
|
+
return " Unknown: {#{errors.join(", ")}}" if errors.length > 0
|
141
72
|
nil
|
142
73
|
end
|
74
|
+
|
75
|
+
def preset_integrity(preset)
|
76
|
+
preset.each_with_object([]) do |(ability, value), errors|
|
77
|
+
next unless checks = integrity_model[ability]
|
78
|
+
|
79
|
+
suberrors = []
|
80
|
+
|
81
|
+
checks.each do |check|
|
82
|
+
next unless check["value"] == value
|
83
|
+
check["conditions"].each do |cond, targets|
|
84
|
+
case cond
|
85
|
+
when "at_least"
|
86
|
+
targets.each do |other, minimum|
|
87
|
+
unless (ability_value_idx(other, minimum) <= ability_value_idx(other, preset[other]))
|
88
|
+
suberrors << "'#{other}' should be at least '#{minimum}'"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
when "one_of"
|
92
|
+
unless targets.any? {|other, expected| preset[other] == expected}
|
93
|
+
suberrors << targets.each_with_object([]) do |(other, expected), out|
|
94
|
+
out << "'#{other}': '#{expected}'"
|
95
|
+
end.join(", ").yield_self do |msg|
|
96
|
+
"there should be at least one of: {#{msg}}"
|
97
|
+
end
|
98
|
+
end
|
99
|
+
else
|
100
|
+
warn("Unsuported integrity condition statement '#{cond}' in '#{ability}' with level '#{value}'")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
if suberrors.length > 0
|
106
|
+
errors << "Incorrect value '#{value}' for '#{ability}' - reasons: {#{suberrors.join(", ")}}"
|
107
|
+
end
|
108
|
+
end.yield_self do |errors|
|
109
|
+
" Integrity errors: { #{errors.join(", ")} }" if errors.length > 0
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def integrity_model
|
114
|
+
@integrity_model ||= JSON.load(File.open(INTEGRITY))
|
115
|
+
end
|
116
|
+
|
117
|
+
def value_exists?(ability, value)
|
118
|
+
abilities_model_inverted.dig(ability, value)
|
119
|
+
end
|
120
|
+
|
121
|
+
def abilities_model_inverted
|
122
|
+
@abilities_model_inverted ||= abilities_model.each_with_object({}) do |(key, values), out|
|
123
|
+
out[key] = values.each_with_object({}) {|v, h| h[v] = true }
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def ability_value_idx(ability, value)
|
128
|
+
abilities_model[ability].index(value)
|
129
|
+
end
|
130
|
+
|
131
|
+
def abilities_model
|
132
|
+
@abilities_model ||= JSON.load(File.open(ABILITIES))
|
133
|
+
end
|
134
|
+
|
135
|
+
def policy_groups
|
136
|
+
return @policy_groups if @policy_groups.is_a?(Eco::API::Organization::PolicyGroups)
|
137
|
+
@policy_groups ||= @enviro&.api&.policy_groups.to_a
|
138
|
+
|
139
|
+
unless @policy_groups.is_a?(Eco::API::Organization::PolicyGroups)
|
140
|
+
@policy_groups = Eco::API::Organization::PolicyGroups.new(@policy_groups)
|
141
|
+
end
|
142
|
+
@policy_groups
|
143
|
+
end
|
144
|
+
|
145
|
+
def presets_custom
|
146
|
+
return @presets_custom if instance_variable_defined?(:@presets_custom)
|
147
|
+
@presets_custom = nil
|
148
|
+
if @presets_custom_file
|
149
|
+
if (file = File.expand_path(@presets_custom_file)) && File.exists?(file)
|
150
|
+
@presets_custom = JSON.load(File.open(file)).tap do |custom_presets|
|
151
|
+
errors = custom_presets.each_with_object([]) do |(key, preset), errors|
|
152
|
+
if err = preset_errors(preset)
|
153
|
+
errors << "{ '#{key}' preset -> #{err}}"
|
154
|
+
end
|
155
|
+
if err = preset_integrity(preset)
|
156
|
+
errors << "{ '#{key}' preset -> #{err}}"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
fatal("File '#{file}' contains invalid presets:\n #{errors.join("\n ")}") if errors.length > 0
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def presets_map
|
167
|
+
return @presets_map if instance_variable_defined?(:@presets_map)
|
168
|
+
@presets_map = nil
|
169
|
+
if @presets_map_file
|
170
|
+
if (file = File.expand_path(@presets_map_file)) && File.exists?(file)
|
171
|
+
fatal("Maps file specified without 'presets_custom.json' file. Aborting!") if !presets_custom
|
172
|
+
@presets_map = JSON.load(File.open(file)).tap do |map_presets|
|
173
|
+
|
174
|
+
errors = []
|
175
|
+
if policy_groups.length > 0
|
176
|
+
errors = policy_groups.map do |pg|
|
177
|
+
exists = map_presets[pg.name.downcase] || presets_custom[pg.name.downcase]
|
178
|
+
exists ? nil : "'#{pg.name}'"
|
179
|
+
end.compact
|
180
|
+
|
181
|
+
warn("No maps or no preset for policy group(s): #{errors.join(", ")}") if errors.length > 0
|
182
|
+
end
|
183
|
+
|
184
|
+
errors = map_presets.map do |source, dest|
|
185
|
+
presets_custom[dest] ? nil : "'#{dest}'"
|
186
|
+
end.compact
|
187
|
+
|
188
|
+
warn("Unexisting mapped preset(s): #{errors.uniq.join(", ")}") if errors.length > 0
|
189
|
+
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def fatal(msg)
|
196
|
+
raise msg if !@enviro
|
197
|
+
@enviro.logger.fatal(msg)
|
198
|
+
raise msg
|
199
|
+
end
|
200
|
+
|
201
|
+
def warn(msg)
|
202
|
+
raise msg if !@enviro
|
203
|
+
@enviro.logger.warn(msg)
|
204
|
+
end
|
205
|
+
|
143
206
|
end
|
144
207
|
|
145
208
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
{
|
2
|
+
"person_core_create": [
|
3
|
+
{ "value": "create", "conditions": {
|
4
|
+
"at_least": {"person_core": "view_people_manager"}
|
5
|
+
}
|
6
|
+
}
|
7
|
+
],
|
8
|
+
"person_core_edit": [
|
9
|
+
{ "value": "edit", "conditions": {
|
10
|
+
"at_least": {"person_core": "view_people_manager"}
|
11
|
+
}
|
12
|
+
}
|
13
|
+
],
|
14
|
+
"person_details": [
|
15
|
+
{ "value": "view", "conditions": {
|
16
|
+
"at_least": {"person_core": "attach"}
|
17
|
+
}
|
18
|
+
},
|
19
|
+
{ "value": "edit_public", "conditions": {
|
20
|
+
"one_of": {
|
21
|
+
"person_core_edit": "edit",
|
22
|
+
"person_core_create": "create"
|
23
|
+
}
|
24
|
+
}
|
25
|
+
},
|
26
|
+
{ "value": "view_private", "conditions": {
|
27
|
+
"at_least": {"person_core": "attach" }
|
28
|
+
}
|
29
|
+
},
|
30
|
+
{ "value": "edit_private", "conditions": {
|
31
|
+
"one_of": {
|
32
|
+
"person_core_edit": "edit",
|
33
|
+
"person_core_create": "create"
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
],
|
38
|
+
"person_account": [
|
39
|
+
{ "value": "view", "conditions": {
|
40
|
+
"at_least": {"person_core": "attach" }
|
41
|
+
}
|
42
|
+
},
|
43
|
+
{ "value": "create", "conditions": {
|
44
|
+
"at_least": {"person_core_create": "create"}
|
45
|
+
}
|
46
|
+
},
|
47
|
+
{ "value": "edit", "conditions": {
|
48
|
+
"at_least": {"person_core_edit": "edit"}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
]
|
52
|
+
}
|
@@ -288,10 +288,13 @@ module Eco
|
|
288
288
|
handlers = session.config.error_handlers
|
289
289
|
if status.errors.any? && !handlers.empty? && !error_handler?
|
290
290
|
err_types = status.errors.by_type
|
291
|
+
logger.debug("(#{self.name}) got these error types: #{err_types.keys}")
|
291
292
|
handlers.each do |handler|
|
292
293
|
if entries = err_types[handler.name]
|
293
294
|
handler_job = subjobs_add("#{self.name} => #{handler.name}", usecase: handler)
|
295
|
+
logger.debug("Running error handler #{handler.name}")
|
294
296
|
handler.launch(people: people(entries), session: session, options: options, job: handler_job)
|
297
|
+
logger.debug("Launching job of error handler: #{handler_job.name}")
|
295
298
|
handler_job.launch(simulate: simulate)
|
296
299
|
end
|
297
300
|
end
|
@@ -2,7 +2,11 @@ class Eco::API::UseCases::DefaultCases::ToCsvCase < Eco::API::Common::Loaders::U
|
|
2
2
|
name "to-csv"
|
3
3
|
type :export
|
4
4
|
|
5
|
+
attr_reader :session, :options, :people
|
6
|
+
|
5
7
|
def main(people, session, options, usecase)
|
8
|
+
@session = session; @options = options; @people = people
|
9
|
+
|
6
10
|
unless people && !people.empty?
|
7
11
|
session.logger.warn("No source people to create the file... aborting!")
|
8
12
|
return false
|
@@ -14,32 +18,48 @@ class Eco::API::UseCases::DefaultCases::ToCsvCase < Eco::API::Common::Loaders::U
|
|
14
18
|
end
|
15
19
|
|
16
20
|
session.logger.info("going to create file: #{file}")
|
17
|
-
CSV.open(file, "w") do |csv|
|
18
|
-
deps = {"supervisor_id" => {people: people}}
|
19
|
-
entry = session.new_entry(people.first, dependencies: deps)
|
20
|
-
header = entry.external_entry.keys
|
21
|
-
|
22
|
-
if options.dig(:nice_header) || options.dig(:export, :options, :nice_header)
|
23
|
-
name_maps = session.schema.fields_by_alt_id.transform_values do |fld|
|
24
|
-
fld.name
|
25
|
-
end.merge({
|
26
|
-
"policy_group_ids" => "User Group(s)",
|
27
|
-
"email" => "Email",
|
28
|
-
"name" => "Name",
|
29
|
-
"supervisor_id" => "Manager ID",
|
30
|
-
"filter_tags" => "Locations",
|
31
|
-
"default_tag" => "Default Location",
|
32
|
-
"id" => "ecoPortal ID"
|
33
|
-
})
|
34
|
-
header = header.map {|name| name_maps[name] ? name_maps[name] : name}
|
35
|
-
end
|
36
21
|
|
37
|
-
|
22
|
+
CSV.open(file, "w") do |csv|
|
23
|
+
csv << spot_header
|
38
24
|
people.each do |person|
|
39
|
-
csv <<
|
25
|
+
csv << target_entry_type(person).values
|
40
26
|
end
|
41
27
|
end
|
42
28
|
exit(0)
|
43
29
|
end
|
44
30
|
|
31
|
+
private
|
32
|
+
|
33
|
+
def target_entry_type(person)
|
34
|
+
session.new_entry(person, dependencies: deps).yield_self do |person_entry|
|
35
|
+
options.dig(:export, :options, :internal_names) ? person_entry.mapped_entry : person_entry.external_entry
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def deps
|
40
|
+
@deps ||= {"supervisor_id" => {people: people}}
|
41
|
+
end
|
42
|
+
|
43
|
+
def spot_header
|
44
|
+
entry = target_entry_type(people.first)
|
45
|
+
header = entry.keys
|
46
|
+
|
47
|
+
if options.dig(:nice_header) || options.dig(:export, :options, :nice_header)
|
48
|
+
name_maps = session.schema.fields_by_alt_id.transform_values do |fld|
|
49
|
+
fld.name
|
50
|
+
end.merge({
|
51
|
+
"policy_group_ids" => "User Group(s)",
|
52
|
+
"email" => "Email",
|
53
|
+
"name" => "Name",
|
54
|
+
"supervisor_id" => "Manager ID",
|
55
|
+
"filter_tags" => "Locations",
|
56
|
+
"default_tag" => "Default Location",
|
57
|
+
"id" => "ecoPortal ID"
|
58
|
+
})
|
59
|
+
header = header.map {|name| name_maps[name] ? name_maps[name] : name}
|
60
|
+
end
|
61
|
+
header
|
62
|
+
end
|
63
|
+
|
64
|
+
|
45
65
|
end
|
@@ -6,7 +6,7 @@ ASSETS.cli.config do |cnf|
|
|
6
6
|
file = SCR.get_file("-people-to-csv", required: true, should_exist: false)
|
7
7
|
options.deep_merge!(export: {file: {name: file, format: :csv}})
|
8
8
|
options.deep_merge!(export: {options: {nice_header: true}}) if SCR.get_arg("-nice-header")
|
9
|
-
|
9
|
+
options.deep_merge!(export: {options: {internal_names: true}}) if SCR.get_arg("-internal-names")
|
10
10
|
case_name = SCR.get_arg("-detailed")? "to-csv-detailed" : "to-csv"
|
11
11
|
session.usecases.case(case_name)
|
12
12
|
end
|
@@ -73,7 +73,7 @@ ASSETS.cli.config do |cnf|
|
|
73
73
|
end
|
74
74
|
|
75
75
|
options.deep_merge!(ignore: {missing: {policy_groups: true}}) if SCR.get_arg("-ignore-missing-policy-groups")
|
76
|
-
|
76
|
+
|
77
77
|
end
|
78
78
|
|
79
79
|
desc = "Restores the people manager by using a backup.json file"
|
data/lib/eco/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eco-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oscar Segura
|
@@ -340,6 +340,7 @@ files:
|
|
340
340
|
- lib/eco/api/organization/preferences.rb
|
341
341
|
- lib/eco/api/organization/preferences_reference.json
|
342
342
|
- lib/eco/api/organization/presets_factory.rb
|
343
|
+
- lib/eco/api/organization/presets_integrity.json
|
343
344
|
- lib/eco/api/organization/presets_reference.json
|
344
345
|
- lib/eco/api/organization/presets_values.json
|
345
346
|
- lib/eco/api/organization/tag_tree.rb
|