browsercms 3.5.7 → 4.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (523) hide show
  1. checksums.yaml +7 -0
  2. data/COPYRIGHT.txt +2 -1
  3. data/README.markdown +3 -3
  4. data/app/assets/fonts/icomoon.dev.svg +61 -0
  5. data/app/assets/fonts/icomoon.eot +0 -0
  6. data/app/assets/fonts/icomoon.svg +61 -0
  7. data/app/assets/fonts/icomoon.ttf +0 -0
  8. data/app/assets/fonts/icomoon.woff +0 -0
  9. data/app/assets/images/ckeditor/plugins/delete_content/icons/deletecontent.png +0 -0
  10. data/app/assets/images/ckeditor/plugins/edit_content/icons/editcontent.png +0 -0
  11. data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentdown.png +0 -0
  12. data/app/assets/images/ckeditor/plugins/move_content/icons/movecontentup.png +0 -0
  13. data/app/assets/images/cms/arrow-down.png +0 -0
  14. data/app/assets/images/cms/arrow-up.png +0 -0
  15. data/app/assets/images/cms/cogs.png +0 -0
  16. data/app/assets/images/cms/dashboard/home.png +0 -0
  17. data/app/assets/images/cms/home.png +0 -0
  18. data/app/assets/images/cms/logo.png +0 -0
  19. data/app/assets/images/cms/pencil.png +0 -0
  20. data/app/assets/images/cms/plus.png +0 -0
  21. data/app/assets/images/cms/user.png +0 -0
  22. data/app/assets/javascripts/bcms/ckeditor_inline.js +23 -0
  23. data/app/assets/javascripts/bcms/ckeditor_standard_config.js +1 -1
  24. data/app/assets/javascripts/ckeditor/plugins/delete_content/plugin.js +36 -0
  25. data/app/assets/javascripts/ckeditor/plugins/edit_content/plugin.js +24 -0
  26. data/app/assets/javascripts/ckeditor/plugins/move_content/plugin.js +25 -0
  27. data/app/assets/javascripts/cms/ajax.js +60 -0
  28. data/app/assets/javascripts/cms/application.js +6 -1
  29. data/app/assets/javascripts/cms/attachment_manager.js.erb +3 -10
  30. data/app/assets/javascripts/cms/content_library.js +31 -12
  31. data/app/assets/javascripts/cms/core_library.js.erb +68 -36
  32. data/app/assets/javascripts/cms/form_builder.js +250 -0
  33. data/app/assets/javascripts/cms/namespace.js +2 -0
  34. data/app/assets/javascripts/cms/new_content_button.js +27 -0
  35. data/app/assets/javascripts/cms/page_editor.js +188 -0
  36. data/app/assets/javascripts/cms/page_toolbar.js +13 -0
  37. data/app/assets/javascripts/cms/site.js +2 -0
  38. data/app/assets/javascripts/cms/sitemap.js +219 -0
  39. data/app/assets/javascripts/cms/toolbar.js +17 -1
  40. data/app/assets/javascripts/cms/user.js +40 -0
  41. data/app/assets/javascripts/jquery.exists.js +5 -0
  42. data/app/assets/javascripts/jquery.taglist.js +37 -23
  43. data/app/assets/stylesheets/cms/_assets.css.scss +55 -0
  44. data/app/assets/stylesheets/cms/_base.css.scss +42 -0
  45. data/app/assets/stylesheets/cms/_cms-buttons.css.scss +73 -0
  46. data/app/assets/stylesheets/cms/_cms-forms.css.scss +70 -0
  47. data/app/assets/stylesheets/cms/_colors.css.scss +20 -0
  48. data/app/assets/stylesheets/cms/_dashboard.css.scss +25 -0
  49. data/app/assets/stylesheets/cms/_glyph.css.scss +60 -0
  50. data/app/assets/stylesheets/cms/_main-area.css.scss +62 -0
  51. data/app/assets/stylesheets/cms/_nav.css.scss +197 -0
  52. data/app/assets/stylesheets/cms/_sidebar.css.scss +64 -0
  53. data/app/assets/stylesheets/cms/_sitemap.css.scss +196 -0
  54. data/app/assets/stylesheets/cms/_submenu.css.scss +48 -0
  55. data/app/assets/stylesheets/cms/application.css.scss +49 -0
  56. data/app/assets/stylesheets/cms/core.css.scss +96 -0
  57. data/app/assets/stylesheets/cms/default-forms.css.scss +3 -0
  58. data/app/assets/stylesheets/cms/includes/_animation.css.scss +2 -0
  59. data/app/assets/stylesheets/cms/includes/_rem.css.scss +120 -0
  60. data/app/assets/stylesheets/cms/includes/animation/_animate.css.scss +31 -0
  61. data/app/assets/stylesheets/cms/includes/animation/_core.css.scss +127 -0
  62. data/app/assets/stylesheets/cms/includes/animation/_shared.css.scss +22 -0
  63. data/app/assets/stylesheets/cms/includes/animation/animate/_attention-seekers.css.scss +152 -0
  64. data/app/assets/stylesheets/cms/includes/animation/animate/_bouncing.css.scss +3 -0
  65. data/app/assets/stylesheets/cms/includes/animation/animate/_classes.css.scss +21 -0
  66. data/app/assets/stylesheets/cms/includes/animation/animate/_fading.css.scss +3 -0
  67. data/app/assets/stylesheets/cms/includes/animation/animate/_flippers.css.scss +87 -0
  68. data/app/assets/stylesheets/cms/includes/animation/animate/_lightspeed.css.scss +24 -0
  69. data/app/assets/stylesheets/cms/includes/animation/animate/_rotating.css.scss +3 -0
  70. data/app/assets/stylesheets/cms/includes/animation/animate/_specials.css.scss +42 -0
  71. data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-entrances.css.scss +68 -0
  72. data/app/assets/stylesheets/cms/includes/animation/animate/bouncing/_bouncing-exits.css.scss +60 -0
  73. data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-entrances.css.scss +86 -0
  74. data/app/assets/stylesheets/cms/includes/animation/animate/fading/_fading-exits.css.scss +86 -0
  75. data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-entrances.css.scss +58 -0
  76. data/app/assets/stylesheets/cms/includes/animation/animate/rotating/_rotating-exits.css.scss +58 -0
  77. data/app/assets/stylesheets/cms/page_content_editing.css.scss +4 -0
  78. data/app/assets/stylesheets/cms/page_editor.css.scss +4 -0
  79. data/app/assets/stylesheets/cms/style.css.scss +138 -0
  80. data/app/assets/stylesheets/cms/styles/_alerts.css.scss +150 -0
  81. data/app/assets/stylesheets/cms/styles/_base-grid.css.scss +299 -0
  82. data/app/assets/stylesheets/cms/styles/_buttons.css.scss +247 -0
  83. data/app/assets/stylesheets/cms/styles/_dropdown.css.scss +155 -0
  84. data/app/assets/stylesheets/cms/styles/_forms.css.scss +728 -0
  85. data/app/assets/stylesheets/cms/styles/_glyph.css.scss +86 -0
  86. data/app/assets/stylesheets/cms/styles/_images.css.scss +75 -0
  87. data/app/assets/stylesheets/cms/styles/_lists.css.scss +115 -0
  88. data/app/assets/stylesheets/cms/styles/_modal.css.scss +174 -0
  89. data/app/assets/stylesheets/cms/styles/_progress.css.scss +43 -0
  90. data/app/assets/stylesheets/cms/styles/_tables.css.scss +141 -0
  91. data/app/assets/stylesheets/cms/styles/_text.css.scss +134 -0
  92. data/app/controllers/cms/application_controller.rb +3 -68
  93. data/app/controllers/cms/attachments_controller.rb +5 -5
  94. data/app/controllers/cms/base_controller.rb +20 -13
  95. data/app/controllers/cms/cache_controller.rb +16 -17
  96. data/app/controllers/cms/category_types_controller.rb +6 -1
  97. data/app/controllers/cms/connectors_controller.rb +12 -7
  98. data/app/controllers/cms/content_block_controller.rb +128 -71
  99. data/app/controllers/cms/content_controller.rb +54 -56
  100. data/app/controllers/cms/dashboard_controller.rb +5 -6
  101. data/app/controllers/cms/dynamic_views_controller.rb +12 -9
  102. data/app/controllers/cms/email_messages_controller.rb +18 -13
  103. data/app/controllers/cms/form_entries_controller.rb +119 -0
  104. data/app/controllers/cms/form_fields_controller.rb +74 -0
  105. data/app/controllers/cms/forms_controller.rb +35 -0
  106. data/app/controllers/cms/groups_controller.rb +13 -16
  107. data/app/controllers/cms/html_blocks_controller.rb +2 -2
  108. data/app/controllers/cms/inline_content_controller.rb +48 -0
  109. data/app/controllers/cms/links_controller.rb +58 -46
  110. data/app/controllers/cms/page_components_controller.rb +20 -0
  111. data/app/controllers/cms/page_routes_controller.rb +44 -40
  112. data/app/controllers/cms/pages_controller.rb +111 -97
  113. data/app/controllers/cms/passwords_controller.rb +17 -0
  114. data/app/controllers/cms/portlet_controller.rb +0 -1
  115. data/app/controllers/cms/portlets_controller.rb +20 -27
  116. data/app/controllers/cms/redirects_controller.rb +13 -9
  117. data/app/controllers/cms/resource_controller.rb +15 -4
  118. data/app/controllers/cms/routes_controller.rb +2 -4
  119. data/app/controllers/cms/section_nodes_controller.rb +6 -37
  120. data/app/controllers/cms/sections_controller.rb +13 -8
  121. data/app/controllers/cms/sessions_controller.rb +8 -66
  122. data/app/controllers/cms/sites/passwords_controller.rb +27 -0
  123. data/app/controllers/cms/sites/sessions_controller.rb +20 -0
  124. data/app/controllers/cms/tags_controller.rb +12 -12
  125. data/app/controllers/cms/tasks_controller.rb +45 -46
  126. data/app/controllers/cms/user_controller.rb +8 -0
  127. data/app/controllers/cms/users_controller.rb +91 -68
  128. data/app/helpers/cms/application_helper.rb +58 -52
  129. data/app/helpers/cms/content_block_helper.rb +8 -7
  130. data/app/helpers/cms/form_tag_helper.rb +21 -25
  131. data/app/helpers/cms/menu_helper.rb +1 -3
  132. data/app/helpers/cms/mobile_helper.rb +12 -2
  133. data/app/helpers/cms/nav_menu_helper.rb +23 -0
  134. data/app/helpers/cms/page_helper.rb +72 -30
  135. data/app/helpers/cms/path_helper.rb +46 -70
  136. data/app/helpers/cms/rendering_helper.rb +68 -12
  137. data/app/helpers/cms/section_nodes_helper.rb +92 -31
  138. data/app/helpers/cms/sites/authentication_helper.rb +25 -0
  139. data/app/helpers/cms/sites/devise_shim_helper.rb +31 -0
  140. data/app/helpers/cms/template_support.rb +1 -7
  141. data/app/helpers/cms/ui_elements_helper.rb +147 -6
  142. data/app/helpers/forgot_password_portlet_helper.rb +9 -0
  143. data/app/helpers/login_portlet_helper.rb +10 -0
  144. data/app/inputs/attachments_input.rb +14 -0
  145. data/app/inputs/cms_text_area_input.rb +10 -0
  146. data/app/inputs/cms_text_field_input.rb +29 -0
  147. data/app/inputs/date_picker_input.rb +8 -0
  148. data/app/inputs/file_picker_input.rb +75 -0
  149. data/app/inputs/path_input.rb +18 -0
  150. data/app/inputs/tag_list_input.rb +3 -0
  151. data/app/inputs/template_editor_input.rb +24 -0
  152. data/app/inputs/text_editor_input.rb +19 -0
  153. data/app/models/cms/abstract_file_block.rb +10 -6
  154. data/app/models/cms/attachment.rb +20 -27
  155. data/app/models/cms/category.rb +17 -7
  156. data/app/models/cms/category_type.rb +8 -4
  157. data/app/models/cms/connector.rb +32 -20
  158. data/app/models/cms/content.rb +31 -0
  159. data/app/models/cms/content_type.rb +114 -62
  160. data/app/models/cms/dynamic_view.rb +19 -45
  161. data/app/models/cms/email_message.rb +32 -2
  162. data/app/models/cms/external_user.rb +60 -0
  163. data/app/models/cms/file_block.rb +1 -0
  164. data/app/models/cms/form.rb +47 -0
  165. data/app/models/cms/form_entry.rb +71 -0
  166. data/app/models/cms/form_field.rb +78 -0
  167. data/app/models/cms/group.rb +19 -9
  168. data/app/models/cms/group_permission.rb +1 -1
  169. data/app/models/cms/group_section.rb +1 -1
  170. data/app/models/cms/group_type.rb +5 -5
  171. data/app/models/cms/group_type_permission.rb +1 -1
  172. data/app/models/cms/html_block.rb +14 -19
  173. data/app/models/cms/image_block.rb +1 -0
  174. data/app/models/cms/link.rb +8 -6
  175. data/app/models/cms/page.rb +156 -59
  176. data/app/models/cms/page_component.rb +43 -0
  177. data/app/models/cms/page_partial.rb +16 -8
  178. data/app/models/cms/page_route.rb +1 -1
  179. data/app/models/cms/page_route_condition.rb +1 -1
  180. data/app/models/cms/page_route_option.rb +1 -1
  181. data/app/models/cms/page_route_requirement.rb +1 -1
  182. data/app/models/cms/page_template.rb +14 -9
  183. data/app/models/cms/permission.rb +4 -2
  184. data/app/models/cms/persistent_user.rb +208 -0
  185. data/app/models/cms/portlet.rb +56 -9
  186. data/app/models/cms/redirect.rb +1 -1
  187. data/app/models/cms/search_filter.rb +18 -0
  188. data/app/models/cms/section.rb +39 -28
  189. data/app/models/cms/section_node.rb +32 -5
  190. data/app/models/cms/site.rb +3 -3
  191. data/app/models/cms/tag.rb +14 -12
  192. data/app/models/cms/tagging.rb +2 -2
  193. data/app/models/cms/task.rb +14 -21
  194. data/app/models/cms/templates.rb +1 -2
  195. data/app/models/cms/user.rb +21 -160
  196. data/app/models/cms/user_group_membership.rb +2 -2
  197. data/app/portlets/deprecated_placeholder.rb +12 -0
  198. data/app/portlets/dynamic_portlet.rb +1 -1
  199. data/app/portlets/email_page_portlet.rb +10 -3
  200. data/app/portlets/forgot_password_portlet.rb +9 -28
  201. data/app/portlets/login_portlet.rb +8 -5
  202. data/app/portlets/tag_cloud_portlet.rb +3 -1
  203. data/app/presenters/cms/user_presenter.rb +24 -0
  204. data/app/views/cms/application/_add_content_modal.html.erb +3 -0
  205. data/app/views/cms/application/_buttons.html.erb +7 -0
  206. data/app/views/cms/{shared → application}/_exception.html.erb +0 -0
  207. data/app/views/cms/application/_form_errors.html.erb +7 -0
  208. data/app/views/cms/application/_form_with_buttons.html.erb +10 -0
  209. data/app/views/cms/application/_main_content.html.erb +3 -0
  210. data/app/views/cms/application/_main_with_sidebar.html.erb +8 -0
  211. data/app/views/cms/application/_mobile_toolbar.html.erb +16 -0
  212. data/app/views/cms/application/_page_title.html.erb +5 -0
  213. data/app/views/cms/application/_pagination.html.erb +26 -0
  214. data/app/views/cms/application/_row.html.erb +1 -0
  215. data/app/views/cms/application/_save_buttons.html.erb +7 -0
  216. data/app/views/cms/application/_sidebar_layout.html.erb +3 -0
  217. data/app/views/cms/application/_version.html.erb +23 -0
  218. data/app/views/cms/{shared → application}/_version_conflict_diff.html.erb +0 -0
  219. data/app/views/cms/{shared → application}/_version_conflict_error.html.erb +0 -0
  220. data/app/views/cms/attachments/_attachment_manager.html.erb +22 -0
  221. data/app/views/cms/attachments/_no_attachments_defined.html.erb +1 -0
  222. data/app/views/cms/cache/show.html.erb +5 -10
  223. data/app/views/cms/categories/_form.html.erb +15 -24
  224. data/app/views/cms/category_types/_form.html.erb +1 -1
  225. data/app/views/cms/connectors/new.html.erb +33 -64
  226. data/app/views/cms/content/editing_frame.html.erb +1 -0
  227. data/app/views/cms/content/no_page.html.erb +9 -27
  228. data/app/views/cms/content/show.html.erb +14 -15
  229. data/app/views/cms/content_block/_block_form.html.erb +15 -0
  230. data/app/views/cms/content_block/_buttonbar.html.erb +29 -0
  231. data/app/views/cms/content_block/_buttons.html.erb +13 -0
  232. data/app/views/cms/content_block/_hidden_fields.html.erb +13 -0
  233. data/app/views/cms/content_block/_sidebar.html.erb +35 -0
  234. data/app/views/cms/content_block/edit.html.erb +3 -0
  235. data/app/views/cms/content_block/index.html.erb +87 -0
  236. data/app/views/cms/content_block/new.html.erb +3 -0
  237. data/app/views/cms/content_block/render_block_in_main_container.html.erb +10 -0
  238. data/app/views/cms/content_block/show.html.erb +1 -0
  239. data/app/views/cms/content_block/show_in_isolation.html.erb +15 -0
  240. data/app/views/cms/content_block/versions.html.erb +24 -0
  241. data/app/views/cms/dashboard/_page_drafts.html.erb +12 -22
  242. data/app/views/cms/dashboard/_tasks.html.erb +32 -45
  243. data/app/views/cms/dashboard/index.html.erb +11 -13
  244. data/app/views/cms/dynamic_views/_form.html.erb +8 -10
  245. data/app/views/cms/dynamic_views/edit.html.erb +2 -3
  246. data/app/views/cms/dynamic_views/index.html.erb +22 -44
  247. data/app/views/cms/dynamic_views/new.html.erb +2 -3
  248. data/app/views/cms/email_messages/index.html.erb +31 -34
  249. data/app/views/cms/email_messages/show.html.erb +45 -52
  250. data/app/views/cms/file_blocks/_form.html.erb +2 -4
  251. data/app/views/cms/form_entries/_buttons.html.erb +2 -0
  252. data/app/views/cms/form_entries/_form.html.erb +7 -0
  253. data/app/views/cms/form_entries/_internal_form.html.erb +9 -0
  254. data/app/views/cms/form_entries/edit.html.erb +5 -0
  255. data/app/views/cms/form_entries/error.html.erb +3 -0
  256. data/app/views/cms/form_entries/index.html.erb +4 -0
  257. data/app/views/cms/form_entries/new.html.erb +5 -0
  258. data/app/views/cms/form_entries/show.html.erb +13 -0
  259. data/app/views/cms/form_entries/submit.html.erb +1 -0
  260. data/app/views/cms/form_fields/_form.html.erb +8 -0
  261. data/app/views/cms/form_fields/_select.html.erb +3 -0
  262. data/app/views/cms/form_fields/_text_area.html.erb +3 -0
  263. data/app/views/cms/form_fields/_text_field.html.erb +3 -0
  264. data/app/views/cms/form_fields/edit.html.erb +0 -0
  265. data/app/views/cms/form_fields/new.html.erb +26 -0
  266. data/app/views/cms/form_fields/preview.html.erb +16 -0
  267. data/app/views/cms/forms/_form.html.erb +66 -0
  268. data/app/views/cms/forms/render.html.erb +15 -0
  269. data/app/views/cms/forms/show.html.erb +6 -0
  270. data/app/views/cms/groups/_form.html.erb +32 -38
  271. data/app/views/cms/groups/_permissions.html.erb +11 -34
  272. data/app/views/cms/groups/_sections.html.erb +11 -17
  273. data/app/views/cms/groups/edit.html.erb +1 -3
  274. data/app/views/cms/groups/index.html.erb +10 -32
  275. data/app/views/cms/groups/new.html.erb +2 -4
  276. data/app/views/cms/html_blocks/_form.html.erb +2 -2
  277. data/app/views/cms/html_blocks/render.html.erb +1 -1
  278. data/app/views/cms/image_blocks/_form.html.erb +3 -3
  279. data/app/views/cms/links/_form.html.erb +6 -11
  280. data/app/views/cms/links/edit.html.erb +3 -12
  281. data/app/views/cms/links/new.html.erb +4 -13
  282. data/app/views/cms/page_components/_content.html.erb +18 -0
  283. data/app/views/cms/page_components/new.html.erb +12 -0
  284. data/app/views/cms/page_routes/_form.html.erb +11 -10
  285. data/app/views/cms/page_routes/edit.html.erb +2 -3
  286. data/app/views/cms/page_routes/index.html.erb +25 -48
  287. data/app/views/cms/page_routes/new.html.erb +2 -3
  288. data/app/views/cms/pages/_edit_content.html.erb +28 -0
  289. data/app/views/cms/pages/_form.html.erb +20 -37
  290. data/app/views/cms/pages/_main_form.html.erb +23 -0
  291. data/app/views/cms/pages/_simple_container.html.erb +8 -0
  292. data/app/views/cms/pages/edit.html.erb +2 -23
  293. data/app/views/cms/pages/new.html.erb +2 -16
  294. data/app/views/cms/pages/versions.html.erb +18 -87
  295. data/app/views/cms/redirects/_form.html.erb +6 -14
  296. data/app/views/cms/redirects/edit.html.erb +2 -3
  297. data/app/views/cms/redirects/index.html.erb +24 -50
  298. data/app/views/cms/redirects/new.html.erb +2 -3
  299. data/app/views/cms/routes/index.html.erb +15 -20
  300. data/app/views/cms/section_nodes/_children.html.erb +3 -0
  301. data/app/views/cms/section_nodes/_row_buttons.html.erb +11 -0
  302. data/app/views/cms/section_nodes/_section_node.html.erb +24 -10
  303. data/app/views/cms/section_nodes/_sitemap_buttons.html.erb +47 -0
  304. data/app/views/cms/section_nodes/_status.html.erb +5 -0
  305. data/app/views/cms/section_nodes/show.html.erb +9 -0
  306. data/app/views/cms/sections/_buttons.html.erb +6 -0
  307. data/app/views/cms/sections/_form.html.erb +22 -49
  308. data/app/views/cms/sections/edit.html.erb +3 -8
  309. data/app/views/cms/sections/new.html.erb +4 -20
  310. data/app/views/cms/sessions/new.html.erb +16 -31
  311. data/app/views/cms/shared/access_denied.html.erb +1 -2
  312. data/app/views/cms/shared/error.html.erb +5 -5
  313. data/app/views/cms/sites/_flash.html.erb +8 -0
  314. data/app/views/cms/sites/passwords/new.html.erb +2 -0
  315. data/app/views/cms/sites/sessions/new.html.erb +2 -0
  316. data/app/views/cms/tags/_form.html.erb +1 -1
  317. data/app/views/cms/tags/render.html.erb +0 -1
  318. data/app/views/cms/tasks/new.html.erb +18 -32
  319. data/app/views/cms/toolbar/_new_pages_menu.html.erb +10 -0
  320. data/app/views/cms/users/_form.html.erb +8 -11
  321. data/app/views/cms/users/_password.html.erb +2 -8
  322. data/app/views/cms/users/_user_fields.html.erb +7 -20
  323. data/app/views/cms/users/change_password.html.erb +12 -21
  324. data/app/views/cms/users/edit.html.erb +1 -15
  325. data/app/views/cms/users/index.html.erb +61 -58
  326. data/app/views/cms/users/new.html.erb +1 -12
  327. data/app/views/devise/confirmations/new.html.erb +16 -0
  328. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  329. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  330. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  331. data/app/views/devise/passwords/edit.html.erb +19 -0
  332. data/app/views/devise/passwords/new.html.erb +15 -0
  333. data/app/views/devise/registrations/edit.html.erb +28 -0
  334. data/app/views/devise/registrations/new.html.erb +18 -0
  335. data/app/views/devise/shared/_links.erb +25 -0
  336. data/app/views/devise/unlocks/new.html.erb +16 -0
  337. data/app/views/layouts/cms/_content_types.html.erb +13 -0
  338. data/app/views/layouts/cms/_footer.erb +2 -2
  339. data/app/views/layouts/cms/_head.html.erb +8 -18
  340. data/app/views/layouts/cms/_main_menu.html.erb +78 -0
  341. data/app/views/layouts/cms/application.html.erb +19 -24
  342. data/app/views/layouts/cms/content_page.html.erb +5 -0
  343. data/app/views/layouts/cms/page_editor.html.erb +90 -0
  344. data/app/views/portlets/deprecated_placeholders/_form.html.erb +1 -0
  345. data/app/views/portlets/deprecated_placeholders/render.html.erb +8 -0
  346. data/app/views/portlets/dynamic/_form.html.erb +3 -3
  347. data/app/views/portlets/email_page/_form.html.erb +5 -6
  348. data/app/views/portlets/forgot_password/_form.html.erb +2 -3
  349. data/app/views/portlets/forgot_password/render.html.erb +2 -14
  350. data/app/views/portlets/login/_form.html.erb +4 -6
  351. data/app/views/portlets/login/render.html.erb +8 -27
  352. data/app/views/portlets/portlets/_form.html.erb +7 -6
  353. data/app/views/portlets/tag_cloud/_form.html.erb +4 -4
  354. data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
  355. data/bin/bcms +13 -16
  356. data/config/routes.rb +58 -29
  357. data/db/browsercms.seeds.rb +0 -6
  358. data/db/migrate/{20080815014337_browsercms_3_0_0.rb → 20080815014337_browsercms300.rb} +94 -73
  359. data/db/migrate/20130327184912_browsercms400.rb +90 -0
  360. data/db/migrate/20131206214021_devise_create_users.rb +47 -0
  361. data/db/migrate/20131211223908_kill_reset_password.rb +5 -0
  362. data/db/migrate/20131218222005_create_cms_external_users.rb +10 -0
  363. data/doc/features/design_integration.md +45 -0
  364. data/doc/features/external_user.md +7 -0
  365. data/doc/features/form_builder.md +40 -0
  366. data/doc/features/simple_form_refactor.md +60 -0
  367. data/doc/release_notes.md +224 -10
  368. data/lib/acts_as_list.rb +72 -71
  369. data/lib/browsercms.rb +41 -1
  370. data/lib/cms/acts/content_block.rb +12 -2
  371. data/lib/cms/acts/content_page.rb +3 -4
  372. data/lib/cms/admin_tab.rb +15 -0
  373. data/lib/cms/attachments/configuration.rb +1 -1
  374. data/lib/cms/authentication/controller.rb +83 -177
  375. data/lib/cms/authentication/test_password_strategy.rb +19 -0
  376. data/lib/cms/behaviors.rb +1 -0
  377. data/lib/cms/behaviors/archiving.rb +2 -2
  378. data/lib/cms/behaviors/attaching.rb +21 -45
  379. data/lib/cms/behaviors/connecting.rb +14 -4
  380. data/lib/cms/behaviors/dynamic_attributes.rb +3 -3
  381. data/lib/cms/behaviors/hiding.rb +2 -2
  382. data/lib/cms/behaviors/namespacing.rb +6 -36
  383. data/lib/cms/behaviors/publishing.rb +92 -45
  384. data/lib/cms/behaviors/rendering.rb +15 -7
  385. data/lib/cms/behaviors/searching.rb +5 -4
  386. data/lib/cms/behaviors/soft_deleting.rb +13 -16
  387. data/lib/cms/behaviors/taggable.rb +17 -10
  388. data/lib/cms/behaviors/versioning.rb +12 -16
  389. data/lib/cms/commands/to_version400.rb +10 -0
  390. data/lib/cms/concerns.rb +7 -0
  391. data/lib/cms/concerns/can_be_addressable.rb +326 -0
  392. data/lib/cms/concerns/has_content_type.rb +46 -0
  393. data/lib/cms/concerns/ignores_publishing.rb +9 -0
  394. data/lib/cms/configuration.rb +14 -4
  395. data/lib/cms/configuration/configurable_template.rb +24 -0
  396. data/lib/cms/configuration/devise.rb +256 -0
  397. data/lib/cms/configure_simple_form.rb +142 -0
  398. data/lib/cms/configure_simple_form_bootstrap.rb +49 -0
  399. data/lib/cms/content_filter.rb +18 -0
  400. data/lib/cms/content_page.rb +77 -0
  401. data/lib/cms/content_rendering_support.rb +25 -16
  402. data/lib/cms/controllers/admin_controller.rb +78 -0
  403. data/lib/cms/data_loader.rb +30 -11
  404. data/lib/cms/default_accessible.rb +6 -6
  405. data/lib/cms/domain_support.rb +0 -4
  406. data/lib/cms/engine.rb +52 -20
  407. data/lib/cms/engine_helper.rb +41 -51
  408. data/{app/controllers → lib}/cms/error_handling.rb +11 -5
  409. data/lib/cms/extensions.rb +2 -1
  410. data/lib/cms/extensions/active_model/name.rb +13 -0
  411. data/lib/cms/extensions/active_record/connection_adapters/abstract/schema_statements.rb +49 -89
  412. data/lib/cms/extensions/hash.rb +0 -12
  413. data/lib/cms/form_builder/content_block_form_builder.rb +45 -0
  414. data/lib/cms/form_builder/default_input.rb +13 -0
  415. data/lib/cms/form_builder/deprecated_inputs.rb +40 -0
  416. data/lib/cms/form_builder/workflow_buttons.rb +38 -0
  417. data/lib/cms/module.rb +1 -7
  418. data/lib/cms/polymorphic_single_table_inheritance.rb +19 -0
  419. data/lib/cms/publish_workflow.rb +26 -0
  420. data/lib/cms/responders/content_responder.rb +14 -0
  421. data/lib/cms/route_extensions.rb +112 -20
  422. data/lib/cms/version.rb +1 -1
  423. data/lib/generators/browser_cms/demo_site/templates/demo.seeds.rb +0 -2
  424. data/lib/generators/cms/content_block/content_block_generator.rb +19 -46
  425. data/lib/generators/cms/content_block/templates/_form.html.erb +22 -28
  426. data/lib/generators/cms/project/templates/devise.rb.erb +7 -0
  427. metadata +383 -150
  428. data/app/assets/javascripts/cms/sitemap.js.erb +0 -464
  429. data/app/assets/stylesheets/browsercms/application.css +0 -7
  430. data/app/assets/stylesheets/cms/administration.css.erb +0 -91
  431. data/app/assets/stylesheets/cms/application.css.erb +0 -171
  432. data/app/assets/stylesheets/cms/attachment_manager.css.scss +0 -28
  433. data/app/assets/stylesheets/cms/block.css +0 -26
  434. data/app/assets/stylesheets/cms/buttons.css.erb +0 -120
  435. data/app/assets/stylesheets/cms/content_library.css.erb +0 -139
  436. data/app/assets/stylesheets/cms/content_types.css +0 -4
  437. data/app/assets/stylesheets/cms/dashboard.css.erb +0 -118
  438. data/app/assets/stylesheets/cms/data_table.css.erb.erb +0 -156
  439. data/app/assets/stylesheets/cms/date_picker.css.erb +0 -82
  440. data/app/assets/stylesheets/cms/form_layout.css.erb +0 -282
  441. data/app/assets/stylesheets/cms/login.css.erb +0 -78
  442. data/app/assets/stylesheets/cms/menu.css.erb +0 -116
  443. data/app/assets/stylesheets/cms/nav.css.erb +0 -99
  444. data/app/assets/stylesheets/cms/page_toolbar.css.erb +0 -135
  445. data/app/assets/stylesheets/cms/reset.css +0 -46
  446. data/app/assets/stylesheets/cms/selectbox.css.erb +0 -56
  447. data/app/assets/stylesheets/cms/sitemap.css.erb +0 -390
  448. data/app/assets/stylesheets/cms/taglist.css +0 -18
  449. data/app/controllers/application_controller.rb +0 -14
  450. data/app/controllers/cms/content_types_controller.rb +0 -9
  451. data/app/helpers/application_helper.rb +0 -5
  452. data/app/helpers/cms/form_builder.rb +0 -241
  453. data/app/models/cms/content_type_group.rb +0 -15
  454. data/app/models/cms/forgot_password_mailer.rb +0 -14
  455. data/app/portlets/reset_password_portlet.rb +0 -28
  456. data/app/views/cms/blocks/_hidden_fields.html.erb +0 -10
  457. data/app/views/cms/blocks/_toolbar.html.erb +0 -9
  458. data/app/views/cms/blocks/_toolbar_for_collection.html.erb +0 -23
  459. data/app/views/cms/blocks/_toolbar_for_member.html.erb +0 -36
  460. data/app/views/cms/blocks/edit.html.erb +0 -28
  461. data/app/views/cms/blocks/index.html.erb +0 -86
  462. data/app/views/cms/blocks/new.html.erb +0 -19
  463. data/app/views/cms/blocks/show.html.erb +0 -43
  464. data/app/views/cms/blocks/usages.html.erb +0 -44
  465. data/app/views/cms/blocks/versions.html.erb +0 -90
  466. data/app/views/cms/content_types/index.html.erb +0 -14
  467. data/app/views/cms/form_builder/_cms_attachment_manager.html.erb +0 -27
  468. data/app/views/cms/form_builder/_cms_check_box.html.erb +0 -7
  469. data/app/views/cms/form_builder/_cms_date_picker.html.erb +0 -12
  470. data/app/views/cms/form_builder/_cms_datetime_select.html.erb +0 -12
  471. data/app/views/cms/form_builder/_cms_drop_down.html.erb +0 -12
  472. data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +0 -9
  473. data/app/views/cms/form_builder/_cms_file_field.html.erb +0 -28
  474. data/app/views/cms/form_builder/_cms_instructions.html.erb +0 -4
  475. data/app/views/cms/form_builder/_cms_tag_list.html.erb +0 -15
  476. data/app/views/cms/form_builder/_cms_template_editor.html.erb +0 -9
  477. data/app/views/cms/form_builder/_cms_text_area.html.erb +0 -10
  478. data/app/views/cms/form_builder/_cms_text_editor.html.erb +0 -19
  479. data/app/views/cms/form_builder/_cms_text_field.html.erb +0 -12
  480. data/app/views/cms/links/destroy.js.rjs +0 -2
  481. data/app/views/cms/page_routes/show.html.erb +0 -10
  482. data/app/views/cms/pages/_edit_connector.html.erb +0 -19
  483. data/app/views/cms/pages/_edit_container.html.erb +0 -11
  484. data/app/views/cms/section_nodes/_link.html.erb +0 -14
  485. data/app/views/cms/section_nodes/_node.html.erb +0 -44
  486. data/app/views/cms/section_nodes/_page.html.erb +0 -20
  487. data/app/views/cms/section_nodes/_section.html.erb +0 -28
  488. data/app/views/cms/section_nodes/index.html.erb +0 -43
  489. data/app/views/cms/sections/_page.html.erb +0 -4
  490. data/app/views/cms/sections/_section.html.erb +0 -8
  491. data/app/views/cms/sections/destroy.js.rjs +0 -2
  492. data/app/views/cms/sections/index.html.erb +0 -23
  493. data/app/views/cms/shared/_admin_sidebar.html.erb +0 -36
  494. data/app/views/cms/shared/_pagination.html.erb +0 -31
  495. data/app/views/cms/toolbar/_mobile_toggle.html.erb +0 -33
  496. data/app/views/cms/toolbar/index.html.erb +0 -1
  497. data/app/views/cms/users/_groups.html.erb +0 -12
  498. data/app/views/cms/users/_toolbar.html.erb +0 -24
  499. data/app/views/cms/users/show.html.erb +0 -50
  500. data/app/views/layouts/_cms_toolbar.html.erb +0 -54
  501. data/app/views/layouts/_page_toolbar.html.erb +0 -119
  502. data/app/views/layouts/cms/administration.html.erb +0 -51
  503. data/app/views/layouts/cms/content_library.html.erb +0 -96
  504. data/app/views/layouts/cms/dashboard.html.erb +0 -16
  505. data/app/views/layouts/cms/login.html.erb +0 -31
  506. data/app/views/layouts/cms/section_nodes.html.erb +0 -20
  507. data/app/views/layouts/cms/toolbar.html.erb +0 -23
  508. data/app/views/portlets/reset_password/_form.html.erb +0 -3
  509. data/app/views/portlets/reset_password/render.html.erb +0 -22
  510. data/bin/bcms-upgrade +0 -332
  511. data/db/migrate/20091109175123_browsercms_3_0_5.rb +0 -9
  512. data/db/migrate/20100117144038_browsercms314.rb +0 -20
  513. data/db/migrate/20100117144039_browsercms315.rb +0 -95
  514. data/db/migrate/20100705083859_browsercms_3_3_0.rb +0 -56
  515. data/db/migrate/20111130221145_browsercms340.rb +0 -56
  516. data/db/migrate/20120329144406_browsercms350.rb +0 -32
  517. data/db/migrate/20120717182827_browsercms353.rb +0 -19
  518. data/db/migrate/20120813180110_browsercms354.rb +0 -9
  519. data/lib/cms/addressable.rb +0 -93
  520. data/lib/cms/authentication/model.rb +0 -116
  521. data/lib/cms/behaviors/pagination.rb +0 -212
  522. data/lib/cms/upgrades/v3_4_0.rb +0 -31
  523. data/lib/cms/upgrades/v3_5_0.rb +0 -227
@@ -1,56 +0,0 @@
1
- class Browsercms330 < ActiveRecord::Migration
2
- def self.up
3
-
4
- # patch required for LH345
5
- cant_fix = []
6
- to_fix = []
7
- # find all pages whose path ends in slash and is not root
8
- Cms::Page.find(:all, :conditions => "path LIKE '/%/'").each do |pt_page|
9
- # make sure no extant page has this path
10
- if Page.count(:conditions => ["path = ?", pt_page.path.sub(/(.+)\/+$/, '\1')]) > 0
11
- cant_fix << pt_page
12
- else
13
- to_fix << pt_page
14
- end
15
- end
16
- version_cant_fix = []
17
- version_to_fix = []
18
- # find all page versions whose path ends in slash and is not root
19
- Cms::Page::Version.find(:all, :conditions => "path LIKE '/%/'").each do |pt_page|
20
- # make sure no extant page has this path
21
- if Cms::Page.count(:conditions => ["path = ?", pt_page.path.sub(/(.+)\/+$/, '\1')]) > 0
22
- version_cant_fix << pt_page
23
- else
24
- version_to_fix << pt_page
25
- end
26
- end
27
-
28
- # raise an error if there are pages (*not* page versions) that will duplicate an extant path if the ending slash is dropped
29
- if cant_fix.length > 0
30
- raise "Cannot remove trailing slashes from pages with ID(s) (#{cant_fix.map(&:id).join(', ')}). Other pages already exist with their correct path. The offending path may be in an unpublished page version, newer than the current public version. These needed to be corrected manually in your DBMS before running this migration"
31
- end
32
-
33
- to_fix.each do |fix_page|
34
- # change the path of all pages with a trailing slash to not have one
35
- # using sql updates to prevent unwanted callbacks
36
- new_path = fix_page.path.to_s.sub(/(.+)\/+$/, '\1')
37
- execute "UPDATE #{prefix('pages')} SET path = '#{new_path}' WHERE id = #{fix_page.id};"
38
- end
39
- version_to_fix.each do |fix_page|
40
- # change the path of all fixable page versions with a trailing slash to not have one
41
- # using sql updates to prevent unwanted callbacks
42
- new_path = fix_page.path.to_s.sub(/(.+)\/+$/, '\1')
43
- execute "UPDATE #{prefix('page_versions')} SET path = '#{new_path}' WHERE id = #{fix_page.id};"
44
- end
45
- # end patch for LH345
46
- end
47
-
48
- def self.down
49
-
50
- # Cannot restore paths with trailing slash - raise error or show message
51
- #
52
- # raise IrreversibleMigration, "Cannot reverse migration which removes trailing slash from page paths"
53
- puts "Page paths which had trailing slashes removed cannot be restored to their original state."
54
-
55
- end
56
- end
@@ -1,56 +0,0 @@
1
- # Upgrade to Browsercms v3.4.0
2
- require 'cms/upgrades/v3_4_0'
3
- class Browsercms340 < ActiveRecord::Migration
4
- include Cms::Upgrades::V3_4_0::SchemaStatements
5
-
6
- def change
7
- # Namespace class_names where they are not namespaced.
8
- %w[HtmlBlock Category CategoryType Portlet FileBlock ImageBlock Tag].each do |content_type|
9
- update_content_types(content_type)
10
- update_connectors_table(content_type)
11
- end
12
-
13
- update_sitemap
14
- update_files
15
- end
16
-
17
- private
18
-
19
- def namespace_model(name)
20
- "Cms::#{name}"
21
- end
22
-
23
- def update_files
24
- %w[FileBlock ImageBlock].each do |content_type|
25
- Cms::AbstractFileBlock.update_all("type = '#{namespace_model(content_type)}'", "type = '#{content_type}'")
26
- end
27
- end
28
-
29
- def update_sitemap
30
- %w[Section Page Link Attachment].each do |addressable|
31
- Cms::SectionNode.where(:node_type=>addressable).each do |node|
32
- node.node_type = namespace_model(addressable)
33
- node.save!
34
- end
35
- end
36
- end
37
-
38
- def update_content_types(name)
39
- found = Cms::ContentType.named(name).first
40
- if found
41
- found.name = namespace_model(name)
42
- found.save!
43
- end
44
- end
45
-
46
- def update_connectors_table(name)
47
- namespaced_class = namespace_model(name)
48
- puts "Update connectors for #{name} to #{namespaced_class}"
49
- Cms::Connector.where(:connectable_type => name).each do |connector|
50
- connector.connectable_type = namespaced_class
51
- connector.save!
52
- end
53
- end
54
-
55
-
56
- end
@@ -1,32 +0,0 @@
1
- require 'cms/upgrades/v3_5_0'
2
-
3
- class Browsercms350 < ActiveRecord::Migration
4
- def change
5
- migrate_attachments_table
6
- migrate_attachment_for(Cms::ImageBlock)
7
- migrate_attachment_for(Cms::FileBlock)
8
- migrate_attachment_files_to_new_location
9
-
10
- end
11
-
12
-
13
- private
14
-
15
- def migrate_attachments_table
16
- rename_table :attachments, :cms_attachments if table_exists?(:attachments)
17
- rename_table :attachment_versions, :cms_attachment_versions if table_exists?(:attachment_versions)
18
-
19
- rename_content_column :cms_attachments, :file_path, :data_file_path
20
- rename_content_column :cms_attachments, :file_size, :data_file_size
21
- rename_content_column :cms_attachments, :file_type, :data_content_type
22
- rename_content_column :cms_attachments, :name, :data_file_name
23
- remove_content_column :cms_attachments, :file_extension
24
-
25
- add_content_column :cms_attachments, :data_fingerprint, :string
26
- add_content_column :cms_attachments, :attachable_type, :string
27
- add_content_column :cms_attachments, :attachment_name, :string
28
- add_content_column :cms_attachments, :attachable_id, :integer
29
- add_content_column :cms_attachments, :attachable_version, :integer
30
- add_content_column :cms_attachments, :cardinality, :string
31
- end
32
- end
@@ -1,19 +0,0 @@
1
- require 'cms/upgrades/v3_5_0'
2
-
3
- class Browsercms353 < ActiveRecord::Migration
4
- def change
5
- namespace_templates
6
-
7
- # Some older projects may have AbstractFileBlock rather than File/ImageBlock connectors
8
- v3_5_0_update_connector_namespaces("Cms", "AbstractFileBlock")
9
-
10
- end
11
-
12
- private
13
-
14
- def namespace_templates
15
- ["PageTemplate", "PagePartial"].each do |view|
16
- Cms::DynamicView.update_all("type = 'Cms::#{view}'", "type = '#{view}'" )
17
- end
18
- end
19
- end
@@ -1,9 +0,0 @@
1
- class Browsercms354 < ActiveRecord::Migration
2
- def up
3
- # Attachments should not be overly specific, since it prevents joins from working.
4
- ["Cms::ImageBlock", "Cms::FileBlock"].each do |old_type|
5
- Cms::Attachment.unscoped.update_all({:attachable_type => "Cms::AbstractFileBlock"}, {:attachable_type => old_type})
6
- end
7
- end
8
- end
9
-
@@ -1,93 +0,0 @@
1
- # Represents any object which exists in a Sitemap.
2
- #
3
- # Can have parents (using SectionNodes) and children.
4
- module Cms
5
- module Addressable
6
-
7
- def self.included(model_class)
8
- model_class.attr_accessible :parent
9
- end
10
-
11
- # Returns a list of all Addressable objects that are ancestors to this record.
12
- # @param [Hash] options
13
- # @option [Symbol] :include_self If this object should be included in the Array
14
- # @return [Array<Addressable]
15
- #
16
- def ancestors(options={})
17
- ancestor_nodes = node.ancestors
18
- ancestors = ancestor_nodes.collect { |node| node.node }
19
- ancestors << self if options[:include_self]
20
- ancestors
21
- end
22
-
23
- def parent
24
- @parent if @parent
25
- node ? node.section : nil
26
- end
27
-
28
- def cache_parent(section)
29
- @parent = section
30
- end
31
-
32
- def parent=(sec)
33
- if node
34
- node.move_to_end(sec)
35
- else
36
- build_section_node(:node => self, :section => sec)
37
- end
38
- end
39
-
40
- # Computes the name of the partial used to render this object in the sitemap.
41
- def partial_for
42
- self.class.name.demodulize.underscore
43
- end
44
-
45
- # Pages/Links/Attachments use their parent to determine access
46
- module LeafNode
47
- def access_status
48
- parent.status
49
- end
50
- end
51
-
52
- module NodeAccessors
53
- def node
54
- section_node
55
- end
56
-
57
- def node=(n)
58
- self.section_node = n
59
- end
60
- end
61
- # These exist for backwards compatibility to avoid having to change tests.
62
- # I want to get rid of these in favor of parent and parent_id
63
- module DeprecatedPageAccessors
64
-
65
- def self.included(model_class)
66
- model_class.attr_accessible :section_id, :section
67
- end
68
- include LeafNode
69
- include NodeAccessors
70
-
71
- def build_node(opts)
72
- build_section_node(opts)
73
- end
74
-
75
- def section_id
76
- section ? section.id : nil
77
- end
78
-
79
- def section_id=(sec_id)
80
- self.section = Section.find(sec_id)
81
- end
82
-
83
- def section
84
- parent
85
- end
86
-
87
- def section=(sec)
88
- self.parent = sec
89
-
90
- end
91
- end
92
- end
93
- end
@@ -1,116 +0,0 @@
1
- module Cms
2
- module Authentication
3
- module Model
4
- def self.included(model_class)
5
- model_class.extend ClassMethods
6
- model_class.class_eval do
7
- include InstanceMethods
8
-
9
- # Virtual attribute for the unencrypted password
10
- attr_accessor :password
11
- validates_presence_of :password, :if => :password_required?
12
- validates_presence_of :password_confirmation, :if => :password_required?
13
- validates_confirmation_of :password, :if => :password_required?
14
- #validates_length_of :password, :within => 6..40, :if => :password_required?
15
- before_save :encrypt_password
16
- end
17
- end
18
-
19
- module ClassMethods
20
- def authenticate(login, password)
21
- u = find_by_login(login) # need to get the salt
22
- u && u.authenticated?(password) && !u.expired? ? u : nil
23
- end
24
-
25
- #Method to make it easy to change a user's password from the console, not used in the app
26
- def change_password(login, new_password)
27
- find_by_login(login).change_password(new_password)
28
- end
29
-
30
- def make_token
31
- secure_digest(Time.now, (1..10).map{ rand.to_s })
32
- end
33
-
34
- def password_digest(password, salt)
35
- key = '8771d0d9bef6f1091b723d2e701a17c811d69b26'
36
- digest = key
37
- 10.times do
38
- digest = secure_digest(digest, salt, password, key)
39
- end
40
- digest
41
- end
42
-
43
- def secure_digest(*args)
44
- Digest::SHA1.hexdigest(args.flatten.join('--'))
45
- end
46
-
47
- end
48
-
49
- module InstanceMethods
50
- #Method to make it easy to change a user's password from the console, not used in the app
51
- def change_password(new_password)
52
- update_attributes(:password => new_password, :password_confirmation => new_password)
53
- end
54
-
55
- # Encrypts the password with the user salt
56
- def encrypt(password)
57
- self.class.password_digest(password, salt)
58
- end
59
-
60
- def authenticated?(password)
61
- crypted_password == encrypt(password)
62
- end
63
-
64
- # before filter
65
- def encrypt_password
66
- return if password.blank?
67
- self.salt = self.class.make_token if new_record?
68
- self.crypted_password = encrypt(password)
69
- end
70
-
71
- def password_required?
72
- crypted_password.blank? || !password.blank?
73
- end
74
-
75
- def remember_token?
76
- (!remember_token.blank?) &&
77
- remember_token_expires_at && (Time.now.utc < remember_token_expires_at.utc)
78
- end
79
-
80
- # These create and unset the fields required for remembering users between browser closes
81
- def remember_me
82
- remember_me_for 2.weeks
83
- end
84
-
85
- def remember_me_for(time)
86
- remember_me_until time.from_now.utc
87
- end
88
-
89
- def remember_me_until(time)
90
- self.remember_token_expires_at = time
91
- self.remember_token = self.class.make_token
92
- save
93
- end
94
-
95
- # refresh token (keeping same expires_at) if it exists
96
- def refresh_token
97
- if remember_token?
98
- self.remember_token = self.class.make_token
99
- save
100
- end
101
- end
102
-
103
- #
104
- # Deletes the server-side record of the authentication token. The
105
- # client-side (browser cookie) and server-side (this remember_token) must
106
- # always be deleted together.
107
- #
108
- def forget_me
109
- self.remember_token_expires_at = nil
110
- self.remember_token = nil
111
- save
112
- end
113
- end
114
- end
115
- end
116
- end
@@ -1,212 +0,0 @@
1
- # This is just a repackaged version of Will Paginate 2.2.2
2
- module Cms
3
- module Behaviors
4
- module Pagination
5
-
6
- DEFAULT_PER_PAGE = 15
7
-
8
- def self.included(model_class)
9
- model_class.extend(ClassMethods)
10
- class << model_class
11
- define_method(:default_per_page) { DEFAULT_PER_PAGE }
12
- end
13
- end
14
- class InvalidPage < ArgumentError
15
- def initialize(page, page_num)
16
- super "#{page.inspect} given as value, which translates to '#{page_num}' as page number"
17
- end
18
- end
19
- class Collection < Array
20
- attr_reader :current_page, :per_page, :total_entries, :total_pages
21
-
22
- # Arguments to the constructor are the current page number, per-page limit
23
- # and the total number of entries. The last argument is optional because it
24
- # is best to do lazy counting; in other words, count *conditionally* after
25
- # populating the collection using the +replace+ method.
26
- def initialize(page, per_page, total = nil)
27
- @current_page = page.to_i
28
- raise InvalidPage.new(page, @current_page) if @current_page < 1
29
- @per_page = per_page.to_i
30
- raise ArgumentError, "`per_page` setting cannot be less than 1 (#{@per_page} given)" if @per_page < 1
31
-
32
- self.total_entries = total if total
33
- end
34
-
35
- # Just like +new+, but yields the object after instantiation and returns it
36
- # afterwards. This is very useful for manual pagination:
37
- #
38
- # @entries = WillPaginate::Collection.create(1, 10) do |pager|
39
- # result = Post.find(:all, :limit => pager.per_page, :offset => pager.offset)
40
- # # inject the result array into the paginated collection:
41
- # pager.replace(result)
42
- #
43
- # unless pager.total_entries
44
- # # the pager didn't manage to guess the total count, do it manually
45
- # pager.total_entries = Post.count
46
- # end
47
- # end
48
- #
49
- # The possibilities with this are endless. For another example, here is how
50
- # WillPaginate used to define pagination for Array instances:
51
- #
52
- # Array.class_eval do
53
- # def paginate(page = 1, per_page = 15)
54
- # WillPaginate::Collection.create(page, per_page, size) do |pager|
55
- # pager.replace self[pager.offset, pager.per_page].to_a
56
- # end
57
- # end
58
- # end
59
- #
60
- # The Array#paginate API has since then changed, but this still serves as a
61
- # fine example of WillPaginate::Collection usage.
62
- def self.create(page, per_page, total = nil, &block)
63
- pager = new(page, per_page, total)
64
- yield pager
65
- pager
66
- end
67
-
68
- # Helper method that is true when someone tries to fetch a page with a
69
- # larger number than the last page. Can be used in combination with flashes
70
- # and redirecting.
71
- def out_of_bounds?
72
- current_page > total_pages
73
- end
74
-
75
- # Current offset of the paginated collection. If we're on the first page,
76
- # it is always 0. If we're on the 2nd page and there are 30 entries per page,
77
- # the offset is 30. This property is useful if you want to render ordinals
78
- # besides your records: simply start with offset + 1.
79
- def offset
80
- (current_page - 1) * per_page
81
- end
82
-
83
- # current_page - 1 or nil if there is no previous page
84
- def previous_page
85
- current_page > 1 ? (current_page - 1) : nil
86
- end
87
-
88
- # current_page + 1 or nil if there is no next page
89
- def next_page
90
- current_page < total_pages ? (current_page + 1) : nil
91
- end
92
-
93
- def total_entries=(number)
94
- @total_entries = number.to_i
95
- @total_pages = (@total_entries / per_page.to_f).ceil
96
- end
97
-
98
- # This is a magic wrapper for the original Array#replace method. It serves
99
- # for populating the paginated collection after initialization.
100
- #
101
- # Why magic? Because it tries to guess the total number of entries judging
102
- # by the size of given array. If it is shorter than +per_page+ limit, then we
103
- # know we're on the last page. This trick is very useful for avoiding
104
- # unnecessary hits to the database to do the counting after we fetched the
105
- # data for the current page.
106
- #
107
- # However, after using +replace+ you should always test the value of
108
- # +total_entries+ and set it to a proper value if it's +nil+. See the example
109
- # in +create+.
110
- def replace(array)
111
- result = super
112
-
113
- # The collection is shorter then page limit? Rejoice, because
114
- # then we know that we are on the last page!
115
- if total_entries.nil? and length < per_page and (current_page == 1 or length > 0)
116
- self.total_entries = offset + length
117
- end
118
-
119
- result
120
- end
121
- end
122
- module ClassMethods
123
- # This is the main paginating finder.
124
- #
125
- # == Special parameters for paginating finders
126
- # * <tt>:page</tt> -- REQUIRED, but defaults to 1 if false or nil
127
- # * <tt>:per_page</tt> -- defaults to <tt>CurrentModel.per_page</tt> (which is 30 if not overridden)
128
- # * <tt>:total_entries</tt> -- use only if you manually count total entries
129
- # * <tt>:count</tt> -- additional options that are passed on to +count+
130
- # * <tt>:finder</tt> -- name of the ActiveRecord finder used (default: "find")
131
- #
132
- # All other options (+conditions+, +order+, ...) are forwarded to +find+
133
- # and +count+ calls.
134
- def paginate(*args, &block)
135
- options = args.pop
136
- page, per_page, total_entries = parse_pagination_options(options)
137
-
138
- finder = (options[:finder] || 'find').to_s
139
- if finder == 'find'
140
- # an array of IDs may have been given:
141
- total_entries ||= (Array === args.first and args.first.size)
142
- # :all is implicit
143
- args.unshift(:all) if args.empty?
144
- end
145
-
146
- Collection.create(page, per_page, total_entries) do |pager|
147
- count_options = options.except :page, :per_page, :total_entries, :finder
148
- find_options = count_options.except(:count).update(:offset => pager.offset, :limit => pager.per_page)
149
-
150
- args << find_options
151
- # @options_from_last_find = nil
152
- pager.replace send(finder, *args, &block)
153
-
154
- # magic counting for user convenience:
155
- pager.total_entries = count_for_pagination(count_options, args, finder) unless pager.total_entries
156
- end
157
- end
158
- protected
159
- # Does the not-so-trivial job of finding out the total number of entries
160
- # in the database. It relies on the ActiveRecord +count+ method.
161
- def count_for_pagination(options, args, finder)
162
- excludees = [:count, :order, :limit, :offset, :readonly]
163
- unless options[:select] and options[:select] =~ /^\s*DISTINCT\b/i
164
- excludees << :select # only exclude the select param if it doesn't begin with DISTINCT
165
- end
166
- # count expects (almost) the same options as find
167
- count_options = options.except *excludees
168
-
169
- # merge the hash found in :count
170
- # this allows you to specify :select, :order, or anything else just for the count query
171
- count_options.update options[:count] if options[:count]
172
-
173
- # we may have to scope ...
174
- counter = Proc.new { count(count_options) }
175
-
176
- # we may be in a model or an association proxy!
177
- klass = (@owner and @reflection) ? @reflection.klass : self
178
-
179
- count = if finder.index('find_') == 0 and klass.respond_to?(scoper = finder.sub('find', 'with'))
180
- # scope_out adds a 'with_finder' method which acts like with_scope, if it's present
181
- # then execute the count with the scoping provided by the with_finder
182
- send(scoper, &counter)
183
- elsif match = /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match(finder)
184
- # extract conditions from calls like "paginate_by_foo_and_bar"
185
- attribute_names = extract_attribute_names_from_match(match)
186
- conditions = construct_attributes_from_arguments(attribute_names, args)
187
- with_scope(:find => { :conditions => conditions }, &counter)
188
- else
189
- counter.call
190
- end
191
-
192
- count.respond_to?(:length) ? count.length : count
193
- end
194
-
195
- def parse_pagination_options(options) #:nodoc:
196
- raise ArgumentError, 'parameter hash expected' unless options.respond_to? :symbolize_keys
197
- options = options.symbolize_keys
198
- raise ArgumentError, ':page parameter required' unless options.key? :page
199
-
200
- if options[:count] and options[:total_entries]
201
- raise ArgumentError, ':count and :total_entries are mutually exclusive'
202
- end
203
-
204
- page = options[:page] || 1
205
- per_page = options[:per_page] || self.default_per_page
206
- total = options[:total_entries]
207
- [page, per_page, total]
208
- end
209
- end
210
- end
211
- end
212
- end