gluttonberg-core 2.5.5 → 2.5.6
Sign up to get free protection for your applications and to get access to all the features.
- data/app/assets/javascripts/gb_application.js +34 -0
- data/app/assets/stylesheets/gb_admin-override.sass +17 -1
- data/app/controllers/gluttonberg/admin/asset_library/assets_controller.rb +4 -2
- data/app/controllers/gluttonberg/admin/content/articles_controller.rb +22 -22
- data/app/controllers/gluttonberg/admin/content/comments_controller.rb +80 -23
- data/app/controllers/gluttonberg/admin/main_controller.rb +1 -1
- data/app/controllers/gluttonberg/public/comments_controller.rb +9 -8
- data/app/helpers/gluttonberg/admin.rb +3 -3
- data/app/helpers/gluttonberg/asset_library.rb +14 -11
- data/app/models/gluttonberg/asset.rb +8 -6
- data/app/models/gluttonberg/comment.rb +57 -3
- data/app/models/gluttonberg/comment_subscription.rb +2 -0
- data/app/models/gluttonberg/setting.rb +11 -5
- data/app/views/gluttonberg/admin/asset_library/assets/_browser_root.html.haml +20 -3
- data/app/views/gluttonberg/admin/asset_library/assets/search.json.haml +1 -1
- data/app/views/gluttonberg/admin/content/comments/index.html.haml +36 -10
- data/app/views/gluttonberg/admin/content/main/_sidebar.html.haml +6 -3
- data/app/views/gluttonberg/admin/main/index.html.haml +4 -4
- data/app/views/gluttonberg/admin/settings/generic_settings/index.html.haml +11 -7
- data/config/routes.rb +10 -0
- data/db/migrate/20130201025800_spam_flag_for_comments.rb +6 -0
- data/lib/engine.rb +3 -2
- data/lib/generators/gluttonberg/installer/installer_generator.rb +33 -32
- data/lib/gluttonberg/content/block.rb +2 -0
- data/lib/gluttonberg/content/clean_html.rb +16 -14
- data/lib/gluttonberg/content/despamilator/conf/unusual_characters.txt +6674 -0
- data/lib/gluttonberg/content/despamilator/filter/emails.rb +49 -0
- data/lib/gluttonberg/content/despamilator/filter/gtubs_test_filter.rb +25 -0
- data/lib/gluttonberg/content/despamilator/filter/html_tags.rb +134 -0
- data/lib/gluttonberg/content/despamilator/filter/ip_address_url.rb +27 -0
- data/lib/gluttonberg/content/despamilator/filter/long_words.rb +29 -0
- data/lib/gluttonberg/content/despamilator/filter/mixed_case.rb +25 -0
- data/lib/gluttonberg/content/despamilator/filter/naughty_words.rb +80 -0
- data/lib/gluttonberg/content/despamilator/filter/no_vowels.rb +28 -0
- data/lib/gluttonberg/content/despamilator/filter/numbers_and_words.rb +55 -0
- data/lib/gluttonberg/content/despamilator/filter/obfuscated_urls.rb +45 -0
- data/lib/gluttonberg/content/despamilator/filter/prices.rb +23 -0
- data/lib/gluttonberg/content/despamilator/filter/script_tag.rb +25 -0
- data/lib/gluttonberg/content/despamilator/filter/shouting.rb +38 -0
- data/lib/gluttonberg/content/despamilator/filter/spammy_tlds.rb +26 -0
- data/lib/gluttonberg/content/despamilator/filter/square_brackets.rb +27 -0
- data/lib/gluttonberg/content/despamilator/filter/trailing_number.rb +25 -0
- data/lib/gluttonberg/content/despamilator/filter/unusual_characters.rb +51 -0
- data/lib/gluttonberg/content/despamilator/filter/urls.rb +45 -0
- data/lib/gluttonberg/content/despamilator/filter/very_long_domain_name.rb +31 -0
- data/lib/gluttonberg/content/despamilator/filter/weird_punctuation.rb +48 -0
- data/lib/gluttonberg/content/despamilator/filter.rb +57 -0
- data/lib/gluttonberg/content/despamilator/subject/text.rb +36 -0
- data/lib/gluttonberg/content/despamilator/subject.rb +34 -0
- data/lib/gluttonberg/content/despamilator/version.rb +7 -0
- data/lib/gluttonberg/content/despamilator.rb +79 -0
- data/lib/gluttonberg/content.rb +12 -11
- data/lib/gluttonberg/library/attachment_mixin.rb +52 -269
- data/lib/gluttonberg/library/config/image_sizes.rb +61 -0
- data/lib/gluttonberg/library/config.rb +10 -0
- data/lib/gluttonberg/library/processor/audio.rb +42 -0
- data/lib/gluttonberg/library/processor/image.rb +134 -0
- data/lib/gluttonberg/library/processor.rb +11 -0
- data/lib/gluttonberg/library/storage/filesystem.rb +76 -0
- data/lib/gluttonberg/library/storage/s3.rb +196 -0
- data/lib/gluttonberg/library/storage.rb +11 -0
- data/lib/gluttonberg/library.rb +87 -86
- data/lib/gluttonberg/record_history.rb +14 -15
- data/lib/gluttonberg/tasks/asset.rake +25 -3
- data/lib/gluttonberg/version.rb +1 -1
- metadata +53 -2
@@ -0,0 +1,76 @@
|
|
1
|
+
module Gluttonberg
|
2
|
+
module Library
|
3
|
+
module Storage
|
4
|
+
module Filesystem
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
# It run when the engine is loaded. It makes sure that all the required
|
8
|
+
# directories for storing assets are in the public dir, creating them if
|
9
|
+
# they are missing. It also stores the various paths so they can be
|
10
|
+
# retreived using the assets_dir method.
|
11
|
+
def self.storage_setup
|
12
|
+
Library.set_asset_root("public/user_assets", "public/user_assets", "public/test_assets")
|
13
|
+
FileUtils.mkdir(Library.root) unless File.exists?(Library.root) || File.symlink?(Library.root)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
|
19
|
+
# The generated directory where this file is located. If it is an image
|
20
|
+
# it’s thumbnails will be stored here as well.
|
21
|
+
def directory
|
22
|
+
Filesystem::ClassMethods.storage_setup if Library.root.blank?
|
23
|
+
Library.root + "/" + self.asset_hash
|
24
|
+
end
|
25
|
+
|
26
|
+
def tmp_directory
|
27
|
+
Filesystem::ClassMethods.storage_setup if Library.tmp_root.blank?
|
28
|
+
Library.tmp_root + "/" + self.asset_hash
|
29
|
+
end
|
30
|
+
|
31
|
+
def assets_directory_public_url
|
32
|
+
"/user_assets"
|
33
|
+
end
|
34
|
+
|
35
|
+
def make_backup
|
36
|
+
unless File.exist?(original_file_on_disk)
|
37
|
+
FileUtils.cp location_on_disk, original_file_on_disk
|
38
|
+
FileUtils.chmod(0755,original_file_on_disk)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def remove_file_from_storage
|
43
|
+
if File.exists?(directory)
|
44
|
+
FileUtils.rm_r(directory)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def remove_file_from_tmp_storage
|
49
|
+
# just dummy method. As we don't need to remove because tmp and actual folder is same for filesystem
|
50
|
+
end
|
51
|
+
|
52
|
+
def update_file_on_storage
|
53
|
+
if file
|
54
|
+
FileUtils.mkdir(directory) unless File.exists?(directory)
|
55
|
+
FileUtils.cp file.tempfile.path, location_on_disk
|
56
|
+
FileUtils.chmod(0755, location_on_disk)
|
57
|
+
|
58
|
+
# new file has been upload, if its image generate thumbnails, if mp3 collect sound info.
|
59
|
+
asset_processing
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def move_tmp_file_to_actual_directory(file_name , tmp_file_dirty=true)
|
64
|
+
if self.file_dirty == true
|
65
|
+
self.file_dirty = false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# def write_file_to_disc(src_file_path , )
|
70
|
+
# end
|
71
|
+
end #InstanceMethods
|
72
|
+
|
73
|
+
end #Filesystem
|
74
|
+
end #Storage
|
75
|
+
end #Library
|
76
|
+
end #Gluttonberg
|
@@ -0,0 +1,196 @@
|
|
1
|
+
module Gluttonberg
|
2
|
+
module Library
|
3
|
+
module Storage
|
4
|
+
module S3
|
5
|
+
module ClassMethods
|
6
|
+
# It run when the engine is loaded. It makes sure that all the required
|
7
|
+
# directories for storing assets are in the public dir, creating them if
|
8
|
+
# they are missing. It also stores the various paths so they can be
|
9
|
+
# retreived using the assets_dir method.
|
10
|
+
TEMP_ASSET_DIRECTORY = "tmp/user_assets"
|
11
|
+
def self.storage_setup
|
12
|
+
Library.set_asset_root("user_assets", TEMP_ASSET_DIRECTORY, "public/test_assets")
|
13
|
+
FileUtils.mkdir(Library.root) unless File.exists?(Library.root) || File.symlink?(Library.root)
|
14
|
+
FileUtils.mkdir(Library.tmp_root) unless File.exists?(Library.tmp_root) || File.symlink?(Library.tmp_root)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.s3_server_url
|
18
|
+
Gluttonberg::Setting.get_setting("s3_server_url")
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.s3_bucket_name
|
22
|
+
Gluttonberg::Setting.get_setting("s3_bucket")
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.s3_server_key_id
|
26
|
+
Gluttonberg::Setting.get_setting("s3_key_id")
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.s3_server_access_key
|
30
|
+
Gluttonberg::Setting.get_setting("s3_access_key")
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.bucket_handle
|
34
|
+
key_id = S3::ClassMethods.s3_server_key_id
|
35
|
+
key_val = S3::ClassMethods.s3_server_access_key
|
36
|
+
s3_server_url = S3::ClassMethods.s3_server_url
|
37
|
+
s3_bucket = S3::ClassMethods.s3_bucket_name
|
38
|
+
if !key_id.blank? && !key_val.blank? && !s3_server_url.blank? && !s3_bucket.blank?
|
39
|
+
s3 = Aws::S3.new(key_id, key_val, {:server => s3_server_url})
|
40
|
+
bucket = s3.bucket(s3_bucket)
|
41
|
+
else
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
#takes file from public/assets folder and upload to s3 if s3 info is given in CMS settings
|
47
|
+
def self.migrate_file_to_s3(asset_hash , file_name)
|
48
|
+
bucket = bucket_handle
|
49
|
+
unless bucket.blank?
|
50
|
+
local_file = "public/user_assets/" + asset_hash + "/" + file_name
|
51
|
+
key_for_s3 = "user_assets/" + asset_hash + "/" + file_name
|
52
|
+
date = Time.now+1.years
|
53
|
+
key = bucket.key(key_for_s3, true)
|
54
|
+
asset = Gluttonberg::Asset.where(:asset_hash => asset_hash).first
|
55
|
+
unless asset.blank?
|
56
|
+
puts " Copying #{local_file} to #{S3::ClassMethods.s3_bucket_name}"
|
57
|
+
unless asset.mime_type.blank?
|
58
|
+
key.put(File.open(local_file), 'public-read', {"Expires" => date.rfc2822, "content-type" => asset.mime_type})
|
59
|
+
else
|
60
|
+
key.put(File.open(local_file), 'public-read', {"Expires" => date.rfc2822})
|
61
|
+
end
|
62
|
+
Gluttonberg::Asset.update_attributes(:copied_to_s3 => true)
|
63
|
+
puts "Copied"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
module InstanceMethods
|
71
|
+
|
72
|
+
def bucket_handle
|
73
|
+
unless @bucket.blank?
|
74
|
+
@bucket
|
75
|
+
else
|
76
|
+
@bucket = S3::ClassMethods.bucket_handle
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# The generated directory where this file is located.
|
81
|
+
def directory
|
82
|
+
S3::ClassMethods.storage_setup if Library.root.blank?
|
83
|
+
Library.root + "/" + self.asset_hash
|
84
|
+
end
|
85
|
+
|
86
|
+
# The generated tmp directory where we will locate this file temporarily for processing.
|
87
|
+
def tmp_directory
|
88
|
+
S3::ClassMethods.storage_setup if Library.tmp_root.blank?
|
89
|
+
Library.tmp_root + "/" + self.asset_hash
|
90
|
+
end
|
91
|
+
|
92
|
+
def s3_bucket_root_url
|
93
|
+
"http://#{S3::ClassMethods.s3_server_url}/#{S3::ClassMethods.s3_bucket_name}"
|
94
|
+
end
|
95
|
+
|
96
|
+
def assets_directory_public_url
|
97
|
+
"#{s3_bucket_root_url}/user_assets"
|
98
|
+
end
|
99
|
+
|
100
|
+
def make_backup
|
101
|
+
unless File.exist?(tmp_original_file_on_disk)
|
102
|
+
FileUtils.cp tmp_location_on_disk, tmp_original_file_on_disk
|
103
|
+
FileUtils.chmod(0755,tmp_original_file_on_disk)
|
104
|
+
move_tmp_file_to_actual_directory("original_" + file_name , true)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def remove_file_from_storage
|
109
|
+
remove_file_from_tmp_storage
|
110
|
+
remove_asset_folder_from_s3
|
111
|
+
end
|
112
|
+
|
113
|
+
def remove_file_from_tmp_storage
|
114
|
+
if File.exists?(tmp_directory)
|
115
|
+
puts "Remove assset folder from tmp storage (tmp_directory)"
|
116
|
+
FileUtils.rm_r(tmp_directory)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def update_file_on_storage
|
121
|
+
if file
|
122
|
+
FileUtils.mkdir(tmp_directory) unless File.exists?(tmp_directory)
|
123
|
+
FileUtils.cp file.tempfile.path, tmp_location_on_disk
|
124
|
+
FileUtils.chmod(0755, tmp_location_on_disk)
|
125
|
+
|
126
|
+
move_tmp_file_to_actual_directory(file_name , false)
|
127
|
+
# new file has been upload, if its image generate thumbnails, if mp3 collect sound info.
|
128
|
+
asset_processing
|
129
|
+
# delete local tmp folder
|
130
|
+
remove_file_from_tmp_storage
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def move_tmp_file_to_actual_directory(file_name , tmp_file_dirty=true)
|
135
|
+
if self.file_dirty == true || tmp_file_dirty == true
|
136
|
+
copy_file_to_s3(file_name)
|
137
|
+
self.file_dirty = false
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
#takes file from tmp folder and upload to s3 if s3 info is given in CMS settings
|
142
|
+
def copy_file_to_s3(file_name)
|
143
|
+
bucket = bucket_handle
|
144
|
+
unless bucket.blank?
|
145
|
+
local_file = self.tmp_directory + "/" + file_name
|
146
|
+
folder = self.asset_hash
|
147
|
+
date = Time.now+1.years
|
148
|
+
puts "Copying #{file_name} (#{local_file}) to #{S3::ClassMethods.s3_bucket_name}"
|
149
|
+
key = bucket.key(self.directory + "/" + file_name, true)
|
150
|
+
unless self.mime_type.blank?
|
151
|
+
key.put(File.open(local_file), 'public-read', {"Expires" => date.rfc2822, "content-type" => self.mime_type})
|
152
|
+
else
|
153
|
+
key.put(File.open(local_file), 'public-read', {"Expires" => date.rfc2822})
|
154
|
+
end
|
155
|
+
self.update_column(:copied_to_s3 , true)
|
156
|
+
puts "Copied"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
# TODO
|
163
|
+
def remove_file_from_s3(file_name)
|
164
|
+
end
|
165
|
+
|
166
|
+
def remove_asset_folder_from_s3
|
167
|
+
bucket = bucket_handle
|
168
|
+
unless bucket.blank?
|
169
|
+
bucket.delete_folder(self.directory)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def download_asset_to_tmp_file
|
174
|
+
download_orginal_file_from_s3
|
175
|
+
end
|
176
|
+
|
177
|
+
def download_orginal_file_from_s3
|
178
|
+
FileUtils.mkdir(self.tmp_directory) unless File.exists?(self.tmp_directory)
|
179
|
+
bucket = bucket_handle
|
180
|
+
key = bucket.key(self.location_on_disk)
|
181
|
+
File.open(self.tmp_location_on_disk, "w") do |f|
|
182
|
+
f.write(key.get)
|
183
|
+
end
|
184
|
+
key = bucket.key(self.original_file_on_disk)
|
185
|
+
if key.exists?
|
186
|
+
File.open(self.tmp_original_file_on_disk, "w") do |f|
|
187
|
+
f.write(key.get)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
end #InstanceMethods
|
193
|
+
end #S3
|
194
|
+
end #Storage
|
195
|
+
end #Library
|
196
|
+
end #Gluttonberg
|
data/lib/gluttonberg/library.rb
CHANGED
@@ -1,44 +1,47 @@
|
|
1
1
|
library = Pathname(__FILE__).dirname.expand_path
|
2
2
|
require File.join(library, "library", "attachment_mixin")
|
3
3
|
require File.join(library, "library", "quick_magick")
|
4
|
+
require File.join(library, "library", "storage")
|
5
|
+
require File.join(library, "library", "processor")
|
6
|
+
require File.join(library, "library", "config")
|
4
7
|
|
5
8
|
module Gluttonberg
|
6
|
-
# The library module encapsulates the few bits of functionality that lives
|
7
|
-
# outside of the library models and controllers. It contains some
|
9
|
+
# The library module encapsulates the few bits of functionality that lives
|
10
|
+
# outside of the library models and controllers. It contains some
|
8
11
|
# configuration details and is responsible for bootstrapping the various bits
|
9
12
|
# of meta-data used when categorising uploaded assets.
|
10
13
|
|
11
14
|
module Library
|
12
15
|
UNCATEGORISED_CATEGORY = 'uncategorised'
|
13
|
-
|
16
|
+
|
14
17
|
@@assets_root = nil
|
15
18
|
@@test_assets_root = nil
|
16
|
-
|
19
|
+
@@tmp_assets_root = nil
|
20
|
+
|
17
21
|
def self.bootstrap
|
18
22
|
build_default_asset_types
|
19
23
|
end
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
def self.setup
|
26
|
-
#logger.info("AssetLibrary is checking for asset folder")
|
27
|
-
@@assets_root = "public/user_assets"
|
28
|
-
@@test_assets_root = "public/test_assets"
|
29
|
-
FileUtils.mkdir(root) unless File.exists?(root) || File.symlink?(root)
|
24
|
+
|
25
|
+
def self.set_asset_root(asset_root , tmp_asset_root , test_asset_root)
|
26
|
+
@@assets_root = asset_root
|
27
|
+
@@tmp_assets_root = tmp_asset_root
|
28
|
+
@@test_assets_root = test_asset_root
|
30
29
|
end
|
31
|
-
|
30
|
+
|
32
31
|
# Returns the path to the directory where assets are stored.
|
33
32
|
def self.root
|
34
33
|
if ::Rails.env == "test"
|
35
34
|
@@test_assets_root
|
36
|
-
else
|
35
|
+
else
|
37
36
|
@@assets_root
|
38
|
-
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.tmp_root
|
41
|
+
@@tmp_assets_root
|
39
42
|
end
|
40
43
|
|
41
|
-
# This method is mainly for administrative purposes. It will rebuild the
|
44
|
+
# This method is mainly for administrative purposes. It will rebuild the
|
42
45
|
# table of asset types, then recategorise each asset.
|
43
46
|
def self.rebuild
|
44
47
|
Asset.clear_all_asset_types
|
@@ -56,79 +59,79 @@ module Gluttonberg
|
|
56
59
|
# Adds a the inbuilt asset types to the database.
|
57
60
|
def self.build_default_asset_types
|
58
61
|
begin
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
62
|
+
# ensure that all the categories exist
|
63
|
+
AssetCategory.build_defaults
|
64
|
+
ensure_type('Unknown Image', 'image', AssetCategory.image_category)
|
65
|
+
ensure_type('Unknown Video', 'video', AssetCategory.video_category)
|
66
|
+
ensure_type('Unknown Audio', 'audio', AssetCategory.audio_category)
|
67
|
+
ensure_type('Unknown File', 'multi-part model message unknown', AssetCategory.uncategorised_category)
|
68
|
+
|
69
|
+
ensure_type('Jpeg Image', 'image/jpeg image/pjpeg', AssetCategory.image_category)
|
70
|
+
ensure_type('Gif Image', 'image/gif', AssetCategory.image_category)
|
71
|
+
ensure_type('Png Image', 'image/png', AssetCategory.image_category)
|
72
|
+
ensure_type('Tiff Image', 'image/tiff', AssetCategory.image_category)
|
73
|
+
ensure_type('Adobe Photoshop Image', 'image/vnd.adobe.photoshop', AssetCategory.image_category)
|
74
|
+
ensure_type('Autocad Image', 'image/vnd.dwg', AssetCategory.image_category)
|
75
|
+
ensure_type('Autocad Image', 'image/vnd.dxf', AssetCategory.image_category)
|
76
|
+
ensure_type('Icon Image', 'image/vnd.microsoft.icon', AssetCategory.image_category)
|
77
|
+
ensure_type('Bitmap Image', 'image/x-bmp image/bmp image/x-win-bmp', AssetCategory.image_category)
|
78
|
+
ensure_type('Paintshop Pro Image', 'image/x-paintshoppro', AssetCategory.image_category)
|
79
|
+
ensure_type('Mobile Image (plb,psb,pvb)', 'application/vnd.3gpp.pic-bw-large application/vnd.3gpp.pic-bw-small application/vnd.3gpp.pic-bw-var', AssetCategory.image_category)
|
80
|
+
|
81
|
+
ensure_type('Moile Audio (3gpp,3gpp2)', 'audio/3gpp audio/3gpp2', AssetCategory.audio_category)
|
82
|
+
ensure_type('Dolby Digital Audio (ac3)', 'audio/ac3', AssetCategory.audio_category)
|
83
|
+
ensure_type('Mpeg Audio (mpga,mp2,mp3,mp4,mpa)', 'audio/mpeg audio/mpeg4-generic audio/mp4 audio/mpa-robust', AssetCategory.audio_category) # @mpga,mp2,mp3
|
84
|
+
ensure_type('Aiff Audio (aif,aifc,aiff)', 'audio/x-aiff', AssetCategory.audio_category)
|
85
|
+
ensure_type('Midi Audio (mid,midi,kar)', 'audio/x-midi', AssetCategory.audio_category)
|
86
|
+
ensure_type('Real Audio (rm,ram,ra)', 'audio/x-pn-realaudio audio/x-realaudio', AssetCategory.audio_category)
|
87
|
+
ensure_type('Wav Audio (wav)', 'audio/x-wav', AssetCategory.audio_category)
|
88
|
+
ensure_type('Ogg Vorbis Audio (ogg)', 'application/ogg', AssetCategory.audio_category)
|
89
|
+
|
90
|
+
ensure_type('Mobile Video', 'video/3gpp video/3gpp-tt video/3gpp2', AssetCategory.video_category) # @3gp,3gpp 'RFC3839,DRAFT:draft-gellens-mime-bucket
|
91
|
+
ensure_type('Digital Video', 'video/DV', AssetCategory.video_category) # RFC3189
|
92
|
+
ensure_type('Compressed Video', 'application/mpeg4-iod-xmt application/mpeg4-iod application/mpeg4-generic video/mp4 application/mp4 video/MPV video/mpeg4-generic video/mpeg video/MP2T video/H261 video/H263 video/H263-1998 video/H263-2000 video/H264 video/MP1S video/MP2P', AssetCategory.video_category) # RFC3555
|
93
|
+
ensure_type('Jpeg Video', 'video/JPEG video/MJ2', AssetCategory.video_category) # RFC3555
|
94
|
+
ensure_type('Quicktime Video', 'video/quicktime', AssetCategory.video_category)
|
95
|
+
ensure_type('Uncompressed Video', 'video/raw', AssetCategory.video_category)
|
96
|
+
ensure_type('Mpeg Playlist (mxu,m4u)', 'video/vnd.mpegurl', AssetCategory.video_category)
|
97
|
+
ensure_type('Avi Video (avi)', 'video/x-msvideo', AssetCategory.video_category)
|
98
|
+
ensure_type('Flash Video', 'video/x-flv', AssetCategory.video_category)
|
99
|
+
|
100
|
+
ensure_type('M4v Video', 'video/x-m4v', AssetCategory.video_category)
|
101
|
+
|
102
|
+
#document category
|
103
|
+
ensure_type('Generic Document', 'application/x-csh application/x-dvi application/oda application/pgp-encrypted application/pgp-keys application/pgp-signature', AssetCategory.document_category)
|
104
|
+
ensure_type('Calendar Document', 'text/calendar text/x-vcalendar', AssetCategory.document_category)
|
105
|
+
ensure_type('Comma Seperated Values Document (csv)', 'text/csv text/comma-separated-values', AssetCategory.document_category)
|
106
|
+
ensure_type('Tab Seperated Values Text Document', 'text/tab-separated-values', AssetCategory.document_category)
|
107
|
+
ensure_type('Web Document', 'text/html', AssetCategory.document_category)
|
108
|
+
ensure_type('Plain Text Document', 'text/plain', AssetCategory.document_category)
|
109
|
+
ensure_type('Rich Text Document', 'text/richtext text/rtf', AssetCategory.document_category)
|
110
|
+
ensure_type('Sgml Document', 'text/sgml', AssetCategory.document_category)
|
111
|
+
ensure_type('Wap Document', 'text/vnd.wap.wml text/vnd.wap.wmlscript', AssetCategory.document_category)
|
112
|
+
ensure_type('XML Document', 'text/xml text/xml-external-parsed-entity', AssetCategory.document_category)
|
113
|
+
ensure_type('V-Card Document (vcf)', 'text/x-vcard', AssetCategory.document_category)
|
114
|
+
ensure_type('Apple Macintosh Document (hqx)', 'application/mac-binhex40', AssetCategory.document_category)
|
115
|
+
ensure_type('Adobe Acrobat Document (pdf)', 'application/pdf', AssetCategory.document_category)
|
116
|
+
ensure_type('Microsoft Word Document (doc,dot,docx)', 'application/msword application/word', AssetCategory.document_category)
|
117
|
+
ensure_type('Microsoft Powerpoint Document (ppt,pps,pot,pptx)', 'application/vnd.ms-powerpoint application/powerpoint', AssetCategory.document_category)
|
118
|
+
ensure_type('Microsoft Excel Document (xls,xlt,xlsx)', 'application/vnd.ms-excel application/excel', AssetCategory.document_category)
|
119
|
+
ensure_type('Microsoft Works Document', 'application/vnd.ms-works', AssetCategory.document_category)
|
120
|
+
ensure_type('Microsoft Project Document (mpp)', 'application/vnd.ms-project', AssetCategory.document_category)
|
121
|
+
ensure_type('Microsoft Visio Document (vsd,vst,vsw,vss)', 'application/vnd.visio', AssetCategory.document_category)
|
122
|
+
ensure_type('HTML Help Document (chm)', 'application/x-chm', AssetCategory.document_category)
|
123
|
+
|
124
|
+
|
122
125
|
rescue => e
|
123
126
|
puts "asset library init fails."
|
124
127
|
puts e
|
125
|
-
end
|
128
|
+
end
|
126
129
|
|
127
130
|
end
|
128
131
|
|
129
132
|
private
|
130
|
-
|
131
|
-
# Makes sure the specified type exists in the DB, if it doesn’t it creates
|
133
|
+
|
134
|
+
# Makes sure the specified type exists in the DB, if it doesn’t it creates
|
132
135
|
# a new record.
|
133
136
|
def self.ensure_type(name, mime_type, category)
|
134
137
|
asset_type = AssetType.first( :conditions => "name = '#{name}'" )
|
@@ -145,7 +148,5 @@ module Gluttonberg
|
|
145
148
|
asset_type.save
|
146
149
|
end
|
147
150
|
|
148
|
-
|
149
|
-
|
150
151
|
end # Library
|
151
152
|
end # Gluttonberg
|
@@ -2,18 +2,18 @@
|
|
2
2
|
module Gluttonberg
|
3
3
|
module RecordHistory
|
4
4
|
def self.setup
|
5
|
-
::ActionController::Base.send :include, Gluttonberg::RecordHistory::ActionController
|
5
|
+
::ActionController::Base.send :include, Gluttonberg::RecordHistory::ActionController
|
6
6
|
end
|
7
7
|
|
8
8
|
module ActionController
|
9
9
|
def self.included(base)
|
10
10
|
base.extend(ClassMethods)
|
11
11
|
end
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
|
14
14
|
module ClassMethods
|
15
15
|
def record_history(object_name, title_field_name="", options = {})
|
16
|
-
class << self;
|
16
|
+
class << self;
|
17
17
|
attr_accessor :object_name, :title_field_name;
|
18
18
|
end
|
19
19
|
self.object_name = object_name
|
@@ -23,7 +23,7 @@ module Gluttonberg
|
|
23
23
|
after_filter :log_update , :only => [:update]
|
24
24
|
after_filter :log_destroy, :only => [:destroy]
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
end # class methods
|
28
28
|
|
29
29
|
module ControllerHelperClassMethods
|
@@ -32,22 +32,22 @@ module Gluttonberg
|
|
32
32
|
if object.new_record?
|
33
33
|
else
|
34
34
|
Gluttonberg::Feed.log(current_user, object ,object_title , "created")
|
35
|
-
end
|
36
|
-
end
|
35
|
+
end
|
36
|
+
end
|
37
37
|
end
|
38
38
|
|
39
39
|
def log_update
|
40
40
|
unless object.blank?
|
41
41
|
if object.errors.blank?
|
42
42
|
Gluttonberg::Feed.log(current_user, object ,object_title , "updated")
|
43
|
-
end
|
44
|
-
end
|
43
|
+
end
|
44
|
+
end
|
45
45
|
end
|
46
46
|
|
47
47
|
def log_destroy
|
48
48
|
if object && object.destroyed?()
|
49
49
|
Gluttonberg::Feed.log(current_user, object ,object_title , "deleted")
|
50
|
-
end
|
50
|
+
end
|
51
51
|
end
|
52
52
|
|
53
53
|
def object
|
@@ -73,21 +73,20 @@ module Gluttonberg
|
|
73
73
|
field_name = :id
|
74
74
|
end
|
75
75
|
else
|
76
|
-
field_name = self.class.title_field_name
|
76
|
+
field_name = self.class.title_field_name
|
77
77
|
end
|
78
|
-
puts "==================== field_name #{field_name}"
|
79
78
|
unless field_name.blank?
|
80
79
|
object.send(field_name)
|
81
80
|
end
|
82
|
-
end
|
83
|
-
end
|
81
|
+
end
|
82
|
+
end
|
84
83
|
|
85
84
|
end #ControllerHelperClassMethods
|
86
85
|
|
87
86
|
|
88
87
|
end
|
89
88
|
|
90
|
-
end #RecordHistory
|
89
|
+
end #RecordHistory
|
91
90
|
end #Gluttonberg
|
92
91
|
|
93
92
|
|
@@ -12,9 +12,14 @@ namespace :gluttonberg do
|
|
12
12
|
assets = category.assets #Asset.all
|
13
13
|
assets.each do |asset|
|
14
14
|
p "thumb-nailing '#{asset.file_name}' "
|
15
|
-
asset.
|
16
|
-
|
17
|
-
|
15
|
+
if !File.exist?(asset.tmp_location_on_disk) && !File.exist?(asset.tmp_original_file_on_disk)
|
16
|
+
asset.download_asset_to_tmp_file
|
17
|
+
end
|
18
|
+
# asset.generate_image_thumb
|
19
|
+
# asset.generate_proper_resolution
|
20
|
+
# asset.save
|
21
|
+
Gluttonberg::Library::Processor::Image.process(asset)
|
22
|
+
asset.remove_file_from_tmp_storage
|
18
23
|
end
|
19
24
|
end
|
20
25
|
end
|
@@ -44,5 +49,22 @@ namespace :gluttonberg do
|
|
44
49
|
Gluttonberg::Asset.update_assets_synopsis_from_csv
|
45
50
|
end
|
46
51
|
|
52
|
+
desc "Migrate assets from public/user_assets folder to S3"
|
53
|
+
task :migrate_assets_to_s3 => :environment do
|
54
|
+
Dir.entries("public/user_assets").each do |asset_folder|
|
55
|
+
if !asset_folder.include?(".DS_Store") && File.directory?("public/user_assets/" + asset_folder)
|
56
|
+
Dir.entries("public/user_assets/"+asset_folder).each do |asset_file|
|
57
|
+
if !asset_file.include?(".DS_Store") && !File.directory?("public/user_assets/" + asset_folder+"/"+asset_file)
|
58
|
+
begin
|
59
|
+
Gluttonberg::Library::Storage::S3::ClassMethods.migrate_file_to_s3(asset_folder , asset_file)
|
60
|
+
rescue => e
|
61
|
+
puts "Error: #{e.message}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
47
69
|
end
|
48
70
|
end
|
data/lib/gluttonberg/version.rb
CHANGED