105 lines
3.1 KiB
Ruby
105 lines
3.1 KiB
Ruby
class Album < ActiveRecord::Base
|
|
has_many :photos, :dependent => :destroy
|
|
has_many :collection_albums
|
|
has_many :collections, :through => :collection_albums
|
|
|
|
validates_uniqueness_of :path, :message => "Album already exsists on disc"
|
|
validates_presence_of :title, :message => "can't be blank"
|
|
|
|
before_validation :ensure_path, :set_title
|
|
after_create :create_folders
|
|
after_destroy :destroy_folders
|
|
|
|
attr_accessor :tags
|
|
#attr_protected :path
|
|
|
|
named_scope :untouched, :conditions => "albums.id IN ( SELECT DISTINCT photos.album_id FROM photos WHERE photos.description IS NULL AND photos.id NOT IN ( SELECT photo_id FROM photo_tags) )", :order => 'title'
|
|
named_scope :unused, :conditions => "albums.id NOT IN (SELECT album_id FROM collection_albums)"
|
|
named_scope :used, :conditions => "albums.id IN (SELECT album_id FROM collection_albums)"
|
|
|
|
def to_param
|
|
"#{id}-#{title.parameterize}"
|
|
end
|
|
|
|
|
|
|
|
def ensure_path
|
|
self.path = self.title.parameterize unless self.path
|
|
end
|
|
|
|
def set_title
|
|
self.title = File.basename( self.path) unless self.title || !self.path
|
|
end
|
|
|
|
def tags
|
|
# should maybe cache this to database?
|
|
# should maybe return array instead?
|
|
|
|
tags = Array.new
|
|
self.photos.map{ |photo|
|
|
if photo.tags.empty?
|
|
# photo has no tags => no unversial tags for this album
|
|
return
|
|
else
|
|
photo.tags
|
|
end
|
|
}.each_with_index{ |photo_tags,i|
|
|
# returns tag collection for each photo
|
|
if i == 0
|
|
tags = photo_tags
|
|
else
|
|
# combine arrays if they have identical tags.
|
|
# Will remove tags that are only tagged to one photo
|
|
#tags = tags & photo_tags
|
|
tags = tags & photo_tags
|
|
end
|
|
}
|
|
return tags
|
|
end
|
|
|
|
def tags=(tags)
|
|
tags = tags.split(" ").sort
|
|
current_tags = ( self.tags.nil? ? [] : self.tags.map{|tag|tag.title} )
|
|
return if tags == self.tags
|
|
|
|
# find tags that should be removed from this album - thus remove from all photos in album
|
|
# i.e. tags listed in self.tag_list but no in parameter tags
|
|
#current_tags.map {|tag|tag if !tags.include?(tag) }.compact
|
|
(current_tags - tags).each { |tag|
|
|
self.photos.each {|photo|
|
|
photo.untag( tag )
|
|
}
|
|
}
|
|
|
|
# add universial tags to all photos in album
|
|
(tags - current_tags).each do |tag|
|
|
self.photos.each { |photo|
|
|
photo.tag( tag )
|
|
}
|
|
end
|
|
end
|
|
|
|
def photo_tags
|
|
tags = Array.new
|
|
self.photos.each{ |photo|
|
|
tags = tags | photo.tags
|
|
}
|
|
return tags
|
|
end
|
|
|
|
protected
|
|
|
|
private
|
|
|
|
def create_folders
|
|
Dir.mkdir( APP_CONFIG[:photos_path] + self.path ) unless File.exists?( APP_CONFIG[:photos_path] + self.path )
|
|
Dir.mkdir( APP_CONFIG[:thumbs_path] + self.path ) unless File.exists?( APP_CONFIG[:thumbs_path] + self.path )
|
|
end
|
|
|
|
def destroy_folders
|
|
#puts "DELETE DIRECTORY " + APP_CONFIG[:photos_path] + self.path
|
|
Dir.delete( APP_CONFIG[:photos_path] + self.path ) if File.exists?( APP_CONFIG[:photos_path] + self.path )
|
|
Dir.delete( APP_CONFIG[:thumbs_path] + self.path ) if File.exists?( APP_CONFIG[:thumbs_path] + self.path )
|
|
end
|
|
end
|