padrino-admin 0.8.5 → 0.9.0

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 (353) hide show
  1. data/README.rdoc +40 -84
  2. data/VERSION +1 -1
  3. data/lib/padrino-admin.rb +3 -20
  4. data/lib/padrino-admin/access_control.rb +78 -326
  5. data/lib/padrino-admin/generators/actions.rb +6 -26
  6. data/lib/padrino-admin/generators/admin_app.rb +40 -11
  7. data/lib/padrino-admin/generators/admin_page.rb +11 -17
  8. data/lib/padrino-admin/generators/orm.rb +85 -0
  9. data/lib/padrino-admin/generators/templates/account/activerecord.rb.tt +43 -0
  10. data/lib/padrino-admin/generators/templates/account/datamapper.rb.tt +54 -0
  11. data/lib/padrino-admin/generators/templates/{page/db → account}/seeds.rb.tt +5 -6
  12. data/lib/padrino-admin/generators/{app/app.rb.tt → templates/app/app.rb} +2 -10
  13. data/lib/padrino-admin/generators/templates/app/controllers/base.rb +7 -0
  14. data/lib/padrino-admin/generators/{app → templates/app}/controllers/sessions.rb +6 -6
  15. data/lib/padrino-admin/generators/templates/assets/stylesheets/base.css +370 -0
  16. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/amro/style.css +364 -0
  17. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/bec-green/style.css +290 -0
  18. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/bec/style.css +301 -0
  19. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/blue/style.css +287 -0
  20. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/default/style.css +373 -0
  21. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/djime-cerulean/style.css +305 -0
  22. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/kathleene/style.css +279 -0
  23. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/olive/style.css +345 -0
  24. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/orange/style.css +269 -0
  25. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/reidb-greenish/style.css +302 -0
  26. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/ruby/style.css +281 -0
  27. data/lib/padrino-admin/generators/templates/assets/stylesheets/themes/warehouse/style.css +391 -0
  28. data/lib/padrino-admin/generators/templates/erb/app/base/_sidebar.erb.tt +13 -0
  29. data/lib/padrino-admin/generators/templates/erb/app/base/index.erb.tt +17 -0
  30. data/lib/padrino-admin/generators/templates/erb/app/layouts/application.erb.tt +44 -0
  31. data/lib/padrino-admin/generators/templates/erb/app/sessions/new.erb.tt +46 -0
  32. data/lib/padrino-admin/generators/templates/erb/page/_form.erb.tt +11 -0
  33. data/lib/padrino-admin/generators/templates/erb/page/edit.erb.tt +18 -0
  34. data/lib/padrino-admin/generators/templates/erb/page/index.erb.tt +36 -0
  35. data/lib/padrino-admin/generators/templates/erb/page/new.erb.tt +17 -0
  36. data/lib/padrino-admin/generators/templates/page/controller.rb.tt +32 -22
  37. data/lib/padrino-admin/helpers/authentication_helpers.rb +8 -9
  38. data/lib/padrino-admin/helpers/view_helpers.rb +20 -338
  39. data/lib/padrino-admin/locale/admin/de.yml +15 -49
  40. data/lib/padrino-admin/locale/admin/en.yml +12 -50
  41. data/lib/padrino-admin/locale/admin/it.yml +15 -50
  42. data/padrino-admin.gemspec +40 -321
  43. data/test/fixtures/data_mapper.rb +56 -7
  44. data/test/generators/test_admin_app_generator.rb +17 -16
  45. data/test/generators/test_admin_page_generator.rb +12 -16
  46. data/test/test_admin_application.rb +193 -12
  47. metadata +33 -314
  48. data/lib/padrino-admin/column_store.rb +0 -156
  49. data/lib/padrino-admin/config.rb +0 -36
  50. data/lib/padrino-admin/generators/admin_uploader.rb +0 -88
  51. data/lib/padrino-admin/generators/app/controllers/accounts.rb +0 -37
  52. data/lib/padrino-admin/generators/app/controllers/base.rb +0 -11
  53. data/lib/padrino-admin/generators/app/controllers/javascripts.rb +0 -10
  54. data/lib/padrino-admin/generators/app/views/accounts/_form.haml +0 -24
  55. data/lib/padrino-admin/generators/app/views/accounts/edit.haml +0 -3
  56. data/lib/padrino-admin/generators/app/views/accounts/grid.js.erb +0 -9
  57. data/lib/padrino-admin/generators/app/views/accounts/new.haml +0 -3
  58. data/lib/padrino-admin/generators/app/views/accounts/store.jml +0 -7
  59. data/lib/padrino-admin/generators/app/views/base/dashboard.haml +0 -3
  60. data/lib/padrino-admin/generators/app/views/base/index.haml +0 -19
  61. data/lib/padrino-admin/generators/app/views/javascripts/admin.js.erb +0 -490
  62. data/lib/padrino-admin/generators/app/views/javascripts/locale.js.erb +0 -135
  63. data/lib/padrino-admin/generators/app/views/sessions/new.haml +0 -26
  64. data/lib/padrino-admin/generators/assets/flash/charts.swf +0 -0
  65. data/lib/padrino-admin/generators/assets/flash/clippy.swf +0 -0
  66. data/lib/padrino-admin/generators/assets/flash/expressinstall.swf +0 -0
  67. data/lib/padrino-admin/generators/assets/flash/swfupload.swf +0 -0
  68. data/lib/padrino-admin/generators/assets/images/admin/back.gif +0 -0
  69. data/lib/padrino-admin/generators/assets/images/admin/background.png +0 -0
  70. data/lib/padrino-admin/generators/assets/images/admin/bg-content.png +0 -0
  71. data/lib/padrino-admin/generators/assets/images/admin/bg-hd-slate.png +0 -0
  72. data/lib/padrino-admin/generators/assets/images/admin/bg-hd.png +0 -0
  73. data/lib/padrino-admin/generators/assets/images/admin/bg-intro.png +0 -0
  74. data/lib/padrino-admin/generators/assets/images/admin/bg-login.png +0 -0
  75. data/lib/padrino-admin/generators/assets/images/admin/bg-menu-slate.png +0 -0
  76. data/lib/padrino-admin/generators/assets/images/admin/bg-menu.png +0 -0
  77. data/lib/padrino-admin/generators/assets/images/admin/bg.png +0 -0
  78. data/lib/padrino-admin/generators/assets/images/admin/btn-login.png +0 -0
  79. data/lib/padrino-admin/generators/assets/images/admin/cancel.gif +0 -0
  80. data/lib/padrino-admin/generators/assets/images/admin/categories.gif +0 -0
  81. data/lib/padrino-admin/generators/assets/images/admin/close.gif +0 -0
  82. data/lib/padrino-admin/generators/assets/images/admin/close.png +0 -0
  83. data/lib/padrino-admin/generators/assets/images/admin/delete.gif +0 -0
  84. data/lib/padrino-admin/generators/assets/images/admin/download.gif +0 -0
  85. data/lib/padrino-admin/generators/assets/images/admin/duplicate.gif +0 -0
  86. data/lib/padrino-admin/generators/assets/images/admin/edit.gif +0 -0
  87. data/lib/padrino-admin/generators/assets/images/admin/export.gif +0 -0
  88. data/lib/padrino-admin/generators/assets/images/admin/hd-bg.gif +0 -0
  89. data/lib/padrino-admin/generators/assets/images/admin/image.gif +0 -0
  90. data/lib/padrino-admin/generators/assets/images/admin/loader.gif +0 -0
  91. data/lib/padrino-admin/generators/assets/images/admin/logo-loader.png +0 -0
  92. data/lib/padrino-admin/generators/assets/images/admin/logo-small.png +0 -0
  93. data/lib/padrino-admin/generators/assets/images/admin/new.gif +0 -0
  94. data/lib/padrino-admin/generators/assets/images/admin/no-image.png +0 -0
  95. data/lib/padrino-admin/generators/assets/images/admin/preview.gif +0 -0
  96. data/lib/padrino-admin/generators/assets/images/admin/print.gif +0 -0
  97. data/lib/padrino-admin/generators/assets/images/admin/save.gif +0 -0
  98. data/lib/padrino-admin/generators/assets/images/admin/support.gif +0 -0
  99. data/lib/padrino-admin/generators/assets/images/admin/up.gif +0 -0
  100. data/lib/padrino-admin/generators/assets/images/ext/default/box/corners-blue.gif +0 -0
  101. data/lib/padrino-admin/generators/assets/images/ext/default/box/corners.gif +0 -0
  102. data/lib/padrino-admin/generators/assets/images/ext/default/box/l-blue.gif +0 -0
  103. data/lib/padrino-admin/generators/assets/images/ext/default/box/l.gif +0 -0
  104. data/lib/padrino-admin/generators/assets/images/ext/default/box/r-blue.gif +0 -0
  105. data/lib/padrino-admin/generators/assets/images/ext/default/box/r.gif +0 -0
  106. data/lib/padrino-admin/generators/assets/images/ext/default/box/tb-blue.gif +0 -0
  107. data/lib/padrino-admin/generators/assets/images/ext/default/box/tb.gif +0 -0
  108. data/lib/padrino-admin/generators/assets/images/ext/default/button/arrow.gif +0 -0
  109. data/lib/padrino-admin/generators/assets/images/ext/default/button/btn.gif +0 -0
  110. data/lib/padrino-admin/generators/assets/images/ext/default/button/group-cs.gif +0 -0
  111. data/lib/padrino-admin/generators/assets/images/ext/default/button/group-lr.gif +0 -0
  112. data/lib/padrino-admin/generators/assets/images/ext/default/button/group-tb.gif +0 -0
  113. data/lib/padrino-admin/generators/assets/images/ext/default/button/s-arrow-b-noline.gif +0 -0
  114. data/lib/padrino-admin/generators/assets/images/ext/default/button/s-arrow-b.gif +0 -0
  115. data/lib/padrino-admin/generators/assets/images/ext/default/button/s-arrow-bo.gif +0 -0
  116. data/lib/padrino-admin/generators/assets/images/ext/default/button/s-arrow-noline.gif +0 -0
  117. data/lib/padrino-admin/generators/assets/images/ext/default/button/s-arrow-o.gif +0 -0
  118. data/lib/padrino-admin/generators/assets/images/ext/default/button/s-arrow.gif +0 -0
  119. data/lib/padrino-admin/generators/assets/images/ext/default/dd/drop-add.gif +0 -0
  120. data/lib/padrino-admin/generators/assets/images/ext/default/dd/drop-no.gif +0 -0
  121. data/lib/padrino-admin/generators/assets/images/ext/default/dd/drop-yes.gif +0 -0
  122. data/lib/padrino-admin/generators/assets/images/ext/default/editor/tb-sprite.gif +0 -0
  123. data/lib/padrino-admin/generators/assets/images/ext/default/form/checkbox.gif +0 -0
  124. data/lib/padrino-admin/generators/assets/images/ext/default/form/clear-trigger.gif +0 -0
  125. data/lib/padrino-admin/generators/assets/images/ext/default/form/clear-trigger.psd +0 -0
  126. data/lib/padrino-admin/generators/assets/images/ext/default/form/date-trigger.gif +0 -0
  127. data/lib/padrino-admin/generators/assets/images/ext/default/form/date-trigger.psd +0 -0
  128. data/lib/padrino-admin/generators/assets/images/ext/default/form/error-tip-corners.gif +0 -0
  129. data/lib/padrino-admin/generators/assets/images/ext/default/form/exclamation.gif +0 -0
  130. data/lib/padrino-admin/generators/assets/images/ext/default/form/radio.gif +0 -0
  131. data/lib/padrino-admin/generators/assets/images/ext/default/form/search-trigger.gif +0 -0
  132. data/lib/padrino-admin/generators/assets/images/ext/default/form/search-trigger.psd +0 -0
  133. data/lib/padrino-admin/generators/assets/images/ext/default/form/text-bg.gif +0 -0
  134. data/lib/padrino-admin/generators/assets/images/ext/default/form/trigger-tpl.gif +0 -0
  135. data/lib/padrino-admin/generators/assets/images/ext/default/form/trigger.gif +0 -0
  136. data/lib/padrino-admin/generators/assets/images/ext/default/form/trigger.psd +0 -0
  137. data/lib/padrino-admin/generators/assets/images/ext/default/gradient-bg.gif +0 -0
  138. data/lib/padrino-admin/generators/assets/images/ext/default/grid/Thumbs.db +0 -0
  139. data/lib/padrino-admin/generators/assets/images/ext/default/grid/arrow-left-white.gif +0 -0
  140. data/lib/padrino-admin/generators/assets/images/ext/default/grid/arrow-right-white.gif +0 -0
  141. data/lib/padrino-admin/generators/assets/images/ext/default/grid/col-move-bottom.gif +0 -0
  142. data/lib/padrino-admin/generators/assets/images/ext/default/grid/col-move-top.gif +0 -0
  143. data/lib/padrino-admin/generators/assets/images/ext/default/grid/columns.gif +0 -0
  144. data/lib/padrino-admin/generators/assets/images/ext/default/grid/dirty.gif +0 -0
  145. data/lib/padrino-admin/generators/assets/images/ext/default/grid/done.gif +0 -0
  146. data/lib/padrino-admin/generators/assets/images/ext/default/grid/drop-no.gif +0 -0
  147. data/lib/padrino-admin/generators/assets/images/ext/default/grid/drop-yes.gif +0 -0
  148. data/lib/padrino-admin/generators/assets/images/ext/default/grid/footer-bg.gif +0 -0
  149. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid-blue-hd.gif +0 -0
  150. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid-blue-split.gif +0 -0
  151. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid-hrow.gif +0 -0
  152. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid-loading.gif +0 -0
  153. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid-split.gif +0 -0
  154. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid-vista-hd.gif +0 -0
  155. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid3-hd-btn.gif +0 -0
  156. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid3-hrow-over.gif +0 -0
  157. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid3-hrow.gif +0 -0
  158. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid3-special-col-bg.gif +0 -0
  159. data/lib/padrino-admin/generators/assets/images/ext/default/grid/grid3-special-col-sel-bg.gif +0 -0
  160. data/lib/padrino-admin/generators/assets/images/ext/default/grid/group-by.gif +0 -0
  161. data/lib/padrino-admin/generators/assets/images/ext/default/grid/group-expand-sprite.gif +0 -0
  162. data/lib/padrino-admin/generators/assets/images/ext/default/grid/hd-pop.gif +0 -0
  163. data/lib/padrino-admin/generators/assets/images/ext/default/grid/hmenu-asc.gif +0 -0
  164. data/lib/padrino-admin/generators/assets/images/ext/default/grid/hmenu-desc.gif +0 -0
  165. data/lib/padrino-admin/generators/assets/images/ext/default/grid/hmenu-lock.gif +0 -0
  166. data/lib/padrino-admin/generators/assets/images/ext/default/grid/hmenu-lock.png +0 -0
  167. data/lib/padrino-admin/generators/assets/images/ext/default/grid/hmenu-unlock.gif +0 -0
  168. data/lib/padrino-admin/generators/assets/images/ext/default/grid/hmenu-unlock.png +0 -0
  169. data/lib/padrino-admin/generators/assets/images/ext/default/grid/invalid_line.gif +0 -0
  170. data/lib/padrino-admin/generators/assets/images/ext/default/grid/loading.gif +0 -0
  171. data/lib/padrino-admin/generators/assets/images/ext/default/grid/mso-hd.gif +0 -0
  172. data/lib/padrino-admin/generators/assets/images/ext/default/grid/nowait.gif +0 -0
  173. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-first-disabled.gif +0 -0
  174. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-first.gif +0 -0
  175. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-last-disabled.gif +0 -0
  176. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-last.gif +0 -0
  177. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-next-disabled.gif +0 -0
  178. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-next.gif +0 -0
  179. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-prev-disabled.gif +0 -0
  180. data/lib/padrino-admin/generators/assets/images/ext/default/grid/page-prev.gif +0 -0
  181. data/lib/padrino-admin/generators/assets/images/ext/default/grid/pick-button.gif +0 -0
  182. data/lib/padrino-admin/generators/assets/images/ext/default/grid/refresh.gif +0 -0
  183. data/lib/padrino-admin/generators/assets/images/ext/default/grid/row-check-sprite.gif +0 -0
  184. data/lib/padrino-admin/generators/assets/images/ext/default/grid/row-expand-sprite.gif +0 -0
  185. data/lib/padrino-admin/generators/assets/images/ext/default/grid/row-over.gif +0 -0
  186. data/lib/padrino-admin/generators/assets/images/ext/default/grid/row-sel.gif +0 -0
  187. data/lib/padrino-admin/generators/assets/images/ext/default/grid/sort-hd.gif +0 -0
  188. data/lib/padrino-admin/generators/assets/images/ext/default/grid/sort_asc.gif +0 -0
  189. data/lib/padrino-admin/generators/assets/images/ext/default/grid/sort_desc.gif +0 -0
  190. data/lib/padrino-admin/generators/assets/images/ext/default/grid/wait.gif +0 -0
  191. data/lib/padrino-admin/generators/assets/images/ext/default/layout/collapse.gif +0 -0
  192. data/lib/padrino-admin/generators/assets/images/ext/default/layout/expand.gif +0 -0
  193. data/lib/padrino-admin/generators/assets/images/ext/default/layout/gradient-bg.gif +0 -0
  194. data/lib/padrino-admin/generators/assets/images/ext/default/layout/mini-bottom.gif +0 -0
  195. data/lib/padrino-admin/generators/assets/images/ext/default/layout/mini-left.gif +0 -0
  196. data/lib/padrino-admin/generators/assets/images/ext/default/layout/mini-right.gif +0 -0
  197. data/lib/padrino-admin/generators/assets/images/ext/default/layout/mini-top.gif +0 -0
  198. data/lib/padrino-admin/generators/assets/images/ext/default/layout/ns-collapse.gif +0 -0
  199. data/lib/padrino-admin/generators/assets/images/ext/default/layout/ns-expand.gif +0 -0
  200. data/lib/padrino-admin/generators/assets/images/ext/default/layout/panel-close.gif +0 -0
  201. data/lib/padrino-admin/generators/assets/images/ext/default/layout/panel-title-bg.gif +0 -0
  202. data/lib/padrino-admin/generators/assets/images/ext/default/layout/panel-title-light-bg.gif +0 -0
  203. data/lib/padrino-admin/generators/assets/images/ext/default/layout/stick.gif +0 -0
  204. data/lib/padrino-admin/generators/assets/images/ext/default/layout/stuck.gif +0 -0
  205. data/lib/padrino-admin/generators/assets/images/ext/default/layout/tab-close-on.gif +0 -0
  206. data/lib/padrino-admin/generators/assets/images/ext/default/layout/tab-close.gif +0 -0
  207. data/lib/padrino-admin/generators/assets/images/ext/default/menu/checked.gif +0 -0
  208. data/lib/padrino-admin/generators/assets/images/ext/default/menu/group-checked.gif +0 -0
  209. data/lib/padrino-admin/generators/assets/images/ext/default/menu/item-over.gif +0 -0
  210. data/lib/padrino-admin/generators/assets/images/ext/default/menu/menu-parent.gif +0 -0
  211. data/lib/padrino-admin/generators/assets/images/ext/default/menu/menu.gif +0 -0
  212. data/lib/padrino-admin/generators/assets/images/ext/default/menu/unchecked.gif +0 -0
  213. data/lib/padrino-admin/generators/assets/images/ext/default/panel/corners-sprite.gif +0 -0
  214. data/lib/padrino-admin/generators/assets/images/ext/default/panel/left-right.gif +0 -0
  215. data/lib/padrino-admin/generators/assets/images/ext/default/panel/light-hd.gif +0 -0
  216. data/lib/padrino-admin/generators/assets/images/ext/default/panel/tool-sprite-tpl.gif +0 -0
  217. data/lib/padrino-admin/generators/assets/images/ext/default/panel/tool-sprites.gif +0 -0
  218. data/lib/padrino-admin/generators/assets/images/ext/default/panel/tools-sprites-trans.gif +0 -0
  219. data/lib/padrino-admin/generators/assets/images/ext/default/panel/top-bottom.gif +0 -0
  220. data/lib/padrino-admin/generators/assets/images/ext/default/panel/top-bottom.png +0 -0
  221. data/lib/padrino-admin/generators/assets/images/ext/default/panel/white-corners-sprite.gif +0 -0
  222. data/lib/padrino-admin/generators/assets/images/ext/default/panel/white-left-right.gif +0 -0
  223. data/lib/padrino-admin/generators/assets/images/ext/default/panel/white-top-bottom.gif +0 -0
  224. data/lib/padrino-admin/generators/assets/images/ext/default/progress/progress-bg.gif +0 -0
  225. data/lib/padrino-admin/generators/assets/images/ext/default/qtip/bg.gif +0 -0
  226. data/lib/padrino-admin/generators/assets/images/ext/default/qtip/close.gif +0 -0
  227. data/lib/padrino-admin/generators/assets/images/ext/default/qtip/tip-anchor-sprite.gif +0 -0
  228. data/lib/padrino-admin/generators/assets/images/ext/default/qtip/tip-sprite.gif +0 -0
  229. data/lib/padrino-admin/generators/assets/images/ext/default/s.gif +0 -0
  230. data/lib/padrino-admin/generators/assets/images/ext/default/shadow-c.png +0 -0
  231. data/lib/padrino-admin/generators/assets/images/ext/default/shadow-lr.png +0 -0
  232. data/lib/padrino-admin/generators/assets/images/ext/default/shadow.png +0 -0
  233. data/lib/padrino-admin/generators/assets/images/ext/default/shared/blue-loading.gif +0 -0
  234. data/lib/padrino-admin/generators/assets/images/ext/default/shared/calendar.gif +0 -0
  235. data/lib/padrino-admin/generators/assets/images/ext/default/shared/glass-bg.gif +0 -0
  236. data/lib/padrino-admin/generators/assets/images/ext/default/shared/hd-sprite.gif +0 -0
  237. data/lib/padrino-admin/generators/assets/images/ext/default/shared/large-loading.gif +0 -0
  238. data/lib/padrino-admin/generators/assets/images/ext/default/shared/left-btn.gif +0 -0
  239. data/lib/padrino-admin/generators/assets/images/ext/default/shared/loading-balls.gif +0 -0
  240. data/lib/padrino-admin/generators/assets/images/ext/default/shared/right-btn.gif +0 -0
  241. data/lib/padrino-admin/generators/assets/images/ext/default/shared/warning.gif +0 -0
  242. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/e-handle-dark.gif +0 -0
  243. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/e-handle.gif +0 -0
  244. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/ne-handle-dark.gif +0 -0
  245. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/ne-handle.gif +0 -0
  246. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/nw-handle-dark.gif +0 -0
  247. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/nw-handle.gif +0 -0
  248. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/s-handle-dark.gif +0 -0
  249. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/s-handle.gif +0 -0
  250. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/se-handle-dark.gif +0 -0
  251. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/se-handle.gif +0 -0
  252. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/square.gif +0 -0
  253. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/sw-handle-dark.gif +0 -0
  254. data/lib/padrino-admin/generators/assets/images/ext/default/sizer/sw-handle.gif +0 -0
  255. data/lib/padrino-admin/generators/assets/images/ext/default/slider/slider-bg.png +0 -0
  256. data/lib/padrino-admin/generators/assets/images/ext/default/slider/slider-thumb.png +0 -0
  257. data/lib/padrino-admin/generators/assets/images/ext/default/slider/slider-v-bg.png +0 -0
  258. data/lib/padrino-admin/generators/assets/images/ext/default/slider/slider-v-thumb.png +0 -0
  259. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/scroll-left.gif +0 -0
  260. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/scroll-right.gif +0 -0
  261. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/scroller-bg.gif +0 -0
  262. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-btm-inactive-left-bg.gif +0 -0
  263. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-btm-inactive-right-bg.gif +0 -0
  264. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-btm-left-bg.gif +0 -0
  265. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-btm-right-bg.gif +0 -0
  266. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-close.gif +0 -0
  267. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-strip-bg.gif +0 -0
  268. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-strip-bg.png +0 -0
  269. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tab-strip-btm-bg.gif +0 -0
  270. data/lib/padrino-admin/generators/assets/images/ext/default/tabs/tabs-sprite.gif +0 -0
  271. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/bg.gif +0 -0
  272. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/btn-arrow-light.gif +0 -0
  273. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/btn-arrow.gif +0 -0
  274. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/btn-over-bg.gif +0 -0
  275. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/gray-bg.gif +0 -0
  276. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/more.gif +0 -0
  277. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/tb-bg.gif +0 -0
  278. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/tb-btn-sprite.gif +0 -0
  279. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/tb-xl-btn-sprite.gif +0 -0
  280. data/lib/padrino-admin/generators/assets/images/ext/default/toolbar/tb-xl-sep.gif +0 -0
  281. data/lib/padrino-admin/generators/assets/images/ext/default/tree/arrows.gif +0 -0
  282. data/lib/padrino-admin/generators/assets/images/ext/default/tree/drop-add.gif +0 -0
  283. data/lib/padrino-admin/generators/assets/images/ext/default/tree/drop-between.gif +0 -0
  284. data/lib/padrino-admin/generators/assets/images/ext/default/tree/drop-no.gif +0 -0
  285. data/lib/padrino-admin/generators/assets/images/ext/default/tree/drop-over.gif +0 -0
  286. data/lib/padrino-admin/generators/assets/images/ext/default/tree/drop-under.gif +0 -0
  287. data/lib/padrino-admin/generators/assets/images/ext/default/tree/drop-yes.gif +0 -0
  288. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-end-minus-nl.gif +0 -0
  289. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-end-minus.gif +0 -0
  290. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-end-plus-nl.gif +0 -0
  291. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-end-plus.gif +0 -0
  292. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-end.gif +0 -0
  293. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-line.gif +0 -0
  294. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-minus-nl.gif +0 -0
  295. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-minus.gif +0 -0
  296. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-plus-nl.gif +0 -0
  297. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow-plus.gif +0 -0
  298. data/lib/padrino-admin/generators/assets/images/ext/default/tree/elbow.gif +0 -0
  299. data/lib/padrino-admin/generators/assets/images/ext/default/tree/folder-open.gif +0 -0
  300. data/lib/padrino-admin/generators/assets/images/ext/default/tree/folder.gif +0 -0
  301. data/lib/padrino-admin/generators/assets/images/ext/default/tree/leaf.gif +0 -0
  302. data/lib/padrino-admin/generators/assets/images/ext/default/tree/loading.gif +0 -0
  303. data/lib/padrino-admin/generators/assets/images/ext/default/tree/s.gif +0 -0
  304. data/lib/padrino-admin/generators/assets/images/ext/default/window/icon-error.gif +0 -0
  305. data/lib/padrino-admin/generators/assets/images/ext/default/window/icon-info.gif +0 -0
  306. data/lib/padrino-admin/generators/assets/images/ext/default/window/icon-question.gif +0 -0
  307. data/lib/padrino-admin/generators/assets/images/ext/default/window/icon-warning.gif +0 -0
  308. data/lib/padrino-admin/generators/assets/images/ext/default/window/left-corners.png +0 -0
  309. data/lib/padrino-admin/generators/assets/images/ext/default/window/left-corners.psd +0 -0
  310. data/lib/padrino-admin/generators/assets/images/ext/default/window/left-right.png +0 -0
  311. data/lib/padrino-admin/generators/assets/images/ext/default/window/left-right.psd +0 -0
  312. data/lib/padrino-admin/generators/assets/images/ext/default/window/right-corners.png +0 -0
  313. data/lib/padrino-admin/generators/assets/images/ext/default/window/right-corners.psd +0 -0
  314. data/lib/padrino-admin/generators/assets/images/ext/default/window/top-bottom.png +0 -0
  315. data/lib/padrino-admin/generators/assets/images/ext/default/window/top-bottom.psd +0 -0
  316. data/lib/padrino-admin/generators/assets/javascripts/controls.js +0 -3
  317. data/lib/padrino-admin/generators/assets/javascripts/dragdrop.js +0 -3
  318. data/lib/padrino-admin/generators/assets/javascripts/effects.js +0 -4
  319. data/lib/padrino-admin/generators/assets/javascripts/ext.js +0 -29
  320. data/lib/padrino-admin/generators/assets/javascripts/prototype.js +0 -14
  321. data/lib/padrino-admin/generators/assets/javascripts/swfupload.js +0 -4
  322. data/lib/padrino-admin/generators/assets/stylesheets/admin.css +0 -60
  323. data/lib/padrino-admin/generators/assets/stylesheets/ext.css +0 -1543
  324. data/lib/padrino-admin/generators/assets/stylesheets/login.css +0 -17
  325. data/lib/padrino-admin/generators/assets/stylesheets/standard.css +0 -62
  326. data/lib/padrino-admin/generators/templates/page/views/_form.haml.tt +0 -9
  327. data/lib/padrino-admin/generators/templates/page/views/edit.haml.tt +0 -3
  328. data/lib/padrino-admin/generators/templates/page/views/grid.js.erb.tt +0 -9
  329. data/lib/padrino-admin/generators/templates/page/views/new.haml.tt +0 -3
  330. data/lib/padrino-admin/generators/templates/page/views/store.jml.tt +0 -6
  331. data/lib/padrino-admin/generators/templates/uploader/controller.rb +0 -24
  332. data/lib/padrino-admin/generators/templates/uploader/lib/uploader.rb +0 -66
  333. data/lib/padrino-admin/generators/templates/uploader/views/grid.js.erb +0 -57
  334. data/lib/padrino-admin/generators/templates/uploader/views/store.jml +0 -10
  335. data/lib/padrino-admin/locale/extjs/de.yml +0 -147
  336. data/lib/padrino-admin/locale/extjs/en.yml +0 -147
  337. data/lib/padrino-admin/locale/extjs/it.yml +0 -147
  338. data/lib/padrino-admin/orm.rb +0 -48
  339. data/lib/padrino-admin/orm/abstract.rb +0 -95
  340. data/lib/padrino-admin/orm/activerecord.rb +0 -144
  341. data/lib/padrino-admin/orm/datamapper.rb +0 -229
  342. data/lib/padrino-admin/orm/mongomapper.rb +0 -65
  343. data/lib/padrino-admin/utils/literal.rb +0 -13
  344. data/test/fixtures/active_record.rb +0 -29
  345. data/test/fixtures/mongo_mapper.rb +0 -12
  346. data/test/fixtures/test_column_store.jml +0 -11
  347. data/test/generators/test_admin_uploader_generator.rb +0 -56
  348. data/test/test_access_control.rb +0 -99
  349. data/test/test_active_record.rb +0 -96
  350. data/test/test_column_store.rb +0 -87
  351. data/test/test_config.rb +0 -13
  352. data/test/test_data_mapper.rb +0 -114
  353. data/test/test_mongo_mapper.rb +0 -30
data/README.rdoc CHANGED
@@ -2,12 +2,11 @@
2
2
 
3
3
  === Overview
4
4
 
5
- Padrino has a beautiful Ajax Admin, with these fatures:
5
+ Padrino has a beautiful Admin, with these fatures:
6
6
 
7
7
  Orm Agnostic:: Adapters for datamapper, activerecord, mongomapper, couchdb (now only: datamapper and activerecord)
8
8
  Authentication:: Support for Account authentication, Account Permission managment
9
9
  Scaffold:: You can simply create a new "admin interface" simply providing a Model
10
- Ajax Uploads:: You can upload file, manage them and attach them to any model in a quick and simple way (coming soon)
11
10
 
12
11
  === Admin Usage
13
12
 
@@ -23,118 +22,75 @@ For create the admin application:
23
22
  Now follow admin instructions so:
24
23
 
25
24
  * edit your config/database.rb
26
- * run padrino rake dm:auto:migrate
25
+ * run padrino rake dm:migrate # or ar:migrate if you use activerecord
27
26
  * run padrino rake seed
28
27
 
29
28
  Your admin now is "complete", you can start your server with <tt>padrino start</tt> and point your browser to /admin!
30
29
 
31
30
  For create a new "scaffold" you need to provide only a Model for them like:
32
31
 
33
- fun-test$ padrino-gen model post --skip-migration // edit your post.rb model and add some fields
32
+ fun-test$ padrino-gen model post --skip-migration # edit your post.rb model and add some fields
34
33
  fun-test$ padrino-gen rake dm:auto:migrate
35
- fun-test$ padrino-gen admin_page Post
36
- fun-test$ padrino start // and go to yourserver.local/admin
34
+ fun-test$ padrino-gen admin_page post
35
+ fun-test$ padrino start # and go to http://localhost:3000/admin
37
36
 
38
37
  That's all!!
39
38
 
40
39
  === Admin Authentication
41
40
 
42
- Padrino Admin use a model Account for manage role, membership and permissions take the following example:
41
+ Padrino Admin use a model Account for manage role, membership and permissions.
43
42
 
44
- access_control.roles_for :any do |role|
45
- role.allow "/sessions"
46
- # role.deny "/deny/this/always"
47
- end
48
43
 
49
- access_control.roles_for :admin do |role, account|
50
- role.allow "/"
44
+ ==== Scenario Ecommerce
51
45
 
52
- role.project_module :accounts do |project|
53
- project.menu :list, "/admin/accounts.js"
54
- project.menu :new, "/admin/accounts/new"
55
- end
56
- end
46
+ For an ecommerce we usually deny some controllers/actions like
57
47
 
58
- access_control.roles_for :editor do |role, account|
59
- role.project_module :posts do |project|
60
- project.menu :list, "/admin/posts.js"
61
- project.menu :new, "/admin/posts/new"
62
- end
48
+ class MyEcommerce < Padrino::Application
49
+ enable :authentication
50
+ enable :store_location
51
+ set :login_page, "/login"
63
52
 
64
- role.project_module :comments do |project|
65
- project.menu :list, "/admin/comments.js"
66
- project.menu :new, "/admin/comments/new"
53
+ access_control.roles_for :any do |role|
54
+ role.protect "/customer/orders"
55
+ role.protect "/cart/checkout"
67
56
  end
68
57
  end
69
58
 
70
- In this example we <tt>grant</tt> "/session" (and each subpaths like /sessions/new) for all users logged and unlogged.
71
-
72
- Account with role <tt>admin</tt> can manage <tt>only</tt> accounts because have access to "/admin/accounts/**" paths
73
- Account with role <tt>editor</tt> can manage <tt>only</tt> post/comments because have access to "/admin/posts/**", "/admin/posts/**" paths
74
-
75
- Another good fature of Padrino admin is that when you define a <tt>Project Module</tt> role you also build the Menu Tree of the Admin.
76
- Trust us that in future you appreciate so much this feature.
77
-
78
- === Admin Uploads
79
-
80
- Padrino admin has a builtin upload managment that leave you to be free as possible.
81
-
82
- fun-test$ padrino-gen admin_uploader
83
- fun-test$ rake dm:auto:upgrade # or ar:migrate
84
-
85
- Finish! Now you can browse into your admin and you can see a new menu called +upload+ where you can see all your uploads,
86
- upload other file, delete ...
87
-
88
- All upload definitions are defined in lib/uploader.rb, here you can preproces your attachments (like resize) or manage versions.
89
-
90
- See http://github.com/jnicklas/carrierwave
59
+ In this example +if+ we visit urls that start with /+customer+/+orders+ or /+cart/checkout+ we will be redirected
60
+ to our :+login_page+ "/login". Once we are correctly logged in we can visit these pages.
91
61
 
92
- ==== Attach Many Uploads to a Model
62
+ ==== Scenario Admin
93
63
 
94
- If you want attach in a model ex: Account many uploads you can do that in a simple way add a habtm relation!
64
+ Suppose that you need to some actions for +admin+ accounts and others for +editors+
95
65
 
96
- # app/models/account.rb
97
- has n, :uploads
66
+ When you generate padrino-admin will be created for you an +Account+ model that have a +role+ attribute. So:
98
67
 
99
- or for ActiveRecord
68
+ class Admin < Padrino::Application
69
+ enable :authentication
70
+ disable :store_location
71
+ set :login_page, "/admin/sessions/new"
100
72
 
101
- # app/models/account.rb
102
- has_and_belongs_to_many :uploads
103
-
104
- Now edit the form and add these lines:
105
-
106
- # admin/views/accounts/_form.haml
107
- %tr
108
- %td=f.label :uploads
109
- %td=f.open_window_grid :upload_ids, :with => :uploads, :get => :id, :show => :file, :multiple => true, :item => :panel
110
-
111
- *open_window_grid* is a padrino-admin method that open an extjs window contains your +grids+ so in this case:
112
-
113
- open window grid for :+account+ model in method :+upload_ids+ with the help of controller :+uploads+ and
114
- get as a value the :+id+ and display :+file+.
115
-
116
- :+multiple+ indicate that we need more than one :+id+.
117
- :+item+ tell to the grid who is the container, we need to explicit this because we have two container in our upload.js
118
-
119
- See view helpers[http://github.com/padrino/padrino-framework/blob/master/padrino-admin/lib/padrino-admin/helpers/view.rb#L145] for more docs.
120
-
121
- That's all! Now run mingrations and browse accounts for see our uploader.
122
-
123
- ==== Attach One Upload to a Model
73
+ access_control.roles_for :any do |role|
74
+ role.protect "/"
75
+ role.allow "/sessions"
76
+ end
124
77
 
125
- The process is the same as above you need only define in your model:
78
+ access_control.roles_for :admin do |role|
79
+ role.project_module :settings, "/settings"
80
+ end
126
81
 
127
- # app/models/account.rb
128
- belongs_to :upload
82
+ access_control.roles_for :editor do |role|
83
+ role.project_module :posts, "/posts"
84
+ role.project_module :categories, "/categories"
85
+ end
86
+ end
129
87
 
130
- and add this to your account form:
88
+ In this case we +protect+ the entire admin (all paths that start with "/") except paths that start with /+sessions+ so
89
+ an +unauthenticated+ user can login.
131
90
 
132
- # admin/views/accounts/_form.haml
133
- %tr
134
- %td=f.label :upload
135
- %td=f.open_window_grid :upload_id, :with => :uploads, :get => :id, :show => :file, :item => :panel
91
+ If we login as +admin+ (account.role == 'admin') we have access *only* to paths that start with /+settings+.
136
92
 
137
- Remember to run migrations before start your server.
93
+ If we login as +editor+ (account.role == 'editor') we have access *only* to paths that start with /+posts+ and /+categories+
138
94
 
139
95
  == Copyright
140
96
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.5
1
+ 0.9.0
data/lib/padrino-admin.rb CHANGED
@@ -3,7 +3,7 @@ require 'padrino-gen'
3
3
  require 'padrino-helpers'
4
4
 
5
5
  Dir[File.dirname(__FILE__) + '/padrino-admin/*.rb'].each {|file| require file }
6
- Dir[File.dirname(__FILE__) + '/padrino-admin/{helpers,orm,middleware,utils}/*.rb'].each {|file| require file }
6
+ Dir[File.dirname(__FILE__) + '/padrino-admin/{helpers,middleware,utils}/*.rb'].each {|file| require file }
7
7
 
8
8
  module Padrino
9
9
  ##
@@ -21,35 +21,18 @@ end
21
21
  # We need to apply Padrino::Admin::Utils::Extensions
22
22
  #
23
23
  String.send(:include, Padrino::Admin::Utils::Crypt)
24
- String.send(:include, Padrino::Admin::Utils::Literal)
25
24
 
26
25
  ##
27
26
  # We need to add to Padrino::Application a +access_control+ class
28
27
  #
29
- Padrino::Application.send(:cattr_accessor, :access_control)
30
- Padrino::Application.send(:access_control=, Class.new(Padrino::Admin::AccessControl::Base))
31
-
32
- ##
33
- # If CarrierWave is defined we set the root directory
34
- #
35
- CarrierWave.root = Padrino.root("public") if defined?(CarrierWave)
36
-
37
- ##
38
- # Extend Abastract Form builder
39
- #
40
- Padrino::Helpers::FormBuilder::AbstractFormBuilder.send(:include, Padrino::Admin::Helpers::ViewHelpers::AbstractFormBuilder)
28
+ Padrino::Application.extend(Padrino::Admin::AccessControl::ClassMethods)
41
29
 
42
30
  ##
43
31
  # Load our Padrino::Admin locales
44
32
  #
45
33
  I18n.load_path += Dir["#{File.dirname(__FILE__)}/padrino-admin/locale/**/*.yml"]
46
34
 
47
- ##
48
- # Load our databases extensions
49
- #
50
- Padrino::Admin::Orm.register!
51
-
52
35
  ##
53
36
  # Now we need to add admin generators to padrino-gen
54
37
  #
55
- Padrino::Generators.load_paths << Dir[File.dirname(__FILE__) + '/padrino-admin/generators/{actions,admin_app,admin_page,admin_uploader}.rb']
38
+ Padrino::Generators.load_paths << Dir[File.dirname(__FILE__) + '/padrino-admin/generators/{actions,orm,admin_app,admin_page}.rb']
@@ -2,396 +2,148 @@ module Padrino
2
2
  module Admin
3
3
  class AccessControlError < StandardError #:nodoc:
4
4
  end
5
-
6
5
  ##
7
- # This module give to a padrino application an access control functionality like:
8
- #
9
- # class EcommerceDemo < Padrino::Application
10
- # enable :authentication
11
- # set :login_page, "/login" # or your login page
12
- # enable :store_location # if you want know what is the page that need authentication
13
- #
14
- # access_control.roles_for :any do
15
- # role.require_login "/cart"
16
- # role.require_login "/account"
17
- # role.allow "/account/create"
18
- # end
19
- # end
20
- #
21
- # In the EcommerceDemo, we +only+ require logins for all paths that start with "/cart" like:
22
- #
23
- # - "/cart/add"
24
- # - "/cart/empty"
25
- # - "/cart/checkout"
26
- #
27
- # same thing for "/account" so we require a login for:
28
- #
29
- # - "/account"
30
- # - "/account/edit"
31
- # - "/account/update"
32
- #
33
- # but if we call "/account/create" we don't need to be logged in our site for do that.
34
- # In EcommerceDemo example we set +redirect_back_or_default+ so if a +unlogged+
35
- # user try to access "/account/edit" will be redirected to "/login" when login is done will be
36
- # redirected to "/account/edit".
37
- #
38
- # If we need something more complex aka roles/permissions we can do that in the same simple way
39
- #
40
- # class AdminDemo < Padrino::Application
41
- # enable :authentication
42
- # set :login_page, "/sessions/new" # or your page
43
- #
44
- # access_control.roles_for :any do |role|
45
- # role.allow "/sessions"
46
- # end
47
- #
48
- # access_control.roles_for :admin do |role, account|
49
- # role.allow "/"
50
- # role.deny "/posts"
51
- # end
52
- #
53
- # access_control.roles_for :editor do |role, account|
54
- # role.allow "/posts"
55
- # end
56
- # end
57
- #
58
- # If a user logged with role admin can:
59
- #
60
- # - Access to all paths that start with "/session" like "/sessions/{new,create}"
61
- # - Access to any page except those that start with "/posts"
62
- #
63
- # If a user logged with role editor can:
64
- #
65
- # - Access to all paths that start with "/session" like "/sessions/{new,create}"
66
- # - Access +only+ to paths that start with "/posts" like "/post/{new,edit,destroy}"
67
- #
68
- # Finally we have another good fatures, the possibility in the same time we build role build also +tree+.
69
- # Figure this scenario: in my admin every account need their own menu, so an Account with role editor have
70
- # a menu different than an Account with role admin.
71
- #
72
- # So:
73
- #
74
- # class AdminDemo < Padrino::Application
75
- # enable :authentication
76
- #
77
- # access_control.roles_for :any do |role|
78
- # role.allow "/sessions"
79
- # end
80
- #
81
- # access_control.roles_for :admin do |role, current_account|
82
- #
83
- # role.project_module :settings do |project|
84
- # project.menu :accounts, "/accounts" do |accounts|
85
- # accounts.add :new, "/accounts/new" do |account|
86
- # account.add :administrator, "/account/new/?role=administrator"
87
- # account.add :editor, "/account/new/?role=editor"
88
- # end
89
- # end
90
- # project.menu :spam_rules, "/manage_spam"
91
- # end
92
- #
93
- # role.project_module :categories do |project|
94
- # current_account.categories.each do |category|
95
- # project.menu category.name, "/categories/#{category.id}.js"
96
- # end
97
- # end
98
- # end
99
- #
100
- # access_control.roles_for :editor do |role, current_account|
101
- #
102
- # role.project_module :posts do |posts|
103
- # post.menu :list, "/posts"
104
- # post.menu :new, "/posts/new"
105
- # end
106
- # end
107
- #
108
- # In this example when we build our menu tree we are also defining roles so:
109
- #
110
- # An Admin Account have access to:
111
- #
112
- # - All paths that start with "/sessions"
113
- # - All paths that start with "/accounts"
114
- # - All paths that start with "/manage_spam"
115
- #
116
- # An Editor Account have access to:
117
- #
118
- # - All paths that start with "/posts"
119
- #
120
- # Remember that you always deny a specific actions or allow globally others.
121
- #
122
- # Remember that when you define role_for :a_role, you have also access to the Model Account.
6
+ # This module give to a padrino application an access control functionality
123
7
  #
124
8
  module AccessControl
125
-
126
9
  ##
127
10
  # Method used by Padrino::Application when we register the extension
128
11
  #
129
12
  def self.registered(app)
130
13
  app.set :session_id, "_padrino_#{File.basename(Padrino.root)}_#{app.app_name}".to_sym
131
- app.helpers Padrino::Admin::Helpers::ViewHelpers
132
14
  app.helpers Padrino::Admin::Helpers::AuthenticationHelpers
133
- app.before { login_required }
15
+ app.helpers Padrino::Admin::Helpers::ViewHelpers
134
16
  app.use Padrino::Admin::Middleware::FlashMiddleware, app.session_id # make sure that is the same of session_name in helpers
135
- Padrino::Admin::Orm.extend_account!
17
+ app.before { login_required }
136
18
  end
137
19
 
138
- class Base
139
- class << self
140
- attr_reader :roles
141
-
142
- def inherited(base) #:nodoc:
143
- base.class_eval("@@cache={}; @authorizations=[]; @roles=[]; @mappers=[]")
144
- base.send(:cattr_reader, :cache)
145
- super(base)
146
- end
147
-
148
- ##
149
- # We map project modules for a given role or roles
150
- #
151
- def roles_for(*roles, &block)
152
- raise Padrino::Admin::AccessControlError, "Role #{role} must be present and must be a symbol!" if roles.any? { |r| !r.kind_of?(Symbol) } || roles.empty?
153
- raise Padrino::Admin::AccessControlError, "You can't merge :any with other roles" if roles.size > 1 && roles.any? { |r| r == :any }
154
-
155
- if roles == [:any]
156
- @authorizations << Authorization.new(&block)
157
- else
158
- raise Padrino::Admin::AccessControlError, "For use custom roles you need to define an Account Class" unless defined?(Account)
159
- @roles.concat(roles)
160
- @mappers << Proc.new { |account| Mapper.new(account, *roles, &block) }
161
- end
162
- end
163
-
164
- ##
165
- # Returns (allowed && denied paths).
166
- # If an account given we also give allowed & denied paths for their role.
167
- #
168
- def auths(account=nil)
169
- if account
170
- cache[account.id] ||= Auths.new(@authorizations, @mappers, account)
171
- else
172
- cache[:any] ||= Auths.new(@authorizations)
173
- end
174
- end
20
+ module ClassMethods #:nodoc:
21
+ def inherited(base)
22
+ base.send(:cattr_accessor, :access_control)
23
+ base.send(:access_control=, Padrino::Admin::AccessControl::Base.new)
24
+ super(base)
175
25
  end
176
- end # Base
177
-
178
- class Auths #:nodoc:
179
- attr_reader :account, :allowed, :denied, :project_modules
26
+ end
180
27
 
181
- def initialize(authorizations, mappers=nil, account=nil) #:nodoc:
182
- @allowed, @denied, @account = [], [], account
183
- unless authorizations.empty?
184
- @allowed = authorizations.collect(&:allowed).flatten
185
- @denied = authorizations.collect(&:denied).flatten
186
- end
187
- if mappers && !mappers.empty?
188
- maps = mappers.collect { |m| m.call(account) }.reject { |m| !m.allowed? }
189
- @allowed.concat(maps.collect(&:allowed).flatten)
190
- @denied.concat(maps.collect(&:denied).flatten)
191
- @project_modules = maps.collect(&:project_modules).flatten.uniq
192
- else
193
- @project_modules = []
194
- end
195
- @allowed.uniq!
196
- @denied.uniq!
28
+ class Base
29
+ def initialize #:nodoc:
30
+ @roles, @authorizations, @project_modules = [], [], []
197
31
  end
198
-
199
32
  ##
200
- # Return true if the requested path (like request.path_info) is allowed.
33
+ # We map project modules for a given role or roles
201
34
  #
202
- def can?(request_path)
203
- return true if @allowed.empty?
204
- request_path = "/" if request_path.blank?
205
- @allowed.any? { |path| request_path =~ /^#{path}/ } && !cannot?(request_path)
35
+ def roles_for(*roles, &block)
36
+ raise Padrino::Admin::AccessControlError, "You must define an Account Model!" unless defined?(Account)
37
+ raise Padrino::Admin::AccessControlError, "Role #{role} must be present and must be a symbol!" if roles.any? { |r| !r.kind_of?(Symbol) } || roles.empty?
38
+ raise Padrino::Admin::AccessControlError, "You can't merge :any with other roles" if roles.size > 1 && roles.any? { |r| r == :any }
39
+
40
+ @roles += roles
41
+ @authorizations << Authorization.new(*roles, &block)
206
42
  end
207
43
 
208
44
  ##
209
- # Return false if we don't have +denied+ path +or+ if we have a logged account and empty project modules.
210
- # Return true if the requested path (like request.path_info) is +not+ allowed
45
+ # Return an array of roles
211
46
  #
212
- def cannot?(request_path)
213
- return false if @denied.empty? || (@project_modules.empty? && @account)
214
- request_path = "/" if request_path.blank?
215
- @denied.any? { |path| request_path =~ /^#{path}/ }
216
- end
217
- end # Auths
218
-
219
- class Authorization
220
- attr_reader :allowed, :denied
221
-
222
- def initialize(&block) #:nodoc:
223
- @allowed = []
224
- @denied = []
225
- yield self
47
+ def roles
48
+ @roles.uniq.reject { |r| r == :any }
226
49
  end
227
50
 
228
51
  ##
229
- # Allow a specified path
52
+ # Return an array of project_modules
230
53
  #
231
- def allow(path)
232
- @allowed << path unless @allowed.include?(path)
54
+ def project_modules(account)
55
+ role = account ? account.role.to_sym : :any
56
+ authorizations = @authorizations.find_all { |auth| auth.roles.include?(role) }
57
+ authorizations.collect(&:project_modules).flatten.uniq
233
58
  end
234
59
 
235
60
  ##
236
- # Deny a specified path
61
+ # Return true if the given account is allowed to see the given path.
237
62
  #
238
- def require_login(path)
239
- @denied << path unless @denied.include?(path)
63
+ def allowed?(account=nil, path=nil)
64
+ path = "/" if path.blank?
65
+ authorizations = @authorizations.find_all { |auth| auth.roles.include?(:any) }
66
+ allowed_paths = authorizations.collect(&:allowed).flatten.uniq
67
+ denied_paths = authorizations.collect(&:denied).flatten.uniq
68
+ if account
69
+ denied_paths.clear
70
+ authorizations = @authorizations.find_all { |auth| auth.roles.include?(account.role.to_sym) }
71
+ allowed_paths += authorizations.collect(&:allowed).flatten.uniq
72
+ authorizations = @authorizations.find_all { |auth| !auth.roles.include?(account.role.to_sym) && !auth.roles.include?(:any) }
73
+ denied_paths += authorizations.collect(&:allowed).flatten.uniq
74
+ denied_paths += authorizations.collect(&:denied).flatten.uniq
75
+ end
76
+ return true if allowed_paths.any? { |p| path =~ /^#{p}/ }
77
+ return false if denied_paths.any? { |p| path =~ /^#{p}/ }
78
+ true
240
79
  end
241
- alias :deny :require_login
242
- end # Authorization
80
+ end # Base
243
81
 
244
- class Mapper
245
- attr_reader :project_modules, :roles, :denied
82
+ class Authorization
83
+ attr_reader :allowed, :denied, :project_modules, :roles
246
84
 
247
- def initialize(account, *roles, &block) #:nodoc:
248
- @project_modules = []
85
+ def initialize(*roles, &block) #:nodoc:
86
+ @roles = roles
249
87
  @allowed = []
250
88
  @denied = []
251
- @roles = roles
252
- @account = account.dup
253
- yield(self, @account)
254
- end
255
-
256
- ##
257
- # Create a new project module
258
- #
259
- def project_module(name, path=nil, &block)
260
- @project_modules << ProjectModule.new(name, path, &block)
89
+ @project_modules = []
90
+ yield self
261
91
  end
262
92
 
263
93
  ##
264
- # Globally allow an paths for the current role
94
+ # Allow a specified path
265
95
  #
266
96
  def allow(path)
267
97
  @allowed << path unless @allowed.include?(path)
268
98
  end
269
99
 
270
100
  ##
271
- # Globally deny an pathsfor the current role
272
- #
273
- def deny(path)
274
- @denied << path unless @allowed.include?(path)
275
- end
276
-
277
- ##
278
- # Return true if role is included in given roles
101
+ # Protect access from
279
102
  #
280
- def allowed?
281
- @roles.any? { |r| r == @account.role.to_s.downcase.to_sym }
103
+ def protect(path)
104
+ @denied << path unless @denied.include?(path)
282
105
  end
283
106
 
284
107
  ##
285
- # Return allowed paths
108
+ # Create a project module
286
109
  #
287
- def allowed
288
- @project_modules.each { |pm| @allowed.concat(pm.allowed) }
289
- @allowed.uniq
110
+ def project_module(name, path)
111
+ allow(path)
112
+ @project_modules << ProjectModule.new(name, path)
290
113
  end
291
- end # Mapper
114
+ end # Authorization
292
115
 
116
+ ##
117
+ # Project Module class
118
+ #
293
119
  class ProjectModule
294
- attr_reader :name, :menus, :path
295
-
296
- def initialize(name, path=nil, options={}, &block) #:nodoc:
297
- @name = name
298
- @options = options
299
- @allowed = []
300
- @menus = []
301
- @path = path
302
- @allowed << path if path
303
- yield self if block_given?
304
- end
120
+ attr_reader :name
305
121
 
306
- ##
307
- # Build a new menu and automaitcally add the action on the allowed actions.
308
- #
309
- def menu(name, path=nil, options={}, &block)
310
- @menus << Menu.new(name, path, options, &block)
122
+ def initialize(name, path) #:nodoc:
123
+ @name, @path = name, path
311
124
  end
312
125
 
313
126
  ##
314
- # Return allowed controllers
315
- #
316
- def allowed
317
- @menus.each { |m| @allowed.concat(m.allowed) }
318
- @allowed.uniq
319
- end
320
-
321
- ##
322
- # Return the original name or try to translate or humanize the symbol
127
+ # Returns the name of the project module. If a symbol it translate/humanize them for you.
323
128
  #
324
129
  def human_name
325
- @name.is_a?(Symbol) ? I18n.t("admin.menus.#{@name}", :default => @name.to_s.humanize) : @name
130
+ @name.is_a?(Symbol) ? I18n.t("padrino.admin.menu.#{@name}", :default => @name.to_s.humanize) : @name
326
131
  end
327
132
 
328
133
  ##
329
- # Return symbol for the given project module
134
+ # Return the path of the project module. If a prefix given will be prepended.
330
135
  #
331
- def uid
332
- @name.to_s.downcase.gsub(/[^a-z0-9]+/, '').gsub(/-+$/, '').gsub(/^-+$/, '').to_sym
333
- end
334
-
335
- ##
336
- # Return ExtJs Config for this project module
136
+ # ==== Examples
337
137
  #
338
- def config
339
- options = @options.merge(:text => human_name)
340
- options.merge!(:menu => @menus.collect(&:config)) if @menus.size > 0
341
- options.merge!(:handler => Padrino::Admin::Config::Variable.new("function(){ Admin.app.load('#{path}') }")) if @path
342
- options
343
- end
344
- end # ProjectModule
345
-
346
- class Menu
347
- attr_reader :name, :options, :items, :path
348
-
349
- def initialize(name, path=nil, options={}, &block) #:nodoc:
350
- @name = name
351
- @path = path
352
- @options = options
353
- @allowed = []
354
- @items = []
355
- @allowed << path if path
356
- yield self if block_given?
357
- end
358
-
359
- ##
360
- # Add a new submenu to the menu
138
+ # # => /accounts/new
139
+ # project_module.path
140
+ # # => /admin/accounts
141
+ # project_module.path("/admin")
361
142
  #
362
- def add(name, path=nil, options={}, &block)
363
- @items << Menu.new(name, path, options, &block)
143
+ def path(prefix=nil)
144
+ prefix ? File.join(prefix, @path) : @path
364
145
  end
365
-
366
- ##
367
- # Return allowed controllers
368
- #
369
- def allowed
370
- @items.each { |i| @allowed.concat(i.allowed) }
371
- @allowed.uniq
372
- end
373
-
374
- ##
375
- # Return the original name or try to translate or humanize the symbol
376
- #
377
- def human_name
378
- @name.is_a?(Symbol) ? I18n.t("admin.menus.#{@name}", :default => @name.to_s.humanize) : @name
379
- end
380
-
381
- ##
382
- # Return ExtJs Config for this menu
383
- #
384
- def config
385
- if @path.blank? && @items.empty?
386
- options = human_name
387
- else
388
- options = @options.merge(:text => human_name)
389
- options.merge!(:menu => @items.collect(&:config)) if @items.size > 0
390
- options.merge!(:handler => "function(){ Admin.app.load('#{path}') }".to_l) if @path
391
- end
392
- options
393
- end
394
- end # Menu
146
+ end # ProjectModule
395
147
  end # AccessControl
396
148
  end # Admin
397
149
  end # Padrino