typus 3.0.6 → 3.0.7

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 (295) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +15 -0
  3. data/Gemfile +9 -5
  4. data/Rakefile +34 -21
  5. data/app/controllers/admin/base_controller.rb +0 -4
  6. data/app/controllers/admin/resources_controller.rb +77 -213
  7. data/app/controllers/admin/session_controller.rb +1 -1
  8. data/app/helpers/admin/base_helper.rb +4 -4
  9. data/app/helpers/admin/dashboard_helper.rb +1 -3
  10. data/app/helpers/admin/display_helper.rb +49 -0
  11. data/app/helpers/admin/file_preview_helper.rb +10 -12
  12. data/app/helpers/admin/filters_helper.rb +1 -1
  13. data/app/helpers/admin/form_helper.rb +2 -13
  14. data/app/helpers/admin/list_helper.rb +14 -3
  15. data/app/helpers/admin/relationships_helper.rb +79 -62
  16. data/app/helpers/admin/resources_helper.rb +17 -16
  17. data/app/helpers/admin/search_helper.rb +1 -1
  18. data/app/helpers/admin/sidebar_helper.rb +1 -2
  19. data/app/helpers/admin/table_helper.rb +9 -4
  20. data/app/views/admin/helpers/_file_preview.html.erb +1 -1
  21. data/app/views/admin/helpers/base/_apps.html.erb +23 -0
  22. data/app/views/admin/helpers/{_flash_message.html.erb → base/_flash_message.html.erb} +0 -0
  23. data/app/views/admin/helpers/{_header.html.erb → base/_header.html.erb} +0 -0
  24. data/app/views/admin/helpers/{_login_info.html.erb → base/_login_info.html.erb} +0 -0
  25. data/app/views/admin/helpers/resources/_display_link_to_previous.html.erb +1 -1
  26. data/app/views/admin/resources/show.html.erb +4 -27
  27. data/app/views/admin/templates/_belongs_to_with_autocomplete.html.erb +11 -0
  28. data/app/views/admin/templates/_has_n.html.erb +1 -1
  29. data/app/views/admin/templates/_has_one.html.erb +3 -3
  30. data/app/views/admin/templates/_relate_form.html.erb +1 -1
  31. data/app/views/admin/templates/_relate_form_with_autocomplete.html.erb +24 -0
  32. data/app/views/layouts/admin/base.html.erb +15 -9
  33. data/app/views/layouts/admin/headless.html.erb +44 -0
  34. data/app/views/layouts/admin/session.html.erb +3 -2
  35. data/doc/hudson_setup.md +19 -0
  36. data/lib/generators/typus/assets_generator.rb +0 -4
  37. data/lib/generators/typus/config_generator.rb +107 -0
  38. data/lib/generators/typus/controller_generator.rb +0 -4
  39. data/lib/generators/typus/initializers_generator.rb +22 -0
  40. data/lib/generators/typus/migration_generator.rb +0 -4
  41. data/lib/generators/typus/typus_generator.rb +8 -101
  42. data/lib/generators/typus/views_generator.rb +0 -4
  43. data/lib/support/active_record.rb +8 -2
  44. data/lib/support/fake_user.rb +2 -0
  45. data/lib/support/hash.rb +1 -1
  46. data/lib/support/string.rb +3 -3
  47. data/lib/tasks/typus.rake +1 -1
  48. data/lib/typus.rb +15 -6
  49. data/lib/typus/controller/actions.rb +69 -0
  50. data/lib/typus/controller/associations.rb +82 -0
  51. data/lib/typus/controller/autocomplete.rb +16 -0
  52. data/lib/typus/controller/filters.rb +24 -0
  53. data/lib/typus/controller/format.rb +70 -0
  54. data/lib/typus/orm/active_record.rb +9 -240
  55. data/lib/typus/orm/active_record/class_methods.rb +227 -0
  56. data/lib/typus/orm/active_record/instance_methods.rb +13 -0
  57. data/lib/typus/orm/active_record/search.rb +17 -5
  58. data/lib/typus/orm/active_record/user.rb +157 -0
  59. data/lib/typus/regex.rb +11 -0
  60. data/lib/typus/version.rb +1 -1
  61. data/test/app/controllers/admin/account_controller_test.rb +104 -0
  62. data/test/app/controllers/admin/assets_controller_test.rb +153 -0
  63. data/test/app/controllers/admin/base_controller_test.rb +41 -0
  64. data/test/app/controllers/admin/birds_controller_test.rb +42 -0
  65. data/test/app/controllers/admin/cases_controller_test.rb +21 -0
  66. data/test/app/controllers/admin/categories_controller_test.rb +141 -0
  67. data/test/app/controllers/admin/comments_controller_test.rb +79 -0
  68. data/test/app/controllers/admin/dashboard_controller_test.rb +162 -0
  69. data/test/app/controllers/admin/image_holders_controller_test.rb +75 -0
  70. data/test/app/controllers/admin/invoices_controller_test.rb +78 -0
  71. data/test/app/controllers/admin/orders_controller_test.rb +18 -0
  72. data/test/app/controllers/admin/pages_controller_test.rb +37 -0
  73. data/test/app/controllers/admin/posts_controller_test.rb +745 -0
  74. data/test/app/controllers/admin/projects_controller_test.rb +52 -0
  75. data/test/app/controllers/admin/session_controller_test.rb +92 -0
  76. data/test/app/controllers/admin/status_controller_test.rb +54 -0
  77. data/test/app/controllers/admin/typus_users_controller_test.rb +160 -0
  78. data/test/app/controllers/admin/users_controller_test.rb +106 -0
  79. data/test/app/helpers/admin/base_helper_test.rb +83 -0
  80. data/test/app/helpers/admin/dashboard_helper_test.rb +32 -0
  81. data/test/app/helpers/admin/file_preview_helper_test.rb +82 -0
  82. data/test/app/helpers/admin/filters_helper_test.rb +161 -0
  83. data/test/app/helpers/admin/form_helper_test.rb +126 -0
  84. data/test/app/helpers/admin/list_helper_test.rb +59 -0
  85. data/test/app/helpers/admin/relationships_helper_test.rb +19 -0
  86. data/test/app/helpers/admin/resources_helper_test.rb +46 -0
  87. data/test/app/helpers/admin/search_helper_test.rb +60 -0
  88. data/test/app/helpers/admin/sidebar_helper_test.rb +34 -0
  89. data/test/app/helpers/admin/table_helper_test.rb +215 -0
  90. data/test/app/mailers/admin/mailer_test.rb +32 -0
  91. data/test/app/models/typus_user_roles_test.rb +124 -0
  92. data/test/app/models/typus_user_test.rb +194 -0
  93. data/test/config/routes_test.rb +29 -0
  94. data/test/factories.rb +111 -0
  95. data/test/fixtures/config/broken/application.yml +68 -0
  96. data/test/fixtures/config/broken/application_roles.yml +20 -0
  97. data/test/fixtures/config/broken/empty.yml +0 -0
  98. data/test/fixtures/config/broken/empty_roles.yml +0 -0
  99. data/test/fixtures/config/broken/undefined.yml +3 -0
  100. data/test/fixtures/config/broken/undefined_roles.yml +6 -0
  101. data/test/fixtures/config/default/typus.yml +13 -0
  102. data/test/fixtures/config/default/typus_roles.yml +2 -0
  103. data/test/fixtures/config/empty/empty_01.yml +0 -0
  104. data/test/fixtures/config/empty/empty_01_roles.yml +0 -0
  105. data/test/fixtures/config/empty/empty_02.yml +0 -0
  106. data/test/fixtures/config/empty/empty_02_roles.yml +0 -0
  107. data/test/fixtures/config/locales/es.yml +10 -0
  108. data/test/fixtures/config/namespaced/application.yml +5 -0
  109. data/test/fixtures/config/namespaced/application_roles.yml +2 -0
  110. data/test/fixtures/config/ordered/001_roles.yml +2 -0
  111. data/test/fixtures/config/ordered/002_roles.yml +2 -0
  112. data/test/fixtures/config/unordered/app_one_roles.yml +2 -0
  113. data/test/fixtures/config/unordered/app_two_roles.yml +2 -0
  114. data/test/fixtures/rails_app/.gitignore +4 -0
  115. data/test/fixtures/rails_app/Capfile +6 -0
  116. data/test/fixtures/rails_app/README +256 -0
  117. data/test/fixtures/rails_app/Rakefile +7 -0
  118. data/test/fixtures/rails_app/app/controllers/admin/animals_controller.rb +2 -0
  119. data/test/fixtures/rails_app/app/controllers/admin/articles_controller.rb +2 -0
  120. data/test/fixtures/rails_app/app/controllers/admin/assets_controller.rb +51 -0
  121. data/test/fixtures/rails_app/app/controllers/admin/birds_controller.rb +2 -0
  122. data/test/fixtures/rails_app/app/controllers/admin/cases_controller.rb +2 -0
  123. data/test/fixtures/rails_app/app/controllers/admin/categories_controller.rb +2 -0
  124. data/test/fixtures/rails_app/app/controllers/admin/comments_controller.rb +2 -0
  125. data/test/fixtures/rails_app/app/controllers/admin/dogs_controller.rb +2 -0
  126. data/test/fixtures/rails_app/app/controllers/admin/entries_controller.rb +2 -0
  127. data/test/fixtures/rails_app/app/controllers/admin/image_holders_controller.rb +2 -0
  128. data/test/fixtures/rails_app/app/controllers/admin/invoices_controller.rb +2 -0
  129. data/test/fixtures/rails_app/app/controllers/admin/orders_controller.rb +2 -0
  130. data/test/fixtures/rails_app/app/controllers/admin/pages_controller.rb +7 -0
  131. data/test/fixtures/rails_app/app/controllers/admin/posts_controller.rb +2 -0
  132. data/test/fixtures/rails_app/app/controllers/admin/project_collaborators_controller.rb +2 -0
  133. data/test/fixtures/rails_app/app/controllers/admin/projects_controller.rb +2 -0
  134. data/test/fixtures/rails_app/app/controllers/admin/status_controller.rb +2 -0
  135. data/test/fixtures/rails_app/app/controllers/admin/typus_users_controller.rb +2 -0
  136. data/test/fixtures/rails_app/app/controllers/admin/users_controller.rb +2 -0
  137. data/test/fixtures/rails_app/app/controllers/admin/views_controller.rb +2 -0
  138. data/test/fixtures/rails_app/app/controllers/admin/watch_dog_controller.rb +2 -0
  139. data/test/fixtures/rails_app/app/controllers/application_controller.rb +3 -0
  140. data/test/fixtures/rails_app/app/helpers/application_helper.rb +2 -0
  141. data/test/fixtures/rails_app/app/helpers/form_helper.rb +3 -0
  142. data/test/fixtures/rails_app/app/models/animal.rb +21 -0
  143. data/test/fixtures/rails_app/app/models/article.rb +10 -0
  144. data/test/fixtures/rails_app/app/models/asset.rb +39 -0
  145. data/test/fixtures/rails_app/app/models/bird.rb +2 -0
  146. data/test/fixtures/rails_app/app/models/case.rb +2 -0
  147. data/test/fixtures/rails_app/app/models/category.rb +31 -0
  148. data/test/fixtures/rails_app/app/models/comment.rb +17 -0
  149. data/test/fixtures/rails_app/app/models/delayed/task.rb +5 -0
  150. data/test/fixtures/rails_app/app/models/dog.rb +2 -0
  151. data/test/fixtures/rails_app/app/models/entry.rb +23 -0
  152. data/test/fixtures/rails_app/app/models/image_holder.rb +21 -0
  153. data/test/fixtures/rails_app/app/models/invoice.rb +10 -0
  154. data/test/fixtures/rails_app/app/models/order.rb +9 -0
  155. data/test/fixtures/rails_app/app/models/page.rb +24 -0
  156. data/test/fixtures/rails_app/app/models/post.rb +32 -0
  157. data/test/fixtures/rails_app/app/models/project.rb +17 -0
  158. data/test/fixtures/rails_app/app/models/project_collaborator.rb +16 -0
  159. data/test/fixtures/rails_app/app/models/typus_user.rb +22 -0
  160. data/test/fixtures/rails_app/app/models/user.rb +10 -0
  161. data/test/fixtures/rails_app/app/models/view.rb +17 -0
  162. data/test/fixtures/rails_app/app/views/admin/assets/_index.html.erb +3 -0
  163. data/test/fixtures/rails_app/app/views/admin/cases/_index.html.erb +3 -0
  164. data/test/fixtures/rails_app/app/views/admin/categories/_index.html.erb +3 -0
  165. data/test/fixtures/rails_app/app/views/admin/dashboard/_sidebar.html.erb +11 -0
  166. data/test/fixtures/rails_app/app/views/admin/entries/_index.html.erb +3 -0
  167. data/test/fixtures/rails_app/app/views/admin/pages/_index.html.erb +3 -0
  168. data/test/fixtures/rails_app/app/views/admin/posts/_edit.html.erb +1 -0
  169. data/test/fixtures/rails_app/app/views/admin/posts/_index.html.erb +5 -0
  170. data/test/fixtures/rails_app/app/views/admin/posts/_new.html.erb +1 -0
  171. data/test/fixtures/rails_app/app/views/admin/posts/_show.html.erb +1 -0
  172. data/test/fixtures/rails_app/app/views/admin/resources/_sidebar.html.erb +1 -0
  173. data/test/fixtures/rails_app/app/views/admin/status/index.html.erb +9 -0
  174. data/test/fixtures/rails_app/app/views/admin/templates/_datepicker.html.erb +1 -0
  175. data/test/fixtures/rails_app/app/views/admin/watch_dog/index.html.erb +9 -0
  176. data/test/fixtures/rails_app/app/views/layouts/admin/headless.html.erb +38 -0
  177. data/test/fixtures/rails_app/config.ru +4 -0
  178. data/test/fixtures/rails_app/config/application.rb +44 -0
  179. data/test/fixtures/rails_app/config/boot.rb +13 -0
  180. data/test/fixtures/rails_app/config/database.yml +34 -0
  181. data/test/fixtures/rails_app/config/deploy.rb +32 -0
  182. data/test/fixtures/rails_app/config/environment.rb +5 -0
  183. data/test/fixtures/rails_app/config/environments/development.rb +32 -0
  184. data/test/fixtures/rails_app/config/environments/production.rb +54 -0
  185. data/test/fixtures/rails_app/config/environments/test.rb +40 -0
  186. data/test/fixtures/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  187. data/test/fixtures/rails_app/config/initializers/dragonfly.rb +1 -0
  188. data/test/fixtures/rails_app/config/initializers/inflections.rb +12 -0
  189. data/test/fixtures/rails_app/config/initializers/mime_types.rb +5 -0
  190. data/test/fixtures/rails_app/config/initializers/secret_token.rb +7 -0
  191. data/test/fixtures/rails_app/config/initializers/session_store.rb +8 -0
  192. data/test/fixtures/rails_app/config/initializers/typus.rb +5 -0
  193. data/test/fixtures/rails_app/config/initializers/typus_resources.rb +27 -0
  194. data/test/fixtures/rails_app/config/locales/en.yml +5 -0
  195. data/test/fixtures/rails_app/config/routes.rb +61 -0
  196. data/test/fixtures/rails_app/config/typus/README +68 -0
  197. data/test/fixtures/rails_app/config/typus/crud_basic.yml +10 -0
  198. data/test/fixtures/rails_app/config/typus/crud_basic_roles.yml +2 -0
  199. data/test/fixtures/rails_app/config/typus/crud_extended.yml +64 -0
  200. data/test/fixtures/rails_app/config/typus/crud_extended_roles.yml +18 -0
  201. data/test/fixtures/rails_app/config/typus/has_many.yml +0 -0
  202. data/test/fixtures/rails_app/config/typus/has_many_roles.yml +0 -0
  203. data/test/fixtures/rails_app/config/typus/has_many_through.yml +23 -0
  204. data/test/fixtures/rails_app/config/typus/has_many_through_roles.yml +4 -0
  205. data/test/fixtures/rails_app/config/typus/has_one.yml +12 -0
  206. data/test/fixtures/rails_app/config/typus/has_one_roles.yml +3 -0
  207. data/test/fixtures/rails_app/config/typus/polymorphic.yml +17 -0
  208. data/test/fixtures/rails_app/config/typus/polymorphic_roles.yml +5 -0
  209. data/test/fixtures/rails_app/config/typus/resource_roles.yml +7 -0
  210. data/test/fixtures/rails_app/config/typus/sti.yml +5 -0
  211. data/test/fixtures/rails_app/config/typus/sti_roles.yml +2 -0
  212. data/test/fixtures/rails_app/config/typus/typus.yml +13 -0
  213. data/test/fixtures/rails_app/config/typus/typus_roles.yml +2 -0
  214. data/test/fixtures/rails_app/config/typus/unknown.yml +3 -0
  215. data/test/fixtures/rails_app/config/typus/unknown_roles.yml +5 -0
  216. data/test/fixtures/rails_app/db/.gitkeep +0 -0
  217. data/test/fixtures/rails_app/db/schema.rb +174 -0
  218. data/test/fixtures/rails_app/db/seeds.rb +54 -0
  219. data/test/fixtures/rails_app/db/seeds/assets/000.jpg +0 -0
  220. data/test/fixtures/rails_app/db/seeds/assets/001.jpg +0 -0
  221. data/test/fixtures/rails_app/db/seeds/assets/002.jpg +0 -0
  222. data/test/fixtures/rails_app/db/seeds/assets/003.jpg +0 -0
  223. data/test/fixtures/rails_app/db/seeds/assets/004.jpg +0 -0
  224. data/test/fixtures/rails_app/public/404.html +26 -0
  225. data/test/fixtures/rails_app/public/422.html +26 -0
  226. data/test/fixtures/rails_app/public/500.html +26 -0
  227. data/test/fixtures/rails_app/public/favicon.ico +0 -0
  228. data/test/fixtures/rails_app/public/images/rails.png +0 -0
  229. data/test/fixtures/rails_app/public/javascripts/application.js +2 -0
  230. data/test/fixtures/rails_app/public/javascripts/controls.js +965 -0
  231. data/test/fixtures/rails_app/public/javascripts/dragdrop.js +974 -0
  232. data/test/fixtures/rails_app/public/javascripts/effects.js +1123 -0
  233. data/test/fixtures/rails_app/public/javascripts/prototype.js +6001 -0
  234. data/test/fixtures/rails_app/public/javascripts/rails.js +175 -0
  235. data/test/fixtures/rails_app/public/robots.txt +5 -0
  236. data/test/fixtures/rails_app/public/stylesheets/.gitkeep +0 -0
  237. data/test/fixtures/rails_app/script/rails +6 -0
  238. data/test/lib/support/active_record_test.rb +150 -0
  239. data/test/lib/support/fake_user_test.rb +59 -0
  240. data/test/lib/support/hash_test.rb +29 -0
  241. data/test/lib/support/object_test.rb +17 -0
  242. data/test/lib/support/string_test.rb +116 -0
  243. data/test/lib/typus/configuration_test.rb +46 -0
  244. data/test/lib/typus/controller/actions_test.rb +141 -0
  245. data/test/lib/typus/controller/associations_test.rb +7 -0
  246. data/test/lib/typus/controller/autocomplete_test.rb +7 -0
  247. data/test/lib/typus/controller/filters_test.rb +73 -0
  248. data/test/lib/typus/controller/format_test.rb +7 -0
  249. data/test/lib/typus/i18n_test.rb +9 -0
  250. data/test/lib/typus/orm/active_record/class_methods_test.rb +378 -0
  251. data/test/lib/typus/orm/active_record/search_test.rb +330 -0
  252. data/test/lib/typus/regex_test.rb +53 -0
  253. data/test/lib/typus/resources_test.rb +41 -0
  254. data/test/lib/typus_test.rb +141 -0
  255. data/test/test_helper.rb +15 -0
  256. data/typus.gemspec +25 -0
  257. metadata +586 -64
  258. data/Gemfile.lock +0 -149
  259. data/app/views/admin/helpers/_apps.html.erb +0 -9
  260. data/lib/generators/templates/public/admin/javascripts/application.js +0 -2
  261. data/lib/generators/templates/public/admin/javascripts/jquery-1.4.4.min.js +0 -167
  262. data/lib/generators/templates/public/admin/javascripts/jquery.application.js +0 -16
  263. data/lib/generators/templates/public/admin/javascripts/jquery.rails.js +0 -160
  264. data/lib/generators/templates/public/admin/javascripts/jquery.searchField.js +0 -91
  265. data/lib/generators/templates/public/admin/stylesheets/application.css +0 -11
  266. data/lib/generators/templates/public/admin/stylesheets/screen.css +0 -367
  267. data/lib/generators/templates/public/admin/vendor/fancybox/blank.gif +0 -0
  268. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_close.png +0 -0
  269. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_loading.png +0 -0
  270. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_nav_left.png +0 -0
  271. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_nav_right.png +0 -0
  272. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_e.png +0 -0
  273. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_n.png +0 -0
  274. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_ne.png +0 -0
  275. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_nw.png +0 -0
  276. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_s.png +0 -0
  277. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_se.png +0 -0
  278. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_sw.png +0 -0
  279. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_shadow_w.png +0 -0
  280. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_title_left.png +0 -0
  281. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_title_main.png +0 -0
  282. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_title_over.png +0 -0
  283. data/lib/generators/templates/public/admin/vendor/fancybox/fancy_title_right.png +0 -0
  284. data/lib/generators/templates/public/admin/vendor/fancybox/fancybox-x.png +0 -0
  285. data/lib/generators/templates/public/admin/vendor/fancybox/fancybox-y.png +0 -0
  286. data/lib/generators/templates/public/admin/vendor/fancybox/fancybox.png +0 -0
  287. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.easing-1.3.pack.js +0 -72
  288. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.fancybox-1.3.4.css +0 -359
  289. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.fancybox-1.3.4.js +0 -1156
  290. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.fancybox-1.3.4.pack.js +0 -46
  291. data/lib/generators/templates/public/admin/vendor/fancybox/jquery.mousewheel-3.0.4.pack.js +0 -14
  292. data/lib/typus/actions.rb +0 -41
  293. data/lib/typus/filters.rb +0 -12
  294. data/lib/typus/format.rb +0 -70
  295. data/lib/typus/user.rb +0 -157
@@ -0,0 +1,16 @@
1
+ module Typus
2
+ module Controller
3
+ module Autocomplete
4
+
5
+ def autocomplete
6
+ if params[:term]
7
+ params.merge!(:search => params[:term])
8
+ get_objects
9
+ @items = @resource.limit(20)
10
+ render :json => @items.map { |i| { "id" => i.id, "label" => i.to_label, "value" => i.to_label } }
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ module Typus
2
+ module Controller
3
+ module Filters
4
+
5
+ protected
6
+
7
+ def add_predefined_filter(*args)
8
+ @predefined_filters ||= []
9
+ @predefined_filters << args unless args.empty?
10
+ end
11
+
12
+ def prepend_predefined_filter(*args)
13
+ @predefined_filters ||= []
14
+ @predefined_filters = @predefined_filters.unshift(args) unless args.empty?
15
+ end
16
+
17
+ def append_predefined_filter(*args)
18
+ @predefined_filters ||= []
19
+ @predefined_filters = @predefined_filters.concat([args]) unless args.empty?
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,70 @@
1
+ if RUBY_VERSION >= '1.9'
2
+ require 'csv'
3
+ FasterCSV = CSV
4
+ else
5
+ require 'fastercsv'
6
+ end
7
+
8
+ module Typus
9
+ module Controller
10
+ module Format
11
+
12
+ protected
13
+
14
+ def generate_html
15
+ items_per_page = @resource.typus_options_for(:per_page)
16
+ @items = @resource.paginate(:per_page => items_per_page, :page => params[:page])
17
+ end
18
+
19
+ #--
20
+ # TODO: Find in batches only works properly if it's used on models, not
21
+ # controllers, so in this action does nothing. We should find a way
22
+ # to be able to process large amounts of data.
23
+ #++
24
+ def generate_csv
25
+ fields = @resource.typus_fields_for(:csv)
26
+
27
+ filename = Rails.root.join("tmp", "export-#{@resource.to_resource}-#{Time.zone.now.to_s(:number)}.csv")
28
+
29
+ options = { :conditions => @conditions, :batch_size => 1000 }
30
+
31
+ ::FasterCSV.open(filename, 'w', :col_sep => ';') do |csv|
32
+ csv << fields.keys
33
+ @resource.find_in_batches(options) do |records|
34
+ records.each do |record|
35
+ csv << fields.map do |key, value|
36
+ case value
37
+ when :transversal
38
+ a, b = key.split(".")
39
+ record.send(a).send(b)
40
+ when :belongs_to
41
+ record.send(key).to_label
42
+ else
43
+ record.send(key)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ send_file filename
51
+ end
52
+
53
+ def generate_json
54
+ export(:json)
55
+ end
56
+
57
+ def generate_xml
58
+ export(:xml)
59
+ end
60
+
61
+ def export(format)
62
+ fields = @resource.typus_fields_for(format).map { |i| i.first }
63
+ methods = fields - @resource.column_names
64
+ except = @resource.column_names - fields
65
+ render format => @resource.send("to_#{format}", :methods => methods, :except => except)
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -1,244 +1,13 @@
1
- module Typus
2
-
3
- module Orm
4
-
5
- module ClassMethods
6
-
7
- # Model fields as an <tt>ActiveSupport::OrderedHash</tt>.
8
- def model_fields
9
- ActiveSupport::OrderedHash.new.tap do |hash|
10
- columns.map { |u| hash[u.name.to_sym] = u.type.to_sym }
11
- end
12
- end
13
-
14
- # Model relationships as an <tt>ActiveSupport::OrderedHash</tt>.
15
- def model_relationships
16
- ActiveSupport::OrderedHash.new.tap do |hash|
17
- reflect_on_all_associations.map { |i| hash[i.name] = i.macro }
18
- end
19
- end
20
-
21
- # Model description for admin panel.
22
- def typus_description
23
- read_model_config['description']
24
- end
25
-
26
- # Form and list fields
27
- def typus_fields_for(filter)
28
- ActiveSupport::OrderedHash.new.tap do |fields_with_type|
29
- data = read_model_config['fields']
30
- fields = data[filter.to_s] || data['default'] || ""
31
-
32
- virtual_fields = instance_methods.map { |i| i.to_s } - model_fields.keys.map { |i| i.to_s }
33
-
34
- fields.extract_settings.map { |f| f.to_sym }.each do |field|
35
- if reflect_on_association(field)
36
- fields_with_type[field.to_s] = reflect_on_association(field).macro
37
- next
38
- end
39
-
40
- if typus_field_options_for(:selectors).include?(field)
41
- fields_with_type[field.to_s] = :selector
42
- next
43
- end
44
-
45
- dragonfly = respond_to?(:dragonfly_apps_for_attributes) && dragonfly_apps_for_attributes.try(:has_key?, field)
46
- paperclip = respond_to?(:attachment_definitions) && attachment_definitions.try(:has_key?, field)
47
-
48
- if dragonfly || paperclip
49
- fields_with_type[field.to_s] = :file
50
- next
51
- end
52
-
53
- if virtual_fields.include?(field.to_s)
54
- fields_with_type[field.to_s] = :virtual
55
- end
56
-
57
- fields_with_type[field.to_s] = case field.to_s
58
- when 'parent', 'parent_id' then :tree
59
- when /password/ then :password
60
- when 'position' then :position
61
- when /\./ then :transversal
62
- else
63
- if fields_with_type[field.to_s]
64
- fields_with_type[field.to_s]
65
- else
66
- model_fields[field]
67
- end
68
- end
69
-
70
- end
71
- end
72
- end
73
-
74
- def typus_filters
75
- ActiveSupport::OrderedHash.new.tap do |fields_with_type|
76
- if data = read_model_config['filters']
77
- data.extract_settings.map { |i| i.to_sym }.each do |field|
78
- attribute_type = model_fields[field.to_sym]
79
- if reflect_on_association(field.to_sym)
80
- attribute_type = reflect_on_association(field.to_sym).macro
81
- end
82
- fields_with_type[field.to_s] = attribute_type
83
- end
84
- end
85
- end
86
- end
87
-
88
- # Extended actions for this model on Typus.
89
- def typus_actions_on(filter)
90
- actions = read_model_config['actions']
91
- actions && actions[filter.to_s] ? actions[filter.to_s].extract_settings : []
92
- end
93
-
94
- # Used for +search+, +relationships+
95
- def typus_defaults_for(filter)
96
- read_model_config[filter.to_s].try(:extract_settings) || []
97
- end
98
-
99
- def typus_search_fields
100
- Hash.new.tap do |search|
101
- typus_defaults_for(:search).each do |field|
102
- if field.starts_with?("=")
103
- field.slice!(0)
104
- search[field] = "="
105
- elsif field.starts_with?("^")
106
- field.slice!(0)
107
- search[field] = "^"
108
- else
109
- search[field] = "@"
110
- end
111
- end
112
- end
113
- end
114
-
115
- def typus_application
116
- read_model_config['application'] || 'Unknown'
117
- end
118
-
119
- def typus_field_options_for(filter)
120
- options = read_model_config['fields']['options']
121
- options && options[filter.to_s] ? options[filter.to_s].extract_settings.map { |i| i.to_sym } : []
122
- end
123
-
124
- #--
125
- # With Typus::Resources we some application defaults.
126
- #
127
- # Typus::Resources.setup do |config|
128
- # config.per_page = 15
129
- # end
130
- #
131
- # If for any reason we need a better default for an specific resource we
132
- # we override it on `application.yaml`.
133
- #
134
- # Post:
135
- # ...
136
- # options:
137
- # per_page: 15
138
- #++
139
- def typus_options_for(filter)
140
- options = read_model_config['options']
141
-
142
- unless options.nil? || options[filter.to_s].nil?
143
- options[filter.to_s]
144
- else
145
- Typus::Resources.send(filter)
146
- end
147
- end
148
-
149
- def typus_export_formats
150
- read_model_config['export'].try(:extract_settings) || []
151
- end
152
-
153
- def typus_order_by
154
- typus_defaults_for(:order_by).map do |field|
155
- field.include?('-') ? "#{table_name}.#{field.delete('-')} DESC" : "#{table_name}.#{field} ASC"
156
- end.join(', ')
157
- end
158
-
159
- #--
160
- # Define our own boolean mappings.
161
- #
162
- # Post:
163
- # fields:
164
- # default: title, status
165
- # options:
166
- # booleans:
167
- # status: "Published", "Not published"
168
- #
169
- #++
170
- def typus_boolean(attribute = :default)
171
- options = read_model_config['fields']['options']
172
-
173
- boolean = if options && options['booleans'] && boolean = options['booleans'][attribute.to_s]
174
- boolean.is_a?(String) ? boolean.extract_settings : boolean
175
- else
176
- ["True", "False"]
177
- end
178
-
179
- [[boolean.first, "true"], [boolean.last, "false"]]
180
- end
181
-
182
- #--
183
- # Custom date formats.
184
- #++
185
- def typus_date_format(attribute = :default)
186
- options = read_model_config['fields']['options']
187
- if options && options['date_formats'] && options['date_formats'][attribute.to_s]
188
- options['date_formats'][attribute.to_s].to_sym
189
- else
190
- :default
191
- end
192
- end
193
-
194
- #--
195
- # This is user to use custome templates for attribute:
196
- #
197
- # Post:
198
- # fields:
199
- # form: title, body, status
200
- # options:
201
- # templates:
202
- # body: rich_text
203
- #
204
- # Templates are stored on <tt>app/views/admin/templates</tt>.
205
- #++
206
- def typus_template(attribute)
207
- options = read_model_config['fields']['options']
208
- if options && options['templates'] && options['templates'][attribute.to_s]
209
- options['templates'][attribute.to_s]
210
- end
211
- end
212
-
213
- def adapter
214
- @adapter ||= ActiveRecord::Base.configurations[Rails.env]['adapter']
215
- end
216
-
217
- def typus_user_id?
218
- columns.map { |u| u.name }.include?(Typus.user_fk)
219
- end
220
-
221
- def read_model_config
222
- Typus::Configuration.config[name] or raise "No typus configuration specified for #{name}"
223
- end
224
-
225
- end
226
-
227
- module InstanceMethods
228
-
229
- def owned_by?(user)
230
- send(Typus.user_fk) == user.id
231
- end
232
-
233
- end
234
-
235
- end
1
+ if defined?(ActiveRecord)
2
+ require 'typus/orm/active_record/class_methods'
3
+ ActiveRecord::Base.extend Typus::Orm::ActiveRecord::ClassMethods
236
4
 
237
- end
5
+ require 'typus/orm/active_record/instance_methods'
6
+ ActiveRecord::Base.send :include, Typus::Orm::ActiveRecord::InstanceMethods
238
7
 
239
- if defined?(ActiveRecord)
240
8
  require 'typus/orm/active_record/search'
241
- ActiveRecord::Base.extend Typus::Orm::ClassMethods
242
- ActiveRecord::Base.extend Typus::Orm::ClassMethods::Search
243
- ActiveRecord::Base.send :include, Typus::Orm::InstanceMethods
9
+ ActiveRecord::Base.extend Typus::Orm::ActiveRecord::Search
10
+
11
+ require 'typus/orm/active_record/user'
12
+ ActiveRecord::Base.send :include, Typus::Orm::ActiveRecord::User
244
13
  end
@@ -0,0 +1,227 @@
1
+ module Typus
2
+ module Orm
3
+ module ActiveRecord
4
+ module ClassMethods
5
+
6
+ # Model fields as an <tt>ActiveSupport::OrderedHash</tt>.
7
+ def model_fields
8
+ ActiveSupport::OrderedHash.new.tap do |hash|
9
+ columns.map { |u| hash[u.name.to_sym] = u.type.to_sym }
10
+ end
11
+ end
12
+
13
+ # Model relationships as an <tt>ActiveSupport::OrderedHash</tt>.
14
+ def model_relationships
15
+ ActiveSupport::OrderedHash.new.tap do |hash|
16
+ reflect_on_all_associations.map { |i| hash[i.name] = i.macro }
17
+ end
18
+ end
19
+
20
+ # Model description for admin panel.
21
+ def typus_description
22
+ read_model_config['description']
23
+ end
24
+
25
+ # Form and list fields
26
+ def typus_fields_for(filter)
27
+ ActiveSupport::OrderedHash.new.tap do |fields_with_type|
28
+ data = read_model_config['fields']
29
+ fields = data[filter.to_s] || data['default'] || ""
30
+
31
+ virtual_fields = instance_methods.map { |i| i.to_s } - model_fields.keys.map { |i| i.to_s }
32
+
33
+ fields.extract_settings.map { |f| f.to_sym }.each do |field|
34
+ if reflect_on_association(field)
35
+ fields_with_type[field.to_s] = reflect_on_association(field).macro
36
+ next
37
+ end
38
+
39
+ if typus_field_options_for(:selectors).include?(field)
40
+ fields_with_type[field.to_s] = :selector
41
+ next
42
+ end
43
+
44
+ dragonfly = respond_to?(:dragonfly_apps_for_attributes) && dragonfly_apps_for_attributes.try(:has_key?, field)
45
+ paperclip = respond_to?(:attachment_definitions) && attachment_definitions.try(:has_key?, field)
46
+
47
+ if dragonfly || paperclip
48
+ fields_with_type[field.to_s] = :file
49
+ next
50
+ end
51
+
52
+ if virtual_fields.include?(field.to_s)
53
+ fields_with_type[field.to_s] = :virtual
54
+ end
55
+
56
+ fields_with_type[field.to_s] = case field.to_s
57
+ when 'parent', 'parent_id' then :tree
58
+ when /password/ then :password
59
+ when 'position' then :position
60
+ when /\./ then :transversal
61
+ else
62
+ if fields_with_type[field.to_s]
63
+ fields_with_type[field.to_s]
64
+ else
65
+ model_fields[field]
66
+ end
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+
73
+ def typus_filters
74
+ ActiveSupport::OrderedHash.new.tap do |fields_with_type|
75
+ if data = read_model_config['filters']
76
+ data.extract_settings.map { |i| i.to_sym }.each do |field|
77
+ attribute_type = model_fields[field.to_sym]
78
+ if reflect_on_association(field.to_sym)
79
+ attribute_type = reflect_on_association(field.to_sym).macro
80
+ end
81
+ fields_with_type[field.to_s] = attribute_type
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ # Extended actions for this model on Typus.
88
+ def typus_actions_on(filter)
89
+ actions = read_model_config['actions']
90
+ actions && actions[filter.to_s] ? actions[filter.to_s].extract_settings : []
91
+ end
92
+
93
+ # Used for +search+, +relationships+
94
+ def typus_defaults_for(filter)
95
+ read_model_config[filter.to_s].try(:extract_settings) || []
96
+ end
97
+
98
+ def typus_search_fields
99
+ Hash.new.tap do |search|
100
+ typus_defaults_for(:search).each do |field|
101
+ if field.starts_with?("=")
102
+ field.slice!(0)
103
+ search[field] = "="
104
+ elsif field.starts_with?("^")
105
+ field.slice!(0)
106
+ search[field] = "^"
107
+ else
108
+ search[field] = "@"
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ def typus_application
115
+ read_model_config['application'] || 'Unknown'
116
+ end
117
+
118
+ def typus_field_options_for(filter)
119
+ options = read_model_config['fields']['options']
120
+ options && options[filter.to_s] ? options[filter.to_s].extract_settings.map { |i| i.to_sym } : []
121
+ end
122
+
123
+ #--
124
+ # With Typus::Resources we some application defaults.
125
+ #
126
+ # Typus::Resources.setup do |config|
127
+ # config.per_page = 15
128
+ # end
129
+ #
130
+ # If for any reason we need a better default for an specific resource we
131
+ # we override it on `application.yaml`.
132
+ #
133
+ # Post:
134
+ # ...
135
+ # options:
136
+ # per_page: 15
137
+ #++
138
+ def typus_options_for(filter)
139
+ options = read_model_config['options']
140
+
141
+ unless options.nil? || options[filter.to_s].nil?
142
+ options[filter.to_s]
143
+ else
144
+ Typus::Resources.send(filter)
145
+ end
146
+ end
147
+
148
+ def typus_export_formats
149
+ read_model_config['export'].try(:extract_settings) || []
150
+ end
151
+
152
+ def typus_order_by
153
+ typus_defaults_for(:order_by).map do |field|
154
+ field.include?('-') ? "#{table_name}.#{field.delete('-')} DESC" : "#{table_name}.#{field} ASC"
155
+ end.join(', ')
156
+ end
157
+
158
+ #--
159
+ # Define our own boolean mappings.
160
+ #
161
+ # Post:
162
+ # fields:
163
+ # default: title, status
164
+ # options:
165
+ # booleans:
166
+ # status: "Published", "Not published"
167
+ #
168
+ #++
169
+ def typus_boolean(attribute = :default)
170
+ options = read_model_config['fields']['options']
171
+
172
+ boolean = if options && options['booleans'] && boolean = options['booleans'][attribute.to_s]
173
+ boolean.is_a?(String) ? boolean.extract_settings : boolean
174
+ else
175
+ ["True", "False"]
176
+ end
177
+
178
+ [[boolean.first, "true"], [boolean.last, "false"]]
179
+ end
180
+
181
+ #--
182
+ # Custom date formats.
183
+ #++
184
+ def typus_date_format(attribute = :default)
185
+ options = read_model_config['fields']['options']
186
+ if options && options['date_formats'] && options['date_formats'][attribute.to_s]
187
+ options['date_formats'][attribute.to_s].to_sym
188
+ else
189
+ :default
190
+ end
191
+ end
192
+
193
+ #--
194
+ # This is user to use custome templates for attribute:
195
+ #
196
+ # Post:
197
+ # fields:
198
+ # form: title, body, status
199
+ # options:
200
+ # templates:
201
+ # body: rich_text
202
+ #
203
+ # Templates are stored on <tt>app/views/admin/templates</tt>.
204
+ #++
205
+ def typus_template(attribute)
206
+ options = read_model_config['fields']['options']
207
+ if options && options['templates'] && options['templates'][attribute.to_s]
208
+ options['templates'][attribute.to_s]
209
+ end
210
+ end
211
+
212
+ def adapter
213
+ @adapter ||= ::ActiveRecord::Base.configurations[Rails.env]['adapter']
214
+ end
215
+
216
+ def typus_user_id?
217
+ columns.map { |u| u.name }.include?(Typus.user_fk)
218
+ end
219
+
220
+ def read_model_config
221
+ Typus::Configuration.config[name] or raise "No typus configuration specified for #{name}"
222
+ end
223
+
224
+ end
225
+ end
226
+ end
227
+ end