154 lines
3.5 KiB
Ruby
154 lines
3.5 KiB
Ruby
|
# 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
|