eco-helpers 2.0.16 → 2.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -6
  3. data/eco-helpers.gemspec +6 -4
  4. data/lib/eco-helpers.rb +1 -0
  5. data/lib/eco/api/common/base_loader.rb +14 -0
  6. data/lib/eco/api/common/people/default_parsers/date_parser.rb +11 -1
  7. data/lib/eco/api/common/people/default_parsers/login_providers_parser.rb +1 -1
  8. data/lib/eco/api/common/people/default_parsers/policy_groups_parser.rb +11 -11
  9. data/lib/eco/api/common/people/person_entry.rb +4 -2
  10. data/lib/eco/api/common/session/mailer.rb +0 -1
  11. data/lib/eco/api/common/session/s3_uploader.rb +0 -1
  12. data/lib/eco/api/common/session/sftp.rb +0 -1
  13. data/lib/eco/api/microcases.rb +3 -1
  14. data/lib/eco/api/microcases/append_usergroups.rb +0 -1
  15. data/lib/eco/api/microcases/people_cache.rb +2 -2
  16. data/lib/eco/api/microcases/people_load.rb +2 -2
  17. data/lib/eco/api/microcases/people_refresh.rb +2 -2
  18. data/lib/eco/api/microcases/people_search.rb +6 -6
  19. data/lib/eco/api/microcases/preserve_default_tag.rb +23 -0
  20. data/lib/eco/api/microcases/preserve_filter_tags.rb +28 -0
  21. data/lib/eco/api/microcases/preserve_policy_groups.rb +30 -0
  22. data/lib/eco/api/microcases/set_account.rb +0 -1
  23. data/lib/eco/api/organization.rb +1 -0
  24. data/lib/eco/api/organization/people.rb +7 -0
  25. data/lib/eco/api/organization/people_analytics.rb +60 -0
  26. data/lib/eco/api/organization/presets_factory.rb +22 -83
  27. data/lib/eco/api/organization/presets_integrity.json +6 -0
  28. data/lib/eco/api/organization/presets_values.json +5 -4
  29. data/lib/eco/api/policies/default_policies/99_user_access_policy.rb +0 -30
  30. data/lib/eco/api/session.rb +1 -20
  31. data/lib/eco/api/session/batch.rb +23 -7
  32. data/lib/eco/api/session/config.rb +0 -10
  33. data/lib/eco/api/session/config/people.rb +1 -17
  34. data/lib/eco/api/usecases/default_cases.rb +1 -1
  35. data/lib/eco/api/usecases/default_cases/abstract_policygroup_abilities_case.rb +1 -1
  36. data/lib/eco/api/usecases/default_cases/analyse_people_case.rb +76 -0
  37. data/lib/eco/api/usecases/default_cases/codes_to_tags_case.rb +2 -3
  38. data/lib/eco/api/usecases/default_cases/reset_landing_page_case.rb +11 -1
  39. data/lib/eco/api/usecases/default_cases/restore_db_case.rb +1 -2
  40. data/lib/eco/api/usecases/default_cases/supers_cyclic_identify_case.rb +1 -1
  41. data/lib/eco/api/usecases/default_cases/supers_hierarchy_case.rb +1 -1
  42. data/lib/eco/api/usecases/default_cases/to_csv_case.rb +85 -27
  43. data/lib/eco/api/usecases/default_cases/to_csv_detailed_case.rb +62 -36
  44. data/lib/eco/cli/config/default/options.rb +19 -17
  45. data/lib/eco/cli/config/default/people_filters.rb +3 -3
  46. data/lib/eco/cli/config/default/usecases.rb +66 -32
  47. data/lib/eco/cli/config/default/workflow.rb +1 -1
  48. data/lib/eco/cli/config/help.rb +1 -0
  49. data/lib/eco/cli/config/options_set.rb +106 -13
  50. data/lib/eco/cli/config/use_cases.rb +33 -33
  51. data/lib/eco/cli/scripting/args_helpers.rb +30 -3
  52. data/lib/eco/data.rb +1 -0
  53. data/lib/eco/data/crypto/encryption.rb +3 -3
  54. data/lib/eco/data/files/helpers.rb +6 -4
  55. data/lib/eco/data/fuzzy_match.rb +119 -0
  56. data/lib/eco/data/fuzzy_match/array_helpers.rb +75 -0
  57. data/lib/eco/data/fuzzy_match/chars_position_score.rb +37 -0
  58. data/lib/eco/data/fuzzy_match/ngrams_score.rb +73 -0
  59. data/lib/eco/data/fuzzy_match/pairing.rb +102 -0
  60. data/lib/eco/data/fuzzy_match/result.rb +67 -0
  61. data/lib/eco/data/fuzzy_match/results.rb +53 -0
  62. data/lib/eco/data/fuzzy_match/score.rb +44 -0
  63. data/lib/eco/data/fuzzy_match/stop_words.rb +35 -0
  64. data/lib/eco/data/fuzzy_match/string_helpers.rb +69 -0
  65. data/lib/eco/version.rb +1 -1
  66. metadata +82 -10
  67. data/lib/eco/api/microcases/refresh_abilities.rb +0 -19
  68. data/lib/eco/api/organization/presets_reference.json +0 -59
  69. data/lib/eco/api/usecases/default_cases/refresh_abilities_case.rb +0 -30
@@ -10,6 +10,7 @@ module Eco
10
10
  end
11
11
 
12
12
  require_relative 'default_cases/abstract_policygroup_abilities_case.rb'
13
+ require_relative 'default_cases/analyse_people_case'
13
14
  require_relative 'default_cases/append_usergroups_case'
14
15
  require_relative 'default_cases/change_email_case'
15
16
  require_relative 'default_cases/codes_to_tags_case'
@@ -23,7 +24,6 @@ require_relative 'default_cases/hris_case'
23
24
  require_relative 'default_cases/new_id_case'
24
25
  require_relative 'default_cases/new_email_case'
25
26
  require_relative 'default_cases/org_data_convert_case'
26
- require_relative 'default_cases/refresh_abilities_case'
27
27
  require_relative 'default_cases/refresh_case'
28
28
  require_relative 'default_cases/reinvite_trans_case'
29
29
  require_relative 'default_cases/reinvite_sync_case'
@@ -5,10 +5,10 @@ class Eco::API::UseCases::DefaultCases::AbstractPolicyGroupAbilities < Eco::API:
5
5
  attr_reader :session, :people, :options
6
6
 
7
7
  def main(people, session, options, usecase)
8
+ options[:end_get] = false
8
9
  @session = session; @options = options; @people = people
9
10
 
10
11
  generate_csv!
11
- exit(0)
12
12
  end
13
13
 
14
14
  private
@@ -0,0 +1,76 @@
1
+ class Eco::API::UseCases::DefaultCases::AnalysePeople < Eco::API::Common::Loaders::UseCase
2
+ name "analyse-people"
3
+ type :export
4
+
5
+ attr_reader :session, :people, :options
6
+
7
+ def main(people, session, options, usecase)
8
+ @session = session; @options = options; @people = people
9
+
10
+ save!(cyclic_sets)
11
+ end
12
+
13
+ private
14
+
15
+ def identify_double_ups
16
+ analytics.similarity
17
+
18
+ end
19
+
20
+ def analytics
21
+ @analytics ||= people.analytics
22
+ end
23
+
24
+ def file
25
+ @file ||= options.dig(:output, :file) || "analytics.txt"
26
+ end
27
+
28
+ def save!(data)
29
+ if data.empty?
30
+ session.logger.info("There were no cyclic supervisors identified!!")
31
+ return
32
+ end
33
+
34
+ ext = File.extname(file).downcase.delete(".")
35
+
36
+ File.open(file, "w") do |fd|
37
+ if ext == "txt"
38
+ create_file(data, file: file, format: :txt)
39
+ elsif ext == "html"
40
+ puts "html is still not supported"
41
+ exit(1)
42
+ create_file(data, file: file, format: :html)
43
+ elsif ext == "json"
44
+ puts "json is still not supported"
45
+ exit(1)
46
+ create_file(data, file: file, format: :json)
47
+ end
48
+ end
49
+ end
50
+
51
+ def create_file(sets, file:, format: :txt)
52
+ File.open(file, "w") do |fd|
53
+ fd << sets_to_str(sets, format: format)
54
+ end
55
+ puts "Generated file #{file}"
56
+ end
57
+
58
+ def sets_to_str(sets, format: :txt)
59
+ raise "Required Array. Given: #{sets.class}" unless sets.is_a?(Array)
60
+ "".tap do |str|
61
+ sets.each do |set|
62
+ str << set_to_str(set, format: format)
63
+ end
64
+ end
65
+ end
66
+
67
+ def set_to_str(set, lev: 0, format: :txt)
68
+ raise "Required Array. Given: #{set.class}" unless set.is_a?(Array)
69
+ "".tap do |str|
70
+ entry = set.shift
71
+ str << "#{" " * lev}#{(lev > 0)? "+-#{lev}- " : ""}#{entry.name} (#{entry.external_id}|#{entry.email}|#{entry.id})\n"
72
+ str << set_to_str(set, lev: lev + 1, format: format) unless !set || set.empty?
73
+ end
74
+ end
75
+
76
+ end
@@ -16,10 +16,9 @@ class Eco::API::UseCases::DefaultCases::CodesToTagsCase < Eco::API::Common::Load
16
16
  end
17
17
 
18
18
  def main(session, options, usecase)
19
- @session = session
20
- @options = options
19
+ options[:end_get] = false
20
+ @session = session; @options = options
21
21
  codes_to_tags
22
- exit
23
22
  end
24
23
 
25
24
  private
@@ -2,13 +2,23 @@ class Eco::API::UseCases::DefaultCases::ResetLandingPageCase < Eco::API::Common:
2
2
  name "reset-landing-page"
3
3
  type :transform
4
4
 
5
+ attr_reader :session, :options
6
+
5
7
  def main(people, session, options, usecase)
8
+ @session = session; @options = options
6
9
  update = session.new_job("main", "update", :update, usecase, :core)
7
10
 
8
11
  people.users.each do |user|
9
- user.account.landing_page_id = nil
12
+ user.account.landing_page_id = page_id
10
13
  update.add(user)
11
14
  end
12
15
  end
13
16
 
17
+ private
18
+
19
+ def page_id
20
+ options[:page_id]
21
+ end
22
+
23
+
14
24
  end
@@ -59,7 +59,6 @@ class Eco::API::UseCases::DefaultCases::RestoreDBCase < Eco::API::Common::Loader
59
59
  dst.policy_group_ids = src.policy_group_ids unless options.dig(:exclude, :policy_groups)
60
60
 
61
61
  unless options.dig(:exclude, :abilities)
62
- dst.permissions_preset = src.permissions_preset
63
62
  dst.permissions_custom = src.permissions_custom
64
63
  end
65
64
 
@@ -75,7 +74,7 @@ class Eco::API::UseCases::DefaultCases::RestoreDBCase < Eco::API::Common::Loader
75
74
  dst.starred_ids = src.starred_ids
76
75
  dst.landing_page_id = src.landing_page_id
77
76
  end
78
-
77
+
79
78
  dst&.send_invites = options[:send_invites] if options.key?(:send_invites)
80
79
  end
81
80
  end
@@ -5,10 +5,10 @@ class Eco::API::UseCases::DefaultCases::SupersCyclicIdentify < Eco::API::Common:
5
5
  attr_reader :session, :people, :options
6
6
 
7
7
  def main(people, session, options, usecase)
8
+ options[:end_get] = false
8
9
  @session = session; @options = options; @people = people
9
10
 
10
11
  save!(cyclic_sets)
11
- exit(0)
12
12
  end
13
13
 
14
14
  private
@@ -5,10 +5,10 @@ class Eco::API::UseCases::DefaultCases::SupersHierarchy < Eco::API::Common::Load
5
5
  attr_reader :session, :people, :options
6
6
 
7
7
  def main(people, session, options, usecase)
8
+ options[:end_get] = false
8
9
  @session = session; @options = options; @people = people
9
10
 
10
11
  save!(hierarchy)
11
- exit(0)
12
12
  end
13
13
 
14
14
  private
@@ -5,6 +5,7 @@ class Eco::API::UseCases::DefaultCases::ToCsvCase < Eco::API::Common::Loaders::U
5
5
  attr_reader :session, :options, :people
6
6
 
7
7
  def main(people, session, options, usecase)
8
+ options[:end_get] = false
8
9
  @session = session; @options = options; @people = people
9
10
 
10
11
  unless people && !people.empty?
@@ -12,25 +13,94 @@ class Eco::API::UseCases::DefaultCases::ToCsvCase < Eco::API::Common::Loaders::U
12
13
  return false
13
14
  end
14
15
 
15
- unless file = options[:file] || options.dig(:export, :file, :name)
16
- session.logger.error("Destination file not specified")
17
- return false
18
- end
19
-
20
16
  session.logger.info("going to create file: #{file}")
17
+ header = spot_header
21
18
 
22
19
  CSV.open(file, "w") do |csv|
23
- csv << spot_header
20
+ csv << header
24
21
  people.each do |person|
25
- csv << target_entry_type(person).values
22
+ csv << to_row(person)
26
23
  end
27
24
  end
28
- exit(0)
29
25
  end
30
26
 
31
27
  private
32
28
 
33
- def target_entry_type(person)
29
+ def to_row(person)
30
+ entry = to_entry_type(person)
31
+ entry.values_at(*keys(entry))
32
+ end
33
+
34
+ def spot_header
35
+ header = keys(to_entry_type(people.first))
36
+ header = yield(header) if block_given?
37
+ header = nice_header_names(header) if nice_header_names?
38
+ header
39
+ end
40
+
41
+ def keys(entry)
42
+ entry.keys - ["freemium", "send_invites"]
43
+ end
44
+
45
+ def nice_header_names?
46
+ options.dig(:nice_header) || options.dig(:export, :options, :nice_header)
47
+ end
48
+
49
+ def nice_header_names(header)
50
+ name_maps = session.schema.fields_by_alt_id.each_with_object({}) do |(alt_id, fld), mappings|
51
+ mappings[alt_id] = fld.name
52
+ end.merge({
53
+ "policy_group_ids" => "User Group(s)",
54
+ "email" => "Email",
55
+ "name" => "Name",
56
+ "supervisor_id" => "Manager ID",
57
+ "filter_tags" => "Locations",
58
+ "default_tag" => "Default Location",
59
+ "id" => "ecoPortal ID",
60
+ "external_id" => "Reference ID (ext_id)",
61
+ "login_provider_ids" => "Login Methods",
62
+ "landing_page_id" => "Landing Page ID",
63
+ "show_sidebar" => "(pref) Sidebar Open?",
64
+ "show_shortcuts" => "(pref) Link to Registers?",
65
+ "show_coming_soon" => "(pref) Coming Soon List?",
66
+ "show_recently_visited_forms" => "(pref) Recently Visited Forms List?",
67
+ "show_tasks" => "(pref) Tasks List?",
68
+ "show_task_bubbles" => "(pref) Task Count Bubbles",
69
+ "kiosk_enabled" => "Kiosk User?",
70
+ "freemium" => "Freemium User?",
71
+ "files" => "(able) on Files",
72
+ "reports" => "(able) on Report Structures",
73
+ "data" => "(able) on Data (hours, datasets)",
74
+ "organization" => "(able) on Organization Config",
75
+ "pages" => "(able) on Page/Entries",
76
+ "page_editor" => "(able) page Editor Level",
77
+ "registers" => "(able) on Registers",
78
+ "tasks" => "(able) on Tasks",
79
+ "person_core" => "(able) on People",
80
+ "person_core_create" => "(able) Create People?",
81
+ "person_core_edit" => "(able) Edit People?",
82
+ "person_details" => "(able) on People Schema Details",
83
+ "person_account" => "(able) on Users",
84
+ "person_abilities" => "(able) on Users' Abilities",
85
+ "custom_files" => "(min) on Files",
86
+ "custom_reports" => "(min) on Report Structures",
87
+ "custom_data" => "(min) on Data (hours, datasets)",
88
+ "custom_organization" => "(min) on Organization Config",
89
+ "custom_pages" => "(min) on Page/Entries",
90
+ "custom_page_editor" => "(min) page Editor Level",
91
+ "custom_registers" => "(min) on Registers",
92
+ "custom_tasks" => "(min) on Tasks",
93
+ "custom_person_core" => "(min) on People",
94
+ "custom_person_core_create" => "(min) Create People?",
95
+ "custom_person_core_edit" => "(min) Edit People?",
96
+ "custom_person_details" => "(min) on People Schema Details",
97
+ "custom_person_account" => "(min) on Users",
98
+ "custom_person_abilities" => "(min) on Users' Abilities"
99
+ })
100
+ header.map {|name| name_maps[name] ? name_maps[name] : name}
101
+ end
102
+
103
+ def to_entry_type(person)
34
104
  session.new_entry(person, dependencies: deps).yield_self do |person_entry|
35
105
  options.dig(:export, :options, :internal_names) ? person_entry.mapped_entry : person_entry.external_entry
36
106
  end
@@ -40,25 +110,13 @@ class Eco::API::UseCases::DefaultCases::ToCsvCase < Eco::API::Common::Loaders::U
40
110
  @deps ||= {"supervisor_id" => {people: people}}
41
111
  end
42
112
 
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}
113
+ def file
114
+ @file ||= (options[:file] || options.dig(:export, :file, :name)).tap do |filename|
115
+ unless filename
116
+ session.logger.error("Destination file not specified")
117
+ return false
118
+ end
60
119
  end
61
- header
62
120
  end
63
121
 
64
122
 
@@ -1,53 +1,79 @@
1
- class Eco::API::UseCases::DefaultCases::ToCsvDetailedCase < Eco::API::Common::Loaders::UseCase
1
+ class Eco::API::UseCases::DefaultCases::ToCsvDetailedCase < Eco::API::UseCases::DefaultCases::ToCsvCase
2
2
  name "to-csv-detailed"
3
3
  type :export
4
4
 
5
- def main(people, session, options, usecase)
6
- unless people && !people.empty?
7
- session.logger.warn("No source people to create the file... aborting!")
8
- return false
9
- end
5
+ private
6
+
7
+ def to_row(person)
8
+ entry = to_entry_type(person)
9
+ data = entry.values_at(*keys(entry))
10
+ data << person.subordinates
11
+ data << person_supervisor(person)
12
+ data += user_abilities(person)
13
+ data += user_permissions_custom(person) if options.dig(:export, :options, :permissions_custom)
14
+ account = person.account
15
+ data << account&.landing_page_id
16
+ data += user_preferences(person)
17
+ data
18
+ end
10
19
 
11
- unless file = options[:file] || options.dig(:export, :file, :name)
12
- session.logger.error("Destination file not specified")
13
- return false
20
+ def person_supervisor(person)
21
+ session.micro.with_supervisor(person.supervisor_id, people) do |supervisor|
22
+ return supervisor ? supervisor.name : ""
14
23
  end
24
+ end
15
25
 
16
- login_providers = session.login_providers
17
- abilities = session.presets_factory.keys
26
+ def user_abilities(person)
27
+ account_abilities = (person.account && person.account.permissions_merged) || {}
28
+ abilities.map {|key| account_abilities[key] || "no access"}
29
+ end
18
30
 
19
- session.logger.info("going to create file: #{file}")
20
- CSV.open(file, "w") do |csv|
21
- deps = {"supervisor_id" => {people: people}}
31
+ def user_permissions_custom(person)
32
+ account_abilities = (person.account && person.account.permissions_custom) || {}
33
+ abilities.map {|key| account_abilities[key] || "no access"}
34
+ end
22
35
 
23
- person_model = people.first
24
- person_entry = session.new_entry(person_model, dependencies: deps)
25
- header = person_entry.external_entry.keys
26
- header += ["Subordinates"]
27
- header += ["Supervisor Name"]
28
- header += abilities
29
- header += ["Landing Page"]
36
+ def user_preferences(person)
37
+ user_preferences = (person.account && person.account.preferences&.doc) || {}
38
+ preferences.map {|key| user_preferences[key] || false}
39
+ end
30
40
 
31
- csv << header
32
- people.each do |person|
33
- data = session.new_entry(person, dependencies: deps).external_entry.values
41
+ def spot_header
42
+ super do |header|
43
+ header << "Subordinates"
44
+ header << "Supervisor Name"
45
+ header += abilities_header
46
+ header += abilities_header("custom") if options.dig(:export, :options, :permissions_custom)
47
+ header << "Landing Page"
48
+ header += preferences
49
+ header
50
+ end
51
+ end
34
52
 
35
- data.push(person.subordinates)
36
- session.micro.with_supervisor(person.supervisor_id, people) do |supervisor|
37
- data.push supervisor ? supervisor.name : ""
38
- end
53
+ def keys(entry)
54
+ super(entry) + ["freemium"]
55
+ end
39
56
 
40
- person_abilities = (person.account && person.account.permissions_custom) || {}
41
- data += abilities.map {|key| person_abilities[key] || "no access"}
57
+ def login_providers
58
+ session.login_providers
59
+ end
42
60
 
43
- if person.account && landing_id = person.account.landing_page_id
44
- data.push(landing_id)
45
- end
61
+ def abilities
62
+ @abilities ||= session.presets_factory.keys
63
+ end
46
64
 
47
- csv << data
48
- end
65
+ def abilities_header(prefix = nil)
66
+ abilities.map do |key|
67
+ prefix ? "#{prefix}_#{key}" : key
49
68
  end
50
- exit(0)
69
+ end
70
+
71
+ def preferences
72
+ @preferences ||= [
73
+ "show_sidebar", "show_shortcuts", "show_coming_soon", "show_recently_visited_forms",
74
+ "show_tasks", "show_task_bubbles",
75
+ "kiosk_enabled"
76
+ ]
51
77
  end
52
78
 
53
79
  end