app/models/concerns/hancock/gallery/watermarkable.rb in hancock_cms_gallery-1.0.0 vs app/models/concerns/hancock/gallery/watermarkable.rb in hancock_cms_gallery-1.0.2
- old
+ new
@@ -2,112 +2,191 @@
extend ActiveSupport::Concern
module ClassMethods
def paperclip_with_watermark(field = :image, original_image_class_name = "Hancock::Gallery::OriginalImage")
- attr_accessor "#{field}_autocropped".to_sym
+ attr_accessor "process_watermark_#{field}".to_sym
- hancock_cms_attached_file field, processors: [:watermark]
+ hancock_cms_attached_file field, processors: -> (instance) {
+ _processors = (instance.try("#{field}_default_processors") || []).dup
+ p_o = _processors.delete :paperclip_optimizer
+ if p_o
+ __processors = _processors.dup.uniq
+ _processors.clear
+ # _processors << :thumbnail
+ _processors << p_o
+ __processors.each do |p|
+ _processors << p
+ end
+ end
+
+ # p_w = _processors.delete :watermark
+ if ['1', 'true', 't', 'yes', 'y', true, 1, :true, :yes].include?(instance.try("process_watermark_#{field}"))
+ _processors << :watermark
+ end
+ _processors.uniq
+ }
+
# field "original_#{field}", type: BSON::Binary
- has_one "original_#{field}_data", as: :originable, class_name: original_image_class_name
+ has_one "original_#{field}_data", as: :originable, class_name: original_image_class_name, dependent: :destroy
class_eval %{
def #{field}_auto_rails_admin_jcrop
+ self.#{field}_autocropped = false if self.#{field}_autocropped == "0"
return if self.#{field}.blank? or !self.#{field}_updated_at_changed? or self.#{field}_autocropped
self.#{field}_autocropped = true
if File.exists?(self.#{field}.path)
auto_rails_admin_jcrop(:#{field})
+ # original file in object`s original_image as file
+ elsif self.original_#{field}_data and !self.original_#{field}_data.image.blank?
+ _dir = File.dirname(self.#{field}.path)
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
+ File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
+ File.symlink(self.original_#{field}_data.image.path, self.#{field}.path)
+ self.class.skip_callback(:save, :after, "save_original_#{field}".to_sym)
+ self.#{field}.reprocess!
+ self.class.set_callback(:save, :after, "save_original_#{field}".to_sym)
+ File.unlink(self.#{field}.path)
+
elsif (_data = self.original_#{field})
_old_filename = self.#{field}_file_name
if _data
_data = _data.data
_temp = Tempfile.new(_old_filename)
_temp.binmode
_temp.write _data
+ _dir = File.dirname(self.#{field}.path)
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
File.symlink(_temp.path, self.#{field}.path)
# self.#{field} = _temp
# self.#{field}.instance_write(:file_name, "\#{SecureRandom.hex}\#{File.extname(_old_filename)}")
self.class.skip_callback(:save, :after, "original_#{field}_to_db".to_sym)
auto_rails_admin_jcrop(:#{field})
self.class.set_callback(:save, :after, "original_#{field}_to_db".to_sym)
+ File.unlink(self.#{field}.path)
_temp.unlink
end
end
end
- before_#{field}_post_process do
- p_o = self.#{field}.processors.delete :paperclip_optimizer
- # if p_o
- # _processors = self.#{field}.processors.dup
- # self.#{field}.processors.clear
- # self.#{field}.processors = [:thumbnail, p_o]
- # _processors.each do |p|
- # self.#{field}.processors << p
- # end
- # end
+ # before_#{field}_post_process do
+ # p_o = self.#{field}.processors.delete :paperclip_optimizer
+ # if p_o
+ # _processors = self.#{field}.processors.dup
+ # self.#{field}.processors.clear
+ # # self.#{field}.processors << :thumbnail
+ # self.#{field}.processors << p_o
+ # _processors.each do |p|
+ # self.#{field}.processors << p
+ # end
+ # end
+ #
+ # p_w = self.#{field}.processors.delete :watermark
+ # if p_w and self.process_watermark_#{field}
+ # self.#{field}.processors << p_w
+ # end
+ # self.#{field}.processors.uniq!
+ #
+ #
+ # true
+ # end
- p_w = self.#{field}.processors.delete :watermark
- self.#{field}.processors << p_w if p_w
-
- true
- end
-
def original_#{field}
- original_#{field}_data.original if original_#{field}_data
+ original_#{field}_data and original_#{field}_data.original
end
def original_#{field}_base64
- _original = self.original_#{field}
- if _original
- _data = Base64.encode64(_original.data)
- _content_type = self.#{field}_content_type
- else
- _data = ''
- _content_type = 'jpg'
- end
- "data:\#{_content_type};base64,\#{_data}"
+ original_#{field}_data and original_#{field}_data.original_as_base64(self.#{field}_content_type)
end
+ def original_#{field}_image
+ original_#{field}_data and original_#{field}_data.original_as_image(self.#{field}_content_type)
+ end
- after_save :original_#{field}_to_db
+ # after_save :original_#{field}_to_db
def original_#{field}_to_db
- if self.#{field}_file_name
+ unless self.#{field}.blank?
if File.exists?(self.#{field}.path)
_original = self.original_#{field}_data
unless _original
_original = #{original_image_class_name}.new
_original.originable = self
end
+ _original.image = nil
_original.original = BSON::Binary.new(File.binread(self.#{field}.path))
if _original.save
File.unlink(self.#{field}.path)
end
end
+ else
+ self.original_#{field}_data and self.original_#{field}_data.delete
end
end
+ after_save :save_original_#{field}
+ def save_original_#{field}
+ unless self.#{field}.blank?
+ if File.exists?(self.#{field}.path)
+ _original = self.original_#{field}_data
+ unless _original
+ _original = #{original_image_class_name}.new
+ _original.originable = self
+ end
+ _original.image = self.#{field}
+ _original.original = nil
+ if _original.save
+ File.unlink(self.#{field}.path) if File.exists?(self.#{field}.path)
+ end
+ end
+ else
+ self.original_#{field}_data and self.original_#{field}_data.delete
+ end
+ end
+
+ def reprocess_#{field}_with_watermark
+ self.process_watermark_#{field} = true
+ self.reprocess_#{field}
+ end
+
def reprocess_#{field}
return if self.#{field}.blank?
+ # original file in object
if File.exists?(self.#{field}.path)
self.#{field}.reprocess!
+
+ # original file in object`s original_image as file
+ elsif self.original_#{field}_data and !self.original_#{field}_data.image.blank?
+ _dir = File.dirname(self.#{field}.path)
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
+ File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
+ File.symlink(self.original_#{field}_data.image.path, self.#{field}.path)
+ self.class.skip_callback(:save, :after, "save_original_#{field}".to_sym)
+ self.#{field}.reprocess!
+ self.class.set_callback(:save, :after, "save_original_#{field}".to_sym)
+ File.unlink(self.#{field}.path)
+
+ # original file in object`s original_image as db field
elsif (_data = self.original_#{field})
_old_filename = self.#{field}_file_name
if _data
_data = _data.data
_temp = Tempfile.new(_old_filename)
_temp.binmode
_temp.write _data
+ _dir = File.dirname(self.#{field}.path)
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
File.symlink(_temp.path, self.#{field}.path)
- self.#{field} = _temp
- self.#{field}.instance_write(:file_name, "\#{SecureRandom.hex}\#{File.extname(_old_filename)}")
+ # self.#{field} = _temp
+ # self.#{field}.instance_write(:file_name, "\#{SecureRandom.hex}\#{File.extname(_old_filename)}")
self.class.skip_callback(:save, :after, "original_#{field}_to_db".to_sym)
self.#{field}.reprocess!
self.class.set_callback(:save, :after, "original_#{field}_to_db".to_sym)
_temp.unlink
- self.save
+ File.unlink(self.#{field}.path)
+ # self.save
end
end
end
}
end