mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-11 01:44:34 +08:00
95 lines
2.7 KiB
Ruby
95 lines
2.7 KiB
Ruby
class ReportElement < ActiveRecord::Base
|
|
enum type_of: Extends::REPORT_ELEMENT_TYPES
|
|
|
|
# This is only used by certain elements
|
|
enum sort_order: {
|
|
asc: 0,
|
|
desc: 1
|
|
}
|
|
|
|
validates :position, presence: true
|
|
validates :report, presence: true
|
|
validates :type_of, presence: true
|
|
validate :has_one_of_referenced_elements
|
|
|
|
belongs_to :report, inverse_of: :report_elements
|
|
|
|
# Hierarchical structure representation
|
|
has_many :children,
|
|
-> { order(:position) },
|
|
class_name: 'ReportElement',
|
|
foreign_key: 'parent_id',
|
|
dependent: :destroy
|
|
belongs_to :parent, class_name: 'ReportElement'
|
|
|
|
# References to various report entities
|
|
belongs_to :project, inverse_of: :report_elements
|
|
belongs_to :experiment, inverse_of: :report_elements
|
|
belongs_to :my_module, inverse_of: :report_elements
|
|
belongs_to :step, inverse_of: :report_elements
|
|
belongs_to :result, inverse_of: :report_elements
|
|
belongs_to :checklist, inverse_of: :report_elements
|
|
belongs_to :asset, inverse_of: :report_elements
|
|
belongs_to :table, inverse_of: :report_elements
|
|
|
|
def has_children?
|
|
children.length > 0
|
|
end
|
|
|
|
def result?
|
|
result_asset? or result_table? or result_text?
|
|
end
|
|
|
|
def comments?
|
|
step_comments? or result_comments?
|
|
end
|
|
|
|
# Get the referenced element (previously, element's type_of must be set)
|
|
def element_reference
|
|
ReportExtends::ELEMENT_REFERENCES.each do |el_ref|
|
|
return eval(el_ref.element.gsub('_id', '')) if el_ref.check(self)
|
|
end
|
|
end
|
|
|
|
# Set the element reference (previously, element's type_of must be set)
|
|
def set_element_reference(ref_id)
|
|
ReportExtends::SET_ELEMENT_REFERENCES_LIST.each do |el_ref|
|
|
check = el_ref.check(self)
|
|
next unless check
|
|
public_send("#{el_ref.element}=", ref_id)
|
|
break
|
|
end
|
|
end
|
|
|
|
# removes element that are archived or deleted
|
|
def clean_removed_or_archived_elements
|
|
parent_model = ''
|
|
%w(project experiment my_module step result checklist asset table)
|
|
.each do |el|
|
|
parent_model = el if send el
|
|
end
|
|
|
|
if parent_model == 'experiment'
|
|
destroy unless send(parent_model).project == report.project
|
|
else
|
|
destroy unless (send(parent_model).active? rescue send(parent_model))
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def has_one_of_referenced_elements
|
|
num_of_refs = [project,
|
|
experiment,
|
|
my_module,
|
|
step,
|
|
result,
|
|
checklist,
|
|
asset,
|
|
table].count { |r| r.present? }
|
|
if num_of_refs != 1
|
|
errors.add(:base,
|
|
'Report element must have exactly one element reference.')
|
|
end
|
|
end
|
|
end
|