blacksand 2.2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +27 -0
  4. data/app/assets/javascripts/blacksand/dashboard/navigations.form.js.erb +34 -0
  5. data/app/assets/javascripts/blacksand/dashboard/navigations.index.js +18 -0
  6. data/app/assets/javascripts/blacksand/dashboard/pages.form.js.erb +69 -0
  7. data/app/assets/javascripts/blacksand/dashboard/pages.index.js +17 -0
  8. data/app/assets/javascripts/blacksand/dashboard.js +14 -0
  9. data/app/assets/javascripts/blacksand/ie.js +2 -0
  10. data/app/assets/javascripts/bootstrap-datepicker.zh-CN.js +20 -0
  11. data/app/assets/stylesheets/blacksand/dashboard.scss +26 -0
  12. data/app/controllers/blacksand/dashboard/base_controller.rb +35 -0
  13. data/app/controllers/blacksand/dashboard/navigations_controller.rb +88 -0
  14. data/app/controllers/blacksand/dashboard/pages_controller.rb +176 -0
  15. data/app/controllers/blacksand/dashboard/prototypes_controller.rb +12 -0
  16. data/app/controllers/blacksand/dashboard/templates_controller.rb +8 -0
  17. data/app/controllers/blacksand/dashboard/users_controller.rb +78 -0
  18. data/app/controllers/blacksand_front/pages_controller.rb +17 -0
  19. data/app/helpers/blacksand/application_helper.rb +42 -0
  20. data/app/helpers/blacksand/page_helper.rb +11 -0
  21. data/app/helpers/blacksand_front/pages_helper.rb +20 -0
  22. data/app/models/blacksand/field.rb +35 -0
  23. data/app/models/blacksand/navigation.rb +24 -0
  24. data/app/models/blacksand/page.rb +194 -0
  25. data/app/models/blacksand/picture.rb +7 -0
  26. data/app/models/blacksand/property/as_array.rb +5 -0
  27. data/app/models/blacksand/property/file.rb +5 -0
  28. data/app/models/blacksand/property/gallery.rb +7 -0
  29. data/app/models/blacksand/property/slide.rb +5 -0
  30. data/app/models/blacksand/property.rb +76 -0
  31. data/app/models/blacksand/prototype.rb +11 -0
  32. data/app/models/blacksand/template.rb +9 -0
  33. data/app/models/kindeditor/asset.rb +14 -0
  34. data/app/models/kindeditor/file.rb +3 -0
  35. data/app/models/kindeditor/flash.rb +3 -0
  36. data/app/models/kindeditor/image.rb +3 -0
  37. data/app/models/kindeditor/media.rb +3 -0
  38. data/app/uploaders/blacksand/base_uploader.rb +16 -0
  39. data/app/uploaders/blacksand/file_uploader.rb +4 -0
  40. data/app/uploaders/blacksand/image_uploader.rb +78 -0
  41. data/app/uploaders/blacksand/slide_image_uploader.rb +66 -0
  42. data/app/views/blacksand/dashboard/navigations/_form.html.erb +23 -0
  43. data/app/views/blacksand/dashboard/navigations/edit.html.erb +3 -0
  44. data/app/views/blacksand/dashboard/navigations/index.html.erb +40 -0
  45. data/app/views/blacksand/dashboard/navigations/index.json.jbuilder +4 -0
  46. data/app/views/blacksand/dashboard/navigations/new.html.erb +3 -0
  47. data/app/views/blacksand/dashboard/navigations/reorder.js.erb +1 -0
  48. data/app/views/blacksand/dashboard/navigations/show.html.erb +4 -0
  49. data/app/views/blacksand/dashboard/navigations/show.json.jbuilder +1 -0
  50. data/app/views/blacksand/dashboard/pages/_fields.html.erb +89 -0
  51. data/app/views/blacksand/dashboard/pages/_form.html.erb +26 -0
  52. data/app/views/blacksand/dashboard/pages/_manage_list.html.erb +123 -0
  53. data/app/views/blacksand/dashboard/pages/_picture_fields.html.erb +18 -0
  54. data/app/views/blacksand/dashboard/pages/children_partial.js.erb +14 -0
  55. data/app/views/blacksand/dashboard/pages/edit.html.erb +20 -0
  56. data/app/views/blacksand/dashboard/pages/index.html.erb +27 -0
  57. data/app/views/blacksand/dashboard/pages/new.html.erb +20 -0
  58. data/app/views/blacksand/dashboard/pages/onchange_render.js.erb +14 -0
  59. data/app/views/blacksand/dashboard/pages/search.json.jbuilder +7 -0
  60. data/app/views/blacksand/dashboard/pages/show.html.erb +34 -0
  61. data/app/views/blacksand/dashboard/prototypes/index.html.erb +15 -0
  62. data/app/views/blacksand/dashboard/prototypes/show.html.erb +31 -0
  63. data/app/views/blacksand/dashboard/templates/index.html.erb +17 -0
  64. data/app/views/blacksand/dashboard/users/_form.html.erb +40 -0
  65. data/app/views/blacksand/dashboard/users/edit.html.erb +47 -0
  66. data/app/views/blacksand/dashboard/users/index.html.erb +37 -0
  67. data/app/views/blacksand/dashboard/users/index.json.jbuilder +4 -0
  68. data/app/views/blacksand/dashboard/users/new.html.erb +4 -0
  69. data/app/views/blacksand/dashboard/users/show.html.erb +2 -0
  70. data/app/views/blacksand/dashboard/users/show.json.jbuilder +1 -0
  71. data/app/views/layouts/blacksand/_navbar.html.erb +42 -0
  72. data/app/views/layouts/blacksand/dashboard.html.erb +33 -0
  73. data/config/locales/kaminari.zh-CN.yml +17 -0
  74. data/config/locales/nestable.zh-CN.yml +14 -0
  75. data/config/locales/zh-CN.yml +69 -0
  76. data/config/routes.rb +31 -0
  77. data/db/migrate/20151112055035_create_templates.rb +10 -0
  78. data/db/migrate/20151112055425_create_prototypes.rb +9 -0
  79. data/db/migrate/20151112055438_create_fields.rb +14 -0
  80. data/db/migrate/20151112055821_create_pages.rb +15 -0
  81. data/db/migrate/20151112060015_create_properties.rb +15 -0
  82. data/db/migrate/20151112060605_create_navigations.rb +13 -0
  83. data/db/migrate/20151209022305_create_kindeditor_assets.rb +17 -0
  84. data/db/migrate/20160513080702_create_pictures.rb +12 -0
  85. data/db/migrate/20170104014706_add_values_to_properties.rb +5 -0
  86. data/db/migrate/20170310092041_add_owner_type_to_kindeditor_asset.rb +5 -0
  87. data/db/migrate/20170322021913_add_options_to_template_and_prototype.rb +6 -0
  88. data/lib/blacksand/caching_pages.rb +16 -0
  89. data/lib/blacksand/cancancan.rb +19 -0
  90. data/lib/blacksand/controller_helper.rb +21 -0
  91. data/lib/blacksand/engine.rb +69 -0
  92. data/lib/blacksand/expire_pages.rb +21 -0
  93. data/lib/blacksand/my_json_type.rb +61 -0
  94. data/lib/blacksand/routing.rb +11 -0
  95. data/lib/blacksand/version.rb +3 -0
  96. data/lib/blacksand.rb +53 -0
  97. data/lib/generators/blacksand/install_generator.rb +30 -0
  98. data/lib/generators/blacksand/new_site_generator.rb +28 -0
  99. data/lib/tasks/blacksand_tasks.rake +72 -0
  100. data/lib/tasks/carrierwave_storage_migrate_to_qiniu.rake +25 -0
  101. metadata +541 -0
@@ -0,0 +1,42 @@
1
+ module Blacksand
2
+ module ApplicationHelper
3
+
4
+ def paginate objects, options = {}
5
+ options.reverse_merge!(theme: 'twitter-bootstrap-3')
6
+
7
+ super(objects, options)
8
+ end
9
+
10
+ def filed_options(f)
11
+ filed_options = {}
12
+ case f.object.field.field_type
13
+ when 'date' then
14
+ filed_options = {data: {provide: 'datepicker', 'date-format' => 'yyyy-mm-dd', 'date-language' => 'zh-CN', 'date-autoclose' => true}}
15
+ when 'gallery' then
16
+ filed_options = {multiple: true}
17
+ when 'page' then
18
+ filed_options = { class: 'test', data: {provide: 'select2'} }
19
+ end
20
+ return filed_options.merge({label: "#{f.object.field.description}", label_class: "#{'required' if f.object.field.required?}"})
21
+ end
22
+
23
+ def select_choices(f)
24
+ if f.object.value.present?
25
+ page = f.object.content
26
+ [['无', ''], ["##{page.id} #{page.title}", f.object.value]]
27
+ else
28
+ [['无', '']]
29
+ end
30
+ end
31
+
32
+ def set_page_options(hash)
33
+ @_page_options ||= {}
34
+ @_page_options.merge!(hash)
35
+ end
36
+
37
+ def page_options
38
+ @_page_options || {}
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ module Blacksand
2
+ module PageHelper
3
+ def url_for_page(page)
4
+ if page.new_record?
5
+ pages_path(page)
6
+ else
7
+ page_path(page)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ module BlacksandFront
2
+ module PagesHelper
3
+ def page(en_name)
4
+ Blacksand::Page.where(en_name: en_name).first
5
+ end
6
+
7
+ def textarea2html(text)
8
+ text.split(' ').join('<br>').html_safe if text.present?
9
+ end
10
+
11
+ def set_page_options(hash)
12
+ @_page_options ||= {}
13
+ @_page_options.merge!(hash)
14
+ end
15
+
16
+ def page_options
17
+ @_page_options || {}
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,35 @@
1
+ module Blacksand
2
+ class Field < ActiveRecord::Base
3
+ extend Enumerize
4
+
5
+ belongs_to :prototype
6
+ has_many :properties, dependent: :destroy
7
+
8
+ validates :name, :description, :field_type, presence: true
9
+ validates :options, presence: true, if: 'select?'
10
+
11
+ enumerize :field_type, in: %w{date number string textarea rich_text image gallery array slide file select page}
12
+
13
+ default_scope { order(:id) }
14
+
15
+ after_save :check_properties
16
+
17
+ protected
18
+
19
+ def select?
20
+ field_type == 'select'
21
+ end
22
+
23
+ def check_properties
24
+ # 根据 prototype 查询 page 会更高效 @gaohui 2015.11.25
25
+ self.prototype.pages.find_each do |page|
26
+ (self.prototype.fields.map(&:id) - page.properties.map(&:field_id)).each do |field_id|
27
+ field = Field.find field_id
28
+ Property.build_property(page, field)
29
+ end
30
+ page.save(validate: false)
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,24 @@
1
+ module Blacksand
2
+ class Navigation < ActiveRecord::Base
3
+ belongs_to :page
4
+
5
+ # ActiveRecord attribute api changed, see http://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute
6
+ if ActiveRecord::VERSION::MAJOR >= 5
7
+ attribute :options, :json_type
8
+ else
9
+ attribute :options, MyJsonType.new
10
+ end
11
+
12
+ validates :name, presence: true
13
+ validates :url, format: {with: URI.regexp}, if: Proc.new { |a| a.url.present? }
14
+
15
+ validate :url_or_page_presence
16
+
17
+ def url_or_page_presence
18
+ if url.blank? && page_id.blank?
19
+ errors.add(:url, "链接或者页面两个必须要填一项")
20
+ errors.add(:page_id, "链接或者页面两个必须要填一项")
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,194 @@
1
+ require 'uri'
2
+
3
+ module Blacksand
4
+ class Page < ActiveRecord::Base
5
+ belongs_to :parent, class_name: Page, foreign_key: 'parent_id'
6
+ has_many :children, class_name: Page, foreign_key: 'parent_id', :dependent => :destroy
7
+ has_one :navigation, :dependent => :destroy
8
+
9
+ belongs_to :template
10
+ belongs_to :prototype
11
+
12
+ has_many :properties, :dependent => :destroy
13
+ has_many_kindeditor_assets :attachments, :dependent => :destroy
14
+
15
+ accepts_nested_attributes_for :properties
16
+
17
+ has_many :positioned_children, -> { order(:position) }, class_name: 'Page', foreign_key: 'parent_id'
18
+
19
+ # validates :title, :template, presence: true
20
+
21
+ # 在新建页面的时候,上传的图片没有 owner_id 和 owner_type
22
+ # TODO: 还有一种情况是在新建页面的时候,图片上传上来后又被删除了。这时候图片就变成没有人认领的孤儿了。
23
+ after_commit :set_owner_for_kindeditor_assets, on: :create
24
+
25
+ # 在编辑的过程中可能从内容中删除了部分图片, 但是 Kinkeditor::Assets 还没有被删除
26
+ after_commit :clean_unsued_kindeditor_assets, on: :update
27
+
28
+ # page.props.name
29
+ # page.props[:name]
30
+ def props
31
+ if @attrs.blank?
32
+ properties = self.properties.includes(:field).map { |p| [p.field.name, p.content] }
33
+ @attrs = OpenStruct.new(Hash[properties])
34
+ end
35
+
36
+ @attrs
37
+ end
38
+
39
+ # 推荐使用 props 方法 @gaohui 2015.11.26
40
+ def values
41
+ if @values.blank?
42
+ @values = ActiveSupport::HashWithIndifferentAccess.new
43
+ self.properties.each do |p|
44
+ @values[p.field.name] = p.content
45
+ end
46
+ end
47
+
48
+ @values
49
+ end
50
+
51
+ def ancestors
52
+ if self.parent.present?
53
+ self.parent.ancestors + [self.parent]
54
+ else
55
+ []
56
+ end
57
+ end
58
+
59
+ def descendents
60
+ self.positioned_children.reduce([]) do |all, child|
61
+ all << child
62
+ all.concat(child.descendents)
63
+ all
64
+ end
65
+ end
66
+
67
+ def child(title)
68
+ self.children.where(title: title).first
69
+ end
70
+
71
+ def child_with(conditions)
72
+ self.children.find_by(conditions)
73
+ end
74
+
75
+ def content_first_image
76
+ image_assets = image_assets_of_content
77
+
78
+ return if image_assets.empty?
79
+
80
+ asset_name = image_assets.first
81
+ Kindeditor::Asset.where(asset: asset_name).first
82
+ end
83
+
84
+ def all_image_srcs_of_content
85
+ html_doc = Nokogiri::HTML(self.content)
86
+ images = html_doc.xpath("//img")
87
+ images.map{|img| img['src'] }
88
+ end
89
+
90
+ def preferred_child_template_name
91
+ preferred_option('preferred_child_template_name')
92
+ end
93
+
94
+ def preferred_child_prototype_name
95
+ preferred_option('preferred_child_prototype_name')
96
+ end
97
+
98
+ def tree_node
99
+ href = Blacksand::Engine.routes.url_helpers.children_partial_pages_path(parent_id: self.id)
100
+
101
+ return {text: self.title, href: href, page_id: self.id} if self.children.count == 0
102
+
103
+ # children 多余 15 个且都是叶子节点, 那么子节点不显示
104
+ if self.children.count >= 15 && self.children.limit(15).all? { |p| p.children.empty? }
105
+ {
106
+ text: self.title,
107
+ href: href,
108
+ page_id: self.id
109
+ }
110
+ else
111
+ {
112
+ text: self.title,
113
+ href: href,
114
+ page_id: self.id,
115
+ nodes: self.children.order(:position).map { |p| p.tree_node },
116
+ }
117
+ end
118
+
119
+ end
120
+
121
+ def build_properties
122
+ self.prototype.fields.each do |field|
123
+ Property.build_property(self, field)
124
+ end
125
+ end
126
+
127
+ def self.tree_nodes(page_ids = nil)
128
+ if page_ids
129
+ Page.where(id: page_ids).order(:position).map { |p| p.tree_node }
130
+ else
131
+ Page.where('parent_id is null').order(:position).map { |p| p.tree_node }
132
+ end
133
+ end
134
+
135
+ def self.selectNode(nodes, page_id)
136
+ nodes.each do |node|
137
+ if node[:page_id] == page_id
138
+ node.merge!(state: {selected: true})
139
+ return
140
+ end
141
+
142
+ selectNode(node[:nodes], page_id) if node[:nodes].present?
143
+ end
144
+ end
145
+
146
+
147
+ def self.query_value(name, value)
148
+ joins(properties: :field).where(fields: {name: name}, properties: {value: value})
149
+ end
150
+
151
+ protected
152
+
153
+ def set_owner_for_kindeditor_assets
154
+ image_assets = image_assets_of_content
155
+
156
+ image_assets.each do |asset_name|
157
+ asset = Kindeditor::Asset.where(asset: asset_name, owner_id: 0).first
158
+ asset.update(owner_id: self.id, owner_type: self.class.name) if asset.present?
159
+ end
160
+ end
161
+
162
+ def clean_unsued_kindeditor_assets
163
+ image_assets = image_assets_of_content
164
+ exists_image_assets = self.attachments.to_a.select { |asset| asset.asset_type == 'image' }.map { |a| File.basename(a.asset.path) }
165
+
166
+ redundant_image_assets = exists_image_assets - image_assets
167
+ Kindeditor::Asset.where('asset in (?)', redundant_image_assets).destroy_all
168
+ end
169
+
170
+ # 返回内容中所有上传的图片
171
+ def image_assets_of_content
172
+ srcs = all_image_srcs_of_content.select do |src|
173
+ # 本地上传的文件
174
+ if src.start_with? "/#{RailsKindeditor.upload_store_dir}"
175
+ true
176
+ # 有可能是与存储
177
+ elsif src.start_with?("http") && URI(src).path.start_with?("/#{RailsKindeditor.upload_store_dir}")
178
+ true
179
+ else
180
+ false
181
+ end
182
+ end
183
+ srcs.map { |src| File.basename(src) }
184
+ end
185
+
186
+ def preferred_option(key)
187
+ if self.template && self.template.options.present? && self.template.options[key]
188
+ self.template.options[key]
189
+ elsif self.prototype && self.prototype.options.present? && self.prototype.options[key]
190
+ self.prototype.options[key]
191
+ end
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,7 @@
1
+ module Blacksand
2
+ class Picture < ActiveRecord::Base
3
+ mount_uploader :file, Blacksand::ImageUploader
4
+
5
+ belongs_to :imageable, polymorphic: true
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Blacksand
2
+ class Property::AsArray < Property
3
+ serialize :values, Array
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Blacksand
2
+ class Property::File < Property
3
+ mount_uploader :file, Blacksand::FileUploader
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Blacksand
2
+ class Property::Gallery < Property
3
+ has_many :pictures, as: :imageable, class_name: 'Blacksand::Picture', dependent: :destroy
4
+
5
+ accepts_nested_attributes_for :pictures, reject_if: :all_blank, allow_destroy: true
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ module Blacksand
2
+ class Property::Slide < Property
3
+ mount_uploader :image, Blacksand::SlideImageUploader
4
+ end
5
+ end
@@ -0,0 +1,76 @@
1
+ module Blacksand
2
+ class Property < ActiveRecord::Base
3
+ include ActionView::Helpers::TextHelper
4
+
5
+ mount_uploader :image, Blacksand::ImageUploader
6
+
7
+ # Disable this feature. It's not available in release.
8
+ # ref: https://github.com/carrierwaveuploader/carrierwave/issues/1545
9
+ #
10
+ # mount_uploaders :gallery, ImageUploader
11
+
12
+ belongs_to :page
13
+ belongs_to :field
14
+ default_scope { order(:field_id) }
15
+
16
+ validate :check_field_required
17
+
18
+ def check_field_required
19
+ case (self.field.field_type)
20
+ when 'image', 'slide' then
21
+ errors.add(:image, "#{field.description}不能为空") if field.required? && !image.present?
22
+ when 'gallery' then
23
+ errors.add(:gallery, "#{field.description}不能为空") if field.required? && !pictures.any?
24
+ when 'file' then
25
+ errors.add(:file, "#{field.description}不能为空") if field.required? && !file.present?
26
+ when 'array' then
27
+ errors.add(:values, "#{field.description}不能为空") if field.required? && !values.present?
28
+ else
29
+ errors.add(:value, "#{field.description}不能为空") if field.required? && !value.present?
30
+ end
31
+ end
32
+
33
+ def content
34
+ case (self.field.field_type)
35
+ when 'textarea'
36
+ simple_format(self.value)
37
+ when 'image', 'slide' then
38
+ self.image
39
+ when 'gallery' then
40
+ self.pictures
41
+ when 'file' then
42
+ self.file
43
+ when 'page' then
44
+ Page.find_by(id: self.value)
45
+ when 'array' then
46
+ self.values
47
+ else
48
+ self.value
49
+ end
50
+ end
51
+
52
+ def as_subtype
53
+ return if self.value.blank?
54
+
55
+ case self.field.field_type
56
+ when 'date' then
57
+ Date.strptime(self.value, '%F')
58
+ when 'array' then
59
+ self.values
60
+ else
61
+ self.value
62
+ end
63
+ end
64
+
65
+ def self.build_property(page, field)
66
+ if field.field_type.in? %w[file slide gallery]
67
+ page.properties.build(field: field, type: "Blacksand::Property::#{field.field_type.capitalize}")
68
+ elsif field.field_type == 'array'
69
+ page.properties.build(field: field, type: "Blacksand::Property::As#{field.field_type.capitalize}")
70
+ else
71
+ page.properties.build(field: field)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,11 @@
1
+ module Blacksand
2
+ class Prototype < ActiveRecord::Base
3
+ store_accessor :options, :preferred_child_template_name, :preferred_child_prototype_name
4
+
5
+ has_many :fields, dependent: :destroy
6
+
7
+ accepts_nested_attributes_for :fields
8
+
9
+ has_many :pages, dependent: :nullify
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module Blacksand
2
+ class Template < ActiveRecord::Base
3
+ store_accessor :options, :preferred_child_template_name, :preferred_child_prototype_name
4
+
5
+ validates :name, :path, presence: true
6
+
7
+ has_many :pages, dependent: :nullify
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ class Kindeditor::Asset < ActiveRecord::Base
2
+ self.table_name = 'kindeditor_assets'
3
+ mount_uploader :asset, Kindeditor::AssetUploader
4
+ validates_presence_of :asset
5
+ before_save :update_asset_attributes
6
+
7
+ private
8
+ def update_asset_attributes
9
+ if asset.present? && asset_changed?
10
+ self.file_size = asset.file.size
11
+ self.file_type = asset.file.content_type
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ class Kindeditor::File < Kindeditor::Asset
2
+ mount_uploader :asset, Kindeditor::FileUploader
3
+ end
@@ -0,0 +1,3 @@
1
+ class Kindeditor::Flash < Kindeditor::Asset
2
+ mount_uploader :asset, Kindeditor::FlashUploader
3
+ end
@@ -0,0 +1,3 @@
1
+ class Kindeditor::Image < Kindeditor::Asset
2
+ mount_uploader :asset, Kindeditor::ImageUploader
3
+ end
@@ -0,0 +1,3 @@
1
+ class Kindeditor::Media < Kindeditor::Asset
2
+ mount_uploader :asset, Kindeditor::MediaUploader
3
+ end
@@ -0,0 +1,16 @@
1
+ module Blacksand
2
+ class BaseUploader < ::CarrierWave::Uploader::Base
3
+ include ::CarrierWave::MiniMagick
4
+
5
+ def self.storage_from_config
6
+ Blacksand.carrierwave_storage
7
+ end
8
+
9
+ storage storage_from_config
10
+
11
+ # TODO: config store_dir prefix
12
+ def store_dir
13
+ "#{Blacksand.carrierwave_store_dir_prefix}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,4 @@
1
+ module Blacksand
2
+ class FileUploader < BaseUploader
3
+ end
4
+ end
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+
3
+ module Blacksand
4
+ class ImageUploader < BaseUploader
5
+
6
+ # Include RMagick or MiniMagick support:
7
+ # include CarrierWave::RMagick
8
+ # include CarrierWave::MiniMagick
9
+
10
+ # Choose what kind of storage to use for this uploader:
11
+ # storage :file
12
+ # storage :fog
13
+
14
+ # Override the directory where uploaded files will be stored.
15
+ # This is a sensible default for uploaders that are meant to be mounted:
16
+ # def store_dir
17
+ # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
18
+ # end
19
+
20
+ # Provide a default URL as a default if there hasn't been a file uploaded:
21
+ # def default_url
22
+ # # For Rails 3.1+ asset pipeline compatibility:
23
+ # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
24
+ #
25
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
26
+ # end
27
+
28
+ # Process files as they are uploaded:
29
+ # process scale: [200, 300]
30
+ #
31
+ # def scale(width, height)
32
+ # # do something
33
+ # end
34
+
35
+ # Create different versions of your uploaded files:
36
+ # version :thumb do
37
+ # process resize_to_fit: [50, 50]
38
+ # end
39
+
40
+ # version :thumb do
41
+ # process :resize_to_fill => [200, 200]
42
+ # end
43
+ #
44
+ # version :thumb_resize_and_pad do
45
+ # process :resize_and_pad => [200, 200]
46
+ # end
47
+ #
48
+ # version :small do
49
+ # process :resize_to_fill => [280, 150]
50
+ # end
51
+ #
52
+ # version :normal do
53
+ # process :resize_to_fill => [630, 330]
54
+ # end
55
+ #
56
+ # version :gallery do
57
+ # process :resize_to_fill => [1140,525]
58
+ # end
59
+ #
60
+ # version :larger do
61
+ # process :resize_to_fill => [224,148]
62
+ # end
63
+
64
+
65
+ # Add a white list of extensions which are allowed to be uploaded.
66
+ # For images you might use something like this:
67
+ def extension_white_list
68
+ %w(jpg jpeg gif png)
69
+ end
70
+
71
+ # Override the filename of the uploaded files:
72
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
73
+ # def filename
74
+ # "something.jpg" if original_filename
75
+ # end
76
+
77
+ end
78
+ end
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+
3
+ module Blacksand
4
+ class SlideImageUploader < BaseUploader
5
+
6
+ # Include RMagick or MiniMagick support:
7
+ # include CarrierWave::RMagick
8
+ # include CarrierWave::MiniMagick
9
+
10
+ # Choose what kind of storage to use for this uploader:
11
+ # storage :file
12
+ # storage :fog
13
+ # set_storage_from_config
14
+
15
+ # Override the directory where uploaded files will be stored.
16
+ # This is a sensible default for uploaders that are meant to be mounted:
17
+ # def store_dir
18
+ # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
19
+ # end
20
+
21
+ # Provide a default URL as a default if there hasn't been a file uploaded:
22
+ # def default_url
23
+ # # For Rails 3.1+ asset pipeline compatibility:
24
+ # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
25
+ #
26
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
27
+ # end
28
+
29
+ # Process files as they are uploaded:
30
+ # process scale: [200, 300]
31
+ #
32
+ # def scale(width, height)
33
+ # # do something
34
+ # end
35
+
36
+ # Create different versions of your uploaded files:
37
+ # version :thumb do
38
+ # process resize_to_fit: [50, 50]
39
+ # end
40
+
41
+ # version :slide do
42
+ # process :resize_to_fill => [940, 300]
43
+ # end
44
+ #
45
+ # version :slide_1140 do
46
+ # process :resize_to_fill => [1140, 300]
47
+ # end
48
+ #
49
+ # version :slide_with_pad do
50
+ # process :resize_and_pad => [1140, 300]
51
+ # end
52
+
53
+ # Add a white list of extensions which are allowed to be uploaded.
54
+ # For images you might use something like this:
55
+ def extension_white_list
56
+ %w(jpg jpeg gif png)
57
+ end
58
+
59
+ # Override the filename of the uploaded files:
60
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
61
+ # def filename
62
+ # "something.jpg" if original_filename
63
+ # end
64
+
65
+ end
66
+ end