class Screenshot < ActiveRecord::Base belongs_to :package, :inverse_of=>:screenshots default_scope { order('uploaddatetime DESC') } def image_url(size) "#{Rails.configuration.images_path_prefix}/#{self.package.name[0]}/#{self.package.name}/#{self.id}_#{size}.png" end # Get the URL leading to a screenshot of this package def url(size) if self.approved # TODO: Make the path configurable basepath = "/screenshots/" else # TODO: Choose a path that makes unapproved screenshots unavailable basepath = "/screenshots/unapproved/" end File.join(basepath, self.package.name[0], self.package.name, "#{self.id}_#{size}.png") end # Return caption for full-screen screenshots. # Takes the description of a screenshot if available. # Otherwise it falls back to the general description of its package. def caption if self.description != '' self.description else self.package.description end end def image_file(size) # Screenshot files are at e.g. # .../public/screenshots/f/firefox/5871654_large.png Rails.configuration.images_path.join(self.package.name[0], self.package.name, "#{self.id}_#{size}.png") end # Delete all image files related to this screenshot def delete_all_images Rails.configuration.image_sizes.each do |size,dimensions| image_file = self.image_file(size) Rails.logger.info "(before_destroy) Deleting screenshot image '#{image_file}' from disk" if File.exist?(image_file) File.delete(image_file) else Rails.logger.error "(before_destroy) File '#{image_file}' not found - could not delete it" end end end # Callback to delete image files from disk when a screenshot record gets destroyed before_destroy do |screenshot| screenshot.delete_all_images end end