alchemy_cms 2.5.3.1 → 2.6.0.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (331) hide show
  1. data/.gitignore +1 -1
  2. data/.travis.yml +5 -13
  3. data/Gemfile +6 -3
  4. data/README.md +3 -2
  5. data/alchemy_cms.gemspec +22 -22
  6. data/app/assets/fonts/alchemy-icons.eot +0 -0
  7. data/app/assets/fonts/alchemy-icons.svg +54 -0
  8. data/app/assets/fonts/alchemy-icons.ttf +0 -0
  9. data/app/assets/fonts/alchemy-icons.woff +0 -0
  10. data/app/assets/images/alchemy/icons.png +0 -0
  11. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +151 -0
  12. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +3 -2
  13. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +31 -0
  14. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +1 -1
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +98 -0
  16. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +23 -24
  17. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +27 -0
  18. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +11 -8
  19. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +32 -0
  20. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +46 -0
  21. data/app/assets/javascripts/alchemy/alchemy.js +8 -2
  22. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +5 -4
  23. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +49 -0
  24. data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +3 -0
  25. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +71 -0
  26. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +61 -0
  27. data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +35 -0
  28. data/app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee +11 -0
  29. data/app/assets/javascripts/alchemy/alchemy.windows.js.coffee +278 -0
  30. data/app/assets/stylesheets/alchemy/admin.css.scss +2 -0
  31. data/app/assets/stylesheets/alchemy/archive.scss +109 -65
  32. data/app/assets/stylesheets/alchemy/base.scss +16 -188
  33. data/app/assets/stylesheets/alchemy/dashboard.scss +2 -2
  34. data/app/assets/stylesheets/alchemy/defaults.scss +2 -1
  35. data/app/assets/stylesheets/alchemy/elements.scss +58 -94
  36. data/app/assets/stylesheets/alchemy/errors.scss +2 -2
  37. data/app/assets/stylesheets/alchemy/{mixins.scss → extends.scss} +104 -80
  38. data/app/assets/stylesheets/alchemy/flash.scss +4 -6
  39. data/app/assets/stylesheets/alchemy/fonts.scss +46 -0
  40. data/app/assets/stylesheets/alchemy/form_elements.scss +46 -45
  41. data/app/assets/stylesheets/alchemy/frame.scss +20 -15
  42. data/app/assets/stylesheets/alchemy/icons.scss +22 -9
  43. data/app/assets/stylesheets/alchemy/jquery-ui.scss +476 -399
  44. data/app/assets/stylesheets/alchemy/login.scss +1 -1
  45. data/app/assets/stylesheets/alchemy/menubar.css.scss +1 -1
  46. data/app/assets/stylesheets/alchemy/notices.scss +5 -5
  47. data/app/assets/stylesheets/alchemy/pagination.scss +25 -13
  48. data/app/assets/stylesheets/alchemy/search.scss +29 -17
  49. data/app/assets/stylesheets/alchemy/sitemap.scss +41 -36
  50. data/app/assets/stylesheets/alchemy/tables.scss +102 -50
  51. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +18 -16
  52. data/app/assets/stylesheets/alchemy/toolbar.scss +84 -24
  53. data/app/assets/stylesheets/alchemy/upload.scss +14 -9
  54. data/app/assets/stylesheets/alchemy/variables.scss +1 -0
  55. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +18 -21
  56. data/app/controllers/alchemy/admin/attachments_controller.rb +29 -39
  57. data/app/controllers/alchemy/admin/base_controller.rb +3 -9
  58. data/app/controllers/alchemy/admin/clipboard_controller.rb +1 -1
  59. data/app/controllers/alchemy/admin/contents_controller.rb +1 -1
  60. data/app/controllers/alchemy/admin/dashboard_controller.rb +1 -1
  61. data/app/controllers/alchemy/admin/elements_controller.rb +3 -3
  62. data/app/controllers/alchemy/admin/essence_files_controller.rb +1 -1
  63. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +5 -5
  64. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  65. data/app/controllers/alchemy/admin/pages_controller.rb +18 -16
  66. data/app/controllers/alchemy/admin/pictures_controller.rb +11 -10
  67. data/app/controllers/alchemy/admin/resources_controller.rb +87 -14
  68. data/app/controllers/alchemy/admin/tags_controller.rb +3 -3
  69. data/app/controllers/alchemy/admin/trash_controller.rb +3 -3
  70. data/app/controllers/alchemy/admin/users_controller.rb +6 -11
  71. data/app/controllers/alchemy/attachments_controller.rb +8 -9
  72. data/app/controllers/alchemy/base_controller.rb +17 -10
  73. data/app/controllers/alchemy/pages_controller.rb +7 -19
  74. data/app/controllers/alchemy/passwords_controller.rb +15 -3
  75. data/app/controllers/alchemy/user_sessions_controller.rb +5 -4
  76. data/app/controllers/alchemy/users_controller.rb +1 -1
  77. data/app/helpers/alchemy/admin/attachments_helper.rb +2 -2
  78. data/app/helpers/alchemy/admin/base_helper.rb +62 -90
  79. data/app/helpers/alchemy/admin/elements_helper.rb +13 -5
  80. data/app/helpers/alchemy/admin/essences_helper.rb +3 -5
  81. data/app/helpers/alchemy/admin/pages_helper.rb +6 -3
  82. data/app/helpers/alchemy/admin/tags_helper.rb +60 -0
  83. data/app/helpers/alchemy/base_helper.rb +16 -20
  84. data/app/helpers/alchemy/elements_helper.rb +7 -11
  85. data/app/helpers/alchemy/essences_helper.rb +2 -2
  86. data/app/helpers/alchemy/pages_helper.rb +31 -69
  87. data/app/helpers/alchemy/url_helper.rb +11 -3
  88. data/app/models/alchemy/attachment.rb +73 -45
  89. data/app/models/alchemy/cell.rb +1 -1
  90. data/app/models/alchemy/content.rb +20 -9
  91. data/app/models/alchemy/element.rb +9 -7
  92. data/app/models/alchemy/page.rb +15 -248
  93. data/app/models/alchemy/page/cells.rb +71 -0
  94. data/app/models/alchemy/page/elements.rb +147 -0
  95. data/app/models/alchemy/page/naming.rb +90 -0
  96. data/app/models/alchemy/picture.rb +18 -13
  97. data/app/models/alchemy/tag.rb +1 -1
  98. data/app/models/alchemy/user.rb +38 -6
  99. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +14 -7
  100. data/app/views/alchemy/admin/attachments/_attachment.html.erb +17 -12
  101. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -8
  102. data/app/views/alchemy/admin/attachments/_files_list.html.erb +20 -12
  103. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +11 -0
  104. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +31 -0
  105. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +4 -0
  106. data/app/views/alchemy/admin/attachments/edit.html.erb +8 -7
  107. data/app/views/alchemy/admin/attachments/index.html.erb +19 -12
  108. data/app/views/alchemy/admin/attachments/new.html.erb +2 -2
  109. data/app/views/alchemy/admin/attachments/show.html.erb +3 -0
  110. data/app/views/alchemy/admin/contents/_missing.html.erb +4 -4
  111. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  112. data/app/views/alchemy/admin/contents/new.html.erb +6 -3
  113. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  114. data/app/views/alchemy/admin/dashboard/_users.html.erb +1 -1
  115. data/app/views/alchemy/admin/dashboard/index.html.erb +3 -3
  116. data/app/views/alchemy/admin/dashboard/info.html.erb +16 -13
  117. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  118. data/app/views/alchemy/admin/elements/_element_foot.html.erb +4 -4
  119. data/app/views/alchemy/admin/elements/_element_head.html.erb +1 -7
  120. data/app/views/alchemy/admin/elements/_elements_select.html.erb +2 -2
  121. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +4 -4
  122. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
  123. data/app/views/alchemy/admin/elements/create.js.erb +2 -2
  124. data/app/views/alchemy/admin/elements/fold.js.erb +3 -6
  125. data/app/views/alchemy/admin/elements/new.html.erb +1 -1
  126. data/app/views/alchemy/admin/elements/order.js.erb +1 -1
  127. data/app/views/alchemy/admin/elements/trash.js.erb +1 -1
  128. data/app/views/alchemy/admin/elements/update.js.erb +2 -2
  129. data/app/views/alchemy/admin/essence_files/edit.html.erb +4 -4
  130. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +17 -18
  131. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +2 -2
  132. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -0
  133. data/app/views/alchemy/admin/languages/_form.html.erb +12 -10
  134. data/app/views/alchemy/admin/languages/_language.html.erb +2 -1
  135. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  136. data/app/views/alchemy/admin/languages/index.html.erb +15 -15
  137. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +6 -6
  138. data/app/views/alchemy/admin/layoutpages/index.html.erb +41 -40
  139. data/app/views/alchemy/admin/pages/_contactform_links.html.erb +4 -4
  140. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +6 -6
  141. data/app/views/alchemy/admin/pages/_external_link.html.erb +2 -2
  142. data/app/views/alchemy/admin/pages/_file_link.html.erb +3 -3
  143. data/app/views/alchemy/admin/pages/_internal_link.html.erb +1 -1
  144. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
  145. data/app/views/alchemy/admin/pages/_page.html.erb +13 -13
  146. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +2 -4
  147. data/app/views/alchemy/admin/pages/_sitemap.html.erb +5 -0
  148. data/app/views/alchemy/admin/pages/configure.html.erb +7 -7
  149. data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
  150. data/app/views/alchemy/admin/pages/edit.html.erb +23 -30
  151. data/app/views/alchemy/admin/pages/index.html.erb +34 -23
  152. data/app/views/alchemy/admin/pages/new.html.erb +1 -1
  153. data/app/views/alchemy/admin/pages/sort.js.erb +1 -1
  154. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +2 -3
  155. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
  156. data/app/views/alchemy/admin/partials/_search_form.html.erb +3 -3
  157. data/app/views/alchemy/admin/partials/_upload_form.html.erb +2 -2
  158. data/app/views/alchemy/admin/pictures/_archive.html.erb +7 -7
  159. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  160. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +6 -6
  161. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +4 -4
  162. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  163. data/app/views/alchemy/admin/pictures/_picture.html.erb +3 -8
  164. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +9 -14
  165. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +27 -25
  166. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +3 -1
  167. data/app/views/alchemy/admin/pictures/index.html.erb +49 -42
  168. data/app/views/alchemy/admin/pictures/new.html.erb +2 -2
  169. data/app/views/alchemy/admin/pictures/show.html.erb +11 -0
  170. data/app/views/alchemy/admin/resources/_boolean.html.erb +2 -2
  171. data/app/views/alchemy/admin/resources/_datetime.html.erb +2 -2
  172. data/app/views/alchemy/admin/resources/_form.html.erb +9 -8
  173. data/app/views/alchemy/admin/resources/_resource.html.erb +15 -21
  174. data/app/views/alchemy/admin/resources/_string.html.erb +2 -2
  175. data/app/views/alchemy/admin/resources/_table.html.erb +11 -13
  176. data/app/views/alchemy/admin/resources/_text.html.erb +2 -2
  177. data/app/views/alchemy/admin/resources/index.csv.erb +13 -0
  178. data/app/views/alchemy/admin/resources/index.html.erb +24 -15
  179. data/app/views/alchemy/admin/sites/index.html.erb +23 -0
  180. data/app/views/alchemy/admin/tags/_radio_tag.html.erb +1 -1
  181. data/app/views/alchemy/admin/tags/_tag.html.erb +2 -1
  182. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  183. data/app/views/alchemy/admin/tags/index.html.erb +16 -11
  184. data/app/views/alchemy/admin/tags/new.html.erb +3 -3
  185. data/app/views/alchemy/admin/trash/clear.js.coffee +1 -1
  186. data/app/views/alchemy/admin/users/_table.html.erb +12 -5
  187. data/app/views/alchemy/admin/users/_user.html.erb +16 -16
  188. data/app/views/alchemy/admin/users/index.html.erb +28 -16
  189. data/app/views/alchemy/breadcrumb/_page.html.erb +15 -0
  190. data/app/views/alchemy/breadcrumb/_spacer.html.erb +1 -0
  191. data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
  192. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -16
  193. data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -9
  194. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +3 -6
  195. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +9 -8
  196. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -5
  197. data/app/views/alchemy/essences/_linkable_essence_tools.html.erb +2 -2
  198. data/app/views/alchemy/navigation/_link.html.erb +7 -7
  199. data/app/views/alchemy/navigation/_renderer.html.erb +29 -36
  200. data/app/views/alchemy/notifications/admin_user_created.de.text.erb +5 -1
  201. data/app/views/alchemy/notifications/admin_user_created.en.text.erb +5 -1
  202. data/app/views/alchemy/notifications/registered_user_created.de.text.erb +13 -0
  203. data/app/views/alchemy/notifications/registered_user_created.en.text.erb +13 -0
  204. data/app/views/alchemy/search/_result.html.erb +4 -6
  205. data/app/views/alchemy/search/_results.html.erb +4 -5
  206. data/app/views/alchemy/user_sessions/leave.html.erb +1 -1
  207. data/app/views/alchemy/user_sessions/new.html.erb +2 -2
  208. data/app/views/kaminari/_first_page.html.erb +11 -0
  209. data/app/views/kaminari/_gap.html.erb +1 -1
  210. data/app/views/kaminari/_last_page.html.erb +11 -0
  211. data/app/views/kaminari/_next_page.html.erb +2 -2
  212. data/app/views/kaminari/_page.html.erb +1 -1
  213. data/app/views/kaminari/_paginator.html.erb +2 -0
  214. data/app/views/kaminari/_prev_page.html.erb +2 -2
  215. data/app/views/layouts/alchemy/admin.html.erb +4 -5
  216. data/config/alchemy/config.yml +8 -12
  217. data/config/authorization_rules.rb +4 -3
  218. data/config/initializers/dragonfly.rb +20 -12
  219. data/config/locales/alchemy.de.yml +20 -15
  220. data/config/locales/alchemy.en.yml +15 -10
  221. data/config/locales/devise.de.yml +1 -0
  222. data/config/routes.rb +3 -3
  223. data/{spec/dummy/db/migrate/20121118000000_alchemy_two_point_four.rb → db/migrate/20130214233001_alchemy_two_point_five.rb} +50 -36
  224. data/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +21 -0
  225. data/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +11 -0
  226. data/lib/alchemy/capistrano.rb +10 -8
  227. data/lib/alchemy/errors.rb +7 -0
  228. data/lib/alchemy/filetypes.rb +33 -0
  229. data/lib/alchemy/i18n.rb +9 -1
  230. data/lib/alchemy/name_conversions.rb +28 -0
  231. data/lib/alchemy/page_layout.rb +5 -3
  232. data/lib/alchemy/resource.rb +132 -29
  233. data/lib/alchemy/resources_helper.rb +81 -12
  234. data/lib/alchemy/upgrader.rb +14 -276
  235. data/lib/alchemy/version.rb +1 -1
  236. data/lib/alchemy_cms.rb +17 -2
  237. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +1 -1
  238. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +1 -1
  239. data/lib/tasks/alchemy/convert.rake +39 -0
  240. data/lib/tasks/alchemy/install.rake +4 -6
  241. data/lib/tasks/alchemy/upgrade.rake +18 -1
  242. data/spec/controllers/admin/clipboard_controller_spec.rb +4 -4
  243. data/spec/controllers/admin/elements_controller_spec.rb +23 -23
  244. data/spec/controllers/admin/pages_controller_spec.rb +15 -0
  245. data/spec/controllers/admin/resources_controller_spec.rb +1 -11
  246. data/spec/controllers/admin/trash_controller_spec.rb +9 -9
  247. data/spec/controllers/attachments_controller_spec.rb +3 -3
  248. data/spec/controllers/elements_controller_spec.rb +2 -2
  249. data/spec/controllers/pages_controller_spec.rb +160 -129
  250. data/spec/controllers/pictures_controller_spec.rb +2 -2
  251. data/spec/controllers/user_sessions_controller_spec.rb +3 -3
  252. data/spec/controllers/users_controller_spec.rb +2 -2
  253. data/spec/dummy/app/models/event.rb +2 -2
  254. data/spec/dummy/app/models/location.rb +4 -0
  255. data/spec/dummy/app/views/layouts/application.html.erb +6 -42
  256. data/spec/dummy/config/routes.rb +1 -1
  257. data/spec/dummy/db/migrate/20121026104128_create_events.rb +0 -1
  258. data/{db/migrate/20121118000000_alchemy_two_point_four.rb → spec/dummy/db/migrate/20130214233001_alchemy_two_point_five.rb} +50 -36
  259. data/spec/dummy/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +21 -0
  260. data/spec/dummy/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +11 -0
  261. data/spec/dummy/db/migrate/20130328101418_create_locations.rb +9 -0
  262. data/spec/dummy/db/schema.rb +15 -6
  263. data/spec/factories.rb +4 -4
  264. data/spec/{integration → features}/admin/link_overlay_spec.rb +0 -0
  265. data/spec/{integration → features}/admin/modules_integration_spec.rb +1 -1
  266. data/spec/{integration → features}/admin/pages_controller_spec.rb +9 -4
  267. data/spec/{integration → features}/admin/picture_library_integration_spec.rb +5 -5
  268. data/spec/{integration → features}/admin/resources_integration_spec.rb +1 -1
  269. data/spec/{integration → features}/navigation_spec.rb +0 -0
  270. data/spec/{integration → features}/pages_controller_spec.rb +42 -112
  271. data/spec/{integration → features}/picture_security_spec.rb +2 -2
  272. data/spec/{integration → features}/security_spec.rb +7 -7
  273. data/spec/{integration → features}/translation_integration_spec.rb +0 -0
  274. data/spec/helpers/admin/base_helper_spec.rb +0 -50
  275. data/spec/helpers/admin/tags_helper_spec.rb +53 -0
  276. data/spec/helpers/base_helper_spec.rb +19 -3
  277. data/spec/helpers/pages_helper_spec.rb +92 -44
  278. data/spec/{url_helpers_spec.rb → helpers/picture_url_helpers_spec.rb} +7 -7
  279. data/spec/helpers/url_helper_spec.rb +92 -72
  280. data/spec/{config_spec.rb → libraries/config_spec.rb} +0 -0
  281. data/spec/libraries/resource_spec.rb +215 -76
  282. data/spec/libraries/resources_helper_spec.rb +70 -28
  283. data/spec/models/attachment_spec.rb +75 -9
  284. data/spec/models/clipboard_spec.rb +1 -1
  285. data/spec/models/element_spec.rb +7 -0
  286. data/spec/models/page_spec.rb +144 -25
  287. data/spec/models/picture_spec.rb +5 -5
  288. data/spec/models/resource_spec.rb +47 -10
  289. data/spec/models/user_spec.rb +115 -3
  290. data/spec/{routing_spec.rb → routing/routing_spec.rb} +8 -20
  291. data/spec/spec_helper.rb +5 -6
  292. data/spec/support/alchemy/specs_helpers.rb +1 -1
  293. data/spec/support/ci/install_phantomjs +1 -1
  294. data/spec/support/image with spaces.png +0 -0
  295. data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +18 -18
  296. data/vendor/assets/javascripts/jquery_plugins/{jquery.dialogextend.1_0_1.js → jquery.dialogextend.js} +25 -17
  297. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +7 -0
  298. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +7 -7
  299. data/vendor/assets/javascripts/keymage.min.js +6 -0
  300. data/vendor/assets/javascripts/spin.min.js +1 -0
  301. metadata +122 -124
  302. data/app/assets/images/alchemy/ajax_loader.gif +0 -0
  303. data/app/assets/images/alchemy/gui/toggle.png +0 -0
  304. data/app/assets/images/alchemy/image_loader.gif +0 -0
  305. data/app/assets/images/alchemy/shading.png +0 -0
  306. data/app/assets/images/alchemy/tabs.gif +0 -0
  307. data/app/assets/javascripts/alchemy/alchemy.base.js +0 -172
  308. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +0 -47
  309. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +0 -91
  310. data/app/assets/javascripts/alchemy/alchemy.growler.js +0 -46
  311. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +0 -60
  312. data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +0 -15
  313. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +0 -97
  314. data/app/assets/javascripts/alchemy/alchemy.windows.js +0 -321
  315. data/app/models/alchemy/clipboard_spec.rb +0 -0
  316. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +0 -8
  317. data/app/views/alchemy/notifications/registered_user_created.text.erb +0 -11
  318. data/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb +0 -21
  319. data/db/migrate/20121205155004_create_alchemy_sites.rb +0 -14
  320. data/db/migrate/20121211163003_add_public_to_alchemy_sites.rb +0 -6
  321. data/db/migrate/20121220102223_add_aliases_to_site.rb +0 -6
  322. data/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +0 -11
  323. data/db/migrate/20130121092645_migrate_to_devise.rb +0 -24
  324. data/spec/alchemy_spec.rb +0 -7
  325. data/spec/dummy/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb +0 -21
  326. data/spec/dummy/db/migrate/20121205155004_create_alchemy_sites.rb +0 -14
  327. data/spec/dummy/db/migrate/20121211163003_add_public_to_alchemy_sites.rb +0 -6
  328. data/spec/dummy/db/migrate/20121220102223_add_aliases_to_site.rb +0 -6
  329. data/spec/dummy/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +0 -11
  330. data/spec/dummy/db/migrate/20130121092645_migrate_to_devise.rb +0 -24
  331. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo-1.4.2-min.js +0 -11
@@ -1,27 +1,93 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  module Alchemy
4
5
  describe Attachment do
6
+ let(:file) { File.new(File.expand_path('../../support/image with spaces.png', __FILE__)) }
7
+ let(:attachment) { Attachment.new(:file => file) }
5
8
 
6
- describe '#urlname' do
9
+ describe 'after create' do
10
+ before { attachment.save! }
7
11
 
8
- context "with url characters in the filename" do
9
- subject { Attachment.new(:filename => 'f#%&cking cute kitten pic.png') }
12
+ it "should have a humanized name" do
13
+ attachment.name.should == "image with spaces"
14
+ end
15
+
16
+ it "should have a valid file_name" do
17
+ attachment.file_name.should == "image-with-spaces.png"
18
+ end
19
+
20
+ after { attachment.destroy }
21
+ end
22
+
23
+ describe 'urlname sanitizing' do
24
+ it "should sanitize url characters in the filename" do
25
+ attachment.file_name = 'f#%&cking cute kitten pic.png'
26
+ attachment.save!
27
+ attachment.urlname.should == 'f-cking-cute-kitten-pic.png'
28
+ end
29
+
30
+ it "should sanitize lot of dots in the name" do
31
+ attachment.file_name = 'cute.kitten.pic.png'
32
+ attachment.save!
33
+ attachment.urlname.should == 'cute-kitten-pic.png'
34
+ end
35
+
36
+ it "should sanitize umlauts in the name" do
37
+ attachment.file_name = 'süßes katzenbild.png'
38
+ attachment.save!
39
+ attachment.urlname.should == 'suesses-katzenbild.png'
40
+ end
41
+
42
+ after { attachment.destroy }
43
+ end
10
44
 
11
- it "should escape as uri" do
12
- subject.urlname.should == 'f___cking_cute_kitten_pic.png'
45
+ describe 'validations' do
46
+
47
+ context "having a png, but only pdf allowed" do
48
+ before { Config.stub!(:get).and_return({'allowed_filetypes' => {'attachments' => ['pdf']}}) }
49
+
50
+ it "should not be valid" do
51
+ attachment.should_not be_valid
13
52
  end
14
53
  end
15
54
 
16
- context "with lot of dots in the name" do
17
- subject { Attachment.new(:filename => 'cute.kitten.pic.png') }
55
+ context "having a png and everything allowed" do
56
+ before { Config.stub!(:get).and_return({'allowed_filetypes' => {'attachments' => ['*']}}) }
18
57
 
19
- it "should convert dots in the name part into dashes" do
20
- subject.urlname.should == 'cute-kitten-pic.png'
58
+ it "should be valid" do
59
+ attachment.should be_valid
21
60
  end
22
61
  end
23
62
 
24
63
  end
25
64
 
65
+ context 'PNG image' do
66
+ subject { stub_model(Attachment, :file_name => 'kitten.png') }
67
+ its(:extension) { should == "png" }
68
+ end
69
+
70
+ describe 'css classes' do
71
+ context 'mp3 file' do
72
+ subject { stub_model(Attachment, :file_mime_type => 'audio/mpeg') }
73
+ its(:icon_css_class) { should == "audio" }
74
+ end
75
+
76
+ context 'png file' do
77
+ subject { stub_model(Attachment, :file_mime_type => 'image/png') }
78
+ its(:icon_css_class) { should == "image" }
79
+ end
80
+
81
+ context 'vcf file' do
82
+ subject { stub_model(Attachment, :file_mime_type => 'application/vcard') }
83
+ its(:icon_css_class) { should == "vcard" }
84
+ end
85
+
86
+ context 'zip file' do
87
+ subject { stub_model(Attachment, :file_mime_type => 'application/zip') }
88
+ its(:icon_css_class) { should == "archive" }
89
+ end
90
+ end
91
+
26
92
  end
27
93
  end
@@ -46,7 +46,7 @@ module Alchemy
46
46
 
47
47
  context "full clipboard" do
48
48
 
49
- before(:all) do
49
+ before do
50
50
  clipboard[:elements] = [{:id => 1}, {:id => 2}]
51
51
  clipboard[:pages] = [{:id => 2}, {:id => 3}]
52
52
  end
@@ -422,5 +422,12 @@ module Alchemy
422
422
 
423
423
  end
424
424
 
425
+ describe '#save_contents' do
426
+ it "should return true if attributes hash is nil" do
427
+ element = FactoryGirl.create(:element, create_contents_after_create: true)
428
+ element.save_contents(nil).should be_true
429
+ end
430
+ end
431
+
425
432
  end
426
433
  end
@@ -176,6 +176,16 @@ module Alchemy
176
176
  page.legacy_urls.should be_empty
177
177
  end
178
178
 
179
+ it "should not store legacy url twice for same urlname" do
180
+ page.urlname = 'new-urlname'
181
+ page.save!
182
+ page.urlname = 'my-testpage'
183
+ page.save!
184
+ page.urlname = 'another-urlname'
185
+ page.save!
186
+ page.legacy_urls.select { |u| u.urlname == 'my-testpage' }.size.should == 1
187
+ end
188
+
179
189
  end
180
190
 
181
191
  context "urlname has not changed" do
@@ -340,6 +350,7 @@ module Alchemy
340
350
  end
341
351
 
342
352
  describe "#elements_grouped_by_cells" do
353
+ let(:page) { FactoryGirl.create(:public_page, :do_not_autogenerate => false) }
343
354
 
344
355
  before do
345
356
  PageLayout.stub(:get).and_return({
@@ -352,16 +363,16 @@ module Alchemy
352
363
  'name' => "header",
353
364
  'elements' => ["header"]
354
365
  }])
355
- @page = FactoryGirl.create(:public_page, :do_not_autogenerate => false)
356
366
  end
357
367
 
358
368
  it "should return elements grouped by cell" do
359
- @page.elements_grouped_by_cells.keys.first.should be_instance_of(Cell)
360
- @page.elements_grouped_by_cells.values.first.first.should be_instance_of(Element)
369
+ elements = page.elements_grouped_by_cells
370
+ elements.keys.first.should be_instance_of(Cell)
371
+ elements.values.first.first.should be_instance_of(Element)
361
372
  end
362
373
 
363
374
  it "should only include elements beeing in a cell " do
364
- @page.elements_grouped_by_cells.keys.should_not include(nil)
375
+ page.elements_grouped_by_cells.keys.should_not include(nil)
365
376
  end
366
377
 
367
378
  end
@@ -410,35 +421,54 @@ module Alchemy
410
421
 
411
422
  end
412
423
 
413
- describe "validations" do
424
+ describe "Validations: " do
414
425
 
415
- context "saving a normal content page" do
426
+ context "Creating a normal content page" do
416
427
 
417
- it "should be possible to save when its urlname already exists in the scope of global pages" do
418
- contentpage = FactoryGirl.create(:page, :urlname => "existing_twice")
419
- global_with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice", :layoutpage => true)
420
- contentpage.title = "new Title"
421
- contentpage.save.should == true
422
- end
428
+ let(:contentpage) { FactoryGirl.build(:page) }
423
429
 
424
- end
425
-
426
- context "creating a normal content page" do
427
-
428
- before do
429
- @contentpage = FactoryGirl.build(:page)
430
+ context "when its urlname exists as global page" do
431
+ it "it should be possible to save." do
432
+ contentpage.urlname = "existing_twice"
433
+ global_with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice", :layoutpage => true)
434
+ contentpage.should be_valid
435
+ end
430
436
  end
431
437
 
432
438
  it "should validate the page_layout" do
433
- @contentpage.page_layout = nil
434
- @contentpage.save
435
- @contentpage.should have(1).error_on(:page_layout)
439
+ contentpage.page_layout = nil
440
+ contentpage.save
441
+ contentpage.should have(1).error_on(:page_layout)
436
442
  end
437
443
 
438
444
  it "should validate the parent_id" do
439
- @contentpage.parent_id = nil
440
- @contentpage.save
441
- @contentpage.should have(1).error_on(:parent_id)
445
+ contentpage.parent_id = nil
446
+ contentpage.save
447
+ contentpage.should have(1).error_on(:parent_id)
448
+ end
449
+
450
+ it "should validate the uniqueness of urlname" do
451
+ with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
452
+ contentpage.urlname = 'existing_twice'
453
+ contentpage.should_not be_valid
454
+ end
455
+
456
+ context "with url_nesting set to true" do
457
+ before { Config.stub!(:get).and_return(true) }
458
+
459
+ it "should only validate urlname dependent of parent" do
460
+ other_parent = FactoryGirl.create(:page, parent_id: Page.root.id)
461
+ with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
462
+ contentpage.urlname = 'existing_twice'
463
+ contentpage.parent_id = other_parent.id
464
+ contentpage.should be_valid
465
+ end
466
+
467
+ it "should validate urlname dependent of parent" do
468
+ with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
469
+ contentpage.urlname = 'existing_twice'
470
+ contentpage.should_not be_valid
471
+ end
442
472
  end
443
473
 
444
474
  end
@@ -763,7 +793,7 @@ module Alchemy
763
793
  end
764
794
 
765
795
  describe "#publish!" do
766
- let(:page) { stub_model(Page, public: false, name: "page", parent_id: 1, urlname: "page", language: stub_model(Language), page_layout: "bla") }
796
+ let(:page) { FactoryGirl.create(:page) }
767
797
  before { page.publish! }
768
798
 
769
799
  it "sets public attribute to true" do
@@ -771,5 +801,94 @@ module Alchemy
771
801
  end
772
802
  end
773
803
 
804
+ describe 'urlname updating' do
805
+ let(:parentparent) { FactoryGirl.create(:page, name: 'parentparent', visible: true) }
806
+ let(:parent) { FactoryGirl.create(:page, parent_id: parentparent.id, name: 'parent', visible: true) }
807
+ let(:page) { FactoryGirl.create(:page, parent_id: parent.id, name: 'page', visible: true) }
808
+ let(:invisible) { FactoryGirl.create(:page, parent_id: page.id, name: 'invisible', visible: false) }
809
+ let(:contact) { FactoryGirl.create(:page, parent_id: invisible.id, name: 'contact', visible: true) }
810
+
811
+ context "with activated url_nesting" do
812
+ before { Config.stub!(:get).and_return(true) }
813
+
814
+ it "should store all parents urlnames delimited by slash" do
815
+ page.urlname.should == 'parentparent/parent/page'
816
+ end
817
+
818
+ it "should not include the root page" do
819
+ page.urlname.should_not =~ /root/
820
+ end
821
+
822
+ it "should not include the language root page" do
823
+ page.urlname.should_not =~ /startseite/
824
+ end
825
+
826
+ it "should not include invisible pages" do
827
+ contact.urlname.should_not =~ /invisible/
828
+ end
829
+
830
+ context "after changing my urlname" do
831
+ it "should update urlnames of descendants" do
832
+ page
833
+ parentparent.urlname = 'new-urlname'
834
+ parentparent.save!
835
+ page.reload
836
+ page.urlname.should == 'new-urlname/parent/page'
837
+ end
838
+
839
+ it "should create a legacy url" do
840
+ page.stub!(:slug).and_return('foo')
841
+ page.update_urlname!
842
+ page.legacy_urls.should_not be_empty
843
+ page.legacy_urls.collect(&:urlname).should include('parentparent/parent/page')
844
+ end
845
+ end
846
+
847
+ context "after updating my visibility" do
848
+ it "should update urlnames of descendants" do
849
+ page
850
+ parentparent.visible = false
851
+ parentparent.save!
852
+ page.reload
853
+ page.urlname.should == 'parent/page'
854
+ end
855
+ end
856
+ end
857
+
858
+ context "with disabled url_nesting" do
859
+ before { Config.stub!(:get).and_return(false) }
860
+
861
+ it "should only store my urlname" do
862
+ page.urlname.should == 'page'
863
+ end
864
+ end
865
+ end
866
+
867
+ describe '#slug' do
868
+ context "with parents path saved in urlname" do
869
+ let(:page) { FactoryGirl.build(:page, urlname: 'root/parent/my-name')}
870
+
871
+ it "should return the last part of the urlname" do
872
+ page.slug.should == 'my-name'
873
+ end
874
+ end
875
+
876
+ context "with single urlname" do
877
+ let(:page) { FactoryGirl.build(:page, urlname: 'my-name')}
878
+
879
+ it "should return the last part of the urlname" do
880
+ page.slug.should == 'my-name'
881
+ end
882
+ end
883
+
884
+ context "with nil as urlname" do
885
+ let(:page) { FactoryGirl.build(:page, urlname: nil)}
886
+
887
+ it "should return nil" do
888
+ page.slug.should be_nil
889
+ end
890
+ end
891
+ end
892
+
774
893
  end
775
894
  end
@@ -52,21 +52,21 @@ module Alchemy
52
52
  it "should return a humanized version of original filename" do
53
53
  pic = stub_model(Picture, :image_file_name => 'cute_kitten.JPG')
54
54
  pic.stub(:image_file).and_return(OpenStruct.new({:ext => 'jpg'}))
55
- pic.humanized_name.should == "Cute kitten"
55
+ pic.humanized_name.should == "cute kitten"
56
56
  end
57
57
 
58
58
  it "should not remove incidents of suffix from filename" do
59
59
  pic = stub_model(Picture, :image_file_name => 'cute_kitten_mo.jpgi.JPG')
60
60
  pic.stub(:image_file).and_return(OpenStruct.new({:ext => 'jpg'}))
61
- pic.humanized_name.should == "Cute kitten mo.jpgi"
62
- pic.humanized_name.should_not == "Cute kitten moi"
61
+ pic.humanized_name.should == "cute kitten mo.jpgi"
62
+ pic.humanized_name.should_not == "cute kitten moi"
63
63
  end
64
64
 
65
65
  context "image has no suffix" do
66
66
  it "should return humanized name" do
67
67
  pic = stub_model(Picture, :image_file_name => 'cute_kitten')
68
68
  pic.stub(:suffix).and_return("")
69
- pic.humanized_name.should == "Cute kitten"
69
+ pic.humanized_name.should == "cute kitten"
70
70
  end
71
71
  end
72
72
 
@@ -116,7 +116,7 @@ module Alchemy
116
116
 
117
117
  describe '.recent' do
118
118
 
119
- before(:all) do
119
+ before do
120
120
  now = Time.now
121
121
  @recent = Picture.create!(:image_file => image_file)
122
122
  @old_picture = Picture.create!(:image_file => image_file)
@@ -44,9 +44,9 @@ module Alchemy
44
44
  end
45
45
  end
46
46
 
47
- describe "#model_name" do
47
+ describe "#resource_name" do
48
48
  it "should return the model name (singularized and as a string)" do
49
- resource.model_name.should == "event"
49
+ resource.resource_name.should == "event"
50
50
  end
51
51
  end
52
52
 
@@ -94,28 +94,65 @@ module Alchemy
94
94
 
95
95
  context "when resource_relations defined as class-method in the model" do
96
96
  before do
97
+ ::ActiveSupport::Deprecation.silenced = true
97
98
  Event.class_eval do
98
99
  def self.resource_relations
99
100
  {
100
- :location_id => {:attr_method => "location#name", :attr_type => :string},
101
- :organizer_id => {:attr_method => "organizer#name", :attr_type => :string}
101
+ :location => {:attr_method => "location#name", :attr_type => :string}
102
102
  }
103
103
  end
104
104
  end
105
105
  end
106
+
107
+ it "should contain model_association from ActiveRecord::Reflections" do
108
+ relation = resource.resource_relations[:location_id]
109
+ relation.keys.should include(:model_association)
110
+ relation[:model_association].class.should be(ActiveRecord::Reflection::AssociationReflection)
111
+ end
112
+
113
+ it "should skip default alchemy model associations" do
114
+ resource.model_associations.collect(&:name).should_not include(*resource.class.const_get(:DEFAULT_SKIPPED_ASSOCIATIONS).map(&:to_sym))
115
+ end
116
+
117
+ it "should add _id to relation key" do
118
+ resource.resource_relations[:location_id].should_not be_nil
119
+ end
120
+
121
+ it "should store the relation name" do
122
+ relation = resource.resource_relations[:location_id]
123
+ relation.keys.should include(:name)
124
+ relation[:name].should == 'location'
125
+ end
126
+
127
+ context "with old hash delimited attr_method style" do
128
+ it "should show deprecation warnings" do
129
+ ActiveSupport::Deprecation.should_receive(:warn)
130
+ resource.resource_relations
131
+ end
132
+
133
+ it "should return the last part as attr_method" do
134
+ resource.resource_relations[:location_id][:attr_method].should == 'name'
135
+ end
136
+ end
137
+
138
+ context "#attributes" do
139
+ it "should contain the relation" do
140
+ resource.attributes.detect { |a| a[:name] == 'location_id' }.keys.should include(:relation)
141
+ end
142
+
143
+ it "should have the relation column type as type" do
144
+ resource.attributes.detect { |a| a[:name] == "location_id" }[:type].should == :string
145
+ end
146
+ end
147
+
106
148
  after do
149
+ ::ActiveSupport::Deprecation.silenced = false
107
150
  Event.class_eval do
108
151
  class << self
109
152
  undef :resource_relations
110
153
  end
111
154
  end
112
155
  end
113
- it "should use the attribute location#name instead of location_id" do
114
- resource.attributes.detect { |a| a[:name] == "location#name" }.should == {:name => "location#name", :type => :string}
115
- end
116
- it "should use the attribute organizer#name instead of organizer_id" do
117
- resource.attributes.detect { |a| a[:name] == "organizer#name" }.should == {:name => "organizer#name", :type => :string}
118
- end
119
156
  end
120
157
 
121
158
  context "when resource_relation is not defined" do