browsercms 3.1.5 → 3.3.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 (425) hide show
  1. data/app/controllers/cms/base_controller.rb +3 -3
  2. data/app/controllers/cms/content_block_controller.rb +2 -2
  3. data/app/controllers/cms/content_controller.rb +5 -4
  4. data/app/controllers/cms/error_handling.rb +1 -1
  5. data/app/controllers/cms/routes_controller.rb +4 -5
  6. data/app/controllers/cms/section_nodes_controller.rb +1 -6
  7. data/app/controllers/cms/sections_controller.rb +2 -3
  8. data/app/controllers/cms/tasks_controller.rb +3 -0
  9. data/app/controllers/cms/users_controller.rb +1 -1
  10. data/app/helpers/cms/application_helper.rb +137 -34
  11. data/app/helpers/cms/form_builder.rb +33 -21
  12. data/app/helpers/cms/page_helper.rb +43 -10
  13. data/app/helpers/cms/path_helper.rb +1 -1
  14. data/app/helpers/cms/rendering_helper.rb +3 -4
  15. data/app/helpers/cms/section_nodes_helper.rb +5 -43
  16. data/app/models/abstract_file_block.rb +1 -16
  17. data/app/models/attachment.rb +57 -22
  18. data/app/models/category.rb +4 -4
  19. data/app/models/category_type.rb +2 -2
  20. data/app/models/cms/view_context.rb +46 -0
  21. data/app/models/connector.rb +7 -6
  22. data/app/models/content_type.rb +3 -3
  23. data/app/models/dynamic_view.rb +1 -1
  24. data/app/models/email_message.rb +2 -2
  25. data/app/models/file_block.rb +12 -0
  26. data/app/models/group.rb +4 -4
  27. data/app/models/group_type.rb +4 -4
  28. data/app/models/html_block.rb +1 -1
  29. data/app/models/image_block.rb +12 -0
  30. data/app/models/link.rb +22 -5
  31. data/app/models/page.rb +87 -46
  32. data/app/models/page_route.rb +61 -6
  33. data/app/models/permission.rb +1 -1
  34. data/app/models/portlet.rb +14 -4
  35. data/app/models/section.rb +48 -86
  36. data/app/models/section_node.rb +25 -40
  37. data/app/models/site.rb +1 -1
  38. data/app/models/tag.rb +1 -1
  39. data/app/models/task.rb +8 -7
  40. data/app/models/user.rb +2 -7
  41. data/app/portlets/forgot_password_portlet.rb +6 -2
  42. data/app/portlets/reset_password_portlet.rb +1 -1
  43. data/app/views/cms/blocks/_toolbar.html.erb +1 -1
  44. data/app/views/cms/blocks/_toolbar_for_collection.html.erb +3 -6
  45. data/app/views/cms/blocks/_toolbar_for_member.html.erb +3 -5
  46. data/app/views/cms/blocks/edit.html.erb +4 -4
  47. data/app/views/cms/blocks/index.html.erb +7 -7
  48. data/app/views/cms/blocks/new.html.erb +4 -4
  49. data/app/views/cms/blocks/show.html.erb +2 -2
  50. data/app/views/cms/blocks/usages.html.erb +2 -2
  51. data/app/views/cms/blocks/versions.html.erb +4 -4
  52. data/app/views/cms/cache/show.html.erb +2 -2
  53. data/app/views/cms/categories/_form.html.erb +2 -2
  54. data/app/views/cms/connectors/new.html.erb +6 -8
  55. data/app/views/cms/content/no_page.html.erb +1 -1
  56. data/app/views/cms/content/show.html.erb +2 -7
  57. data/app/views/cms/dashboard/_page_drafts.html.erb +1 -1
  58. data/app/views/cms/dashboard/_tasks.html.erb +1 -1
  59. data/app/views/cms/dashboard/index.html.erb +1 -1
  60. data/app/views/cms/dynamic_views/_form.html.erb +2 -2
  61. data/app/views/cms/dynamic_views/index.html.erb +7 -10
  62. data/app/views/cms/email_messages/show.html.erb +2 -2
  63. data/app/views/cms/file_blocks/_form.html.erb +4 -4
  64. data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +2 -2
  65. data/app/views/cms/form_builder/_cms_file_field.html.erb +2 -2
  66. data/app/views/cms/form_builder/_cms_tag_list.html.erb +2 -2
  67. data/app/views/cms/form_builder/_cms_text_editor.html.erb +2 -2
  68. data/app/views/cms/groups/_form.html.erb +5 -5
  69. data/app/views/cms/groups/_permissions.html.erb +4 -4
  70. data/app/views/cms/groups/_sections.html.erb +1 -2
  71. data/app/views/cms/groups/index.html.erb +1 -1
  72. data/app/views/cms/html_blocks/render.html.erb +1 -1
  73. data/app/views/cms/image_blocks/_form.html.erb +4 -5
  74. data/app/views/cms/links/_form.html.erb +1 -1
  75. data/app/views/cms/links/edit.html.erb +2 -2
  76. data/app/views/cms/links/new.html.erb +2 -2
  77. data/app/views/cms/page_routes/_form.html.erb +2 -2
  78. data/app/views/cms/page_routes/index.html.erb +6 -9
  79. data/app/views/cms/page_routes/show.html.erb +5 -8
  80. data/app/views/cms/pages/_edit_connector.html.erb +1 -1
  81. data/app/views/cms/pages/_form.html.erb +3 -3
  82. data/app/views/cms/pages/edit.html.erb +2 -2
  83. data/app/views/cms/pages/new.html.erb +7 -7
  84. data/app/views/cms/pages/versions.html.erb +4 -4
  85. data/app/views/cms/redirects/_form.html.erb +2 -2
  86. data/app/views/cms/redirects/index.html.erb +8 -7
  87. data/app/views/cms/routes/index.html.erb +2 -2
  88. data/app/views/cms/section_nodes/_link.html.erb +3 -6
  89. data/app/views/cms/section_nodes/_node.html.erb +4 -13
  90. data/app/views/cms/section_nodes/_page.html.erb +7 -13
  91. data/app/views/cms/section_nodes/_section.html.erb +8 -24
  92. data/app/views/cms/section_nodes/_section_node.html.erb +10 -0
  93. data/app/views/cms/section_nodes/index.html.erb +18 -30
  94. data/app/views/cms/sections/_form.html.erb +4 -6
  95. data/app/views/cms/sections/edit.html.erb +2 -2
  96. data/app/views/cms/sections/index.html.erb +3 -3
  97. data/app/views/cms/sections/new.html.erb +3 -3
  98. data/app/views/cms/sessions/new.html.erb +3 -3
  99. data/app/views/cms/shared/_pagination.html.erb +1 -1
  100. data/app/views/cms/shared/error.html.erb +1 -1
  101. data/app/views/cms/tags/render.html.erb +2 -2
  102. data/app/views/cms/tasks/new.html.erb +4 -4
  103. data/app/views/cms/users/_form.html.erb +3 -3
  104. data/app/views/cms/users/_toolbar.html.erb +3 -3
  105. data/app/views/cms/users/change_password.html.erb +5 -5
  106. data/app/views/cms/users/edit.html.erb +2 -2
  107. data/app/views/cms/users/index.html.erb +4 -4
  108. data/app/views/cms/users/new.html.erb +2 -2
  109. data/app/views/cms/users/show.html.erb +16 -16
  110. data/app/views/layouts/_cms_toolbar.html.erb +5 -5
  111. data/app/views/layouts/_page_toolbar.html.erb +11 -11
  112. data/app/views/layouts/cms/_footer.erb +1 -1
  113. data/app/views/layouts/cms/_head.html.erb +2 -6
  114. data/app/views/layouts/cms/administration.html.erb +32 -32
  115. data/app/views/layouts/cms/content_library.html.erb +5 -5
  116. data/app/views/layouts/cms/toolbar.html.erb +1 -1
  117. data/app/views/portlets/email_page/render.html.erb +2 -2
  118. data/app/views/portlets/forgot_password/render.html.erb +1 -1
  119. data/app/views/portlets/login/render.html.erb +4 -2
  120. data/app/views/portlets/reset_password/render.html.erb +1 -1
  121. data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
  122. data/bin/bcms +0 -0
  123. data/bin/bcms-upgrade +232 -0
  124. data/bin/browsercms +2 -2
  125. data/browsercms.gemspec +16 -14
  126. data/db/migrate/20100705083859_browsercms_3_3_0.rb +56 -0
  127. data/db/seeds.rb +58 -0
  128. data/doc/guides/html/authentication.html +448 -192
  129. data/doc/guides/html/build_it_yourself.html +454 -175
  130. data/doc/guides/html/building_modules.html +451 -220
  131. data/doc/guides/html/building_templates.html +448 -498
  132. data/doc/guides/html/content_blocks.html +450 -470
  133. data/doc/guides/html/customizing_browsercms.html +453 -169
  134. data/doc/guides/html/deployment_guide.html +443 -82
  135. data/doc/guides/html/files/bcmsorg.js +28 -0
  136. data/doc/guides/html/files/clearfix.css +8 -0
  137. data/doc/guides/html/files/cufon.js +7 -0
  138. data/doc/guides/html/files/global.css +190 -0
  139. data/doc/guides/html/files/helvetica.js +91 -0
  140. data/doc/guides/html/files/jquery.js +11 -0
  141. data/doc/guides/html/getting_started.html +454 -213
  142. data/doc/guides/html/index.html +454 -174
  143. data/doc/guides/html/installing_modules.html +454 -186
  144. data/doc/guides/html/portlets.html +451 -232
  145. data/doc/guides/html/user_guide.html +452 -270
  146. data/doc/guides/html/writing_guides.html +454 -161
  147. data/lib/acts_as_list.rb +1 -1
  148. data/lib/browsercms.rb +10 -6
  149. data/lib/cms/acts.rb +7 -0
  150. data/lib/cms/authentication.rb +4 -0
  151. data/lib/cms/authentication/controller.rb +1 -1
  152. data/lib/cms/behaviors.rb +1 -1
  153. data/lib/cms/behaviors/archiving.rb +2 -2
  154. data/lib/cms/behaviors/attaching.rb +28 -43
  155. data/lib/cms/behaviors/categorizing.rb +1 -1
  156. data/lib/cms/behaviors/connecting.rb +27 -12
  157. data/lib/cms/behaviors/dynamic_attributes.rb +8 -5
  158. data/lib/cms/behaviors/hiding.rb +2 -2
  159. data/lib/cms/behaviors/publishing.rb +32 -22
  160. data/lib/cms/behaviors/rendering.rb +41 -18
  161. data/lib/cms/behaviors/searching.rb +1 -1
  162. data/lib/cms/behaviors/soft_deleting.rb +58 -29
  163. data/lib/cms/behaviors/taggable.rb +1 -1
  164. data/lib/cms/behaviors/userstamping.rb +5 -4
  165. data/lib/cms/behaviors/versioning.rb +192 -111
  166. data/lib/cms/content_rendering_support.rb +3 -3
  167. data/lib/cms/date_picker.rb +23 -0
  168. data/lib/cms/engine.rb +46 -0
  169. data/lib/cms/extensions.rb +1 -1
  170. data/lib/cms/extensions/active_record/errors.rb +2 -2
  171. data/lib/cms/extensions/hash.rb +4 -2
  172. data/lib/cms/extensions/string.rb +7 -2
  173. data/lib/cms/init.rb +32 -21
  174. data/lib/cms/module.rb +22 -0
  175. data/lib/cms/module_installation.rb +38 -0
  176. data/lib/cms/routes.rb +127 -115
  177. data/lib/cms/version.rb +2 -2
  178. data/lib/generators/browser_cms.rb +12 -0
  179. data/lib/generators/browser_cms/cms/USAGE +2 -0
  180. data/lib/generators/browser_cms/cms/cms_generator.rb +36 -0
  181. data/{rails_generators/browser_cms → lib/generators/browser_cms/cms}/templates/README +0 -0
  182. data/{rails_generators/browser_cms_demo_site → lib/generators/browser_cms/demo_site}/USAGE +0 -0
  183. data/lib/generators/browser_cms/demo_site/demo_site_generator.rb +138 -0
  184. data/lib/generators/browser_cms/demo_site/templates/demo_site.rake +11 -0
  185. data/{rails_generators/browser_cms_demo_site/templates/migration.rb → lib/generators/browser_cms/demo_site/templates/migration.erb} +2 -8
  186. data/lib/generators/cms/content_block/USAGE +22 -0
  187. data/lib/generators/cms/content_block/content_block_generator.rb +55 -0
  188. data/{rails_generators → lib/generators/cms}/content_block/templates/_form.html.erb +0 -0
  189. data/{rails_generators → lib/generators/cms}/content_block/templates/content_block.rb +0 -0
  190. data/{rails_generators → lib/generators/cms}/content_block/templates/controller.rb +0 -0
  191. data/{rails_generators → lib/generators/cms}/content_block/templates/functional_test.erb +0 -0
  192. data/{rails_generators/content_block/templates/migration.rb → lib/generators/cms/content_block/templates/migration.erb} +1 -1
  193. data/{rails_generators → lib/generators/cms}/content_block/templates/render.html.erb +0 -0
  194. data/{rails_generators → lib/generators/cms}/content_block/templates/unit_test.erb +0 -0
  195. data/lib/generators/cms/install/USAGE +8 -0
  196. data/lib/generators/cms/install/install_generator.rb +20 -0
  197. data/{rails_generators → lib/generators/cms}/portlet/USAGE +3 -16
  198. data/lib/generators/cms/portlet/portlet_generator.rb +38 -0
  199. data/{rails_generators → lib/generators/cms}/portlet/templates/_form.html.erb +0 -0
  200. data/{rails_generators → lib/generators/cms}/portlet/templates/portlet.rb +0 -0
  201. data/{rails_generators → lib/generators/cms}/portlet/templates/portlet_helper.rb +0 -0
  202. data/{rails_generators → lib/generators/cms}/portlet/templates/render.html.erb +0 -0
  203. data/{rails_generators → lib/generators/cms}/portlet/templates/unit_test.erb +0 -0
  204. data/{rails_generators → lib/generators/cms}/template/USAGE +1 -1
  205. data/lib/generators/cms/template/template_generator.rb +18 -0
  206. data/lib/generators/cms/template/templates/template.erb +2 -0
  207. data/lib/generators/cms/upgrade_module/README.txt +3 -0
  208. data/lib/generators/cms/upgrade_module/templates/20100705083859_browsercms_3_3_0.rb +56 -0
  209. data/lib/generators/cms/upgrade_module/templates/README +1 -0
  210. data/lib/generators/cms/upgrade_module/templates/USAGE.erb +10 -0
  211. data/lib/generators/cms/upgrade_module/templates/build_gem.rake +5 -0
  212. data/lib/generators/cms/upgrade_module/templates/engine.erb +7 -0
  213. data/lib/generators/cms/upgrade_module/templates/gemspec.erb +25 -0
  214. data/lib/generators/cms/upgrade_module/templates/gitignore.erb +11 -0
  215. data/lib/generators/cms/upgrade_module/templates/install.erb +9 -0
  216. data/lib/generators/cms/upgrade_module/templates/module_file.erb +3 -0
  217. data/lib/generators/cms/upgrade_module/templates/routes.erb +7 -0
  218. data/lib/generators/cms/upgrade_module/upgrade_module_generator.rb +61 -0
  219. data/lib/tasks/build_gem.rake +1 -0
  220. data/lib/tasks/cms.rake +34 -6
  221. data/lib/tasks/cucumber.rake +53 -0
  222. data/lib/tasks/db.rake +2 -2
  223. data/public/javascripts/cms/application.js +144 -135
  224. data/public/javascripts/cms/sitemap.js +383 -357
  225. data/public/javascripts/jquery-ui.js +782 -591
  226. data/public/javascripts/jquery.cookie.js +38 -43
  227. data/public/javascripts/jquery.js +13 -8
  228. data/public/javascripts/jquery.taglist.js +7 -0
  229. data/public/stylesheets/cms/date_picker.css +49 -40
  230. data/rails/init.rb +2 -3
  231. data/templates/blank.rb +13 -7
  232. data/templates/demo.rb +15 -7
  233. data/templates/module.rb +12 -75
  234. metadata +87 -407
  235. data/app/helpers/cms/content_block_helper.rb +0 -27
  236. data/app/views/layouts/cms/thickbox.html.erb +0 -24
  237. data/db/migrate/20120117144039_browsercms315.rb +0 -94
  238. data/db/migrate/20121114172307_load_seeds.rb +0 -70
  239. data/lib/cms/addressable.rb +0 -83
  240. data/lib/cms/error_pages.rb +0 -8
  241. data/public/images/cms/thickbox/loadingAnimation.gif +0 -0
  242. data/public/images/cms/thickbox/macFFBgHack.png +0 -0
  243. data/public/javascripts/jquery.contextMenu.js +0 -211
  244. data/public/javascripts/jquery.dimensions.js +0 -119
  245. data/public/javascripts/jquery.thickbox.js +0 -10
  246. data/public/stylesheets/cms/jquery.contextMenu.css +0 -61
  247. data/public/stylesheets/cms/thickbox.css +0 -163
  248. data/rails_generators/browser_cms/USAGE +0 -2
  249. data/rails_generators/browser_cms/browser_cms_generator.rb +0 -35
  250. data/rails_generators/browser_cms_demo_site/browser_cms_demo_site_generator.rb +0 -63
  251. data/rails_generators/content_block/USAGE +0 -32
  252. data/rails_generators/content_block/content_block_generator.rb +0 -69
  253. data/rails_generators/portlet/portlet_generator.rb +0 -35
  254. data/rails_generators/template/template_generator.rb +0 -18
  255. data/rails_generators/template/templates/template.erb +0 -3
  256. data/test/custom_assertions.rb +0 -74
  257. data/test/factories.rb +0 -111
  258. data/test/factories/sitemap_factories.rb +0 -28
  259. data/test/fixtures/connectors.yml +0 -97
  260. data/test/fixtures/content_type_groups.yml +0 -13
  261. data/test/fixtures/content_types.yml +0 -50
  262. data/test/fixtures/dynamic_view_versions.yml +0 -26
  263. data/test/fixtures/dynamic_views.yml +0 -26
  264. data/test/fixtures/group_permissions.yml +0 -16
  265. data/test/fixtures/group_sections.yml +0 -31
  266. data/test/fixtures/group_type_permissions.yml +0 -11
  267. data/test/fixtures/group_types.yml +0 -25
  268. data/test/fixtures/groups.yml +0 -25
  269. data/test/fixtures/html_block_versions.yml +0 -67
  270. data/test/fixtures/html_blocks.yml +0 -63
  271. data/test/fixtures/page_versions.yml +0 -265
  272. data/test/fixtures/pages.yml +0 -85
  273. data/test/fixtures/permissions.yml +0 -28
  274. data/test/fixtures/section_nodes.yml +0 -46
  275. data/test/fixtures/sections.yml +0 -19
  276. data/test/fixtures/sites.yml +0 -9
  277. data/test/fixtures/user_group_memberships.yml +0 -11
  278. data/test/fixtures/users.yml +0 -15
  279. data/test/functional/cms/cache_controller_test.rb +0 -14
  280. data/test/functional/cms/categories_controller_test.rb +0 -25
  281. data/test/functional/cms/connectors_controller_test.rb +0 -60
  282. data/test/functional/cms/content_block_controller_test.rb +0 -120
  283. data/test/functional/cms/content_controller_test.rb +0 -439
  284. data/test/functional/cms/content_types_controller_test.rb +0 -18
  285. data/test/functional/cms/dashboard_controller_test.rb +0 -16
  286. data/test/functional/cms/dynamic_views_controller_test.rb +0 -52
  287. data/test/functional/cms/file_blocks_controller_test.rb +0 -52
  288. data/test/functional/cms/groups_controller_test.rb +0 -50
  289. data/test/functional/cms/home_controller_test.rb +0 -156
  290. data/test/functional/cms/html_blocks_controller_test.rb +0 -164
  291. data/test/functional/cms/image_blocks_controller_test.rb +0 -82
  292. data/test/functional/cms/links_controller_test.rb +0 -148
  293. data/test/functional/cms/pages_controller_test.rb +0 -227
  294. data/test/functional/cms/portlets_controller_test.rb +0 -67
  295. data/test/functional/cms/section_nodes_controller_test.rb +0 -112
  296. data/test/functional/cms/sections_controller_test.rb +0 -227
  297. data/test/functional/cms/sessions_controller_test.rb +0 -76
  298. data/test/functional/cms/toolbar_controller_test.rb +0 -64
  299. data/test/functional/cms/users_controller_test.rb +0 -231
  300. data/test/functional/tests/pretend_controller_test.rb +0 -57
  301. data/test/integration/cms/ckeditor_test.rb +0 -30
  302. data/test/integration/cms/password_management_test.rb +0 -56
  303. data/test/integration/login_test.rb +0 -14
  304. data/test/integration/sitemap_performance_test.rb +0 -26
  305. data/test/selenium-core/Blank.html +0 -7
  306. data/test/selenium-core/InjectedRemoteRunner.html +0 -8
  307. data/test/selenium-core/RemoteRunner.html +0 -110
  308. data/test/selenium-core/SeleniumLog.html +0 -109
  309. data/test/selenium-core/TestPrompt.html +0 -145
  310. data/test/selenium-core/TestRunner-splash.html +0 -55
  311. data/test/selenium-core/TestRunner.hta +0 -176
  312. data/test/selenium-core/TestRunner.html +0 -176
  313. data/test/selenium-core/domviewer/butmin.gif +0 -0
  314. data/test/selenium-core/domviewer/butplus.gif +0 -0
  315. data/test/selenium-core/domviewer/domviewer.css +0 -298
  316. data/test/selenium-core/domviewer/domviewer.html +0 -16
  317. data/test/selenium-core/domviewer/selenium-domviewer.js +0 -205
  318. data/test/selenium-core/icons/all.png +0 -0
  319. data/test/selenium-core/icons/continue.png +0 -0
  320. data/test/selenium-core/icons/continue_disabled.png +0 -0
  321. data/test/selenium-core/icons/pause.png +0 -0
  322. data/test/selenium-core/icons/pause_disabled.png +0 -0
  323. data/test/selenium-core/icons/selected.png +0 -0
  324. data/test/selenium-core/icons/step.png +0 -0
  325. data/test/selenium-core/icons/step_disabled.png +0 -0
  326. data/test/selenium-core/iedoc-core.xml +0 -1515
  327. data/test/selenium-core/iedoc.xml +0 -1469
  328. data/test/selenium-core/lib/cssQuery/cssQuery-p.js +0 -6
  329. data/test/selenium-core/lib/cssQuery/src/cssQuery-level2.js +0 -142
  330. data/test/selenium-core/lib/cssQuery/src/cssQuery-level3.js +0 -150
  331. data/test/selenium-core/lib/cssQuery/src/cssQuery-standard.js +0 -53
  332. data/test/selenium-core/lib/cssQuery/src/cssQuery.js +0 -356
  333. data/test/selenium-core/lib/prototype.js +0 -2006
  334. data/test/selenium-core/lib/scriptaculous/builder.js +0 -101
  335. data/test/selenium-core/lib/scriptaculous/controls.js +0 -815
  336. data/test/selenium-core/lib/scriptaculous/dragdrop.js +0 -915
  337. data/test/selenium-core/lib/scriptaculous/effects.js +0 -958
  338. data/test/selenium-core/lib/scriptaculous/scriptaculous.js +0 -47
  339. data/test/selenium-core/lib/scriptaculous/slider.js +0 -283
  340. data/test/selenium-core/lib/scriptaculous/unittest.js +0 -383
  341. data/test/selenium-core/scripts/find_matching_child.js +0 -69
  342. data/test/selenium-core/scripts/htmlutils.js +0 -894
  343. data/test/selenium-core/scripts/injection.html +0 -72
  344. data/test/selenium-core/scripts/js2html.js +0 -70
  345. data/test/selenium-core/scripts/narcissus-defs.js +0 -175
  346. data/test/selenium-core/scripts/narcissus-exec.js +0 -1054
  347. data/test/selenium-core/scripts/narcissus-parse.js +0 -1003
  348. data/test/selenium-core/scripts/se2html.js +0 -63
  349. data/test/selenium-core/scripts/selenium-api.js +0 -2409
  350. data/test/selenium-core/scripts/selenium-browserbot.js +0 -2203
  351. data/test/selenium-core/scripts/selenium-browserdetect.js +0 -150
  352. data/test/selenium-core/scripts/selenium-commandhandlers.js +0 -377
  353. data/test/selenium-core/scripts/selenium-executionloop.js +0 -175
  354. data/test/selenium-core/scripts/selenium-logging.js +0 -147
  355. data/test/selenium-core/scripts/selenium-remoterunner.js +0 -571
  356. data/test/selenium-core/scripts/selenium-testrunner.js +0 -1333
  357. data/test/selenium-core/scripts/selenium-version.js +0 -5
  358. data/test/selenium-core/scripts/user-extensions.js +0 -3
  359. data/test/selenium-core/scripts/user-extensions.js.sample +0 -75
  360. data/test/selenium-core/scripts/xmlextras.js +0 -153
  361. data/test/selenium-core/selenium-logo.png +0 -0
  362. data/test/selenium-core/selenium-test.css +0 -43
  363. data/test/selenium-core/selenium.css +0 -299
  364. data/test/selenium-core/xpath/dom.js +0 -428
  365. data/test/selenium-core/xpath/misc.js +0 -252
  366. data/test/selenium-core/xpath/xpath.js +0 -2223
  367. data/test/selenium/_login_as_cmsadmin.rsel +0 -4
  368. data/test/selenium/dashboard.rsel +0 -5
  369. data/test/selenium/html_blocks.rsel +0 -4
  370. data/test/selenium/login/failed_login.rsel +0 -8
  371. data/test/selenium/login/successful_login.rsel +0 -9
  372. data/test/selenium/page_templates.rsel +0 -12
  373. data/test/selenium/pages/edit_properties.rsel +0 -5
  374. data/test/selenium/site/view_home_page.rsel +0 -4
  375. data/test/selenium/sitemap/move_page.rsel +0 -9
  376. data/test/selenium/sitemap/open_section.rsel +0 -6
  377. data/test/selenium/sitemap/select_page.rsel +0 -12
  378. data/test/selenium/sitemap/select_section.rsel +0 -17
  379. data/test/test_helper.rb +0 -193
  380. data/test/test_logging.rb +0 -67
  381. data/test/unit/behaviors/attaching_test.rb +0 -357
  382. data/test/unit/behaviors/connectable_test.rb +0 -29
  383. data/test/unit/behaviors/dynamic_attributes_test.rb +0 -38
  384. data/test/unit/behaviors/publishable_test.rb +0 -84
  385. data/test/unit/behaviors/searching_test.rb +0 -102
  386. data/test/unit/behaviors/taggable_test.rb +0 -109
  387. data/test/unit/behaviors/versioning_test.rb +0 -36
  388. data/test/unit/extensions/active_record/base_test.rb +0 -10
  389. data/test/unit/extensions/hash_test.rb +0 -17
  390. data/test/unit/extensions/integer_test.rb +0 -10
  391. data/test/unit/helpers/application_helper_test.rb +0 -77
  392. data/test/unit/helpers/form_builder_test.rb +0 -36
  393. data/test/unit/helpers/menu_helper_test.rb +0 -242
  394. data/test/unit/helpers/page_helper_test.rb +0 -67
  395. data/test/unit/helpers/path_helper_test.rb +0 -57
  396. data/test/unit/lib/acts_as_content_page_test.rb +0 -72
  397. data/test/unit/lib/cms/authentication/controller_test.rb +0 -20
  398. data/test/unit/lib/cms/sitemap_test.rb +0 -206
  399. data/test/unit/lib/cms_domain_support_test.rb +0 -43
  400. data/test/unit/lib/command_line_test.rb +0 -70
  401. data/test/unit/lib/content_block_test.rb +0 -203
  402. data/test/unit/lib/content_rendering_support_test.rb +0 -40
  403. data/test/unit/lib/generators_test.rb +0 -40
  404. data/test/unit/lib/routes_test.rb +0 -57
  405. data/test/unit/models/attachment_test.rb +0 -116
  406. data/test/unit/models/category_test.rb +0 -40
  407. data/test/unit/models/category_type_test.rb +0 -8
  408. data/test/unit/models/connector_test.rb +0 -152
  409. data/test/unit/models/content_type_test.rb +0 -56
  410. data/test/unit/models/email_page_portlet_test.rb +0 -14
  411. data/test/unit/models/file_block_test.rb +0 -230
  412. data/test/unit/models/group_test.rb +0 -13
  413. data/test/unit/models/html_block_test.rb +0 -102
  414. data/test/unit/models/link_test.rb +0 -52
  415. data/test/unit/models/page_partial_test.rb +0 -29
  416. data/test/unit/models/page_route_test.rb +0 -29
  417. data/test/unit/models/page_template_test.rb +0 -40
  418. data/test/unit/models/page_test.rb +0 -792
  419. data/test/unit/models/permission_test.rb +0 -10
  420. data/test/unit/models/portlet_test.rb +0 -69
  421. data/test/unit/models/sections_test.rb +0 -264
  422. data/test/unit/models/site_test.rb +0 -50
  423. data/test/unit/models/task_test.rb +0 -141
  424. data/test/unit/models/user_test.rb +0 -352
  425. data/test/unit/schema_statements_test.rb +0 -41
@@ -5,6 +5,6 @@ class Permission < ActiveRecord::Base
5
5
  validates_presence_of :name
6
6
  validates_uniqueness_of :name
7
7
 
8
- named_scope :named, lambda{|name| {:conditions => {:name => name}}}
8
+ scope :named, lambda{|name| {:conditions => {:name => name}}}
9
9
 
10
10
  end
@@ -18,13 +18,18 @@ class Portlet < ActiveRecord::Base
18
18
  ensure
19
19
  subclass.class_eval do
20
20
 
21
- has_dynamic_attributes
21
+ has_dynamic_attributes(:class_name=>'PortletAttribute', :foreign_key=>'portlet_id')
22
22
 
23
23
  acts_as_content_block(
24
24
  :versioned => false,
25
25
  :publishable => false,
26
26
  :renderable => {:instance_variable_name_for_view => "@portlet"})
27
-
27
+
28
+ # Used to skip the 'after_save' callbacks that connect blocks to pages.
29
+ # Portlets aren't verisonable but are connectable, so this will prevent the saving of portlets.
30
+ attr_accessor :skip_callbacks
31
+
32
+
28
33
  def self.template_path
29
34
  default_template_path
30
35
  end
@@ -44,7 +49,7 @@ class Portlet < ActiveRecord::Base
44
49
  end
45
50
 
46
51
  def self.types
47
- @types ||= ActiveSupport::Dependencies.load_paths.map do |d|
52
+ @types ||= ActiveSupport::Dependencies.autoload_paths.map do |d|
48
53
  if d =~ /app\/portlets/
49
54
  Dir["#{d}/*_portlet.rb"].map do |p|
50
55
  File.basename(p, ".rb").classify
@@ -122,7 +127,12 @@ class Portlet < ActiveRecord::Base
122
127
  {:label => "Type", :method => :type_name, :order => "type" },
123
128
  {:label => "Updated On", :method => :updated_on_string, :order => "updated_at"} ]
124
129
  end
125
-
130
+
131
+ # Duck typing (like a ContentBlock) for determining if this block should have a usages link or not.
132
+ def self.connectable?
133
+ true
134
+ end
135
+
126
136
  #----- Portlet Action Related Methods ----------------------------------------
127
137
  def instance_name
128
138
  "#{self.class.name.demodulize.underscore}_#{id}"
@@ -3,93 +3,51 @@ class Section < ActiveRecord::Base
3
3
  flush_cache_on_change
4
4
 
5
5
  #The node that links this section to its parent
6
- has_one :section_node, :class_name => "SectionNode", :as => :node, :inverse_of => :node
6
+ has_one :node, :class_name => "SectionNode", :as => :node, :dependent => :destroy
7
7
 
8
- include Addressable
9
- include Addressable::NodeAccessors
8
+ #The nodes that link this section to its children
9
+ has_many :child_nodes, :class_name => "SectionNode"
10
+ has_many :child_sections, :class_name => "SectionNode", :conditions => ["node_type = ?", "Section"], :order => 'section_nodes.position'
10
11
 
11
- # Cannot use dependent => :destroy to do this. Ancestry's callbacks trigger before the before_destroy callback.
12
- # So sections would always get deleted since deletable? would return true
13
- after_destroy :destroy_node
14
- before_destroy :deletable?
12
+ has_many :pages, :through => :child_nodes, :source => :node, :source_type => 'Page', :order => 'section_nodes.position'
13
+ has_many :sections, :through => :child_nodes, :source => :node, :source_type => 'Section', :order => 'section_nodes.position'
15
14
 
16
15
  has_many :group_sections
17
16
  has_many :groups, :through => :group_sections
18
17
 
19
- named_scope :root, :conditions => ['root = ?', true]
20
- named_scope :system, :conditions => {:name => 'system'}
18
+ scope :root, :conditions => ['root = ?', true]
19
+ scope :system_section, :conditions => {:name => 'system'}
21
20
 
22
- named_scope :hidden, :conditions => {:hidden => true}
23
- named_scope :not_hidden, :conditions => {:hidden => false}
21
+ scope :hidden, :conditions => {:hidden => true}
22
+ scope :not_hidden, :conditions => {:hidden => false}
24
23
 
25
- named_scope :named, lambda { |name| {:conditions => ['sections.name = ?', name]} }
26
- named_scope :with_path, lambda { |path| {:conditions => ['sections.path = ?', path]} }
24
+ scope :named, lambda{|name| {:conditions => ['sections.name = ?', name]}}
25
+ scope :with_path, lambda{|path| {:conditions => ['sections.path = ?', path]}}
27
26
 
28
27
  validates_presence_of :name, :path
28
+ #validates_presence_of :parent_id, :if => Proc.new {root.count > 0}, :message => "section is required"
29
29
 
30
30
  # Disabling '/' in section name for interoperability with FCKEditor file browser
31
31
  validates_format_of :name, :with => /\A[^\/]*\Z/, :message => "cannot contain '/'"
32
32
 
33
33
  validate :path_not_reserved
34
34
 
35
- attr_accessor :full_path
36
-
37
- delegate :ancestry_path, :to => :node
38
-
39
- def ancestry
40
- self.node.ancestry
41
- end
42
-
43
- def before_validation
44
- unless node
45
- self.node = build_section_node
46
- end
47
- end
48
-
49
- # Returns a list of all children which are sections.
50
- # @return [Array<Section>]
51
- def sections
52
- child_nodes.of_type("Section").fetch_nodes.in_order.collect do |section_node|
53
- section_node.node
54
- end
55
- end
56
-
57
- alias :child_sections :sections
58
-
59
- # Since #sections isn't an association anymore, callers can use this rather than #sections.build
60
- def build_section
61
- Section.new(:parent=>self)
62
- end
63
-
64
- # Used by the sitemap to find children to iterate over.
65
- def child_nodes
66
- self.node.children
67
- end
68
-
69
- def pages
70
- child_pages = self.node.children.collect do |section_node|
71
- section_node.node if section_node.page?
72
- end
73
- child_pages.compact
74
- end
35
+ before_destroy :deletable?
75
36
 
76
- def self.sitemap
77
- SectionNode.of_type(["Page", "Link", "Section"]).fetch_nodes.arrange(:order=>:position)
78
- end
37
+ attr_accessor :full_path
79
38
 
80
39
  def visible_child_nodes(options={})
81
- children = child_nodes.of_type(["Section", "Page", "Link"]).fetch_nodes.in_order.all
82
- visible_children = children.select { |sn| sn.visible? }
40
+ children = child_nodes.of_type(["Section", "Page", "Link"]).all(:order => 'section_nodes.position')
41
+ visible_children = children.select{|sn| sn.visible?}
83
42
  options[:limit] ? visible_children[0...options[:limit]] : visible_children
84
43
  end
85
44
 
86
-
87
- # Returns a complete list of all sections that are desecendants of this sections, in order, as a single flat list.
88
- # Used by Section selectors where users have to pick a single section from a complete list of all sections.
89
- def master_section_list
90
- sections.map do |section|
91
- section.full_path = root? ? section.name : "#{name} / #{section.name}"
92
- [section] << section.master_section_list
45
+ def all_children_with_name
46
+ child_sections.map do |s|
47
+ if s.node
48
+ s.node.full_path = root? ? s.node.name : "#{name} / #{s.node.name}"
49
+ [s.node] << s.node.all_children_with_name
50
+ end
93
51
  end.flatten.compact
94
52
  end
95
53
 
@@ -97,10 +55,27 @@ class Section < ActiveRecord::Base
97
55
  parent ? parent.id : nil
98
56
  end
99
57
 
58
+ def parent
59
+ node ? node.section : nil
60
+ end
61
+
100
62
  def parent_id=(sec_id)
101
63
  self.parent = Section.find(sec_id)
102
64
  end
103
65
 
66
+ def parent=(sec)
67
+ if node
68
+ node.move_to_end(sec)
69
+ else
70
+ build_node(:node => self, :section => sec)
71
+ end
72
+ end
73
+
74
+ def ancestors(options={})
75
+ ancs = node ? node.ancestors : []
76
+ options[:include_self] ? ancs + [self] : ancs
77
+ end
78
+
104
79
  def with_ancestors(options = {})
105
80
  options.merge! :include_self => true
106
81
  self.ancestors(options)
@@ -119,46 +94,33 @@ class Section < ActiveRecord::Base
119
94
  end
120
95
 
121
96
  def empty?
122
- child_nodes.empty?
97
+ child_nodes.reject{|n| n.orphaned?}.empty?
123
98
  end
124
99
 
125
- # Callback to determine if this section can be deleted.
126
100
  def deletable?
127
101
  !root? && empty?
128
102
  end
129
103
 
130
- # Callback to clean up related nodes
131
- def destroy_node
132
- node.destroy
133
- end
134
-
135
104
  def editable_by_group?(group)
136
105
  group.editable_by_section(self)
137
106
  end
138
107
 
139
108
  def status
140
- @status ||= public? ? :unlocked : :locked
109
+ public? ? :unlocked : :locked
141
110
  end
142
111
 
143
- # Used by the file browser to look up a section by the combined names as a path.
144
- # i.e. /A/B/
145
- # @return [Section] nil if not found
146
112
  def self.find_by_name_path(name_path)
147
- current_section = Section.root.first
148
- path_names = name_path.split("/")[1..-1] || []
149
-
150
- # This implementation is very slow as it has to loop over the entire tree in memory to match each name element.
151
- path_names.each do |name|
152
- current_section.sections.each do |s|
153
- current_section = s if s.name == name
154
- end
113
+ section = Section.root.first
114
+ children = name_path.split("/")[1..-1] || []
115
+ children.each do |name|
116
+ section = section.sections.first(:conditions => {:name => name})
155
117
  end
156
- current_section
118
+ section
157
119
  end
158
120
 
159
121
  #The first page that is a decendent of this section
160
122
  def first_page_or_link
161
- section_node = child_nodes.of_type(['Link', 'Page']).fetch_nodes.in_order.first
123
+ section_node = child_nodes.of_type(['Link', 'Page']).first(:order => "section_nodes.position")
162
124
  return section_node.node if section_node
163
125
  sections.each do |s|
164
126
  node = s.first_page_or_link
@@ -1,31 +1,10 @@
1
1
  class SectionNode < ActiveRecord::Base
2
- has_ancestry
2
+ belongs_to :section
3
+ belongs_to :node, :polymorphic => :true
3
4
 
4
- # This is the parent section for this node
5
- # For backwards compatiblity
6
- def parent_section
7
- self.parent ? self.parent.node : nil
8
- end
9
-
10
- alias :section :parent_section
11
-
12
- # For backwards compatiblity
13
- def section=(new_section)
14
- self.parent = new_section.node
15
- end
5
+ acts_as_list :scope => :section
16
6
 
17
- # The item this node links to
18
- belongs_to :node, :polymorphic => :true, :inverse_of => :section_node
19
-
20
- acts_as_list
21
- # For acts_as_list. Specifies that position should be unique within a section.
22
- def scope_condition
23
- ancestry ? "ancestry = '#{ancestry}'" : 'ancestry IS NULL'
24
- end
25
-
26
- named_scope :of_type, lambda{|types| {:conditions => ["section_nodes.node_type IN (?)", types]}}
27
- named_scope :in_order, :order => "position asc"
28
- named_scope :fetch_nodes, :include => :node
7
+ scope :of_type, lambda{|types| {:conditions => ["section_nodes.node_type IN (?)", types]}}
29
8
 
30
9
  def visible?
31
10
  return false unless node
@@ -48,29 +27,27 @@ class SectionNode < ActiveRecord::Base
48
27
  def page?
49
28
  node_type == 'Page'
50
29
  end
51
-
52
- # @param [Section] section
53
- # @param [Integer] position
54
- def move_to(section, position)
30
+
31
+ def move_to(sec, pos)
55
32
  #logger.info "Moving Section Node ##{id} to Section ##{sec.id} Position #{pos}"
56
33
  transaction do
57
- if self.parent != section.node
34
+ if section != sec
58
35
  remove_from_list
59
- self.parent = section.node
36
+ self.section = sec
60
37
  save
61
38
  end
62
39
 
63
- if position < 0
64
- position = 0
40
+ if pos < 0
41
+ pos = 0
65
42
  else
66
43
  #This helps prevent the position from getting out of whack
67
44
  #If you pass in a really high number for position,
68
45
  #this just corrects it to the right number
69
- node_count = SectionNode.count(:conditions => {:ancestry => ancestry})
70
- position = node_count if position > node_count
46
+ node_count = SectionNode.count(:conditions => {:section_id => section_id})
47
+ pos = node_count if pos > node_count
71
48
  end
72
49
 
73
- insert_at_position(position)
50
+ insert_at_position(pos)
74
51
  end
75
52
  end
76
53
 
@@ -100,9 +77,17 @@ class SectionNode < ActiveRecord::Base
100
77
  #1.0/0 == Infinity
101
78
  move_to(sec, 1.0/0)
102
79
  end
103
-
104
-
105
- def ancestry_path
106
- path_ids.join "/"
80
+
81
+ def ancestors()
82
+ ancestors = []
83
+ fn = lambda do |sn|
84
+ ancestors << sn.section
85
+ if sn.section && !sn.section.root?
86
+ fn.call(sn.section.node)
87
+ end
88
+ end
89
+ fn.call(self)
90
+ ancestors.reverse
107
91
  end
92
+
108
93
  end
data/app/models/site.rb CHANGED
@@ -7,7 +7,7 @@ class Site < ActiveRecord::Base
7
7
  before_save :unset_default
8
8
  after_save :set_default
9
9
 
10
- named_scope :default, :conditions => {:the_default => true}
10
+ scope :default, :conditions => {:the_default => true}
11
11
 
12
12
  def self.find_by_domain(domain)
13
13
  d = domain.clone
data/app/models/tag.rb CHANGED
@@ -6,7 +6,7 @@ class Tag < ActiveRecord::Base
6
6
 
7
7
  attr_accessor :size
8
8
  is_searchable
9
- named_scope :named, lambda{|tag| {:conditions => ["tags.name = ? ", tag]} }
9
+ scope :named, lambda{|tag| {:conditions => ["tags.name = ? ", tag]} }
10
10
 
11
11
  # Returns an array of tags with a count attribute
12
12
  def self.counts(options={})
data/app/models/task.rb CHANGED
@@ -7,11 +7,11 @@ class Task < ActiveRecord::Base
7
7
  after_create :mark_other_tasks_for_the_same_page_as_complete
8
8
  after_create :send_email
9
9
 
10
- named_scope :complete, :conditions => ["completed_at is not null"]
11
- named_scope :incomplete, :conditions => ["completed_at is null"]
10
+ scope :complete, :conditions => ["completed_at is not null"]
11
+ scope :incomplete, :conditions => ["completed_at is null"]
12
12
 
13
- named_scope :for_page, lambda{|p| {:conditions => ["page_id = ?", p]}}
14
- named_scope :other_than, lambda{|t| {:conditions => ["id != ?", t.id]}}
13
+ scope :for_page, lambda{|p| {:conditions => ["page_id = ?", p]}}
14
+ scope :other_than, lambda{|t| {:conditions => ["id != ?", t.id]}}
15
15
 
16
16
  validates_presence_of :assigned_by_id, :message => "is required"
17
17
  validates_presence_of :assigned_to_id, :message => "is required"
@@ -42,10 +42,11 @@ class Task < ActiveRecord::Base
42
42
  elsif assigned_to.email.blank?
43
43
  logger.warn "Can't send email for task because assigned to user #{assigned_to.login}:#{assigned_to.id} has no email address"
44
44
  else
45
- if SITE_DOMAIN =~ /^www/
46
- host = SITE_DOMAIN.sub(/^www\./, "#{cms_domain_prefix}.")
45
+ domain = SITE_DOMAIN
46
+ if domain =~ /^www/
47
+ host = domain.sub(/^www\./, "#{cms_domain_prefix}.")
47
48
  else
48
- host = "#{cms_domain_prefix}.#{SITE_DOMAIN}"
49
+ host = "#{cms_domain_prefix}.#{domain}"
49
50
  end
50
51
  email = EmailMessage.create(
51
52
  :sender => assigned_by.email,
data/app/models/user.rb CHANGED
@@ -18,8 +18,8 @@ class User < ActiveRecord::Base
18
18
  has_many :groups, :through => :user_group_memberships
19
19
  has_many :tasks, :foreign_key => "assigned_to_id"
20
20
 
21
- named_scope :active, :conditions => ["expires_at IS NULL OR expires_at > ?", Time.now.utc]
22
- named_scope :able_to_edit_or_publish_content,
21
+ scope :active, :conditions => ["expires_at IS NULL OR expires_at > ?", Time.now.utc]
22
+ scope :able_to_edit_or_publish_content,
23
23
  :include => {:groups => :permissions},
24
24
  :conditions => ["permissions.name = ? OR permissions.name = ?", "edit_content", "publish_content"]
25
25
 
@@ -106,11 +106,6 @@ class User < ActiveRecord::Base
106
106
  @modifiable_sections ||= Section.find(:all, :include => {:groups => [:group_type, :users]}, :conditions => ["users.id = ? and group_types.cms_access = ?", id, true])
107
107
  end
108
108
 
109
- #def unmodifiable_sections
110
- #
111
- # #@modifiable_sections ||= Section.find(:all, :include => {:groups => [:group_type, :users]}, :conditions => ["users.id = ? and group_types.cms_access = ?", id, true])
112
- #end
113
-
114
109
  # Expects a list of names of Permissions
115
110
  # true if the user has any of the permissions
116
111
  def able_to?(*required_permissions)
@@ -4,11 +4,15 @@ class ForgotPasswordPortlet < Portlet
4
4
  enable_template_editor true
5
5
 
6
6
  def render
7
+ logger.warn "Handling Class #{request.class}"
8
+ logger.warn "Handling FORGOT as #{request.method}"
9
+ logger.warn "Am I a POST? #{request.post?}"
7
10
  flash[:forgot_password] = {}
8
11
 
9
- return unless request.method == :post
12
+ return unless request.post?
10
13
  user = User.find_by_email(params[:email])
11
-
14
+
15
+ logger.warn "Send email "
12
16
  unless user
13
17
  flash[:forgot_password][:error] = "We were unable to verify your account. Please make sure your email address is accurate."
14
18
  return
@@ -15,7 +15,7 @@ class ResetPasswordPortlet < Portlet
15
15
  return
16
16
  end
17
17
 
18
- if request.method == :post
18
+ if request.post?
19
19
  @user.password = params[:password]
20
20
  @user.password_confirmation = params[:password_confirmation]
21
21