knitkit 2.0.0 → 2.0.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.
Files changed (185) hide show
  1. data/README.md +22 -0
  2. data/app/controllers/knitkit/base_controller.rb +15 -2
  3. data/app/controllers/knitkit/blogs_controller.rb +4 -4
  4. data/app/controllers/knitkit/erp_app/desktop/app_controller.rb +16 -2
  5. data/app/controllers/knitkit/erp_app/desktop/articles_controller.rb +198 -57
  6. data/app/controllers/knitkit/erp_app/desktop/content_controller.rb +25 -11
  7. data/app/controllers/knitkit/erp_app/desktop/file_assets_controller.rb +123 -44
  8. data/app/controllers/knitkit/erp_app/desktop/image_assets_controller.rb +83 -9
  9. data/app/controllers/knitkit/erp_app/desktop/online_document_sections_controller.rb +38 -0
  10. data/app/controllers/knitkit/erp_app/desktop/position_controller.rb +15 -6
  11. data/app/controllers/knitkit/erp_app/desktop/theme_controller.rb +185 -98
  12. data/app/controllers/knitkit/erp_app/desktop/versions_controller.rb +38 -16
  13. data/app/controllers/knitkit/erp_app/desktop/website_controller.rb +126 -68
  14. data/app/controllers/knitkit/erp_app/desktop/website_nav_controller.rb +154 -107
  15. data/app/controllers/knitkit/erp_app/desktop/website_section_controller.rb +113 -54
  16. data/app/controllers/knitkit/online_document_sections_controller.rb +45 -0
  17. data/app/controllers/knitkit/unauthorized_controller.rb +5 -0
  18. data/app/controllers/knitkit/website_sections_controller.rb +8 -9
  19. data/app/mailers/document_mailer.rb +10 -0
  20. data/app/models/article.rb +1 -1
  21. data/app/models/content.rb +35 -3
  22. data/app/models/document.rb +8 -0
  23. data/app/models/document_type.rb +3 -0
  24. data/app/models/documented_content.rb +29 -0
  25. data/app/models/documented_item.rb +31 -0
  26. data/app/models/extensions/configuration.rb +5 -0
  27. data/app/models/extensions/party.rb +13 -0
  28. data/app/models/online_document_section.rb +40 -0
  29. data/app/models/theme.rb +22 -26
  30. data/app/models/valid_document.rb +4 -0
  31. data/app/models/website.rb +158 -119
  32. data/app/models/website_inquiry.rb +7 -2
  33. data/app/models/website_inquiry_mailer.rb +4 -3
  34. data/app/models/website_party_role.rb +5 -0
  35. data/app/models/website_section.rb +76 -38
  36. data/app/views/document_mailer/email_document.html.erb +12 -0
  37. data/app/views/knitkit/blogs/_add_comment.html.erb +2 -2
  38. data/app/views/knitkit/online_document_sections/index.html.erb +149 -0
  39. data/app/views/knitkit/website_sections/index.html.erb +0 -1
  40. data/app/views/layouts/knitkit/base.html.erb +4 -2
  41. data/app/views/layouts/knitkit/online_document_sections.html.erb +59 -0
  42. data/app/views/menus/knitkit/_default_menu.html.erb +1 -1
  43. data/app/views/menus/knitkit/_default_section_menu.html.erb +1 -1
  44. data/app/views/menus/knitkit/_default_sub_menu.html.erb +2 -2
  45. data/app/views/menus/knitkit/_default_sub_section_menu.html.erb +1 -1
  46. data/app/widgets/contact_us/base.rb +5 -5
  47. data/app/widgets/contact_us/javascript/contact_us.js +2 -1
  48. data/app/widgets/google_map/base.rb +0 -4
  49. data/app/widgets/google_map/javascript/google_map.js +4 -3
  50. data/app/widgets/login/base.rb +0 -5
  51. data/app/widgets/login/javascript/login.js +155 -153
  52. data/app/widgets/login/views/index.html.erb +3 -3
  53. data/app/widgets/login/views/reset_password.html.erb +2 -2
  54. data/app/widgets/manage_profile/base.rb +46 -67
  55. data/app/widgets/manage_profile/javascript/manage_profile.js +2 -1
  56. data/app/widgets/manage_profile/views/_user_information_form.html.erb +5 -1
  57. data/app/widgets/reset_password/base.rb +4 -6
  58. data/app/widgets/reset_password/javascript/reset_password.js +2 -1
  59. data/app/widgets/reset_password/views/index.html.erb +4 -3
  60. data/app/widgets/search/base.rb +1 -5
  61. data/app/widgets/search/javascript/search.js +2 -1
  62. data/app/widgets/search/views/show.html.erb +2 -2
  63. data/app/widgets/signup/base.rb +7 -6
  64. data/app/widgets/signup/javascript/signup.js +2 -1
  65. data/app/widgets/signup/views/error.html.erb +1 -1
  66. data/config/routes.rb +6 -2
  67. data/db/data_migrations/20110509223702_add_publisher_role.rb +10 -0
  68. data/db/data_migrations/20111118182910_setup_knitkit_capabilities.rb +84 -0
  69. data/db/data_migrations/20120127144444_create_website_role_types.rb +13 -0
  70. data/db/data_migrations/20120127150505_create_website_default_configuration.rb +72 -0
  71. data/db/data_migrations/20120127150506_add_primary_host_to_website_configuration.rb +33 -0
  72. data/db/data_migrations/20120316150424_add_is_template_to_default_website_config.rb +16 -0
  73. data/db/data_migrations/upgrade/20120210195616_add_website_configs.rb +19 -0
  74. data/db/data_migrations/upgrade/20120213205519_populate_website_iids.rb +17 -0
  75. data/db/migrate/20110211002317_setup_knitkit.rb +22 -5
  76. data/db/migrate/20111207161928_create_documented_items_table.rb +13 -0
  77. data/db/migrate/20111208180539_add_document_id_to_documented_item.rb +9 -0
  78. data/db/migrate/20120315163736_add_document.rb +32 -0
  79. data/db/migrate/20120503183431_create_valid_documents.rb +16 -0
  80. data/db/migrate/upgrade/20120116201510_add_render_base_layout_flag.rb +13 -0
  81. data/db/migrate/upgrade/20120127143745_create_website_party_roles.rb +24 -0
  82. data/db/migrate/upgrade/20120213184509_add_iid_to_websites.rb +14 -0
  83. data/lib/knitkit.rb +2 -0
  84. data/lib/knitkit/config.rb +31 -0
  85. data/lib/knitkit/engine.rb +12 -3
  86. data/lib/knitkit/extensions.rb +1 -3
  87. data/lib/knitkit/extensions/action_controller/theme_support/acts_as_themed_controller.rb +2 -3
  88. data/lib/knitkit/extensions/active_record/acts_as_document.rb +63 -0
  89. data/lib/knitkit/extensions/active_record/acts_as_publishable.rb +5 -4
  90. data/lib/knitkit/extensions/compass_ae/widgets/base.rb +70 -0
  91. data/lib/knitkit/extensions/railties/action_view.rb +22 -10
  92. data/lib/knitkit/extensions/railties/theme_support/asset_tag_helper.rb +3 -3
  93. data/lib/knitkit/extensions/railties/theme_support/theme_file_resolver.rb +8 -3
  94. data/lib/knitkit/routing_filter/section_router.rb +16 -6
  95. data/lib/knitkit/version.rb +7 -1
  96. data/public/images/check.png +0 -0
  97. data/public/images/credit_card.png +0 -0
  98. data/public/images/knitkit/tooltip.gif +0 -0
  99. data/public/javascripts/ajax_pagination.js +33 -0
  100. data/public/javascripts/datepicker.js +6 -1
  101. data/public/javascripts/erp_app/desktop/applications/knitkit/articles_grid_panel.js +731 -258
  102. data/public/javascripts/erp_app/desktop/applications/knitkit/center_region.js +289 -238
  103. data/public/javascripts/erp_app/desktop/applications/knitkit/comments_grid_panel.js +2 -4
  104. data/public/javascripts/erp_app/desktop/applications/knitkit/east_region.js +29 -3
  105. data/public/javascripts/erp_app/desktop/applications/knitkit/file_assets_panel.js +193 -21
  106. data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_data_view.js +27 -26
  107. data/public/javascripts/erp_app/desktop/applications/knitkit/image_assets_panel.js +167 -20
  108. data/public/javascripts/erp_app/desktop/applications/knitkit/inquiries_grid_panel.js +1 -2
  109. data/public/javascripts/erp_app/desktop/applications/knitkit/module.js +5 -1
  110. data/public/javascripts/erp_app/desktop/applications/knitkit/publish_window.js +2 -2
  111. data/public/javascripts/erp_app/desktop/applications/knitkit/published_grid_panel.js +20 -11
  112. data/public/javascripts/erp_app/desktop/applications/knitkit/section_articles_grid_panel.js +279 -228
  113. data/public/javascripts/erp_app/desktop/applications/knitkit/themes_tree_panel.js +40 -40
  114. data/public/javascripts/erp_app/desktop/applications/knitkit/versions_grid_panel.js +83 -76
  115. data/public/javascripts/erp_app/desktop/applications/knitkit/west_region.js +1961 -1397
  116. data/public/javascripts/erp_app/desktop/applications/knitkit/widgets_panel.js +47 -43
  117. data/public/javascripts/knitkit/helpers.js +26 -0
  118. data/public/stylesheets/erp_app/desktop/applications/knitkit/knitkit.css +1 -2
  119. data/public/stylesheets/knitkit/documentation.css +50 -0
  120. data/public/stylesheets/knitkit/style.css +23 -1
  121. data/spec/controllers/knitkit/erp_app/desktop/articles_controller_spec.rb +8 -0
  122. data/spec/controllers/knitkit/erp_app/desktop/website_controller_spec.rb +396 -0
  123. data/spec/controllers/knitkit/erp_app/desktop/website_nav_controller_spec.rb +260 -0
  124. data/spec/controllers/knitkit/erp_app/desktop/website_section_controller_spec.rb +222 -0
  125. data/spec/dummy/Rakefile +7 -0
  126. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  127. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  128. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  129. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  130. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  131. data/spec/dummy/config.ru +4 -0
  132. data/spec/dummy/config/application.rb +43 -0
  133. data/spec/dummy/config/boot.rb +10 -0
  134. data/spec/dummy/config/database.yml +8 -0
  135. data/spec/dummy/config/environment.rb +5 -0
  136. data/spec/dummy/config/environments/spec.rb +27 -0
  137. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  138. data/spec/dummy/config/initializers/inflections.rb +10 -0
  139. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  140. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  141. data/spec/dummy/config/initializers/session_store.rb +8 -0
  142. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  143. data/spec/dummy/config/locales/en.yml +5 -0
  144. data/spec/dummy/config/routes.rb +4 -0
  145. data/spec/dummy/config/workflow.yml +1 -0
  146. data/spec/dummy/public/404.html +26 -0
  147. data/spec/dummy/public/422.html +26 -0
  148. data/spec/dummy/public/500.html +26 -0
  149. data/spec/dummy/public/favicon.ico +0 -0
  150. data/spec/dummy/script/rails +6 -0
  151. data/spec/factories/article.rb +4 -0
  152. data/spec/factories/basic.rb +3 -0
  153. data/spec/factories/blog.rb +5 -0
  154. data/spec/factories/documented_content.rb +4 -0
  155. data/spec/factories/documented_item.rb +4 -0
  156. data/spec/factories/online_document_section.rb +6 -0
  157. data/spec/factories/published_website.rb +4 -0
  158. data/spec/factories/theme.rb +6 -0
  159. data/spec/factories/website.rb +5 -0
  160. data/spec/factories/website_host.rb +4 -0
  161. data/spec/factories/website_nav.rb +5 -0
  162. data/spec/factories/website_nav_item.rb +4 -0
  163. data/spec/factories/website_section.rb +5 -0
  164. data/spec/models/article_spec.rb +35 -0
  165. data/spec/models/attribute_type_spec.rb +55 -0
  166. data/spec/models/attribute_value_spec.rb +114 -0
  167. data/spec/models/blog_spec.rb +16 -0
  168. data/spec/models/comment_spec.rb +11 -0
  169. data/spec/models/content_spec.rb +187 -0
  170. data/spec/models/documented_item_spec.rb +29 -0
  171. data/spec/models/online_document_section_spec.rb +34 -0
  172. data/spec/models/published_element_spec.rb +11 -0
  173. data/spec/models/published_website_spec.rb +11 -0
  174. data/spec/models/theme_spec.rb +12 -0
  175. data/spec/models/website_host_spec.rb +11 -0
  176. data/spec/models/website_inquiry_spec.rb +24 -0
  177. data/spec/models/website_nav_item_spec.rb +11 -0
  178. data/spec/models/website_nav_spec.rb +11 -0
  179. data/spec/models/website_section_content_spec.rb +11 -0
  180. data/spec/models/website_section_spec.rb +49 -0
  181. data/spec/models/website_spec.rb +146 -0
  182. data/spec/spec_helper.rb +61 -0
  183. metadata +391 -154
  184. data/app/controllers/knitkit/articles_controller.rb +0 -7
  185. data/lib/knitkit/extensions/compass/widgets/base.rb +0 -53
@@ -3,22 +3,36 @@ module Knitkit
3
3
  module Desktop
4
4
 
5
5
  class ContentController < Knitkit::ErpApp::Desktop::AppController
6
- def update
7
- id = params[:id]
8
- html = params[:html]
9
- content = Content.find(id)
10
- content.body_html = html
6
+ def update
7
+ model = DesktopApplication.find_by_internal_identifier('knitkit')
8
+ begin
9
+ current_user.with_capability(model, 'edit_html', 'Article') do
10
+ id = params[:id]
11
+ html = params[:html]
12
+ content = Content.find(id)
13
+ content.body_html = html
11
14
 
12
- render :json => (content.save ? {:success => true} : {:success => false})
15
+ render :json => (content.save ? {:success => true} : {:success => false})
16
+ end
17
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
18
+ render :json => {:success => false, :message => ex.message}
19
+ end
13
20
  end
14
21
 
15
22
  def save_excerpt
16
- id = params[:id]
17
- html = params[:html]
18
- content = Content.find(id)
19
- content.excerpt_html = html
23
+ model = DesktopApplication.find_by_internal_identifier('knitkit')
24
+ begin
25
+ current_user.with_capability(model, 'edit_excerpt', 'Article') do
26
+ id = params[:id]
27
+ html = params[:html]
28
+ content = Content.find(id)
29
+ content.excerpt_html = html
20
30
 
21
- render :json => (content.save ? {:success => true} : {:success => false})
31
+ render :json => (content.save ? {:success => true} : {:success => false})
32
+ end
33
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
34
+ render :json => {:success => false, :message => ex.message}
35
+ end
22
36
  end
23
37
 
24
38
  end#ContentController
@@ -2,16 +2,19 @@ module Knitkit
2
2
  module ErpApp
3
3
  module Desktop
4
4
  class FileAssetsController < ::ErpApp::Desktop::FileManager::BaseController
5
+ skip_before_filter :verify_authenticity_token, :only => :upload_file
5
6
  skip_before_filter :require_login, :only => [:download_file_asset]
6
- before_filter :set_asset_model, :except => [:download_file_asset]
7
+ before_filter :set_asset_model
8
+ before_filter :set_root_node
7
9
 
8
- def base_path
9
- @base_path = nil
10
- if @context == :website
11
- @base_path = File.join(@file_support.root,"/sites/site-#{@assets_model.id}", "files") unless @assets_model.nil?
10
+ def base_path
11
+ if @root_node.nil?
12
+ @base_path = nil
12
13
  else
13
- @base_path = File.join(@file_support.root,"/files") unless @assets_model.nil?
14
+ @base_path = File.join(@file_support.root, @root_node)
14
15
  end
16
+
17
+ @base_path
15
18
  end
16
19
 
17
20
  def expand_directory
@@ -27,7 +30,7 @@ module Knitkit
27
30
  path = params[:path] == 'root_node' ? base_path : params[:path]
28
31
  name = params[:name]
29
32
 
30
- @assets_model.add_file('#Empty File', File.join(@file_support.root, path, name))
33
+ @assets_model.add_file('#Empty File', File.join(path, name))
31
34
 
32
35
  render :json => {:success => true}
33
36
  end
@@ -43,34 +46,50 @@ module Knitkit
43
46
  end
44
47
 
45
48
  def upload_file
46
- result = {}
47
- upload_path = request.env['HTTP_EXTRAPOSTDATA_DIRECTORY'].blank? ? params[:directory] : request.env['HTTP_EXTRAPOSTDATA_DIRECTORY']
48
- name = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data].original_filename : request.env['HTTP_X_FILE_NAME']
49
- data = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data] : request.raw_post
49
+ #Website level assets if allowed to be viewed can also be uploaded and deleted so this is only checking for the view capability
50
+ if @context == Website
51
+ capability_type = "view"
52
+ capability_resource = "SiteFileAsset"
53
+ else
54
+ capability_type = "upload"
55
+ capability_resource = "GlobalFileAsset"
56
+ end
50
57
 
58
+ model = DesktopApplication.find_by_internal_identifier('knitkit')
51
59
  begin
52
- upload_path == 'root_node' ? @assets_model.add_file(data, File.join(@file_support.root,base_path,name)) : @assets_model.add_file(data, File.join(@file_support.root,upload_path,name))
53
- result = {:success => true}
54
- rescue Exception=>ex
55
- logger.error ex.message
56
- logger.error ex.backtrace.join("\n")
57
- result = {:success => false, :error => "Error uploading file."}
60
+ current_user.with_capability(model, capability_type, capability_resource) do
61
+ result = {}
62
+ upload_path = request.env['HTTP_X_DIRECTORY'].blank? ? params[:directory] : request.env['HTTP_X_DIRECTORY']
63
+ name = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data].original_filename : request.env['HTTP_X_FILE_NAME']
64
+ data = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data] : request.raw_post
65
+
66
+ begin
67
+ upload_path == 'root_node' ? @assets_model.add_file(data, File.join(@file_support.root,base_path,name)) : @assets_model.add_file(data, File.join(@file_support.root,upload_path,name))
68
+ result = {:success => true}
69
+ rescue Exception=>ex
70
+ logger.error ex.message
71
+ logger.error ex.backtrace.join("\n")
72
+ result = {:success => false, :error => "Error uploading file."}
73
+ end
74
+
75
+ #the awesome uploader widget whats this to mime type text, leave it render :inline
76
+ render :inline => result.to_json
77
+ end
78
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
79
+ render :json => {:success => false, :message => ex.message}
58
80
  end
59
-
60
- #the awesome uploader widget whats this to mime type text, leave it render :inline
61
- render :inline => result.to_json
62
81
  end
63
82
 
64
83
  def save_move
65
84
  result = {}
66
85
  path = params[:node]
67
86
  new_parent_path = params[:parent_node]
68
- new_parent_path = base_path if new_parent_path == ROOT_NODE
87
+ new_parent_path = @root_node if new_parent_path == ROOT_NODE
69
88
 
70
- unless File.exists? path
71
- result = {:success => false, :msg => 'File does not exists'}
89
+ if Rails.application.config.erp_tech_svcs.file_storage == :filesystem and !File.exists?(File.join(@file_support.root, path))
90
+ result = {:success => false, :msg => 'File does not exist.'}
72
91
  else
73
- path = path[1..path.length] if path[0] == "/"
92
+ #path = path[1..path.length] if path[0] == "/"
74
93
  file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
75
94
  file.move(new_parent_path)
76
95
  result = {:success => true, :msg => "#{File.basename(path)} was moved to #{new_parent_path} successfully"}
@@ -80,30 +99,44 @@ module Knitkit
80
99
  end
81
100
 
82
101
  def delete_file
83
- path = params[:node]
84
- result = {}
102
+ if @context == Website
103
+ capability_type = "view"
104
+ capability_resource = "SiteFileAsset"
105
+ else
106
+ capability_type = "delete"
107
+ capability_resource = "GlobalFileAsset"
108
+ end
109
+
110
+ model = DesktopApplication.find_by_internal_identifier('knitkit')
85
111
  begin
86
- name = File.basename(path)
87
- result, message, is_folder = @file_support.delete_file(File.join(@file_support.root,path))
88
- if result && !is_folder
89
- file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
90
- file.destroy
112
+ current_user.with_capability(model, capability_type, capability_resource) do
113
+ path = params[:node]
114
+ result = {}
115
+ begin
116
+ name = File.basename(path)
117
+ result, message, is_folder = @file_support.delete_file(File.join(@file_support.root,path))
118
+ if result && !is_folder
119
+ file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
120
+ file.destroy
121
+ end
122
+ result = {:success => result, :error => message}
123
+ rescue Exception=>ex
124
+ logger.error ex.message
125
+ logger.error ex.backtrace.join("\n")
126
+ result = {:success => false, :error => "Error deleting #{name}"}
127
+ end
128
+ render :json => result
91
129
  end
92
- result = {:success => result, :error => message}
93
- rescue Exception=>ex
94
- logger.error ex.message
95
- logger.error ex.backtrace.join("\n")
96
- result = {:success => false, :error => "Error deleting #{name}"}
130
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
131
+ render :json => {:success => false, :message => ex.message}
97
132
  end
98
- render :json => result
99
133
  end
100
134
 
101
135
  def rename_file
102
- result = {:success => true, :data => {:success => true}}
103
136
  path = params[:node]
104
137
  name = params[:file_name]
105
138
 
106
- result, message = @file_support.rename_file(path, name)
139
+ result, message = @file_support.rename_file(File.join(@file_support.root,path), name)
107
140
  if result
108
141
  file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
109
142
  file.name = name
@@ -113,16 +146,62 @@ module Knitkit
113
146
  render :json => {:success => true, :message => message}
114
147
  end
115
148
 
116
- def download_file_asset
117
- contents, message = @file_support.get_contents(params[:path])
149
+ def update_security
150
+ path = params[:path]
151
+ secure = params[:secure]
152
+ roles = ['admin', 'file_downloader']
153
+
154
+ file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
155
+ roles << @assets_model.website_role_iid if @context == :website
156
+
157
+ (secure == 'true') ? file.add_capability(:download, nil, roles) : file.remove_all_capabilities
158
+
159
+ # if we're using S3, set file permissions to private or public_read
160
+ @file_support.set_permissions(path, ((secure == 'true') ? :private : :public_read)) if Rails.application.config.erp_tech_svcs.file_storage == :s3
161
+
162
+ render :json => {:success => true}
163
+ end
118
164
 
119
- send_data contents, :filename => File.basename(path)
165
+ # DEPRECATED, use erp_app/public#download
166
+ def download_file_asset
167
+ path = params[:path]
168
+
169
+ file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
170
+ if(file.has_capabilities?)
171
+ begin
172
+ unless current_user == false
173
+ current_user.with_capability(file, :download, nil) do
174
+ redirect_to file.data.url
175
+ end
176
+ else
177
+ raise ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability
178
+ end
179
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
180
+ render :text => ex.message
181
+ rescue Exception=>ex
182
+ render :text => "User does not have capability."
183
+ end
184
+ else
185
+ redirect_to file.data.url
186
+ end
120
187
  end
121
188
 
122
189
  protected
123
190
 
124
191
  def set_file_support
125
- @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => ErpTechSvcs::FileSupport.options[:storage])
192
+ @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => Rails.application.config.erp_tech_svcs.file_storage)
193
+ end
194
+
195
+ def set_root_node
196
+ @root_node = nil
197
+
198
+ if @context == :website
199
+ @root_node = File.join(Rails.application.config.erp_tech_svcs.file_assets_location,"sites",@assets_model.iid) unless @assets_model.nil?
200
+ else
201
+ @root_node = File.join(Rails.application.config.erp_tech_svcs.file_assets_location,"shared_site_files")
202
+ end
203
+
204
+ @root_node
126
205
  end
127
206
 
128
207
  def set_asset_model
@@ -130,7 +209,7 @@ module Knitkit
130
209
 
131
210
  if @context == :website
132
211
  #get website id this can be an xhr request or regular
133
- website_id = request.env['HTTP_EXTRAPOSTDATA_WEBSITE_ID'].blank? ? params[:website_id] : request.env['HTTP_EXTRAPOSTDATA_WEBSITE_ID']
212
+ website_id = request.env['HTTP_X_WEBSITEID'].blank? ? params[:website_id] : request.env['HTTP_X_WEBSITEID']
134
213
  (@assets_model = website_id.blank? ? nil : Website.find(website_id))
135
214
 
136
215
  render :inline => {:success => false, :error => "No Website Selected"}.to_json if (@assets_model.nil? && params[:action] != "base_path")
@@ -2,24 +2,98 @@ module Knitkit
2
2
  module ErpApp
3
3
  module Desktop
4
4
  class ImageAssetsController < FileAssetsController
5
- def base_path
6
- @base_path = nil
7
- if @context == :website
8
- @base_path = File.join(@file_support.root,"/sites/site-#{@assets_model.id}", "images") unless @assets_model.nil?
5
+
6
+ def get_images
7
+ directory = (params[:directory] == 'root_node' or params[:directory].blank?) ? base_path : params[:directory]
8
+ # this @assets_model.images.select should be refactored into a query
9
+ render :json => @assets_model.images.select{|image| image.directory == directory.sub(@file_support.root,'')}.collect{|image|{:name => image.name, :shortName => image.name[0..15], :url => image.data.url}}
10
+ end
11
+
12
+ def upload_file
13
+ #Website level assets if allowed to be viewed can also be uploaded and deleted so this is only checking for the view capability
14
+ if @context == Website
15
+ capability_type = "view"
16
+ capability_resource = "SiteImageAsset"
9
17
  else
10
- @base_path = File.join(@file_support.root,"/images") unless @assets_model.nil?
18
+ capability_type = "upload"
19
+ capability_resource = "GlobalImageAsset"
20
+ end
21
+
22
+ model = DesktopApplication.find_by_internal_identifier('knitkit')
23
+ begin
24
+ current_user.with_capability(model, capability_type, capability_resource) do
25
+ result = {}
26
+ upload_path = request.env['HTTP_X_DIRECTORY'].blank? ? params[:directory] : request.env['HTTP_X_DIRECTORY']
27
+ name = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data].original_filename : request.env['HTTP_X_FILE_NAME']
28
+ data = request.env['HTTP_X_FILE_NAME'].blank? ? params[:file_data] : request.raw_post
29
+
30
+ begin
31
+ upload_path == 'root_node' ? @assets_model.add_file(data, File.join(@file_support.root,base_path,name)) : @assets_model.add_file(data, File.join(@file_support.root,upload_path,name))
32
+ result = {:success => true}
33
+ rescue Exception=>ex
34
+ logger.error ex.message
35
+ logger.error ex.backtrace.join("\n")
36
+ result = {:success => false, :error => "Error uploading file."}
37
+ end
38
+
39
+ #the awesome uploader widget whats this to mime type text, leave it render :inline
40
+ render :inline => result.to_json
41
+ end
42
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
43
+ render :json => {:success => false, :message => ex.message}
11
44
  end
12
45
  end
13
46
 
14
- def get_images
15
- directory = (params[:directory] == 'root_node' or params[:directory].blank?) ? base_path : params[:directory]
16
- render :json => @assets_model.images.select{|image| image.directory == directory.sub(@file_support.root,'')}.collect{|image|{:name => image.name, :shortName => image.name[0..15], :url => image.data.url}}
47
+ def delete_file
48
+ if @context == Website
49
+ capability_type = "view"
50
+ capability_resource = "SiteImageAsset"
51
+ else
52
+ capability_type = "delete"
53
+ capability_resource = "GlobalImageAsset"
54
+ end
55
+
56
+ model = DesktopApplication.find_by_internal_identifier('knitkit')
57
+ begin
58
+ current_user.with_capability(model, capability_type, capability_resource) do
59
+ path = params[:node]
60
+ result = {}
61
+ begin
62
+ name = File.basename(path)
63
+ result, message, is_folder = @file_support.delete_file(File.join(@file_support.root,path))
64
+ if result && !is_folder
65
+ file = @assets_model.files.find(:first, :conditions => ['name = ? and directory = ?', ::File.basename(path), ::File.dirname(path)])
66
+ file.destroy
67
+ end
68
+ result = {:success => result, :error => message}
69
+ rescue Exception=>ex
70
+ logger.error ex.message
71
+ logger.error ex.backtrace.join("\n")
72
+ result = {:success => false, :error => "Error deleting #{name}"}
73
+ end
74
+ render :json => result
75
+ end
76
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
77
+ render :json => {:success => false, :message => ex.message}
78
+ end
17
79
  end
18
80
 
19
81
  protected
20
82
 
83
+ def set_root_node
84
+ @root_node = nil
85
+
86
+ if @context == :website
87
+ @root_node = File.join("public", "sites", @assets_model.iid, "images") unless @assets_model.nil?
88
+ else
89
+ @root_node = File.join("public", "images")
90
+ end
91
+
92
+ @root_node
93
+ end
94
+
21
95
  def set_file_support
22
- @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => ErpTechSvcs::FileSupport.options[:storage])
96
+ @file_support = ErpTechSvcs::FileSupport::Base.new(:storage => Rails.application.config.erp_tech_svcs.file_storage)
23
97
  end
24
98
 
25
99
  end#ImageAssetsController
@@ -0,0 +1,38 @@
1
+ module Knitkit
2
+ module ErpApp
3
+ module Desktop
4
+ class OnlineDocumentSectionsController < Knitkit::ErpApp::Desktop::AppController
5
+
6
+ def new
7
+ website = Website.find(params[:website_id])
8
+ online_document_section = OnlineDocumentSection.new(:website_id => website.id, :in_menu => params[:in_menu] == 'yes', :title => params[:title],
9
+ :internal_identifier => params[:internal_identifier])
10
+
11
+ if online_document_section.save
12
+ if params[:website_section_id]
13
+ parent_website_section = WebsiteSection.find(params[:website_section_id])
14
+ online_document_section.move_to_child_of(parent_website_section)
15
+ end
16
+ online_document_section.update_path!
17
+ if params[:documenttype] == "Content"
18
+ documented_content = DocumentedContent.create(:title => online_document_section.title, :created_by => current_user, :body_html => online_document_section.title)
19
+ DocumentedItem.create(:documented_content_id => documented_content.id, :online_document_section_id => online_document_section.id)
20
+ end
21
+
22
+ result = {:success => true, :node => build_section_hash(online_document_section, online_document_section.website),
23
+ :documented_content => documented_content.content_hash}
24
+ else
25
+ message = "<ul>"
26
+ online_document_section.errors.collect do |e, m|
27
+ message << "<li>#{e} #{m}</li>"
28
+ end
29
+ message << "</ul>"
30
+ result = {:success => false, :message => message}
31
+ end
32
+
33
+ render :json => result
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -4,13 +4,22 @@ module Knitkit
4
4
  class PositionController < Knitkit::ErpApp::Desktop::AppController
5
5
 
6
6
  def update
7
- params[:position_array].each do |position|
8
- model = position['klass'].constantize.find(position['id'])
9
- model.position = position['position'].to_i
10
- model.save
11
- end
7
+ model = DesktopApplication.find_by_internal_identifier('knitkit')
8
+ begin
9
+ current_user.with_capability(model, 'drag_item', 'WebsiteTree') do
10
+
11
+ params[:position_array].each do |position|
12
+ model = position['klass'].constantize.find(position['id'])
13
+ model.position = position['position'].to_i
14
+ model.save
15
+ end
12
16
 
13
- render :json => {:success => true}
17
+ render :json => {:success => true}
18
+
19
+ end
20
+ rescue ErpTechSvcs::Utils::CompassAccessNegotiator::Errors::UserDoesNotHaveCapability=>ex
21
+ render :json => {:success => false, :message => ex.message}
22
+ end
14
23
  end
15
24
 
16
25
  end#PositionController