papermill 0.14.3 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,219 +0,0 @@
|
|
1
|
-
module Papermill
|
2
|
-
|
3
|
-
# Override these defaults :
|
4
|
-
# - in your application (environment.rb, ..) => in your [environment, development, production].rb file with Papermill::OPTIONS = {thumbnails => {..}, :gallery => {..}, etc. }
|
5
|
-
# - in your class => papermill <assoc_name>, :class_name => MySTIedPapermillAssetSubClass, thumbnails => {<my_thumbnail_parameters>}, :gallery => {<my_gallery_parameters>}, etc.
|
6
|
-
# - in your helper call => images_upload :my_gallery, {thumbnails => {..}, :gallery => {..}, etc. }
|
7
|
-
# Options will cascade as you expect them to.
|
8
|
-
|
9
|
-
# sizes (widths, paddings, etc..) are CSS pixel values.
|
10
|
-
PAPERMILL_DEFAULTS = {
|
11
|
-
:thumbnail => {
|
12
|
-
# you clearly want to override these two values in your templates.
|
13
|
-
# the rest is very optionnal and will "cascade" nicely
|
14
|
-
:width => 100, # Recommended if :gallery[:width] is nil
|
15
|
-
:height => 100, # Recommended if :gallery[:height] is nil
|
16
|
-
# set :width OR :height to nil to use aspect_ratio value. Remember that 4/3 == 1 => Use : 4.0/3
|
17
|
-
:aspect_ratio => nil,
|
18
|
-
# You can override computed ImageMagick transformation strings that defaults to "#{:width}x#{:height}>"
|
19
|
-
# Note that this is required if PAPERMILL_DEFAULTS[:alias_only] is true
|
20
|
-
:style => nil,
|
21
|
-
# set to false if you don't want inline CSS
|
22
|
-
:inline_css => true
|
23
|
-
},
|
24
|
-
# gallery
|
25
|
-
:gallery => {
|
26
|
-
# if thumbnail.inline_css is true, css will be generated automagically with these values. Great for quick scaffolding, and complete enough for real use.
|
27
|
-
:width => nil, # overrides calculated width. Recommended if :thumbnail[:width] is nil.
|
28
|
-
:height => nil, # overrides calculated height. Recommended if :thumbnail[:height] is nil.
|
29
|
-
:columns => 8, # number of columns. If thumbnail.width has a value, sets a width for the gallery, calculated from thumbnails width multiplied by :columns.
|
30
|
-
:lines => 2, # number of default lines. (height will autogrow) If thumbnail.height has a value, sets a min-height for the gallery, calculated from thumbnails height multiplied by :lines
|
31
|
-
:vpadding => 0, # vertical padding around thumbnails
|
32
|
-
:hpadding => 0, # horizontal padding around thumbnails
|
33
|
-
:vmargin => 1, # vertical margin around thumbnails
|
34
|
-
:hmargin => 1, # horizontal margin around thumbnails
|
35
|
-
:border_thickness => 2, # border around thumbnails
|
36
|
-
:autogrow => false # sets a min-height instead of height for the gallery
|
37
|
-
},
|
38
|
-
# options passed on to SWFUpload. To remove an option when overriding, set it to nil.
|
39
|
-
:swfupload => {
|
40
|
-
# !!! Will only work if the swf file comes from the server to where the files are sent. (Flash same origin security policy)
|
41
|
-
:flash_url => '/papermill/swfupload.swf',
|
42
|
-
# You can use upload-blank.png with your own wording or upload.png with default "upload" wording (looks nicer)
|
43
|
-
:button_image_url => '/papermill/images/upload-blank.png',
|
44
|
-
:button_width => 61,
|
45
|
-
:button_height => 22,
|
46
|
-
# Wording and CSS processed through an Adobe Flash styler. Result is terrible. Feel free to put a CSS button overlayed directly on the SWF button. See swfupload website.
|
47
|
-
:button_text => %{<span class="button-text">#{I18n.t("papermill.upload-button-wording")}</span>},
|
48
|
-
:button_text_style => %{.button-text { color: red; font-size: 12pt; font-weight: bold; }},
|
49
|
-
:button_disabled => "false",
|
50
|
-
:button_text_top_padding => 4,
|
51
|
-
:button_text_left_padding => 4,
|
52
|
-
:debug => "false",
|
53
|
-
:prevent_swf_caching => "false"
|
54
|
-
# See swfupload.js for details.
|
55
|
-
},
|
56
|
-
:images_only => false, # set to true to forbid upload of anything else than images
|
57
|
-
:file_size_limit_mb => 10, # file max size
|
58
|
-
:button_after_container => false, # set to true to move the upload button below the container
|
59
|
-
|
60
|
-
# DO NOT CHANGE THESE IN YOUR CLASSES. Only application wide (routes or associations may depend on it)
|
61
|
-
|
62
|
-
:base_association_name => 'assets',
|
63
|
-
:alias_only => false, # set to true so that only aliases are authorized in url/path
|
64
|
-
# aliases name must be strings!
|
65
|
-
:aliases => {
|
66
|
-
# 'example' => "100x100#",
|
67
|
-
},
|
68
|
-
# path to the root of your public directory
|
69
|
-
:public_root => ":rails_root/public",
|
70
|
-
# added to :public_root as the root folder for all papermill items
|
71
|
-
:papermill_prefix => "system/papermill",
|
72
|
-
:max_width => 1000,
|
73
|
-
:max_height => 1000
|
74
|
-
}.deep_merge( Papermill.const_defined?("OPTIONS") ? Papermill::OPTIONS : {} )
|
75
|
-
|
76
|
-
PAPERCLIP_INTERPOLATION_STRING = ":id_partition/:style/:escaped_basename.:extension"
|
77
|
-
|
78
|
-
def self.included(base)
|
79
|
-
base.extend(ClassMethods)
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.papermill_interpolated_path(replacements_pairs, up_to)
|
83
|
-
replacements_pairs = {"other" => "*", ":rails_root" => RAILS_ROOT}.merge(replacements_pairs)
|
84
|
-
a = "#{PAPERMILL_DEFAULTS[:public_root]}/#{PAPERMILL_DEFAULTS[:papermill_prefix]}/#{PAPERCLIP_INTERPOLATION_STRING}".split("/")
|
85
|
-
"#{a[0..(up_to && a.index(up_to) || -1)].map{ |s| s.starts_with?(':') ? (replacements_pairs[s] || replacements_pairs['other'] || s) : s }.join('/')}"
|
86
|
-
end
|
87
|
-
|
88
|
-
module ClassMethods
|
89
|
-
attr_reader :papermill_associations
|
90
|
-
|
91
|
-
# papermill comes in 2 flavors:
|
92
|
-
#
|
93
|
-
# 1. generic declaration =>
|
94
|
-
# declare associations with => papermill {my_option_hash}
|
95
|
-
# create assets with => assets_upload(:my_key, {optional_option_hash})
|
96
|
-
# access assets with => assetable.assets(:my_key)
|
97
|
-
#
|
98
|
-
# 2. association declaration =>
|
99
|
-
# declare associations with => papermill :my_association, {my_option_hash}
|
100
|
-
# create assets with => assets_upload(my_association, {optional_option_hash})
|
101
|
-
# access assets with => assetable.my_association
|
102
|
-
#
|
103
|
-
# In both case, you can specify a PapermillAsset subclass to use with :class_name => MyPapermillAssetSubclass in the option hash
|
104
|
-
def papermill(assoc_name = :papermill_assets, options = {})
|
105
|
-
if assoc_name.is_a? Hash
|
106
|
-
options = assoc_name
|
107
|
-
assoc_name = :papermill_assets
|
108
|
-
end
|
109
|
-
base_association_name = PAPERMILL_DEFAULTS[:base_association_name]
|
110
|
-
if [base_association_name.to_s.singularize, base_association_name.to_s].include?(assoc_name.to_s)
|
111
|
-
raise PapermillException.new(
|
112
|
-
"':#{assoc_name.to_s}' and ':#{assoc_name.to_s.singularize}' are the default papermill associations name.\n" +
|
113
|
-
"You can take one of these actions: \n" +
|
114
|
-
"1. use another association name instead of ':#{assoc_name.to_s}'. Eg: 'papermill :my_lovely_assets {my_options}'\n" +
|
115
|
-
"2. change :base_association_name to something else than '#{base_association_name.to_s}' in the application-wide papermill option hash (change 'Papermill::OPTIONS[:base_association_name]' in your environment.rb)\n" +
|
116
|
-
"3. use a catch-all 'papermill {your_options}' declaration instead of 'papermill :#{assoc_name.to_s} {your_options}'\n\n" +
|
117
|
-
"If you want to take advantage of pluralized/singularized associations, always specify a singularizable name. Eg: 'my_assets' is ok, 'my_assix' is not ;). \n" +
|
118
|
-
"(Anyway you can add exceptions in your config/initializer/inflections.rb)\n\n\n")
|
119
|
-
end
|
120
|
-
@papermill_associations ||= {}
|
121
|
-
begin
|
122
|
-
class_name = options.delete(:class_name)
|
123
|
-
asset_class = class_name && class_name.to_s.constantize || PapermillAsset
|
124
|
-
rescue NameError
|
125
|
-
raise PapermillException.new("'#{class_name.to_s}' class doesn't exist.\n'#{class_name.to_s}' should be a subclass of PapermillAsset")
|
126
|
-
end
|
127
|
-
|
128
|
-
@papermill_associations.merge!({assoc_name.to_sym => {:class => asset_class, :options => Papermill::PAPERMILL_DEFAULTS.deep_merge(options)}})
|
129
|
-
|
130
|
-
before_destroy :destroy_assets
|
131
|
-
after_create :rebase_assets
|
132
|
-
|
133
|
-
# Defines for catch-all association :
|
134
|
-
# Assetable#assets(*options)
|
135
|
-
# Assetable#asset(*options)
|
136
|
-
unless self.respond_to?(base_association_name)
|
137
|
-
[base_association_name.to_s.singularize, base_association_name].each_with_index do |association, index|
|
138
|
-
define_method association do |*options|
|
139
|
-
# case Assetable#asset<s>(:key)
|
140
|
-
if (options.is_a?(Symbol) || options.is_a?(String))
|
141
|
-
key = options
|
142
|
-
options = {}
|
143
|
-
# case Assetable#asset<s>(:key, options = {})
|
144
|
-
elsif (options.first.is_a?(Symbol) || options.first.is_a?(String))
|
145
|
-
key = options.first
|
146
|
-
options = options[1..-1]
|
147
|
-
end
|
148
|
-
options = options.first || {}
|
149
|
-
conditions = {
|
150
|
-
:assetable_type => self.class.sti_name,
|
151
|
-
:assetable_id => self.id
|
152
|
-
}.merge(options.delete(:conditions) || {})
|
153
|
-
conditions.merge!({:assetable_key => key.to_s}) if key
|
154
|
-
hash = {
|
155
|
-
:conditions => conditions,
|
156
|
-
:order => options.delete(:order) || "position ASC"
|
157
|
-
}.merge(options)
|
158
|
-
PapermillAsset.find((index == 0 ? :first : :all), hash)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
# Defines for declared association :
|
164
|
-
# Assetable#assoc.singularize(*options)
|
165
|
-
# Assetable#assoc(*options)
|
166
|
-
unless assoc_name.to_sym == :papermill_assets
|
167
|
-
[assoc_name.to_s.singularize, assoc_name.to_s].each_with_index do |association, index|
|
168
|
-
define_method assoc_name do |*options|
|
169
|
-
options = options.first || {}
|
170
|
-
conditions = {
|
171
|
-
:assetable_type => self.class.sti_name,
|
172
|
-
:assetable_id => self.id,
|
173
|
-
:assetable_key => assoc_name.to_s
|
174
|
-
}.merge(options.delete(:conditions) || {})
|
175
|
-
hash = {
|
176
|
-
:conditions => conditions,
|
177
|
-
:order => options.delete(:order) || "position ASC"
|
178
|
-
}.merge(options)
|
179
|
-
asset_class.find((index == 0 ? :first : :all), hash)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
class_eval <<-EOV
|
185
|
-
include Papermill::InstanceMethods
|
186
|
-
EOV
|
187
|
-
end
|
188
|
-
|
189
|
-
def inherited(subclass)
|
190
|
-
subclass.instance_variable_set("@papermill_associations", @papermill_associations)
|
191
|
-
super
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
module InstanceMethods
|
196
|
-
attr_writer :timestamp
|
197
|
-
def timestamp
|
198
|
-
@timestamp ||= "-#{(Time.now.to_f * 1000).to_i.to_s[4..-1]}"
|
199
|
-
end
|
200
|
-
|
201
|
-
private
|
202
|
-
|
203
|
-
def destroy_assets
|
204
|
-
PapermillAsset.find(:all, :conditions => {:assetable_id => self.id, :assetable_type => self.class.sti_name}).each do |asset|
|
205
|
-
asset.destroy
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
def rebase_assets
|
210
|
-
PapermillAsset.find(:all, :conditions => {:assetable_id => self.timestamp, :assetable_type => self.class.sti_name}).each do |asset|
|
211
|
-
if asset.created_at < 2.hours.ago
|
212
|
-
asset.destroy
|
213
|
-
else
|
214
|
-
asset.update_attribute(:assetable_id, self.id)
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
219
|
-
end
|