class Attachment < ApplicationRecord
include BaseModel
include Publicable
include Publishable
include Lockable
belongs_to :container , polymorphic : true , touch : true , optional : true
belongs_to :author , class_name : " User " , foreign_key : :author_id
belongs_to :course , foreign_key : :container_id , optional : true
has_many :attachment_group_settings , :dependent = > :destroy
has_many :attachment_histories , - > { order ( version : :desc ) } , :dependent = > :destroy
scope :by_filename_or_user_name , - > ( keywords ) { joins ( :author ) . where ( " filename like :search or LOWER(concat(users.lastname, users.firstname)) LIKE :search " ,
:search = > " % #{ keywords . split ( " " ) . join ( '|' ) } % " ) unless keywords . blank? }
scope :by_keywords , - > ( keywords ) { where ( " filename LIKE ? " , " % #{ keywords . split ( " " ) . join ( '|' ) } % " ) unless keywords . blank? }
scope :ordered , - > ( opts = { } ) { order ( " #{ opts [ :sort_type ] } #{ opts [ :sort ] == 1 ? 'asc' : 'desc' } " ) }
scope :by_course_second_category_id , - > ( course_second_category_id = 0 ) { where ( course_second_category_id : course_second_category_id ) }
scope :contains_only_course , - > { where ( container_type : 'Course' ) }
scope :contains_only_project , - > { where ( container_type : 'Project' ) }
scope :contains_course_and_project , - > { contains_only_course . or ( contains_only_project ) }
scope :mine , - > ( author_id ) { where ( author_id : author_id ) }
scope :simple_columns , - > { select ( :id , :filename , :filesize , :created_on , :cloud_url , :author_id ) }
scope :search_by_container , - > ( ids ) { where ( container_id : ids ) }
validates_length_of :description , maximum : 100
def diskfile
File . join ( File . join ( Rails . root , " files " ) , disk_directory . to_s , disk_filename . to_s )
end
def title
filename
end
def downloads_count
downloads
end
def quotes_count
quotes . nil? ? 0 : quotes
end
def self . associate_container ( ids , container_id , container_type , attachtype = 1 )
return false if ids . blank? || ! ids . is_a? ( Array )
ids . each do | id |
attachment = Attachment . find id
attachment . update_attributes ( container_id : container_id , container_type : container_type , attachtype : attachtype )
end
end
# Returns an unsaved copy of the attachment
def copy ( attributes = nil )
copy = self . class . new
copy . attributes = self . attributes . dup . except ( " id " , " downloads " , " quotes " )
copy . attributes = attributes if attributes
copy
end
def set_publish_time ( publish_time )
self . unified_setting = 1
if publish_time . blank?
self . publish_time = Time . now
self . is_publish = 1
else
self . is_publish = publish_time . to_s > ( format_time Time . now ) . to_s ? 0 : 1
self . publish_time = publish_time . to_s > ( format_time Time . now ) . to_s ? publish_time : Time . now
end
end
def set_course_group_publish_time ( course , course_group_publish_times )
self . unified_setting = 0
min_publish_time = " "
course_group_publish_times . each do | obj |
if obj && obj [ :course_group_id ]
publish_time = obj [ :publish_time ]
if ! publish_time . blank? && publish_time < min_publish_time
min_publish_time = publish_time
elsif publish_time . blank?
publish_time = Time . now
end
attachment_group_setting = self . attachment_group_settings . where ( course_group_id : obj [ :course_group_id ] , course_id : course . id ) . first
if attachment_group_setting . present?
attachment_group_setting . update_columns ( publish_time : publish_time )
else
self . attachment_group_settings . create (
:course_group_id = > obj [ :course_group_id ] ,
:course_id = > course . id ,
:publish_time = > publish_time
)
end
end
end
self . is_publish = min_publish_time > ( format_time Time . now ) . to_s ? 0 : 1
self . publish_time = min_publish_time > ( format_time Time . now ) . to_s ? min_publish_time : self . created_on
end
def become_history
history = self . attachment_histories . first
new_attachment_history = AttachmentHistory . new ( self . attributes . except ( " id " , " resource_bank_id " , " unified_setting " , " course_second_category_id " ) . merge (
attachment_id : self . id ,
version : history . nil? ? 1 : history . version + 1 ,
) )
new_attachment_history
end
def copy_attributes_from_new_attachment ( new_attachment )
self . attributes = new_attachment . attributes . dup . except ( " id " , " container_id " , " container_type " , " is_public " , " downloads " , " quotes " , 'is_publish' , 'publish_time' )
end
def set_public ( is_public )
if is_public == true
is_public = 1
elsif is_public == false
is_public = 0
end
end
end