trabajo-afectivo/app/models/application_model/has_assets.rb

154 lines
3.5 KiB
Ruby
Raw Normal View History

# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
module ApplicationModel::HasAssets
extend ActiveSupport::Concern
=begin
get all assets / related models for this user
user = User.find(123)
result = user.assets(assets_if_exists)
returns
result = {
:User => {
123 => user_model_123,
1234 => user_model_1234,
}
}
=end
def assets(data = {})
app_model = self.class.to_app_model
if !data[ app_model ]
data[ app_model ] = {}
end
if !data[ app_model ][ id ]
data[ app_model ][ id ] = attributes_with_association_ids
end
return data if !self['created_by_id'] && !self['updated_by_id']
app_model_user = User.to_app_model
%w(created_by_id updated_by_id).each { |local_user_id|
next if !self[ local_user_id ]
next if data[ app_model_user ] && data[ app_model_user ][ self[ local_user_id ] ]
user = User.lookup(id: self[ local_user_id ])
next if !user
data = user.assets(data)
}
data
end
=begin
get assets and record_ids of selector
model = Model.find(123)
assets = model.assets_of_selector('attribute_name_of_selector', assets)
=end
def assets_of_selector(selector, assets = {})
# get assets of condition
models = Models.all
send(selector).each { |item, content|
attribute = item.split(/\./)
next if !attribute[1]
begin
attribute_class = attribute[0].to_classname.constantize
rescue => e
logger.error "Unable to get asset for '#{attribute[0]}': #{e.inspect}"
next
end
reflection = attribute[1].sub(/_id$/, '')
#reflection = reflection.to_sym
next if !models[attribute_class]
next if !models[attribute_class][:reflections]
next if !models[attribute_class][:reflections][reflection]
next if !models[attribute_class][:reflections][reflection].klass
attribute_ref_class = models[attribute_class][:reflections][reflection].klass
if content['value'].instance_of?(Array)
content['value'].each { |item_id|
attribute_object = attribute_ref_class.find_by(id: item_id)
if attribute_object
assets = attribute_object.assets(assets)
end
}
else
attribute_object = attribute_ref_class.find_by(id: content['value'])
if attribute_object
assets = attribute_object.assets(assets)
end
end
}
assets
end
# methods defined here are going to extend the class, not the instance of it
class_methods do
=begin
return object and assets
data = Model.full(123)
data = {
id: 123,
assets: assets,
}
=end
def full(id)
object = find(id)
assets = object.assets({})
{
id: id,
assets: assets,
}
end
=begin
get assets of object list
list = [
{
object => 'Ticket',
o_id => 1,
},
{
object => 'User',
o_id => 121,
},
]
assets = Model.assets_of_object_list(list, assets)
=end
def assets_of_object_list(list, assets = {})
list.each { |item|
require item['object'].to_filename
record = Kernel.const_get(item['object']).find(item['o_id'])
assets = record.assets(assets)
if item['created_by_id']
user = User.find(item['created_by_id'])
assets = user.assets(assets)
end
if item['updated_by_id']
user = User.find(item['updated_by_id'])
assets = user.assets(assets)
end
}
assets
end
end
end