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
@@ -4,20 +4,51 @@ module Hancock::Gallery::Watermarkable
4
4
  module ClassMethods
5
5
  def paperclip_with_watermark(field = :image, original_image_class_name = "Hancock::Gallery::OriginalImage")
6
6
 
7
- attr_accessor "#{field}_autocropped".to_sym
7
+ attr_accessor "process_watermark_#{field}".to_sym
8
+
9
+ hancock_cms_attached_file field, processors: -> (instance) {
10
+ _processors = (instance.try("#{field}_default_processors") || []).dup
11
+ p_o = _processors.delete :paperclip_optimizer
12
+ if p_o
13
+ __processors = _processors.dup.uniq
14
+ _processors.clear
15
+ # _processors << :thumbnail
16
+ _processors << p_o
17
+ __processors.each do |p|
18
+ _processors << p
19
+ end
20
+ end
21
+
22
+ # p_w = _processors.delete :watermark
23
+ if ['1', 'true', 't', 'yes', 'y', true, 1, :true, :yes].include?(instance.try("process_watermark_#{field}"))
24
+ _processors << :watermark
25
+ end
26
+ _processors.uniq
27
+ }
8
28
 
9
- hancock_cms_attached_file field, processors: [:watermark]
10
29
  # field "original_#{field}", type: BSON::Binary
11
- has_one "original_#{field}_data", as: :originable, class_name: original_image_class_name
30
+ has_one "original_#{field}_data", as: :originable, class_name: original_image_class_name, dependent: :destroy
12
31
 
13
32
  class_eval %{
14
33
  def #{field}_auto_rails_admin_jcrop
34
+ self.#{field}_autocropped = false if self.#{field}_autocropped == "0"
15
35
  return if self.#{field}.blank? or !self.#{field}_updated_at_changed? or self.#{field}_autocropped
16
36
  self.#{field}_autocropped = true
17
37
 
18
38
  if File.exists?(self.#{field}.path)
19
39
  auto_rails_admin_jcrop(:#{field})
20
40
 
41
+ # original file in object`s original_image as file
42
+ elsif self.original_#{field}_data and !self.original_#{field}_data.image.blank?
43
+ _dir = File.dirname(self.#{field}.path)
44
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
45
+ File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
46
+ File.symlink(self.original_#{field}_data.image.path, self.#{field}.path)
47
+ self.class.skip_callback(:save, :after, "save_original_#{field}".to_sym)
48
+ self.#{field}.reprocess!
49
+ self.class.set_callback(:save, :after, "save_original_#{field}".to_sym)
50
+ File.unlink(self.#{field}.path)
51
+
21
52
  elsif (_data = self.original_#{field})
22
53
  _old_filename = self.#{field}_file_name
23
54
  if _data
@@ -25,6 +56,8 @@ module Hancock::Gallery::Watermarkable
25
56
  _temp = Tempfile.new(_old_filename)
26
57
  _temp.binmode
27
58
  _temp.write _data
59
+ _dir = File.dirname(self.#{field}.path)
60
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
28
61
  File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
29
62
  File.symlink(_temp.path, self.#{field}.path)
30
63
  # self.#{field} = _temp
@@ -32,65 +65,108 @@ module Hancock::Gallery::Watermarkable
32
65
  self.class.skip_callback(:save, :after, "original_#{field}_to_db".to_sym)
33
66
  auto_rails_admin_jcrop(:#{field})
34
67
  self.class.set_callback(:save, :after, "original_#{field}_to_db".to_sym)
68
+ File.unlink(self.#{field}.path)
35
69
  _temp.unlink
36
70
  end
37
71
  end
38
72
  end
39
73
 
40
- before_#{field}_post_process do
41
- p_o = self.#{field}.processors.delete :paperclip_optimizer
42
- # if p_o
43
- # _processors = self.#{field}.processors.dup
44
- # self.#{field}.processors.clear
45
- # self.#{field}.processors = [:thumbnail, p_o]
46
- # _processors.each do |p|
47
- # self.#{field}.processors << p
48
- # end
49
- # end
50
-
51
- p_w = self.#{field}.processors.delete :watermark
52
- self.#{field}.processors << p_w if p_w
53
-
54
- true
55
- end
74
+ # before_#{field}_post_process do
75
+ # p_o = self.#{field}.processors.delete :paperclip_optimizer
76
+ # if p_o
77
+ # _processors = self.#{field}.processors.dup
78
+ # self.#{field}.processors.clear
79
+ # # self.#{field}.processors << :thumbnail
80
+ # self.#{field}.processors << p_o
81
+ # _processors.each do |p|
82
+ # self.#{field}.processors << p
83
+ # end
84
+ # end
85
+ #
86
+ # p_w = self.#{field}.processors.delete :watermark
87
+ # if p_w and self.process_watermark_#{field}
88
+ # self.#{field}.processors << p_w
89
+ # end
90
+ # self.#{field}.processors.uniq!
91
+ #
92
+ #
93
+ # true
94
+ # end
56
95
 
57
96
  def original_#{field}
58
- original_#{field}_data.original if original_#{field}_data
97
+ original_#{field}_data and original_#{field}_data.original
59
98
  end
60
99
  def original_#{field}_base64
61
- _original = self.original_#{field}
62
- if _original
63
- _data = Base64.encode64(_original.data)
64
- _content_type = self.#{field}_content_type
65
- else
66
- _data = ''
67
- _content_type = 'jpg'
68
- end
69
- "data:\#{_content_type};base64,\#{_data}"
100
+ original_#{field}_data and original_#{field}_data.original_as_base64(self.#{field}_content_type)
101
+ end
102
+ def original_#{field}_image
103
+ original_#{field}_data and original_#{field}_data.original_as_image(self.#{field}_content_type)
70
104
  end
71
105
 
72
- after_save :original_#{field}_to_db
106
+ # after_save :original_#{field}_to_db
73
107
  def original_#{field}_to_db
74
- if self.#{field}_file_name
108
+ unless self.#{field}.blank?
75
109
  if File.exists?(self.#{field}.path)
76
110
  _original = self.original_#{field}_data
77
111
  unless _original
78
112
  _original = #{original_image_class_name}.new
79
113
  _original.originable = self
80
114
  end
115
+ _original.image = nil
81
116
  _original.original = BSON::Binary.new(File.binread(self.#{field}.path))
82
117
  if _original.save
83
118
  File.unlink(self.#{field}.path)
84
119
  end
85
120
  end
121
+ else
122
+ self.original_#{field}_data and self.original_#{field}_data.delete
86
123
  end
87
124
  end
88
125
 
126
+ after_save :save_original_#{field}
127
+ def save_original_#{field}
128
+ unless self.#{field}.blank?
129
+ if File.exists?(self.#{field}.path)
130
+ _original = self.original_#{field}_data
131
+ unless _original
132
+ _original = #{original_image_class_name}.new
133
+ _original.originable = self
134
+ end
135
+ _original.image = self.#{field}
136
+ _original.original = nil
137
+ if _original.save
138
+ File.unlink(self.#{field}.path) if File.exists?(self.#{field}.path)
139
+ end
140
+ end
141
+ else
142
+ self.original_#{field}_data and self.original_#{field}_data.delete
143
+ end
144
+ end
145
+
146
+ def reprocess_#{field}_with_watermark
147
+ self.process_watermark_#{field} = true
148
+ self.reprocess_#{field}
149
+ end
150
+
89
151
  def reprocess_#{field}
90
152
  return if self.#{field}.blank?
91
153
 
154
+ # original file in object
92
155
  if File.exists?(self.#{field}.path)
93
156
  self.#{field}.reprocess!
157
+
158
+ # original file in object`s original_image as file
159
+ elsif self.original_#{field}_data and !self.original_#{field}_data.image.blank?
160
+ _dir = File.dirname(self.#{field}.path)
161
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
162
+ File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
163
+ File.symlink(self.original_#{field}_data.image.path, self.#{field}.path)
164
+ self.class.skip_callback(:save, :after, "save_original_#{field}".to_sym)
165
+ self.#{field}.reprocess!
166
+ self.class.set_callback(:save, :after, "save_original_#{field}".to_sym)
167
+ File.unlink(self.#{field}.path)
168
+
169
+ # original file in object`s original_image as db field
94
170
  elsif (_data = self.original_#{field})
95
171
  _old_filename = self.#{field}_file_name
96
172
  if _data
@@ -98,15 +174,18 @@ module Hancock::Gallery::Watermarkable
98
174
  _temp = Tempfile.new(_old_filename)
99
175
  _temp.binmode
100
176
  _temp.write _data
177
+ _dir = File.dirname(self.#{field}.path)
178
+ FileUtils.mkdir_p(_dir) unless File.exists?(_dir)
101
179
  File.unlink(self.#{field}.path) if File.symlink?(self.#{field}.path)
102
180
  File.symlink(_temp.path, self.#{field}.path)
103
- self.#{field} = _temp
104
- self.#{field}.instance_write(:file_name, "\#{SecureRandom.hex}\#{File.extname(_old_filename)}")
181
+ # self.#{field} = _temp
182
+ # self.#{field}.instance_write(:file_name, "\#{SecureRandom.hex}\#{File.extname(_old_filename)}")
105
183
  self.class.skip_callback(:save, :after, "original_#{field}_to_db".to_sym)
106
184
  self.#{field}.reprocess!
107
185
  self.class.set_callback(:save, :after, "original_#{field}_to_db".to_sym)
108
186
  _temp.unlink
109
- self.save
187
+ File.unlink(self.#{field}.path)
188
+ # self.save
110
189
  end
111
190
  end
112
191
  end
@@ -7,9 +7,18 @@
7
7
  = form_tag nil, @form_options.merge({class: "form-horizontal denser"}) do
8
8
  - if File.exists?(@object.send(@field).path)
9
9
  = image_tag @object.send(@field).url, @image_tag_options
10
+ - elsif @object.respond_to?("original_#{@field}_data") and !@object.send("original_#{@field}_data").image.blank?
11
+ = image_tag @object.send("original_#{@field}_data").image.url, @image_tag_options
10
12
  - elsif @object.respond_to?("original_#{@field}_base64".to_sym)
11
13
  = image_tag @object.send("original_#{@field}_base64".to_sym), @image_tag_options
12
14
 
15
+
16
+ - if @object.respond_to?("process_watermark_#{@field}")
17
+ label{style='display: block; line-height: 40px;'}
18
+ - _html_attributes = {class: 'form-control'}
19
+ span{style='float: left'}= check_box_tag "process_watermark_#{@field}", true, _html_attributes
20
+ div{style='margin-left: 15px; '} Добавлять водяной знак?
21
+
13
22
  = hidden_field_tag :crop_x
14
23
  = hidden_field_tag :crop_y
15
24
  = hidden_field_tag :crop_w
@@ -0,0 +1,56 @@
1
+ - if field.jcrop_options.is_a?(Hash)
2
+ - rails_admin_jcrop_options = field.jcrop_options.to_json
3
+ - else
4
+ - _method = field.jcrop_options.to_sym
5
+ - if form.object.respond_to?(_method)
6
+ - rails_admin_jcrop_options = form.object.send(field.jcrop_options.to_sym).to_json
7
+ - else
8
+ - rails_admin_jcrop_options = {}
9
+
10
+ = stylesheet_link_tag 'rails_admin/jquery.Jcrop'
11
+ = stylesheet_link_tag 'rails_admin/ra.jcrop'
12
+ = javascript_include_tag 'rails_admin/jquery.Jcrop'
13
+ = javascript_include_tag 'rails_admin/ra.jcrop'
14
+
15
+ - file = form.object.send(field.method_name).presence
16
+
17
+ - _add_class = (field.pretty_value and !field.svg? ? "jcrop_data_value" : "")
18
+ .toggle{class="#{_add_class}" style=('display:none;' if file and field.delete_method and form.object.send(field.delete_method) == '1')}
19
+ - if value = field.pretty_value
20
+ .preview
21
+ - unless field.svg?
22
+ .title_link_hint= "Обрезать"
23
+ .image_block
24
+ = value
25
+ = form.file_field(field.name, field.html_attributes.reverse_merge({data: {fileupload: true, rails_admin_jcrop_options: rails_admin_jcrop_options } }))
26
+
27
+ - model_name = form.object.class.to_param.gsub("::", "~").underscore
28
+ - url = jcrop_path(model_name: model_name, modal: true, id: form.object.id, field: field.name, fit_image: field.fit_image)
29
+ - link_data = {link: url, thumb: field.thumb_method || "original"}
30
+ = link_to 'Edit Image', '#', data: link_data, style: 'display:none', class: "jcrop_handle"
31
+
32
+ - if field.try(:process_watermark_toggler)
33
+ label{style='display: block;'}
34
+ - _html_attributes = {checked: field.process_watermark_default, class: 'form-control'}
35
+ span{style='float: left'}= form.check_box field.process_watermark_toggler_method, _html_attributes
36
+ div{style='margin-left: 35px; line-height: 40px;'} Добавлять водяной знак?
37
+
38
+
39
+ - if field.cancel_perform_autocrop_method
40
+ label{style='display: block;'}
41
+ - _html_attributes = {class: 'form-control'}
42
+ span{style='float: left'}= form.check_box field.cancel_perform_autocrop_method, _html_attributes
43
+ div{style='margin-left: 35px; line-height: 40px;'} Отменить автоматическую обрезку
44
+
45
+
46
+ - if field.optional? and field.errors.blank? and file and field.delete_method
47
+ - onclick = "$(this).siblings('[type=checkbox]').click(); $(this).siblings('.toggle').toggle('slow'); jQuery(this).toggleClass('btn-danger btn-info'); return false;"
48
+ br
49
+ = link_to "#", data: {toggle:'button'}, onclick: onclick, class: "btn btn-info" do
50
+ i.icon-white.icon-trash
51
+ = "#{I18n.t('admin.actions.delete.menu').capitalize} #{field.method_name}"
52
+
53
+ = form.check_box field.delete_method, style: 'display:none;'
54
+ br
55
+ - if field.cache_method
56
+ = form.hidden_field field.cache_method
@@ -1,23 +1,3 @@
1
- Hancock.rails_admin_configure do |config|
2
- config.action_visible_for :nested_set, 'Hancock::Gallery::Gallery'
3
- config.action_visible_for :nested_set, 'Hancock::Gallery::Image'
4
-
5
- if defined?(RailsAdminComments)
6
- config.action_visible_for :comments, 'Hancock::Gallery::Gallery'
7
- config.action_visible_for :comments, 'Hancock::Gallery::Image'
8
-
9
- config.action_visible_for :model_comments, 'Hancock::Gallery::Gallery'
10
- config.action_visible_for :model_comments, 'Hancock::Gallery::Image'
11
- end
12
-
13
- if defined?(RailsAdminMultipleFileUpload)
14
- if true or Hancock::Catalog.active_record?
15
- config.action_visible_for :multiple_file_upload, 'Hancock::Gallery::Gallery'
16
- config.action_visible_for :multiple_file_upload_collection, 'Hancock::Gallery::Image'
17
- end
18
- end
19
- end
20
-
21
1
  if defined?(RailsAdmin)
22
2
  RailsAdmin.config do |config|
23
3
  config.excluded_models ||= []
@@ -30,8 +30,8 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "bundler", "~> 1.10"
31
31
  spec.add_development_dependency "rake", "~> 10.0"
32
32
 
33
- spec.add_dependency 'hancock_cms', [">=1.0", "<=2.0"]
34
- # spec.add_dependency 'hancock_cms', ["~> 1.0", "~> 2.0"]
33
+ spec.add_dependency 'hancock_cms', [">=1.0.2", "<2.1.x"]
34
+ # spec.add_dependency 'hancock_cms', ["~> 1.0.2", "~> 2.1.x"]
35
35
 
36
36
  spec.add_dependency 'ack_rails_admin_jcrop', '~> 0.2.0'
37
37
  end
@@ -2,8 +2,14 @@ Hancock::Gallery.configure do |config|
2
2
  ##### defaults #####
3
3
  # config.localize = Hancock.config.localize
4
4
  #
5
+ # config.cache_support = defined?(Hancock::Cache)
6
+ #
5
7
  # config.model_settings_support = defined?(RailsAdminModelSettings)
6
8
  # config.user_abilities_support = defined?(RailsAdminUserAbilities)
7
9
  # config.ra_comments_support = defined?(RailsAdminComments)
8
10
  # config.watermark_support = defined?(PaperclipWatermark)
11
+ #
12
+ # config.original_image_hash_secret = Rails.application.secrets.secret_key_base
13
+ #
14
+ # config.default_convert_options = {all: ["-quality", "75", "-strip"]}
9
15
  end
@@ -2,7 +2,7 @@ require 'rails/generators'
2
2
  require 'rails/generators/active_record'
3
3
 
4
4
  module Hancock::Gallery
5
- class MigrationGenerator < Rails::Generators::Base
5
+ class MigrationsGenerator < Rails::Generators::Base
6
6
  include ActiveRecord::Generators::Migration
7
7
  source_root File.expand_path('../templates', __FILE__)
8
8
 
@@ -37,7 +37,7 @@ module Hancock::Gallery::Models
37
37
  end
38
38
 
39
39
  def camelcased_class_name
40
- gallery_class_name.camelcase
40
+ class_name.camelcase
41
41
  end
42
42
 
43
43
  def underscored_image_class_name
@@ -28,19 +28,19 @@ class <%= camelcased_class_name %> < Hancock::Gallery::EmbeddedImage
28
28
  super(config)
29
29
  end
30
30
 
31
- def admin_can_user_defined_actions
31
+ def self.admin_can_user_defined_actions
32
32
  [].freeze
33
33
  end
34
- def admin_cannot_user_defined_actions
34
+ def self.admin_cannot_user_defined_actions
35
35
  [].freeze
36
36
  end
37
- def manager_can_user_defined_actions
37
+ def self.manager_can_user_defined_actions
38
38
  [].freeze
39
39
  end
40
- def manager_cannot_user_defined_actions
40
+ def self.manager_cannot_user_defined_actions
41
41
  [].freeze
42
42
  end
43
- def rails_admin_user_defined_visible_actions
43
+ def self.rails_admin_user_defined_visible_actions
44
44
  [].freeze
45
45
  end
46
46
 
@@ -17,6 +17,13 @@ class <%= camelcased_class_name %> < Hancock::Gallery::Gallery
17
17
  # end
18
18
 
19
19
  ############# rails_admin ##############
20
+ # def self.rails_admin_name_synonyms
21
+ # 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
@@ -25,19 +32,19 @@ class <%= camelcased_class_name %> < Hancock::Gallery::Gallery
25
32
  super(config)
26
33
  end
27
34
 
28
- def admin_can_user_defined_actions
35
+ def self.admin_can_user_defined_actions
29
36
  [].freeze
30
37
  end
31
- def admin_cannot_user_defined_actions
38
+ def self.admin_cannot_user_defined_actions
32
39
  [].freeze
33
40
  end
34
- def manager_can_user_defined_actions
41
+ def self.manager_can_user_defined_actions
35
42
  [].freeze
36
43
  end
37
- def manager_cannot_user_defined_actions
44
+ def self.manager_cannot_user_defined_actions
38
45
  [].freeze
39
46
  end
40
- def rails_admin_user_defined_visible_actions
47
+ def self.rails_admin_user_defined_visible_actions
41
48
  [].freeze
42
49
  end
43
50
 
@@ -17,6 +17,13 @@ class <%= camelcased_class_name %> < Hancock::Gallery::Image
17
17
  # end
18
18
 
19
19
  ############# rails_admin ##############
20
+ # def self.rails_admin_name_synonyms
21
+ # super
22
+ # end
23
+ # def self.rails_admin_navigation_icon
24
+ # 'icon-picture'.freeze
25
+ # end
26
+
20
27
  def self.rails_admin_add_fields
21
28
  super
22
29
  end
@@ -25,19 +32,19 @@ class <%= camelcased_class_name %> < Hancock::Gallery::Image
25
32
  super(config)
26
33
  end
27
34
 
28
- def admin_can_user_defined_actions
35
+ def self.admin_can_user_defined_actions
29
36
  [].freeze
30
37
  end
31
- def admin_cannot_user_defined_actions
38
+ def self.admin_cannot_user_defined_actions
32
39
  [].freeze
33
40
  end
34
- def manager_can_user_defined_actions
41
+ def self.manager_can_user_defined_actions
35
42
  [].freeze
36
43
  end
37
- def manager_cannot_user_defined_actions
44
+ def self.manager_cannot_user_defined_actions
38
45
  [].freeze
39
46
  end
40
- def rails_admin_user_defined_visible_actions
47
+ def self.rails_admin_user_defined_visible_actions
41
48
  [].freeze
42
49
  end
43
50