knitkit 2.1.0 → 2.1.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.
@@ -212,7 +212,7 @@ module Knitkit
212
212
 
213
213
  render :inline => {:success => false, :error => "No Website Selected"}.to_json if (@assets_model.nil? && params[:action] != "base_path")
214
214
  else
215
- @assets_model = CompassAeInstance.first
215
+ @assets_model = CompassAeInstance.find_by_internal_identifier('base')
216
216
  end
217
217
  end
218
218
 
@@ -73,8 +73,6 @@ module Knitkit
73
73
  theme = Theme.find(params[:id])
74
74
  zip_path = theme.export
75
75
  send_file(zip_path.to_s, :stream => false) rescue raise "Error sending #{zip_path} file"
76
- ensure
77
- FileUtils.rm_r File.dirname(zip_path) rescue nil
78
76
  end
79
77
 
80
78
  def change_status
@@ -2,13 +2,14 @@ class Website < ActiveRecord::Base
2
2
  attr_protected :created_at, :updated_at
3
3
 
4
4
  after_destroy :remove_sites_directory, :remove_website_role
5
- after_create :setup_website
5
+ after_create :setup_website
6
6
 
7
7
  protected_with_capabilities
8
8
  has_file_assets
9
9
 
10
10
  extend FriendlyId
11
11
  friendly_id :name, :use => [:slugged], :slug_column => :internal_identifier
12
+
12
13
  def should_generate_new_friendly_id?
13
14
  new_record?
14
15
  end
@@ -25,7 +26,7 @@ class Website < ActiveRecord::Base
25
26
  end
26
27
  has_many :website_sections, :dependent => :destroy, :order => :lft do
27
28
  def paths
28
- collect{|website_section| website_section.paths}.flatten
29
+ collect { |website_section| website_section.paths }.flatten
29
30
  end
30
31
 
31
32
  #have to do a sort by to override what awesome nested set does for the order by (lft)
@@ -34,7 +35,7 @@ class Website < ActiveRecord::Base
34
35
  end
35
36
 
36
37
  def update_paths!
37
- all.each{|section| section.self_and_descendants.each{|_section| _section.update_path!}}
38
+ all.each { |section| section.self_and_descendants.each { |_section| _section.update_path! } }
38
39
  end
39
40
  end
40
41
 
@@ -68,7 +69,7 @@ class Website < ActiveRecord::Base
68
69
  end
69
70
 
70
71
  def all_section_paths
71
- WebsiteSection.select(:path).where(:website_id => self.id).collect{|row| row['path']}
72
+ WebsiteSection.select(:path).where(:website_id => self.id).collect { |row| row['path'] }
72
73
  end
73
74
 
74
75
  def config_value(config_item_type_iid)
@@ -148,7 +149,7 @@ class Website < ActiveRecord::Base
148
149
  def remove_sites_directory
149
150
  file_support = ErpTechSvcs::FileSupport::Base.new(:storage => Rails.application.config.erp_tech_svcs.file_storage)
150
151
  begin
151
- file_support.delete_file(File.join(file_support.root,"sites/#{self.iid}"), :force => true)
152
+ file_support.delete_file(File.join(file_support.root, "sites/#{self.iid}"), :force => true)
152
153
  rescue
153
154
  #do nothing it may not exist
154
155
  end
@@ -161,12 +162,12 @@ class Website < ActiveRecord::Base
161
162
  def setup_default_pages
162
163
  # create default sections for each widget using widget layout
163
164
  widget_classes = [
164
- ::Widgets::ContactUs::Base,
165
- ::Widgets::Search::Base,
166
- ::Widgets::ManageProfile::Base,
167
- ::Widgets::Login::Base,
168
- ::Widgets::Signup::Base,
169
- ::Widgets::ResetPassword::Base
165
+ ::Widgets::ContactUs::Base,
166
+ ::Widgets::Search::Base,
167
+ ::Widgets::ManageProfile::Base,
168
+ ::Widgets::Login::Base,
169
+ ::Widgets::Signup::Base,
170
+ ::Widgets::ResetPassword::Base
170
171
  ]
171
172
  profile_page = nil
172
173
  widget_classes.each do |widget_class|
@@ -187,15 +188,15 @@ class Website < ActiveRecord::Base
187
188
 
188
189
  def export_setup
189
190
  setup_hash = {
190
- :name => name,
191
- :hosts => hosts.collect(&:host),
192
- :title => title,
193
- :subtitle => subtitle,
194
- :internal_identifier => internal_identifier,
195
- :sections => [],
196
- :images => [],
197
- :files => [],
198
- :website_navs => []
191
+ :name => name,
192
+ :hosts => hosts.collect(&:host),
193
+ :title => title,
194
+ :subtitle => subtitle,
195
+ :internal_identifier => internal_identifier,
196
+ :sections => [],
197
+ :images => [],
198
+ :files => [],
199
+ :website_navs => []
199
200
  }
200
201
 
201
202
  #TODO update to handle configurations
@@ -206,8 +207,8 @@ class Website < ActiveRecord::Base
206
207
 
207
208
  setup_hash[:website_navs] = website_navs.collect do |website_nav|
208
209
  {
209
- :name => website_nav.name,
210
- :items => website_nav.items.positioned.map{|website_nav_item| build_menu_item_hash(website_nav_item)}
210
+ :name => website_nav.name,
211
+ :items => website_nav.items.positioned.map { |website_nav_item| build_menu_item_hash(website_nav_item) }
211
212
  }
212
213
  end
213
214
 
@@ -226,52 +227,52 @@ class Website < ActiveRecord::Base
226
227
  tmp_dir = Website.make_tmp_dir
227
228
  file_support = ErpTechSvcs::FileSupport::Base.new(:storage => Rails.application.config.erp_tech_svcs.file_storage)
228
229
 
229
- sections_path = Pathname.new(File.join(tmp_dir,'sections'))
230
+ sections_path = Pathname.new(File.join(tmp_dir, 'sections'))
230
231
  FileUtils.mkdir_p(sections_path) unless sections_path.exist?
231
232
 
232
- articles_path = Pathname.new(File.join(tmp_dir,'articles'))
233
+ articles_path = Pathname.new(File.join(tmp_dir, 'articles'))
233
234
  FileUtils.mkdir_p(articles_path) unless articles_path.exist?
234
235
 
235
236
  documented_contents_path = Pathname.new(File.join(tmp_dir, 'documented contents'))
236
237
  FileUtils.mkdir_p(documented_contents_path) unless documented_contents_path.exist?
237
238
 
238
- excerpts_path = Pathname.new(File.join(tmp_dir,'excerpts'))
239
+ excerpts_path = Pathname.new(File.join(tmp_dir, 'excerpts'))
239
240
  FileUtils.mkdir_p(excerpts_path) unless excerpts_path.exist?
240
241
 
241
- image_assets_path = Pathname.new(File.join(tmp_dir,'images'))
242
+ image_assets_path = Pathname.new(File.join(tmp_dir, 'images'))
242
243
  FileUtils.mkdir_p(image_assets_path) unless image_assets_path.exist?
243
244
 
244
- file_assets_path = Pathname.new(File.join(tmp_dir,'files'))
245
+ file_assets_path = Pathname.new(File.join(tmp_dir, 'files'))
245
246
  FileUtils.mkdir_p(file_assets_path) unless file_assets_path.exist?
246
247
 
247
248
  sections.each do |website_section|
248
249
  unless website_section.layout.blank?
249
- File.open(File.join(sections_path,"#{website_section.internal_identifier}.rhtml"), 'wb+') {|f| f.puts(website_section.layout) }
250
+ File.open(File.join(sections_path, "#{website_section.internal_identifier}.rhtml"), 'wb+') { |f| f.puts(website_section.layout) }
250
251
  end
251
252
  end
252
253
 
253
254
  contents = sections.collect(&:contents).flatten.uniq
254
255
  contents.each do |content|
255
- File.open(File.join(articles_path,"#{content.internal_identifier}.html"), 'wb+') {|f| f.puts(content.body_html) }
256
+ File.open(File.join(articles_path, "#{content.internal_identifier}.html"), 'wb+') { |f| f.puts(content.body_html) }
256
257
  unless content.excerpt_html.blank?
257
- File.open(File.join(excerpts_path,"#{content.internal_identifier}.html"), 'wb+') {|f| f.puts(content.excerpt_html) }
258
+ File.open(File.join(excerpts_path, "#{content.internal_identifier}.html"), 'wb+') { |f| f.puts(content.excerpt_html) }
258
259
  end
259
260
  end
260
261
 
261
262
  online_document_sections.each do |online_documented_section|
262
- File.open(File.join(documented_contents_path,"#{online_documented_section.internal_identifier}.html"), 'wb+') {|f| f.puts(online_documented_section.documented_item_published_content_html(active_publication)) }
263
+ File.open(File.join(documented_contents_path, "#{online_documented_section.internal_identifier}.html"), 'wb+') { |f| f.puts(online_documented_section.documented_item_published_content_html(active_publication)) }
263
264
  end
264
265
 
265
266
  self.files.where("directory like '%/sites/#{self.iid}/images%'").all.each do |image_asset|
266
- contents = file_support.get_contents(File.join(file_support.root,image_asset.directory,image_asset.name))
267
- FileUtils.mkdir_p(File.join(image_assets_path,image_asset.directory))
268
- File.open(File.join(image_assets_path,image_asset.directory,image_asset.name), 'wb+') {|f| f.puts(contents) }
267
+ contents = file_support.get_contents(File.join(file_support.root, image_asset.directory, image_asset.name))
268
+ FileUtils.mkdir_p(File.join(image_assets_path, image_asset.directory))
269
+ File.open(File.join(image_assets_path, image_asset.directory, image_asset.name), 'wb+') { |f| f.puts(contents) }
269
270
  end
270
271
 
271
272
  self.files.where("directory like '%/#{Rails.application.config.erp_tech_svcs.file_assets_location}/sites/#{self.iid}%'").all.each do |file_asset|
272
- contents = file_support.get_contents(File.join(file_support.root,file_asset.directory,file_asset.name))
273
- FileUtils.mkdir_p(File.join(file_assets_path,file_asset.directory))
274
- File.open(File.join(file_assets_path,file_asset.directory,file_asset.name), 'wb+') {|f| f.puts(contents) }
273
+ contents = file_support.get_contents(File.join(file_support.root, file_asset.directory, file_asset.name))
274
+ FileUtils.mkdir_p(File.join(file_assets_path, file_asset.directory))
275
+ File.open(File.join(file_assets_path, file_asset.directory, file_asset.name), 'wb+') { |f| f.puts(contents) }
275
276
  end
276
277
 
277
278
  files = []
@@ -329,14 +330,14 @@ class Website < ActiveRecord::Base
329
330
  data = StringIO.new(data) if data.present?
330
331
  setup_hash = YAML.load(data)
331
332
  else
332
- type = entry.name.split('/')[0]
333
+ type = entry.name.split('/')[0]
333
334
  name = entry.name.split('/').last
334
335
  next if name.nil?
335
336
 
336
337
  if File.exist?(f_path) and !File.directory?(f_path)
337
338
  entry_hash = {:type => type, :name => name, :path => entry.name}
338
339
  entries << entry_hash unless name == 'sections' || name == 'articles' || name == 'excerpts' || name == 'documented contents'
339
- entry_hash[:data] = File.open(f_path,"rb") {|io| io.read}
340
+ entry_hash[:data] = File.open(f_path, "rb") { |io| io.read }
340
341
  end
341
342
  end
342
343
 
@@ -347,10 +348,10 @@ class Website < ActiveRecord::Base
347
348
 
348
349
  if Website.find_by_internal_identifier(setup_hash[:internal_identifier]).nil?
349
350
  website = Website.new(
350
- :name => setup_hash[:name],
351
- :title => setup_hash[:title],
352
- :subtitle => setup_hash[:subtitle],
353
- :internal_identifier => setup_hash[:internal_identifier]
351
+ :name => setup_hash[:name],
352
+ :title => setup_hash[:title],
353
+ :subtitle => setup_hash[:subtitle],
354
+ :internal_identifier => setup_hash[:internal_identifier]
354
355
  )
355
356
 
356
357
  #TODO update to handle configurations
@@ -374,7 +375,7 @@ class Website < ActiveRecord::Base
374
375
  setup_hash[:images].each do |image_asset|
375
376
  filename = 'images' + image_asset[:path] + '/' + image_asset[:name]
376
377
  #puts "image_asset '#{filename}'"
377
- content = entries.find{|entry| entry[:type] == 'images' and entry[:path] == filename }
378
+ content = entries.find { |entry| entry[:type] == 'images' and entry[:path] == filename }
378
379
  unless content.nil?
379
380
  website.add_file(content[:data], File.join(file_support.root, image_asset[:path], image_asset[:name]))
380
381
  end
@@ -384,7 +385,7 @@ class Website < ActiveRecord::Base
384
385
  setup_hash[:files].each do |file_asset|
385
386
  filename = 'files' + file_asset[:path] + '/' + file_asset[:name]
386
387
  #puts "file_asset '#{filename}'"
387
- content = entries.find{|entry| entry[:type] == 'files' and entry[:path] == filename }
388
+ content = entries.find { |entry| entry[:type] == 'files' and entry[:path] == filename }
388
389
  unless content.nil?
389
390
  website.add_file(content[:data], File.join(file_support.root, file_asset[:path], file_asset[:name]))
390
391
  end
@@ -419,7 +420,7 @@ class Website < ActiveRecord::Base
419
420
 
420
421
  website.publish("Website Imported", current_user)
421
422
 
422
- rescue Exception=>ex
423
+ rescue Exception => ex
423
424
  Rails.logger.error "#{ex.inspect} #{ex.backtrace}"
424
425
  website.destroy unless website.nil?
425
426
  raise ex
@@ -439,9 +440,9 @@ class Website < ActiveRecord::Base
439
440
 
440
441
  def build_menu_item(hash)
441
442
  website_item = WebsiteNavItem.new(
442
- :title => hash[:title],
443
- :url => hash[:url],
444
- :position => hash[:position]
443
+ :title => hash[:title],
444
+ :url => hash[:url],
445
+ :position => hash[:position]
445
446
  )
446
447
  unless hash[:linked_to_item_type].blank?
447
448
  website_item.linked_to_item = WebsiteSection.find_by_path(hash[:linked_to_item_path])
@@ -451,36 +452,34 @@ class Website < ActiveRecord::Base
451
452
  child_website_item = build_menu_item(item)
452
453
  child_website_item.move_to_child_of(website_item)
453
454
  end
454
- unless hash[:roles].empty?
455
- hash[:roles].each do |role|
456
- website_item.add_role(SecurityRole.find_by_internal_identifier(role)) rescue nil #do nothing if the role does not exist
457
- end
458
- end
455
+ #add role if is_secured
456
+ website_item.add_role(website.role) if hash[:is_secured]
457
+
459
458
  website_item
460
459
  end
461
460
 
462
461
  def build_section(hash, entries, website, current_user)
463
462
  klass = hash[:type].constantize
464
463
  section = klass.new(:title => hash[:name],
465
- :in_menu => hash[:in_menu],
466
- :render_base_layout => hash[:render_base_layout],
467
- :position => hash[:position],
468
- :render_base_layout => hash[:render_base_layout])
464
+ :in_menu => hash[:in_menu],
465
+ :render_base_layout => hash[:render_base_layout],
466
+ :position => hash[:position],
467
+ :render_base_layout => hash[:render_base_layout])
469
468
  section.internal_identifier = hash[:internal_identifier]
470
469
  section.permalink = hash[:permalink]
471
470
  section.path = hash[:path]
472
- content = entries.find{|entry| entry[:type] == 'sections' and entry[:name] == "#{hash[:internal_identifier]}.rhtml"}
473
- unless content.nil?
474
- section.layout = content[:data]
475
- end
471
+ content = entries.find { |entry| entry[:type] == 'sections' and entry[:name] == "#{hash[:internal_identifier]}.rhtml" }
472
+
473
+ section.layout = content[:data] unless content.nil?
474
+
476
475
  hash[:articles].each do |article_hash|
477
476
  article = Article.find_by_internal_identifier(article_hash[:internal_identifier])
478
477
  if article.nil?
479
478
  article = Article.new(:title => article_hash[:name], :display_title => article_hash[:display_title])
480
479
  article.created_by = current_user
481
- article.tag_list = article_hash[:tag_list].split(',').collect{|t| t.strip() } unless article_hash[:tag_list].blank?
482
- article.body_html = entries.find{|entry| entry[:type] == 'articles' and entry[:name] == "#{article_hash[:internal_identifier]}.html"}[:data]
483
- content = entries.find{|entry| entry[:type] == 'excerpts' and entry[:name] == "#{article_hash[:internal_identifier]}.html"}
480
+ article.tag_list = article_hash[:tag_list].split(',').collect { |t| t.strip() } unless article_hash[:tag_list].blank?
481
+ article.body_html = entries.find { |entry| entry[:type] == 'articles' and entry[:name] == "#{article_hash[:internal_identifier]}.html" }[:data]
482
+ content = entries.find { |entry| entry[:type] == 'excerpts' and entry[:name] == "#{article_hash[:internal_identifier]}.html" }
484
483
  unless content.nil?
485
484
  article.excerpt_html = content[:data]
486
485
  end
@@ -498,7 +497,7 @@ class Website < ActiveRecord::Base
498
497
  end
499
498
  end
500
499
  if section.is_a? OnlineDocumentSection
501
- entry_data = entries.find{|entry| entry[:type] == 'documented contents' and entry[:name] == "#{section.internal_identifier}.html"}[:data]
500
+ entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{section.internal_identifier}.html" }[:data]
502
501
  documented_content = DocumentedContent.create(:title => section.title, :body_html => entry_data)
503
502
  DocumentedItem.create(:documented_content_id => documented_content.id, :online_document_section_id => section.id)
504
503
  end
@@ -507,16 +506,14 @@ class Website < ActiveRecord::Base
507
506
  child_section = build_section(section_hash, entries, website, current_user)
508
507
  child_section.move_to_child_of(section)
509
508
  # CREATE THE DOCUMENTED CONTENT HERE
510
- entry_data = entries.find{|entry| entry[:type] == 'documented contents' and entry[:name] == "#{child_section.internal_identifier}.html"}[:data]
509
+ entry_data = entries.find { |entry| entry[:type] == 'documented contents' and entry[:name] == "#{child_section.internal_identifier}.html" }[:data]
511
510
  documented_content = DocumentedContent.create(:title => child_section.title, :body_html => entry_data)
512
511
  DocumentedItem.create(:documented_content_id => documented_content.id, :online_document_section_id => child_section.id)
513
512
  end
514
513
  end
515
- unless hash[:roles].empty?
516
- hash[:roles].each do |role|
517
- section.add_role(SecurityRole.find_by_internal_identifier(role)) rescue nil #do nothing if the role does not exist
518
- end
519
- end
514
+ #add role if is_secured
515
+ section.add_role(website.role) if hash[:is_secured]
516
+
520
517
  section
521
518
  end
522
519
 
@@ -530,13 +527,13 @@ class Website < ActiveRecord::Base
530
527
 
531
528
  def build_menu_item_hash(menu_item)
532
529
  {
533
- :title => menu_item.title,
534
- :url => menu_item.url,
535
- :is_secured => menu_item.is_secured?,
536
- :linked_to_item_type => menu_item.linked_to_item_type,
537
- :linked_to_item_path => menu_item.linked_to_item.nil? ? nil : menu_item.linked_to_item.path,
538
- :position => menu_item.position,
539
- :items => menu_item.children.collect{|child| build_menu_item_hash(child)}
530
+ :title => menu_item.title,
531
+ :url => menu_item.url,
532
+ :is_secured => menu_item.is_secured?,
533
+ :linked_to_item_type => menu_item.linked_to_item_type,
534
+ :linked_to_item_path => menu_item.linked_to_item.nil? ? nil : menu_item.linked_to_item.path,
535
+ :position => menu_item.position,
536
+ :items => menu_item.children.collect { |child| build_menu_item_hash(child) }
540
537
  }
541
538
  end
542
539
 
@@ -0,0 +1,139 @@
1
+ module Widgets
2
+ module DynamicForms
3
+ class Base < ErpApp::Widgets::Base
4
+ def index
5
+ render
6
+ end
7
+
8
+ def new
9
+ begin
10
+ unless params[:file].nil?
11
+ # size check
12
+ if params[:file].tempfile.size > ErpTechSvcs::Config.max_file_size_in_mb.megabytes
13
+ raise "File cannot be larger than #{ErpTechSvcs::Config.max_file_size_in_mb}MB"
14
+ end
15
+ end
16
+ form_data = JSON.parse(params[:form_data_json])
17
+ form_data[:dynamic_form_id] = params[:dynamic_form_id]
18
+ form_data[:model_name] = params[:model_name]
19
+ form_data.symbolize_keys!
20
+ @website = Website.find_by_host(request.host_with_port)
21
+
22
+ if form_data[:email_subject].blank?
23
+ subject = "#{form_data[:model_name]} Submission from #{@website.title}"
24
+ else
25
+ subject = strip_tags(form_data[:email_subject])
26
+ form_data.delete(:email_subject)
27
+ end
28
+
29
+ @myDynamicObject = DynamicFormModel.get_instance(form_data[:model_name])
30
+
31
+ form_data[:created_by] = current_user unless current_user.nil?
32
+ form_data[:created_with_form_id] = form_data[:dynamic_form_id] if form_data[:dynamic_form_id] and params[:is_html_form].blank?
33
+ form_data[:website] = @website.title
34
+
35
+ @myDynamicObject = @myDynamicObject.assign_all_attributes(form_data, ErpApp::Widgets::Base::IGNORED_PARAMS)
36
+
37
+ # get dynamic for from form_data[:created_with_form_id]
38
+ form = DynamicForm.find(form_data[:created_with_form_id])
39
+
40
+ # check widget_action from dynamic form
41
+ if !form.nil? and ['email', 'both'].include?(form.widget_action)
42
+ # email data
43
+ attachments = (params[:file].nil? ? [] : [params[:file]])
44
+ send_email(form, @myDynamicObject, subject, attachments)
45
+ end
46
+
47
+ if form.nil? or (!form.nil? and ['save', 'both'].include?(form.widget_action))
48
+ #save data
49
+ @myDynamicObject.save
50
+ save_file_asset(form_data) unless params[:file].nil?
51
+ end
52
+
53
+ output = render_to_string(:template => "success", :layout => false)
54
+ render :inline => {
55
+ :success => true,
56
+ :response => (file_upload_request? ? ERB::Util.html_escape(output) : output)
57
+ }.to_json
58
+ rescue Exception => e
59
+ Rails.logger.error e.message
60
+ Rails.logger.error e.backtrace.join("\n")
61
+ output = render_to_string(:template => "error", :layout => false, :locals => {:message => e.message})
62
+ render :inline => {
63
+ :success => false,
64
+ :response => (file_upload_request? ? ERB::Util.html_escape(output) : output)
65
+ }.to_json
66
+ end
67
+ end
68
+
69
+ protected
70
+ def file_upload_request?
71
+ request.env['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest'
72
+ end
73
+
74
+ def save_file_asset(form_data)
75
+ result = {}
76
+ name = params[:file].original_filename
77
+ data = params[:file].tempfile
78
+ set_file_support
79
+
80
+ begin
81
+ @root_node = File.join(ErpTechSvcs::Config.file_assets_location, form_data[:model_name], @myDynamicObject.id.to_s)
82
+ file = @myDynamicObject.add_file(data, File.join(@file_support.root, base_path, name))
83
+
84
+ roles = ['admin', @myDynamicObject.role_iid]
85
+ (@myDynamicObject.file_security_default == 'private') ? file.add_capability(:download, 'FileAsset', roles) : file.remove_all_capabilities
86
+
87
+ return {:success => true}
88
+ rescue Exception => e
89
+ Rails.logger.error e.message
90
+ Rails.logger.error e.backtrace
91
+ raise "Error uploading file. #{e.message}"
92
+ end
93
+ end
94
+
95
+ def base_path
96
+ @base_path = (@root_node.nil? ? nil : File.join(@file_support.root, @root_node))
97
+ end
98
+
99
+ def set_file_support
100
+ @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => ErpTechSvcs::Config.file_storage)
101
+ end
102
+
103
+ def send_email(form, dynamicObject, subject='', attachments=[])
104
+ begin
105
+ DynamicFormMailer.widget_email_with_attachments(form, dynamicObject, subject, attachments).deliver
106
+ rescue Exception => e
107
+ Rails.logger.error e.message
108
+ Rails.logger.error e.backtrace
109
+ raise "Error sending email. #{e.message}"
110
+ end
111
+ end
112
+
113
+ #should not be modified
114
+ #modify at your own risk
115
+ def locate
116
+ File.dirname(__FILE__)
117
+ end
118
+
119
+ class << self
120
+ def title
121
+ "Dynamic Forms"
122
+ end
123
+
124
+ def widget_name
125
+ File.basename(File.dirname(__FILE__))
126
+ end
127
+
128
+ def base_layout
129
+ begin
130
+ file = File.join(File.dirname(__FILE__),"/views/layouts/base.html.erb")
131
+ IO.read(file)
132
+ rescue
133
+ return nil
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end