pg_rails 7.0.5 → 7.0.7

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.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -0
  3. data/pg_associable/lib/pg_associable/engine.rb +0 -4
  4. data/pg_associable/lib/pg_associable/simple_form_initializer.rb +2 -2
  5. data/pg_associable/spec/pg_associable/helpers_spec.rb +4 -3
  6. data/pg_engine/app/admin/accounts.rb +25 -0
  7. data/pg_engine/{lib/templates/activeadmin → app/admin}/audits.rb +3 -3
  8. data/pg_engine/app/admin/dashboard.rb +34 -0
  9. data/pg_engine/app/admin/user_accounts.rb +26 -0
  10. data/pg_engine/{lib/templates/activeadmin → app/admin}/users.rb +1 -2
  11. data/pg_engine/app/assets/javascripts/active_admin.js +1 -0
  12. data/pg_engine/app/assets/stylesheets/active_admin.scss +17 -0
  13. data/pg_engine/app/controllers/admin/accounts_controller.rb +33 -0
  14. data/pg_engine/app/controllers/admin/user_accounts_controller.rb +33 -0
  15. data/pg_engine/app/controllers/admin/users_controller.rb +47 -0
  16. data/pg_engine/app/controllers/pg_engine/resource_helper.rb +10 -5
  17. data/pg_engine/app/decorators/account_decorator.rb +16 -0
  18. data/pg_engine/app/decorators/pg_engine/base_decorator.rb +14 -12
  19. data/pg_engine/app/decorators/user_account_decorator.rb +19 -0
  20. data/pg_engine/app/decorators/user_decorator.rb +20 -0
  21. data/pg_engine/app/helpers/pg_engine/flash_helper.rb +1 -1
  22. data/pg_engine/app/models/account.rb +39 -0
  23. data/pg_engine/app/models/user.rb +61 -0
  24. data/pg_engine/app/models/user_account.rb +46 -0
  25. data/pg_engine/app/policies/account_policy.rb +31 -0
  26. data/pg_engine/app/policies/pg_engine/application_policy.rb +1 -1
  27. data/pg_engine/app/policies/user_account_policy.rb +31 -0
  28. data/pg_engine/app/policies/user_policy.rb +31 -0
  29. data/pg_engine/app/views/admin/accounts/_account.html.slim +1 -0
  30. data/pg_engine/app/views/admin/accounts/_form.html.slim +12 -0
  31. data/pg_engine/app/views/admin/accounts/edit.html.slim +5 -0
  32. data/pg_engine/app/views/admin/accounts/new.html.slim +5 -0
  33. data/pg_engine/app/views/admin/accounts/show.html.slim +27 -0
  34. data/pg_engine/app/views/admin/user_accounts/_form.html.slim +12 -0
  35. data/pg_engine/app/views/admin/user_accounts/_user_account.html.slim +1 -0
  36. data/pg_engine/app/views/admin/user_accounts/edit.html.slim +5 -0
  37. data/pg_engine/app/views/admin/user_accounts/new.html.slim +5 -0
  38. data/pg_engine/app/views/admin/user_accounts/show.html.slim +24 -0
  39. data/pg_engine/app/views/admin/users/_form.html.slim +12 -0
  40. data/pg_engine/app/views/admin/users/_user.html.slim +1 -0
  41. data/pg_engine/app/views/admin/users/edit.html.slim +5 -0
  42. data/pg_engine/app/views/admin/users/new.html.slim +5 -0
  43. data/pg_engine/app/views/admin/users/show.html.slim +27 -0
  44. data/pg_engine/config/initializers/active_admin.rb +355 -0
  45. data/pg_engine/config/initializers/devise.rb +313 -0
  46. data/pg_engine/config/locales/devise.en.yml +65 -0
  47. data/pg_engine/config/routes.rb +11 -0
  48. data/pg_engine/db/migrate/20240205194218_devise_create_users.rb +47 -0
  49. data/pg_engine/db/migrate/20240208234111_unaccent.rb +5 -0
  50. data/pg_engine/db/migrate/20240208234901_install_audited.rb +32 -0
  51. data/pg_engine/db/migrate/20240210025702_create_active_admin_comments.rb +16 -0
  52. data/pg_engine/db/migrate/20240211152951_create_accounts.rb +24 -0
  53. data/pg_engine/db/migrate/20240211153049_create_user_accounts.rb +20 -0
  54. data/pg_engine/db/seeds.rb +5 -0
  55. data/pg_engine/lib/pg_engine/core_ext.rb +14 -14
  56. data/pg_engine/lib/pg_engine/engine.rb +16 -2
  57. data/pg_engine/lib/pg_engine/route_helpers.rb +2 -2
  58. data/pg_engine/lib/tasks/auto_anotar_modelos.rake +2 -2
  59. data/pg_engine/spec/controllers/admin/accounts_controller_spec.rb +206 -0
  60. data/pg_engine/spec/controllers/admin/user_accounts_controller_spec.rb +189 -0
  61. data/pg_engine/spec/controllers/admin/users_controller_spec.rb +180 -0
  62. data/pg_engine/spec/factories/accounts.rb +11 -0
  63. data/pg_engine/spec/factories/user_accounts.rb +21 -0
  64. data/pg_engine/spec/factories/users.rb +59 -0
  65. data/pg_engine/spec/models/account_spec.rb +13 -0
  66. data/pg_engine/spec/models/user_account_spec.rb +13 -0
  67. data/pg_engine/spec/models/user_spec.rb +13 -0
  68. data/pg_layout/lib/pg_layout/engine.rb +0 -1
  69. data/pg_rails/lib/version.rb +1 -1
  70. data/pg_scaffold/lib/generators/pg_pundit/templates/policy.rb +1 -1
  71. data/pg_scaffold/lib/generators/pg_rspec/scaffold/templates/controller_spec.rb +4 -4
  72. data/pg_scaffold/lib/generators/pg_slim/templates/show.html.slim +4 -4
  73. data/pg_scaffold/lib/pg_scaffold/monkey_patches/mejoras_de_atributos.rb +2 -2
  74. data/pg_scaffold/spec/generators_spec.rb +1 -1
  75. metadata +56 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d63547ea3619de2194b7906e2344df8fe1ff049cd3b066ba1adcb61cf1ae8102
4
- data.tar.gz: 5845c9d534c94be6ddb71823271d21f3d2c28615ba5d70d5a874478799d48eeb
3
+ metadata.gz: c615490752a2afcaa4959f18c3b58bc214849a0912c308aea4b75a48122aa859
4
+ data.tar.gz: d4e8cc1fc2418a2691ef25607776de7ab1b6936367379cb4571c12925836933c
5
5
  SHA512:
6
- metadata.gz: b7611fd24a756c4a7c6e8573f67b48dd0e9598839065feef9ac6345e8e09e0b71087db795647524f6f8bd9734fe67c6da54d4305391306441eddcaf6b0120937
7
- data.tar.gz: 204dc0788a96e724b67038d0c89e1a8cecf69a1a4fd8f8ada7d105289ed0615641eed73e8353cf85acea3be573332d05583070650740c37ed53d891c2ec30579
6
+ metadata.gz: 3c7cad41dc0953598c49c7a48ca188e24a62d8dea1d1aed95f530e5eb92faa18bbf1033aac19c8adf963f759e7d0de52e905b4001354afb282373a257f8042be
7
+ data.tar.gz: 8ecd2f4a9617b57b3938f307502883681d70dab249a6f0fbb0789855b411465dac411ffe7dc3056ee0b49a40f84db8a77ce71739bd7dbc9ad81691b42c4de591
data/README.md CHANGED
@@ -73,3 +73,16 @@ Acceder a la app en <http://localhost:3000/>.
73
73
  4. `bundle exec rails g pg_scaffold Admin/CategoriaDeCosa nombre:string{required} "tipo:integer{enum,required}" fecha:date tiempo:datetime --model-name=CategoriaDeCosa --discard --activeadmin`
74
74
  5. `bundle exec rails g pg_scaffold Admin/Cosa nombre:string{required} "tipo:integer{enum,required}" categoria_de_cosa:references{required} --model-name=Cosa --discard --activeadmin`
75
75
  6. Setup asociacion creable en cosas/_form
76
+
77
+
78
+
79
+ be rake app:pg_engine_engine:install:migrations
80
+
81
+ be rails pg_engine_engine:install:migrations
82
+
83
+
84
+ "build": "esbuild pg_rails/js/index.js --bundle --sourcemap --format=esm --outdir=pg_rails/builds --public-path=/assets",
85
+ "build:css:compile": "sass ./pg_rails/scss/pg_rails.scss:./pg_rails/builds/application.css --no-source-map --load-path=node_modules",
86
+ "build:css:prefix": "postcss ./pg_rails/builds/application.css --use=autoprefixer --output=./pg_rails/builds/application.css",
87
+ "build:css": "yarn build:css:compile && yarn build:css:prefix",
88
+
@@ -1,9 +1,5 @@
1
- require "#{__dir__}/../../app/helpers/pg_associable/helpers"
2
- require "#{__dir__}/../../app/helpers/pg_associable/form_builder_methods"
3
-
4
1
  module PgAssociable
5
2
  class Engine < ::Rails::Engine
6
- isolate_namespace PgAssociable
7
3
  # initializer 'configurar_simple_form', after: 'factory_bot.set_fixture_replacement' do
8
4
  initializer 'configurar_pg_scaffold' do
9
5
  require 'pg_associable/simple_form_initializer'
@@ -3,7 +3,7 @@ SimpleForm.setup do |config|
3
3
  error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|
4
4
  b.use :html5
5
5
  b.optional :readonly
6
- b.use :label, class: 'form-control-label'
6
+ b.use :label, class: 'form-label'
7
7
  b.use :hidden_input
8
8
  b.wrapper tag: 'div', class: 'position-relative' do |ba|
9
9
  ba.use :input, class: 'form-control', disabled: true, placeholder: 'Clic para seleccionar...',
@@ -20,7 +20,7 @@ SimpleForm.setup do |config|
20
20
  error_class: 'form-group-invalid', valid_class: 'form-group-valid' do |b|
21
21
  b.use :html5
22
22
  b.optional :readonly
23
- b.use :label, class: 'form-control-label'
23
+ b.use :label, class: 'form-label'
24
24
  b.use :hidden_input
25
25
  b.wrapper tag: 'div', class: 'search-box position-relative' do |ba|
26
26
  ba.use :search_form, error_class: 'is-invalid'
@@ -2,10 +2,11 @@ require 'rails_helper'
2
2
 
3
3
  describe PgAssociable::Helpers do
4
4
  describe '#pg_respond_buscar' do
5
- let(:user) { create :user }
5
+ let(:user) { create :user, :developer }
6
6
  let(:ctrl) do
7
- clazz = Class.new(PgEngine::BaseController)
8
- clazz.new
7
+ # clazz = Class.new(Admin::CosasController)
8
+ # clazz.new
9
+ Admin::CosasController.new
9
10
  end
10
11
  let!(:cosa) { create :cosa }
11
12
 
@@ -0,0 +1,25 @@
1
+ ActiveAdmin.register Account do
2
+ permit_params :plan, :nombre, :hashid
3
+
4
+ index do
5
+ selectable_column
6
+ id_column
7
+ column :plan
8
+ column :nombre
9
+ column :hashid
10
+ actions
11
+ end
12
+
13
+ filter :plan
14
+ filter :nombre
15
+ filter :hashid
16
+
17
+ form do |f|
18
+ f.inputs do
19
+ f.input :plan
20
+ f.input :nombre
21
+ f.input :hashid
22
+ end
23
+ f.actions
24
+ end
25
+ end
@@ -1,7 +1,7 @@
1
1
  ActiveAdmin.register Audited::Audit do
2
- permit_params [:auditable_id, :auditable_type, :associated_id, :associated_type, :user_id,
3
- :user_type, :username, :action, :audited_changes, :version, :comment,
4
- :remote_address, :request_uuid, :created_at]
2
+ permit_params %i[auditable_id auditable_type associated_id associated_type user_id
3
+ user_type username action audited_changes version comment
4
+ remote_address request_uuid created_at]
5
5
 
6
6
  # :id
7
7
  # :discarded_at, :fecha, :nombre, :tiempo, :tipo, :created_at, :updated_at, :actualizado_por_id, :creado_por_id
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveAdmin.register_page 'Dashboard' do
4
+ menu priority: 1, label: proc { I18n.t('active_admin.dashboard') }
5
+
6
+ content title: proc { I18n.t('active_admin.dashboard') } do
7
+ div class: 'blank_slate_container', id: 'dashboard_default_message' do
8
+ span class: 'blank_slate' do
9
+ span I18n.t('active_admin.dashboard_welcome.welcome')
10
+ small I18n.t('active_admin.dashboard_welcome.call_to_action')
11
+ end
12
+ end
13
+
14
+ # Here is an example of a simple dashboard with columns and panels.
15
+ #
16
+ # columns do
17
+ # column do
18
+ # panel "Recent Posts" do
19
+ # ul do
20
+ # Post.recent(5).map do |post|
21
+ # li link_to(post.title, admin_post_path(post))
22
+ # end
23
+ # end
24
+ # end
25
+ # end
26
+
27
+ # column do
28
+ # panel "Info" do
29
+ # para "Welcome to ActiveAdmin."
30
+ # end
31
+ # end
32
+ # end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ ActiveAdmin.register UserAccount do
2
+ decorate_with UserAccountDecorator
3
+ permit_params :user_id, :account_id, profiles: []
4
+
5
+ index do
6
+ selectable_column
7
+ id_column
8
+ column :user
9
+ column :account
10
+ column :profiles
11
+ actions
12
+ end
13
+
14
+ filter :user
15
+ filter :account
16
+ filter :profiles
17
+
18
+ form do |f|
19
+ f.inputs do
20
+ f.input :user
21
+ f.input :account
22
+ f.input :profiles, as: :select
23
+ end
24
+ f.actions
25
+ end
26
+ end
@@ -1,6 +1,6 @@
1
1
  ActiveAdmin.register User do
2
2
  decorate_with UserDecorator
3
- permit_params :email, :password, :password_confirmation, :confirmed_at, profiles: []
3
+ permit_params :email, :password, :password_confirmation, :confirmed_at
4
4
 
5
5
  index do
6
6
  selectable_column
@@ -19,7 +19,6 @@ ActiveAdmin.register User do
19
19
  else
20
20
  f.input :email
21
21
  f.input :password unless f.object.persisted?
22
- f.input :profiles, as: :select
23
22
  end
24
23
  end
25
24
  f.actions
@@ -0,0 +1 @@
1
+ //= require active_admin/base
@@ -0,0 +1,17 @@
1
+ // Sass variable overrides must be declared before loading up Active Admin's styles.
2
+ //
3
+ // To view the variables that Active Admin provides, take a look at
4
+ // `app/assets/stylesheets/active_admin/mixins/_variables.scss` in the
5
+ // Active Admin source.
6
+ //
7
+ // For example, to change the sidebar width:
8
+ // $sidebar-width: 242px;
9
+
10
+ // Active Admin's got SASS!
11
+ @import "active_admin/mixins";
12
+ @import "active_admin/base";
13
+
14
+ // Overriding any non-variable Sass must be done after the fact.
15
+ // For example, to change the default status-tag color:
16
+ //
17
+ // .status_tag { background: #6090DB; }
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ module Admin
6
+ class AccountsController < AdminController
7
+ before_action { @clase_modelo = Account }
8
+
9
+ before_action(only: :index) { authorize Account }
10
+
11
+ before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
12
+
13
+ add_breadcrumb Account.nombre_plural, :admin_accounts_path
14
+
15
+ private
16
+
17
+ def atributos_permitidos
18
+ %i[plan nombre hashid]
19
+ end
20
+
21
+ def atributos_para_buscar
22
+ %i[plan nombre hashid]
23
+ end
24
+
25
+ def atributos_para_listar
26
+ %i[plan nombre hashid]
27
+ end
28
+
29
+ def atributos_para_mostrar
30
+ %i[plan nombre hashid]
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ module Admin
6
+ class UserAccountsController < AdminController
7
+ before_action { @clase_modelo = UserAccount }
8
+
9
+ before_action(only: :index) { authorize UserAccount }
10
+
11
+ before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
12
+
13
+ add_breadcrumb UserAccount.nombre_plural, :admin_user_accounts_path
14
+
15
+ private
16
+
17
+ def atributos_permitidos
18
+ %i[user_id account_id profiles]
19
+ end
20
+
21
+ def atributos_para_buscar
22
+ %i[user account profiles]
23
+ end
24
+
25
+ def atributos_para_listar
26
+ %i[user account profiles]
27
+ end
28
+
29
+ def atributos_para_mostrar
30
+ %i[user account profiles]
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ module Admin
6
+ class UsersController < AdminController
7
+ before_action { @clase_modelo = User }
8
+
9
+ before_action(only: :index) { authorize User }
10
+
11
+ before_action only: %i[update] do
12
+ params[:user].delete(:password) if params[:user][:password].blank?
13
+ end
14
+
15
+ before_action :set_instancia_modelo, only: %i[new create show edit update destroy]
16
+
17
+ add_breadcrumb User.nombre_plural, :admin_users_path
18
+
19
+ def create
20
+ @user.skip_confirmation!
21
+ pg_respond_create
22
+ end
23
+
24
+ def update
25
+ @user.skip_reconfirmation!
26
+ pg_respond_update
27
+ end
28
+
29
+ private
30
+
31
+ def atributos_permitidos
32
+ %i[email password developer]
33
+ end
34
+
35
+ def atributos_para_buscar
36
+ %i[email developer]
37
+ end
38
+
39
+ def atributos_para_listar
40
+ %i[email developer]
41
+ end
42
+
43
+ def atributos_para_mostrar
44
+ %i[email developer]
45
+ end
46
+ end
47
+ end
@@ -30,7 +30,7 @@ module PgEngine
30
30
  end
31
31
 
32
32
  def new
33
- add_breadcrumb "Crear #{@clase_modelo.nombre_singular.downcase}"
33
+ add_breadcrumb 'Crear'
34
34
  end
35
35
 
36
36
  def edit
@@ -71,21 +71,23 @@ module PgEngine
71
71
  session[:page_size].present? ? session[:page_size].to_i : 10
72
72
  end
73
73
 
74
- def pg_respond_update(object: nil)
75
- object ||= instancia_modelo
74
+ def pg_respond_update
75
+ object = instancia_modelo
76
76
  respond_to do |format|
77
77
  if (@saved = object.save)
78
78
  format.html { redirect_to object.decorate.target_object }
79
79
  format.json { render json: object.decorate }
80
80
  else
81
+ # TODO: esto solucionaría el problema?
82
+ # self.instancia_modelo = instancia_modelo.decorate
81
83
  format.html { render :edit, status: :unprocessable_entity }
82
84
  format.json { render json: object.errors, status: :unprocessable_entity }
83
85
  end
84
86
  end
85
87
  end
86
88
 
87
- def pg_respond_create(object: nil)
88
- object ||= instancia_modelo
89
+ def pg_respond_create
90
+ object = instancia_modelo
89
91
  respond_to do |format|
90
92
  if (@saved = object.save)
91
93
  if params[:asociable]
@@ -107,6 +109,8 @@ module PgEngine
107
109
  end
108
110
  format.json { render json: object.decorate }
109
111
  else
112
+ # TODO: esto solucionaría el problema?
113
+ # self.instancia_modelo = instancia_modelo.decorate
110
114
  if params[:asociable]
111
115
  format.turbo_stream do
112
116
  render turbo_stream:
@@ -221,6 +225,7 @@ module PgEngine
221
225
  authorize instancia_modelo
222
226
 
223
227
  # TODO: problema en create y update cuando falla la validacion
228
+ # Reproducir el error antes de arreglarlo
224
229
  self.instancia_modelo = instancia_modelo.decorate if action_name.in? %w[show edit new]
225
230
  end
226
231
 
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ class AccountDecorator < PgEngine::BaseDecorator
6
+ delegate_all
7
+
8
+ # Define presentation-specific methods here. Helpers are accessed through
9
+ # `helpers` (aka `h`). You can override attributes, for example:
10
+ #
11
+ # def created_at
12
+ # helpers.content_tag :span, class: 'time' do
13
+ # object.created_at.strftime("%a %m/%d/%y")
14
+ # end
15
+ # end
16
+ end
@@ -16,18 +16,20 @@ module PgEngine
16
16
  object.as_json.tap { |o| o[:to_s] = to_s }
17
17
  end
18
18
 
19
- # def method_missing(method_name, *args, &block)
20
- # valor = object.attributes[method_name.to_s]
21
- # return super unless valor.present?
22
-
23
- # if valor.instance_of?(Date)
24
- # dmy(valor)
25
- # # elsif valor.class == ActiveSupport::TimeWithZone
26
- # # dmy_time(valor)
27
- # else
28
- # super
29
- # end
30
- # end
19
+ # rubocop:disable Style/MissingRespondToMissing
20
+ def method_missing(method_name, *args, &)
21
+ valor = object.attributes[method_name.to_s]
22
+ return super if valor.blank?
23
+
24
+ if valor.instance_of?(Date)
25
+ dmy(valor)
26
+ elsif valor.instance_of?(ActiveSupport::TimeWithZone)
27
+ dmy_time(valor)
28
+ else
29
+ super
30
+ end
31
+ end
32
+ # rubocop:enable Style/MissingRespondToMissing
31
33
 
32
34
  def destroy_link(message = '¿Estás seguro?')
33
35
  return unless Pundit.policy!(helpers.send(PgEngine.configuracion.current_user_method), object).destroy?
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ class UserAccountDecorator < PgEngine::BaseDecorator
6
+ delegate_all
7
+
8
+ def profiles
9
+ object.profiles.join(', ')
10
+ end
11
+ # Define presentation-specific methods here. Helpers are accessed through
12
+ # `helpers` (aka `h`). You can override attributes, for example:
13
+ #
14
+ # def created_at
15
+ # helpers.content_tag :span, class: 'time' do
16
+ # object.created_at.strftime("%a %m/%d/%y")
17
+ # end
18
+ # end
19
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ class UserDecorator < PgEngine::BaseDecorator
6
+ delegate_all
7
+
8
+ def default_module
9
+ :admin
10
+ end
11
+
12
+ # Define presentation-specific methods here. Helpers are accessed through
13
+ # `helpers` (aka `h`). You can override attributes, for example:
14
+ #
15
+ # def created_at
16
+ # helpers.content_tag :span, class: 'time' do
17
+ # object.created_at.strftime("%a %m/%d/%y")
18
+ # end
19
+ # end
20
+ end
@@ -1,7 +1,7 @@
1
1
  module PgEngine
2
2
  module FlashHelper
3
3
  def render_turbo_stream_flash_messages
4
- turbo_stream.prepend 'flash', partial: 'layouts/flash'
4
+ turbo_stream.prepend 'flash', partial: 'pg_layout/flash'
5
5
  end
6
6
 
7
7
  def render_turbo_stream_title
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # == Schema Information
4
+ #
5
+ # Table name: accounts
6
+ #
7
+ # id :bigint not null, primary key
8
+ # discarded_at :datetime
9
+ # hashid :string
10
+ # nombre :string not null
11
+ # plan :integer not null
12
+ # created_at :datetime not null
13
+ # updated_at :datetime not null
14
+ # actualizado_por_id :bigint
15
+ # creado_por_id :bigint
16
+ #
17
+ # Indexes
18
+ #
19
+ # index_accounts_on_actualizado_por_id (actualizado_por_id)
20
+ # index_accounts_on_creado_por_id (creado_por_id)
21
+ #
22
+ # Foreign Keys
23
+ #
24
+ # fk_rails_... (actualizado_por_id => users.id)
25
+ # fk_rails_... (creado_por_id => users.id)
26
+ #
27
+ # generado con pg_rails
28
+
29
+ class Account < ApplicationRecord
30
+ audited
31
+ include Discard::Model
32
+
33
+ belongs_to :creado_por, optional: true, class_name: 'User'
34
+ belongs_to :actualizado_por, optional: true, class_name: 'User'
35
+
36
+ enumerize :plan, in: { completar: 0, los: 1, valores: 2 }
37
+
38
+ validates :plan, :nombre, presence: true
39
+ end
@@ -0,0 +1,61 @@
1
+ # == Schema Information
2
+ #
3
+ # Table name: users
4
+ #
5
+ # id :bigint not null, primary key
6
+ # confirmation_sent_at :datetime
7
+ # confirmation_token :string
8
+ # confirmed_at :datetime
9
+ # current_sign_in_at :datetime
10
+ # current_sign_in_ip :string
11
+ # developer :boolean default(FALSE), not null
12
+ # discarded_at :datetime
13
+ # email :string default(""), not null
14
+ # encrypted_password :string default(""), not null
15
+ # failed_attempts :integer default(0), not null
16
+ # last_sign_in_at :datetime
17
+ # last_sign_in_ip :string
18
+ # locked_at :datetime
19
+ # remember_created_at :datetime
20
+ # reset_password_sent_at :datetime
21
+ # reset_password_token :string
22
+ # sign_in_count :integer default(0), not null
23
+ # unconfirmed_email :string
24
+ # unlock_token :string
25
+ # created_at :datetime not null
26
+ # updated_at :datetime not null
27
+ #
28
+ # Indexes
29
+ #
30
+ # index_users_on_confirmation_token (confirmation_token) UNIQUE
31
+ # index_users_on_email (email) UNIQUE
32
+ # index_users_on_reset_password_token (reset_password_token) UNIQUE
33
+ # index_users_on_unlock_token (unlock_token) UNIQUE
34
+ #
35
+ class User < ApplicationRecord
36
+ # ApplicationRecord should be defined on Application
37
+
38
+ # Include default devise modules. Others available are:
39
+ # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
40
+ devise :database_authenticatable, :registerable,
41
+ :recoverable, :rememberable, :validatable,
42
+ :confirmable, :lockable, :timeoutable, :trackable
43
+
44
+ audited
45
+ include Discard::Model
46
+
47
+ has_many :user_accounts
48
+ has_many :accounts, through: :user_accounts
49
+
50
+ validates :email, presence: true
51
+
52
+ scope :query, ->(param) { where('email ILIKE ?', "%#{param}%") }
53
+
54
+ def to_s
55
+ email
56
+ end
57
+
58
+ def current_account
59
+ accounts.first
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # == Schema Information
4
+ #
5
+ # Table name: user_accounts
6
+ #
7
+ # id :bigint not null, primary key
8
+ # profiles :integer default([]), not null, is an Array
9
+ # created_at :datetime not null
10
+ # updated_at :datetime not null
11
+ # account_id :bigint not null
12
+ # actualizado_por_id :bigint
13
+ # creado_por_id :bigint
14
+ # user_id :bigint not null
15
+ #
16
+ # Indexes
17
+ #
18
+ # index_user_accounts_on_account_id (account_id)
19
+ # index_user_accounts_on_actualizado_por_id (actualizado_por_id)
20
+ # index_user_accounts_on_creado_por_id (creado_por_id)
21
+ # index_user_accounts_on_user_id (user_id)
22
+ #
23
+ # Foreign Keys
24
+ #
25
+ # fk_rails_... (account_id => accounts.id)
26
+ # fk_rails_... (actualizado_por_id => users.id)
27
+ # fk_rails_... (creado_por_id => users.id)
28
+ # fk_rails_... (user_id => users.id)
29
+ #
30
+ # generado con pg_rails
31
+
32
+ class UserAccount < ApplicationRecord
33
+ audited
34
+
35
+ belongs_to :user
36
+ belongs_to :account
37
+
38
+ belongs_to :creado_por, optional: true, class_name: 'User'
39
+ belongs_to :actualizado_por, optional: true, class_name: 'User'
40
+
41
+ enumerize :profiles, in: {
42
+ admin: 1,
43
+ dueño: 2,
44
+ invitado: 3
45
+ }, multiple: true
46
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # generado con pg_rails
4
+
5
+ class AccountPolicy < ApplicationPolicy
6
+ class Scope < ApplicationPolicy::Scope
7
+ # def resolve
8
+ # if policy.acceso_total?
9
+ # scope.all
10
+ # else
11
+ # scope.none
12
+ # end
13
+ # end
14
+ end
15
+
16
+ # def puede_editar?
17
+ # acceso_total? && !record.readonly?
18
+ # end
19
+
20
+ # def puede_crear?
21
+ # acceso_total? || user.asesor?
22
+ # end
23
+
24
+ # def puede_borrar?
25
+ # acceso_total? && !record.readonly?
26
+ # end
27
+
28
+ # def acceso_total?
29
+ # user.developer?
30
+ # end
31
+ end
@@ -88,7 +88,7 @@ module PgEngine
88
88
  end
89
89
 
90
90
  def acceso_total?
91
- user&.admin?
91
+ user&.developer?
92
92
  end
93
93
 
94
94
  def objeto_borrado?