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,38 +1,36 @@
1
- <article>
1
+ <section>
2
2
  <header>
3
3
  <h1>#{get_breadcrumbs}</h1>
4
4
  </header>
5
-
6
- #{
7
- form_for(
8
- @category_group,
9
- :method => :post,
10
- :action => Categories::Controller::CategoryGroups.r(:save),
5
+
6
+ #{form_for(
7
+ @category_group,
8
+ :method => :post,
9
+ :action => Categories::Controller::CategoryGroups.r(:save),
11
10
  :id => :category_group_form
12
11
  ) do |f|
13
12
  f.input_hidden(:id , @category_group.id)
14
13
  f.input_hidden(:csrf_token, get_csrf_token)
15
-
14
+
16
15
  f.input_text(
17
- lang('category_groups.labels.name'),
18
- :name,
19
- :placeholder => lang('category_groups.placeholders.name'),
20
- :required => :required,
21
- :maxlength => 255
16
+ lang('category_groups.labels.name'),
17
+ :name,
18
+ :title => lang('category_groups.descriptions.name'),
19
+ :required => :required,
20
+ :maxlength => 255
22
21
  )
23
22
 
24
23
  f.textarea(
25
- lang('category_groups.labels.description'),
26
- :description,
24
+ lang('category_groups.labels.description'),
25
+ :description,
27
26
  :rows => 8
28
27
  )
29
-
28
+
30
29
  f.g.div(:class => 'button') do
31
30
  f.g.input(
32
- :type => 'submit',
31
+ :type => 'submit',
33
32
  :value => lang('category_groups.buttons.save')
34
33
  )
35
34
  end
36
- end
37
- }
38
- </article>
35
+ end}
36
+ </section>
@@ -1,4 +1,6 @@
1
- <article>
1
+ <section>
2
+ #{render_search_form(::Categories::Controller::CategoryGroups.r(:index))}
3
+
2
4
  <header>
3
5
  <h1>#{get_breadcrumbs}</h1>
4
6
  </header>
@@ -8,10 +10,11 @@
8
10
  <input type="hidden" name="csrf_token" value="#{get_csrf_token}" />
9
11
 
10
12
  <?r if !@category_groups.empty? ?>
13
+
11
14
  <table>
12
15
  <thead>
13
16
  <tr>
14
- <?r if user_authorized?([:delete]) ?>
17
+ <?r if user_authorized?(:delete_category_group) ?>
15
18
  <th class="no_sort">
16
19
  <input type="checkbox" />
17
20
  </th>
@@ -20,9 +23,7 @@
20
23
  <th>#{lang('category_groups.labels.id')}</th>
21
24
  <th>#{lang('category_groups.labels.name')}</th>
22
25
 
23
- <?r if user_authorized?(
24
- [:read], true, 'Categories::Controller::Categories'
25
- ) ?>
26
+ <?r if user_authorized?(:show_category) ?>
26
27
  <th></th>
27
28
  <?r end ?>
28
29
  </tr>
@@ -30,7 +31,7 @@
30
31
  <tbody>
31
32
  <?r @category_groups.each do |group| ?>
32
33
  <tr>
33
- <?r if user_authorized?([:delete]) ?>
34
+ <?r if user_authorized?(:delete_category_group) ?>
34
35
  <td>
35
36
  <input type="checkbox" name="category_group_ids[]"
36
37
  value="#{group.id}" />
@@ -39,19 +40,21 @@
39
40
 
40
41
  <td>#{group.id}</td>
41
42
 
42
- <?r if user_authorized?([:update]) ?>
43
+ <?r if user_authorized?(:edit_category_group) ?>
44
+
43
45
  <td>
44
46
  #{Categories::Controller::CategoryGroups.a(
45
47
  group.name, :edit, group.id
46
48
  )}
47
49
  </td>
50
+
48
51
  <?r else ?>
52
+
49
53
  <td>#{group.name}</td>
54
+
50
55
  <?r end ?>
51
56
 
52
- <?r if user_authorized?(
53
- [:read], true, 'Categories::Controller::Categories'
54
- ) ?>
57
+ <?r if user_authorized?(:show_category) ?>
55
58
  <td>
56
59
  #{Categories::Controller::Categories.a(
57
60
  lang('category_groups.labels.manage'),
@@ -60,24 +63,23 @@
60
63
  )}
61
64
  </td>
62
65
  <?r end ?>
63
-
64
66
  </tr>
65
67
  <?r end ?>
66
68
  </tbody>
67
69
  </table>
68
70
 
69
- #{
70
- if @category_groups.respond_to?(:navigation) \
71
+ #{if @category_groups.respond_to?(:navigation) \
71
72
  and @category_groups.page_count > 1
72
73
  @category_groups.navigation
73
- end
74
- }
74
+ end}
75
75
 
76
76
  <?r else ?>
77
+
77
78
  <p>#{lang('category_groups.messages.no_groups')}</p>
79
+
78
80
  <?r end ?>
79
81
 
80
- <?r if user_authorized?([:create]) ?>
82
+ <?r if user_authorized?(:new_category_group) ?>
81
83
  <div class="button">
82
84
  #{Categories::Controller::CategoryGroups.a(
83
85
  lang('category_groups.buttons.new'), :new
@@ -85,11 +87,12 @@
85
87
  </div>
86
88
  <?r end ?>
87
89
 
88
- <?r if user_authorized?([:delete]) and !@category_groups.empty? ?>
90
+ <?r if user_authorized?(:delete_category_group) \
91
+ and !@category_groups.empty? ?>
89
92
  <div class="button">
90
93
  <input type="submit"
91
94
  value="#{lang('category_groups.buttons.delete')}" />
92
95
  </div>
93
96
  <?r end ?>
94
97
  </form>
95
- </article>
98
+ </section>
@@ -1,66 +1,46 @@
1
- Ramaze::HelpersHelper.options.paths.push(__DIR__('comments'))
1
+ Zen::Package.add do |p|
2
+ p.name = :comments
3
+ p.title = 'comments.titles.index'
4
+ p.author = 'Yorick Peterse'
5
+ p.url = 'http://zen-cms.com/'
6
+ p.about = 'comments.description'
7
+ p.root = __DIR__('comments')
8
+ p.migrations = __DIR__('../migrations')
9
+
10
+ p.menu(
11
+ 'comments.titles.index',
12
+ '/admin/comments',
13
+ :permission => :show_comment
14
+ )
15
+
16
+ p.permission :show_comment , 'comments.permissions.show'
17
+ p.permission :edit_comment , 'comments.permissions.edit'
18
+ p.permission :delete_comment, 'comments.permissions.delete'
19
+ end
20
+
21
+ Zen::Language.load('comments')
2
22
 
3
23
  require __DIR__('comments/model/comment_status')
4
24
  require __DIR__('comments/model/comment')
5
25
  require __DIR__('comments/controller/comments')
6
26
  require __DIR__('comments/controller/comments_form')
7
- require __DIR__('comments/plugin/comments')
8
- require __DIR__('comments/plugin/anti_spam')
9
-
10
- Zen::Language.options.paths.push(__DIR__('comments'))
11
- Zen::Language.load('comments')
12
-
13
- Zen::Package.add do |p|
14
- p.name = 'comments'
15
- p.author = 'Yorick Peterse'
16
- p.url = 'http://yorickpeterse.com/'
17
- p.about = "Allow users to post comments on any given section entry (as long as
18
- the section allows it)."
27
+ require __DIR__('comments/anti_spam')
19
28
 
20
- p.directory = __DIR__('comments')
21
- p.migration_dir = __DIR__('../migrations')
22
-
23
- p.menu = [{
24
- :title => lang('comments.titles.index'),
25
- :url => "admin/comments"
26
- }]
27
-
28
- p.controllers = {
29
- lang('comments.titles.index') => Comments::Controller::Comments
30
- }
31
- end
32
-
33
- Zen::Plugin.add do |p|
34
- p.name = 'comments'
35
- p.author = 'Yorick Peterse'
36
- p.url = 'http://yorickpeterse.com/'
37
- p.about = 'Plugin that can be used to retrieve comments.'
38
- p.plugin = Comments::Plugin::Comments
39
- end
40
-
41
- Zen::Plugin.add do |p|
42
- p.name = 'anti_spam'
43
- p.author = 'Yorick Peterse'
44
- p.url = 'http://yorickpeterse.com/'
45
- p.about = 'Plugin used for checking if a comment is spam or ham.'
46
- p.plugin = Comments::Plugin::AntiSpam
47
- end
29
+ Zen::Controller::FrontendController.helper(:comment_frontend)
48
30
 
49
- plugin(:settings, :register) do |setting|
50
- setting.title = lang('comments.labels.anti_spam_system')
51
- setting.description = lang('comments.placeholders.anti_spam_system')
31
+ Settings::Setting.add do |setting|
32
+ setting.title = 'comments.labels.anti_spam_system'
33
+ setting.description = 'comments.descriptions.anti_spam_system'
52
34
  setting.name = 'anti_spam_system'
53
35
  setting.group = 'security'
54
36
  setting.type = 'select'
55
37
  setting.default = 'defensio'
56
- setting.values = {
57
- 'defensio' => lang('comments.labels.defensio')
58
- }
38
+ setting.values = lambda { Comments::AntiSpam::REGISTERED }
59
39
  end
60
40
 
61
- plugin(:settings, :register) do |setting|
62
- setting.title = lang('comments.labels.defensio_key')
63
- setting.description = lang('comments.placeholders.defensio_key')
41
+ Settings::Setting.add do |setting|
42
+ setting.title = 'comments.labels.defensio_key'
43
+ setting.description = 'comments.descriptions.defensio_key'
64
44
  setting.name = 'defensio_key'
65
45
  setting.group = 'security'
66
46
  setting.type = 'textbox'
@@ -0,0 +1,138 @@
1
+ module Comments
2
+ ##
3
+ # {Comments::AntiSpam} is a module that can be used to verify if a comment is
4
+ # spam or ham. In order to validate a comment you'll have to call
5
+ # {Comments::AntiSpam.validate} and pass a set of parameters to it (see the
6
+ # documentation of {Comments::AntiSpam.validate} for more information). An
7
+ # example of validating a comment using Defensio looks like the following:
8
+ #
9
+ # spam = Comments::AntiSpam.validate(
10
+ # :defensio,
11
+ # nil,
12
+ # nil,
13
+ # nil,
14
+ # 'This is a comment that has to be validated'
15
+ # )
16
+ #
17
+ # ## Supported Systems
18
+ #
19
+ # By default only Defensio is supported.
20
+ #
21
+ # ## Adding Systems
22
+ #
23
+ # Adding a new anti spam system is done in two steps. First you must add the
24
+ # name of the method to {Comments::AntiSpam::REGISTERED} (the method should be
25
+ # a symbol). This constant is a hash of which the keys are the method names of
26
+ # the engines to invoke and the values the labels to display in the admin
27
+ # panel. Without this the {Comments::AntiSpam.validate} method will raise an
28
+ # error. This check is put in place to ensure that the user can't potentially
29
+ # exploit the system.
30
+ #
31
+ # Once the method has been added to the list you must actually implement it as
32
+ # a class method. The syntax of such a method looks like the following:
33
+ #
34
+ # def self.method_name(author, email, url, comment)
35
+ #
36
+ # end
37
+ #
38
+ # The return value should be a boolean that indicates whether or not the
39
+ # comment is spam. A return value of ``true`` indicates that the comment is
40
+ # spam, anything that evaluates to ``false`` indicates that the comment is
41
+ # valid.
42
+ #
43
+ # In order to add your method you simply add it like you normally would with
44
+ # any other class:
45
+ #
46
+ # module Comments
47
+ # module AntiSpam
48
+ # private
49
+ #
50
+ # def self.custom_method(author, email, url, comment)
51
+ #
52
+ # end
53
+ # end
54
+ # end
55
+ #
56
+ #
57
+ # @since 0.3
58
+ #
59
+ module AntiSpam
60
+ # Array containing the method names of the various supported engines and
61
+ # their labels to display in the admin interface.
62
+ REGISTERED = {
63
+ :defensio => lang('comments.labels.defensio')
64
+ }
65
+
66
+ class << self
67
+ ##
68
+ # Validates a comment to see if it's spam or ham using a given engine.
69
+ # Defensio only validates the comment itself.
70
+ #
71
+ # @example
72
+ # Comments::AntiSpam.validate(
73
+ # :defensio,
74
+ # 'Chuch Norris',
75
+ # 'chuck@chucknorris.com',
76
+ # 'http://chucknorris.com/',
77
+ # '.....'
78
+ # )
79
+ #
80
+ # @since 0.3
81
+ # @param [#to_sym] engine The name of the anti spam engine to use.
82
+ # @param [String] author The name of the author of the comment.
83
+ # @param [String] email The Email address of the author.
84
+ # @param [String] url The URL that points to the user's website
85
+ # (optional).
86
+ # @param [String] comment The comment to validate.
87
+ # @return [TrueClass|FalseClass]
88
+ #
89
+ def validate(engine, author, email, url, comment)
90
+ engine = engine.to_sym
91
+
92
+ unless REGISTERED.key?(engine)
93
+ raise(ArgumentError, "The engine \"#{engine}\" is invalid")
94
+ end
95
+
96
+ return send(engine, author, email, url, comment)
97
+ end
98
+
99
+ ##
100
+ # Validates a comment using Defensio.
101
+ #
102
+ # @since 0.3
103
+ # @see Comments::AntiSpam.validate
104
+ #
105
+ def defensio(author, email, url, comment)
106
+ if !Kernel.const_defined?(:Defensio)
107
+ Ramaze.setup(:verbose => false) do
108
+ gem 'defensio'
109
+ end
110
+ end
111
+
112
+ spam = true
113
+ api_key = get_setting(:defensio_key).value
114
+
115
+ if api_key.nil? or api_key.empty?
116
+ raise('You need to specify an API key for the defensio system')
117
+ end
118
+
119
+ client = Defensio.new(api_key)
120
+ status, response = client.post_document(
121
+ :content => comment,
122
+ :platform => 'zen',
123
+ :type => 'comment'
124
+ )
125
+
126
+ return spam if status != 200
127
+
128
+ if response['allow'] == true and response['spaminess'] <= 0.85
129
+ spam = false
130
+ else
131
+ spam = true
132
+ end
133
+
134
+ return spam
135
+ end
136
+ end # class << self
137
+ end # AntiSpam
138
+ end # Comments
@@ -1,114 +1,176 @@
1
- #:nodoc:
1
+ ##
2
+ # Package that allows users to manage and submit comments.
3
+ #
4
+ # ## Controllers
5
+ #
6
+ # * {Comments::Controller::Comments}
7
+ # * {Comments::Controller::CommentsForm}
8
+ #
9
+ # ## Helpers
10
+ #
11
+ # * {Ramaze::Helper::Comment}
12
+ # * {Ramaze::Helper::CommentFrontend}
13
+ #
14
+ # ## Models
15
+ #
16
+ # * {Comments::Model::Comment}
17
+ # * {Comments::Model::CommentStatus}
18
+ #
19
+ # ## Generic Modules & Classes
20
+ #
21
+ # * {Comments::AntiSpam}
22
+ #
23
+ # @since 0.1
24
+ #
2
25
  module Comments
3
26
  #:nodoc:
4
27
  module Controller
5
28
  ##
6
- # Controller used for managing comments. Administrations can't actually
7
- # add new comments using the backend controller but can edit or delete them.
8
- # Comments can be submitted to any section entry as long as the section
9
- # allows it. When submitting a comment the user data such as the name and
10
- # email will be retrieved from either the users table (if the user is logged
11
- # in) or from the form that was submitted.
29
+ # Controller for managing existing comments. When logged in a user can not
30
+ # add a comment, for that they'd have to use the frontend.
12
31
  #
13
- # @author Yorick Peterse
14
- # @since 0.1
32
+ # Depending on the settings of a section the comments belong to (via a
33
+ # section entry) users may have to meet certain requirements in order to be
34
+ # able to post a comment. For example, a section might require users to be
35
+ # logged in in order to post comments. If this is the case and the user
36
+ # tries to submit a comment a message will be displayed and the HTTP status
37
+ # code is changed to 403. See {Comments::Controller::CommentsForm} for more
38
+ # information.
39
+ #
40
+ # In order to manage existing comments you'll have to navigate to
41
+ # ``/admin/comments``. This page will show an overview of all existing
42
+ # comments (or a message if no comments were found).
43
+ #
44
+ # ![Comments](../../_static/comments/comments.png)
45
+ #
46
+ # Comments can be edited by clicking on their name. Deleting comments can be
47
+ # done by checking the checkboxes in each row followed by clicking the
48
+ # "Delete selected comments" button.
49
+ #
50
+ # ## Editing Comments
51
+ #
52
+ # ![Edit Comment](../../_static/comments/edit_comment.png)
53
+ #
54
+ # When editing a comment you can specify/update the following fields:
55
+ #
56
+ # * **Name**: the name of the author. This field can only be changed if the
57
+ # comment was posted by somebody that wasn't logged in.
58
+ # * **Website**: the website of the author that posted the comment.
59
+ # * **Email**: the Email address of the author. If the comment was posted by
60
+ # a user that wasn't logged in then this field is required.
61
+ # * **Status**: the status of a comment, can be "Open", "Closed" or "Spam".
62
+ # If the status is something other than "Open" it will be hidden when the
63
+ # comments plugin is used.
64
+ # * **Comment** (required): the actual comment. Based on a section's
65
+ # settings these are formatted using Markdown, Textile or any of the other
66
+ # available markup processors.
67
+ #
68
+ # Note that if a comment was posted by a user that was logged in you won't
69
+ # be able to change the name of the author.
70
+ #
71
+ # ## Used Permissions
72
+ #
73
+ # This controller uses the following permissions:
74
+ #
75
+ # * show_comment
76
+ # * edit_comment
77
+ # * new_comment
78
+ # * delete_comment
79
+ #
80
+ # ## Events
81
+ #
82
+ # All events called in this controller receive an instance of
83
+ # {Comments::Model::Comment}. However, just like all other controllers the
84
+ # ``delete_comment`` receives an instance of this model that has already
85
+ # been destroyed.
86
+ #
87
+ # An example of using one of these events is to notify a user when his
88
+ # comment has been marked as spam:
89
+ #
90
+ # require 'mail'
91
+ #
92
+ # Zen::Event.call(:after_edit_comment) do |comment|
93
+ # email = comment.user.email
94
+ # spam = Comments::Model::CommentStatus[:name => 'spam']
95
+ #
96
+ # if comment.comment_status_id == spam.id
97
+ # Mail.deliver do
98
+ # from 'example@domain.tld'
99
+ # to email
100
+ # subject 'Your comment has been marked as spam'
101
+ # body "Dear #{comment.user.name}, your comment has been " \
102
+ # "marked as spam"
103
+ # end
104
+ # end
105
+ # end
106
+ #
107
+ # @since 0.1
108
+ # @map /admin/comments
109
+ # @event before_edit_comment
110
+ # @event after_edit_comment
111
+ # @event beore_delete_comment
112
+ # @event after_delete_comment
15
113
  #
16
114
  class Comments < Zen::Controller::AdminController
17
- include ::Comments::Model
18
-
19
- map '/admin/comments'
115
+ map '/admin/comments'
20
116
  helper :comment
117
+ title 'comments.titles.%s'
21
118
 
22
- before_all do
23
- csrf_protection(:save, :delete) do
24
- respond(lang('zen_general.errors.csrf'), 403)
25
- end
26
- end
119
+ csrf_protection :save, :delete
27
120
 
28
121
  ##
29
- # Constructor method that pre-loads several variables and language files.
30
- # The following language files are loaded:
122
+ # Shows an overview of all existing comments and allows the user to edit
123
+ # or remove these comments.
31
124
  #
32
- # * comments
125
+ # @since 0.1
126
+ # @permission show_comment
33
127
  #
34
- # @author Yorick Peterse
35
- # @since 0.1
36
- #
37
- def initialize
38
- super
128
+ def index
129
+ authorize_user!(:show_comment)
39
130
 
40
- Zen::Language.load('comments')
131
+ set_breadcrumbs(lang('comments.titles.index'))
41
132
 
42
- # Set the page title
43
- if !action.method.nil?
44
- method = action.method.to_s
45
- @page_title = lang("comments.titles.#{method}") rescue nil
133
+ @comments = search do |query|
134
+ ::Comments::Model::Comment.search(query).order(:comments__id.asc)
46
135
  end
47
- end
48
-
49
- ##
50
- # Shows an overview of all posted comments along with their status,
51
- # author and so on.
52
- #
53
- # This method requires the following permissions:
54
- #
55
- # * read
56
- #
57
- # @author Yorick Peterse
58
- # @since 0.1
59
- #
60
- def index
61
- require_permissions(:read)
62
136
 
63
- set_breadcrumbs(lang('comments.titles.index'))
137
+ @comments ||= ::Comments::Model::Comment \
138
+ .eager(:comment_status, :user) \
139
+ .order(:id.asc)
64
140
 
65
- @comments = paginate(Comment.eager(:comment_status))
141
+ @comments = paginate(@comments)
66
142
  end
67
143
 
68
144
  ##
69
- # Edits an existing comment based on the ID.
145
+ # Allows a user to edit an existing comment.
70
146
  #
71
- # This method requires the following permissions:
72
- #
73
- # * read
74
- # * update
75
- #
76
- # @author Yorick Peterse
77
- # @param [Integer] id The ID of the comment to retrieve so that we can
78
- # edit it.
79
- # @since 0.1
147
+ # @param [Fixnum] id The ID of the comment to edit.
148
+ # @since 0.1
149
+ # @permission edit_comment
80
150
  #
81
151
  def edit(id)
82
- require_permissions(:read, :update)
152
+ authorize_user!(:edit_comment)
83
153
 
84
154
  set_breadcrumbs(
85
155
  Comments.a(lang('comments.titles.index'), :index),
86
156
  @page_title
87
157
  )
88
158
 
89
- if flash[:form_data]
90
- @comment = flash[:form_data]
91
- else
92
- @comment = validate_comment(id)
93
- end
159
+ @comment = flash[:form_data] || validate_comment(id)
94
160
 
95
161
  render_view(:form)
96
162
  end
97
163
 
98
164
  ##
99
- # Saves a comment based on the current POST data. Note that this
100
- # method won't create a new comment as this can't be done using the
101
- # backend.
165
+ # Saves the changes made to an existing comment.
102
166
  #
103
- # This method requires the following permissions:
104
- #
105
- # * update
106
- #
107
- # @author Yorick Peterse
108
- # @since 0.1
167
+ # @since 0.1
168
+ # @permission edit_comment
169
+ # @event before_edit_comment
170
+ # @event after_edit_comment
109
171
  #
110
172
  def save
111
- require_permissions(:update)
173
+ authorize_user!(:edit_comment)
112
174
 
113
175
  # Copy the POST data so we can work with it without messing things up
114
176
  post = request.subset(
@@ -127,8 +189,10 @@ module Comments
127
189
  post.delete('id')
128
190
 
129
191
  begin
130
- comment.update(post)
131
- message(:success, lang('comments.success.save'))
192
+ post.each { |k, v| comment.send("#{k}=", v) }
193
+ Zen::Event.call(:before_edit_comment, comment)
194
+
195
+ comment.save
132
196
  rescue => e
133
197
  Ramaze::Log.error(e.inspect)
134
198
  message(:error, lang('comments.errors.save'))
@@ -139,27 +203,23 @@ module Comments
139
203
  redirect_referrer
140
204
  end
141
205
 
142
- # Redirect the user to the proper page.
143
- if comment.id
144
- redirect(Comments.r(:edit, comment.id))
145
- else
146
- redirect_referrer
147
- end
206
+ Zen::Event.call(:after_edit_comment, comment)
207
+
208
+ message(:success, lang('comments.success.save'))
209
+ redirect(Comments.r(:edit, comment.id))
148
210
  end
149
211
 
150
212
  ##
151
- # Deletes a number of comments based on the comment IDs specified
152
- # in the POST array "comment_ids".
213
+ # Deletes a number of comments. The IDs of these comments should be
214
+ # specified in the POSt array "comment_ids".
153
215
  #
154
- # This method requires the following permissions:
155
- #
156
- # * delete
157
- #
158
- # @author Yorick Peterse
159
- # @since 0.1
216
+ # @since 0.1
217
+ # @permission delete_comment
218
+ # @event before_delete_comment
219
+ # @event after_delete_comment
160
220
  #
161
221
  def delete
162
- require_permissions(:delete)
222
+ authorize_user!(:delete_comment)
163
223
 
164
224
  # Obviously we'll require some IDs
165
225
  if !request.params['comment_ids'] \
@@ -170,17 +230,24 @@ module Comments
170
230
 
171
231
  # Delete each section
172
232
  request.params['comment_ids'].each do |id|
233
+ comment = ::Comments::Model::Comment[id]
234
+
235
+ next if comment.nil?
236
+ Zen::Event.call(:before_delete_comment, comment)
237
+
173
238
  begin
174
- Comment[id].destroy
175
- message(:success, lang('comments.success.delete'))
239
+ comment.destroy
176
240
  rescue => e
177
241
  Ramaze::Log.error(e.inspect)
178
242
  message(:error, lang('comments.errors.delete') % id)
179
243
 
180
244
  redirect_referrer
181
245
  end
246
+
247
+ Zen::Event.call(:after_delete_comment, comment)
182
248
  end
183
249
 
250
+ message(:success, lang('comments.success.delete'))
184
251
  redirect_referrer
185
252
  end
186
253
  end # Comments