debshots/app/models/screenshot.rb

106 lines
3.2 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class Screenshot < ActiveRecord::Base
belongs_to :package, :inverse_of=>:screenshots
# default_scope {
# order('created_at DESC')
# }
has_attached_file :image,
styles: { :large => '800x600>', :thumb => '160x120>' },
default_url: '/images/dummy/no-screenshots-available.svg',
path: ':rails_root/public/screenshots/:id_partition/:style.png',
url: '/screenshots/:id_partition/:style.png'
validates_attachment_content_type :image, :content_type => 'image/png'
validates_with AttachmentSizeValidator, :attributes => :image, :less_than => 5.megabytes
validate :validate_image_is_unique
# Validator that checks if the image has already been uploaded.
# A generic uniqueness validator does not work because it would attribute
# the error to the :image_fingerprint field and not the actual :image field.
# Currently this check makes sure that the same screenshot is not uploaded
# twice for the same package. However it allows the screenshot to be uploaded
# for two different packages. Restricting that further may happen later.
# TODO: will fail if screenshot is updated because it finds its own image
def validate_image_is_unique
# Look for images with the same checksum / image_fingerprint
if screenshot=Screenshot.find_by(image_fingerprint: image_fingerprint, package_id: self.package.id)
unless screenshot.id == self.id
errors.add(:image, "has already been uploaded for this package")
end
end
end
# Calculate how many days ago this screenshot has been uploaded
def age_days
if self.created_at
seconds = Time.now - self.created_at
else
seconds = 0
end
days = (seconds/86400).to_i
days ? "#{days} days ago" : 'today'
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} Version #{self.version}"
else
"#{self.package.description} Version #{self.version}"
end
end
def uploader
# TODO: Implement the ownership of images
'Anonymous'
end
# Return Debshots 1.x path to allow migration of images into Paperclip filesystem schema
def image_url(size)
"live/screenshots/approved/#{self.package.name[0]}/#{self.package.name}/#{self.id}_#{size}.png"
end
# Long status text for public users
def status
text = 'This image '
if self.approved
text << 'is public'
else
text << 'has to be moderated before being publicly visible'
end
if self.markedfordelete
text << ' (and was requested to be removed)'
end
return text
end
# Short status text for admins
def adminstatus
if self.markedfordelete
"Removal requested > #{self.delete_reason}"
elsif self.approved
'Public'
else
'Waiting for approval'
end
end
# Return the number of screenshots that need to be approved
def self.unapproved
self.where(approved: false)
end
# Publish a screenshot from the moderation queue
def approve_screenshot!
self.delete_reason = nil
self.markedfordelete = false
self.approved = true
self.save!
end
end