atreides 2.0.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 (309) hide show
  1. data/LICENSE +7 -0
  2. data/README.rdoc +1 -0
  3. data/app/assets/javascripts/atreides/admin.js +22 -0
  4. data/app/assets/javascripts/atreides/admin_base.js.erb +247 -0
  5. data/app/assets/javascripts/atreides/admin_edit.js +9 -0
  6. data/app/assets/javascripts/atreides/application.js +15 -0
  7. data/app/assets/javascripts/atreides/comments.coffee +50 -0
  8. data/app/assets/javascripts/atreides/public.js +24 -0
  9. data/app/assets/javascripts/atreides/public_base.js.erb +119 -0
  10. data/app/assets/javascripts/atreides/terryblr.js +57 -0
  11. data/app/assets/stylesheets/atreides/admin.css +21 -0
  12. data/app/assets/stylesheets/atreides/admin_base.css.erb +1762 -0
  13. data/app/assets/stylesheets/atreides/application.css +13 -0
  14. data/app/assets/stylesheets/atreides/formtastic_changes.css +10 -0
  15. data/app/assets/stylesheets/atreides/iphone-checkboxes.css.erb +97 -0
  16. data/app/assets/stylesheets/atreides/jBreadCrumb.css +109 -0
  17. data/app/assets/stylesheets/atreides/public.css +15 -0
  18. data/app/assets/stylesheets/atreides/public_base.css +101 -0
  19. data/app/assets/stylesheets/atreides/swfupload.css.erb +63 -0
  20. data/app/controllers/admin/atreides/comments_controller.rb +47 -0
  21. data/app/controllers/admin/atreides/content_parts_controller.rb +43 -0
  22. data/app/controllers/admin/atreides/dropbox_controller.rb +40 -0
  23. data/app/controllers/admin/atreides/features_controller.rb +63 -0
  24. data/app/controllers/admin/atreides/github_controller.rb +35 -0
  25. data/app/controllers/admin/atreides/links_controller.rb +3 -0
  26. data/app/controllers/admin/atreides/messages_controller.rb +3 -0
  27. data/app/controllers/admin/atreides/orders_controller.rb +35 -0
  28. data/app/controllers/admin/atreides/pages_controller.rb +59 -0
  29. data/app/controllers/admin/atreides/photos_controller.rb +79 -0
  30. data/app/controllers/admin/atreides/posts_controller.rb +109 -0
  31. data/app/controllers/admin/atreides/products_controller.rb +39 -0
  32. data/app/controllers/admin/atreides/sessions_controller.rb +7 -0
  33. data/app/controllers/admin/atreides/sizes_controller.rb +4 -0
  34. data/app/controllers/admin/atreides/tags_controller.rb +20 -0
  35. data/app/controllers/admin/atreides/users_controller.rb +50 -0
  36. data/app/controllers/admin/atreides/videos_controller.rb +53 -0
  37. data/app/controllers/atreides/admin_controller.rb +96 -0
  38. data/app/controllers/atreides/admin_home_controller.rb +211 -0
  39. data/app/controllers/atreides/application_controller.rb +93 -0
  40. data/app/controllers/atreides/comments_controller.rb +43 -0
  41. data/app/controllers/atreides/home_controller.rb +71 -0
  42. data/app/controllers/atreides/likes_controller.rb +44 -0
  43. data/app/controllers/atreides/pages_controller.rb +34 -0
  44. data/app/controllers/atreides/posts_controller.rb +119 -0
  45. data/app/controllers/atreides/public_controller.rb +43 -0
  46. data/app/helpers/admin/atreides/comments_helper.rb +8 -0
  47. data/app/helpers/admin/atreides/dropbox_helper.rb +42 -0
  48. data/app/helpers/admin/atreides/features_helper.rb +4 -0
  49. data/app/helpers/admin/atreides/github_helper.rb +43 -0
  50. data/app/helpers/admin/atreides/links_helper.rb +4 -0
  51. data/app/helpers/admin/atreides/messages_helper.rb +4 -0
  52. data/app/helpers/admin/atreides/orders_helper.rb +30 -0
  53. data/app/helpers/admin/atreides/pages_helper.rb +17 -0
  54. data/app/helpers/admin/atreides/photos_helper.rb +14 -0
  55. data/app/helpers/admin/atreides/posts_helper.rb +41 -0
  56. data/app/helpers/admin/atreides/products_helper.rb +37 -0
  57. data/app/helpers/admin/atreides/sizes_helper.rb +4 -0
  58. data/app/helpers/admin/atreides/user_sessions_helper.rb +4 -0
  59. data/app/helpers/admin/atreides/users_helper.rb +8 -0
  60. data/app/helpers/admin/atreides/videos_helper.rb +4 -0
  61. data/app/helpers/atreides/admin_helper.rb +243 -0
  62. data/app/helpers/atreides/admin_home_helper.rb +4 -0
  63. data/app/helpers/atreides/application_helper.rb +210 -0
  64. data/app/helpers/atreides/home_helper.rb +4 -0
  65. data/app/helpers/atreides/posts_helper.rb +119 -0
  66. data/app/inputs/files_input.rb +13 -0
  67. data/app/inputs/price_input.rb +18 -0
  68. data/app/inputs/underline_input.rb +16 -0
  69. data/app/models/atreides/ability.rb +24 -0
  70. data/app/models/atreides/comment.rb +93 -0
  71. data/app/models/atreides/content_part.rb +107 -0
  72. data/app/models/atreides/feature.rb +90 -0
  73. data/app/models/atreides/github.rb +74 -0
  74. data/app/models/atreides/like.rb +35 -0
  75. data/app/models/atreides/line_item.rb +4 -0
  76. data/app/models/atreides/link.rb +32 -0
  77. data/app/models/atreides/message.rb +34 -0
  78. data/app/models/atreides/order.rb +209 -0
  79. data/app/models/atreides/page.rb +114 -0
  80. data/app/models/atreides/photo.rb +130 -0
  81. data/app/models/atreides/post.rb +271 -0
  82. data/app/models/atreides/product.rb +75 -0
  83. data/app/models/atreides/site.rb +59 -0
  84. data/app/models/atreides/size.rb +44 -0
  85. data/app/models/atreides/tag.rb +31 -0
  86. data/app/models/atreides/tweet.rb +123 -0
  87. data/app/models/atreides/user.rb +129 -0
  88. data/app/models/atreides/video.rb +206 -0
  89. data/app/models/atreides/vote.rb +43 -0
  90. data/app/models/fb_post_publisher_job.rb +72 -0
  91. data/app/models/settings.rb +19 -0
  92. data/app/models/tumblr_post_publisher_job.rb +75 -0
  93. data/app/models/tw_post_publisher_job.rb +54 -0
  94. data/app/views/admin/_edit_head_content.html.haml +2 -0
  95. data/app/views/admin/atreides/comments/_line.html.haml +60 -0
  96. data/app/views/admin/atreides/comments/_sidebar.html.haml +52 -0
  97. data/app/views/admin/atreides/comments/create.js.haml +1 -0
  98. data/app/views/admin/atreides/comments/index.html.haml +34 -0
  99. data/app/views/admin/atreides/content_parts/_form.html.haml +21 -0
  100. data/app/views/admin/atreides/content_parts/_photos.html.haml +18 -0
  101. data/app/views/admin/atreides/content_parts/_text.html.haml +1 -0
  102. data/app/views/admin/atreides/content_parts/_videos.html.haml +12 -0
  103. data/app/views/admin/atreides/content_parts/destroy.js.haml +3 -0
  104. data/app/views/admin/atreides/content_parts/edit.html.haml +0 -0
  105. data/app/views/admin/atreides/content_parts/new.html.haml +0 -0
  106. data/app/views/admin/atreides/content_parts/new.js.haml +11 -0
  107. data/app/views/admin/atreides/dropbox/_uploader.html.haml +134 -0
  108. data/app/views/admin/atreides/dropbox/list.html.haml +27 -0
  109. data/app/views/admin/atreides/dropbox/setup.html.haml +8 -0
  110. data/app/views/admin/atreides/features/_form.html.haml +60 -0
  111. data/app/views/admin/atreides/features/edit.html.haml +1 -0
  112. data/app/views/admin/atreides/features/index.html.haml +24 -0
  113. data/app/views/admin/atreides/features/new.html.haml +1 -0
  114. data/app/views/admin/atreides/github/index.html.haml +26 -0
  115. data/app/views/admin/atreides/github/show.html.haml +19 -0
  116. data/app/views/admin/atreides/likes/create.js.haml +2 -0
  117. data/app/views/admin/atreides/orders/_sidebar.html.haml +20 -0
  118. data/app/views/admin/atreides/orders/edit.html.haml +52 -0
  119. data/app/views/admin/atreides/orders/index.html.haml +8 -0
  120. data/app/views/admin/atreides/pages/_form.html.haml +31 -0
  121. data/app/views/admin/atreides/pages/edit.html.haml +3 -0
  122. data/app/views/admin/atreides/pages/index.html.haml +15 -0
  123. data/app/views/admin/atreides/pages/index.js.haml +4 -0
  124. data/app/views/admin/atreides/pages/new.html.haml +2 -0
  125. data/app/views/admin/atreides/photos/create.js.haml +18 -0
  126. data/app/views/admin/atreides/photos/destroy.js.haml +3 -0
  127. data/app/views/admin/atreides/posts/_archives.html.haml +19 -0
  128. data/app/views/admin/atreides/posts/_form.html.haml +66 -0
  129. data/app/views/admin/atreides/posts/_form_buttons.html.haml +9 -0
  130. data/app/views/admin/atreides/posts/_form_sidebar.html.haml +85 -0
  131. data/app/views/admin/atreides/posts/edit.html.haml +2 -0
  132. data/app/views/admin/atreides/posts/index.html.haml +24 -0
  133. data/app/views/admin/atreides/posts/index.js.haml +1 -0
  134. data/app/views/admin/atreides/posts/new.html.haml +2 -0
  135. data/app/views/admin/atreides/products/edit.html.haml +69 -0
  136. data/app/views/admin/atreides/products/index.html.haml +31 -0
  137. data/app/views/admin/atreides/sessions/new.html.haml +13 -0
  138. data/app/views/admin/atreides/user_sessions/new.html.haml +10 -0
  139. data/app/views/admin/atreides/users/_form.html.haml +19 -0
  140. data/app/views/admin/atreides/users/edit.html.haml +6 -0
  141. data/app/views/admin/atreides/users/index.html.haml +11 -0
  142. data/app/views/admin/atreides/users/new.html.haml +6 -0
  143. data/app/views/admin/atreides/users/show.html.haml +4 -0
  144. data/app/views/admin/atreides/videos/create.js.haml +9 -0
  145. data/app/views/admin/atreides/videos/destroy.js.haml +3 -0
  146. data/app/views/admin/common/_archive_sidebar.html.haml +29 -0
  147. data/app/views/admin/common/_list_table.html.erb +37 -0
  148. data/app/views/admin/common/_list_table_row.html.erb +18 -0
  149. data/app/views/admin/common/_pagination.html.erb +1 -0
  150. data/app/views/admin/common/_search_form.html.erb +6 -0
  151. data/app/views/admin/common/access_denied.html.haml +1 -0
  152. data/app/views/atreides/admin/_content_nav.html.haml +8 -0
  153. data/app/views/atreides/admin_home/_analytics.html.haml +93 -0
  154. data/app/views/atreides/admin_home/_fb_page_likes_analytics_tbody.haml +10 -0
  155. data/app/views/atreides/admin_home/_fb_page_views_analytics_tbody.haml +10 -0
  156. data/app/views/atreides/admin_home/_top_landing_pages_analytics_tbody.haml +14 -0
  157. data/app/views/atreides/admin_home/_top_referrers_analytics_tbody.haml +12 -0
  158. data/app/views/atreides/admin_home/_tweets_analytics_tbody.html.haml +8 -0
  159. data/app/views/atreides/admin_home/_visitors_analytics_tbody.html.haml +12 -0
  160. data/app/views/atreides/admin_home/index.html.haml +57 -0
  161. data/app/views/atreides/admin_home/search.html.haml +11 -0
  162. data/app/views/atreides/admin_home/setup.html.haml +15 -0
  163. data/app/views/atreides/common/_gallery_params.xml.erb +174 -0
  164. data/app/views/atreides/common/slideshow.xml.haml +6 -0
  165. data/app/views/atreides/errors/404.html.haml +10 -0
  166. data/app/views/atreides/errors/500.html.haml +4 -0
  167. data/app/views/atreides/home/index.html.haml +30 -0
  168. data/app/views/atreides/home/index.js.haml +1 -0
  169. data/app/views/atreides/home/robots.txt.erb +5 -0
  170. data/app/views/atreides/home/sitemap.xml.builder +35 -0
  171. data/app/views/atreides/pages/show.html.haml +3 -0
  172. data/app/views/atreides/posts/_archives.html.haml +19 -0
  173. data/app/views/atreides/posts/_featured_posts.html.haml +10 -0
  174. data/app/views/atreides/posts/_list.html.haml +9 -0
  175. data/app/views/atreides/posts/archives.html.haml +3 -0
  176. data/app/views/atreides/posts/archives.js.haml +1 -0
  177. data/app/views/atreides/posts/gallery_params.xml.haml +1 -0
  178. data/app/views/atreides/posts/index.atom.builder +22 -0
  179. data/app/views/atreides/posts/index.html.haml +13 -0
  180. data/app/views/atreides/posts/index.rss.builder +21 -0
  181. data/app/views/atreides/posts/show.html.haml +23 -0
  182. data/app/views/atreides/posts/tagged.html.haml +4 -0
  183. data/app/views/atreides/posts/tagged.js.haml +1 -0
  184. data/app/views/layouts/admin.html.haml +62 -0
  185. data/app/views/layouts/application.html.haml +37 -0
  186. data/app/views/layouts/atreides/application.html.erb +14 -0
  187. data/app/views/layouts/public.html.haml +39 -0
  188. data/config/cucumber.yml +11 -0
  189. data/config/locales/en.yml +236 -0
  190. data/config/locales/fr.yml +199 -0
  191. data/config/routes.rb +119 -0
  192. data/lib/assets/images/atreides/admin/add.png +0 -0
  193. data/lib/assets/images/atreides/admin/add_btn.png +0 -0
  194. data/lib/assets/images/atreides/admin/add_dashboard.png +0 -0
  195. data/lib/assets/images/atreides/admin/add_photo_button_sprite.png +0 -0
  196. data/lib/assets/images/atreides/admin/add_photos_btn.png +0 -0
  197. data/lib/assets/images/atreides/admin/background.png +0 -0
  198. data/lib/assets/images/atreides/admin/calendar.png +0 -0
  199. data/lib/assets/images/atreides/admin/chevron.gif +0 -0
  200. data/lib/assets/images/atreides/admin/chevron_overlay.png +0 -0
  201. data/lib/assets/images/atreides/admin/choose_photos_button_sprite.png +0 -0
  202. data/lib/assets/images/atreides/admin/content_bg.png +0 -0
  203. data/lib/assets/images/atreides/admin/content_bg_edit_form.png +0 -0
  204. data/lib/assets/images/atreides/admin/content_part_break.png +0 -0
  205. data/lib/assets/images/atreides/admin/content_part_drop_target.png +0 -0
  206. data/lib/assets/images/atreides/admin/content_part_icons.png +0 -0
  207. data/lib/assets/images/atreides/admin/content_part_photos.png +0 -0
  208. data/lib/assets/images/atreides/admin/content_part_text.png +0 -0
  209. data/lib/assets/images/atreides/admin/content_part_videos.png +0 -0
  210. data/lib/assets/images/atreides/admin/content_top_edit_form.png +0 -0
  211. data/lib/assets/images/atreides/admin/dashboard-indicator.gif +0 -0
  212. data/lib/assets/images/atreides/admin/dashboard_controls_activity.png +0 -0
  213. data/lib/assets/images/atreides/admin/dashboard_controls_customize.png +0 -0
  214. data/lib/assets/images/atreides/admin/dashboard_controls_drafts.png +0 -0
  215. data/lib/assets/images/atreides/admin/dashboard_controls_open.png +0 -0
  216. data/lib/assets/images/atreides/admin/dashboard_controls_posts.png +0 -0
  217. data/lib/assets/images/atreides/admin/dashboard_controls_queue.png +0 -0
  218. data/lib/assets/images/atreides/admin/dashboard_nav_border.png +0 -0
  219. data/lib/assets/images/atreides/admin/delete_bg.png +0 -0
  220. data/lib/assets/images/atreides/admin/down_arrow.png +0 -0
  221. data/lib/assets/images/atreides/admin/dropbox_big.jpg +0 -0
  222. data/lib/assets/images/atreides/admin/dropbox_btn.png +0 -0
  223. data/lib/assets/images/atreides/admin/dropbox_folder.png +0 -0
  224. data/lib/assets/images/atreides/admin/dropbox_icon.gif +0 -0
  225. data/lib/assets/images/atreides/admin/dropbox_icon.png +0 -0
  226. data/lib/assets/images/atreides/admin/expand_collapse.png +0 -0
  227. data/lib/assets/images/atreides/admin/form_sidebar_divider.png +0 -0
  228. data/lib/assets/images/atreides/admin/grey_hatch_bg.png +0 -0
  229. data/lib/assets/images/atreides/admin/header.png +0 -0
  230. data/lib/assets/images/atreides/admin/icon_dropbox.gif +0 -0
  231. data/lib/assets/images/atreides/admin/icon_home.gif +0 -0
  232. data/lib/assets/images/atreides/admin/input_bg.gif +0 -0
  233. data/lib/assets/images/atreides/admin/large_loading.gif +0 -0
  234. data/lib/assets/images/atreides/admin/new_content_icons.png +0 -0
  235. data/lib/assets/images/atreides/admin/off.png +0 -0
  236. data/lib/assets/images/atreides/admin/on.png +0 -0
  237. data/lib/assets/images/atreides/admin/page_icon.png +0 -0
  238. data/lib/assets/images/atreides/admin/permalink.png +0 -0
  239. data/lib/assets/images/atreides/admin/photos-display-type-gallery.png +0 -0
  240. data/lib/assets/images/atreides/admin/photos-display-type-photos.png +0 -0
  241. data/lib/assets/images/atreides/admin/product.png +0 -0
  242. data/lib/assets/images/atreides/admin/remove.png +0 -0
  243. data/lib/assets/images/atreides/admin/resize.png +0 -0
  244. data/lib/assets/images/atreides/admin/save_btn.png +0 -0
  245. data/lib/assets/images/atreides/admin/search_icon.png +0 -0
  246. data/lib/assets/images/atreides/admin/select_arrows.png +0 -0
  247. data/lib/assets/images/atreides/admin/slider.png +0 -0
  248. data/lib/assets/images/atreides/admin/slider_center.png +0 -0
  249. data/lib/assets/images/atreides/admin/slider_left.png +0 -0
  250. data/lib/assets/images/atreides/admin/slider_right.png +0 -0
  251. data/lib/assets/images/atreides/admin/sprite.png +0 -0
  252. data/lib/assets/images/atreides/admin/upload_btn.png +0 -0
  253. data/lib/assets/images/atreides/admin/video_bg.png +0 -0
  254. data/lib/assets/images/atreides/blank.gif +0 -0
  255. data/lib/assets/images/atreides/closelabel.png +0 -0
  256. data/lib/assets/images/atreides/loading.gif +0 -0
  257. data/lib/assets/images/atreides/sprite.png +0 -0
  258. data/lib/assets/images/atreides/tipsy.gif +0 -0
  259. data/lib/atreides.rb +82 -0
  260. data/lib/atreides/base/aasmstates.rb +117 -0
  261. data/lib/atreides/base/base.rb +40 -0
  262. data/lib/atreides/base/taggable.rb +43 -0
  263. data/lib/atreides/base/validation.rb +23 -0
  264. data/lib/atreides/configuration.rb +61 -0
  265. data/lib/atreides/engine.rb +41 -0
  266. data/lib/atreides/extendable.rb +12 -0
  267. data/lib/atreides/i18n_helpers.rb +65 -0
  268. data/lib/atreides/railties/tasks.rake +68 -0
  269. data/lib/atreides/time_formats.rb +19 -0
  270. data/lib/atreides/validators.rb +15 -0
  271. data/lib/atreides/version.rb +4 -0
  272. data/lib/generators/atreides/USAGE +0 -0
  273. data/lib/generators/atreides/atreides_generator.rb +58 -0
  274. data/lib/generators/templates/Procfile +2 -0
  275. data/lib/generators/templates/add_role_to_users.rb +16 -0
  276. data/lib/generators/templates/add_userid_to_resources.rb +15 -0
  277. data/lib/generators/templates/create_comments.rb +19 -0
  278. data/lib/generators/templates/create_content_parts.rb +66 -0
  279. data/lib/generators/templates/create_features.rb +21 -0
  280. data/lib/generators/templates/create_likes.rb +16 -0
  281. data/lib/generators/templates/create_line_items.rb +21 -0
  282. data/lib/generators/templates/create_links.rb +16 -0
  283. data/lib/generators/templates/create_messages.rb +24 -0
  284. data/lib/generators/templates/create_orders.rb +31 -0
  285. data/lib/generators/templates/create_pages.rb +31 -0
  286. data/lib/generators/templates/create_photos.rb +22 -0
  287. data/lib/generators/templates/create_posts.rb +38 -0
  288. data/lib/generators/templates/create_products.rb +24 -0
  289. data/lib/generators/templates/create_sessions.rb +16 -0
  290. data/lib/generators/templates/create_sites.rb +35 -0
  291. data/lib/generators/templates/create_sizes.rb +16 -0
  292. data/lib/generators/templates/create_tweets.rb +25 -0
  293. data/lib/generators/templates/create_videos.rb +24 -0
  294. data/lib/generators/templates/create_votes.rb +20 -0
  295. data/lib/generators/templates/delayed_job.rb +5 -0
  296. data/lib/generators/templates/devise_create_users.rb +42 -0
  297. data/lib/generators/templates/disqussion.rb +30 -0
  298. data/lib/generators/templates/em-net-http_override.rb +74 -0
  299. data/lib/generators/templates/initializer.rb +21 -0
  300. data/lib/generators/templates/new_relic.rb +6 -0
  301. data/lib/generators/templates/oembed.yml +63 -0
  302. data/lib/generators/templates/settings.yml +110 -0
  303. data/lib/generators/templates/string_extensions.rb +20 -0
  304. data/lib/generators/templates/unicorn.rb +2 -0
  305. data/lib/tasks/atreides_tasks.rake +4 -0
  306. data/lib/tasks/cucumber.rake +58 -0
  307. data/lib/tasks/tasks.rake +403 -0
  308. data/lib/tasks/yard.rake +18 -0
  309. metadata +1458 -0
data/lib/atreides.rb ADDED
@@ -0,0 +1,82 @@
1
+ require 'inherited_resources'
2
+ require 'haml'
3
+ require 'formtastic'
4
+ require 'settingslogic'
5
+ require 'will_paginate'
6
+ require 'acts_as_commentable'
7
+ require 'validates_email_format_of'
8
+ require 'dropbox_sdk'
9
+ require 'analytical'
10
+ require 'jquery-rails'
11
+ require 'aws/s3'
12
+ require 'devise'
13
+ require 'oauth2'
14
+
15
+ require 'cancan'
16
+ # TODO: pull request in CanCan
17
+ module CanCan
18
+ # For use with Inherited Resources
19
+ class InheritedResource < ControllerResource # :nodoc:
20
+ # defer this directly to Inherited Resources
21
+ def load_collection
22
+ @controller.send(:collection)
23
+ end
24
+
25
+ def resource_instance=(instance)
26
+ end
27
+
28
+ # def resource_instance
29
+ # @controller.send(:resource) if load_instance?
30
+ # end
31
+
32
+ def collection_instance=(instance)
33
+ end
34
+
35
+ def collection_instance
36
+ @controller.send :collection
37
+ end
38
+ end
39
+ end
40
+
41
+ require File.expand_path('atreides/engine', File.dirname(__FILE__)) if defined?(Rails) && Rails::VERSION::MAJOR == 3
42
+
43
+ require "acts-as-taggable-on"
44
+ require "paperclip"
45
+ require "dynamic_form"
46
+ require "gattica"
47
+ require "delayed_job"
48
+ require 'mini_fb'
49
+
50
+ [ 'atreides/configuration',
51
+ 'atreides/extendable',
52
+ 'atreides/validators',
53
+ 'atreides/time_formats',
54
+ "atreides/i18n_helpers",
55
+ 'atreides/base/base',
56
+ 'atreides/base/taggable',
57
+ 'atreides/base/aasmstates',
58
+ 'atreides/base/validation',
59
+ ].each do |path|
60
+ require File.expand_path(path, File.dirname(__FILE__))
61
+ end
62
+
63
+ module Atreides
64
+ class << self
65
+
66
+ # Modify configuration
67
+ # Example:
68
+ # Atreides.configure do |config|
69
+ # config.user_model = 'MyUser'
70
+ # end
71
+ def configure
72
+ yield configuration
73
+ end
74
+
75
+ # Accessor for Atreides::Configuration
76
+ def configuration
77
+ @configuration ||= Configuration.new
78
+ end
79
+ alias :config :configuration
80
+
81
+ end
82
+ end
@@ -0,0 +1,117 @@
1
+ module Atreides
2
+ class Base < ActiveRecord::Base
3
+
4
+ #
5
+ # Common class responsible for the management of Atreides model states. The focus is on managing the states between creation and publication of content.
6
+ #
7
+ module AasmStates
8
+ def self.included(recipient)
9
+ recipient.class_eval do
10
+ require 'aasm'
11
+ include ::AASM
12
+ aasm_column :state
13
+ aasm_initial_state :pending
14
+ aasm_state :pending
15
+ aasm_state :drafted
16
+ aasm_state :queued
17
+ aasm_state :published, :enter => :do_publish
18
+
19
+ aasm_event :publish do
20
+ transitions :from => [:pending, :drafted, :queued], :to => :published
21
+ end
22
+
23
+ aasm_event :draft do
24
+ transitions :from => [:pending, :published, :queued], :to => :drafted
25
+ end
26
+
27
+ aasm_event :queue do
28
+ transitions :from => [:pending, :published, :drafted], :to => :queued
29
+ end
30
+
31
+ #
32
+ # Validation
33
+ #
34
+ validates :state, :inclusion => { :in => aasm_states.map(&:name).compact.map(&:to_s) }
35
+
36
+ #
37
+ # Scopes
38
+ #
39
+ aasm_states.map(&:name).each do |state|
40
+ scope state, where(:state => state.to_s)
41
+ end
42
+
43
+ scope :by_state, lambda { |state|
44
+ where(:state => state.to_s)
45
+ }
46
+
47
+ scope :live, lambda {
48
+ # Needs to be sep variable or AR will cache the first time and it'll never change
49
+ where("#{table_name}.state = 'published' and #{table_name}.published_at <= ?", Time.zone.now)
50
+ }
51
+
52
+ #
53
+ # Callbacks
54
+ #
55
+ after_initialize :set_initial_state
56
+
57
+ # Make sure that the state of all objects are set after initialization
58
+ def set_initial_state
59
+ # Touch the state attribute and if missing reload
60
+ self.state rescue self.reload
61
+
62
+ self.state ||= self.class.aasm_initial_state
63
+ end
64
+
65
+ before_validation :stringify_state
66
+ def stringify_state
67
+ self.state = state.to_s if state?
68
+ end
69
+
70
+ #
71
+ # Methods
72
+ #
73
+
74
+ # Create a list if states used in a HTML select drop-down
75
+ def states_for_select
76
+ [
77
+ [I18n.t(:publish_now, :scope => [:model, :states]).capitalize, :publish_now],
78
+ [I18n.t(:drafted, :scope => [:model, :states]).capitalize, :drafted],
79
+ # ["Add to queue", :queued],
80
+ [I18n.t(:published_at, :scope => [:model, :states]).capitalize, :published_at]
81
+ ]
82
+ end
83
+
84
+ # Set state.
85
+ # If the value is 'published' then update the published_at attribute to now
86
+ def state=(value)
87
+ case value.to_s.to_sym
88
+ when :publish_now
89
+ self[:state] = "published"
90
+ self.published_at = Time.zone.now
91
+ when :published_at
92
+ self[:state] = "published"
93
+ else
94
+ self[:state] = value if self.class.aasm_states.map(&:name).include?(value.to_s.to_sym)
95
+ end
96
+ end
97
+
98
+ # Has this object been published? Is it live?
99
+ def live?
100
+ self.published? and self.published_at? and self.published_at < Time.zone.now
101
+ end
102
+
103
+ # Is this object schedule to be published on a date?
104
+ def publish_on_date?
105
+ self.published? and self.published_at?
106
+ end
107
+
108
+ private
109
+
110
+ # Override this in local models
111
+ def do_publish
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,40 @@
1
+ module Atreides
2
+
3
+ # Base class inherited by every model in Atreides
4
+ class Base < ActiveRecord::Base
5
+
6
+ #
7
+ # Includes
8
+ #
9
+ include ActiveModel::Validations
10
+
11
+ #
12
+ # Class definitions
13
+ #
14
+ self.abstract_class = true
15
+
16
+ # Give a string identifying the model based on it's properties.
17
+ # In order:
18
+ # - _slug_ if it has a property *slug*
19
+ # - _id-name_ if it has a property *name*
20
+ # - _id-title_ if it has a property *title*
21
+ # - _id_ otherwise
22
+ # @return A string describing an instance of a model
23
+ def to_param
24
+ return slug.to_s if self.respond_to?(:slug) and !slug.blank?
25
+ return "#{id}-#{name.to_s.parameterize}" if self.respond_to?(:name) and self.name?
26
+ return "#{id}-#{title.to_s.parameterize}" if self.respond_to?(:title) and self.title?
27
+ id.to_s
28
+ end
29
+
30
+ # Give a DOM friendly ID for an object. This is used extensively with UI Javascript behaviours.
31
+ # @param [Prefix] prefix the id with a custom name. Defaults to the objects model name.
32
+ # @return [String] the dom id
33
+ def dom_id(prefix=nil)
34
+ display_id = new_record? ? "new" : id
35
+ prefix ||= self.class.name.demodulize
36
+ prefix != :bare ? "#{prefix.to_s.parameterize('_')}_#{display_id}" : display_id
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ module Atreides
2
+ class Base < ActiveRecord::Base
3
+
4
+ #
5
+ # Module providing common tagging functionality. Uses the _acts_as_taggable_ mixin.
6
+ #
7
+ module Taggable
8
+ def self.included(recipient)
9
+ recipient.class_eval do
10
+
11
+ # Throws errors if table doesn't exist on first project setup
12
+ if recipient.table_exists?
13
+ acts_as_taggable
14
+
15
+ if Rails.env.development? || Rails.env.staging?
16
+ Settings.load! # Needed for dev env when reloading class caches
17
+ end
18
+
19
+ if defined?(Settings.tags[self.table_name]) && defined?(Settings.tags[self.table_name]['groups'])
20
+ acts_as_taggable_on Settings.tags[self.table_name]['groups']
21
+ scope :tagged, lambda { |tags|
22
+ tags_sql = tags.is_a?(Array) ? tags.map{|t|"'#{t}'"}.join(",") : "'#{tags}'"
23
+ select("#{table_name}.*").
24
+ joins("JOIN taggings ON taggings.taggable_id = #{table_name}.id AND taggings.taggable_type IN ('#{to_s}')").
25
+ where("taggings.tag_id in (SELECT id from tags where LOWER(name) IN (#{tags_sql.downcase}))")
26
+ }
27
+ end
28
+ end
29
+
30
+ # Add callback to normalize tags
31
+ before_save :normalize_tags
32
+
33
+ private
34
+
35
+ def normalize_tags
36
+ self.tag_list = self.tag_list.map(&:parameterize)
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,23 @@
1
+ module Atreides
2
+ class Base < ActiveRecord::Base
3
+
4
+ #
5
+ # Module providing common validations functionality.
6
+ #
7
+ module Validation
8
+ def self.included(recipient)
9
+ recipient.class_eval do
10
+ before_validation :update_slug
11
+
12
+ # Sets the object's slug. Slugs are used to create SEO friendly URLs.
13
+ def update_slug
14
+ # Set slug if not set
15
+ if respond_to?(:slug) and respond_to?(:title)
16
+ self.slug = title? ? title.parameterize : id if !slug? or slug.match(/^\d+$/)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,61 @@
1
+ class Atreides::Configuration
2
+ attr_accessor :user_model
3
+ attr_accessor :admin_route_prefix
4
+ attr_accessor :admin_route_redirect
5
+
6
+ @@overrides ||= {}
7
+ @@overriden_from ||= {}
8
+
9
+ # Configuration defaults
10
+ def initialize
11
+ @user_model = 'User'
12
+ @admin_route_prefix = 'admin'
13
+ @admin_route_redirect = "/#{@admin_route_prefix}/pages"
14
+ end
15
+
16
+ def overrides
17
+ @@overrides
18
+ end
19
+
20
+ def override *args
21
+ from = caller[0]
22
+ overrides = args.extract_options!
23
+ args.each { |arg| overrides[arg] = arg.to_sym }
24
+ overrides.each do | atreides_classname, host_concern_name |
25
+ unless atreides_classname.to_s.starts_with? 'Atreides::'
26
+ atreides_classname = "Atreides::#{atreides_classname}"
27
+ end
28
+ @@overrides[atreides_classname.to_sym] = [] if @@overrides[atreides_classname.to_sym].nil?
29
+ @@overrides[atreides_classname.to_sym] << host_concern_name
30
+ @@overriden_from[atreides_classname.to_sym] = from
31
+ end
32
+ end
33
+
34
+ def inject_overrides atreides_class
35
+ # Rails.logger.debug { "Injecting overrides in class #{atreides_class.inspect} !" }
36
+
37
+ modules = @@overrides[atreides_class.to_s.to_sym] || []
38
+
39
+ modules.uniq.each do |hostapp_module_name|
40
+ begin
41
+ host_module = hostapp_module_name.to_s.constantize
42
+ # puts "\t\tInjecting #{host_module} into #{atreides_class}"
43
+ atreides_class.instance_eval {
44
+ include host_module
45
+ }
46
+ rescue NameError => e
47
+ from = @overriden_from[atreides_class.to_s.to_sym] rescue "---"
48
+ puts <<-ERR
49
+ Atreides configuration error !
50
+ Following Atreides's configuration, here: #{from.inspect}
51
+
52
+ Atreides's' '#{atreides_class.to_s}' class should be overriden by a class named #{hostapp_module_name.inspect}.
53
+
54
+ This #{hostapp_module_name.inspect} class could not be loaded !
55
+
56
+ ERR
57
+ raise e
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,41 @@
1
+ require "rails"
2
+
3
+ module Atreides
4
+ class Engine < Rails::Engine
5
+ paths['db/migrate'] = 'db/migrate'
6
+ # paths['atreides/base'] = 'atreides/base'
7
+ paths['app/inputs'] = 'app/inputs'
8
+
9
+ # Since the database can't be set up when running the generators,
10
+ # we move the models path to autoload instead of eager_load.
11
+ # otherwise, we would get "could not find table 'xxxx'" exceptions.
12
+ config.eager_load_paths -= [ paths["app/models"].first ]
13
+ config.autoload_paths << paths["app/models"].first
14
+ config.autoload_paths += %W(#{Rails.root}/app/atreides/models)
15
+ config.eager_load_paths += [ paths["app/inputs"].first ]
16
+
17
+ # Force routes to be loaded if we are doing any eager load.
18
+ config.before_eager_load { |app| app.reload_routes! }
19
+
20
+ initializer :load_overrides do
21
+ filename = File.expand_path('config/initializers/overrides', Rails.root)
22
+ require filename if File.exists?(filename)
23
+ end
24
+
25
+ initializer "atreides.asset_pipeline" do |app|
26
+ app.config.assets.precompile += %w( atreides/admin_edit.js atreides/admin.js atreides/public.js atreides/admin.css atreides/public.css )
27
+ end
28
+
29
+ initializer 'atreides.formtastic.inputs' do
30
+ load_path = paths['app/inputs'].first
31
+ matcher = /\A#{Regexp.escape(load_path)}\/(.*)\.rb\Z/
32
+ Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
33
+ require_dependency file.sub(matcher, '\1')
34
+ end
35
+ end
36
+
37
+ rake_tasks do
38
+ load 'atreides/railties/tasks.rake'
39
+ end
40
+ end
41
+ end