eco-helpers 0.6.3 → 0.6.4

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
  SHA1:
3
- metadata.gz: ad5941e8792705047cf6dbd46515023c9bda2285
4
- data.tar.gz: b1b3ef9fa046781f791170f2a4e872ef79862efe
3
+ metadata.gz: 4a9a891a431684fe13200bdd2b55d92c418fdd09
4
+ data.tar.gz: badc9350ac7b4f8b1061a7f7ab25393af5bace7c
5
5
  SHA512:
6
- metadata.gz: b05481b93f00fe18b0d8721ec2c1e11e25e85bda934042458e948217bb8e52a5efe2ae53464525bd95baffcb003f749361653bb0273edd8ae4ea80ea6b4a1c64
7
- data.tar.gz: e26cc0b7607a2c7197c1e528a914ca9ea2414688205d21421c582d81317a54c6cc76c454646d88b865f287ebe389bd44e85cf0929b09036e8859183bc5856add
6
+ metadata.gz: 0df330e81d17f875c120dcd0abc87f142a478e91b186cf4f70a4634ce513ad69a6d16fd4e5eea9da17ef7b366c84b129758d38a001627134f488ba35181bfdc2
7
+ data.tar.gz: 7154d3081842a3efc237bdbd80e8a5fc310a079eee2e71861456b5e47fc64c6fedaa15e880d5a97a10be2fc50059896fc328e630702976ee9672c87d5c2d266a
data/eco-helpers.gemspec CHANGED
@@ -23,6 +23,8 @@ Gem::Specification.new do |s|
23
23
  s.require_paths = ["lib"]
24
24
 
25
25
  s.add_development_dependency "rspec", "~> 3", ">= 3.8"
26
+ s.add_development_dependency "yard", "~> 0.9", ">= 0.9.18"
27
+ s.add_development_dependency "redcarpet", "~> 3.4", ">= 3.4.0"
26
28
 
27
29
  s.add_dependency 'ecoportal-api', '~> 0.3', '>= 0.3.6'
28
30
  s.add_dependency 'faker', '~> 1', '>= 1.9'
@@ -8,6 +8,5 @@ end
8
8
  require_relative 'organization/tag_tree'
9
9
  require_relative 'organization/presets'
10
10
  require_relative 'organization/preferences'
11
- require_relative 'organization/account'
12
11
  require_relative 'organization/people'
13
12
  require_relative 'organization/policy_groups'
@@ -9,10 +9,8 @@ module Eco
9
9
 
10
10
  alias_method :people, :to_a
11
11
 
12
- include Common::People
13
-
14
- def initialize(people = [], klass: INTERNAL::Person, factory: nil)
15
- @klass = INTERNAL::Person unless klass == EXTERNAL::Person
12
+ def initialize(people = [], klass: Ecoportal::API::Internal::Person, factory: nil)
13
+ @klass = Ecoportal::API::Internal::Person unless klass == Ecoportal::API::V1::Person
16
14
  super(people, klass: @klass)
17
15
  @caches_init = false
18
16
  end
@@ -2,10 +2,21 @@ module Eco
2
2
  module API
3
3
  module Organization
4
4
 
5
+ # Provides helpers to deal with tagtrees.
5
6
  class TagTree
6
7
  attr_reader :tag, :nodes
7
8
  attr_reader :depth, :path
8
9
 
10
+ # @example Node format:
11
+ # {"tag": "NODE NAME", "nodes": subtree}
12
+ # @example Tree/subtree format:
13
+ # [[Node], ...]
14
+ # @example Input format example:
15
+ # tree = [{"tag" => "AUSTRALIA", "nodes" => [
16
+ # {"tag" => "SYNDEY", "nodes" => []}
17
+ # ]}]
18
+ # tree = TagTree.new(tree.to_json)
19
+ # @param tagtree [String] representation of the tagtree in json.
9
20
  def initialize(tagtree = [], depth: -1, path: [], enviro: nil)
10
21
  case tagtree
11
22
  when String
@@ -29,29 +40,68 @@ module Eco
29
40
  init_hashes
30
41
  end
31
42
 
43
+ # List of tag nodes of the entire subtree.
44
+ # @return [Array<String>]
32
45
  def tags
33
46
  @hash_tags.keys
34
47
  end
35
48
 
49
+ # Verifies if a tag exists in the tree.
50
+ # @param key [String] tag to verify.
51
+ # @return [Boolean]
36
52
  def tag?(key)
37
53
  @hash_tags.key?(key.upcase)
38
54
  end
39
55
 
56
+ # Finds a subtree node.
57
+ # @param key [String] parent node of subtree.
58
+ # @return [TagTree, nil] if the tag `key` is a node, returns that node.
40
59
  def get_node(key)
41
60
  return nil unless tag?(key)
42
61
  @hash_tags[key.upcase]
43
62
  end
44
63
 
64
+ # Filters tags out that do not belong to the tree
65
+ # @param list [Array<String>] source tags.
66
+ # @return [Array<String>]
45
67
  def filter_tags(list)
46
68
  return [] unless list && list.is_a?(Array)
47
69
  list.select {|str| tag?(str)}
48
70
  end
49
71
 
72
+ # Finds the path from a node `key` to the its root node in the tree.
73
+ # If `key` is not specified, returns the path from current node to root.
74
+ # @note the `path` is not relative to the subtree, but absolute to the entire tree.
75
+ # @param key [String] tag to find the path to.
76
+ # @return [Array<String>]
50
77
  def path(key = nil)
51
78
  return @path if !key
52
79
  @hash_paths[key.upcase]
53
80
  end
54
81
 
82
+ # Helper to assign tags to a person account.
83
+ # * It preserves the `:initial` order, in case the `:final` tags are the same
84
+ #
85
+ # @example Usage example:
86
+ # tree = [{"tag" => "Australia", "nodes" => [
87
+ # {"tag" => "SYNDEY", "nodes" => []},
88
+ # {"tag" => "MELMOURNE", "nodes" => []}
89
+ # ]}]
90
+ #
91
+ # tree = TagTree.new(tree.to_json)
92
+ # original = ["SYNDEY", "RISK"]
93
+ # final = ["MELMOURNE", "EVENT"]
94
+ #
95
+ # tree.user_tags(initial: original, final: final) # out: ["MELMOURNE", "RISK"]
96
+ # tree.user_tags(initial: original, final: final, preserve_custom: false) # out: ["MELMOURNE"]
97
+ # tree.user_tags(initial: original, final: final, add_custom: true) # out: ["MELMOURNE", "RISK", "EVENT"]
98
+ # tree.user_tags(initial: original, final: final, preserve_custom: false, add_custom: true) # out: ["MELMOURNE", "EVENT"]
99
+ #
100
+ # @param initial [Array<String>] original tags a person has in their account.
101
+ # @param final [Array<String>] target tags the person should have in their account afterwards.
102
+ # @param preserve_custom [Boolean] indicates if original tags that are not in the tree should be added/preserved.
103
+ # @param add_custom [Boolean] indicates if target tags that are not in the tree should be really added.
104
+ # @return [Array<String>] with the treated final tags.
55
105
  def user_tags(initial: [], final: [], preserve_custom: true, add_custom: false)
56
106
  initial = [initial].flatten.compact
57
107
  final = [final].flatten.compact
@@ -64,10 +114,13 @@ module Eco
64
114
  (initial & final) + new_tags
65
115
  end
66
116
 
67
- # take the deepest tag (the one that is further down in the tree)
68
- # different options (several nodes at the same depth):
69
- # => take the common node between them (i.e. you have Hamilton and Auckland -> take New Zealand)
70
- # => if there's no common node between them, take the `first` (unless they are at top level of the tree)
117
+ # Helper to decide which among the tags will be the default.
118
+ # * take the deepest tag (the one that is further down in the tree)
119
+ # * if there are different options (several nodes at the same depth):
120
+ # * take the common node between them (i.e. you have Hamilton and Auckland -> take New Zealand)
121
+ # * if there's no common node between them, take the `first` (unless they are at top level of the tree)
122
+ # @param [Array<String>] values list of tags.
123
+ # @return [String] default tag.
71
124
  def default_tag(*values)
72
125
  values = filter_tags(values)
73
126
  nodes = []; depth = -1
@@ -16,6 +16,7 @@ module Eco
16
16
  EmailAsIdCase.new(self).process
17
17
  NewIdCase.new(self).process
18
18
  NewEmailCase.new(self).process
19
+ SwitchSupervisorCase.new(self).process
19
20
  SetSupervisorCase.new(self).process
20
21
  UpdateDetailsCase.new(self).process
21
22
  CreateDetailsCase.new(self).process
@@ -40,6 +41,7 @@ require_relative 'default_cases/email_as_id_case'
40
41
  require_relative 'default_cases/new_id_case'
41
42
  require_relative 'default_cases/new_email_case'
42
43
  require_relative 'default_cases/set_supervisor_case'
44
+ require_relative 'default_cases/switch_supervisor_case'
43
45
  require_relative 'default_cases/update_details_case'
44
46
  require_relative 'default_cases/create_details_case'
45
47
  require_relative 'default_cases/create_details_with_supervisor_case'
@@ -0,0 +1,57 @@
1
+ module Eco
2
+ module API
3
+ module UseCases
4
+ class DefaultCases
5
+ class SwitchSupervisorCase < UseCases::BaseCase
6
+
7
+ def process
8
+ @cases.define("switch-supervisor", type: :transform) do |people, session, options|
9
+
10
+ unless old_id = options.dig(:super, :old)
11
+ session.logger.error("You haven't specified the original supervisor. Aborting...")
12
+ exit
13
+ end
14
+
15
+ # we could be setting the supervisor to nil
16
+ unless options[:super].key?(:new)
17
+ session.logger.error("You haven't specified the new supervisor. Aborting...")
18
+ exit
19
+ end
20
+
21
+ pp old_id
22
+ pp new_id = options.dig(:super, :new)
23
+
24
+ unless old_sup = people.person(id: old_id, external_id: old_id, email: old_id)
25
+ session.logger.error("Couldn't find any user with that id: '#{old_id}'. Aborting...")
26
+ exit
27
+ end
28
+
29
+ unless new_sup = people.person(id: new_id, external_id: new_id, email: new_id)
30
+ session.logger.error("Couldn't find any user with that id: '#{new_id}'. Aborting...")
31
+ exit
32
+ end
33
+
34
+ people = people.supervisor_id(old_sup.id)
35
+ unless people.length > 0
36
+ session.logger.error("There are no people with supervisor #{old_sup.external_id} (#{old_sup.name} - #{old_sup.email}). Aborting...")
37
+ exit
38
+ end
39
+
40
+ session.logger.info("Going to change supervisor '#{old_sup.name}' (#{old_sup.external_id}) to '#{new_sup.name}' (#{new_sup.external_id})")
41
+
42
+ # create batch queue
43
+ supers = session.job_group("main").new("update", type: :update, sets: :core)
44
+
45
+ people.each.with_index do |person, i|
46
+ person.supervisor_id = new_sup.id
47
+ supers.add(person)
48
+ end
49
+
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
data/lib/eco/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eco
2
- VERSION = "0.6.3"
2
+ VERSION = "0.6.4"
3
3
  end
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: 0.6.3
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
@@ -30,6 +30,46 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: '3.8'
33
+ - !ruby/object:Gem::Dependency
34
+ name: yard
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.9'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.9.18
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.9'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.9.18
53
+ - !ruby/object:Gem::Dependency
54
+ name: redcarpet
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '3.4'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 3.4.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.4'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 3.4.0
33
73
  - !ruby/object:Gem::Dependency
34
74
  name: ecoportal-api
35
75
  requirement: !ruby/object:Gem::Requirement
@@ -210,16 +250,13 @@ files:
210
250
  - lib/eco/api/common/version_patches/external_person.rb
211
251
  - lib/eco/api/eco_faker.rb
212
252
  - lib/eco/api/organization.rb
213
- - lib/eco/api/organization/account.rb
214
253
  - lib/eco/api/organization/people.rb
215
254
  - lib/eco/api/organization/policy_groups.rb
216
255
  - lib/eco/api/organization/preferences.rb
217
256
  - lib/eco/api/organization/preferences_reference.json
218
257
  - lib/eco/api/organization/presets.rb
219
- - lib/eco/api/organization/presets_backup.rb
220
258
  - lib/eco/api/organization/presets_values.json
221
259
  - lib/eco/api/organization/tag_tree.rb
222
- - lib/eco/api/organization_old.rb
223
260
  - lib/eco/api/session.rb
224
261
  - lib/eco/api/session/batch.rb
225
262
  - lib/eco/api/session/batch_job.rb
@@ -254,6 +291,7 @@ files:
254
291
  - lib/eco/api/usecases/default_cases/reset_landing_page_case.rb
255
292
  - lib/eco/api/usecases/default_cases/set_default_tag_case.rb
256
293
  - lib/eco/api/usecases/default_cases/set_supervisor_case.rb
294
+ - lib/eco/api/usecases/default_cases/switch_supervisor_case.rb
257
295
  - lib/eco/api/usecases/default_cases/to_csv_case.rb
258
296
  - lib/eco/api/usecases/default_cases/update_details_case.rb
259
297
  - lib/eco/api/usecases/default_cases/upsert_account_case.rb
@@ -1,23 +0,0 @@
1
- module Eco
2
- module API
3
- module Account
4
- class Account
5
-
6
- attr_accessor :policy_group_ids, :filter_tags
7
- attr_accessor :permissions_preset, :permissions_custom
8
- attr_accessor :login_provider_ids
9
- attr_accessor :landing_page_id, :preferences, :starred_ids
10
- attr_reader :prefilter
11
- #attr_reader :presets
12
-
13
- def initialize(init = {})
14
- #@presets = AccountPresets.new
15
- end
16
- def set_details(person)
17
-
18
- end
19
- private
20
- end
21
- end
22
- end
23
- end
@@ -1,220 +0,0 @@
1
- module Eco
2
- module API
3
- module Account
4
-
5
- #TODO set rules, make Presets immutable, and init from config
6
- class PresetsFactory
7
- ABILITIES = File.join(__dir__, 'presets_values.json')
8
- DEFAULT_CUSTOM = 'presets_custom.json'
9
- DEFAULT_MAPS = 'presets_map.json'
10
-
11
- def initialize(init = {}, policy_groups: [])
12
- @abilities = JSON.load(File.open(ABILITIES))
13
-
14
- init_custom(init)
15
- init_maps(init)
16
-
17
- @policy_groups = policy_groups
18
- @policy_groups_by_id = policy_groups.map{ |pg| [pg.id, pg] }.to_h
19
- @policy_groups_by_name = policy_groups.map { |pg| [pg.name&.downcase, pg] }.to_h
20
- end
21
-
22
- def new(*policy_group_ids_or_names)
23
- names = policy_group_ids_or_names.map { |id_name| policy_group_name(id_name) }
24
- preset_names = names.map { |name| @presets_map.fetch(name, nil) }
25
- # validate
26
- compile(*preset_names)
27
- end
28
-
29
- private
30
-
31
- def policy_group_name(id_name)
32
- @policy_groups_by_id.fetch(id_name, nil)&.name&.downcase ||
33
- @policy_groups_by_name.fetch(id_name&.downcase, nil)&.name&.downcase
34
- end
35
-
36
- def init_custom(init = {})
37
- file = File.expand_path(init.fetch('presets_custom', DEFAULT_CUSTOM))
38
- @presets_custom = JSON.load(File.open(file))
39
- end
40
-
41
- def init_maps(init = {})
42
- file = File.expand_path(init.fetch('presets_map', DEFAULT_MAPS))
43
- @presets_map = JSON.load(File.open(file))
44
- end
45
-
46
- def compile(*preset_names)
47
- @presets_custom.values_at(*preset_names).reduce(empty_model) do |p1, p2|
48
- merge(p1, p2)
49
- end
50
- end
51
-
52
- def merge(preset1, preset2)
53
- @abilities.map do |key, values|
54
- idx = [
55
- values.index(preset1[key]),
56
- values.index(preset2[key])
57
- ].compact.max
58
- [key, idx && values[idx]]
59
- end.to_h
60
- end
61
-
62
- def empty_model
63
- JSON.parse(@abilities.to_json).transform_values {|v| nil }
64
- end
65
-
66
- end
67
-
68
- class Presets
69
- DEFAULT_PRESET = "basic"
70
- PRESETS_VALUES = File.join(__dir__, 'presets_values.json')
71
- PRESETS_REFERENCE = File.join(__dir__, 'presets_reference.json')
72
-
73
- attr_reader :default
74
- attr_reader :presets_model, :presets_values, :presets_reference
75
- attr_reader :native_presets, :featured_presets, :all_presets
76
- attr_reader :rules
77
- def initialize(init = {})
78
- init = {} if !init || !init.is_a?(Hash)
79
-
80
- @presets_values = JSON.load(File.open(PRESETS_VALUES))
81
- # get the index of each value of each ability (so we can compare for highest and lowest)
82
- @presets_values_hashed = JSON.parse(@presets_values.to_json) \
83
- .transform_values {|v| Hash[v.map.with_index.to_a] }
84
-
85
- @presets_model = self.empty_model
86
- @presets_reference = init.fetch('reference', JSON.load(File.open(PRESETS_REFERENCE)))
87
- @native_presets = ["read_only", "forms", "editor", "administrator", "custom"]
88
- @all_presets = @presets_reference.keys
89
- @featured_presets = @all_presets - @native_presets
90
- @default = init.fetch("default", DEFAULT_PRESET)
91
-
92
- self.set_rules(init.fetch('rules', nil))
93
- end
94
-
95
- def set_rules(rules)
96
- @rules = rules
97
- end
98
-
99
- def empty_model
100
- JSON.parse(@presets_values.to_json).transform_values {|v| nil }
101
- end
102
-
103
- def is_custom?(preset_name)
104
- return (!preset_name || preset_name == "custom")
105
- end
106
-
107
- def find_preset(preset)
108
- found = @all_presets.select { |ref|
109
- preset_ref = @presets_reference.fetch(ref, nil)
110
- presets_equal?(preset, preset_ref)
111
- }
112
- return found.switch()
113
- end
114
-
115
- # returns a new hash with presets defaulting to a preset profile
116
- def new_model(default = nil)
117
- presets_sample = @presets_reference.fetch(default, @presets_model)
118
- JSON.parse(presets_sample.to_json)
119
- end
120
-
121
- def default_model
122
- self.new_model(@default)
123
- end
124
-
125
- def get_models(presets_list = [])
126
- presets_list.map {|v| self.new_model(v) }
127
- end
128
-
129
- def presets_equal?(preset1, preset2)
130
- return false if !preset1 || !preset2
131
- all_keys = self.new_model.keys
132
- # "no access" can / should be nil; or not specified (notice that it is not so for updates)
133
- return !all_keys.empty? && all_keys.all? { |key| preset1.fetch(key, nil) == preset2.fetch(key, nil) }
134
- end
135
-
136
- # among a set of presets, it returns the presets doc
137
- # for each flag, it contains the highest (or lowest) of all the input presets
138
- # by giving at least the abilities of the preset min: to each flag
139
- # and / or the max: abilities one if specified
140
- def merge (presets, highest: true, min: nil, max: nil)
141
- max_preset_model = max ? self.new_model(max) : nil
142
- min = self.default if min == "default"
143
-
144
- return self.new_model(min).map do |k_flag, min_ability|
145
- levels = presets.map {|pre| ability_level(k_flag, pre[k_flag]) }
146
-
147
- min_lev = ability_level(k_flag, min_ability)
148
- max_lev = Float::INFINITY
149
- if max
150
- max_ability = max_preset_model.fetch(k_flag, nil)
151
- max_lev = ability_level(k_flag, max_ability)
152
- end
153
- if highest
154
- level = highest(levels, flag: k_flag, min: min_lev, max: max_lev)
155
- else
156
- level = lowest(levels, flag: k_flag, min: min_lev, max: max_lev)
157
- end
158
-
159
- [k_flag, level_ability(k_flag, level)]
160
- end.to_h
161
- end
162
-
163
- def self.test(num = 2, min: "random", max: "random")
164
- account_presets = self.new
165
- all_presets = account_presets.all_presets
166
-
167
- num = rand(2..5) if num == "random"
168
- list_types = all_presets.sample(num)
169
-
170
- min = rand > 0.5 if min == "random"
171
- max = rand > 0.5 if max == "random"
172
-
173
- min = all_presets.sample(1).first if (!!min === min) && min
174
- max = all_presets.sample(1).first if (!!max === max) && max
175
-
176
- presets = account_presets.get_models(list_types)
177
-
178
- puts "min: #{min}; max: #{max}" if min || max
179
- puts "chosen presets: #{list_types}"
180
- puts "pre-merge models: #{presets}"
181
- pp account_presets.merge(presets) unless min || max
182
- pp account_presets.merge(presets, min: min, max: max) if min && max
183
- pp account_presets.merge(presets, min: min) if min && !max
184
- pp account_presets.merge(presets, max: max) if !min && max
185
- end
186
-
187
- private
188
-
189
- # given an array list of values for a flag
190
- # it returns the highest of all the abilities
191
- def highest(list, flag:, min: 0, max: Float::INFINITY)
192
- m = (list + [min]).max
193
- return (max < m)? max : m
194
- end
195
-
196
- # it returns the highest of all the values
197
- def lowest(list, flag:, min: 0, max: Float::INFINITY)
198
- m = (list + [max]).min
199
- return (min > m)? min : m if min
200
- return m
201
- end
202
-
203
- # given an ability of a flag
204
- # it returns the level of that flag
205
- def ability_level(flag, ability)
206
- return 0 unless ability
207
- return @presets_values_hashed.dig(flag, ability)
208
- end
209
-
210
- # given a level of one flag
211
- # it returns the ability of that flag
212
- def level_ability(flag, level)
213
- return nil unless level && level > 0
214
- return @presets_values[flag][level]
215
- end
216
-
217
- end
218
- end
219
- end
220
- end
@@ -1,73 +0,0 @@
1
- module Eco
2
- module API
3
- #TODO move as part of API::Session and inherit from < API::Common::Session::BaseModel
4
- #TODO boost autoconfiguration (via file <- FileManager.dir)
5
- class Organization
6
-
7
- DUMMY_USER_EXTERNAL_ID = 'dummy'
8
-
9
- attr_reader :tag_tree, :policy_groups, :person_schemas
10
- attr_reader :default_person, :default_schema, :default_schema_id
11
- attr_reader :default_policy_group_ids, :default_filter_tags, :default_login_provider_ids
12
- attr_reader :login_providers
13
- attr_reader :account_presets, :account_preferences
14
-
15
- def initialize(init = {})
16
- api = init.fetch('api', nil)
17
- @@api = api&.instance_of?(Ecoportal::API::Internal) && api
18
- # todo: maps { 'policy_group' : 'preset'}
19
- set_settings(init, override: true)
20
- end
21
-
22
- def set_settings(init = {}, override: false)
23
- set_defaults(init)
24
- @login_providers = init['login_providers'] || @@api&.login_providers&.to_a || \
25
- @login_providers || [] if (!@login_providers || :override)
26
- @tag_tree = init['tag_tree'] || @default_filter_tags || @tag_tree || [] if (!@tag_tree || :override)
27
- @policy_groups = init['policy_groups'] || @@api&.policy_groups&.to_a || \
28
- @policy_groups || [] if (!@policy_groups || :override)
29
-
30
- @person_schemas = init['person_schemas'] || @@api&.person_schemas&.to_a || @person_schemas || \
31
- [@default_schema] || [] if (!@person_schemas || :override)
32
- end
33
-
34
- def default_schema=(value)
35
- @default_schema = value || @person_schemas&.first
36
- self.default_schema_id = @default_schema&.id || @default_schema&.schema_id || @default_schema_id
37
- end
38
-
39
- def default_schema_id=(value)
40
- @default_schema_id = value
41
- end
42
-
43
- private
44
-
45
- def set_defaults(init = {})
46
- @account_presets = Account::Presets.new(init.fetch('presets', nil))
47
- @account_preferences = Account::Preferences.new
48
-
49
- @default_person = get_default_person(init)
50
- @default_policy_group_ids = init['default_policy_group_ids'] || @default_person&.account&.policy_group_ids || []
51
- @default_filter_tags = init['default_filter_tags'] || @default_person&.account&.filter_tags || []
52
- @default_login_provider_ids = init['default_login_provider_ids'] || @default_person&.account&.login_provider_ids || []
53
- default_schema = get_schema_from_person(@default_person)
54
- self.default_schema = init['default_schema'] || default_schema
55
- end
56
-
57
- def get_default_person(init = {})
58
- return nil if !@@api
59
- return init.fetch('default_person', (@@api && @@api.people.get(DUMMY_USER_EXTERNAL_ID)).result || nil)
60
- end
61
-
62
- def get_schema_from_person(person)
63
- return nil if !person
64
- doc = person.details.doc
65
- doc['id'] = doc['schema_id']
66
- doc.delete('schema_id')
67
- schema = Ecoportal::API::Internal::PersonSchema.new(doc)
68
- return schema
69
- end
70
-
71
- end
72
- end
73
- end