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
@@ -0,0 +1,11 @@
1
+ # Settings group for various settings that don't belong in any other group.
2
+ Settings::SettingsGroup.add do |group|
3
+ group.title = 'settings.tabs.general'
4
+ group.name = :general
5
+ end
6
+
7
+ # Settings group for security related settings such as the Defensio API key.
8
+ Settings::SettingsGroup.add do |group|
9
+ group.title = 'settings.tabs.security'
10
+ group.name = :security
11
+ end
@@ -0,0 +1,83 @@
1
+ Settings::Setting.add do |setting|
2
+ setting.title = 'settings.labels.website_name'
3
+ setting.description = 'settings.descriptions.website_name'
4
+ setting.name = :website_name
5
+ setting.group = :general
6
+ setting.default = 'Zen'
7
+ setting.type = 'textbox'
8
+ end
9
+
10
+ Settings::Setting.add do |setting|
11
+ setting.title = 'settings.labels.website_description'
12
+ setting.description = 'settings.descriptions.website_description'
13
+ setting.name = :website_description
14
+ setting.group = :general
15
+ setting.type = 'textarea'
16
+ end
17
+
18
+ Settings::Setting.add do |setting|
19
+ setting.title = 'settings.labels.language'
20
+ setting.description = 'settings.descriptions.language'
21
+ setting.name = :language
22
+ setting.group = :general
23
+ setting.default = 'en'
24
+ setting.type = 'select'
25
+ setting.values = Zen::Language.to_hash
26
+ end
27
+
28
+ Settings::Setting.add do |setting|
29
+ setting.title = 'settings.labels.frontend_language'
30
+ setting.description = 'settings.descriptions.frontend_language'
31
+ setting.name = :frontend_language
32
+ setting.group = :general
33
+ setting.default = 'en'
34
+ setting.type = 'select'
35
+ setting.values = Zen::Language.to_hash
36
+ end
37
+
38
+ Settings::Setting.add do |setting|
39
+ setting.title = 'settings.labels.theme'
40
+ setting.description = 'settings.descriptions.theme'
41
+ setting.name = :theme
42
+ setting.group = :general
43
+ setting.type = 'select'
44
+ setting.default = 'default'
45
+ setting.values = lambda do
46
+ theme_hash = {}
47
+
48
+ Zen::Theme::REGISTERED.each do |name, theme|
49
+ name = name.to_s
50
+ theme_hash[name] = name
51
+ end
52
+
53
+ return theme_hash
54
+ end
55
+ end
56
+
57
+ Settings::Setting.add do |setting|
58
+ setting.title = 'settings.labels.date_format'
59
+ setting.description = 'settings.descriptions.date_format'
60
+ setting.name = :date_format
61
+ setting.group = :general
62
+ setting.type = 'select'
63
+ setting.default = '%Y-%m-%d %H:%M:%S'
64
+ setting.values = {
65
+ '%Y-%m-%d %H:%M:%S' => '2011-05-10 13:30:12',
66
+ '%d-%m-%Y %H:%M:%S' => '10-05-2011 13:30:12',
67
+ '%A, %B %d, %Y' => 'Tuesday, May 10, 2011'
68
+ }
69
+ end
70
+
71
+ Settings::Setting.add do |setting|
72
+ setting.title = 'settings.labels.enable_antispam'
73
+ setting.description = 'settings.descriptions.enable_antispam'
74
+ setting.name = :enable_antispam
75
+ setting.group = :security
76
+ setting.type = 'radio'
77
+ setting.values = lambda do
78
+ return {
79
+ lang('zen_general.special.boolean_hash.true') => '1',
80
+ lang('zen_general.special.boolean_hash.false') => '0'
81
+ }
82
+ end
83
+ end
@@ -0,0 +1,84 @@
1
+ module Settings
2
+ ##
3
+ # Base class used for setting groups.
4
+ #
5
+ # @since 0.2.5
6
+ #
7
+ class SettingsGroup
8
+ include ::Zen::Validation
9
+
10
+ ##
11
+ # Hash containing all registered setting groups.
12
+ #
13
+ # @since 0.3
14
+ #
15
+ REGISTERED = {}
16
+
17
+ # The name of the group
18
+ attr_reader :name
19
+
20
+ # The title of the group, displayed in the GUI
21
+ attr_writer :title
22
+
23
+ ##
24
+ # Registers a new setting group using the specified block.
25
+ #
26
+ # @example
27
+ # Settings::SettingsGroup.add do |group|
28
+ # group.name = 'example'
29
+ # group.title = 'Example group'
30
+ # end
31
+ #
32
+ # @since 0.2.5
33
+ #
34
+ def self.add
35
+ group = self.new
36
+
37
+ yield group
38
+
39
+ group.validate
40
+
41
+ REGISTERED[group.name] = group
42
+ end
43
+
44
+ ##
45
+ # Sets the name of the group and converts it to a symbol.
46
+ #
47
+ # @since 0.3
48
+ # @param [#to_sym] name The name of the settings group.
49
+ #
50
+ def name=(name)
51
+ @name = name.to_sym
52
+ end
53
+
54
+ ##
55
+ # Returns the title of the setting and tries to translate it.
56
+ #
57
+ # @since 0.3
58
+ # @return [String]
59
+ #
60
+ def title
61
+ begin
62
+ return lang(@title)
63
+ rescue
64
+ return @title
65
+ end
66
+ end
67
+
68
+ ##
69
+ # Validates all attributes of this class.
70
+ #
71
+ # @since 0.2.5
72
+ #
73
+ def validate
74
+ validates_presence([:name, :title])
75
+
76
+ if REGISTERED.key?(name)
77
+ raise(
78
+ ::Zen::ValidationError,
79
+ "The setting group \"#{name}\" has already been registered."
80
+ )
81
+ end
82
+ end
83
+ end # SettingsGroup
84
+ end # Settings
@@ -0,0 +1,35 @@
1
+ module Settings
2
+ ##
3
+ # Module that's injected into the global namespace allowing developers to
4
+ # retrieve settings without having to use the full namespace of
5
+ # {Settings::Setting::REGISTERED}.
6
+ #
7
+ # @since 0.3
8
+ #
9
+ module SingletonMethods
10
+ ##
11
+ # Retrieves the setting for the given name. This method returns an instance
12
+ # of {Settings::Setting}, this means that in order to retrieve the actual
13
+ # value you'll have to invoke ``#value()`` on the return value.
14
+ #
15
+ # @example
16
+ # get_setting(:website_name) # => #<Settings::Setting>
17
+ #
18
+ # @example Retrieving the value
19
+ # get_setting(:website_name) # => "Example"
20
+ #
21
+ # @since 0.3
22
+ # @param [#to_sym] name The name of the setting to retrieve.
23
+ # @return [Settings::Setting]
24
+ #
25
+ def get_setting(name)
26
+ name = name.to_sym
27
+
28
+ if !Settings::Setting::REGISTERED.key?(name)
29
+ raise(ArgumentError, "The setting \"#{name}\" doesn't exist.")
30
+ end
31
+
32
+ return Settings::Setting::REGISTERED[name]
33
+ end
34
+ end # SingletonMethods
35
+ end # Settings
@@ -1,8 +1,8 @@
1
- <article>
1
+ <section>
2
2
  <header>
3
3
  <h1>#{get_breadcrumbs}</h1>
4
4
  </header>
5
-
5
+
6
6
  <div class="tabs">
7
7
  <ul>
8
8
  <?r @groups.each do |name, group| ?>
@@ -12,67 +12,25 @@
12
12
  <?r end ?>
13
13
  </ul>
14
14
  </div>
15
-
16
- #{
17
- form_for(@settings_ordered, :method => :post, :action => @form_save_url,
18
- :id => :setting_form) do |f|
15
+
16
+ #{form_for(
17
+ @settings_ordered,
18
+ :method => :post,
19
+ :action => ::Settings::Controller::Settings.r(:save),
20
+ :id => :setting_form
21
+ ) do |f|
19
22
  f.input_hidden(:csrf_token, get_csrf_token)
20
23
 
21
24
  @settings_ordered.each do |group, items|
22
25
  f.g.div(:id => "group_#{group}") do
23
26
  items.each do |s|
24
- value = plugin(:settings, :get, s.name).value
25
-
26
- case s.type
27
- when 'textbox'
28
- f.input_text(
29
- s.title,
30
- s.name,
31
- :value => value
32
- )
33
-
34
- when 'textarea'
35
- f.textarea(
36
- s.title,
37
- s.name,
38
- :value => value,
39
- :rows => 8
40
- )
41
-
42
- when 'radio'
43
- f.input_radio(
44
- s.title,
45
- s.name,
46
- value,
47
- :values => s.values
48
- )
49
-
50
- when 'checkbox'
51
- f.input_checkbox(
52
- s.title,
53
- s.name,
54
- value,
55
- :values => s.values
56
- )
57
-
58
- when 'select'
59
- f.select(
60
- s.title,
61
- s.name,
62
- :values => s.values,
63
- :size => 1,
64
- :selected => value
65
- )
66
- end
27
+ f.send(*get_setting(s.name).form_parameters)
67
28
  end
68
29
  end
69
30
  end
70
-
71
- f.g.div(:class => 'clearfix') do
72
- f.g.div(:class => 'button') do
73
- f.g.input(:type => 'submit', :value => lang('settings.buttons.save'))
74
- end
31
+
32
+ f.g.div(:class => 'button') do
33
+ f.g.input(:type => 'submit', :value => lang('settings.buttons.save'))
75
34
  end
76
- end
77
- }
78
- </article>
35
+ end}
36
+ </section>
@@ -0,0 +1,17 @@
1
+ Sequel.migration do
2
+ up do
3
+ alter_table(:settings) do
4
+ drop_column(:group)
5
+ drop_column(:default)
6
+ drop_column(:type)
7
+ end
8
+ end
9
+
10
+ down do
11
+ alter_table(:settings) do
12
+ add_column(:group, String)
13
+ add_column(:default, String)
14
+ add_column(:type, String)
15
+ end
16
+ end
17
+ end
@@ -1,43 +1,58 @@
1
- Ramaze::HelpersHelper.options.paths.push(__DIR__('users'))
1
+ Zen::Package.add do |p|
2
+ p.name = :users
3
+ p.title = 'users.titles.index'
4
+ p.author = 'Yorick Peterse'
5
+ p.url = 'http://zen-cms.com/'
6
+ p.about = 'users.description'
7
+ p.root = __DIR__('users')
8
+ p.migrations = __DIR__('../migrations')
2
9
 
3
- require __DIR__('users/model/user')
4
- require __DIR__('users/model/user_group')
5
- require __DIR__('users/model/access_rule')
6
- require __DIR__('users/controller/users')
7
- require __DIR__('users/controller/user_groups')
8
- require __DIR__('users/controller/access_rules')
10
+ p.menu(
11
+ 'users.titles.index',
12
+ '/admin/users',
13
+ :permission => :show_user
14
+ ) do |sub|
15
+ sub.menu(
16
+ 'user_groups.titles.index',
17
+ '/admin/user-groups',
18
+ :permission => :show_user_group
19
+ )
20
+ end
21
+
22
+ p.permission :show_user_group , 'user_groups.permissions.show'
23
+ p.permission :edit_user_group , 'user_groups.permissions.edit'
24
+ p.permission :new_user_group , 'user_groups.permissions.new'
25
+ p.permission :delete_user_group, 'user_groups.permissions.delete'
26
+
27
+ p.permission :show_user , 'users.permissions.show'
28
+ p.permission :edit_user , 'users.permissions.edit'
29
+ p.permission :new_user , 'users.permissions.new'
30
+ p.permission :delete_user, 'users.permissions.delete'
31
+
32
+ p.permission :show_permission, 'permissions.permissions.show'
33
+ p.permission :edit_permission, 'permissions.permissions.edit'
34
+ end
9
35
 
10
- Zen::Language.options.paths.push(__DIR__('users'))
11
36
  Zen::Language.load('users')
12
37
  Zen::Language.load('user_groups')
13
- Zen::Language.load('access_rules')
38
+ Zen::Language.load('permissions')
14
39
 
15
- # The trait for the User helper has to be specified in the constructor as
16
- # our user model is loaded after this class is loaded (but before it's initialized)
40
+ require __DIR__('users/settings')
41
+ require __DIR__('users/model/user')
42
+ require __DIR__('users/model/user_group')
43
+ require __DIR__('users/model/permission')
44
+ require __DIR__('users/model/user_status')
45
+
46
+ # The trait for the User helper has to be specified in the constructor as our
47
+ # user model is loaded after this class is loaded (but before it's
48
+ # initialized)
17
49
  Zen::Controller::BaseController.trait(:user_model => Users::Model::User)
50
+ Zen::Controller::AdminController.helper(:acl, :access)
18
51
 
19
- Zen::Package.add do |p|
20
- p.name = 'users'
21
- p.author = 'Yorick Peterse'
22
- p.url = 'http://yorickpeterse.com/'
23
- p.about = "Module for managing users along with handling authentication and
24
- authorization."
25
-
26
- p.directory = __DIR__('users')
27
- p.migration_dir = __DIR__('../migrations')
28
-
29
- p.menu = [{
30
- :title => lang('users.titles.index'),
31
- :url => 'admin/users',
32
- :children => [
33
- {:title => lang('user_groups.titles.index') , :url => 'admin/user-groups'},
34
- {:title => lang('access_rules.titles.index'), :url => 'admin/access-rules'}
35
- ]
36
- }]
37
-
38
- p.controllers = {
39
- lang('users.titles.index') => Users::Controller::Users,
40
- lang('user_groups.titles.index') => Users::Controller::UserGroups,
41
- lang('access_rules.titles.index') => Users::Controller::AccessRules
42
- }
43
- end
52
+ # The settings controller is already loaded so that one has to be updated as
53
+ # well.
54
+ Ramaze::Helper::Access.add_block(Settings::Controller::Settings)
55
+
56
+ # Load the controllers after the helpers have been loaded.
57
+ require __DIR__('users/controller/users')
58
+ require __DIR__('users/controller/user_groups')
@@ -1,48 +1,78 @@
1
- #:nodoc:
2
1
  module Users
3
2
  #:nodoc:
4
3
  module Controller
5
4
  ##
6
- # Controller for managing all user groups. It's not required to add a user
7
- # to a group but it can certainly make it easier when adding custom
8
- # permissions or granting a user full access to the backend.
5
+ # User groups allow you to group types of users together and assign
6
+ # permissions to the entire group of users without having to modify each
7
+ # individual user.
8
+ #
9
+ # User groups can be managed by going to ``/admin/user-groups``. This page
10
+ # will show an overview of all existing groups or a message saying no groups
11
+ # have been added yet.
12
+ #
13
+ # ![User Groups](../../_static/users/user_groups_overview.png)
14
+ #
15
+ # Editing a user group can be done by clicking on the name of the group,
16
+ # creating a new one can be done by clicking the button "New group". When
17
+ # creating or editing a group you'll be presented with the form shown in the
18
+ # images below.
19
+ #
20
+ # ![Edit Group](../../_static/users/edit_user_group.png)
21
+ # ![Group Permissions](../../_static/users/edit_user_group_permissions.png)
22
+ #
23
+ # In this form you can fill in the following fields:
24
+ #
25
+ # * **Name** (required): the name of the user group.
26
+ # * **Slug**: a URL friendly version of the name. If no name is specified
27
+ # one will be generated automatically.
28
+ # * **Super group** (required): when set to "Yes" all users that are
29
+ # assigned to this group will have access to *everything* regardless of
30
+ # their individual settings.
31
+ # * **Description**: a description of the user group.
32
+ #
33
+ # Besides these fields you can also specify all the permissions o the user
34
+ # group similar to how they're managed for individual users. Note that user
35
+ # specific rules will only overwrite group based rules if a group blocks
36
+ # something while a user specific rules allows something. Simply said, rules
37
+ # are added to the list but aren't removed based on their source.
38
+ #
39
+ # ## Used Permissions
40
+ #
41
+ # This controller uses the following permissions:
42
+ #
43
+ # * show_user_group
44
+ # * edit_user_group
45
+ # * new_user_group
46
+ # * delete_user_group
47
+ #
48
+ # ## Events
49
+ #
50
+ # All events in this controller receive an instance of
51
+ # {Users::Model::UserGroup}. Just like other controllers the event
52
+ # ``after_delete_user_group`` will receive a user group that has already
53
+ # been destroyed using ``#destroy()``.
9
54
  #
10
- # @author Yorick Peterse
11
55
  # @since 0.1
56
+ # @map /admin/user-groups
57
+ # @event before_new_user_group
58
+ # @event after_new_user_user
59
+ # @event before_edit_user_group
60
+ # @event after_edit_user_group
61
+ # @event before_delete_user_group
62
+ # @event after_delete_user_group
12
63
  #
13
64
  class UserGroups < Zen::Controller::AdminController
14
- include ::Users::Model
15
-
16
65
  helper :users
17
- map '/admin/user-groups'
66
+ map '/admin/user-groups'
67
+ title 'user_groups.titles.%s'
18
68
 
19
- before_all do
20
- csrf_protection(:save, :delete) do
21
- respond(lang('zen_general.errors.csrf'), 403)
22
- end
23
- end
69
+ csrf_protection :save, :delete
70
+ load_asset_group :tabs
24
71
 
25
- ##
26
- # Load our language packs, set the form URLs and define our page title.
27
- #
28
- # This method loads the following language files:
29
- #
30
- # * user_groups
31
- #
32
- # @author Yorick Peterse
33
- # @since 0.1
34
- #
35
- def initialize
36
- super
37
-
38
- Zen::Language.load('user_groups')
39
-
40
- # Set the page title
41
- if !action.method.nil?
42
- method = action.method.to_sym
43
- @page_title = lang("user_groups.titles.#{method}") rescue nil
44
- end
72
+ serve :javascript, ['/admin/js/users/permissions'], :minify => false
73
+ serve :css, ['/admin/css/users/permissions.css'], :minify => false
45
74
 
75
+ before(:index, :edit, :new) do
46
76
  @boolean_hash = {
47
77
  true => lang('zen_general.special.boolean_hash.true'),
48
78
  false => lang('zen_general.special.boolean_hash.false')
@@ -53,46 +83,39 @@ module Users
53
83
  # Show an overview of all user groups and allow the current user
54
84
  # to manage these groups
55
85
  #
56
- # This method requires the following permissions:
57
- #
58
- # * read
59
- #
60
- # @author Yorick Peterse
61
- # @since 0.1
86
+ # @since 0.1
87
+ # @permission show_user_group
62
88
  #
63
89
  def index
64
- require_permissions(:read)
90
+ authorize_user!(:show_user_group)
65
91
 
66
92
  set_breadcrumbs(lang('user_groups.titles.index'))
67
93
 
68
- @user_groups = paginate(UserGroup)
94
+ @user_groups = search do |query|
95
+ ::Users::Model::UserGroup.search(query).order(:id.asc)
96
+ end
97
+
98
+ @user_groups ||= ::Users::Model::UserGroup.order(:id.asc)
99
+ @user_groups = paginate(@user_groups)
69
100
  end
70
101
 
71
102
  ##
72
103
  # Edit an existing user group.
73
104
  #
74
- # This method requires the following permissions:
75
- #
76
- # * read
77
- # * update
78
- #
79
- # @author Yorick Peterse
80
- # @param [Integer] id The ID of the user group to edit.
81
- # @since 0.1
105
+ # @param [Fixnum] id The ID of the user group to edit.
106
+ # @since 0.1
107
+ # @permission edit_user_group
82
108
  #
83
109
  def edit(id)
84
- require_permissions(:read, :update)
110
+ authorize_user!(:edit_user_group)
85
111
 
86
112
  set_breadcrumbs(
87
113
  UserGroups.a(lang('user_groups.titles.index'), :index),
88
114
  lang('user_groups.titles.edit')
89
115
  )
90
116
 
91
- if flash[:form_data]
92
- @user_group = flash[:form_data]
93
- else
94
- @user_group = validate_user_group(id)
95
- end
117
+ @user_group = flash[:form_data] || validate_user_group(id)
118
+ @permissions = @user_group.permissions.map { |p| p.permission.to_sym }
96
119
 
97
120
  render_view(:form)
98
121
  end
@@ -100,23 +123,18 @@ module Users
100
123
  ##
101
124
  # Create a new user group.
102
125
  #
103
- # This method requires the following permissions:
104
- #
105
- # * read
106
- # * create
107
- #
108
- # @author Yorick Peterse
109
- # @since 0.1
126
+ # @since 0.1
127
+ # @permission new_user_group
110
128
  #
111
129
  def new
112
- require_permissions(:read, :create)
130
+ authorize_user!(:new_user_group)
113
131
 
114
132
  set_breadcrumbs(
115
133
  UserGroups.a(lang('user_groups.titles.index'), :index),
116
134
  lang('user_groups.titles.new')
117
135
  )
118
136
 
119
- @user_group = UserGroup.new
137
+ @user_group = flash[:form_data] || ::Users::Model::UserGroup.new
120
138
 
121
139
  render_view(:form)
122
140
  end
@@ -125,42 +143,46 @@ module Users
125
143
  # Saves or creates a new user group based on the POST data and a field
126
144
  # named 'id'.
127
145
  #
128
- # This method requires the following permissions:
129
- #
130
- # * create
131
- # * read
132
- #
133
- # @author Yorick Peterse
134
- # @since 0.1
146
+ # @since 0.1
147
+ # @permission new_user_group (when creating a new group)
148
+ # @permission edit_user_group (when editing a group)
149
+ # @event before_new_user_group
150
+ # @event after_new_user_group
151
+ # @event before_edit_user_group
152
+ # @event after_edit_user_group
135
153
  #
136
154
  def save
137
155
  post = request.subset(:id, :name, :slug, :description, :super_group)
138
156
 
139
157
  if post['id'] and !post['id'].empty?
140
- require_permissions(:update)
158
+ authorize_user!(:edit_user_group)
141
159
 
142
- user_group = validate_user_group(post['id'])
143
- save_action = :save
160
+ user_group = validate_user_group(post['id'])
161
+ save_action = :save
162
+ before_event = :before_edit_user_group
163
+ after_event = :after_edit_user_group
144
164
  else
145
- require_permissions(:create)
165
+ authorize_user!(:new_user_group)
146
166
 
147
- user_group = UserGroup.new
148
- save_action = :new
149
-
150
- post.delete('slug') if post['slug'].empty?
167
+ user_group = ::Users::Model::UserGroup.new
168
+ save_action = :new
169
+ before_event = :before_new_user_group
170
+ after_event = :after_new_user_group
151
171
  end
152
172
 
153
173
  post.delete('id')
154
174
 
155
- flash_success = lang("user_groups.success.#{save_action}")
156
- flash_error = lang("user_groups.errors.#{save_action}")
175
+ success = lang("user_groups.success.#{save_action}")
176
+ error = lang("user_groups.errors.#{save_action}")
157
177
 
158
178
  begin
159
- user_group.update(post)
160
- message(:success, flash_success)
179
+ post.each { |k, v| user_group.send("#{k}=", v) }
180
+ Zen::Event.call(before_event, user_group)
181
+
182
+ user_group.save
161
183
  rescue => e
162
184
  Ramaze::Log.error(e.inspect)
163
- message(:error, flash_error)
185
+ message(:error, error)
164
186
 
165
187
  flash[:form_data] = user_group
166
188
  flash[:form_errors] = user_group.errors
@@ -168,25 +190,31 @@ module Users
168
190
  redirect_referrer
169
191
  end
170
192
 
171
- if user_group.id
172
- redirect(UserGroups.r(:edit, user_group.id))
173
- else
174
- redirect_referrer
193
+ if user_authorized?(:edit_permission)
194
+ update_permissions(
195
+ :user_group_id,
196
+ user_group.id,
197
+ request.params['permissions'] || [],
198
+ user_group.permissions.map { |p| p.permission }
199
+ )
175
200
  end
201
+
202
+ Zen::Event.call(after_event, user_group)
203
+
204
+ message(:success, success)
205
+ redirect(UserGroups.r(:edit, user_group.id))
176
206
  end
177
207
 
178
208
  ##
179
- # Delete all specified user groups.
209
+ # Deletes all specified user groups.
180
210
  #
181
- # This method requires the following permissions:
182
- #
183
- # * delete
184
- #
185
- # @author Yorick Peterse
186
- # @since 0.1
211
+ # @since 0.1
212
+ # @permission delete_user_group
213
+ # @event before_delete_user_group
214
+ # @event after_delete_user_group
187
215
  #
188
216
  def delete
189
- require_permissions(:delete)
217
+ authorize_user!(:delete_user_group)
190
218
 
191
219
  if !request.params['user_group_ids'] \
192
220
  or request.params['user_group_ids'].empty?
@@ -195,17 +223,24 @@ module Users
195
223
  end
196
224
 
197
225
  request.params['user_group_ids'].each do |id|
226
+ group = ::Users::Model::UserGroup[id]
227
+
228
+ next if group.nil?
229
+ Zen::Event.call(:before_delete_user_group, group)
230
+
198
231
  begin
199
- UserGroup[id].destroy
200
- message(:success, lang('user_groups.success.delete'))
232
+ group.destroy
201
233
  rescue => e
202
234
  Ramaze::Log.error(e.inspect)
203
235
  message(:error, lang('user_groups.errors.delete') % id)
204
236
 
205
237
  redirect_referrer
206
238
  end
239
+
240
+ Zen::Event.call(:after_delete_user_group, group)
207
241
  end
208
242
 
243
+ message(:success, lang('user_groups.success.delete'))
209
244
  redirect_referrer
210
245
  end
211
246
  end # UserGroups