erp_tech_svcs 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +62 -0
- data/app/controllers/erp_tech_svcs/session_controller.rb +12 -7
- data/app/controllers/erp_tech_svcs/user_controller.rb +35 -14
- data/app/mailers/user_mailer.rb +8 -2
- data/app/models/attribute_type.rb +30 -0
- data/app/models/attribute_value.rb +41 -0
- data/app/models/file_asset.rb +58 -12
- data/app/models/secured_model.rb +4 -2
- data/app/models/user.rb +9 -7
- data/app/validators/password_strength_validator.rb +8 -0
- data/app/views/user_mailer/activation_needed_email.html.erb +1 -1
- data/config/initializers/erp_tech_svcs.rb +6 -1
- data/config/initializers/file_support.rb +9 -1
- data/config/initializers/sorcery.rb +3 -3
- data/config/routes.rb +2 -1
- data/db/data_migrations/20120109173616_create_download_capability_type.rb +13 -0
- data/db/migrate/20080805000010_base_tech_services.rb +12 -5
- data/db/migrate/20111117183144_create_has_attribute_tables.rb +38 -0
- data/db/migrate/{20111109161549_add_capabilites.rb → upgrade/20111109161549_add_capabilites.rb} +0 -0
- data/db/migrate/upgrade/20120329161641_add_file_asset_indexes.rb +22 -0
- data/lib/erp_tech_svcs/config.rb +20 -2
- data/lib/erp_tech_svcs/engine.rb +6 -0
- data/lib/erp_tech_svcs/extensions/active_record/has_capabilities.rb +18 -6
- data/lib/erp_tech_svcs/extensions/active_record/has_file_assets.rb +16 -3
- data/lib/erp_tech_svcs/extensions/active_record/has_relational_dynamic_attributes.rb +99 -0
- data/lib/erp_tech_svcs/extensions/active_record/has_roles.rb +3 -0
- data/lib/erp_tech_svcs/extensions/sorcery/user_activation.rb +13 -0
- data/lib/erp_tech_svcs/extensions.rb +5 -1
- data/lib/erp_tech_svcs/file_support/base.rb +1 -3
- data/lib/erp_tech_svcs/file_support/file_system_manager.rb +21 -19
- data/lib/erp_tech_svcs/file_support/manager.rb +29 -9
- data/lib/erp_tech_svcs/file_support/paperclip_patch.rb +13 -9
- data/lib/erp_tech_svcs/file_support/railties/s3_resolver.rb +24 -4
- data/lib/erp_tech_svcs/file_support/s3_manager.rb +133 -86
- data/lib/erp_tech_svcs/file_support.rb +5 -3
- data/lib/erp_tech_svcs/sms_wrapper/clickatell.rb +25 -0
- data/lib/erp_tech_svcs/sms_wrapper.rb +1 -0
- data/lib/erp_tech_svcs/utils/compass_access_negotiator.rb +12 -6
- data/lib/erp_tech_svcs/utils/default_nested_set_methods.rb +14 -1
- data/lib/erp_tech_svcs/version.rb +7 -1
- data/lib/erp_tech_svcs.rb +4 -2
- data/lib/tasks/erp_tech_svcs_tasks.rake +1 -1
- data/spec/controllers/erp_tech_svcs/user_controller_spec.rb +0 -0
- data/spec/lib/file_support/file_system_manager_spec.rb +82 -0
- data/spec/lib/file_support/s3_manager_spec.rb +92 -0
- data/spec/models/file_asset_spec.rb +78 -0
- data/spec/models/secured_model_spec.rb +22 -0
- data/spec/spec_helper.rb +9 -7
- metadata +146 -133
- data/README.rdoc +0 -2
- data/lib/erp_tech_svcs/file_support/aws_s3_patch.rb +0 -3
- data/spec/dummy/db/schema.rb +0 -571
- data/spec/dummy/db/spec.sqlite3 +0 -0
- data/spec/dummy/log/spec.log +0 -2862
data/lib/erp_tech_svcs/engine.rb
CHANGED
@@ -8,6 +8,12 @@ module ErpTechSvcs
|
|
8
8
|
include ErpTechSvcs::Extensions::ActiveRecord::HasRoles
|
9
9
|
include ErpTechSvcs::Extensions::ActiveRecord::HasFileAssets
|
10
10
|
include ErpTechSvcs::Extensions::ActiveRecord::HasCapabilities
|
11
|
+
include ErpTechSvcs::Extensions::ActiveRecord::HasRelationalDynamicAttributes
|
12
|
+
end
|
13
|
+
|
14
|
+
engine = self
|
15
|
+
config.to_prepare do
|
16
|
+
ErpBaseErpSvcs.register_compass_ae_engine(engine)
|
11
17
|
end
|
12
18
|
|
13
19
|
end
|
@@ -26,7 +26,11 @@ module ErpTechSvcs
|
|
26
26
|
end
|
27
27
|
|
28
28
|
module InstanceMethods
|
29
|
-
def
|
29
|
+
def has_capabilities?
|
30
|
+
!capabilities.empty?
|
31
|
+
end
|
32
|
+
|
33
|
+
def capabilities
|
30
34
|
capable_model.capabilities
|
31
35
|
end
|
32
36
|
|
@@ -42,7 +46,7 @@ module ErpTechSvcs
|
|
42
46
|
capability_type = convert_capability_type(capability_type)
|
43
47
|
raise ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::CapabilityTypeDoesNotExist if capability_type.nil?
|
44
48
|
|
45
|
-
capability =
|
49
|
+
capability = find_capability(capability_type, resource)
|
46
50
|
unless capability.nil?
|
47
51
|
capability.has_access?(user)
|
48
52
|
else
|
@@ -54,7 +58,7 @@ module ErpTechSvcs
|
|
54
58
|
capability_type = convert_capability_type(capability_type)
|
55
59
|
raise ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::CapabilityTypeDoesNotExist if capability_type.nil?
|
56
60
|
|
57
|
-
capability =
|
61
|
+
capability = find_capability(capability_type, resource)
|
58
62
|
if capability.nil?
|
59
63
|
capability = Capability.create(:capability_type => capability_type, :resource => resource)
|
60
64
|
capability.add_roles(roles)
|
@@ -71,7 +75,7 @@ module ErpTechSvcs
|
|
71
75
|
capability_type = convert_capability_type(capability_type)
|
72
76
|
raise ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::CapabilityTypeDoesNotExist if capability_type.nil?
|
73
77
|
|
74
|
-
capability =
|
78
|
+
capability = find_capability(capability_type, resource)
|
75
79
|
unless capability.nil?
|
76
80
|
capability.remove_all_roles
|
77
81
|
capability.add_roles(roles)
|
@@ -82,7 +86,7 @@ module ErpTechSvcs
|
|
82
86
|
|
83
87
|
def remove_all_capabilities
|
84
88
|
self.capabilities.each do |capability|
|
85
|
-
|
89
|
+
capability.destroy
|
86
90
|
end
|
87
91
|
end
|
88
92
|
|
@@ -90,7 +94,7 @@ module ErpTechSvcs
|
|
90
94
|
capability_type = convert_capability_type(capability_type)
|
91
95
|
raise ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::CapabilityTypeDoesNotExist if capability_type.nil?
|
92
96
|
|
93
|
-
capability =
|
97
|
+
capability = find_capability(capability_type, resource)
|
94
98
|
unless capability.nil?
|
95
99
|
capability.destroy
|
96
100
|
else
|
@@ -132,6 +136,14 @@ module ErpTechSvcs
|
|
132
136
|
CapabilityType.find_by_internal_identifier(type.to_s) if (type.is_a?(String) || type.is_a?(Symbol))
|
133
137
|
end
|
134
138
|
|
139
|
+
def find_capability(capability_type, resource)
|
140
|
+
if resource.nil?
|
141
|
+
self.capabilities.where('capability_type_id = ? and resource is null', capability_type.id).first
|
142
|
+
else
|
143
|
+
self.capabilities.where('capability_type_id = ? and resource = ?', capability_type.id, resource).first
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
135
147
|
end
|
136
148
|
end
|
137
149
|
end
|
@@ -20,9 +20,22 @@ module ErpTechSvcs
|
|
20
20
|
end
|
21
21
|
|
22
22
|
module InstanceMethods
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
|
24
|
+
# Capabilites can be passed via a hash
|
25
|
+
# {
|
26
|
+
# :download => ['admin', 'employee'],
|
27
|
+
# :edit => ['admin']
|
28
|
+
# }
|
29
|
+
#
|
30
|
+
def add_file(data, path=nil, capabilities=nil)
|
31
|
+
file_asset = FileAsset.create!(:file_asset_holder => self, :base_path => path, :data => data)
|
32
|
+
|
33
|
+
#set capabilites if they are passed
|
34
|
+
capabilities.each do |capability_type, roles|
|
35
|
+
file_asset.add_capability(capability_type, nil, roles)
|
36
|
+
end if capabilities
|
37
|
+
|
38
|
+
file_asset
|
26
39
|
end
|
27
40
|
|
28
41
|
def images
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module ErpTechSvcs
|
2
|
+
module Extensions
|
3
|
+
module ActiveRecord
|
4
|
+
module HasRelationalDynamicAttributes
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
|
11
|
+
def has_relational_dynamic_attributes
|
12
|
+
has_many :attribute_values, :as => :attributed_record, :dependent => :destroy
|
13
|
+
|
14
|
+
before_save :assign_dynamic_attribute_on_save
|
15
|
+
|
16
|
+
extend HasRelationalDynamicAttributes::SingletonMethods
|
17
|
+
include HasRelationalDynamicAttributes::InstanceMethods
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
module SingletonMethods
|
23
|
+
def find_by_dynamic_attribute(value, options={})
|
24
|
+
arel_query = AttributeValue.where('attributed_record_type = ?', self.name)
|
25
|
+
.where(AttributeValue.arel_table[:value].matches("%#{value}%"))
|
26
|
+
|
27
|
+
or_clauses = nil
|
28
|
+
options[:type_iids].each do |type_iid|
|
29
|
+
type = AttributeType.where('description = ? or internal_identifier = ?',type_iid,type_iid).first
|
30
|
+
raise "Attribute Type '#{type_iid}' does not exist" if type.nil?
|
31
|
+
or_clauses = or_clauses.nil? ? AttributeValue.arel_table[:attribute_type_id].eq(type.id) : or_clauses.or(AttributeValue.arel_table[:attribute_type_id].eq(type.id))
|
32
|
+
end if options[:type_iids]
|
33
|
+
|
34
|
+
arel_query = arel_query.where(or_clauses) if or_clauses
|
35
|
+
arel_query = arel_query.limit(options[:limit]) if options[:limit]
|
36
|
+
arel_query = arel_query.offset(options[:offset]) if options[:offset]
|
37
|
+
arel_query.all.collect(&:attributed_record)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module InstanceMethods
|
42
|
+
def update_or_create_dynamic_attribute(value, type, data_type)
|
43
|
+
if self.has_dynamic_attribute_of_type?(type)
|
44
|
+
update_first_dynamic_attribute_value_of_type(value, type)
|
45
|
+
else
|
46
|
+
add_dynamic_attribute(value, type, data_type)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def update_first_dynamic_attribute_value_of_type(value, type)
|
51
|
+
attribute_type = AttributeType.where('description = ? or internal_identifier = ?', type, type).first
|
52
|
+
attribute_value = self.attribute_values.where(:attribute_type_id => attribute_type.id).first
|
53
|
+
attribute_value.value = value
|
54
|
+
attribute_value.save!
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_dynamic_attributes
|
58
|
+
{}.tap do |hash|
|
59
|
+
self.attribute_values.each do |value|
|
60
|
+
hash[value.attribute_type.description] = value.value
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def get_dynamic_value_of_type(attribute_type_iid)
|
66
|
+
attribute_value = get_dynamic_attribute_of_type(attribute_type_iid)
|
67
|
+
attribute_value.nil? ? nil : attribute_value.value
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_dynamic_attribute_of_type(attribute_type_iid)
|
71
|
+
attribute_value = self.attribute_values.includes(:attribute_type).where('attribute_types.internal_identifier = ? or attribute_types.description = ?', attribute_type_iid.to_s, attribute_type_iid.to_s).first
|
72
|
+
attribute_value.nil? ? nil : attribute_value
|
73
|
+
end
|
74
|
+
|
75
|
+
def assign_dynamic_attribute_on_save
|
76
|
+
#template method overridden in implementing class
|
77
|
+
end
|
78
|
+
|
79
|
+
def has_dynamic_attribute_of_type? (attribute_type_iid)
|
80
|
+
!self.attribute_values.includes(:attribute_type).where('attribute_types.internal_identifier = ? or attribute_types.description = ?', attribute_type_iid.to_s, attribute_type_iid.to_s).first.nil?
|
81
|
+
end
|
82
|
+
|
83
|
+
def destroy_dynamic_attribute_of_type (attribute_type_iid)
|
84
|
+
self.attribute_values.includes(:attribute_type).destroy_all("attribute_types.internal_identifier = #{attribute_type_iid.to_s} or attribute_types.description = #{attribute_type_iid.to_s}")
|
85
|
+
end
|
86
|
+
|
87
|
+
def add_dynamic_attribute(value, type, data_type)
|
88
|
+
attribute_type = AttributeType.where('description = ? or internal_identifier = ?', type, type).first
|
89
|
+
attribute_type = AttributeType.create(:description => type, :data_type => data_type) unless attribute_type
|
90
|
+
attribute_value = AttributeValue.create(:value => value, :attribute_type => attribute_type)
|
91
|
+
self.attribute_values << attribute_value
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end#HasRelationalDynamicAttributes
|
97
|
+
end#ActiveRecord
|
98
|
+
end#Extensions
|
99
|
+
end#ErpTechSvcs
|
@@ -59,6 +59,7 @@ module ErpTechSvcs
|
|
59
59
|
unless self.has_role?(role)
|
60
60
|
self.secured_model.roles << role
|
61
61
|
self.secured_model.save
|
62
|
+
self.reload
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
@@ -79,11 +80,13 @@ module ErpTechSvcs
|
|
79
80
|
roles.flatten!
|
80
81
|
roles.each do |role|
|
81
82
|
self.remove_role(role)
|
83
|
+
self.reload
|
82
84
|
end
|
83
85
|
end
|
84
86
|
|
85
87
|
def remove_all_roles
|
86
88
|
self.roles.delete_all
|
89
|
+
self.reload
|
87
90
|
end
|
88
91
|
|
89
92
|
def has_role?(*passed_roles)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Sorcery::Model::Submodules::UserActivation::InstanceMethods.class_eval do
|
2
|
+
def deactivate!
|
3
|
+
config = sorcery_config
|
4
|
+
self.send(:"#{config.activation_state_attribute_name}=", "deactivated")
|
5
|
+
save!(:validate => false) # don't run validations
|
6
|
+
end
|
7
|
+
|
8
|
+
def reactivate!
|
9
|
+
config = sorcery_config
|
10
|
+
self.send(:"#{config.activation_state_attribute_name}=", "active")
|
11
|
+
save!(:validate => false) # don't run validations
|
12
|
+
end
|
13
|
+
end
|
@@ -2,4 +2,8 @@
|
|
2
2
|
require 'erp_tech_svcs/extensions/active_record/has_file_assets'
|
3
3
|
require 'erp_tech_svcs/extensions/active_record/has_roles'
|
4
4
|
require 'erp_tech_svcs/extensions/active_record/has_capabilities'
|
5
|
-
require 'erp_tech_svcs/extensions/active_record/acts_as_versioned'
|
5
|
+
require 'erp_tech_svcs/extensions/active_record/acts_as_versioned'
|
6
|
+
require 'erp_tech_svcs/extensions/active_record/has_relational_dynamic_attributes'
|
7
|
+
|
8
|
+
#sorcery
|
9
|
+
require 'erp_tech_svcs/extensions/sorcery/user_activation'
|
@@ -4,16 +4,16 @@ module ErpTechSvcs
|
|
4
4
|
REMOVE_FILES_REGEX = /^\./
|
5
5
|
|
6
6
|
def root
|
7
|
-
|
7
|
+
Rails.root.to_s
|
8
8
|
end
|
9
9
|
|
10
10
|
def update_file(path, content)
|
11
|
-
File.open(path, 'w
|
11
|
+
File.open(path, 'w+:ASCII-8BIT') {|f| f.write(content) }
|
12
12
|
end
|
13
13
|
|
14
14
|
def create_file(path, name, contents)
|
15
15
|
FileUtils.mkdir_p path unless File.exists? path
|
16
|
-
File.open(File.join(path,name), 'w
|
16
|
+
File.open(File.join(path,name), 'w+:ASCII-8BIT') {|f| f.write(contents) }
|
17
17
|
end
|
18
18
|
|
19
19
|
def create_folder(path, name)
|
@@ -21,14 +21,16 @@ module ErpTechSvcs
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def save_move(path, new_parent_path)
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
old_path = File.join(path)
|
25
|
+
new_path = File.join(new_parent_path)
|
26
|
+
result = false
|
27
|
+
unless File.exists? old_path
|
28
|
+
message = FILE_DOES_NOT_EXIST
|
27
29
|
else
|
28
30
|
name = File.basename(path)
|
29
31
|
#make sure path is there.
|
30
|
-
FileUtils.mkdir_p
|
31
|
-
FileUtils.mv(
|
32
|
+
FileUtils.mkdir_p new_path unless File.directory? new_path
|
33
|
+
FileUtils.mv(old_path, File.join(new_path,name))
|
32
34
|
message = "#{name} was moved to #{new_parent_path} successfully"
|
33
35
|
result = true
|
34
36
|
end
|
@@ -41,9 +43,9 @@ module ErpTechSvcs
|
|
41
43
|
end
|
42
44
|
|
43
45
|
def rename_file(path, name)
|
44
|
-
result =
|
46
|
+
result = false
|
45
47
|
unless File.exists? path
|
46
|
-
message =
|
48
|
+
message = FILE_DOES_NOT_EXIST
|
47
49
|
else
|
48
50
|
old_name = File.basename(path)
|
49
51
|
path_pieces = path.split('/')
|
@@ -59,18 +61,18 @@ module ErpTechSvcs
|
|
59
61
|
end
|
60
62
|
|
61
63
|
def delete_file(path, options={})
|
62
|
-
result =
|
64
|
+
result = false
|
63
65
|
name = File.basename(path)
|
64
66
|
is_directory = false
|
65
67
|
if !File.exists? path and !File.directory? path
|
66
|
-
message =
|
68
|
+
message = FILE_FOLDER_DOES_NOT_EXIST
|
67
69
|
else
|
68
70
|
if File.directory? path
|
69
71
|
is_directory = true
|
70
72
|
entries = Dir.entries(path)
|
71
73
|
entries.delete_if{|entry| entry =~ REMOVE_FILES_REGEX}
|
72
74
|
if entries.count > 0 && !options[:force]
|
73
|
-
message =
|
75
|
+
message = FOLDER_IS_NOT_EMPTY
|
74
76
|
result = false;
|
75
77
|
else
|
76
78
|
FileUtils.rm_rf(path)
|
@@ -91,9 +93,9 @@ module ErpTechSvcs
|
|
91
93
|
contents = nil
|
92
94
|
message = nil
|
93
95
|
unless File.exists? path
|
94
|
-
message =
|
96
|
+
message = FILE_DOES_NOT_EXIST
|
95
97
|
else
|
96
|
-
contents = IO.read(path)
|
98
|
+
contents = IO.read(path).force_encoding('ASCII-8BIT')
|
97
99
|
end
|
98
100
|
return contents, message
|
99
101
|
end
|
@@ -149,16 +151,16 @@ module ErpTechSvcs
|
|
149
151
|
tree_data[:children] << if options[:preload]
|
150
152
|
build_tree_for_directory(path, options) if options[:preload]
|
151
153
|
else
|
152
|
-
{:text => entry, :id => path}
|
154
|
+
{:text => entry, :id => path, :iconCls => 'icon-content'}
|
153
155
|
end
|
154
156
|
elsif !options[:included_file_extensions_regex].nil? && entry =~ options[:included_file_extensions_regex]
|
155
|
-
tree_data[:children] << {:text => entry, :leaf => true, :downloadPath =>
|
157
|
+
tree_data[:children] << {:text => entry, :leaf => true, :iconCls => 'icon-document', :downloadPath => directory, :id => path}
|
156
158
|
elsif options[:included_file_extensions_regex].nil?
|
157
|
-
tree_data[:children] << {:text => entry, :leaf => true, :downloadPath =>
|
159
|
+
tree_data[:children] << {:text => entry, :leaf => true, :iconCls => 'icon-document', :downloadPath => directory, :id => path}
|
158
160
|
end
|
159
161
|
end if File.directory?(directory)
|
160
162
|
|
161
|
-
tree_data[:children].sort_by{|item| [item[:
|
163
|
+
tree_data[:children].sort_by!{|item| [item[:text]]}
|
162
164
|
tree_data
|
163
165
|
end
|
164
166
|
|
@@ -1,11 +1,14 @@
|
|
1
1
|
module ErpTechSvcs
|
2
2
|
module FileSupport
|
3
3
|
class Manager
|
4
|
+
FOLDER_IS_NOT_EMPTY = 'Folder is not empty'
|
5
|
+
FILE_DOES_NOT_EXIST = 'File does not exist'
|
6
|
+
FILE_FOLDER_DOES_NOT_EXIST = 'File / Folder does not exist'
|
4
7
|
|
5
8
|
class << self
|
6
9
|
def find_parent(item, parents)
|
7
10
|
parents.find do |parent|
|
8
|
-
path = item[:path].
|
11
|
+
path = item[:path].split('/')[0..-2].join('/')
|
9
12
|
parent[:id] == path
|
10
13
|
end
|
11
14
|
end
|
@@ -50,9 +53,11 @@ module ErpTechSvcs
|
|
50
53
|
end
|
51
54
|
|
52
55
|
def build_file_assets_tree_for_model(model, starting_path)
|
56
|
+
files = model.files
|
57
|
+
|
53
58
|
node_tree = [{:text => root, :leaf => false, :id => root, :children => []}]
|
54
59
|
|
55
|
-
paths =
|
60
|
+
paths = files.collect{|file| File.join(file.directory,file.name)}
|
56
61
|
|
57
62
|
node_tree.first[:children] << {:id => starting_path, :text => starting_path.split('/').last, :children => []} if paths.select{|path| path.split('/')[1] == starting_path.split('/')[1]}.empty?
|
58
63
|
|
@@ -82,7 +87,16 @@ module ErpTechSvcs
|
|
82
87
|
level.each do |item|
|
83
88
|
parent = old_parents.count == 1 ? old_parents.first : self.class.find_parent(item, old_parents)
|
84
89
|
path = File.join(parent[:id], item[:text]).gsub(root, '')
|
85
|
-
|
90
|
+
icon_cls = File.extname(item[:text]).blank? ? 'icon-content' : 'icon-document'
|
91
|
+
child_hash = {:text => item[:text], :downloadPath => parent[:id], :iconCls => icon_cls, :leaf => !File.extname(item[:text]).blank?, :id => path, :children => []}
|
92
|
+
|
93
|
+
#attempt set security if this file is a file_asset model
|
94
|
+
file = files.find{|file| file.directory == parent[:id].gsub(root,'') and file.name == item[:text]}
|
95
|
+
unless file.nil?
|
96
|
+
child_hash[:isSecured] = file.has_capabilities?
|
97
|
+
child_hash[:iconCls] = 'icon-document_lock' if child_hash[:isSecured]
|
98
|
+
end
|
99
|
+
|
86
100
|
new_parents << child_hash
|
87
101
|
parent[:children] << child_hash
|
88
102
|
end
|
@@ -97,13 +111,15 @@ module ErpTechSvcs
|
|
97
111
|
def insert_folders(file_asset_nodes)
|
98
112
|
file_asset_nodes.each do |child_asset_node|
|
99
113
|
node = find_node(File.join(self.root,child_asset_node[:id]))
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
folder
|
104
|
-
|
114
|
+
unless node.nil?
|
115
|
+
folders = node[:children].select{|item| !item[:leaf]}
|
116
|
+
child_asset_node[:children] = [] if child_asset_node[:children].nil? && !folders.empty?
|
117
|
+
folders.each do |folder|
|
118
|
+
folder[:id].gsub!(self.root,'')
|
119
|
+
child_asset_node[:children] << folder unless child_asset_node[:children].collect{|child_node| child_node[:text] }.include?(folder[:text])
|
120
|
+
end
|
121
|
+
insert_folders(child_asset_node[:children])
|
105
122
|
end
|
106
|
-
insert_folders(child_asset_node[:children])
|
107
123
|
end unless file_asset_nodes.nil?
|
108
124
|
end
|
109
125
|
|
@@ -142,6 +158,10 @@ module ErpTechSvcs
|
|
142
158
|
end
|
143
159
|
end
|
144
160
|
|
161
|
+
def reload
|
162
|
+
# this is a template method
|
163
|
+
end
|
164
|
+
|
145
165
|
end#Manager
|
146
166
|
end#FileSupport
|
147
167
|
end#ErpTechSvcs
|
@@ -5,17 +5,21 @@ module Paperclip
|
|
5
5
|
@queued_for_write.each do |style, file|
|
6
6
|
begin
|
7
7
|
log("saving #{path(style)}")
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
acl = @s3_permissions[style] || @s3_permissions[:default]
|
9
|
+
acl = acl.call(self, style) if acl.respond_to?(:call)
|
10
|
+
write_options = {
|
11
|
+
:content_type => content_type,
|
12
|
+
:acl => acl
|
13
|
+
}
|
14
|
+
write_options[:metadata] = @s3_metadata unless @s3_metadata.empty?
|
15
|
+
unless @s3_server_side_encryption.blank?
|
16
|
+
write_options[:server_side_encryption] = @s3_server_side_encryption
|
17
|
+
end
|
18
|
+
write_options.merge!(@s3_headers)
|
19
|
+
s3_object(style).write(file, write_options)
|
20
|
+
rescue AWS::S3::Errors::NoSuchBucket => e
|
15
21
|
create_bucket
|
16
22
|
retry
|
17
|
-
rescue AWS::S3::ResponseError => e
|
18
|
-
raise
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
@@ -26,10 +26,15 @@ module ActionView
|
|
26
26
|
@cached[key][name][prefix][partial][locals] = decorate(yield, path_info, details, locals)
|
27
27
|
else
|
28
28
|
@cached[key][name][prefix][partial][locals].each do |template|
|
29
|
-
|
30
|
-
if
|
29
|
+
#check if the file still exists
|
30
|
+
if file_support.exists? template.identifier
|
31
|
+
last_update = mtime(template.identifier, file_support)
|
32
|
+
if last_update > template.updated_at
|
33
|
+
@cached[key][name][prefix][partial][locals].delete_if{|item| item.identifier == template.identifier}
|
34
|
+
@cached[key][name][prefix][partial][locals] << build_template(template.identifier, template.virtual_path, (details[:formats] || [:html] if template.formats.empty?), file_support, template.locals)
|
35
|
+
end
|
36
|
+
else
|
31
37
|
@cached[key][name][prefix][partial][locals].delete_if{|item| item.identifier == template.identifier}
|
32
|
-
@cached[key][name][prefix][partial][locals] << build_template(template.identifier, template.virtual_path, (details[:formats] || [:html] if template.formats.empty?), file_support, template.locals)
|
33
38
|
end
|
34
39
|
end
|
35
40
|
@cached[key][name][prefix][partial][locals]
|
@@ -70,9 +75,24 @@ module ActionView
|
|
70
75
|
|
71
76
|
protected
|
72
77
|
|
78
|
+
def cache_template(path, file_support)
|
79
|
+
contents, message = file_support.get_contents(path)
|
80
|
+
path = path.sub(%r{^/},'')
|
81
|
+
#Rails.logger.info "creating cache with key: #{path}"
|
82
|
+
Rails.cache.write(path, contents, :expires_in => ErpTechSvcs::Config.s3_cache_expires_in_minutes.minutes)
|
83
|
+
return contents, message
|
84
|
+
end
|
85
|
+
|
73
86
|
def build_template(p, virtual_path, formats, file_support, locals=nil)
|
74
87
|
handler, format = extract_handler_and_format(p, formats)
|
75
|
-
contents
|
88
|
+
contents = Rails.cache.read(p.sub(%r{^/},''))
|
89
|
+
if contents.nil?
|
90
|
+
contents, message = cache_template(p, file_support)
|
91
|
+
else
|
92
|
+
#Rails.logger.info "!!!!! USING CACHED TEMPLATE: #{contents.inspect}"
|
93
|
+
contents = contents.dup
|
94
|
+
end
|
95
|
+
|
76
96
|
Template.new(contents, p, handler, :virtual_path => virtual_path, :format => format, :updated_at => mtime(p, file_support), :locals => locals)
|
77
97
|
end
|
78
98
|
end
|