demographic 0.8.6.RKM.89602.beta.0
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +479 -0
- data/Rakefile +22 -0
- data/app/controllers/demographic/application_controller.rb +87 -0
- data/app/controllers/demographic/custom_parameter_values_controller.rb +25 -0
- data/app/controllers/demographic/optionals_bulk_controller.rb +33 -0
- data/app/controllers/demographic/optionals_controller.rb +68 -0
- data/app/controllers/demographic/optionals_types_controller.rb +17 -0
- data/app/controllers/demographic/user_optionals_controller.rb +12 -0
- data/app/jobs/demographic/application_job.rb +4 -0
- data/app/mailers/demographic/application_mailer.rb +6 -0
- data/app/serializers/demographic/optionals/filter_list_serializer.rb +34 -0
- data/app/serializers/demographic/optionals/list_serializer.rb +17 -0
- data/app/serializers/demographic/optionals/optional_serializer.rb +20 -0
- data/app/serializers/demographic/optionals/value_serializer.rb +5 -0
- data/app/services/demographic/custom_parameter_values/index.rb +53 -0
- data/app/services/demographic/helpers/association_localizer.rb +13 -0
- data/app/services/demographic/helpers/import/bulk/build_optionals.rb +54 -0
- data/app/services/demographic/helpers/import/bulk/create_optional_values.rb +32 -0
- data/app/services/demographic/helpers/import/bulk/create_or_update_user_optionals.rb +110 -0
- data/app/services/demographic/helpers/import/create_optionals_list.rb +60 -0
- data/app/services/demographic/helpers/import/create_or_update_custom_parameter_values.rb +97 -0
- data/app/services/demographic/helpers/import/create_or_update_user_values.rb +161 -0
- data/app/services/demographic/helpers/import/create_or_update_values.rb +124 -0
- data/app/services/demographic/optional_values/create_list.rb +61 -0
- data/app/services/demographic/optional_values/update_list.rb +85 -0
- data/app/services/demographic/optionals/bulk_create.rb +115 -0
- data/app/services/demographic/optionals/bulk_create_validations.rb +122 -0
- data/app/services/demographic/optionals/create.rb +90 -0
- data/app/services/demographic/optionals/list.rb +51 -0
- data/app/services/demographic/optionals/optional_values.rb +52 -0
- data/app/services/demographic/optionals/update.rb +100 -0
- data/app/services/demographic/parse/data_serializer.rb +87 -0
- data/app/services/demographic/parse/types/values.rb +99 -0
- data/app/services/demographic/user_optionals/list.rb +60 -0
- data/app/services/import/templates/create_optionals.rb +26 -0
- data/app/services/import/templates/xlsx.rb +44 -0
- data/config/initializers/custom_classes/string.rb +11 -0
- data/config/routes.rb +38 -0
- data/db/migrate/20201207181535_create_demographic_optionals.rb +18 -0
- data/db/migrate/20201207184210_create_users.rb +12 -0
- data/db/migrate/20201211204926_create_demographic_demographic_optional_values.rb +15 -0
- data/db/migrate/20201215193056_create_demographic_user_optional_values.rb +11 -0
- data/db/migrate/20220427163444_add_token_to_optionals.rb +6 -0
- data/db/migrate/20220427163507_add_token_to_optional_values.rb +6 -0
- data/lib/demographic/engine.rb +17 -0
- data/lib/demographic/version.rb +5 -0
- data/lib/demographic.rb +78 -0
- data/lib/generators/init/USAGE +8 -0
- data/lib/generators/init/init_generator.rb +11 -0
- data/lib/generators/init/templates/init_demographic.rb +14 -0
- data/lib/generators/init/templates/policy_demographic.rb +70 -0
- data/lib/generators/init_manual_update/USAGE +8 -0
- data/lib/generators/init_manual_update/init_manual_update_generator.rb +12 -0
- data/lib/generators/init_manual_update/templates/20220427163444_add_token_to_optionals.rb +6 -0
- data/lib/generators/init_manual_update/templates/20220427163507_add_token_to_optional_values.rb +6 -0
- data/lib/generators/init_manual_update/templates/demographic_update_tokens.rake +13 -0
- data/lib/generators/init_manual_update/templates/demographic_update_tokens_by_tenants.rake +24 -0
- data/lib/generators/init_manual_update_v2/init_manual_update_generator.rb +10 -0
- data/lib/generators/init_manual_update_v2/templates/20240206120304_create_custom_parameter_values.rb +10 -0
- data/lib/generators/init_manual_update_v2/templates/custom_parameter_value.rb +5 -0
- data/lib/generators/init_model/USAGE +8 -0
- data/lib/generators/init_model/init_model_generator.rb +12 -0
- data/lib/generators/init_model/templates/optional.rb +5 -0
- data/lib/generators/init_model/templates/optional_value.rb +4 -0
- data/lib/generators/init_model/templates/user.rb +5 -0
- data/lib/generators/init_model/templates/user_optional.rb +5 -0
- data/lib/tasks/demographic_tasks.rake +4 -0
- metadata +346 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class CreateDemographicDemographicOptionalValues < ActiveRecord::Migration[6.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :optional_values do |t|
|
|
4
|
+
t.references :optional, null: false, index: true
|
|
5
|
+
t.string :slug, null: false
|
|
6
|
+
t.string :code, null: false
|
|
7
|
+
t.string :value
|
|
8
|
+
t.json :value_translate, default: {}
|
|
9
|
+
t.integer :order_num, default: 1
|
|
10
|
+
t.timestamps
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
add_index :optional_values, :code, :unique => true
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class CreateDemographicUserOptionalValues < ActiveRecord::Migration[6.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :user_optionals do |t|
|
|
4
|
+
t.references :optional, null: false, index: {:name => "index_user_optional_id"}
|
|
5
|
+
t.references :user, null: false, index: {:name => "index_optional_values_user_id"}
|
|
6
|
+
t.references :optional_value, index: {:name => "index_user_optional_value_id"}
|
|
7
|
+
t.string :value
|
|
8
|
+
t.timestamps
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Demographic
|
|
2
|
+
class Engine < ::Rails::Engine
|
|
3
|
+
isolate_namespace Demographic
|
|
4
|
+
config.generators.api_only = true
|
|
5
|
+
require 'kaminari'
|
|
6
|
+
require 'active_model_serializers'
|
|
7
|
+
require 'jwt'
|
|
8
|
+
require 'axlsx'
|
|
9
|
+
require 'roo'
|
|
10
|
+
|
|
11
|
+
config.generators do |g|
|
|
12
|
+
g.test_framework :rspec
|
|
13
|
+
g.fixture_replacement :factory_bot
|
|
14
|
+
g.factory_bot dir: 'spec/factories'
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/demographic.rb
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require "demographic/engine"
|
|
2
|
+
require 'active_support/dependencies'
|
|
3
|
+
|
|
4
|
+
module Demographic
|
|
5
|
+
class << self
|
|
6
|
+
attr_accessor :simple_inputs,
|
|
7
|
+
:multiples_inputs,
|
|
8
|
+
:parent_model,
|
|
9
|
+
:per_page,
|
|
10
|
+
:jwt_password
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Yield self on setup for nice config blocks
|
|
14
|
+
def self.setup(&block)
|
|
15
|
+
raise 'not block' unless block_given?
|
|
16
|
+
|
|
17
|
+
yield self
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.attributes
|
|
21
|
+
%w(parent_model simple_inputs multiples_inputs)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.generate_code(optional_id, value)
|
|
25
|
+
Digest::MD5.hexdigest("#{optional_id}-#{value.to_s.str_slug}")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.generate_token
|
|
29
|
+
Digest::SHA1.hexdigest([Time.now, rand].join)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.generate_token_md5(process_id:, code:, slug:)
|
|
33
|
+
Digest::MD5.hexdigest("#{process_id}-#{code}-#{slug}")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.reference(ctx)
|
|
37
|
+
adjustable_id = ctx.path.split('/').last
|
|
38
|
+
parent_model = current_model(ctx)
|
|
39
|
+
|
|
40
|
+
adjustable = parent_model.to_s.capitalize.classify.constantize.find_by(id: adjustable_id)
|
|
41
|
+
return adjustable if adjustable.present?
|
|
42
|
+
|
|
43
|
+
parent_model.to_s.capitalize.classify.constantize.find_by!(id: adjustable_id)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.current_model(ctx)
|
|
47
|
+
Demographic.parent_model[current_context(ctx)]
|
|
48
|
+
rescue StandardError
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def self.current_context(ctx)
|
|
52
|
+
ctx.path.split('/')[2].to_sym
|
|
53
|
+
rescue StandardError
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def self.parent_model
|
|
57
|
+
if @parent_model.is_a?(Proc)
|
|
58
|
+
@parent_model.call
|
|
59
|
+
else
|
|
60
|
+
@parent_model
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
def self.input_types_allowed
|
|
64
|
+
{
|
|
65
|
+
'num' => :number,
|
|
66
|
+
'numero' => :number,
|
|
67
|
+
'list' => :list,
|
|
68
|
+
'lista' => :list,
|
|
69
|
+
'date' => :date,
|
|
70
|
+
'fecha' => :date,
|
|
71
|
+
'bool' => :bool,
|
|
72
|
+
'boolean' => :bool,
|
|
73
|
+
'text' => :text,
|
|
74
|
+
'texto' => :text,
|
|
75
|
+
'radio' => :radio
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class InitGenerator < Rails::Generators::NamedBase
|
|
2
|
+
source_root File.expand_path('templates', __dir__)
|
|
3
|
+
|
|
4
|
+
desc 'Copy files init demographic'
|
|
5
|
+
|
|
6
|
+
def copy_initializer
|
|
7
|
+
copy_file 'init_demographic.rb', 'config/initializers/init_demographic.rb'
|
|
8
|
+
FileUtils.mkdir_p('app/middleware') unless File.directory?('app/middleware')
|
|
9
|
+
copy_file 'policy_demographic.rb', 'app/middleware/policy_demographic.rb'
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# configuracion basica para manejo de tipos
|
|
2
|
+
# serializer_fields_user = campos que desean serializar en la lista de usuarios
|
|
3
|
+
Demographic.setup do |config|
|
|
4
|
+
config.simple_inputs = %w(text date number boolean)
|
|
5
|
+
config.multiples_inputs = %w(checkbox radio list)
|
|
6
|
+
config.per_page = 10 # opcional por defecto es 10
|
|
7
|
+
config.parent_model = { engagement: :survey,
|
|
8
|
+
performance: :enterprise_process } # puedes agregar el modulo y el modelo que necesitas
|
|
9
|
+
config.jwt_password = ENV['JWT_PASSWORD']
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# este permite manajar cualquier configuracion que desee antes de ejecutar el evento en el controlador
|
|
13
|
+
# puedes manejar accesos y permisos tenant jwt, politicas etc, este es totalmente programable
|
|
14
|
+
# Rails.application.config.middleware.use PolicyDemographic
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'rack/request'
|
|
2
|
+
|
|
3
|
+
class PolicyDemographic
|
|
4
|
+
def initialize app
|
|
5
|
+
@app = app
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def call(env)
|
|
9
|
+
@request = Rack::Request.new(env)
|
|
10
|
+
policy_demographic { @app.call(env) }
|
|
11
|
+
# rescue JWT::DecodeError, JWT::ExpiredSignature, PolicyException => e
|
|
12
|
+
# [403, { 'Content-Type' => 'application/json' }, ["Forbidden! #{e.to_s}"]]
|
|
13
|
+
# rescue ActiveRecord::RecordNotFound => e
|
|
14
|
+
# [404, { 'Content-Type' => 'application/json' }, ["Not found! error: #{e.to_s}"]]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
# tienen tenant apartment agregar: require 'apartment/tenant'
|
|
20
|
+
# descomentar si usas tenant switch! y agregarlo en el metodo
|
|
21
|
+
def policy_demographic(&block)
|
|
22
|
+
return yield block if @request.path.match(/v1/).present?
|
|
23
|
+
return yield block if @request.path.match(/v2/).present?
|
|
24
|
+
return yield block if @request.path.eql?('/demographic/optionalTypes').present?
|
|
25
|
+
return yield block unless @request.path.match(/demographic/).present?
|
|
26
|
+
|
|
27
|
+
# ...
|
|
28
|
+
# switch!
|
|
29
|
+
# code
|
|
30
|
+
# ...
|
|
31
|
+
yield block
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# descomentar si usas tenant
|
|
35
|
+
# def switch!
|
|
36
|
+
# Apartment::Tenant.switch! enterprise.tenant.scheme
|
|
37
|
+
# end
|
|
38
|
+
|
|
39
|
+
# descomentar si usas tenant
|
|
40
|
+
# def enterprise
|
|
41
|
+
# Enterprise.find_by!(token: decode['enterprise']['token'])
|
|
42
|
+
# end
|
|
43
|
+
|
|
44
|
+
# Obtiene la instancia del objeto (survey, process, etc)
|
|
45
|
+
# def adjustable
|
|
46
|
+
# Demographic.reference(@request)
|
|
47
|
+
# end
|
|
48
|
+
|
|
49
|
+
# retorna a que modelo (:survey, :enterprise_process, etc)
|
|
50
|
+
# def current_model
|
|
51
|
+
# Demographic.current_model(@request)
|
|
52
|
+
# end
|
|
53
|
+
|
|
54
|
+
# retorna a que contexto o producto pertenece (:performance, :engagement, :talent)
|
|
55
|
+
# def current_context
|
|
56
|
+
# Demographic.current_context(@request)
|
|
57
|
+
# end
|
|
58
|
+
|
|
59
|
+
# def user
|
|
60
|
+
# User.find(decode['id'])
|
|
61
|
+
# end
|
|
62
|
+
|
|
63
|
+
# def decode
|
|
64
|
+
# token = @request.env["HTTP_AUTHORIZATION"].split(' ')[1]
|
|
65
|
+
# decode = JWT.decode(token, 'test123', true, { algorithm: 'HS256' })
|
|
66
|
+
# raise 'fordidden!' unless decode
|
|
67
|
+
|
|
68
|
+
# decode[0]
|
|
69
|
+
# end
|
|
70
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class InitManualUpdateGenerator < Rails::Generators::NamedBase
|
|
2
|
+
source_root File.expand_path('templates', __dir__)
|
|
3
|
+
|
|
4
|
+
desc 'Copy new migrations files'
|
|
5
|
+
|
|
6
|
+
def copy_models_initializer
|
|
7
|
+
copy_file '20220427163444_add_token_to_optionals.rb', 'db/migrate/20220427163444_add_token_to_optionals.rb'
|
|
8
|
+
copy_file '20220427163507_add_token_to_optional_values.rb', 'db/migrate/20220427163507_add_token_to_optional_values.rb'
|
|
9
|
+
copy_file 'demographic_update_tokens.rake', 'lib/tasks/demographic_update_tokens.rake'
|
|
10
|
+
copy_file 'demographic_update_tokens_by_tenants.rake', 'lib/tasks/demographic_update_tokens_by_tenants.rake'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
namespace :demographic do
|
|
2
|
+
desc "Will set token for optionals and optional values: rake demographic:update_tokens"
|
|
3
|
+
task :update_tokens => :environment do
|
|
4
|
+
ActiveRecord::Base.transaction do
|
|
5
|
+
Optional.all.where(token: nil).each { | optional|
|
|
6
|
+
optional.update({token: Demographic.generate_token})
|
|
7
|
+
}
|
|
8
|
+
OptionalValue.all.where(token: nil).each { | optional_value|
|
|
9
|
+
optional_value.update({token: Demographic.generate_token})
|
|
10
|
+
}
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
namespace :demographic do
|
|
2
|
+
desc "Will set token for optionals and optional values: rake demographic:update_tokens_by_tenants"
|
|
3
|
+
task :update_tokens_by_tenants => :environment do
|
|
4
|
+
Apartment::Tenant.switch!('public')
|
|
5
|
+
enterprise_tokens = Enterprise.all.pluck(:token)
|
|
6
|
+
enterprise_tokens.each do |token|
|
|
7
|
+
set_tenant(token)
|
|
8
|
+
ActiveRecord::Base.transaction do
|
|
9
|
+
Optional.all.where(token: nil).each { | optional|
|
|
10
|
+
optional.update({token: Demographic.generate_token})
|
|
11
|
+
}
|
|
12
|
+
OptionalValue.all.where(token: nil).each { | optional_value|
|
|
13
|
+
optional_value.update({token: Demographic.generate_token})
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def set_tenant(token)
|
|
21
|
+
Apartment::Tenant.switch!('public')
|
|
22
|
+
tenant = Tenant.find_by(token: token)
|
|
23
|
+
Apartment::Tenant.switch!(tenant.scheme)
|
|
24
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class InitManualUpdateV2Generator < Rails::Generators::NamedBase
|
|
2
|
+
source_root File.expand_path('templates', __dir__)
|
|
3
|
+
|
|
4
|
+
desc 'New model and migration for custom parameter values'
|
|
5
|
+
|
|
6
|
+
def copy_models_initializer
|
|
7
|
+
copy_file '20240206120304_create_custom_parameter_values.rb', 'db/migrate/20240206120304_create_custom_parameter_values.rb'
|
|
8
|
+
copy_file 'custom_parameter_value.rb', 'app/models/custom_parameter_value.rb'
|
|
9
|
+
end
|
|
10
|
+
end
|
data/lib/generators/init_manual_update_v2/templates/20240206120304_create_custom_parameter_values.rb
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
class CreateCustomParameterValues < ActiveRecord::Migration[6.0]
|
|
2
|
+
def change
|
|
3
|
+
create_table :custom_parameter_values do |t|
|
|
4
|
+
t.references :resourceable, polymorphic: true, index: { name: 'index_custom_parameter_values_on_resourceable' }
|
|
5
|
+
t.string :value
|
|
6
|
+
t.references :optional, foreign_key: true
|
|
7
|
+
t.timestamps
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
class InitModelGenerator < Rails::Generators::NamedBase
|
|
2
|
+
source_root File.expand_path('templates', __dir__)
|
|
3
|
+
|
|
4
|
+
desc 'Copy files models init demographic'
|
|
5
|
+
|
|
6
|
+
def copy_models_initializer
|
|
7
|
+
copy_file 'user.rb', 'app/models/user.rb'
|
|
8
|
+
copy_file 'optional.rb', 'app/models/optional.rb'
|
|
9
|
+
copy_file 'optional_value.rb', 'app/models/optional_value.rb'
|
|
10
|
+
copy_file 'user_optional.rb', 'app/models/user_optional.rb'
|
|
11
|
+
end
|
|
12
|
+
end
|