From dc17ff1e3e68ac357f7c400871e1abd6da5da443 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Sun, 7 Dec 2014 22:32:13 +0100 Subject: [PATCH] Added callback that removes images files when a screenshot gets destroyed --- app/models/package.rb | 5 ++++- app/models/screenshot.rb | 27 ++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/app/models/package.rb b/app/models/package.rb index 267a301..fa5a7ec 100644 --- a/app/models/package.rb +++ b/app/models/package.rb @@ -5,7 +5,10 @@ class Package < ActiveRecord::Base # TODO: Make search weighted on users' rating pg_search_scope :general_search, :against => [:name, :description, :long_description] - has_many :screenshots, :inverse_of=>:package + # I am using "destroy_all" here so that when a package gets destroys the + # callbacks for all dependent screenshots are executed - thus removing the + # screenshot files from disk. + has_many :screenshots, :inverse_of=>:package, :dependent => :destroy default_scope { order('name ASC') diff --git a/app/models/screenshot.rb b/app/models/screenshot.rb index 4f765bf..3f5658e 100644 --- a/app/models/screenshot.rb +++ b/app/models/screenshot.rb @@ -19,7 +19,8 @@ class Screenshot < ActiveRecord::Base basepath = "/screenshots/unapproved/" end - File.join(basepath, self.package.name[0], self.package.name, "#{self.id}_#{size}.png") + #File.join(basepath, self.package.name[0], self.package.name, "#{self.id}_#{size}.png") + Rails.config.images_path.join(self.package.name[0], self.package.name, "#{self.id}_#{size}.png") end # Return caption for full-screen screenshots. @@ -32,4 +33,28 @@ class Screenshot < ActiveRecord::Base 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