zen 0.2.8 → 0.3b

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 (422) hide show
  1. data/.gems +20 -0
  2. data/.mailmap +3 -2
  3. data/.rvmrc +1 -1
  4. data/.travis.yml +13 -2
  5. data/.yardopts +13 -0
  6. data/AUTHORS +1 -1
  7. data/README.md +115 -77
  8. data/Rakefile +6 -7
  9. data/bin/zen +12 -5
  10. data/guide/_static/categories/categories.png +0 -0
  11. data/guide/_static/categories/category_groups.png +0 -0
  12. data/guide/_static/categories/new_category.png +0 -0
  13. data/guide/_static/categories/new_category_group.png +0 -0
  14. data/guide/_static/comments/comments.png +0 -0
  15. data/guide/_static/comments/edit_comment.png +0 -0
  16. data/guide/_static/custom_fields/custom_field_groups.png +0 -0
  17. data/guide/_static/custom_fields/custom_field_types.png +0 -0
  18. data/guide/_static/custom_fields/custom_fields.png +0 -0
  19. data/guide/_static/custom_fields/edit_custom_field_general.png +0 -0
  20. data/guide/_static/custom_fields/edit_custom_field_group.png +0 -0
  21. data/guide/_static/custom_fields/edit_custom_field_settings.png +0 -0
  22. data/guide/_static/custom_fields/edit_custom_field_type.png +0 -0
  23. data/guide/_static/menus/edit_menu.png +0 -0
  24. data/guide/_static/menus/edit_menu_item.png +0 -0
  25. data/guide/_static/menus/menu_items.png +0 -0
  26. data/guide/_static/menus/menus.png +0 -0
  27. data/guide/_static/sections/edit_entry.png +0 -0
  28. data/guide/_static/sections/edit_entry_categories.png +0 -0
  29. data/guide/_static/sections/edit_entry_general.png +0 -0
  30. data/guide/_static/sections/edit_entry_meta.png +0 -0
  31. data/guide/_static/sections/edit_section_comments.png +0 -0
  32. data/guide/_static/sections/edit_section_general.png +0 -0
  33. data/guide/_static/sections/edit_section_groups.png +0 -0
  34. data/guide/_static/sections/entries.png +0 -0
  35. data/guide/_static/sections/sections.png +0 -0
  36. data/guide/_static/settings/overview_general.png +0 -0
  37. data/guide/_static/settings/overview_security.png +0 -0
  38. data/guide/_static/settings/overview_user.png +0 -0
  39. data/guide/_static/users/edit_user.png +0 -0
  40. data/guide/_static/users/edit_user_group.png +0 -0
  41. data/guide/_static/users/edit_user_group_permissions.png +0 -0
  42. data/guide/_static/users/edit_user_permissions.png +0 -0
  43. data/guide/_static/users/overview.png +0 -0
  44. data/guide/_static/users/user_groups_overview.png +0 -0
  45. data/guide/asset_management.md +117 -0
  46. data/{CHANGELOG.md → guide/changelog.md} +42 -0
  47. data/guide/css/common.css +20 -0
  48. data/guide/getting_started.md +61 -0
  49. data/guide/hacking.md +52 -0
  50. data/guide/installation.md +44 -0
  51. data/guide/javascript.md +352 -0
  52. data/lib/vendor/sequel_sluggable.rb +137 -0
  53. data/lib/yard/tags.rb +13 -0
  54. data/lib/zen.rb +148 -78
  55. data/lib/zen/asset_groups.rb +85 -0
  56. data/lib/zen/bin/create.rb +267 -56
  57. data/lib/zen/bin/default.rb +84 -0
  58. data/lib/zen/controller/admin_controller.rb +1 -82
  59. data/lib/zen/controller/base_controller.rb +9 -5
  60. data/lib/zen/controller/frontend_controller.rb +0 -1
  61. data/lib/zen/controller/main_controller.rb +30 -42
  62. data/lib/zen/controller/preview.rb +9 -8
  63. data/lib/zen/controller/translations.rb +49 -0
  64. data/lib/zen/error.rb +17 -0
  65. data/lib/zen/event.rb +118 -0
  66. data/lib/zen/helper/asset.rb +63 -0
  67. data/lib/zen/helper/breadcrumb.rb +1 -4
  68. data/lib/zen/helper/controller.rb +73 -0
  69. data/lib/zen/helper/locale.rb +42 -0
  70. data/lib/zen/helper/message.rb +0 -3
  71. data/lib/zen/helper/search.rb +54 -0
  72. data/lib/zen/helper/stacked_aspect.rb +249 -0
  73. data/lib/zen/helper/theme.rb +3 -10
  74. data/lib/zen/language.rb +356 -181
  75. data/lib/zen/language/en/zen_general.rb +52 -0
  76. data/lib/zen/language/en/zen_models.rb +19 -0
  77. data/lib/zen/language/nl/zen_general.rb +57 -0
  78. data/lib/zen/language/nl/zen_models.rb +22 -0
  79. data/lib/zen/language/translation.rb +132 -0
  80. data/lib/zen/languages.rb +9 -0
  81. data/lib/zen/layout/admin.xhtml +3 -3
  82. data/lib/zen/layout/login.xhtml +1 -1
  83. data/lib/zen/markup.rb +189 -0
  84. data/lib/zen/model/helper.rb +65 -0
  85. data/lib/zen/model/init.rb +62 -0
  86. data/lib/zen/model/methods.rb +6 -7
  87. data/lib/zen/package.rb +312 -201
  88. data/lib/zen/package/all.rb +4 -3
  89. data/lib/zen/package/categories/lib/categories.rb +29 -41
  90. data/lib/zen/package/categories/lib/categories/controller/categories.rb +185 -130
  91. data/lib/zen/package/categories/lib/categories/controller/category_groups.rb +172 -102
  92. data/lib/zen/package/categories/lib/categories/helper/category.rb +4 -9
  93. data/lib/zen/package/categories/lib/categories/helper/category_frontend.rb +86 -0
  94. data/lib/zen/package/categories/lib/categories/language/en/categories.rb +40 -0
  95. data/lib/zen/package/categories/lib/categories/language/en/category_groups.rb +39 -0
  96. data/lib/zen/package/categories/lib/categories/language/nl/categories.rb +42 -0
  97. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.rb +42 -0
  98. data/lib/zen/package/categories/lib/categories/model/category.rb +21 -25
  99. data/lib/zen/package/categories/lib/categories/model/category_group.rb +21 -15
  100. data/lib/zen/package/categories/lib/categories/view/admin/categories/form.xhtml +25 -26
  101. data/lib/zen/package/categories/lib/categories/view/admin/categories/index.xhtml +24 -24
  102. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/form.xhtml +18 -20
  103. data/lib/zen/package/categories/lib/categories/view/admin/category-groups/index.xhtml +21 -18
  104. data/lib/zen/package/comments/lib/comments.rb +30 -50
  105. data/lib/zen/package/comments/lib/comments/anti_spam.rb +138 -0
  106. data/lib/zen/package/comments/lib/comments/controller/comments.rb +159 -92
  107. data/lib/zen/package/comments/lib/comments/controller/comments_form.rb +122 -34
  108. data/lib/zen/package/comments/lib/comments/helper/comment.rb +0 -3
  109. data/lib/zen/package/comments/lib/comments/helper/comment_frontend.rb +90 -0
  110. data/lib/zen/package/comments/lib/comments/language/en/comments.rb +57 -0
  111. data/lib/zen/package/comments/lib/comments/language/nl/comments.rb +61 -0
  112. data/lib/zen/package/comments/lib/comments/model/comment.rb +147 -49
  113. data/lib/zen/package/comments/lib/comments/model/comment_status.rb +0 -2
  114. data/lib/zen/package/comments/lib/comments/view/admin/comments/form.xhtml +37 -40
  115. data/lib/zen/package/comments/lib/comments/view/admin/comments/index.xhtml +23 -42
  116. data/lib/zen/package/comments/migrations/1308774099_comment_status.rb +12 -4
  117. data/lib/zen/package/comments/migrations/1313851786_remove_defensio_signature.rb +11 -0
  118. data/lib/zen/package/custom_fields/lib/custom_fields.rb +40 -43
  119. data/lib/zen/package/custom_fields/lib/custom_fields/blue_form_parameters.rb +72 -17
  120. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_groups.rb +154 -118
  121. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_field_types.rb +147 -90
  122. data/lib/zen/package/custom_fields/lib/custom_fields/controller/custom_fields.rb +161 -131
  123. data/lib/zen/package/custom_fields/lib/custom_fields/helper/custom_field.rb +4 -9
  124. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.rb +42 -0
  125. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.rb +51 -0
  126. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.rb +60 -0
  127. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.rb +41 -0
  128. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.rb +49 -0
  129. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.rb +61 -0
  130. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field.rb +18 -23
  131. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_group.rb +20 -19
  132. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_method.rb +1 -3
  133. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_type.rb +19 -9
  134. data/lib/zen/package/custom_fields/lib/custom_fields/model/custom_field_value.rb +18 -15
  135. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/form.xhtml +18 -18
  136. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-groups/index.xhtml +30 -24
  137. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/form.xhtml +15 -10
  138. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-field-types/index.xhtml +24 -19
  139. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/form.xhtml +18 -13
  140. data/lib/zen/package/custom_fields/lib/custom_fields/view/admin/custom-fields/index.xhtml +30 -20
  141. data/lib/zen/package/extensions/lib/extensions.rb +20 -0
  142. data/lib/zen/package/extensions/lib/extensions/controller/extensions.rb +41 -0
  143. data/lib/zen/package/extensions/lib/extensions/language/en/extensions.rb +23 -0
  144. data/lib/zen/package/extensions/lib/extensions/language/nl/extensions.rb +25 -0
  145. data/lib/zen/package/extensions/lib/extensions/view/admin/extensions/index.xhtml +86 -0
  146. data/lib/zen/package/menu.rb +109 -0
  147. data/lib/zen/package/menus/lib/menus.rb +25 -34
  148. data/lib/zen/package/menus/lib/menus/controller/menu_items.rb +143 -107
  149. data/lib/zen/package/menus/lib/menus/controller/menus.rb +166 -115
  150. data/lib/zen/package/menus/lib/menus/helper/menu.rb +2 -8
  151. data/lib/zen/package/menus/lib/menus/helper/menu_frontend.rb +114 -0
  152. data/lib/zen/package/menus/lib/menus/language/en/menu_items.rb +48 -0
  153. data/lib/zen/package/menus/lib/menus/language/en/menus.rb +48 -0
  154. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.rb +48 -0
  155. data/lib/zen/package/menus/lib/menus/language/nl/menus.rb +50 -0
  156. data/lib/zen/package/menus/lib/menus/model/menu.rb +24 -17
  157. data/lib/zen/package/menus/lib/menus/model/menu_item.rb +37 -13
  158. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/form.xhtml +32 -25
  159. data/lib/zen/package/menus/lib/menus/view/admin/menu-items/index.xhtml +23 -17
  160. data/lib/zen/package/menus/lib/menus/view/admin/menus/form.xhtml +31 -26
  161. data/lib/zen/package/menus/lib/menus/view/admin/menus/index.xhtml +20 -22
  162. data/lib/zen/package/sections/lib/sections.rb +25 -68
  163. data/lib/zen/package/sections/lib/sections/controller/section_entries.rb +178 -138
  164. data/lib/zen/package/sections/lib/sections/controller/sections.rb +173 -140
  165. data/lib/zen/package/sections/lib/sections/helper/section.rb +3 -6
  166. data/lib/zen/package/sections/lib/sections/helper/section_frontend.rb +146 -0
  167. data/lib/zen/package/sections/lib/sections/language/en/section_entries.rb +50 -0
  168. data/lib/zen/package/sections/lib/sections/language/en/sections.rb +55 -0
  169. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.rb +50 -0
  170. data/lib/zen/package/sections/lib/sections/language/nl/sections.rb +55 -0
  171. data/lib/zen/package/sections/lib/sections/model/section.rb +36 -36
  172. data/lib/zen/package/sections/lib/sections/model/section_entry.rb +52 -59
  173. data/lib/zen/package/sections/lib/sections/model/section_entry_status.rb +2 -2
  174. data/lib/zen/package/sections/lib/sections/view/admin/form.xhtml +24 -21
  175. data/lib/zen/package/sections/lib/sections/view/admin/index.xhtml +24 -26
  176. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/form.xhtml +33 -31
  177. data/lib/zen/package/sections/lib/sections/view/admin/section-entries/index.xhtml +24 -25
  178. data/lib/zen/package/sections/migrations/1308672298_use_id_for_default_section.rb +14 -10
  179. data/lib/zen/package/sections/migrations/1308813320_section_entry_statuses.rb +12 -6
  180. data/lib/zen/package/settings/lib/settings.rb +25 -120
  181. data/lib/zen/package/settings/lib/settings/blue_form_parameters.rb +157 -0
  182. data/lib/zen/package/settings/lib/settings/controller/settings.rb +94 -69
  183. data/lib/zen/package/settings/lib/settings/language/en/settings.rb +41 -0
  184. data/lib/zen/package/settings/lib/settings/language/nl/settings.rb +41 -0
  185. data/lib/zen/package/settings/lib/settings/model/setting.rb +0 -2
  186. data/lib/zen/package/settings/lib/settings/setting.rb +379 -0
  187. data/lib/zen/package/settings/lib/settings/setting_groups.rb +11 -0
  188. data/lib/zen/package/settings/lib/settings/settings.rb +83 -0
  189. data/lib/zen/package/settings/lib/settings/settings_group.rb +84 -0
  190. data/lib/zen/package/settings/lib/settings/singleton_methods.rb +35 -0
  191. data/lib/zen/package/settings/lib/settings/view/admin/settings/index.xhtml +15 -57
  192. data/lib/zen/package/settings/migrations/1321197919_remove_unused_columns.rb +17 -0
  193. data/lib/zen/package/users/lib/users.rb +51 -36
  194. data/lib/zen/package/users/lib/users/controller/user_groups.rb +133 -98
  195. data/lib/zen/package/users/lib/users/controller/users.rb +253 -136
  196. data/lib/zen/package/users/lib/users/helper/access.rb +102 -0
  197. data/lib/zen/package/users/lib/users/helper/acl.rb +113 -0
  198. data/lib/zen/package/users/lib/users/helper/users.rb +41 -24
  199. data/lib/zen/package/users/lib/users/language/en/permissions.rb +16 -0
  200. data/lib/zen/package/users/lib/users/language/en/user_groups.rb +39 -0
  201. data/lib/zen/package/users/lib/users/language/en/users.rb +73 -0
  202. data/lib/zen/package/users/lib/users/language/nl/permissions.rb +16 -0
  203. data/lib/zen/package/users/lib/users/language/nl/user_groups.rb +41 -0
  204. data/lib/zen/package/users/lib/users/language/nl/users.rb +74 -0
  205. data/lib/zen/package/users/lib/users/model/permission.rb +28 -0
  206. data/lib/zen/package/users/lib/users/model/user.rb +104 -65
  207. data/lib/zen/package/users/lib/users/model/user_group.rb +28 -24
  208. data/lib/zen/package/users/lib/users/model/user_status.rb +27 -0
  209. data/lib/zen/package/users/lib/users/public/admin/css/users/permissions.css +22 -0
  210. data/lib/zen/package/users/lib/users/public/admin/js/users/permissions.js +33 -0
  211. data/lib/zen/package/users/lib/users/settings.rb +19 -0
  212. data/lib/zen/package/users/lib/users/view/admin/user-groups/form.xhtml +58 -28
  213. data/lib/zen/package/users/lib/users/view/admin/user-groups/index.xhtml +19 -15
  214. data/lib/zen/package/users/lib/users/view/admin/users/form.xhtml +93 -62
  215. data/lib/zen/package/users/lib/users/view/admin/users/index.xhtml +23 -36
  216. data/lib/zen/package/users/lib/users/view/admin/users/login.xhtml +13 -6
  217. data/lib/zen/package/users/lib/users/view/admin/users/permissions.xhtml +33 -0
  218. data/lib/zen/package/users/lib/users/view/admin/users/register.xhtml +52 -0
  219. data/lib/zen/package/users/migrations/1313786058_update_default_date.rb +41 -0
  220. data/lib/zen/package/users/migrations/1316432327_permissions.rb +36 -0
  221. data/lib/zen/package/users/migrations/1320272365_status_ids.rb +67 -0
  222. data/lib/zen/public/admin/css/zen/buttons.css +3 -11
  223. data/lib/zen/public/admin/css/zen/datepicker.css +23 -13
  224. data/lib/zen/public/admin/css/zen/editor.css +6 -14
  225. data/lib/zen/public/admin/css/zen/forms.css +19 -12
  226. data/lib/zen/public/admin/css/zen/general.css +22 -18
  227. data/lib/zen/public/admin/css/zen/grid.css +1 -20
  228. data/lib/zen/public/admin/css/zen/layout.css +26 -11
  229. data/lib/zen/public/admin/css/zen/messages.css +3 -10
  230. data/lib/zen/public/admin/css/zen/reset.css +13 -15
  231. data/lib/zen/public/admin/css/zen/tables.css +8 -10
  232. data/lib/zen/public/admin/css/zen/tabs.css +2 -10
  233. data/lib/zen/public/admin/css/zen/window.css +2 -8
  234. data/lib/zen/public/admin/js/vendor/datepicker.js +540 -240
  235. data/lib/zen/public/admin/js/vendor/mootools/core.js +273 -283
  236. data/lib/zen/public/admin/js/vendor/mootools/more.js +131 -136
  237. data/lib/zen/public/admin/js/zen/index.js +8 -14
  238. data/lib/zen/public/admin/js/zen/lib/editor.js +36 -33
  239. data/lib/zen/public/admin/js/zen/lib/editor/markdown.js +0 -6
  240. data/lib/zen/public/admin/js/zen/lib/editor/textile.js +0 -6
  241. data/lib/zen/public/admin/js/zen/lib/html_table.js +0 -5
  242. data/lib/zen/public/admin/js/zen/lib/tabs.js +22 -79
  243. data/lib/zen/public/admin/js/zen/lib/window.js +12 -22
  244. data/lib/zen/spec/bacon/color_output.rb +1 -1
  245. data/lib/zen/spec/helper.rb +6 -11
  246. data/lib/zen/spec/simplecov.rb +3 -3
  247. data/lib/zen/task.rb +0 -1
  248. data/lib/zen/task/build.rake +46 -26
  249. data/lib/zen/task/clean.rake +14 -7
  250. data/lib/zen/task/db.rake +31 -29
  251. data/lib/zen/task/package.rake +19 -23
  252. data/lib/zen/task/proto.rake +3 -5
  253. data/lib/zen/task/setup.rake +4 -0
  254. data/lib/zen/task/test.rake +31 -6
  255. data/lib/zen/task/theme.rake +13 -19
  256. data/lib/zen/theme.rb +377 -52
  257. data/lib/zen/validation.rb +22 -30
  258. data/lib/zen/version.rb +1 -2
  259. data/lib/zen/view/bottom.xhtml +9 -1
  260. data/lib/zen/view/head.xhtml +1 -1
  261. data/lib/zen/view/main.xhtml +1 -1
  262. data/lib/zen/view/search.xhtml +9 -0
  263. data/proto/app/Rakefile +0 -1
  264. data/proto/app/app.rb +21 -16
  265. data/proto/app/config/config.rb.erb +41 -0
  266. data/proto/app/config/{database.rb → database.rb.erb} +17 -14
  267. data/proto/app/config/middlewares.rb +1 -1
  268. data/proto/app/theme/default/index.xhtml +25 -0
  269. data/proto/app/theme/theme.rb +19 -0
  270. data/proto/app/{log/database/dev → tmp}/.gitkeep +0 -0
  271. data/proto/migration.rb +3 -5
  272. data/proto/rack/thin.yml +41 -0
  273. data/proto/rack/unicorn.rb +38 -0
  274. data/spec/Rakefile +15 -11
  275. data/spec/fixtures/zen/helper/controller.rb +13 -0
  276. data/spec/fixtures/zen/helper/locale.rb +7 -0
  277. data/spec/fixtures/zen/helper/message.rb +0 -4
  278. data/spec/fixtures/zen/language.rb +31 -0
  279. data/spec/fixtures/zen/language/en/spec.rb +11 -0
  280. data/spec/fixtures/zen/language/nl/spec.rb +11 -0
  281. data/spec/fixtures/zen/package.rb +0 -10
  282. data/spec/fixtures/zen/package/categories/helper/category_frontend.rb +16 -0
  283. data/spec/fixtures/zen/package/comments/helper/comment_frontend.rb +16 -0
  284. data/spec/fixtures/zen/package/sections/helper/section_frontend.rb +16 -0
  285. data/spec/fixtures/zen/package/settings/controller/settings.rb +17 -0
  286. data/spec/fixtures/zen/package/users/helper/access.rb +18 -0
  287. data/spec/fixtures/zen/package/users/helper/acl.rb +23 -0
  288. data/spec/fixtures/zen/theme/{default-section → default}/index.xhtml +0 -0
  289. data/spec/helper.rb +12 -27
  290. data/{proto/app/log/database/live → spec/public}/.gitkeep +0 -0
  291. data/spec/zen/controller/admin_controller.rb +5 -6
  292. data/spec/zen/controller/main_controller.rb +29 -35
  293. data/spec/zen/controller/preview.rb +9 -10
  294. data/spec/zen/event.rb +44 -0
  295. data/spec/zen/helper/breadcrumb.rb +4 -5
  296. data/spec/zen/helper/controller.rb +21 -0
  297. data/spec/zen/helper/locale.rb +25 -0
  298. data/spec/zen/helper/message.rb +4 -11
  299. data/spec/zen/helper/theme.rb +11 -14
  300. data/spec/zen/language.rb +48 -22
  301. data/spec/zen/markup.rb +39 -0
  302. data/spec/zen/package.rb +48 -11
  303. data/spec/zen/package/categories/controller/categories.rb +99 -45
  304. data/spec/zen/package/categories/controller/category_groups.rb +109 -33
  305. data/spec/zen/package/categories/helper/category.rb +19 -32
  306. data/spec/zen/package/categories/helper/category_frontend.rb +61 -0
  307. data/spec/zen/package/comments/anti_spam.rb +50 -0
  308. data/spec/zen/package/comments/controller/comments.rb +121 -61
  309. data/spec/zen/package/comments/controller/comments_form.rb +120 -94
  310. data/spec/zen/package/comments/helper/comment.rb +13 -13
  311. data/spec/zen/package/comments/helper/comment_frontend.rb +92 -0
  312. data/spec/zen/package/custom_fields/blue_form_parameters.rb +50 -50
  313. data/spec/zen/package/custom_fields/controller/custom_field_groups.rb +135 -43
  314. data/spec/zen/package/custom_fields/controller/custom_field_types.rb +153 -48
  315. data/spec/zen/package/custom_fields/controller/custom_fields.rb +130 -51
  316. data/spec/zen/package/custom_fields/helper/custom_field.rb +8 -8
  317. data/spec/zen/package/extensions/controller/extensions.rb +38 -0
  318. data/spec/zen/package/menus/controller/menu_items.rb +121 -42
  319. data/spec/zen/package/menus/controller/menus.rb +125 -38
  320. data/spec/zen/package/menus/helper/menu.rb +26 -26
  321. data/spec/zen/package/menus/helper/menu_frontend.rb +104 -0
  322. data/spec/zen/package/sections/controller/section_entries.rb +145 -89
  323. data/spec/zen/package/sections/controller/sections.rb +130 -35
  324. data/spec/zen/package/sections/helper/section.rb +27 -38
  325. data/spec/zen/package/sections/helper/section_frontend.rb +160 -0
  326. data/spec/zen/package/settings/controller/settings.rb +73 -8
  327. data/spec/zen/package/settings/settings.rb +119 -0
  328. data/spec/zen/package/users/controller/user_groups.rb +134 -34
  329. data/spec/zen/package/users/controller/users.rb +189 -44
  330. data/spec/zen/package/users/helper/access.rb +29 -0
  331. data/spec/zen/package/users/helper/acl.rb +46 -0
  332. data/spec/zen/package/users/helper/users.rb +20 -64
  333. data/spec/zen/theme.rb +7 -9
  334. data/spec/zen/validation.rb +1 -2
  335. data/zen.gemspec +25 -22
  336. metadata +303 -222
  337. data/lib/zen/asset.rb +0 -292
  338. data/lib/zen/bin/runner.rb +0 -118
  339. data/lib/zen/error/language_error.rb +0 -10
  340. data/lib/zen/error/package_error.rb +0 -10
  341. data/lib/zen/error/plugin_error.rb +0 -10
  342. data/lib/zen/error/theme_error.rb +0 -10
  343. data/lib/zen/error/validation_error.rb +0 -10
  344. data/lib/zen/helper/acl.rb +0 -182
  345. data/lib/zen/helper/blue_form_vendor.rb +0 -689
  346. data/lib/zen/language/en/zen_general.yml +0 -25
  347. data/lib/zen/language/en/zen_models.yml +0 -13
  348. data/lib/zen/language/nl/zen_general.yml +0 -25
  349. data/lib/zen/language/nl/zen_models.yml +0 -13
  350. data/lib/zen/model/settings.rb +0 -78
  351. data/lib/zen/package/base.rb +0 -62
  352. data/lib/zen/package/categories/lib/categories/language/en/categories.yml +0 -36
  353. data/lib/zen/package/categories/lib/categories/language/en/category_groups.yml +0 -34
  354. data/lib/zen/package/categories/lib/categories/language/nl/categories.yml +0 -40
  355. data/lib/zen/package/categories/lib/categories/language/nl/category_groups.yml +0 -34
  356. data/lib/zen/package/categories/lib/categories/plugin/categories.rb +0 -141
  357. data/lib/zen/package/comments/lib/comments/language/en/comments.yml +0 -48
  358. data/lib/zen/package/comments/lib/comments/language/nl/comments.yml +0 -50
  359. data/lib/zen/package/comments/lib/comments/plugin/anti_spam.rb +0 -156
  360. data/lib/zen/package/comments/lib/comments/plugin/comments.rb +0 -115
  361. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_groups.yml +0 -33
  362. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_field_types.yml +0 -40
  363. data/lib/zen/package/custom_fields/lib/custom_fields/language/en/custom_fields.yml +0 -54
  364. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_groups.yml +0 -33
  365. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_field_types.yml +0 -40
  366. data/lib/zen/package/custom_fields/lib/custom_fields/language/nl/custom_fields.yml +0 -54
  367. data/lib/zen/package/menus/lib/menus/language/en/menu_items.yml +0 -41
  368. data/lib/zen/package/menus/lib/menus/language/en/menus.yml +0 -40
  369. data/lib/zen/package/menus/lib/menus/language/nl/menu_items.yml +0 -41
  370. data/lib/zen/package/menus/lib/menus/language/nl/menus.yml +0 -40
  371. data/lib/zen/package/menus/lib/menus/plugin/menus.rb +0 -152
  372. data/lib/zen/package/sections/lib/sections/language/en/section_entries.yml +0 -44
  373. data/lib/zen/package/sections/lib/sections/language/en/sections.yml +0 -48
  374. data/lib/zen/package/sections/lib/sections/language/nl/section_entries.yml +0 -44
  375. data/lib/zen/package/sections/lib/sections/language/nl/sections.yml +0 -48
  376. data/lib/zen/package/sections/lib/sections/plugin/section_entries.rb +0 -244
  377. data/lib/zen/package/sections/lib/sections/plugin/sections.rb +0 -87
  378. data/lib/zen/package/settings/lib/settings/language/en/settings.yml +0 -36
  379. data/lib/zen/package/settings/lib/settings/language/nl/settings.yml +0 -37
  380. data/lib/zen/package/settings/lib/settings/plugin/group_base.rb +0 -39
  381. data/lib/zen/package/settings/lib/settings/plugin/setting_base.rb +0 -133
  382. data/lib/zen/package/settings/lib/settings/plugin/settings.rb +0 -251
  383. data/lib/zen/package/users/lib/users/controller/access_rules.rb +0 -284
  384. data/lib/zen/package/users/lib/users/language/en/access_rules.yml +0 -38
  385. data/lib/zen/package/users/lib/users/language/en/user_groups.yml +0 -32
  386. data/lib/zen/package/users/lib/users/language/en/users.yml +0 -57
  387. data/lib/zen/package/users/lib/users/language/nl/access_rules.yml +0 -38
  388. data/lib/zen/package/users/lib/users/language/nl/user_groups.yml +0 -32
  389. data/lib/zen/package/users/lib/users/language/nl/users.yml +0 -57
  390. data/lib/zen/package/users/lib/users/model/access_rule.rb +0 -42
  391. data/lib/zen/package/users/lib/users/public/admin/js/users/access_rules.js +0 -65
  392. data/lib/zen/package/users/lib/users/public/admin/js/users/lib/access_rules.js +0 -49
  393. data/lib/zen/package/users/lib/users/view/admin/access-rules/form.xhtml +0 -120
  394. data/lib/zen/package/users/lib/users/view/admin/access-rules/index.xhtml +0 -102
  395. data/lib/zen/plugin.rb +0 -182
  396. data/lib/zen/plugin/base.rb +0 -46
  397. data/lib/zen/plugin/helper.rb +0 -47
  398. data/lib/zen/plugin/markup/lib/markup.rb +0 -14
  399. data/lib/zen/plugin/markup/lib/markup/language/en/markup.yml +0 -6
  400. data/lib/zen/plugin/markup/lib/markup/markup.rb +0 -165
  401. data/lib/zen/public/admin/js/zen/lib/asset.js +0 -111
  402. data/lib/zen/task/plugin.rake +0 -18
  403. data/lib/zen/theme/base.rb +0 -65
  404. data/proto/app/config/config.rb +0 -18
  405. data/spec/fixtures/zen/language/en/spec.yml +0 -10
  406. data/spec/fixtures/zen/language/nl/spec.yml +0 -7
  407. data/spec/fixtures/zen/package/settings/plugin/settings.rb +0 -20
  408. data/spec/zen/asset.rb +0 -97
  409. data/spec/zen/bin/create.rb +0 -89
  410. data/spec/zen/bin/runner.rb +0 -47
  411. data/spec/zen/helper/acl.rb +0 -149
  412. data/spec/zen/package/categories/plugin/categories.rb +0 -92
  413. data/spec/zen/package/comments/plugin/anti_spam.rb +0 -59
  414. data/spec/zen/package/comments/plugin/comments.rb +0 -107
  415. data/spec/zen/package/menus/plugin/menus.rb +0 -120
  416. data/spec/zen/package/sections/plugin/section_entries.rb +0 -161
  417. data/spec/zen/package/sections/plugin/sections.rb +0 -75
  418. data/spec/zen/package/settings/plugin/settings.rb +0 -33
  419. data/spec/zen/package/users/controller/access_rules.rb +0 -90
  420. data/spec/zen/plugin.rb +0 -64
  421. data/spec/zen/plugin/helper.rb +0 -11
  422. data/spec/zen/plugin/markup.rb +0 -44
@@ -1,80 +1,92 @@
1
- #:nodoc:
2
1
  module Sections
3
2
  #:nodoc:
4
3
  module Controller
5
4
  ##
6
- # Section entries can be seen as blog entries, products, all sorts of things.
7
- # Each section belongs to a section and can't be created without one.
5
+ # Section entries are collections of custom field values as well as some
6
+ # meta data related to a section. In a typical application a blog can be
7
+ # seen as a section and blog articles would be section entries.
8
+ #
9
+ # Section entries can be managed by going to a section and clicking the link
10
+ # "Manage entries". This will bring you to an overview of all existing
11
+ # entries that looks like the one in the image below.
12
+ #
13
+ # ![Section Entries](../../_static/sections/entries.png)
14
+ #
15
+ # Editing an entry can be done by clicking on it's name, creating a new one
16
+ # can be done by clicking on the "Add section entry" button. In both cases
17
+ # you'll see a form that looks similar to the one displayed in the images
18
+ # below.
19
+ #
20
+ # ![Edit Entry](../../_static/sections/edit_entry.png)
21
+ # ![Categories](../../_static/sections/edit_entry_categories.png)
22
+ # ![General](../../_static/sections/edit_entry_general.png)
23
+ # ![Meta](../../_static/sections/edit_entry_meta.png)
24
+ #
25
+ # In the images above there are four tabs displayed. "Basic", "Categories",
26
+ # "General" and "Meta". The first two are always available, the last two
27
+ # tabs are tabs specific to the custom field groups assigned to a section
28
+ # the entry belongs to. This means that you might have other tabs depending
29
+ # on the names of your field groups.
30
+ #
31
+ # Regardless of what field groups and categories you have assigned you can
32
+ # always specify the following fields:
33
+ #
34
+ # * **Title** (required): the title of your entry.
35
+ # * **Slug**: a URL friendly version of the title. If no slug is specified
36
+ # one will be generated manually.
37
+ # * **Created at**: The date on which the entry was created. This field is
38
+ # filled in automatically when an entry is created.
39
+ # * **Author** (required): the name of the person who wrote the entry.
40
+ # * **Status** (required): the status of an entry. If an entry has a status
41
+ # other than "Published" it will not be displayed when using the
42
+ # sectio_entries plugin.
43
+ #
44
+ # Depending on whether or not you have category and field groups assigned
45
+ # you can also use these fields. In the images above there's a "Body" field
46
+ # which is required and converts the text to HTML using Markdown.
47
+ #
48
+ # ## Permissions
49
+ #
50
+ # This controller uses the following permissions:
51
+ #
52
+ # * show_section_entry
53
+ # * new_section_entry
54
+ # * edit_section_entry
55
+ # * delete_section_entry
56
+ #
57
+ # ## Events
58
+ #
59
+ # All events in this controller receive an instance of
60
+ # {Sections::Model::SectionEntry}. The event ``after_delete_section_entry``
61
+ # receives an instance of this model that has already been destroyed using
62
+ # ``#destroy()``.
8
63
  #
9
- # @author Yorick Peterse
10
64
  # @since 0.1
65
+ # @map /admin/section-entries
66
+ # @event before_new_section_entry
67
+ # @event after_new_section_entry
68
+ # @event before_edit_section_entry
69
+ # @event after_edit_section_entry
70
+ # @event before_delete_section_entry
71
+ # @event after_delete_section_entry
11
72
  #
12
73
  class SectionEntries < Zen::Controller::AdminController
13
- include ::Sections::Model
14
-
15
- map '/admin/section-entries'
74
+ map '/admin/section-entries'
16
75
  helper :section
76
+ title 'section_entries.titles.%s'
17
77
 
18
- # Load all required Javascript files
19
- javascript(
20
- [
21
- 'zen/lib/tabs',
22
- 'zen/lib/editor',
23
- 'zen/lib/editor/markdown',
24
- 'zen/lib/editor/textile',
25
- 'vendor/datepicker'
26
- ],
27
- :method => [:edit, :new]
28
- )
29
-
30
- # Load all required CSS files
31
- stylesheet(['zen/datepicker'], :method => [:edit, :new])
32
-
33
- before_all do
34
- csrf_protection(:save, :delete) do
35
- respond(lang('zen_general.errors.csrf'), 403)
36
- end
37
- end
78
+ load_asset_group [:tabs, :editor, :datepicker], [:edit, :new]
79
+ csrf_protection :save, :delete
38
80
 
39
81
  ##
40
- # Constructor method, called upon initialization. It's used to set the
41
- # URL to which forms send their data and load the language pack.
42
- #
43
- # This method loads the following language files:
44
- #
45
- # * sections
46
- # * section_entries
47
- # * zen_models
48
- #
49
- # @author Yorick Peterse
50
- # @since 0.1
51
- #
52
- def initialize
53
- super
54
-
55
- Zen::Language.load('section_entries')
56
- Zen::Language.load('sections')
57
-
58
- # Set the page title
59
- if !action.method.nil?
60
- method = action.method.to_sym
61
- @page_title = lang("section_entries.titles.#{method}") rescue nil
62
- end
63
- end
64
-
65
- ##]
66
82
  # Show an overview of all entries for the current section.
67
83
  #
68
- # This method requires the following permissions:
69
- #
70
- # * read
71
- #
72
- # @author Yorick Peterse
73
- # @param [Fixnum] section_id The ID of the current section.
74
- # @since 0.1
84
+ # @param [Fixnum] section_id The ID of the current section.
85
+ # @since 0.1
86
+ # @permission show_section_entry
75
87
  #
76
88
  def index(section_id)
77
- require_permissions(:read)
89
+ authorize_user!(:show_section_entry)
78
90
 
79
91
  set_breadcrumbs(
80
92
  Sections.a(lang('sections.titles.index'), :index),
@@ -83,25 +95,28 @@ module Sections
83
95
 
84
96
  section = validate_section(section_id)
85
97
  @section_id = section_id
86
- @entries = SectionEntry.filter(:section_id => section_id)
87
- @entries = paginate(@entries)
98
+ @entries = search do |query|
99
+ ::Sections::Model::SectionEntry.search(query) \
100
+ .filter(:section_id => section_id) \
101
+ .order(:id.asc)
102
+ end
103
+
104
+ @entries ||= ::Sections::Model::SectionEntry \
105
+ .filter(:section_id => section_id) \
106
+ .order(:id.asc)
107
+
108
+ @entries = paginate(@entries)
88
109
  end
89
110
 
90
111
  ##
91
- # Show a form that lets the user edit an existing section entry.
92
- #
93
- # This method requires the following permissions:
94
- #
95
- # * read
96
- # * update
112
+ # Show a form that lets the user create a new section entry.
97
113
  #
98
- # @author Yorick Peterse
99
- # @param [Fixnum] section_id The ID of the current section.
100
- # @param [Fixnum] entry_id The ID of the current section entry.
101
- # @since 0.1
114
+ # @param [Fixnum] section_id The ID of the current section.
115
+ # @since 0.1
116
+ # @permission new_section_entry
102
117
  #
103
- def edit(section_id, entry_id)
104
- require_permissions(:read, :update)
118
+ def new(section_id)
119
+ authorize_user!(:new_section_entry)
105
120
 
106
121
  set_breadcrumbs(
107
122
  Sections.a(
@@ -110,18 +125,21 @@ module Sections
110
125
  SectionEntries.a(
111
126
  lang('section_entries.titles.index'), :index, section_id
112
127
  ),
113
- lang('section_entries.titles.edit')
128
+ lang('section_entries.titles.new')
114
129
  )
115
130
 
116
131
  validate_section(section_id)
117
132
 
133
+ @section_id = section_id
134
+
118
135
  if flash[:form_data]
119
136
  @entry = flash[:form_data]
120
137
  else
121
- @entry = validate_section_entry(entry_id, section_id)
138
+ @entry = ::Sections::Model::SectionEntry.new(
139
+ :section_id => section_id
140
+ )
122
141
  end
123
142
 
124
- @section_id = section_id
125
143
  @possible_categories = @entry.possible_categories
126
144
  @custom_fields_hash = @entry.custom_fields_hash
127
145
 
@@ -129,19 +147,15 @@ module Sections
129
147
  end
130
148
 
131
149
  ##
132
- # Show a form that lets the user create a new section entry.
133
- #
134
- # This method requires the following permissions:
135
- #
136
- # * read
137
- # * create
150
+ # Show a form that lets the user edit an existing section entry.
138
151
  #
139
- # @author Yorick Peterse
140
- # @param [Fixnum] section_id The ID of the current section.
141
- # @since 0.1
152
+ # @param [Fixnum] section_id The ID of the current section.
153
+ # @param [Fixnum] entry_id The ID of the current section entry.
154
+ # @since 0.1
155
+ # @permission edit_section_entry
142
156
  #
143
- def new(section_id)
144
- require_permissions(:read, :create)
157
+ def edit(section_id, entry_id)
158
+ authorize_user!(:edit_section_entry)
145
159
 
146
160
  set_breadcrumbs(
147
161
  Sections.a(
@@ -150,13 +164,18 @@ module Sections
150
164
  SectionEntries.a(
151
165
  lang('section_entries.titles.index'), :index, section_id
152
166
  ),
153
- lang('section_entries.titles.new')
167
+ lang('section_entries.titles.edit')
154
168
  )
155
169
 
156
170
  validate_section(section_id)
157
171
 
172
+ if flash[:form_data]
173
+ @entry = flash[:form_data]
174
+ else
175
+ @entry = validate_section_entry(entry_id, section_id)
176
+ end
177
+
158
178
  @section_id = section_id
159
- @entry = SectionEntry.new(:section_id => section_id)
160
179
  @possible_categories = @entry.possible_categories
161
180
  @custom_fields_hash = @entry.custom_fields_hash
162
181
 
@@ -164,21 +183,16 @@ module Sections
164
183
  end
165
184
 
166
185
  ##
167
- # Method used for processing the form data and redirecting the user back
168
- # to the proper URL. Based on the value of a hidden field named "id" we'll
169
- # determine if the data will be used to create a new section or to update
170
- # an existing one.
171
- #
172
- # This method requires the following permissions:
186
+ # Saves any changes made to an existing entry and all the field values or
187
+ # creates a new entry.
173
188
  #
174
- # * create
175
- # * save
176
- #
177
- # @author Yorick Peterse
178
- # @since 0.1
179
- # @todo The way this method handles the creation of field values might
180
- # require some patches as it executes quite a few queries. I'll keep it
181
- # as it is for now.
189
+ # @since 0.1
190
+ # @event before_new_section_entry
191
+ # @event after_new_section_entry
192
+ # @event before_edit_section_entry
193
+ # @event after_edit_section_entry
194
+ # @permission edit_section_entry (when editing an entry)
195
+ # @permission new_section_entry (when creating a new entry)
182
196
  #
183
197
  def save
184
198
  section_id = request.params['section_id']
@@ -186,48 +200,70 @@ module Sections
186
200
  validate_section(section_id)
187
201
 
188
202
  if request.params['id'] and !request.params['id'].empty?
189
- require_permissions(:update)
203
+ authorize_user!(:edit_section_entry)
190
204
 
191
- @entry = SectionEntry[request.params['id']]
192
- save_action = :save
205
+ entry = ::Sections::Model::SectionEntry[request.params['id']]
206
+ save_action = :save
207
+ before_event = :before_edit_section_entry
208
+ after_event = :after_edit_section_entry
193
209
 
194
210
  # Section entries aren't considered to be updated whenever a custom
195
211
  # field value is modified, this solves that problem
196
212
  request.params['updated_at'] = Time.new
197
213
  else
198
- require_permissions(:create)
214
+ authorize_user!(:new_section_entry)
199
215
 
200
- @entry = SectionEntry.new(:section_id => section_id)
201
- save_action = :new
216
+ entry = ::Sections::Model::SectionEntry.new(:section_id => section_id)
217
+ before_event = :before_new_section_entry
218
+ after_event = :after_new_section_entry
219
+ save_action = :new
202
220
  end
203
221
 
204
- request.params.delete('slug') if request.params['slug'].empty?
205
222
  request.params.delete('id')
206
223
 
207
- flash_success = lang("section_entries.success.#{save_action}")
208
- flash_error = lang("section_entries.errors.#{save_action}")
209
- custom_fields = @entry.custom_fields
224
+ success = lang("section_entries.success.#{save_action}")
225
+ error = lang("section_entries.errors.#{save_action}")
226
+ custom_fields = entry.custom_fields
210
227
  field_errors = {}
211
228
  field_values = {}
212
229
 
213
- @entry.custom_field_values.each do |value|
230
+ entry.custom_field_values.each do |value|
214
231
  field_values[value.custom_field_id] = value
215
232
  end
216
233
 
217
234
  begin
218
235
  Zen.database.transaction do
219
236
  # Update the entry itself
220
- @entry.update(request.subset(
237
+ post_data = request.subset(
221
238
  :title,
222
239
  :created_at,
223
240
  :updated_at,
224
241
  :section_id,
225
242
  :user_id,
226
243
  :slug,
227
- :section_entry_status_id
228
- ))
244
+ :section_entry_status_id,
245
+ :category_pks
246
+ )
247
+
248
+ # Transform the dates properly
249
+ if post_data[:created_at]
250
+ post_data[:created_at] = Time.strptime(
251
+ post_data[:created_at],
252
+ date_format
253
+ )
254
+ end
229
255
 
230
- message(:success, flash_success)
256
+ if post_data[:updated_at]
257
+ post_data[:updated_at] = Time.strptime(
258
+ post_data[:updated_at],
259
+ date_format
260
+ )
261
+ end
262
+
263
+ post_data.each { |k, v| entry.send("#{k}=", v) }
264
+ Zen::Event.call(before_event, entry)
265
+
266
+ entry.save
231
267
 
232
268
  # Update/add all the custom field values
233
269
  custom_fields.each do |field|
@@ -249,7 +285,7 @@ module Sections
249
285
  field_values[field.id].update(:value => request.params[key])
250
286
  # Add it
251
287
  else
252
- @entry.add_custom_field_value(
288
+ entry.add_custom_field_value(
253
289
  :custom_field_id => field.id,
254
290
  :value => request.params[key]
255
291
  )
@@ -264,34 +300,31 @@ module Sections
264
300
  # 3. Something else went wrong, god knows what.
265
301
  rescue => e
266
302
  Ramaze::Log.error(e.inspect)
267
- message(:error, flash_error)
303
+ message(:error, error)
268
304
 
269
- flash[:form_errors] = @entry.errors.merge(field_errors)
270
- flash[:form_data] = @entry
305
+ flash[:form_errors] = entry.errors.merge(field_errors)
306
+ flash[:form_data] = entry
271
307
 
272
308
  redirect_referrer
273
309
  end
274
310
 
275
- if @entry.id
276
- redirect(SectionEntries.r(:edit, section_id, @entry.id))
277
- else
278
- redirect_referrer
279
- end
311
+ Zen::Event.call(after_event, entry)
312
+
313
+ message(:success, success)
314
+ redirect(SectionEntries.r(:edit, section_id, entry.id))
280
315
  end
281
316
 
282
317
  ##
283
318
  # Delete a set of section entries based on the supplied POST
284
319
  # field "section_entry_ids".
285
320
  #
286
- # This method requires the following permissions:
287
- #
288
- # * delete
289
- #
290
- # @author Yorick Peterse
291
- # @since 0.1
321
+ # @since 0.1
322
+ # @permission delete_section_entry
323
+ # @event before_delete_section_entry
324
+ # @event after_delete_section_entry
292
325
  #
293
326
  def delete
294
- require_permissions(:delete)
327
+ authorize_user!(:delete_section_entry)
295
328
 
296
329
  if !request.params['section_entry_ids'] \
297
330
  or request.params['section_entry_ids'].empty?
@@ -300,17 +333,24 @@ module Sections
300
333
  end
301
334
 
302
335
  request.params['section_entry_ids'].each do |id|
336
+ entry = ::Sections::Model::SectionEntry[id]
337
+
338
+ next if entry.nil?
339
+ Zen::Event.call(:before_delete_section_entry, entry)
340
+
303
341
  begin
304
- SectionEntry[id].destroy
305
- message(:success, lang('section_entries.success.delete'))
342
+ entry.destroy
306
343
  rescue => e
307
344
  Ramaze::Log.error(e.inspect)
308
345
  message(:error,lang('section_entries.errors.delete') % id)
309
346
 
310
347
  redirect_referrer
311
348
  end
349
+
350
+ Zen::Event.call(:after_delete_section_entry, entry)
312
351
  end
313
352
 
353
+ message(:success, lang('section_entries.success.delete'))
314
354
  redirect_referrer
315
355
  end
316
356
  end # SectionEntries