hancock_cms_gallery 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/hancock/gallery/load_gallery.rb +9 -1
  3. data/app/controllers/concerns/hancock/gallery/load_gallery_images.rb +9 -1
  4. data/app/controllers/{concerns/rails_admin → rails_admin}/jcrop_controller.rb +34 -1
  5. data/app/models/concerns/hancock/gallery/active_record_paperclip.rb +59 -17
  6. data/app/models/concerns/hancock/gallery/auto_crop.rb +6 -2
  7. data/app/models/concerns/hancock/gallery/decorators/gallery.rb +7 -0
  8. data/app/models/concerns/hancock/gallery/decorators/image.rb +7 -0
  9. data/app/models/concerns/hancock/gallery/mongoid_paperclip.rb +62 -18
  10. data/app/models/concerns/hancock/gallery/watermarkable.rb +113 -34
  11. data/app/views/rails_admin/jcrop/edit.html.slim +9 -0
  12. data/app/views/rails_admin/main/_form_hancock_image.html.slim +56 -0
  13. data/config/initializers/hancock_gallery.rb +0 -20
  14. data/hancock_cms_gallery.gemspec +2 -2
  15. data/lib/generators/hancock/gallery/config/{install_generator.rb → config_generator.rb} +0 -0
  16. data/lib/generators/hancock/gallery/config/templates/hancock_gallery.erb +6 -0
  17. data/lib/generators/hancock/gallery/migrations/{migration_generator.rb → migrations_generator.rb} +1 -1
  18. data/lib/generators/hancock/gallery/models/gallery_generator.rb +1 -1
  19. data/lib/generators/hancock/gallery/models/templates/embedded_image.erb +5 -5
  20. data/lib/generators/hancock/gallery/models/templates/gallery.erb +12 -5
  21. data/lib/generators/hancock/gallery/models/templates/image.erb +12 -5
  22. data/lib/generators/hancock/gallery/models/templates/original_image.erb +5 -5
  23. data/lib/hancock/gallery/admin.rb +26 -5
  24. data/lib/hancock/gallery/admin/gallery.rb +5 -0
  25. data/lib/hancock/gallery/admin/image.rb +4 -1
  26. data/lib/hancock/gallery/admin/original_image.rb +7 -0
  27. data/lib/hancock/gallery/configuration.rb +12 -0
  28. data/lib/hancock/gallery/models/gallery.rb +15 -3
  29. data/lib/hancock/gallery/models/image.rb +14 -3
  30. data/lib/hancock/gallery/models/mongoid/gallery.rb +3 -0
  31. data/lib/hancock/gallery/models/mongoid/image.rb +3 -0
  32. data/lib/hancock/gallery/models/mongoid/original_image.rb +7 -0
  33. data/lib/hancock/gallery/models/original_image.rb +55 -5
  34. data/lib/hancock/gallery/paperclip_patch.rb +34 -0
  35. data/lib/hancock/gallery/rails_admin_ext/hancock_image.rb +41 -1
  36. data/lib/hancock/gallery/version.rb +1 -1
  37. data/lib/hancock_cms_gallery.rb +7 -10
  38. metadata +13 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1c0f7db85fb9be1c12a8016104a2cc11813af011
4
- data.tar.gz: f5fe4b2a2c9bc6716dd99d5a08c2686c08989963
3
+ metadata.gz: 217745205e47c842bde5680420df5862059b7fc6
4
+ data.tar.gz: 28373af543958270bcca2cb752a6e589e0ae1850
5
5
  SHA512:
6
- metadata.gz: ed47a304c6ab2305013a033a2020683f9506fcf34c8886fd7ed6299e747d939fc760243d89c353797323b941a922926147ac6a97d943bc098dd48827388fe18f
7
- data.tar.gz: dac044323b0fa221019099313f8da29829d077e2427c7f9c131cba39d01ef2fa0edcf5543e47084d49fc476e2305fa0d51466ed47122aaced65f140c4caba2ba
6
+ metadata.gz: 1447c26606da3b523312a9364d585d36a8302e92dff37ba5a23cf86aaccb30cc2284a67f6e26f7a02c72cba4248c3bebba4ae440662b87799901bdcf63e98b22
7
+ data.tar.gz: a6fbf407dcda493c007fc4a3c944d4bb73bc80ebd0201722a4c2d9748b1b90383a30fd5392e99b967ee726dbf609c4e130febe4c2bea697b0bebf0c7b0086960
@@ -61,7 +61,11 @@ module Hancock::Gallery::LoadGallery
61
61
 
62
62
  def hancock_gallery_gallery_load_images
63
63
  if @gallery
64
- hancock_gallery_gallery_images_scope.page(params[:page]).per(hancock_gallery_render_gallery_images_per_page)
64
+ if hancock_gallery_render_gallery_images_load_all_the_rest and params[:page].to_i > 1
65
+ hancock_gallery_gallery_images_scope.page.skip(hancock_gallery_render_gallery_images_per_page).all
66
+ else
67
+ hancock_gallery_gallery_images_scope.page(params[:page]).per(hancock_gallery_render_gallery_images_per_page)
68
+ end
65
69
  else
66
70
  []
67
71
  end
@@ -71,4 +75,8 @@ module Hancock::Gallery::LoadGallery
71
75
  4
72
76
  end
73
77
 
78
+ def hancock_gallery_render_gallery_images_load_all_the_rest
79
+ false
80
+ end
81
+
74
82
  end
@@ -47,12 +47,20 @@ module Hancock::Gallery::LoadGalleryImages
47
47
  end
48
48
 
49
49
  def hancock_gallery_load_gallery_images
50
- hancock_gallery_gallery_image_scope.page(params[:page]).per(hancock_gallery_gallery_images_per_page)
50
+ if hancock_gallery_gallery_images_load_all_the_rest and params[:page].to_i > 1
51
+ hancock_gallery_gallery_image_scope.page.skip(hancock_gallery_gallery_images_per_page).all
52
+ else
53
+ hancock_gallery_gallery_image_scope.page(params[:page]).per(hancock_gallery_gallery_images_per_page)
54
+ end
51
55
  end
52
56
 
53
57
  def hancock_gallery_gallery_images_per_page
54
58
  4
55
59
  end
56
60
 
61
+ def hancock_gallery_gallery_images_load_all_the_rest
62
+ false
63
+ end
64
+
57
65
 
58
66
  end
@@ -3,7 +3,7 @@ require 'mini_magick'
3
3
  module RailsAdmin
4
4
 
5
5
  class JcropController < RailsAdmin::ApplicationController
6
- skip_before_action :get_model
6
+ skip_before_action :get_model rescue nil # prevent undefined method error
7
7
  before_action :get_model, :get_object, :get_field, :get_fit_image
8
8
 
9
9
  helper_method :abstract_model, :geometry
@@ -48,6 +48,21 @@ module RailsAdmin
48
48
  @image_tag_options[:style] << "border: 1px solid #AAA !important;"
49
49
  end
50
50
 
51
+ # original file in object`s original_image as file
52
+ elsif @object.try("original_#{@field}_data") and !@object.send("original_#{@field}_data").image.blank?
53
+ @image_tag_options[:'data-geometry'] = geometry(@object.send("original_#{@field}_data").image.path).join(",")
54
+
55
+ if @fit_image_geometry
56
+ fit_image_geometry = fit_image_geometry(@object.send("original_#{@field}_data").image.path)
57
+
58
+ @form_options[:'style'] = "margin-left: #{375 - (fit_image_geometry[0]/2) - 15}px;"
59
+
60
+ @image_tag_options[:style] = ""
61
+ @image_tag_options[:style] << "width: #{fit_image_geometry[0]}px !important;"
62
+ @image_tag_options[:style] << "height: #{fit_image_geometry[1]}px !important;"
63
+ @image_tag_options[:style] << "border: 1px solid #AAA !important;"
64
+ end
65
+
51
66
  elsif @object.respond_to?("original_#{@field}")
52
67
  _data = @object.send("original_#{@field}")
53
68
  if _data
@@ -64,9 +79,24 @@ module RailsAdmin
64
79
  end
65
80
 
66
81
  def update
82
+ @object.try("process_watermark_#{params[:crop_field]}=", params["process_watermark_#{params[:crop_field]}".to_sym])
83
+
67
84
  if File.exists?(@object.send(params[:crop_field]).path)
68
85
  @object.rails_admin_crop! params.merge(crop_process_before: '+repage', crop_process_after: '+repage')
69
86
 
87
+ # original file in object`s original_image as file
88
+ elsif @object.try("original_#{params[:crop_field]}_data") and !@object.send("original_#{params[:crop_field]}_data").image.blank?
89
+ _dir = File.dirname(@object.send(params[:crop_field]).path)
90
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
91
+ File.unlink(@object.send(params[:crop_field]).path) if File.symlink?(@object.send(params[:crop_field]).path)
92
+ File.symlink(@object.send("original_#{params[:crop_field]}_data").image.path, @object.send(params[:crop_field]).path)
93
+ @object.class.skip_callback(:save, :after, "save_original_#{params[:crop_field]}".to_sym)
94
+ @object.save
95
+ @object.class.set_callback(:save, :after, "save_original_#{params[:crop_field]}".to_sym)
96
+ @object.send("#{params[:crop_field]}_autocropped=", true)
97
+ @object.rails_admin_crop! params.merge(crop_process_before: '+repage', crop_process_after: '+repage')
98
+ File.unlink(@object.send(params[:crop_field]).path) if File.exists?(@object.send(params[:crop_field]).path)
99
+
70
100
  elsif @object.try("original_#{params[:crop_field]}")
71
101
  _old_filename = @object.send("#{params[:crop_field]}_file_name")
72
102
  _data = @object.send("original_#{params[:crop_field]}")
@@ -75,6 +105,8 @@ module RailsAdmin
75
105
  _temp = Tempfile.new(_old_filename)
76
106
  _temp.binmode
77
107
  _temp.write _data
108
+ _dir = File.dirname(@object.send(params[:crop_field]).path)
109
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
78
110
  File.unlink(@object.send(params[:crop_field]).path) if File.symlink?(@object.send(params[:crop_field]).path)
79
111
  File.symlink(_temp.path, @object.send(params[:crop_field]).path)
80
112
  # @object.send("#{params[:crop_field]}=", _temp)
@@ -82,6 +114,7 @@ module RailsAdmin
82
114
  @object.class.skip_callback(:save, :after, "original_#{params[:crop_field]}_to_db".to_sym)
83
115
  @object.save
84
116
  @object.class.set_callback(:save, :after, "original_#{params[:crop_field]}_to_db".to_sym)
117
+ @object.send("#{params[:crop_field]}_autocropped=", true)
85
118
  @object.rails_admin_crop! params.merge(crop_process_before: '+repage', crop_process_after: '+repage')
86
119
  _temp.unlink
87
120
  end
@@ -19,14 +19,25 @@ if Hancock.active_record?
19
19
  end
20
20
 
21
21
  if is_image
22
- if defined?(::PaperclipOptimizer)
23
- opts[:processors] ||= []
24
- opts[:processors] << :paperclip_optimizer
25
- opts[:processors].flatten!
26
- opts[:processors].uniq!
22
+ cattr_accessor "#{name}_default_processors".to_sym
23
+ instance_eval <<-RUBY
24
+ self.#{name}_default_processors = []
25
+ if defined?(::PaperclipOptimizer)
26
+ self.#{name}_default_processors << :paperclip_optimizer
27
+ self.#{name}_default_processors.flatten!
28
+ self.#{name}_default_processors.uniq!
29
+ end
30
+ RUBY
31
+ unless opts[:processors].is_a?(Proc)
32
+ if defined?(::PaperclipOptimizer)
33
+ opts[:processors] ||= []
34
+ opts[:processors] << :paperclip_optimizer
35
+ opts[:processors].flatten!
36
+ opts[:processors].uniq!
37
+ end
27
38
  end
28
39
 
29
- opts[:convert_options] = {all: "-quality 75 -strip"} if opts[:convert_options].blank?
40
+ opts[:convert_options] = Hancock::Gallery.config.default_convert_options if opts[:convert_options].blank?
30
41
 
31
42
  if opts[:styles].blank?
32
43
  styles_method_name = "#{name}_styles"
@@ -40,56 +51,87 @@ if Hancock.active_record?
40
51
  # validates_attachment name, content_type: content_type unless content_type.blank?
41
52
  validates_attachment_content_type name, content_type: /\Aimage\/.*\Z/ if is_image
42
53
 
43
- class_eval <<-EVAL
54
+ class_eval <<-RUBY
44
55
  def #{name}_file_name=(val)
45
56
  return self[:#{name}_file_name] = "" if val == ""
46
57
  return self[:#{name}_file_name] = nil if val == nil
47
58
  val = val.to_s
48
59
  extension = File.extname(val)[1..-1]
60
+ if extension.blank?
61
+ mime_type = MIME::Types[self.#{name}.content_type].first
62
+ extension = mime_type.extensions.first if mime_type
63
+ val = [val, extension].join(".") unless extension.blank?
64
+ end
49
65
  file_name = val[0..val.size-extension.size-1]
50
66
  self[:#{name}_file_name] = "\#{file_name.filename_to_slug}.\#{extension.filename_to_slug}"
51
67
  end
52
68
 
53
69
  def #{name}_svg?
54
- #{name}_content_type =~ /svg/
70
+ # !!(#{name}_content_type =~ /svg/)
71
+ #{name}.svg?
55
72
  end
56
73
 
57
- def #{name}_url(opts)
74
+ def #{name}_url(style=:original, opts = {})
58
75
  if #{name}_svg?
59
76
  #{name}.url
60
77
  else
61
- #{name}.url(opts)
78
+ #{name}.url(style, opts)
62
79
  end
63
80
  end
64
- EVAL
81
+
82
+ def reprocess_#{name}
83
+ return if self.#{name}.blank?
84
+ self.#{name}.reprocess! if File.exists?(self.#{name}.path)
85
+ end
86
+
87
+ def self.reprocess_all_#{name.to_s.pluralize}
88
+ self.all.map(&:reprocess_#{name})
89
+ end
90
+ RUBY
65
91
  if defined?(::PaperclipOptimizer)
66
- class_eval <<-EVAL
92
+ class_eval <<-RUBY
67
93
  before_#{name}_post_process do
68
94
  p_o = self.#{name}.processors.delete :paperclip_optimizer
69
95
  self.#{name}.processors << p_o if p_o
70
96
  true
71
97
  end
72
- EVAL
98
+ RUBY
73
99
  end
74
100
  jcrop_options ||= {}
75
101
  if jcrop_options
76
- class_eval <<-EVAL
102
+ class_eval <<-RUBY
77
103
  def #{name}_jcrop_options
78
104
  #{jcrop_options}
79
105
  end
80
- EVAL
106
+ RUBY
81
107
  end
82
108
  if styles_method_name
83
- class_eval <<-EVAL
109
+ class_eval <<-RUBY
84
110
  def #{styles_method_name}
85
111
  {
86
112
  thumb: '128x128'
87
113
  }
88
114
  end
89
- EVAL
115
+ RUBY
90
116
  end
91
117
 
92
118
  end
119
+
120
+ def paperclip_style_aliases_for(name, opts = {})
121
+ name = name.to_sym
122
+ _styles = opts[:styles]
123
+ _styles ||= self.send("#{name}_styles") if self.respond_to?("#{name}_styles")
124
+ _styles = _styles.keys if _styles.is_a?(Hash)
125
+ _styles.each do |_style|
126
+ class_eval <<-RUBY
127
+ def #{name}_url_#{_style}
128
+ #{name}.url(#{_style.to_sym})
129
+ end
130
+ RUBY
131
+ end
132
+
133
+ end
134
+
93
135
  end
94
136
  end
95
137
  end
@@ -8,13 +8,17 @@ module Hancock::Gallery::AutoCrop
8
8
  crop_area = [_width, _height].compact
9
9
  _default_method = opts.delete(:default_method) || :default_crop_params_for_center
10
10
 
11
+ attr_accessor "#{field}_autocropped".to_sym
11
12
  cattr_accessor "#{field}_default_max_crop_area".to_sym, "#{field}_default_auto_crop_method".to_sym
12
13
  self.send("#{field}_default_max_crop_area=".to_sym, crop_area)
13
14
  self.send("#{field}_default_auto_crop_method=".to_sym, _default_method.to_sym)
14
15
 
15
- class_eval <<-EVAL
16
+ class_eval <<-RUBY
16
17
  after_save :#{field}_auto_rails_admin_jcrop
17
18
  def #{field}_auto_rails_admin_jcrop
19
+ self.#{field}_autocropped = false if self.#{field}_autocropped == "0"
20
+ return if self.#{field}.blank? or !self.#{field}_updated_at_changed? or self.#{field}_autocropped
21
+ self.#{field}_autocropped = true
18
22
  auto_rails_admin_jcrop(:#{field})
19
23
  end
20
24
 
@@ -79,7 +83,7 @@ module Hancock::Gallery::AutoCrop
79
83
  end
80
84
  end
81
85
  end
82
- EVAL
86
+ RUBY
83
87
  end
84
88
 
85
89
  end
@@ -17,6 +17,13 @@ module Hancock::Gallery::Decorators
17
17
  # end
18
18
 
19
19
  ############# rails_admin ##############
20
+ # def self.rails_admin_name_synonyms
21
+ # ''.freeze #super
22
+ # end
23
+ # def self.rails_admin_navigation_icon
24
+ # ''.freeze
25
+ # end
26
+ #
20
27
  # def self.rails_admin_add_fields
21
28
  # [] #super
22
29
  # end
@@ -22,6 +22,13 @@ module Hancock::Gallery::Decorators
22
22
  # end
23
23
 
24
24
  ############# rails_admin ##############
25
+ # def self.rails_admin_name_synonyms
26
+ # "Photo Картинки Картинка Изображение Изображения".freeze
27
+ # end
28
+ # def self.rails_admin_navigation_icon
29
+ # 'icon-picture'.freeze
30
+ # end
31
+ #
25
32
  # def self.rails_admin_add_fields
26
33
  # [] #super
27
34
  # end
@@ -19,15 +19,27 @@ if Hancock.mongoid?
19
19
  end
20
20
 
21
21
  if is_image
22
- opts[:processors] ||= []
23
- opts[:processors] << :rails_admin_jcropper
24
- if defined?(::PaperclipOptimizer)
25
- opts[:processors] << :paperclip_optimizer
26
- opts[:processors].flatten!
27
- opts[:processors].uniq!
22
+ cattr_accessor "#{name}_default_processors".to_sym
23
+ instance_eval <<-RUBY
24
+ self.#{name}_default_processors = []
25
+ #{name}_default_processors << :rails_admin_jcropper
26
+ if defined?(::PaperclipOptimizer)
27
+ self.#{name}_default_processors << :paperclip_optimizer
28
+ self.#{name}_default_processors.flatten!
29
+ self.#{name}_default_processors.uniq!
30
+ end
31
+ RUBY
32
+ unless opts[:processors].is_a?(Proc)
33
+ opts[:processors] ||= []
34
+ opts[:processors] << :rails_admin_jcropper
35
+ if defined?(::PaperclipOptimizer)
36
+ opts[:processors] << :paperclip_optimizer
37
+ opts[:processors].flatten!
38
+ opts[:processors].uniq!
39
+ end
28
40
  end
29
41
 
30
- opts[:convert_options] = {all: "-quality 75 -strip"} if opts[:convert_options].blank?
42
+ opts[:convert_options] = Hancock::Gallery.config.default_convert_options if opts[:convert_options].blank?
31
43
 
32
44
  if opts[:styles].blank?
33
45
  styles_method_name = "#{name}_styles"
@@ -41,56 +53,88 @@ if Hancock.mongoid?
41
53
  # validates_attachment name, content_type: content_type unless content_type.blank?
42
54
  validates_attachment_content_type name, content_type: /\Aimage\/.*\Z/ if is_image
43
55
 
44
- class_eval <<-EVAL
56
+ class_eval <<-RUBY
45
57
  def #{name}_file_name=(val)
46
58
  return self[:#{name}_file_name] = "" if val == ""
47
59
  return self[:#{name}_file_name] = nil if val == nil
48
60
  val = val.to_s
49
61
  extension = File.extname(val)[1..-1]
62
+ if extension.blank?
63
+ mime_type = MIME::Types[self.#{name}.content_type].first
64
+ extension = mime_type.extensions.first if mime_type
65
+ val = [val, extension].join(".") unless extension.blank?
66
+ end
50
67
  file_name = val[0..val.size-extension.size-1]
51
68
  self[:#{name}_file_name] = "\#{file_name.filename_to_slug}.\#{extension.filename_to_slug}"
52
69
  end
53
70
 
54
71
  def #{name}_svg?
55
- #{name}_content_type =~ /svg/
72
+ # !!(#{name}_content_type =~ /svg/)
73
+ #{name}.svg?
56
74
  end
57
75
 
58
- def #{name}_url(opts)
76
+ def #{name}_url(style=:original, opts = {})
59
77
  if #{name}_svg?
60
78
  #{name}.url
61
79
  else
62
- #{name}.url(opts)
80
+ #{name}.url(style, opts)
63
81
  end
64
82
  end
65
- EVAL
83
+
84
+ def reprocess_#{name}
85
+ return if self.#{name}.blank?
86
+ self.#{name}.reprocess! if File.exists?(self.#{name}.path)
87
+ end
88
+
89
+ def self.reprocess_all_#{name.to_s.pluralize}
90
+ self.all.map(&:reprocess_#{name})
91
+ end
92
+ RUBY
66
93
  if defined?(::PaperclipOptimizer)
67
- class_eval <<-EVAL
94
+ class_eval <<-RUBY
68
95
  before_#{name}_post_process do
69
96
  p_o = self.#{name}.processors.delete :paperclip_optimizer
70
97
  self.#{name}.processors << p_o if p_o
71
98
  true
72
99
  end
73
- EVAL
100
+ RUBY
74
101
  end
75
102
  jcrop_options ||= {}
76
103
  if jcrop_options
77
- class_eval <<-EVAL
104
+ class_eval <<-RUBY
78
105
  def #{name}_jcrop_options
79
106
  #{jcrop_options}
80
107
  end
81
- EVAL
108
+ RUBY
82
109
  end
83
110
  if styles_method_name
84
- class_eval <<-EVAL
111
+ class_eval <<-RUBY
85
112
  def #{styles_method_name}
86
113
  {
87
114
  thumb: '128x128'
88
115
  }
89
116
  end
90
- EVAL
117
+ RUBY
91
118
  end
92
119
 
93
120
  end
121
+
122
+
123
+ def paperclip_style_aliases_for(name, opts = {})
124
+ name = name.to_sym
125
+ _styles = opts[:styles]
126
+ _styles ||= self.send("#{name}_styles") if self.respond_to?("#{name}_styles")
127
+ _styles = _styles.keys if _styles.is_a?(Hash)
128
+ _styles.each do |_style|
129
+ class_eval <<-RUBY
130
+ def #{name}_url_#{_style}
131
+ #{name}.url(#{_style.to_sym})
132
+ end
133
+ RUBY
134
+ end
135
+
136
+ end
137
+
94
138
  end
95
139
  end
96
140
  end