diaspora/app/models/photo.rb

125 lines
2.9 KiB
Ruby

# Copyright (c) 2009, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
class Photo < Post
require 'carrierwave/orm/activerecord'
mount_uploader :image, ImageUploader
xml_attr :remote_photo_path
xml_attr :remote_photo_name
xml_attr :text
xml_attr :status_message_guid
belongs_to :status_message
attr_accessible :text, :pending
validate :ownership_of_status_message
before_destroy :ensure_user_picture
after_create :queue_processing_job
def ownership_of_status_message
message = StatusMessage.find_by_id(self.status_message_id)
if status_message_id && message
self.diaspora_handle == message.diaspora_handle
else
true
end
end
def self.diaspora_initialize(params = {})
photo = super(params)
image_file = params.delete(:user_file)
photo.random_string = gen_random_string(10)
photo.processed = false
photo.image.store! image_file
photo.update_photo_remote_path
photo
end
def not_processed?
!self.processed
end
def update_photo_remote_path
unless self.image.url.match(/^https?:\/\//)
pod_url = AppConfig[:pod_url].dup
pod_url.chop! if AppConfig[:pod_url][-1,1] == '/'
remote_path = "#{pod_url}#{self.image.url}"
else
remote_path = self.image.url
end
name_start = remote_path.rindex '/'
self.remote_photo_path = "#{remote_path.slice(0, name_start)}/"
self.remote_photo_name = remote_path.slice(name_start + 1, remote_path.length)
end
def status_message_guid
if self.status_message
self.status_message.guid
else
nil
end
end
def status_message_guid= new_sm_guid
self.status_message= StatusMessage.where(:guid => new_sm_guid).first
end
def url(name = nil)
if self.not_processed? || self.image.path.include? '.gif'
image.url
elsif remote_photo_path
name = name.to_s + '_' if name
remote_photo_path + name.to_s + remote_photo_name
else
image.url(name)
end
end
def ensure_user_picture
profiles = Profile.where(:image_url => url(:thumb_large))
profiles.each { |profile|
profile.image_url = nil
profile.save
}
end
def thumb_hash
{:thumb_url => url(:thumb_medium), :id => id, :album_id => nil}
end
def queue_processing_job
Resque.enqueue(Job::ProcessPhoto, self.id)
end
def mutable?
true
end
def self.gen_random_string(len)
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
string = ""
1.upto(len) { |i| string << chars[rand(chars.size-1)] }
return string
end
def as_json(opts={})
{
:photo => {
:id => self.id,
:url => self.url,
:thumb_small => self.url(:thumb_small),
:text => self.text
}
}
end
scope :on_statuses, lambda { |post_ids|
where(:status_message_id => post_ids)
}
end