erp_tech_svcs 4.0.0 → 4.2.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 +4 -4
- data/README.md +0 -24
- data/app/controllers/api/v1/audit_log_items_controller.rb +33 -0
- data/app/controllers/api/v1/audit_logs_controller.rb +32 -0
- data/app/controllers/api/v1/capabilities_controller.rb +160 -0
- data/app/controllers/api/v1/file_assets_controller.rb +40 -0
- data/app/controllers/api/v1/groups_controller.rb +236 -0
- data/app/controllers/api/v1/security_roles_controller.rb +276 -0
- data/app/controllers/api/v1/users_controller.rb +262 -0
- data/app/controllers/erp_tech_svcs/session_controller.rb +8 -5
- data/app/controllers/erp_tech_svcs/user_controller.rb +14 -15
- data/app/mailers/user_mailer.rb +8 -5
- data/app/models/audit_log.rb +111 -36
- data/app/models/audit_log_item.rb +30 -0
- data/app/models/audit_log_item_type.rb +1 -0
- data/app/models/audit_log_type.rb +19 -0
- data/app/models/capability.rb +22 -6
- data/app/models/extensions/tracked_status_type.rb +3 -0
- data/app/models/file_asset.rb +245 -20
- data/app/models/file_asset_holder.rb +20 -0
- data/app/models/group.rb +38 -25
- data/app/models/notification.rb +32 -13
- data/app/models/notification_type.rb +13 -0
- data/app/models/security_role.rb +17 -4
- data/app/models/user.rb +116 -29
- data/app/validators/password_strength_validator.rb +1 -1
- data/app/views/user_mailer/activation_needed_email.html.erb +293 -15
- data/app/views/user_mailer/reset_password_email.html.erb +268 -13
- data/config/initializers/logger.rb +19 -0
- data/config/initializers/sorcery.rb +2 -0
- data/config/initializers/wickedpdf.rb +4 -0
- data/config/routes.rb +64 -0
- data/db/data_migrations/20110802200222_schedule_delete_expired_sessions_job.rb +1 -5
- data/db/data_migrations/20150819140550_create_job_tracker_for_notification.rb +14 -0
- data/db/migrate/20080805000010_base_tech_services.rb +99 -39
- data/db/migrate/20150414151421_add_nested_set_columns_to_security_role.rb +13 -0
- data/db/migrate/20150609003216_update_user_for_sorcery.rb +11 -0
- data/db/migrate/20150819135108_add_custom_fields_to_notifications.rb +5 -0
- data/db/migrate/20160122155402_add_description_to_file_asset.rb +13 -0
- data/db/migrate/20160310163060_add_created_by_updated_by_to_erp_tech_svcs.rb +35 -0
- data/db/migrate/20160313161611_add_tenant_id_to_audit_log.rb +16 -0
- data/lib/erp_tech_svcs.rb +6 -10
- data/lib/erp_tech_svcs/config.rb +7 -2
- data/lib/erp_tech_svcs/delayed_jobs/delete_expired_sessions_job.rb +49 -0
- data/lib/erp_tech_svcs/delayed_jobs/notification_job.rb +50 -0
- data/lib/erp_tech_svcs/engine.rb +0 -1
- data/lib/erp_tech_svcs/erp_tech_svcs_audit_log.rb +12 -6
- data/lib/erp_tech_svcs/extensions.rb +0 -1
- data/lib/erp_tech_svcs/extensions/active_record/has_capability_accessors.rb +57 -29
- data/lib/erp_tech_svcs/extensions/active_record/has_file_assets.rb +57 -31
- data/lib/erp_tech_svcs/extensions/active_record/has_security_roles.rb +12 -4
- data/lib/erp_tech_svcs/extensions/active_record/is_json.rb +22 -15
- data/lib/erp_tech_svcs/extensions/active_record/scoped_by.rb +16 -13
- data/lib/erp_tech_svcs/extensions/compass_ae/erp_base_erp_svcs/controllers/api/parties_controller.rb +15 -0
- data/lib/erp_tech_svcs/file_support.rb +1 -0
- data/lib/erp_tech_svcs/file_support/file_system_manager.rb +77 -44
- data/lib/erp_tech_svcs/file_support/manager.rb +12 -3
- data/lib/erp_tech_svcs/file_support/railties/compass_ae_resolver.rb +49 -0
- data/lib/erp_tech_svcs/file_support/s3_manager.rb +73 -51
- data/lib/erp_tech_svcs/utils/compass_access_negotiator.rb +11 -2
- data/lib/erp_tech_svcs/utils/default_nested_set_methods.rb +238 -46
- data/lib/erp_tech_svcs/version.rb +1 -1
- data/lib/tasks/erp_tech_svcs_tasks.rake +43 -5
- metadata +73 -42
- data/app/models/user_defined_data.rb +0 -6
- data/app/models/user_defined_field.rb +0 -8
- data/config/initializers/pdfkit.rb +0 -18
- data/db/data_migrations/20121130212146_note_capabilities.rb +0 -23
- data/db/migrate/20121116151510_create_groups.rb +0 -18
- data/db/migrate/20121126171612_upgrade_security.rb +0 -53
- data/db/migrate/20121126173506_upgrade_security2.rb +0 -274
- data/db/migrate/20130410135419_add_queue_to_delayed_jobs.rb +0 -13
- data/db/migrate/20130610163240_create_notifications.rb +0 -37
- data/db/migrate/20130725212647_add_party_id_idx_to_users.rb +0 -9
- data/db/migrate/20131113213843_add_audit_log_item_old_value.rb +0 -13
- data/db/migrate/20131113213844_add_erp_tech_svcs_missing_indexes.rb +0 -31
- data/db/migrate/20131129203603_add_user_defined_fields.rb +0 -43
- data/db/migrate/20141013060204_add_custom_fields_to_notifications.rb +0 -12
- data/db/migrate/20141108182427_add_scoped_by_to_file_assets.rb +0 -14
- data/lib/erp_tech_svcs/extensions/active_record/has_user_defined_data.rb +0 -147
- data/lib/erp_tech_svcs/sessions/delete_expired_sessions_job.rb +0 -47
- data/lib/erp_tech_svcs/sessions/delete_expired_sessions_service.rb +0 -15
- data/lib/erp_tech_svcs/utils/compass_logger.rb +0 -87
@@ -0,0 +1,13 @@
|
|
1
|
+
class AddNestedSetColumnsToSecurityRole < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :security_roles, :lft, :integer unless column_exists?(:security_roles, :lft)
|
4
|
+
add_column :security_roles, :rgt, :integer unless column_exists?(:security_roles, :rgt)
|
5
|
+
add_column :security_roles, :parent_id, :integer unless column_exists?(:security_roles, :parent_id)
|
6
|
+
|
7
|
+
add_index :security_roles, :parent_id unless index_exists?(:security_roles, :parent_id)
|
8
|
+
add_index :security_roles, :lft unless index_exists?(:security_roles, :lft)
|
9
|
+
add_index :security_roles, :rgt unless index_exists?(:security_roles, :rgt)
|
10
|
+
|
11
|
+
SecurityRole.rebuild!
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class UpdateUserForSorcery < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
add_column :users, :unlock_token, :string, :default => nil unless column_exists? :users, :unlock_token
|
4
|
+
add_column :users, :last_login_from_ip_address, :string, :default => nil unless column_exists? :users, :last_login_from_ip_address
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
remove_column :users, :unlock_token
|
9
|
+
remove_column :users, :last_login_from_ip_address
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class AddDescriptionToFileAsset < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
unless column_exists? :file_assets, :description
|
4
|
+
add_column :file_assets, :description, :string
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def down
|
9
|
+
if column_exists? :file_assets, :description
|
10
|
+
remove_column :file_assets, :description
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class AddCreatedByUpdatedByToErpTechSvcs < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
%w{file_assets}.each do |table|
|
4
|
+
|
5
|
+
unless column_exists? table.to_sym, :created_by_party_id
|
6
|
+
add_column table.to_sym, :created_by_party_id, :integer
|
7
|
+
|
8
|
+
add_index table.to_sym, :created_by_party_id, name: "#{table}_created_by_pty_idx"
|
9
|
+
end
|
10
|
+
|
11
|
+
unless column_exists? table.to_sym, :updated_by_party_id
|
12
|
+
add_column table.to_sym, :updated_by_party_id, :integer
|
13
|
+
|
14
|
+
add_index table.to_sym, :updated_by_party_id, name: "#{table}_updated_by_pty_idx"
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
def down
|
22
|
+
%w{file_assets}.each do |table|
|
23
|
+
|
24
|
+
if column_exists? table.to_sym, :created_by_party_id
|
25
|
+
remove_column table.to_sym, :created_by_party_id
|
26
|
+
end
|
27
|
+
|
28
|
+
if column_exists? table.to_sym, :updated_by_party_id
|
29
|
+
remove_column table.to_sym, :updated_by_party_id
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class AddTenantIdToAuditLog < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
unless column_exists? :audit_logs, :tenant_id
|
4
|
+
add_column :audit_logs, :tenant_id, :integer
|
5
|
+
|
6
|
+
add_index :audit_logs, :tenant_id, name: 'audit_logs_tenant_id'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
if column_exists? :audit_log, :tenant_id
|
12
|
+
remove_column :audit_logs, :tenant_id
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/lib/erp_tech_svcs.rb
CHANGED
@@ -1,19 +1,14 @@
|
|
1
|
-
require 'aasm'
|
2
|
-
|
3
|
-
#compass_ae libraries
|
4
1
|
require 'erp_base_erp_svcs'
|
5
|
-
|
2
|
+
require 'aasm'
|
6
3
|
require 'paperclip'
|
7
4
|
require 'delayed_job'
|
8
5
|
require 'delayed_job_active_record'
|
9
6
|
require 'mail_alternatives_with_attachments'
|
10
7
|
require 'sorcery'
|
11
|
-
require '
|
12
|
-
require 'aws'
|
13
|
-
require 'activerecord-postgres-hstore'
|
8
|
+
require 'wicked_pdf'
|
9
|
+
require 'aws-sdk'
|
14
10
|
require 'nested-hstore'
|
15
11
|
require "erp_tech_svcs/version"
|
16
|
-
require "erp_tech_svcs/utils/compass_logger"
|
17
12
|
require "erp_tech_svcs/utils/default_nested_set_methods"
|
18
13
|
require "erp_tech_svcs/utils/compass_access_negotiator"
|
19
14
|
require "erp_tech_svcs/extensions"
|
@@ -21,8 +16,9 @@ require 'erp_tech_svcs/file_support'
|
|
21
16
|
require 'erp_tech_svcs/sms_wrapper'
|
22
17
|
require "erp_tech_svcs/config"
|
23
18
|
require "erp_tech_svcs/engine"
|
24
|
-
require 'erp_tech_svcs/sessions/delete_expired_sessions_job'
|
25
|
-
require 'erp_tech_svcs/sessions/delete_expired_sessions_service'
|
26
19
|
require 'erp_tech_svcs/erp_tech_svcs_audit_log'
|
20
|
+
require 'erp_tech_svcs/delayed_jobs/notification_job'
|
21
|
+
require 'erp_tech_svcs/delayed_jobs/delete_expired_sessions_job'
|
22
|
+
|
27
23
|
module ErpTechSvcs
|
28
24
|
end
|
data/lib/erp_tech_svcs/config.rb
CHANGED
@@ -16,7 +16,7 @@ module ErpTechSvcs
|
|
16
16
|
:file_storage,
|
17
17
|
:s3_cache_expires_in_minutes,
|
18
18
|
:session_expires_in_hours,
|
19
|
-
:
|
19
|
+
:notification_job_delay
|
20
20
|
|
21
21
|
def init!
|
22
22
|
@defaults = {
|
@@ -33,7 +33,7 @@ module ErpTechSvcs
|
|
33
33
|
:@s3_protocol => 'https', # Can be either 'http' or 'https'
|
34
34
|
:@file_storage => :filesystem, # Can be either :s3 or :filesystem
|
35
35
|
:@session_expires_in_hours => 12, # this is used by DeleteExpiredSessionsJob to purge inactive sessions from database
|
36
|
-
:@
|
36
|
+
:@notification_job_delay => '2 minutes from now'
|
37
37
|
}
|
38
38
|
end
|
39
39
|
|
@@ -50,6 +50,11 @@ module ErpTechSvcs
|
|
50
50
|
def configure!
|
51
51
|
@configure_blk.call(self) if @configure_blk
|
52
52
|
end
|
53
|
+
|
54
|
+
def installation_url
|
55
|
+
"#{self.file_protocol}://#{self.installation_domain}"
|
56
|
+
end
|
57
|
+
|
53
58
|
end
|
54
59
|
init!
|
55
60
|
reset!
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "benchmark"
|
2
|
+
|
3
|
+
module ErpTechSvcs
|
4
|
+
module DelayedJobs
|
5
|
+
# Delayed Job to Reset Daily Assignments to Forecast
|
6
|
+
class DeleteExpiredSessionsJob
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@priority = 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def perform
|
13
|
+
unless Dir.exists?(File.join(Rails.root, 'log/delayed_jobs'))
|
14
|
+
Dir.mkdir(File.join(Rails.root, 'log/delayed_jobs'))
|
15
|
+
end
|
16
|
+
|
17
|
+
logger = Logger.new(File.join(Rails.root,"log/delayed_jobs/#{Rails.env}-delete_expired_sessions_job.log"), "weekly")
|
18
|
+
logger.level = Logger::INFO
|
19
|
+
|
20
|
+
time = Benchmark.measure do
|
21
|
+
begin
|
22
|
+
ActiveRecord::SessionStore::Session.delete_all ['updated_at < ?', ErpTechSvcs::Config.session_expires_in_hours.hours.ago]
|
23
|
+
rescue => ex
|
24
|
+
logger.error("#{Time.now}**************************************************")
|
25
|
+
logger.error("Job Error: #{ex.message}")
|
26
|
+
logger.error("Trace: #{ex.backtrace.join("\n")}")
|
27
|
+
logger.error("*************************************************************")
|
28
|
+
|
29
|
+
# email notification
|
30
|
+
ExceptionNotifier.notify_exception(ex) if defined? ExceptionNotifier
|
31
|
+
end
|
32
|
+
end #benchmark
|
33
|
+
|
34
|
+
# Run once per day
|
35
|
+
start_time = Time.now + 1.day
|
36
|
+
|
37
|
+
Delayed::Job.enqueue(DeleteExpiredSessionsJob.new, @priority, start_time)
|
38
|
+
|
39
|
+
# Update job tracker
|
40
|
+
JobTracker.job_ran('Delete Expired Sessions', self.class.name, ("(%.4fs)" % time.real), start_time)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.schedule_job(schedule_dt)
|
44
|
+
Delayed::Job.enqueue(DeleteExpiredSessionsJob.new, @priority, schedule_dt)
|
45
|
+
end
|
46
|
+
|
47
|
+
end # DeleteExpiredSessionsJob
|
48
|
+
end # DelayedJobs
|
49
|
+
end # ErpTechSvcs
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require 'chronic'
|
3
|
+
|
4
|
+
module ErpTechSvcs
|
5
|
+
module DelayedJobs
|
6
|
+
class NotificationJob
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@priority = 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def perform
|
13
|
+
unless Dir.exists?(File.join(Rails.root, 'log/delayed_jobs'))
|
14
|
+
Dir.mkdir(File.join(Rails.root, 'log/delayed_jobs'))
|
15
|
+
end
|
16
|
+
|
17
|
+
logger = Logger.new(File.join(Rails.root,"log/delayed_jobs/#{Rails.env}-notifications_job.log"), "weekly")
|
18
|
+
logger.level = Logger::INFO
|
19
|
+
|
20
|
+
time = Benchmark.measure do
|
21
|
+
begin
|
22
|
+
Notification.where('current_state = ?', 'pending').each do |notification|
|
23
|
+
notification.deliver_notification
|
24
|
+
end
|
25
|
+
|
26
|
+
rescue Exception => ex
|
27
|
+
logger.error("#{Time.now}**************************************************")
|
28
|
+
logger.error("Job Error: #{ex.message}")
|
29
|
+
logger.error("Trace: #{ex.backtrace.join("\n")}")
|
30
|
+
logger.error("*************************************************************")
|
31
|
+
|
32
|
+
# email notification
|
33
|
+
ExceptionNotifier.notify_exception(ex) if defined? ExceptionNotifier
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
start_time = Chronic.parse(ErpTechSvcs::Config.notification_job_delay)
|
38
|
+
Delayed::Job.enqueue(ErpTechSvcs::DelayedJobs::NotificationJob.new, @priority, start_time)
|
39
|
+
|
40
|
+
#update job tracker
|
41
|
+
JobTracker.job_ran('Notification Job', self.class.name, ("(%.4fs)" % time.real), start_time)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.schedule_job(schedule_at)
|
45
|
+
Delayed::Job.enqueue(ErpTechSvcs::DelayedJobs::NotificationJob.new, @priority, schedule_at)
|
46
|
+
end
|
47
|
+
|
48
|
+
end # NotificationJob
|
49
|
+
end # DelayedJobs
|
50
|
+
end # ErpTechSvcs
|
data/lib/erp_tech_svcs/engine.rb
CHANGED
@@ -9,7 +9,6 @@ module ErpTechSvcs
|
|
9
9
|
include ErpTechSvcs::Extensions::ActiveRecord::HasFileAssets
|
10
10
|
include ErpTechSvcs::Extensions::ActiveRecord::ProtectedByCapabilities
|
11
11
|
include ErpTechSvcs::Extensions::ActiveRecord::HasCapabilityAccessors
|
12
|
-
include ErpTechSvcs::Extensions::ActiveRecord::HasUserDefinedData
|
13
12
|
include ErpTechSvcs::Extensions::ActiveRecord::IsJson
|
14
13
|
include ErpTechSvcs::Extensions::ActiveRecord::ScopedBy
|
15
14
|
end
|
@@ -3,23 +3,29 @@ module ErpTechSvcs
|
|
3
3
|
class << self
|
4
4
|
|
5
5
|
#log when a user logs out
|
6
|
-
def successful_logout(
|
7
|
-
|
8
|
-
|
6
|
+
def successful_logout(user)
|
7
|
+
|
8
|
+
if user.is_a? Integer
|
9
|
+
user = User.find(user)
|
10
|
+
end
|
11
|
+
|
12
|
+
AuditLog.create!(
|
9
13
|
:party_id => user.party.id,
|
10
14
|
:event_record => user,
|
11
15
|
:audit_log_type => AuditLogType.find_by_type_and_subtype_iid('application','successful_logout'),
|
12
|
-
:description => "User #{user.username} successfully logged out."
|
16
|
+
:description => "User #{user.username} successfully logged out.",
|
17
|
+
:tenant_id => user.party.dba_organization.id
|
13
18
|
)
|
14
19
|
end
|
15
20
|
|
16
21
|
#log when a user logs out
|
17
22
|
def successful_login(user)
|
18
|
-
AuditLog.create(
|
23
|
+
AuditLog.create!(
|
19
24
|
:party_id => user.party.id,
|
20
25
|
:event_record => user,
|
21
26
|
:audit_log_type => AuditLogType.find_by_type_and_subtype_iid('application','successful_login'),
|
22
|
-
:description => "User #{user.username} successfully logged in."
|
27
|
+
:description => "User #{user.username} successfully logged in.",
|
28
|
+
:tenant_id => user.party.dba_organization.id
|
23
29
|
)
|
24
30
|
end
|
25
31
|
|
@@ -8,7 +8,6 @@ require 'erp_tech_svcs/extensions/active_record/has_security_roles'
|
|
8
8
|
require 'erp_tech_svcs/extensions/active_record/protected_with_capabilities'
|
9
9
|
require 'erp_tech_svcs/extensions/active_record/has_capability_accessors'
|
10
10
|
require 'erp_tech_svcs/extensions/active_record/acts_as_versioned'
|
11
|
-
require 'erp_tech_svcs/extensions/active_record/has_user_defined_data'
|
12
11
|
require 'erp_tech_svcs/extensions/active_record/is_json'
|
13
12
|
require 'erp_tech_svcs/extensions/active_record/scoped_by'
|
14
13
|
|
@@ -12,23 +12,21 @@ module ErpTechSvcs
|
|
12
12
|
def has_capability_accessors
|
13
13
|
extend HasCapabilityAccessors::SingletonMethods
|
14
14
|
include HasCapabilityAccessors::InstanceMethods
|
15
|
-
|
15
|
+
|
16
16
|
has_many :capability_accessors, :as => :capability_accessor_record
|
17
17
|
end
|
18
|
-
|
19
18
|
end
|
20
|
-
|
19
|
+
|
21
20
|
module SingletonMethods
|
22
|
-
|
23
21
|
end
|
24
22
|
|
25
|
-
module InstanceMethods
|
23
|
+
module InstanceMethods
|
26
24
|
|
27
25
|
# method to get capabilities this instance does NOT have
|
28
26
|
def capabilities_not
|
29
27
|
Capability.joins(:capability_type).
|
30
|
-
|
31
|
-
|
28
|
+
joins("LEFT JOIN capability_accessors ON capability_accessors.capability_id = capabilities.id AND capability_accessors.capability_accessor_record_type = '#{self.class.name}' AND capability_accessors.capability_accessor_record_id = #{self.id}").
|
29
|
+
where("capability_accessors.id IS NULL")
|
32
30
|
end
|
33
31
|
|
34
32
|
def scope_capabilities_not(scope_type_iid)
|
@@ -47,7 +45,7 @@ module ErpTechSvcs
|
|
47
45
|
|
48
46
|
def capabilities
|
49
47
|
Capability.joins(:capability_type).joins(:capability_accessors).
|
50
|
-
|
48
|
+
where(:capability_accessors => { :capability_accessor_record_type => self.class.name, :capability_accessor_record_id => self.id })
|
51
49
|
end
|
52
50
|
|
53
51
|
def scope_capabilities(scope_type_iid)
|
@@ -75,19 +73,6 @@ module ErpTechSvcs
|
|
75
73
|
scope_capabilities('instance')
|
76
74
|
end
|
77
75
|
|
78
|
-
# pass in (capability_type_iid, klass) or (capability) object
|
79
|
-
def add_capability(*capability)
|
80
|
-
capability_type_iid = capability.first.is_a?(Symbol) ? capability.first.to_s : capability.first
|
81
|
-
capability = capability_type_iid.is_a?(String) ? get_or_create_capability(capability_type_iid, capability.second) : capability.first
|
82
|
-
ca = CapabilityAccessor.find_or_create_by_capability_accessor_record_type_and_capability_accessor_record_id_and_capability_id(get_superclass, self.id, capability.id)
|
83
|
-
self.reload
|
84
|
-
ca
|
85
|
-
end
|
86
|
-
|
87
|
-
def grant_capability(*capability)
|
88
|
-
add_capability(*capability)
|
89
|
-
end
|
90
|
-
|
91
76
|
def get_or_create_capability(capability_type_iid, klass)
|
92
77
|
capability_type = convert_capability_type(capability_type_iid)
|
93
78
|
if klass.is_a?(String)
|
@@ -104,6 +89,32 @@ module ErpTechSvcs
|
|
104
89
|
Capability.find_by_capability_resource_type_and_capability_type_id_and_scope_type_id(klass, capability_type.id, scope_type.id)
|
105
90
|
end
|
106
91
|
|
92
|
+
def has_capabilities?
|
93
|
+
!capability_accessors.empty?
|
94
|
+
end
|
95
|
+
|
96
|
+
# Add multiple capabilities
|
97
|
+
#
|
98
|
+
# @param _capabilities [Array] Array of Capbilities
|
99
|
+
def add_capabilities(_capabilities)
|
100
|
+
_capabilities.each do |capability|
|
101
|
+
add_capability(capability)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
alias :grant_capabilities :add_capabilities
|
106
|
+
|
107
|
+
# pass in (capability_type_iid, klass) or (capability) object
|
108
|
+
def add_capability(*capability)
|
109
|
+
capability_type_iid = capability.first.is_a?(Symbol) ? capability.first.to_s : capability.first
|
110
|
+
capability = capability_type_iid.is_a?(String) ? get_or_create_capability(capability_type_iid, capability.second) : capability.first
|
111
|
+
ca = CapabilityAccessor.find_or_create_by_capability_accessor_record_type_and_capability_accessor_record_id_and_capability_id(get_superclass, self.id, capability.id)
|
112
|
+
self.reload
|
113
|
+
ca
|
114
|
+
end
|
115
|
+
|
116
|
+
alias :grant_capability :add_capability
|
117
|
+
|
107
118
|
# pass in (capability_type_iid, klass) or (capability) object
|
108
119
|
def remove_capability(*capability)
|
109
120
|
capability_type_iid = capability.first.is_a?(Symbol) ? capability.first.to_s : capability.first
|
@@ -114,15 +125,31 @@ module ErpTechSvcs
|
|
114
125
|
ca
|
115
126
|
end
|
116
127
|
|
117
|
-
|
118
|
-
|
128
|
+
alias :revoke_capability :remove_capability
|
129
|
+
|
130
|
+
# Remove multiple capabilities
|
131
|
+
#
|
132
|
+
# @param _capabilities [Array] Array of Capbilities
|
133
|
+
def remove_capabilities(_capabilities)
|
134
|
+
_capabilities.each do |capability|
|
135
|
+
remove_capability(capability)
|
136
|
+
end
|
119
137
|
end
|
120
138
|
|
121
|
-
|
122
|
-
|
139
|
+
alias :revoke_capabilities :remove_capabilities
|
140
|
+
|
141
|
+
# Remove all current capabilities
|
142
|
+
#
|
143
|
+
def remove_all_capabilities
|
144
|
+
capabilities.each do |capability|
|
145
|
+
remove_capability(capability)
|
146
|
+
end
|
123
147
|
end
|
124
148
|
|
149
|
+
alias :revoke_all_capabilities :remove_all_capabilities
|
150
|
+
|
125
151
|
private
|
152
|
+
|
126
153
|
def convert_capability_type(type)
|
127
154
|
return type if type.is_a?(CapabilityType)
|
128
155
|
return nil unless (type.is_a?(String) || type.is_a?(Symbol))
|
@@ -131,7 +158,8 @@ module ErpTechSvcs
|
|
131
158
|
CapabilityType.create(:internal_identifier => type.to_s, :description => type.to_s.titleize)
|
132
159
|
end
|
133
160
|
end
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
161
|
+
|
162
|
+
end # HasCapabilityAccessors
|
163
|
+
end # ActiveRecord
|
164
|
+
end # Extensions
|
165
|
+
end # ErpTechSvcs
|