papermill 0.14.3 → 0.16.0
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.
- data/.gitignore +2 -0
- data/README.rdoc +125 -79
- data/TODO.txt +0 -2
- data/VERSION +1 -1
- data/app/controllers/papermill_controller.rb +41 -40
- data/app/views/papermill/_asset.html.erb +1 -1
- data/app/views/papermill/_form.html.erb +20 -13
- data/app/views/papermill/edit.html.erb +2 -7
- data/config/locales/papermill.yml +6 -0
- data/config/routes.rb +2 -2
- data/generators/papermill_initializer/USAGE +4 -0
- data/generators/papermill_initializer/papermill_initializer_generator.rb +15 -0
- data/generators/papermill_table/templates/migrate/papermill_migration.rb.erb +8 -3
- data/installation-template.txt +4 -4
- data/lib/{core_extensions.rb → extensions.rb} +23 -15
- data/lib/papermill.rb +11 -4
- data/lib/papermill/form_builder.rb +62 -49
- data/lib/papermill/papermill.rb +70 -0
- data/lib/papermill/papermill_asset.rb +57 -15
- data/lib/papermill/papermill_options.rb +125 -0
- data/public/papermill/README +13 -0
- data/public/papermill/images/delete.png +0 -0
- data/public/papermill/images/mass-delete.png +0 -0
- data/public/papermill/images/mass-edit.png +0 -0
- data/public/papermill/papermill.css +8 -2
- data/public/papermill/papermill.js +42 -12
- data/test/fixtures/12k.png +0 -0
- data/test/fixtures/50x50.png +0 -0
- data/test/fixtures/5k.png +0 -0
- data/test/fixtures/bad.png +1 -0
- data/test/fixtures/s3.yml +8 -0
- data/test/fixtures/text.txt +0 -0
- data/test/fixtures/twopage.pdf +0 -0
- data/test/papermill_test.rb +109 -19
- metadata +19 -5
- data/lib/papermill/papermill_module.rb +0 -219
@@ -27,6 +27,9 @@ en:
|
|
27
27
|
save: "Send to server"
|
28
28
|
location: "File : "
|
29
29
|
url: "URL : "
|
30
|
+
modify-all: "Modify all: "
|
31
|
+
delete-all: "Delete all"
|
32
|
+
delete-all-confirmation: "Are you sure?"
|
30
33
|
fr:
|
31
34
|
papermill:
|
32
35
|
not-processed: "Erreur/ressource non trouvée"
|
@@ -56,3 +59,6 @@ fr:
|
|
56
59
|
save: "Envoyer"
|
57
60
|
location: "Fichier : "
|
58
61
|
url: "Lien : "
|
62
|
+
modify-all: "Modifier tout : "
|
63
|
+
delete-all: "Supprimer tout"
|
64
|
+
delete-all-confirmation: "Êtes-vous sûr ?"
|
data/config/routes.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
ActionController::Routing::Routes.draw do |map|
|
2
|
-
map.resources :papermill, :collection => { :sort => :post }
|
3
|
-
map.connect "#{Papermill::
|
2
|
+
map.resources :papermill, :collection => { :sort => :post, :mass_edit => :post, :mass_delete => :post }
|
3
|
+
map.connect "#{Papermill::options[:papermill_prefix]}/#{Papermill::PAPERCLIP_INTERPOLATION_STRING.gsub(":id_partition", ":id0/:id1/:id2")}", :controller => "papermill", :action => "show"
|
4
4
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class PapermillInitializerGenerator < Rails::Generator::Base
|
2
|
+
def initialize(args, options = {})
|
3
|
+
end
|
4
|
+
|
5
|
+
def manifest
|
6
|
+
puts "Copying papermill initializer to config/initializers/..."
|
7
|
+
FileUtils.rm_rf("#{RAILS_ROOT}/config/initializers/papermill.rb")
|
8
|
+
FileUtils.cp_r(
|
9
|
+
File.join(File.dirname(__FILE__), '../..', 'lib', 'papermill', 'papermill_options.rb'),
|
10
|
+
"#{RAILS_ROOT}/config/initializers/papermill.rb"
|
11
|
+
)
|
12
|
+
puts "Done! Check config/initializer/papermill.rb for result."
|
13
|
+
exit
|
14
|
+
end
|
15
|
+
end
|
@@ -1,17 +1,22 @@
|
|
1
1
|
class <%= migration_name %> < ActiveRecord::Migration
|
2
2
|
def self.up
|
3
3
|
create_table :papermill_assets do |t|
|
4
|
+
# mandatory
|
4
5
|
t.string :file_file_name
|
5
6
|
t.string :file_content_type
|
6
7
|
t.integer :file_file_size
|
7
8
|
t.integer :position
|
8
|
-
t.text :description
|
9
|
-
t.string :copyright
|
10
|
-
t.string :title
|
11
9
|
t.integer :assetable_id
|
12
10
|
t.string :assetable_type
|
13
11
|
t.string :assetable_key
|
14
12
|
t.string :type
|
13
|
+
t.string :title
|
14
|
+
|
15
|
+
|
16
|
+
# optionnal
|
17
|
+
t.text :description
|
18
|
+
t.string :copyright
|
19
|
+
t.string :alt
|
15
20
|
t.timestamps
|
16
21
|
end
|
17
22
|
end
|
data/installation-template.txt
CHANGED
@@ -2,6 +2,7 @@ gem 'papermill'
|
|
2
2
|
|
3
3
|
generate :papermill_table, "PapermillMigration"
|
4
4
|
generate :papermill_assets
|
5
|
+
generate :papermill_initializer
|
5
6
|
generate :scaffold, "article title:string"
|
6
7
|
rake "db:migrate"
|
7
8
|
|
@@ -62,7 +63,6 @@ file "app/views/articles/_form.html.erb", <<-END
|
|
62
63
|
<% end %>
|
63
64
|
END
|
64
65
|
|
65
|
-
|
66
66
|
file "app/views/articles/show.html.erb", <<-END
|
67
67
|
<p>
|
68
68
|
<b>Title:</b>
|
@@ -78,7 +78,7 @@ file "app/views/articles/show.html.erb", <<-END
|
|
78
78
|
<br /><br />
|
79
79
|
<b>@article.assets(:my_other_image).first :</b>
|
80
80
|
<p>
|
81
|
-
<% image = @article.
|
81
|
+
<% image = @article.assets(:my_other_image).first %>
|
82
82
|
<%= link_to(image_tag(image.url("100x100#")), image.url) if image %>
|
83
83
|
</p>
|
84
84
|
<br /><br />
|
@@ -91,9 +91,9 @@ file "app/views/articles/show.html.erb", <<-END
|
|
91
91
|
</ul>
|
92
92
|
</p>
|
93
93
|
<br /><br />
|
94
|
-
<b>@article.
|
94
|
+
<b>@article.assets(:my_other_asset).first :</b>
|
95
95
|
<p>
|
96
|
-
<% asset = @article.
|
96
|
+
<% asset = @article.assets(:my_other_asset).first %>
|
97
97
|
<%= link_to(asset.name, asset.url) if asset %>
|
98
98
|
</p>
|
99
99
|
|
@@ -13,24 +13,15 @@ module PapermillHashExtensions
|
|
13
13
|
target
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
17
|
-
def simple_sql_sanitizer
|
18
|
-
gsub(/\\/, '\&\&').gsub(/'/, "''")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
module PapermillStringToUrlNotFound
|
22
|
-
def to_url
|
23
|
-
gsub(/[^a-zA-Z0-9]/, "-").gsub(/-+/, "-").gsub(/^-|-$/, "").downcase
|
24
|
-
end
|
25
|
-
end
|
16
|
+
|
26
17
|
module PapermillObjectExtensions
|
27
18
|
# Nil if empty.
|
28
19
|
def nie
|
29
20
|
self.blank? ? nil : self
|
30
21
|
end
|
31
22
|
end
|
23
|
+
|
32
24
|
module PapermillFileExtensions
|
33
|
-
|
34
25
|
def get_content_type
|
35
26
|
begin
|
36
27
|
MIME::Types.type_for(self.original_filename).to_s
|
@@ -41,10 +32,27 @@ module PapermillFileExtensions
|
|
41
32
|
end
|
42
33
|
|
43
34
|
module PapermillFormtasticExtensions
|
44
|
-
def
|
45
|
-
|
46
|
-
|
35
|
+
def image_upload_input(method, options)
|
36
|
+
self.label(method, options_for_label(options)) +
|
37
|
+
self.send(:image_upload, method, options)
|
38
|
+
end
|
39
|
+
def images_upload_input(method, options)
|
47
40
|
self.label(method, options_for_label(options)) +
|
48
|
-
self.send(
|
41
|
+
self.send(:images_upload, method, options)
|
42
|
+
end
|
43
|
+
def asset_upload_input(method, options)
|
44
|
+
self.label(method, options_for_label(options)) +
|
45
|
+
self.send(:asset_upload, method, options)
|
46
|
+
end
|
47
|
+
def assets_upload_input(method, options)
|
48
|
+
self.label(method, options_for_label(options)) +
|
49
|
+
self.send(:assets_upload, method, options)
|
49
50
|
end
|
50
51
|
end
|
52
|
+
|
53
|
+
|
54
|
+
module StringToUrlNotFound
|
55
|
+
def to_url
|
56
|
+
gsub(/[^a-zA-Z0-9]/, "-").gsub(/-+/, "-").gsub(/^-|-$/, "")
|
57
|
+
end
|
58
|
+
end
|
data/lib/papermill.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
I18n.load_path = [File.join(File.dirname(__FILE__), "../config/locales/papermill.yml")] + I18n.load_path
|
2
|
-
require '
|
2
|
+
require 'extensions'
|
3
3
|
Object.send :include, PapermillObjectExtensions
|
4
4
|
Hash.send :include, PapermillHashExtensions
|
5
5
|
File.send :include, PapermillFileExtensions
|
6
|
-
String.send :include,
|
7
|
-
String.send :include, PapermillStringToUrlNotFound unless String.instance_methods.include? "to_url"
|
6
|
+
String.send :include, StringToUrlNotFound unless String.instance_methods.include? "to_url"
|
8
7
|
Formtastic::SemanticFormBuilder.send(:include, PapermillFormtasticExtensions) rescue NameError
|
9
|
-
|
8
|
+
|
9
|
+
begin
|
10
|
+
require File.join(File.dirname(RAILS_ROOT), "config/initializers/papermill.rb")
|
11
|
+
rescue LoadError
|
12
|
+
require 'papermill/papermill_options'
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'paperclip' unless defined?(Paperclip)
|
16
|
+
require 'papermill/papermill'
|
10
17
|
require 'papermill/papermill_asset'
|
11
18
|
require 'papermill/form_builder'
|
12
19
|
require 'papermill/papermill_helper'
|
@@ -1,3 +1,20 @@
|
|
1
|
+
class ActionView::Helpers::FormBuilder
|
2
|
+
include ActionView::Helpers::FormTagHelper
|
3
|
+
|
4
|
+
def assets_upload(key = nil, options = {})
|
5
|
+
papermill_upload_tag key, { :thumbnail => false }.update(options)
|
6
|
+
end
|
7
|
+
def asset_upload(key = nil, options = {})
|
8
|
+
papermill_upload_tag key, { :gallery => false, :thumbnail => false }.update(options)
|
9
|
+
end
|
10
|
+
def images_upload(key = nil, options = {})
|
11
|
+
papermill_upload_tag key, options
|
12
|
+
end
|
13
|
+
def image_upload(key = nil, options = {})
|
14
|
+
papermill_upload_tag key, { :gallery => false }.update(options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
1
18
|
module ActionView::Helpers::FormTagHelper
|
2
19
|
|
3
20
|
def assets_upload_tag(assetable, key = nil, options = {})
|
@@ -24,21 +41,24 @@ module ActionView::Helpers::FormTagHelper
|
|
24
41
|
end
|
25
42
|
|
26
43
|
assetable = options[:assetable] || @template.instance_variable_get("@#{@object_name}")
|
27
|
-
options =
|
28
|
-
association[
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
44
|
+
options = (
|
45
|
+
if assetable && (association = (assetable.class.papermill_associations[key] || assetable.class.papermill_associations[Papermill::options[:base_association_name]]))
|
46
|
+
association[:options].deep_merge(options)
|
47
|
+
elsif assetable.nil?
|
48
|
+
Papermill::options.deep_merge(options)
|
49
|
+
else
|
50
|
+
raise PapermillException.new("Can't find '#{key.to_s}' association for '#{assetable.class.to_s}'.\n\n##{assetable.class.to_s.underscore}.rb\nYou can take on of these actions: \n1. set either a catchall papermill association: 'papermill {your_option_hash}'\n2. or a specific association: 'papermill :#{key.to_s}, {your_option_hash}'")
|
51
|
+
end
|
52
|
+
)
|
53
|
+
|
34
54
|
assetable_id = assetable && (assetable.id || assetable.timestamp) || nil
|
35
|
-
assetable_type = assetable && assetable.class.
|
55
|
+
assetable_type = assetable && assetable.class.base_class.name || nil
|
36
56
|
id = "papermill_#{assetable_type}_#{assetable_id}_#{key ? key.to_s : 'nil'}"
|
37
57
|
if options[:thumbnail]
|
38
58
|
w = options[:thumbnail][:width] || options[:thumbnail][:height] && options[:thumbnail][:aspect_ratio] && (options[:thumbnail][:height] * options[:thumbnail][:aspect_ratio]).to_i || nil
|
39
59
|
h = options[:thumbnail][:height] || options[:thumbnail][:width] && options[:thumbnail][:aspect_ratio] && (options[:thumbnail][:width] / options[:thumbnail][:aspect_ratio]).to_i || nil
|
40
|
-
options[:thumbnail][:style] ||= (w || h) && "#{w
|
41
|
-
if options[:
|
60
|
+
options[:thumbnail][:style] ||= (w || h) && "#{w}x#{h}>" || "original"
|
61
|
+
if options[:inline_css]
|
42
62
|
size = []
|
43
63
|
size << "width:#{w}px" if w
|
44
64
|
size << "height:#{h}px" if h
|
@@ -52,7 +72,7 @@ module ActionView::Helpers::FormTagHelper
|
|
52
72
|
hm = options[:gallery][:hmargin].to_i
|
53
73
|
b = options[:gallery][:border_thickness].to_i
|
54
74
|
gallery_width = (options[:gallery][:width] || w) && "width:#{options[:gallery][:width] || options[:gallery][:columns]*(w+(hp+hm+b)*2)}px;" || ""
|
55
|
-
gallery_height = (options[:gallery][:height] || h) && "
|
75
|
+
gallery_height = (options[:gallery][:height] || h) && "min-height:#{options[:gallery][:height] || options[:gallery][:lines]*(h+(vp+vm+b)*2)}px;" || ""
|
56
76
|
inline_css << %{##{id} { #{gallery_width} #{gallery_height} }}
|
57
77
|
inline_css << %{##{id} li { margin:#{vm}px #{hm}px; border-width:#{b}px; padding:#{vp}px #{hp}px; #{size}; }}
|
58
78
|
else
|
@@ -63,46 +83,58 @@ module ActionView::Helpers::FormTagHelper
|
|
63
83
|
end
|
64
84
|
end
|
65
85
|
end
|
66
|
-
|
67
|
-
|
68
|
-
asset_class = options[:class_name] && options[:class_name].to_s.constantize || association && association[:class] || PapermillAsset
|
69
|
-
|
86
|
+
|
70
87
|
url_options = {
|
71
88
|
:controller => "/papermill",
|
72
89
|
:action => "create",
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:gallery => (options[:gallery] != false),
|
77
|
-
:thumbnail_style => (options[:thumbnail] && options[:thumbnail][:style])
|
90
|
+
:asset_class => (options[:class_name] && options[:class_name].to_s.constantize || association && association[:class] || PapermillAsset).to_s,
|
91
|
+
:gallery => !!options[:gallery],
|
92
|
+
:thumbnail_style => options[:thumbnail] && options[:thumbnail][:style]
|
78
93
|
}
|
94
|
+
|
79
95
|
url_options.merge!({
|
80
96
|
:assetable_id => assetable_id,
|
81
|
-
:assetable_type => assetable_type
|
97
|
+
:assetable_type => assetable_type
|
82
98
|
}) if assetable
|
99
|
+
|
100
|
+
url_options.merge!({
|
101
|
+
:assetable_key => key
|
102
|
+
}) if key
|
103
|
+
|
104
|
+
|
105
|
+
html = {}
|
83
106
|
create_url = @template.url_for(url_options)
|
84
107
|
if assetable && assetable.new_record? && !@timestamped
|
85
|
-
|
108
|
+
@timestamp_field = @template.hidden_field(assetable_type.underscore, :timestamp, :value => assetable.timestamp)
|
86
109
|
@timestamped = true
|
87
110
|
end
|
88
111
|
|
89
112
|
conditions = {:assetable_type => assetable_type, :assetable_id => assetable_id}
|
90
113
|
conditions.merge!({:assetable_key => key.to_s}) if key
|
91
|
-
collection =
|
114
|
+
collection = PapermillAsset.all(:conditions => conditions, :order => "position")
|
92
115
|
|
93
|
-
html
|
94
|
-
html
|
116
|
+
html[:upload_button] = %{<div id="#{id}-button-wrapper" class="papermill-button-wrapper" style="height: #{options[:swfupload][:button_height]}px;"><span id="browse_for_#{id}" class="swf_button"></span></div>}
|
117
|
+
html[:container] = @template.content_tag(:ul, :id => id, :class => "#{(options[:thumbnail] ? "papermill-thumb-container" : "papermill-asset-container")} #{(options[:gallery] ? "papermill-multiple-items" : "papermill-unique-item")}") {
|
95
118
|
@template.render :partial => "papermill/asset", :collection => collection, :locals => { :thumbnail_style => (options[:thumbnail] && options[:thumbnail][:style]) }
|
96
|
-
}
|
119
|
+
}
|
120
|
+
|
121
|
+
if options[:gallery]
|
122
|
+
html[:dashboard] = {}
|
123
|
+
html[:dashboard][:mass_edit] = %{<select id="batch_#{id}">#{options[:mass_editable_fields].map do |field|
|
124
|
+
%{<option value="#{field.to_s}">#{I18n.t("papermill.#{field.to_s}", :default => field.to_s)}</option>}
|
125
|
+
end.join("\n")}</select>
|
126
|
+
<a onclick="modify_all('#{id}'); return false;" style="cursor:pointer">#{I18n.t("papermill.modify-all")}</a>}
|
127
|
+
html[:dashboard][:mass_delete] = %{<a onclick="mass_delete('#{id}', '#{@template.escape_javascript I18n.t("papermill.delete-all-confirmation")}'); return false;" style="cursor:pointer">#{I18n.t("papermill.delete-all")}</a>}
|
128
|
+
html[:dashboard] = @template.content_tag(:ul, options[:dashboard].map{|action| @template.content_tag(:li, html[:dashboard][action], :class => action.to_s) }.join("\n"), :class => "dashboard")
|
129
|
+
end
|
130
|
+
|
97
131
|
@template.content_for :papermill_inline_js do
|
98
132
|
%{
|
99
133
|
#{%{(jQuery("##{id}")).sortable({update:function(){jQuery.ajax({async:true, data:jQuery(this).sortable('serialize'), dataType:'script', type:'post', url:'#{@template.controller.send("sort_papermill_path")}'})}})} if options[:gallery]}
|
100
134
|
new SWFUpload({
|
101
135
|
upload_id: "#{id}",
|
102
136
|
upload_url: "#{@template.escape_javascript create_url}",
|
103
|
-
file_size_limit: "#{options[:file_size_limit_mb].megabytes}",
|
104
137
|
file_types: "#{options[:images_only] ? '*.jpg;*.jpeg;*.png;*.gif' : ''}",
|
105
|
-
file_types_description: "#{options[:thumbnail] ? 'Images' : 'Files'}",
|
106
138
|
file_queue_limit: "#{!options[:gallery] ? '1' : '0'}",
|
107
139
|
file_queued_handler: Upload.file_queued,
|
108
140
|
file_dialog_complete_handler: Upload.file_dialog_complete,
|
@@ -112,29 +144,10 @@ module ActionView::Helpers::FormTagHelper
|
|
112
144
|
upload_success_handler: Upload.upload_success,
|
113
145
|
upload_complete_handler: Upload.upload_complete,
|
114
146
|
button_placeholder_id : "browse_for_#{id}",
|
115
|
-
#{options[:swfupload].map{ |key, value| ["false", "true"].include?(value.to_s) ? "#{key.to_s}: #{value.to_s}" : "#{key.to_s}: '#{value.to_s}'" }.compact.join(", ")}
|
147
|
+
#{options[:swfupload].map{ |key, value| (["false", "true"].include?(value.to_s) ? "#{key.to_s}: #{value.to_s}" : "#{key.to_s}: '#{value.to_s}'") if value }.compact.join(", ")}
|
116
148
|
});
|
117
149
|
}
|
118
150
|
end
|
119
|
-
|
120
|
-
%{<div class="papermill">#{html.join("\n")}</div>}
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
|
-
class ActionView::Helpers::FormBuilder
|
126
|
-
include ActionView::Helpers::FormTagHelper
|
127
|
-
|
128
|
-
def assets_upload(key = nil, options = {})
|
129
|
-
papermill_upload_tag key, { :thumbnail => false }.update(options)
|
130
|
-
end
|
131
|
-
def asset_upload(key = nil, options = {})
|
132
|
-
papermill_upload_tag key, { :gallery => false, :thumbnail => false }.update(options)
|
133
|
-
end
|
134
|
-
def images_upload(key = nil, options = {})
|
135
|
-
papermill_upload_tag key, options
|
136
|
-
end
|
137
|
-
def image_upload(key = nil, options = {})
|
138
|
-
papermill_upload_tag key, { :gallery => false }.update(options)
|
151
|
+
%{<div class="papermill">#{@timestamp_field.to_s + options[:form_helper_elements].map{|element| html[element] || ""}.join("\n")}</div>}
|
139
152
|
end
|
140
153
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Papermill
|
2
|
+
PAPERCLIP_INTERPOLATION_STRING = ":id_partition/:style/:escaped_basename.:extension"
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.options
|
9
|
+
defined?(OPTIONS) ? OPTIONS : {}
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
attr_reader :papermill_associations
|
15
|
+
|
16
|
+
def papermill(*args)
|
17
|
+
assoc_name = (!args.first.is_a?(Hash) && args.shift.try(:to_sym) || Papermill::options[:base_association_name])
|
18
|
+
options = args.first || {}
|
19
|
+
|
20
|
+
(@papermill_associations ||= {}).merge!({ assoc_name => {
|
21
|
+
:class => (class_name = options.delete(:class_name)) && class_name.to_s.constantize || PapermillAsset,
|
22
|
+
:options => Papermill::options.deep_merge(options)
|
23
|
+
}})
|
24
|
+
|
25
|
+
include Papermill::InstanceMethods
|
26
|
+
before_destroy :destroy_assets
|
27
|
+
after_create :rebase_assets
|
28
|
+
has_many :papermill_assets, :as => "Assetable"
|
29
|
+
|
30
|
+
define_method assoc_name do |*options|
|
31
|
+
scope = PapermillAsset.scoped(:conditions => {:assetable_id => self.id, :assetable_type => self.class.base_class.name})
|
32
|
+
if assoc_name != Papermill::options[:base_association_name]
|
33
|
+
scope = scope.scoped(:conditions => { :assetable_key => assoc_name.to_s })
|
34
|
+
elsif options.first && !options.first.is_a?(Hash)
|
35
|
+
scope = scope.scoped(:conditions => { :assetable_key => options.shift.to_s.nie })
|
36
|
+
end
|
37
|
+
scope = scope.scoped(options.shift) if options.first
|
38
|
+
scope
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def inherited(subclass)
|
43
|
+
subclass.instance_variable_set("@papermill_associations", @papermill_associations)
|
44
|
+
super
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
module InstanceMethods
|
49
|
+
attr_writer :timestamp
|
50
|
+
def timestamp
|
51
|
+
@timestamp ||= "-#{(Time.now.to_f * 1000).to_i.to_s[4..-1]}"
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def destroy_assets
|
57
|
+
papermill_assets.each &:destroy
|
58
|
+
end
|
59
|
+
|
60
|
+
def rebase_assets
|
61
|
+
PapermillAsset.all(:conditions => { :assetable_id => self.timestamp, :assetable_type => self.class.base_class.name }).each do |asset|
|
62
|
+
if asset.created_at < 2.hours.ago
|
63
|
+
asset.destroy
|
64
|
+
else
|
65
|
+
asset.update_attribute(:assetable_id, self.id)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -1,37 +1,53 @@
|
|
1
|
-
require 'paperclip'
|
2
|
-
|
3
1
|
class PapermillAsset < ActiveRecord::Base
|
4
|
-
|
2
|
+
|
5
3
|
before_destroy :destroy_files
|
6
|
-
|
4
|
+
before_create :set_position
|
5
|
+
|
6
|
+
has_attached_file :file,
|
7
|
+
:path => "#{Papermill::options[:public_root]}/#{Papermill::options[:papermill_prefix]}/#{Papermill::PAPERCLIP_INTERPOLATION_STRING}",
|
8
|
+
:url => "/#{Papermill::options[:papermill_prefix]}/#{Papermill::PAPERCLIP_INTERPOLATION_STRING}"
|
9
|
+
|
7
10
|
Paperclip.interpolates :escaped_basename do |attachment, style|
|
8
11
|
Paperclip::Interpolations[:basename].call(attachment, style).to_url
|
9
12
|
end
|
10
13
|
|
11
|
-
has_attached_file :file,
|
12
|
-
:path => "#{Papermill::PAPERMILL_DEFAULTS[:public_root]}/#{Papermill::PAPERMILL_DEFAULTS[:papermill_prefix]}/#{Papermill::PAPERCLIP_INTERPOLATION_STRING}",
|
13
|
-
:url => "/#{Papermill::PAPERMILL_DEFAULTS[:papermill_prefix]}/#{Papermill::PAPERCLIP_INTERPOLATION_STRING}"
|
14
14
|
validates_attachment_presence :file
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
|
16
|
+
belongs_to :assetable, :polymorphic => true
|
17
|
+
default_scope :order => 'position'
|
18
|
+
|
19
|
+
def Filedata=(data)
|
18
20
|
self.file = data
|
21
|
+
self.file_content_type = data.get_content_type
|
22
|
+
end
|
23
|
+
|
24
|
+
def Filename=(name)
|
25
|
+
self.title = name
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_thumb_file(style_name)
|
29
|
+
FileUtils.mkdir_p File.dirname(file.path(style_name))
|
30
|
+
FileUtils.mv(Paperclip::Thumbnail.make(file, self.class.compute_style(style_name)).path, file.path(style_name))
|
19
31
|
end
|
20
32
|
|
21
33
|
def id_partition
|
22
34
|
("%09d" % self.id).scan(/\d{3}/).join("/")
|
23
35
|
end
|
24
36
|
|
37
|
+
def self.find_by_id_partition(params)
|
38
|
+
self.find((params[:id0] + params[:id1] + params[:id2]).to_i)
|
39
|
+
end
|
40
|
+
|
25
41
|
def name
|
26
42
|
file_file_name
|
27
43
|
end
|
28
44
|
|
29
45
|
def width
|
30
|
-
|
46
|
+
Paperclip::Geometry.from_file(file).width
|
31
47
|
end
|
32
48
|
|
33
49
|
def height
|
34
|
-
|
50
|
+
Paperclip::Geometry.from_file(file).height
|
35
51
|
end
|
36
52
|
|
37
53
|
def size
|
@@ -51,11 +67,37 @@ class PapermillAsset < ActiveRecord::Base
|
|
51
67
|
end
|
52
68
|
|
53
69
|
def image?
|
54
|
-
content_type
|
70
|
+
content_type.split("/")[0] == "image"
|
71
|
+
end
|
72
|
+
|
73
|
+
def save(*params)
|
74
|
+
if super(*params)
|
75
|
+
if params.last.is_a?(Hash) && params.last[:unique] && assetable_key
|
76
|
+
PapermillAsset.find(:all, :conditions => {:assetable_id => assetable_id, :assetable_type => assetable_type, :assetable_key => assetable_key }).each do |asset|
|
77
|
+
asset.destroy unless asset == self
|
78
|
+
end
|
79
|
+
end
|
80
|
+
true
|
81
|
+
else
|
82
|
+
false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.cleanup
|
87
|
+
PapermillAsset.all(:conditions => ["id < 0 AND created_at < ?", DateTime.now.yesterday]).each &:destroy
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
def set_position
|
92
|
+
self.position ||= PapermillAsset.first(:conditions => {:assetable_key => assetable_key, :assetable_type => assetable_type, :assetable_id => assetable_id}, :order => "position DESC" ).try(:position).to_i + 1
|
55
93
|
end
|
56
94
|
|
57
95
|
def destroy_files
|
58
|
-
FileUtils.rm_r
|
59
|
-
true
|
96
|
+
FileUtils.rm_r(File.dirname(path).chomp("original")) rescue true
|
60
97
|
end
|
98
|
+
|
99
|
+
def self.compute_style(style, compatibility_mode = nil)
|
100
|
+
style = Papermill::options[:aliases][style.to_sym] || Papermill::options[:aliases][style.to_s] || !Papermill::options[:alias_only] && style
|
101
|
+
[Symbol, String].include?(style.class) ? {:geometry => style.to_s} : style
|
102
|
+
end
|
61
103
|
end
|