bborn/communityengine

View on GitHub
app/models/photo.rb

Summary

Maintainability
A
45 mins
Test Coverage
class Photo < ActiveRecord::Base
  include UrlUpload

  acts_as_moderated_commentable
  belongs_to :album

  has_attached_file :photo, configatron.photo.paperclip_options.to_hash
  validates_attachment_presence :photo, :unless => Proc.new{|record| record.photo_remote_url }
  validates_attachment_content_type :photo, :content_type => configatron.photo.validation_options.content_type
  validates_attachment_size :photo, :less_than => configatron.photo.validation_options.max_size.to_i.megabytes

  attr_accessor :crop_x, :crop_y, :crop_w, :crop_h, :photo_remote_url
  after_update :reprocess_photo, :if => :cropping?

  acts_as_taggable

  acts_as_activity :user, :if => Proc.new{|record| record.album_id.nil?}

  validates_presence_of :user

  belongs_to :user
  has_one :user_as_avatar, :class_name => "User", :foreign_key => "avatar_id", :inverse_of => :avatar

  #Named scopes
  scope :recent, lambda { order("photos.created_at DESC") }
  scope :new_this_week, lambda { order("photos.created_at DESC").where("photos.created_at > ?", 7.days.ago.iso8601) }

  def display_name
    (self.name && self.name.length>0) ? self.name : "#{:created_at.l.downcase}: #{I18n.l(self.created_at, :format => :published_date)}"
  end

  def description_for_rss
    "<a href='#{self.link_for_rss}' title='#{self.name}'><img src='#{self.photo.url(:large)}' alt='#{self.name}' /><br />#{self.description}</a>"
  end

  def owner
    self.user
  end

  def previous_photo
    self.user.photos.where('created_at < ?', created_at).first
  end
  def next_photo
    self.user.photos.where('created_at > ?', created_at).last
  end

  def previous_in_album
    return nil unless self.album
    self.user.photos.where('created_at < ? and album_id = ?', created_at, self.album.id).first
  end
  def next_in_album
    return nil unless self.album
    self.user.photos.where('created_at > ? and album_id = ?', created_at, self.album_id).last
  end


  def self.find_recent(options = {:limit => 3})
    self.new_this_week.limit(options[:limit])
  end

  def self.find_related_to(photo, options = {})
    options.reverse_merge!({:limit => 8,
        :order => 'photos.created_at DESC',
        :conditions => ['photos.id != ?', photo.id]
    })
    limit(options[:limit]).order(options[:order]).where(options[:conditions]).tagged_with(photo.tags.collect{|t| t.name }, :any => true)
  end

  def cropping?
    !crop_x.blank? && !crop_y.blank? && !crop_w.blank? && !crop_h.blank?
  end

  def photo_geometry(style = :original)
    @geometry ||= {}
    @geometry[style] ||= Paperclip::Geometry.from_file(photo.path(style))
  end

  def photo_remote_url=(url_value)
    data = self.data_from_url(url_value)
    self.photo = data
  end

  private

  def reprocess_photo
    photo.assign(photo)
    photo.save
  end

end