photomix/app/models/photo.rb

99 lines
3 KiB
Ruby
Raw Normal View History

#require "image_science"
2009-06-02 00:08:57 +02:00
require 'mini_exiftool'
2009-05-22 14:13:46 +02:00
class Photo < ActiveRecord::Base
belongs_to :album
2009-05-22 22:38:52 +02:00
has_many :photo_tags, :dependent => :destroy
has_many :tags, :through => :photo_tags
2009-05-22 21:04:41 +02:00
mount_uploader :file, FileUploader
#validates_uniqueness_of :path, :message => "Photo already exsists on disc"
validates_presence_of :title
2009-05-22 22:38:52 +02:00
before_validation :set_title
2010-04-14 07:00:48 +02:00
#before_create :exif_read
#before_update :exif_write # should only write if tags are changed as images can be large and thus ExifTool will take a while to write to the file
2009-06-02 00:08:57 +02:00
2009-05-25 21:39:43 +02:00
attr_accessor :tag_list
2009-06-09 00:50:25 +02:00
#attr_protected :path
2009-06-02 00:08:57 +02:00
2009-08-01 18:37:28 +02:00
named_scope :untouched, :conditions => "photos.description IS NULL AND photos.id NOT IN ( SELECT photo_id FROM photo_tags)", :include => :album
named_scope :previous, lambda { |p,a| { :conditions => ["id < :id AND album_Id = :album ", { :id => p, :album => a } ], :limit => 1, :order => "id DESC"} }
named_scope :next, lambda { |p,a| { :conditions => ["id > :id AND album_Id = :album ", { :id => p, :album => a } ], :limit => 1, :order => "id ASC"} }
2009-06-11 13:05:09 +02:00
def to_param
2009-08-11 01:23:30 +02:00
"#{id}-#{title.parameterize}"
end
2009-06-03 02:15:23 +02:00
def tag(title)
return if self.tags.collect{|tag|tag.title}.include?( title )
self.photo_tags.create(:tag => Tag.find_or_create_by_title( :title => title) )
self.reload
end
def untag(title)
return if !self.tags.collect{|tag|tag.title}.include?( title )
# perhaps not the best way but it finds the correct PhotoTag and deletes it
self.photo_tags.select{|photo_tag|
photo_tag.tag.title == title
}.each {|photo_tag|photo_tag.destroy}
self.reload
end
2009-06-02 00:08:57 +02:00
2009-05-25 21:39:43 +02:00
def tag_list
2009-07-06 15:41:19 +02:00
return self.tags.find(:all, :order => 'title').map{ |t| t.title }.sort.join(" ")
2009-05-25 21:39:43 +02:00
end
def tag_list=(tags)
ts = Array.new
tags.split(" ").each do |tag|
2009-06-03 21:30:09 +02:00
ts.push( Tag.find_or_create_by_title( :title => tag.downcase) )
2009-05-25 21:39:43 +02:00
end
self.tags = ts
end
2009-06-02 00:08:57 +02:00
2009-06-03 01:33:39 +02:00
def exif_info
2010-04-14 07:00:48 +02:00
photo = MiniExiftool.new(self.file.path)
2009-10-12 00:20:38 +02:00
#photo.tags.sort.each do |tag|
# puts tag.ljust(28) + photo[tag].to_s
#end
2009-06-03 01:33:39 +02:00
end
protected
2009-06-16 21:43:03 +02:00
2009-06-03 01:33:39 +02:00
2009-06-02 00:08:57 +02:00
private
2009-06-03 01:33:39 +02:00
2009-06-16 21:43:03 +02:00
def set_title
2010-04-14 07:00:48 +02:00
self.title = self.file.file.basename.titleize unless self.title
2009-06-16 21:43:03 +02:00
end
def ensure_file
#self.destroy if !File.exists?( APP_CONFIG[:photos_path] + self.path )
2009-06-16 21:43:03 +02:00
end
2009-06-03 01:33:39 +02:00
def exif_read
photo = MiniExiftool.new(self.file.path)
2009-06-03 01:33:39 +02:00
self.longitude = photo.GPSLongitude if self.longitude.nil?
self.latitude = photo.GPSLatitude if self.latitude.nil?
self.title = photo.DocumentName if self.title.nil?
self.description = photo.ImageDescription if self.description.nil? || photo.ImageDescription != 'Exif_JPEG_PICTURE'
2009-06-15 23:36:47 +02:00
self.tag_list = (self.tags.empty? ? "" : self.album.tag_list) + " " + (photo.Keywords.nil? ? "" : photo.Keywords.to_a.map { |tag| tag.gsub(" ", "_") }.join(" "))
2009-06-02 00:08:57 +02:00
end
2009-06-03 01:33:39 +02:00
def exif_write
photo = MiniExiftool.new(self.path.file)
2009-06-02 00:08:57 +02:00
photo.GPSLongitude = self.longitude
photo.GPSLatitude = self.latitude
photo.DocumentName = self.title
photo.ImageDescription = self.description
2009-06-03 01:33:39 +02:00
photo.Keywords = self.tags
2009-06-02 00:08:57 +02:00
photo.save
end
2009-06-03 21:30:09 +02:00
2009-05-22 14:13:46 +02:00
end