porthos 3.0.0.beta

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 (388) hide show
  1. data/Gemfile +6 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +26 -0
  4. data/Rakefile +28 -0
  5. data/app/assets/images/Jcrop.gif +0 -0
  6. data/app/assets/images/button_grey_bg.png +0 -0
  7. data/app/assets/images/icons/avatar.png +0 -0
  8. data/app/assets/images/icons/filetypes/ai.png +0 -0
  9. data/app/assets/images/icons/filetypes/default.png +0 -0
  10. data/app/assets/images/icons/filetypes/doc.png +0 -0
  11. data/app/assets/images/icons/filetypes/eps.png +0 -0
  12. data/app/assets/images/icons/filetypes/mp3.png +0 -0
  13. data/app/assets/images/icons/filetypes/pdf.png +0 -0
  14. data/app/assets/images/icons/filetypes/psd.png +0 -0
  15. data/app/assets/images/icons/filetypes/swf.png +0 -0
  16. data/app/assets/images/icons/filetypes/wav.png +0 -0
  17. data/app/assets/images/icons/filetypes/zip.png +0 -0
  18. data/app/assets/images/layout2_bg_shadow.png +0 -0
  19. data/app/assets/images/layout3_bg_shadow.png +0 -0
  20. data/app/assets/images/ui_new.png +0 -0
  21. data/app/assets/images/wymeditor/icons.png +0 -0
  22. data/app/assets/javascripts/admin.js +7 -0
  23. data/app/assets/javascripts/admin/assets.js +147 -0
  24. data/app/assets/javascripts/admin/editor.js +2 -0
  25. data/app/assets/javascripts/admin/helpers.js +169 -0
  26. data/app/assets/javascripts/admin/items.js +267 -0
  27. data/app/assets/javascripts/admin/nodes.js +73 -0
  28. data/app/assets/javascripts/admin/settings.js +1 -0
  29. data/app/assets/javascripts/admin_extension.js +0 -0
  30. data/app/assets/javascripts/lib/ckeditor/LICENSE.html +1334 -0
  31. data/app/assets/javascripts/lib/ckeditor/adapters/jquery.js +6 -0
  32. data/app/assets/javascripts/lib/ckeditor/ckeditor.js +141 -0
  33. data/app/assets/javascripts/lib/ckeditor/ckeditor_basic.js +8 -0
  34. data/app/assets/javascripts/lib/ckeditor/ckeditor_basic_source.js +20 -0
  35. data/app/assets/javascripts/lib/ckeditor/config.js +26 -0
  36. data/app/assets/javascripts/lib/ckeditor/contents.css +50 -0
  37. data/app/assets/javascripts/lib/ckeditor/images/spacer.gif +0 -0
  38. data/app/assets/javascripts/lib/ckeditor/lang/_languages.js +6 -0
  39. data/app/assets/javascripts/lib/ckeditor/lang/_translationstatus.txt +60 -0
  40. data/app/assets/javascripts/lib/ckeditor/lang/en.js +6 -0
  41. data/app/assets/javascripts/lib/ckeditor/lang/sv.js +6 -0
  42. data/app/assets/javascripts/lib/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js +7 -0
  43. data/app/assets/javascripts/lib/ckeditor/plugins/a11yhelp/lang/en.js +6 -0
  44. data/app/assets/javascripts/lib/ckeditor/plugins/a11yhelp/lang/he.js +6 -0
  45. data/app/assets/javascripts/lib/ckeditor/plugins/about/dialogs/about.js +6 -0
  46. data/app/assets/javascripts/lib/ckeditor/plugins/about/dialogs/logo_ckeditor.png +0 -0
  47. data/app/assets/javascripts/lib/ckeditor/plugins/adobeair/plugin.js +6 -0
  48. data/app/assets/javascripts/lib/ckeditor/plugins/autogrow/plugin.js +6 -0
  49. data/app/assets/javascripts/lib/ckeditor/plugins/clipboard/dialogs/paste.js +7 -0
  50. data/app/assets/javascripts/lib/ckeditor/plugins/colordialog/dialogs/colordialog.js +7 -0
  51. data/app/assets/javascripts/lib/ckeditor/plugins/dialog/dialogDefinition.js +4 -0
  52. data/app/assets/javascripts/lib/ckeditor/plugins/div/dialogs/div.js +8 -0
  53. data/app/assets/javascripts/lib/ckeditor/plugins/find/dialogs/find.js +9 -0
  54. data/app/assets/javascripts/lib/ckeditor/plugins/flash/dialogs/flash.js +9 -0
  55. data/app/assets/javascripts/lib/ckeditor/plugins/flash/images/placeholder.png +0 -0
  56. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/button.js +6 -0
  57. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/checkbox.js +6 -0
  58. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/form.js +6 -0
  59. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/hiddenfield.js +6 -0
  60. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/radio.js +6 -0
  61. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/select.js +9 -0
  62. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/textarea.js +6 -0
  63. data/app/assets/javascripts/lib/ckeditor/plugins/forms/dialogs/textfield.js +6 -0
  64. data/app/assets/javascripts/lib/ckeditor/plugins/forms/images/hiddenfield.gif +0 -0
  65. data/app/assets/javascripts/lib/ckeditor/plugins/iframe/dialogs/iframe.js +7 -0
  66. data/app/assets/javascripts/lib/ckeditor/plugins/iframe/images/placeholder.png +0 -0
  67. data/app/assets/javascripts/lib/ckeditor/plugins/iframedialog/plugin.js +6 -0
  68. data/app/assets/javascripts/lib/ckeditor/plugins/image/dialogs/image.js +13 -0
  69. data/app/assets/javascripts/lib/ckeditor/plugins/link/dialogs/anchor.js +6 -0
  70. data/app/assets/javascripts/lib/ckeditor/plugins/link/dialogs/link.js +11 -0
  71. data/app/assets/javascripts/lib/ckeditor/plugins/link/images/anchor.gif +0 -0
  72. data/app/assets/javascripts/lib/ckeditor/plugins/liststyle/dialogs/liststyle.js +6 -0
  73. data/app/assets/javascripts/lib/ckeditor/plugins/pagebreak/images/pagebreak.gif +0 -0
  74. data/app/assets/javascripts/lib/ckeditor/plugins/pastefromword/filter/default.js +10 -0
  75. data/app/assets/javascripts/lib/ckeditor/plugins/pastetext/dialogs/pastetext.js +6 -0
  76. data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/dialogs/placeholder.js +6 -0
  77. data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/lang/en.js +6 -0
  78. data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/placeholder.gif +0 -0
  79. data/app/assets/javascripts/lib/ckeditor/plugins/placeholder/plugin.js +6 -0
  80. data/app/assets/javascripts/lib/ckeditor/plugins/scayt/dialogs/options.js +8 -0
  81. data/app/assets/javascripts/lib/ckeditor/plugins/scayt/dialogs/toolbar.css +6 -0
  82. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_address.png +0 -0
  83. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_blockquote.png +0 -0
  84. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_div.png +0 -0
  85. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h1.png +0 -0
  86. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h2.png +0 -0
  87. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h3.png +0 -0
  88. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h4.png +0 -0
  89. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h5.png +0 -0
  90. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_h6.png +0 -0
  91. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_p.png +0 -0
  92. data/app/assets/javascripts/lib/ckeditor/plugins/showblocks/images/block_pre.png +0 -0
  93. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/dialogs/smiley.js +7 -0
  94. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/angel_smile.gif +0 -0
  95. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/angry_smile.gif +0 -0
  96. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/broken_heart.gif +0 -0
  97. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/confused_smile.gif +0 -0
  98. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/cry_smile.gif +0 -0
  99. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/devil_smile.gif +0 -0
  100. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/embaressed_smile.gif +0 -0
  101. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/envelope.gif +0 -0
  102. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/heart.gif +0 -0
  103. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/kiss.gif +0 -0
  104. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/lightbulb.gif +0 -0
  105. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/omg_smile.gif +0 -0
  106. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/regular_smile.gif +0 -0
  107. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/sad_smile.gif +0 -0
  108. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/shades_smile.gif +0 -0
  109. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/teeth_smile.gif +0 -0
  110. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/thumbs_down.gif +0 -0
  111. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/thumbs_up.gif +0 -0
  112. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/tounge_smile.gif +0 -0
  113. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif +0 -0
  114. data/app/assets/javascripts/lib/ckeditor/plugins/smiley/images/wink_smile.gif +0 -0
  115. data/app/assets/javascripts/lib/ckeditor/plugins/specialchar/dialogs/specialchar.js +7 -0
  116. data/app/assets/javascripts/lib/ckeditor/plugins/specialchar/lang/en.js +6 -0
  117. data/app/assets/javascripts/lib/ckeditor/plugins/styles/styles/default.js +6 -0
  118. data/app/assets/javascripts/lib/ckeditor/plugins/table/dialogs/table.js +9 -0
  119. data/app/assets/javascripts/lib/ckeditor/plugins/tableresize/plugin.js +7 -0
  120. data/app/assets/javascripts/lib/ckeditor/plugins/tabletools/dialogs/tableCell.js +8 -0
  121. data/app/assets/javascripts/lib/ckeditor/plugins/templates/dialogs/templates.js +7 -0
  122. data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/default.js +6 -0
  123. data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/images/template1.gif +0 -0
  124. data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/images/template2.gif +0 -0
  125. data/app/assets/javascripts/lib/ckeditor/plugins/templates/templates/images/template3.gif +0 -0
  126. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/dialogs/uicolor.js +7 -0
  127. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/lang/en.js +6 -0
  128. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/lang/he.js +6 -0
  129. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/plugin.js +6 -0
  130. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/uicolor.gif +0 -0
  131. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/hue_bg.png +0 -0
  132. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/hue_thumb.png +0 -0
  133. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/picker_mask.png +0 -0
  134. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/picker_thumb.png +0 -0
  135. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/assets/yui.css +6 -0
  136. data/app/assets/javascripts/lib/ckeditor/plugins/uicolor/yui/yui.js +76 -0
  137. data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/ciframe.html +49 -0
  138. data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/tmpFrameset.html +52 -0
  139. data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/wsc.css +6 -0
  140. data/app/assets/javascripts/lib/ckeditor/plugins/wsc/dialogs/wsc.js +7 -0
  141. data/app/assets/javascripts/lib/ckeditor/skins/kama/dialog.css +515 -0
  142. data/app/assets/javascripts/lib/ckeditor/skins/kama/editor.css +1115 -0
  143. data/app/assets/javascripts/lib/ckeditor/skins/kama/icons.png +0 -0
  144. data/app/assets/javascripts/lib/ckeditor/skins/kama/icons_rtl.png +0 -0
  145. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/dialog_sides.gif +0 -0
  146. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/dialog_sides.png +0 -0
  147. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/dialog_sides_rtl.png +0 -0
  148. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/mini.gif +0 -0
  149. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/noimage.png +0 -0
  150. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/sprites.png +0 -0
  151. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/sprites_ie6.png +0 -0
  152. data/app/assets/javascripts/lib/ckeditor/skins/kama/images/toolbar_start.gif +0 -0
  153. data/app/assets/javascripts/lib/ckeditor/skins/kama/skin.js +7 -0
  154. data/app/assets/javascripts/lib/ckeditor/skins/kama/templates.css +65 -0
  155. data/app/assets/javascripts/lib/ckeditor/themes/default/theme.js +8 -0
  156. data/app/assets/javascripts/lib/jquery-1.6.1.min.js +18 -0
  157. data/app/assets/javascripts/lib/jquery-ui-1.8.13.min.js +407 -0
  158. data/app/assets/javascripts/lib/jquery.jcrop.min.js +246 -0
  159. data/app/assets/javascripts/lib/jquery.smart_autocomplete.js +519 -0
  160. data/app/assets/javascripts/lib/underscore.min.js +26 -0
  161. data/app/assets/javascripts/lib/underscore.string.min.js +8 -0
  162. data/app/assets/javascripts/rails.js +148 -0
  163. data/app/assets/stylesheets/admin.css +9 -0
  164. data/app/assets/stylesheets/admin_extensions.css.scss +0 -0
  165. data/app/assets/stylesheets/clearing.css +28 -0
  166. data/app/assets/stylesheets/elements.css.erb +335 -0
  167. data/app/assets/stylesheets/forms.css.scss +118 -0
  168. data/app/assets/stylesheets/jquery.jcrop.css +28 -0
  169. data/app/assets/stylesheets/layout.css.erb +269 -0
  170. data/app/assets/stylesheets/views/assets.css.erb +112 -0
  171. data/app/assets/stylesheets/views/nodes.css +47 -0
  172. data/app/assets/stylesheets/views/pages.css.scss +136 -0
  173. data/app/assets/stylesheets/views/sessions.css +22 -0
  174. data/app/assets/stylesheets/views/tags.css +15 -0
  175. data/app/assets/stylesheets/views/users.css +16 -0
  176. data/app/controllers/admin/assets_controller.rb +132 -0
  177. data/app/controllers/admin/content_templates_controller.rb +56 -0
  178. data/app/controllers/admin/data_controller.rb +93 -0
  179. data/app/controllers/admin/datum_templates_controller.rb +59 -0
  180. data/app/controllers/admin/items_controller.rb +114 -0
  181. data/app/controllers/admin/link_lists_controller.rb +41 -0
  182. data/app/controllers/admin/links_controller.rb +65 -0
  183. data/app/controllers/admin/nodes_controller.rb +114 -0
  184. data/app/controllers/admin/page_templates_controller.rb +56 -0
  185. data/app/controllers/admin/redirects_controller.rb +58 -0
  186. data/app/controllers/admin/sessions_controller.rb +27 -0
  187. data/app/controllers/admin/site_settings_controller.rb +58 -0
  188. data/app/controllers/admin/tags_controller.rb +71 -0
  189. data/app/controllers/admin/users_controller.rb +55 -0
  190. data/app/controllers/application_controller.rb +8 -0
  191. data/app/controllers/pages_controller.rb +115 -0
  192. data/app/helpers/data_helper.rb +11 -0
  193. data/app/helpers/link_lists_helper.rb +16 -0
  194. data/app/models/asset.rb +189 -0
  195. data/app/models/custom_page.rb +33 -0
  196. data/app/models/data/asset_association.rb +73 -0
  197. data/app/models/data/datum_collection.rb +46 -0
  198. data/app/models/data/field.rb +26 -0
  199. data/app/models/data/field_set.rb +37 -0
  200. data/app/models/data/link_field.rb +7 -0
  201. data/app/models/data/page_association.rb +26 -0
  202. data/app/models/data/string_field.rb +13 -0
  203. data/app/models/datum.rb +22 -0
  204. data/app/models/datum_template.rb +143 -0
  205. data/app/models/datum_templates/asset_association_template.rb +3 -0
  206. data/app/models/datum_templates/association_field_template.rb +2 -0
  207. data/app/models/datum_templates/datum_collection_template.rb +15 -0
  208. data/app/models/datum_templates/field_set_template.rb +5 -0
  209. data/app/models/datum_templates/field_template.rb +6 -0
  210. data/app/models/datum_templates/link_field_template.rb +2 -0
  211. data/app/models/datum_templates/page_association_template.rb +4 -0
  212. data/app/models/datum_templates/string_field_template.rb +4 -0
  213. data/app/models/file_template.rb +105 -0
  214. data/app/models/file_templates/field_set_file_template.rb +7 -0
  215. data/app/models/file_templates/page_file_template.rb +14 -0
  216. data/app/models/image_asset.rb +102 -0
  217. data/app/models/item.rb +115 -0
  218. data/app/models/link.rb +46 -0
  219. data/app/models/link_list.rb +30 -0
  220. data/app/models/node.rb +106 -0
  221. data/app/models/observers/node_observer.rb +9 -0
  222. data/app/models/page.rb +167 -0
  223. data/app/models/redirect.rb +16 -0
  224. data/app/models/section.rb +30 -0
  225. data/app/models/setting.rb +4 -0
  226. data/app/models/site_setting.rb +11 -0
  227. data/app/models/template.rb +25 -0
  228. data/app/models/templates/content_template.rb +101 -0
  229. data/app/models/templates/page_template.rb +59 -0
  230. data/app/models/user.rb +67 -0
  231. data/app/views/admin/assets/_create_callback_form.html.erb +11 -0
  232. data/app/views/admin/assets/_sub_nav.html.erb +45 -0
  233. data/app/views/admin/assets/create.html.erb +10 -0
  234. data/app/views/admin/assets/edit.html.erb +91 -0
  235. data/app/views/admin/assets/edit_cropping.html.erb +44 -0
  236. data/app/views/admin/assets/incomplete.html.erb +39 -0
  237. data/app/views/admin/assets/index.html.erb +76 -0
  238. data/app/views/admin/assets/new.html.erb +20 -0
  239. data/app/views/admin/assets/search.html.erb +60 -0
  240. data/app/views/admin/assets/show.html.erb +45 -0
  241. data/app/views/admin/content_templates/_form.html.erb +18 -0
  242. data/app/views/admin/content_templates/edit.html.erb +14 -0
  243. data/app/views/admin/content_templates/index.html.erb +36 -0
  244. data/app/views/admin/content_templates/new.html.erb +14 -0
  245. data/app/views/admin/content_templates/show.html.erb +57 -0
  246. data/app/views/admin/data/_asset_association.html.erb +59 -0
  247. data/app/views/admin/data/_asset_association_form.html.erb +21 -0
  248. data/app/views/admin/data/_field.html.erb +7 -0
  249. data/app/views/admin/data/_field_form.html.erb +27 -0
  250. data/app/views/admin/data/_field_set.html.erb +7 -0
  251. data/app/views/admin/data/_field_set_form.html.erb +14 -0
  252. data/app/views/admin/data/_form.html.erb +14 -0
  253. data/app/views/admin/data/_link_field.html.erb +9 -0
  254. data/app/views/admin/data/_link_field_form.html.erb +22 -0
  255. data/app/views/admin/data/_page_association.html.erb +3 -0
  256. data/app/views/admin/data/_page_association_form.html.erb +8 -0
  257. data/app/views/admin/data/edit.html.erb +20 -0
  258. data/app/views/admin/data/index.html.erb +61 -0
  259. data/app/views/admin/data/new.html.erb +20 -0
  260. data/app/views/admin/datum_templates/_asset_association_template_form.html.erb +2 -0
  261. data/app/views/admin/datum_templates/_datum_collection_template_form.html.erb +23 -0
  262. data/app/views/admin/datum_templates/_field_set_template_form.html.erb +7 -0
  263. data/app/views/admin/datum_templates/_field_template_form.html.erb +1 -0
  264. data/app/views/admin/datum_templates/_form.html.erb +25 -0
  265. data/app/views/admin/datum_templates/_page_association_template_form.html.erb +2 -0
  266. data/app/views/admin/datum_templates/_string_field_template_form.html.erb +12 -0
  267. data/app/views/admin/datum_templates/edit.html.erb +14 -0
  268. data/app/views/admin/datum_templates/new.html.erb +14 -0
  269. data/app/views/admin/items/_asset_association.html.erb +6 -0
  270. data/app/views/admin/items/_details.html.erb +95 -0
  271. data/app/views/admin/items/_form.html.erb +20 -0
  272. data/app/views/admin/items/_page_form.html.erb +27 -0
  273. data/app/views/admin/items/_row.html.erb +47 -0
  274. data/app/views/admin/items/_sub_nav.html.erb +60 -0
  275. data/app/views/admin/items/index.html.erb +75 -0
  276. data/app/views/admin/items/new.html.erb +5 -0
  277. data/app/views/admin/items/page.html.erb +155 -0
  278. data/app/views/admin/items/search.html.erb +26 -0
  279. data/app/views/admin/items/section.html.erb +152 -0
  280. data/app/views/admin/link_lists/_form.html.erb +8 -0
  281. data/app/views/admin/link_lists/edit.html.erb +11 -0
  282. data/app/views/admin/link_lists/show.html.erb +45 -0
  283. data/app/views/admin/links/_form.html.erb +14 -0
  284. data/app/views/admin/links/edit.html.erb +11 -0
  285. data/app/views/admin/links/new.html.erb +11 -0
  286. data/app/views/admin/nodes/_form.html.erb +88 -0
  287. data/app/views/admin/nodes/_list_of_nodes.html.erb +11 -0
  288. data/app/views/admin/nodes/_node.html.erb +23 -0
  289. data/app/views/admin/nodes/_nodes_tree.html.erb +7 -0
  290. data/app/views/admin/nodes/_place_node.html.erb +11 -0
  291. data/app/views/admin/nodes/_sub_nav.html.erb +12 -0
  292. data/app/views/admin/nodes/edit.html.erb +10 -0
  293. data/app/views/admin/nodes/index.html.erb +26 -0
  294. data/app/views/admin/nodes/new.html.erb +10 -0
  295. data/app/views/admin/nodes/place.html.erb +37 -0
  296. data/app/views/admin/page_templates/_form.html.erb +51 -0
  297. data/app/views/admin/page_templates/edit.html.erb +14 -0
  298. data/app/views/admin/page_templates/index.html.erb +42 -0
  299. data/app/views/admin/page_templates/new.html.erb +14 -0
  300. data/app/views/admin/page_templates/pages.html.erb +28 -0
  301. data/app/views/admin/page_templates/show.html.erb +64 -0
  302. data/app/views/admin/redirects/edit.html.erb +25 -0
  303. data/app/views/admin/redirects/index.html.erb +38 -0
  304. data/app/views/admin/redirects/new.html.erb +25 -0
  305. data/app/views/admin/sessions/new.html.erb +17 -0
  306. data/app/views/admin/sessions/token.js.erb +1 -0
  307. data/app/views/admin/shared/_error_messages.html.erb +7 -0
  308. data/app/views/admin/shared/_settings_sub_nav.html.erb +8 -0
  309. data/app/views/admin/site_settings/_form.html.erb +5 -0
  310. data/app/views/admin/site_settings/edit.html.erb +20 -0
  311. data/app/views/admin/site_settings/index.html.erb +45 -0
  312. data/app/views/admin/site_settings/new.html.erb +20 -0
  313. data/app/views/admin/taggables/_asset.html.erb +10 -0
  314. data/app/views/admin/taggables/_page.html.erb +9 -0
  315. data/app/views/admin/taggables/_tag_collection.html.erb +2 -0
  316. data/app/views/admin/tags/edit.html.erb +18 -0
  317. data/app/views/admin/tags/index.html.erb +34 -0
  318. data/app/views/admin/tags/new.html.erb +18 -0
  319. data/app/views/admin/tags/search.js.erb +5 -0
  320. data/app/views/admin/tags/show.html.erb +29 -0
  321. data/app/views/admin/users/_form.html.erb +22 -0
  322. data/app/views/admin/users/_sub_nav.html.erb +12 -0
  323. data/app/views/admin/users/_user.html.erb +23 -0
  324. data/app/views/admin/users/edit.html.erb +18 -0
  325. data/app/views/admin/users/index.html.erb +22 -0
  326. data/app/views/admin/users/new.html.erb +15 -0
  327. data/app/views/admin/users/search.html.erb +19 -0
  328. data/app/views/field_set_templates/default/_show.html.erb +6 -0
  329. data/app/views/layouts/admin/_account_nav.html.erb +7 -0
  330. data/app/views/layouts/admin/_main_nav.html.erb +8 -0
  331. data/app/views/layouts/admin/application.html.erb +26 -0
  332. data/app/views/layouts/admin/sessions.html.erb +18 -0
  333. data/app/views/pages/_preview.html.erb +13 -0
  334. data/app/views/pages/contents/content_images/_collection.html.erb +26 -0
  335. data/app/views/pages/contents/content_images/_content_image.html.erb +19 -0
  336. data/app/views/pages/contents/content_teasers/_collection.html.erb +8 -0
  337. data/app/views/pages/contents/content_teasers/_content_teaser.html.erb +32 -0
  338. data/app/views/pages/contents/content_textfields/_content_textfield.html.erb +1 -0
  339. data/app/views/pages/contents/content_videos/_content_video.html.erb +1 -0
  340. data/app/views/pages/contents/modules/date_archive/_content.html.erb +23 -0
  341. data/app/views/pages/contents/modules/sub_navigation/_content.html.erb +5 -0
  342. data/app/views/pages/templates/default/_admin_in_list.html.erb +4 -0
  343. data/app/views/pages/templates/default/categories.html.erb +13 -0
  344. data/app/views/pages/templates/default/category.html.erb +13 -0
  345. data/app/views/pages/templates/default/default_renderer.rb +115 -0
  346. data/app/views/pages/templates/default/index.html.erb +13 -0
  347. data/app/views/pages/templates/default/index.rss.builder +19 -0
  348. data/app/views/pages/templates/default/search.html.erb +24 -0
  349. data/app/views/pages/templates/default/show.html.erb +6 -0
  350. data/app/views/shared/404.html.erb +1 -0
  351. data/config/initializers/locale.rb +1 -0
  352. data/config/initializers/mime_types.rb +13 -0
  353. data/config/initializers/overrides.rb +34 -0
  354. data/config/initializers/tanker.rb +1 -0
  355. data/config/locales/sv-SE.yml +543 -0
  356. data/config/routes.rb +97 -0
  357. data/lib/generators/porthos/USAGE +3 -0
  358. data/lib/generators/porthos/porthos_generator.rb +35 -0
  359. data/lib/generators/porthos/templates/mongo.yml +15 -0
  360. data/lib/porthos.rb +53 -0
  361. data/lib/porthos/active_record/restrictions.rb +36 -0
  362. data/lib/porthos/active_record/settingable.rb +49 -0
  363. data/lib/porthos/admin.rb +25 -0
  364. data/lib/porthos/authentication.rb +72 -0
  365. data/lib/porthos/config.rb +18 -0
  366. data/lib/porthos/datum_methods.rb +53 -0
  367. data/lib/porthos/engine.rb +56 -0
  368. data/lib/porthos/helpers/application_helper.rb +140 -0
  369. data/lib/porthos/mongo_mapper/acts_as_uri.rb +59 -0
  370. data/lib/porthos/mongo_mapper/callbacks.rb +13 -0
  371. data/lib/porthos/mongo_mapper/extensions.rb +58 -0
  372. data/lib/porthos/mongo_mapper/instructable.rb +36 -0
  373. data/lib/porthos/mongo_mapper/observer.rb +34 -0
  374. data/lib/porthos/mongo_mapper/taggable.rb +136 -0
  375. data/lib/porthos/page_renderer.rb +66 -0
  376. data/lib/porthos/public.rb +56 -0
  377. data/lib/porthos/redirects.rb +23 -0
  378. data/lib/porthos/routing.rb +256 -0
  379. data/lib/porthos/s3_storage.rb +61 -0
  380. data/lib/porthos/tags_autocomplete_app.rb +32 -0
  381. data/lib/porthos/tanking.rb +9 -0
  382. data/lib/porthos/test_helpers/assets_test_helper.rb +72 -0
  383. data/lib/porthos/test_helpers/pages_test_helper.rb +9 -0
  384. data/lib/porthos/url_resolver.rb +108 -0
  385. data/lib/porthos/validators.rb +14 -0
  386. data/lib/porthos/version.rb +3 -0
  387. data/lib/tasks/porthos_tasks.rake +217 -0
  388. metadata +774 -0
@@ -0,0 +1,58 @@
1
+ class Admin::RedirectsController < ApplicationController
2
+ include Porthos::Admin
3
+
4
+
5
+ def index
6
+ @redirects = Redirect.find(:all, :order => 'path')
7
+ respond_to do |format|
8
+ format.html {}
9
+ end
10
+ end
11
+
12
+ def new
13
+ @redirect = Redirect.new
14
+ respond_to do |format|
15
+ format.html {}
16
+ end
17
+ end
18
+
19
+ def create
20
+ @redirect = Redirect.new(params[:redirect])
21
+ respond_to do |format|
22
+ if @redirect.save
23
+ flash[:notice] = t(:saved, :scope => [:app, :admin_redirects])
24
+ format.html { redirect_to admin_redirects_path }
25
+ else
26
+ format.html { render :action => :new }
27
+ end
28
+ end
29
+ end
30
+
31
+ def edit
32
+ @redirect = Redirect.find(params[:id])
33
+ respond_to do |format|
34
+ format.html {}
35
+ end
36
+ end
37
+
38
+ def update
39
+ @redirect = Redirect.find(params[:id])
40
+ respond_to do |format|
41
+ if @redirect.update_attributes(params[:redirect])
42
+ flash[:notice] = t(:saved, :scope => [:app, :admin_redirects])
43
+ format.html { redirect_to admin_redirects_path }
44
+ else
45
+ format.html { render :action => :edit }
46
+ end
47
+ end
48
+ end
49
+
50
+ def destroy
51
+ @redirect = Redirect.find(params[:id])
52
+ @redirect.destroy
53
+ respond_to do |format|
54
+ flash[:notice] = t(:deleted, :scope => [:app, :admin_redirects])
55
+ format.html { redirect_to admin_redirects_path }
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,27 @@
1
+ # This controller handles the login/logout function of the site.
2
+ class Admin::SessionsController < ApplicationController
3
+ include Porthos::Admin
4
+ skip_before_filter :authenticate!
5
+ layout 'admin/sessions'
6
+
7
+ def index
8
+ redirect_to admin_root_path
9
+ end
10
+
11
+ def new
12
+ end
13
+
14
+ def create
15
+ user = warden.authenticate!
16
+ sign_in user
17
+ flash[:notice] = t(:'admin.sessions.signed_in')
18
+ redirect_to admin_root_path
19
+ end
20
+
21
+ def destroy
22
+ sign_out
23
+ flash[:notice] = t(:'admin.sessions.signed_out')
24
+ redirect_to admin_login_path
25
+ end
26
+
27
+ end
@@ -0,0 +1,58 @@
1
+ class Admin::SiteSettingsController < ApplicationController
2
+ include Porthos::Admin
3
+
4
+
5
+ def index
6
+ @site_settings = SiteSetting.all
7
+ respond_to do |format|
8
+ format.html {}
9
+ end
10
+ end
11
+
12
+ def new
13
+ @site_setting = SiteSetting.new
14
+ respond_to do |format|
15
+ format.html {}
16
+ end
17
+ end
18
+
19
+ def create
20
+ @site_setting = SiteSetting.new(params[:site_setting])
21
+ respond_to do |format|
22
+ if @site_setting.save
23
+ flash[:notice] = t(:saved, :scope => [:app, :admin_general])
24
+ format.html { redirect_to admin_site_settings_path }
25
+ else
26
+ format.html { render :action => :new }
27
+ end
28
+ end
29
+ end
30
+
31
+ def edit
32
+ @site_setting = SiteSetting.find(params[:id])
33
+ respond_to do |format|
34
+ format.html {}
35
+ end
36
+ end
37
+
38
+ def update
39
+ @site_setting = SiteSetting.find(params[:id])
40
+ respond_to do |format|
41
+ if @site_setting.update_attributes(params[:site_setting])
42
+ flash[:notice] = t(:saved, :scope => [:app, :admin_general])
43
+ format.html { redirect_to admin_site_settings_path }
44
+ else
45
+ format.html { render :action => :edit }
46
+ end
47
+ end
48
+ end
49
+
50
+ def destroy
51
+ @site_setting = SiteSetting.find(params[:id])
52
+ @site_setting.destroy
53
+ respond_to do |format|
54
+ flash[:notice] = t(:deleted, :scope => [:app, :admin_general])
55
+ format.html { redirect_to admin_site_settings_path }
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,71 @@
1
+ class Admin::TagsController < ApplicationController
2
+ include Porthos::Admin
3
+
4
+
5
+ skip_before_filter :clear_content_context, :only => [:search]
6
+
7
+ def index
8
+ @tags = Tag.find(:all, :order => 'name')
9
+ end
10
+
11
+ def new
12
+ @tag = Tag.new
13
+ end
14
+
15
+ def create
16
+ @tag = Tag.new(params[:tag])
17
+ respond_to do |format|
18
+ if @tag.save
19
+ flash[:notice] = "#{@tag.name} #{t(:saved, :scope => [:app, :admin_general])}"
20
+ format.html { redirect_to admin_tags_path }
21
+ else
22
+ format.html { render :action => 'new' }
23
+ end
24
+ end
25
+ end
26
+
27
+ def show
28
+ @tag = Tag.find(params[:id])
29
+ end
30
+
31
+ def edit
32
+ @tag = Tag.find(params[:id])
33
+ end
34
+
35
+ def update
36
+ @tag = Tag.find(params[:id])
37
+ new_attributes = params[:tag]
38
+ if @existing_tag = Tag.find_by_name(new_attributes[:name].strip)
39
+ @tag.taggings.update_all(:tag_id => @existing_tag.id)
40
+ @tag.destroy
41
+ @tag = @existing_tag
42
+ else
43
+ @tag.update_attributes(params[:tag])
44
+ end
45
+ respond_to do |format|
46
+ if @tag.valid?
47
+ flash[:notice] = "#{@tag.name} #{t(:saved, :scope => [:app, :admin_general])}"
48
+ format.html { redirect_to admin_tag_path(@tag) }
49
+ else
50
+ format.html { render :action => 'edit' }
51
+ end
52
+ end
53
+ end
54
+
55
+ def destroy
56
+ @tag = Tag.find(params[:id])
57
+ if @tag.destroy
58
+ flash[:notice] = "#{@tag.name} #{t(:deleted, :scope => [:app, :admin_general])}"
59
+ end
60
+ respond_to do |format|
61
+ format.html { redirect_to admin_tags_path }
62
+ end
63
+ end
64
+
65
+ def search
66
+ @tags = Tag.where("name LIKE ?", "#{params[:query].downcase.strip}%")
67
+ respond_to do |format|
68
+ format.js
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,55 @@
1
+ class Admin::UsersController < ApplicationController
2
+ respond_to :html
3
+ include Porthos::Admin
4
+
5
+ def index
6
+ @users = apply_scopes(User).page(params[:page])
7
+ respond_with @users
8
+ end
9
+
10
+ def search
11
+ query = params[:query]
12
+ page = params[:page] || 1
13
+ @search = User.search do
14
+ keywords(query)
15
+ paginate :page => page
16
+ end
17
+ @query = query
18
+ @page = page
19
+ respond_to do |format|
20
+ format.html
21
+ end
22
+ end
23
+
24
+ def new
25
+ @user = User.new
26
+ end
27
+
28
+ def create
29
+ @user = User.new(params[:user])
30
+ if @user.save
31
+ flash[:notice] = "#{@user.name} #{t(:saved, :scope => [:app, :admin_general])}"
32
+ end
33
+ respond_with @user, :location => (params[:return_to] || admin_users_path)
34
+ end
35
+
36
+ def edit
37
+ @user = User.find(params[:id])
38
+ end
39
+
40
+ def update
41
+ @user = User.find(params[:id])
42
+ if @user.update_attributes(params[:user])
43
+ flash[:notice] = "#{@user.name} #{t(:saved, :scope => [:app, :admin_general])}"
44
+ end
45
+ respond_with @user, :location => (params[:return_to] || admin_users_path)
46
+ end
47
+
48
+ def destroy
49
+ @user = User.find(params[:id])
50
+ @user.destroy
51
+ flash[:notice] = "#{@user.name} #{t(:deleted, :scope => [:app, :admin_general])}"
52
+ respond_with @user, :location => (params[:return_to] || admin_users_path)
53
+ end
54
+
55
+ end
@@ -0,0 +1,8 @@
1
+ class ApplicationController < ActionController::Base
2
+ rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found
3
+
4
+ private
5
+ def record_not_found
6
+ render :file => 'shared/404', :status => 404
7
+ end
8
+ end
@@ -0,0 +1,115 @@
1
+ class PagesController < ApplicationController
2
+ include Porthos::Public
3
+
4
+ before_filter :only => :preview do |c|
5
+ c.send :authenticate!
6
+ end
7
+
8
+ def index
9
+ @page_template = PageTemplate.first(handle: node.handle)
10
+ template = @page_template ? @page_template.template : PageFileTemplate.default
11
+ @page_renderer = page_renderer(template, {
12
+ :page_template => @page_template
13
+ })
14
+
15
+ respond_to do |format|
16
+ format.html { render template: template.views.index }
17
+ format.rss { render template: template.views.index, layout: false }
18
+ end
19
+ end
20
+
21
+ def show
22
+ @page = if params[:id].is_a?(BSON::ObjectId) || BSON::ObjectId.legal?(params[:id])
23
+ Item.published.find(params[:id])
24
+ else
25
+ Item.published.where(uri: params[:id], handle: params[:handle]).first
26
+ end
27
+ raise ActiveRecord::RecordNotFound unless @page
28
+
29
+ template = @page.template
30
+ @page_renderer = page_renderer(template, page_template: @page.page_template, page: @page)
31
+
32
+ if !@page.restricted? || signed_in?
33
+ respond_to do |format|
34
+ format.html { render :template => template.views.show }
35
+ end
36
+ else
37
+ return authenticate!
38
+ end
39
+ end
40
+
41
+ def preview
42
+ @page = Page.find(params[:id])
43
+ template = @page.page_template.template
44
+ @page_renderer = page_renderer(template, page_template: @page.page_template, page: @page)
45
+ respond_to do |format|
46
+ format.html { render :template => template.views.show }
47
+ end
48
+ end
49
+
50
+ def search
51
+ filters = params[:filters] || {}
52
+ @page_template = PageTemplate.where(handle: node.handle).first
53
+
54
+ template = @page_template ? @page_template.template : PageTemplate.default
55
+
56
+ search_query = params[:query] if params[:query].present?
57
+ if search_query.present? or filters.any?
58
+ page_template = @page_template
59
+ @search = Page.search do
60
+ keywords search_query
61
+ if filters.any?
62
+ dynamic :custom_attributes do
63
+ filters.each do |key, value|
64
+ with(key.to_sym, value) unless value.blank?
65
+ end
66
+ end
67
+ end
68
+ with(:is_active, true)
69
+ with(:is_restricted, false)
70
+ with(:page_template_id, page_template.id) if page_template
71
+ with(:published_on).less_than Time.now
72
+ end
73
+ @query, @filters = params[:query], filters
74
+ end
75
+ respond_to do |format|
76
+ format.html { render :template => template.views.search }
77
+ end
78
+ end
79
+
80
+ def categories
81
+ @page_template = PageTemplate.where(handle: node.handle).first
82
+ template = @page_template ? @page_template.template : PageTemplate.default
83
+ @page_renderer = page_renderer(template, page_template: @page_template)
84
+
85
+ respond_to do |format|
86
+ format.html { render template: template.views.categories }
87
+ end
88
+ end
89
+
90
+ def category
91
+ @page_template = PageTemplate.where(handle: node.handle).first
92
+ template = @page_template ? @page_template.template : PageTemplate.default
93
+ @page_renderer = page_renderer(template, page_template: @page_template)
94
+ respond_to do |format|
95
+ format.html { render template: template.views.category }
96
+ end
97
+ end
98
+
99
+ def tagged_with
100
+ @page_template = PageTemplate.where(handle: node.handle).first
101
+ template = @page_template ? @page_template.template : PageTemplate.default
102
+ @page_renderer = page_renderer(template, page_template: @page_template)
103
+
104
+ respond_to do |format|
105
+ format.html { render template: template.views.tagged_with }
106
+ end
107
+ end
108
+
109
+ protected
110
+
111
+ def page_renderer(template, objects = {})
112
+ "#{template.name.camelize}Renderer::#{self.action_name.camelize}".constantize.new(self, objects)
113
+ end
114
+
115
+ end
@@ -0,0 +1,11 @@
1
+ module DataHelper
2
+ def link_path(link)
3
+ if link
4
+ if link['url'].present?
5
+ link.url
6
+ elsif link.resource
7
+ link.resource['url'] ? link.resource.url : page_path(link.resource)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module LinkListsHelper
2
+ def navigation(link_list, options = {})
3
+ seperator = options.delete(:seperator) || ' '
4
+ content_tag 'nav', navigation_links(link_list).join(seperator).html_safe, { :class => link_list.handle }.merge(options)
5
+ end
6
+
7
+ def navigation_links(link_list)
8
+ link_list.links.map do |link|
9
+ if !!request.fullpath.starts_with?(link.url)
10
+ link_to(link.title, link.url, :class => 'current')
11
+ else
12
+ link_to(link.title, link.url)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,189 @@
1
+ class Asset
2
+ include MongoMapper::Document
3
+ include Tanker
4
+
5
+ taggable
6
+
7
+ key :name, String
8
+ key :extension, String
9
+ key :mime_type, String
10
+ key :filetype, String
11
+ key :size, Integer
12
+ key :title, String
13
+ key :author, String
14
+ key :description, String
15
+ key :reference_number, String
16
+ key :hidden, Boolean, :default => lambda { false }
17
+ key :created_by_id, ObjectId
18
+ key :_usages, Array, default: lambda { [] }
19
+ timestamps!
20
+
21
+ tankit Porthos.config.tanking.index_name, :as => 'Asset' do
22
+ indexes :name
23
+ indexes :title
24
+ indexes :author
25
+ indexes :description
26
+ indexes :reference_number
27
+ indexes :tag_names
28
+ indexes :hidden
29
+ end
30
+
31
+ class_attribute :filetypes
32
+ self.filetypes = {
33
+ :image => %w(jpg jpeg png gif tiff tif),
34
+ :video => %w(flv mov qt mpg avi mp4),
35
+ :sound => %w(mp3 wav aiff aif),
36
+ :pdf => %w(pdf),
37
+ :document => []
38
+ }
39
+
40
+ belongs_to :created_by,
41
+ :class_name => 'User'
42
+
43
+ scope :is_hidden, lambda { |hidden|
44
+ where(:hidden => hidden)
45
+ }
46
+
47
+ scope :created_by, lambda { |user_id|
48
+ where(:created_by_id => user_id)
49
+ }
50
+
51
+ scope :by_type, lambda { |type|
52
+ where(:_type => type)
53
+ }
54
+
55
+ scope :by_filetype, lambda { |filetype|
56
+ where(:filetype => filetype)
57
+ }
58
+
59
+ scope :by_extension, lambda { |extension|
60
+ if extension.is_a?(Array)
61
+ where(:extension.in => extension)
62
+ else
63
+ where(:extension => extension)
64
+ end
65
+ }
66
+
67
+ scope :order_by, lambda { |order|
68
+ sort(order)
69
+ }
70
+
71
+ attr_accessor :file
72
+ validates_presence_of :file, :if => :new_record?
73
+
74
+ before_validation :process, :if => :new_record?
75
+ after_destroy :cleanup
76
+
77
+ after_save proc { |asset| asset.delay.update_tank_indexes }
78
+ after_destroy proc { |asset| asset.delay.delete_tank_indexes }
79
+
80
+ def self.default_filetype
81
+ filetypes.keys.detect do |key|
82
+ filetypes[key].empty?
83
+ end.to_s
84
+ end
85
+
86
+ def full_name
87
+ @full_name ||= "#{name}.#{extension}"
88
+ end
89
+
90
+ def remote_url
91
+ @remote_url ||= Porthos.s3_storage.url(full_name)
92
+ end
93
+
94
+ def of_the_type(filetype)
95
+ type = self.filetypes[filetype.to_sym]
96
+ type && type.include?(self.extension)
97
+ end
98
+
99
+ def usages
100
+ @usages ||= _usages.map do |u|
101
+ u.except('container_id')
102
+ end.uniq.collect { |u| u['usage_type'].constantize.find(u['usage_id']) }
103
+ end
104
+
105
+ def remove_usage(association)
106
+ usage = usage_from_association(association)
107
+ if _usages.include?(usage)
108
+ _usages.reject! { |u| u == usage }
109
+ save
110
+ end
111
+ end
112
+
113
+ def add_usage(association)
114
+ usage = usage_from_association(association)
115
+ unless _usages.include?(usage)
116
+ _usages << usage
117
+ save
118
+ end
119
+ end
120
+
121
+ class << self
122
+ def uploaders
123
+ User.find(self.fields(:created_by_id).distinct(:created_by_id))
124
+ end
125
+
126
+ def from_upload(attrs)
127
+ extension = File.extname(attrs[:file].original_filename.downcase).gsub(/\./,'')
128
+ if filetypes[:image].include?(extension)
129
+ klass = ImageAsset
130
+ else
131
+ klass = Asset
132
+ end
133
+ klass.new(attrs)
134
+ end
135
+
136
+ def filetype_for_extension(_extension)
137
+ Asset.default_filetype.tap do |_filetype|
138
+ filetypes.each { |key, extensions| _filetype.replace(key.to_s) and break if extensions.include?(_extension) }
139
+ end
140
+ end
141
+ end
142
+
143
+ protected
144
+
145
+ # before validation on create
146
+ def process
147
+ extract_attributes_from_file
148
+ ensure_unique_name
149
+ store
150
+ end
151
+
152
+ def extract_attributes_from_file
153
+ self.size = file.size
154
+ self.mime_type = MIME::Types.type_for(file.original_filename).first.to_s
155
+ self.extension = File.extname(file.original_filename).gsub(/\./,'').gsub(/\?.*/,'').downcase
156
+ file.original_filename.gsub(".#{read_attribute(:extension)}",'').tap do |original_filename|
157
+ self.name = original_filename.parameterize.to_s unless self.name.present?
158
+ self.title = original_filename unless self.title.present?
159
+ end
160
+ self.filetype = Asset.filetype_for_extension(extension)
161
+ end
162
+
163
+ def ensure_unique_name
164
+ while !Asset.where(:name => self.name).count.zero? do
165
+ self.name = "#{self.name}_#{SecureRandom.hex(8)}"
166
+ end
167
+ end
168
+
169
+ def store
170
+ unless Porthos.s3_storage.store(file, full_name)
171
+ errors[:file] << t(:unable_to_store)
172
+ end
173
+ File.unlink(file.path) if file.respond_to?(:path)
174
+ end
175
+
176
+ # after destroy
177
+ def cleanup
178
+ Porthos.s3_storage.destroy(full_name)
179
+ end
180
+
181
+ def usage_from_association(association)
182
+ {
183
+ 'container_id' => association.id,
184
+ 'usage_type' => association._root_document.class.model_name,
185
+ 'usage_id' => association._root_document.id.to_s
186
+ }
187
+ end
188
+
189
+ end