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
@@ -0,0 +1,39 @@
1
+ class Admin::Atreides::ProductsController < Atreides::AdminController
2
+
3
+ def new
4
+ # Create post!
5
+ resource.save!
6
+ resource.state = :published
7
+ super do |wants|
8
+ wants.html { render "edit" }
9
+ end
10
+ end
11
+
12
+ def show
13
+ super do |wants|
14
+ wants.html { redirect_to edit_admin_product_path(resource) }
15
+ end
16
+ end
17
+
18
+ def update
19
+ # Set display_order
20
+ if params[:product].key?(:sizes_attributes)
21
+ i = 0
22
+ params[:product][:sizes_attributes].each{|s| s[:display_order] = (i+=1) }
23
+ end
24
+
25
+ # Set product price
26
+ params[:product][:price] = params[:product][:price].to_money
27
+
28
+ # Mark as destroyed if not included in the list
29
+ resource.sizes.each do |s|
30
+ unless params[:product][:sizes_attributes].map(&:id).include?(s.id)
31
+ params[:product][:sizes_attributes] << {:id => s.id, :_destroy => true}
32
+ end
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ include Atreides::Extendable
39
+ end
@@ -0,0 +1,7 @@
1
+ class Admin::Atreides::SessionsController < Devise::SessionsController
2
+
3
+ layout 'admin'
4
+ helper 'devise', 'atreides/admin', 'atreides/application'
5
+
6
+ include Atreides::Extendable
7
+ end
@@ -0,0 +1,4 @@
1
+ class Admin::Atreides::SizesController < Atreides::AdminController
2
+
3
+ include Atreides::Extendable
4
+ end
@@ -0,0 +1,20 @@
1
+ class Admin::Atreides::TagsController < Atreides::AdminController
2
+ respond_to :json
3
+
4
+ def index
5
+ respond_with(collection)
6
+ end
7
+
8
+ protected
9
+
10
+ def collection
11
+ if params[:term]
12
+ term = "%#{params[:term]}%".downcase
13
+ Atreides::Tag.where("LOWER(name) LIKE ?", term).all.map{|tag| tag.name.titleize}
14
+ else
15
+ []
16
+ end
17
+ end
18
+
19
+ include Atreides::Extendable
20
+ end
@@ -0,0 +1,50 @@
1
+ class Admin::Atreides::UsersController < Atreides::AdminController
2
+
3
+ def show
4
+ super do |wants|
5
+ wants.html { redirect_to edit_admin_user_path(resource), :flash => flash }
6
+ end
7
+ end
8
+
9
+ def create
10
+ super do |success, failure|
11
+ success.html { redirect_to admin_users_path, :notice => t('devise.registrations.signed_up') }
12
+ failure.html { render 'new' }
13
+ end
14
+ end
15
+
16
+ def update
17
+ super do |success, failure|
18
+ success.html { redirect_to admin_users_path }
19
+ end
20
+ end
21
+
22
+ def admins
23
+ @users = end_of_association_chain.admins.paginate(:page => params[:page])
24
+ render "index"
25
+ end
26
+
27
+ private
28
+
29
+ def make_admin
30
+ build_resource.admin = true
31
+ end
32
+
33
+ def collection
34
+ @users ||= end_of_association_chain.paginate(:page => params[:page])
35
+ end
36
+
37
+ def resource_request_name
38
+ :user
39
+ end
40
+
41
+ def method_for_build
42
+ :build_admin
43
+ end
44
+
45
+ def end_of_association_chain
46
+ Atreides::User
47
+ end
48
+
49
+ include Atreides::Extendable
50
+ end
@@ -0,0 +1,53 @@
1
+ class Admin::Atreides::VideosController < Atreides::AdminController
2
+
3
+ helper "admin/atreides/posts"
4
+
5
+ def create
6
+ @video = resource = if params.key?(:Filedata)
7
+ end_of_association_chain.new(:upload => params[:Filedata], :part => part)
8
+ elsif params.key?(:video_url)
9
+ end_of_association_chain.new(:url => params[:video_url], :part => part)
10
+ end
11
+
12
+ if @video.save
13
+ respond_to do |wants|
14
+ wants.js
15
+ wants.html { render :status => :ok }
16
+ end
17
+ else
18
+ logger.debug { "video errors: #{resource.errors.full_messages.to_sentence}\n#{resource.inspect}" }
19
+ render :text => resource.errors.full_messages.to_sentence
20
+ end
21
+ end
22
+
23
+ def reorder
24
+ if params[:videos_list].is_a?(Array)
25
+ i = 0
26
+ params[:videos_list].each do |id|
27
+ Atreides::Video.update_all({:display_order => (i+=1)}, {:id => id})
28
+ end
29
+ render :nothing => true, :status => :ok
30
+ else
31
+ render :nothing => true, :status => :error
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ super do |wants|
37
+ wants.js
38
+ end
39
+ end
40
+
41
+
42
+ private
43
+
44
+ def part
45
+ @part ||= Atreides::ContentPart.find_by_id(params[:part_id])
46
+ end
47
+
48
+ def resource
49
+ @resource = @video ||= end_of_association_chain.find(params[:id])
50
+ end
51
+
52
+ include Atreides::Extendable
53
+ end
@@ -0,0 +1,96 @@
1
+ class Atreides::AdminController < Atreides::ApplicationController
2
+
3
+ inherit_resources
4
+ def self.inherited(base)
5
+ super
6
+ resource_class_name = base.name.sub(/Admin::/, '').sub(/Controller/, '').singularize
7
+ base.resource_class = resource_class_name.constantize
8
+ base.resources_configuration[:self][:request_name] = base.resource_class.to_s.sub(/Atreides::/, '').underscore.gsub('/', '_')
9
+ end
10
+
11
+ load_and_authorize_resource :class => resource_class
12
+
13
+ rescue_from CanCan::AccessDenied do |exception|
14
+ Rails.logger.info "AdminController: CanCan::AccessDenied #{exception.inspect}, admin?: #{current_user && !current_user.admin?}; #{current_user.inspect}"
15
+ if current_user && !current_user.admin?
16
+ @message = exception.message
17
+ render 'admin/common/access_denied'
18
+ else
19
+ if atreides_setup?
20
+ redirect_to new_user_session_path, :notice => exception.message
21
+ else
22
+ redirect_to atreides_setup_path
23
+ end
24
+ end
25
+ end
26
+
27
+ before_filter :set_date, :only => [:index, :filter]
28
+ before_filter :set_expires, :only => [:analytics]
29
+ around_filter :cache, :only => [:analytics]
30
+ skip_before_filter :verify_authenticity_token, :only => [:analytics]
31
+ after_filter :set_last_modified
32
+ before_filter :set_resource_request_name
33
+
34
+ layout 'admin'
35
+
36
+ private
37
+
38
+ def set_resource_request_name
39
+ @resource_request_name = self.resources_configuration[:self][:request_name]
40
+ end
41
+
42
+ # temporary fix for AR bug: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6723
43
+ def fix_rails_bug
44
+ keys = %w(post page) & params.keys
45
+ keys.map do |k|
46
+ params[k].merge!(:photos_attributes => params[k].delete(:photos_attributes)) if params[k].has_key? :photos_attributes
47
+ end
48
+ end
49
+
50
+ def resource_params
51
+ fix_rails_bug
52
+ super
53
+ end
54
+
55
+ def current_site
56
+ # Use session as key for
57
+ @current_site ||= if session[:site_name]
58
+ Atreides::Site.find_by_name(session[:site_name])
59
+ elsif !request.subdomains.empty?
60
+ Atreides::Site.find_by_name(request.subdomains.last)
61
+ else
62
+ Atreides::Site.default
63
+ end
64
+ session[:site_name] = @current_site.name
65
+ @current_site
66
+ end
67
+
68
+ def post
69
+ @post ||= Atreides::Post.find_by_id(params[:post_id]) ||
70
+ Atreides::Post.new
71
+ end
72
+
73
+ def set_expires
74
+ expires_in (last_modified+6.hours), :private => false, :public => true
75
+ fresh_when(:etag => last_modified.utc.to_i, :last_modified => last_modified.utc, :public => true)
76
+ end
77
+
78
+ def last_modified
79
+ case controller_name
80
+ when 'admin_home'
81
+ now = Time.now
82
+ mod = now.hour%6
83
+ last_modified = (now-mod.hours).change(:min => 0, :sec => 0, :usec => 0)
84
+ else
85
+ super
86
+ end
87
+ end
88
+
89
+ def set_date
90
+ @date ||= if params[:month] || params[:year]
91
+ "1-#{params[:month]}-#{params[:year] || Date.today.year}".to_date rescue Date.today
92
+ else
93
+ Date.today
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,211 @@
1
+ class Atreides::AdminHomeController < Atreides::ApplicationController
2
+ layout 'admin'
3
+
4
+ inherit_resources
5
+
6
+ after_filter :set_last_modified
7
+ before_filter :set_date, :only => [:index, :filter]
8
+ before_filter :set_expires, :only => [:analytics_data]
9
+ skip_before_filter :verify_authenticity_token, :only => [:analytics_data]
10
+ # around_filter :cache, :only => [:analytics_data]
11
+
12
+ before_filter :ensure_atreides_setup, :only => [:index, :search]
13
+ before_filter :setup_only_once!, :only => [:setup, :setup!]
14
+
15
+ rescue_from CanCan::AccessDenied do |exception|
16
+ Rails.logger.info "AdminHomeController: CanCan::AccessDenied #{exception.inspect}, admin?: #{current_user && !current_user.admin?}; #{current_user.inspect}"
17
+ if current_user && !current_user.admin?
18
+ @message = exception.message
19
+ render 'admin/common/access_denied'
20
+ else
21
+ redirect_to new_user_session_path, :notice => exception.message
22
+ end
23
+ end
24
+
25
+ def collection
26
+ nil
27
+ end
28
+
29
+ def setup
30
+ @user = Atreides::User.new
31
+ end
32
+ def setup!
33
+ @user = Atreides::User.new params[:user]
34
+ @user.role = :admin
35
+ if @user.save
36
+ sign_in @user
37
+ redirect_to :admin
38
+ else
39
+ render "setup"
40
+ end
41
+ end
42
+
43
+
44
+ def index
45
+ if cannot? :read, Atreides::Tweet
46
+ raise CanCan::AccessDenied
47
+ end
48
+ @show_as_dash = true
49
+ @reports = google_analytics_reports
50
+
51
+ # Twitter mentions
52
+ # Group by the date of the tweet
53
+ @since = 1.month.ago.to_date
54
+ @tweet_exposure = Atreides::Tweet.exposure(@since)
55
+ @tweet_reach = Atreides::Tweet.reach(@since)
56
+ end
57
+
58
+ def analytics_data
59
+ # TODO: parameterize the dates
60
+ if params[:since]
61
+ @since = Date.parse(params[:since]).beginning_of_day.to_date
62
+ @until = (@since + 31.days).beginning_of_day.to_date
63
+ @until = Date.today if @until > Date.today
64
+ else
65
+ @since = 1.month.ago.beginning_of_day.to_date
66
+ @until = Time.now.beginning_of_day.to_day
67
+ end
68
+
69
+ puts "From #{@since.to_s} to #{@until.to_s}"
70
+
71
+ @report_name = report_name = params[:report].to_sym
72
+
73
+ case @report_name
74
+ when *google_analytics_reports.keys
75
+ @report = google_analytics_reports[@report_name].update({ :start_date => @since.to_s, :end_date => @until.to_s})
76
+
77
+ @report[:results] = fetch_with_caching(30.minutes) do
78
+ gs = Gattica.new({:email => Settings.ganalytics.email, :password => Settings.ganalytics.password, :profile_id => Settings.ganalytics.profile_id})
79
+ gs.get(@report)
80
+ end
81
+ when :tweets
82
+ @tweets = Atreides::Tweet.analytics(@since)
83
+ when :fb_page_views
84
+ # Facebook insights API
85
+ if Settings.facebook && Settings.facebook.page_token && Settings.facebook.page_id
86
+ # @fb_page_views = fb.get(Settings.facebook.page_id, :type => 'insights/page_views/day', :params => {:since => @since})
87
+ @fb_page_views = fetch_with_caching(5.minutes) do
88
+ fb.get(Settings.facebook.page_id, :type => 'insights/page_impressions/day', :params => {:since => @since})
89
+ end
90
+ end
91
+ when :fb_page_likes
92
+ # Facebook insights API
93
+ if Settings.facebook && Settings.facebook.page_token && Settings.facebook.page_id
94
+ # @fb_page_likes = fb.get(Settings.facebook.page_id, :type => 'insights/page_like_adds/day', :params => {:since => @since})
95
+ @fb_page_likes = fetch_with_caching(5.minutes) do
96
+ fb.get(Settings.facebook.page_id, :type => 'insights/page_fan_adds/day', :params => {:since => @since})
97
+ end
98
+ end
99
+ else
100
+ raise RuntimeError.new "UnknownReport: #{@report_name.inspect}"
101
+ end
102
+ render "_#{@report_name}_analytics_tbody", :layout => nil
103
+ end
104
+
105
+ def search
106
+ raise CanCan::AccessDenied if cannot?(:read, Atreides::Post) || cannot?(:read, Atreides::Page)
107
+
108
+ @query = params[:search].to_s.strip
109
+ like_q = "%#{@query}%".downcase
110
+ conds = ["LOWER(state) like ? or LOWER(title) like ?", like_q, like_q]
111
+ tag = Atreides::Tag.find_by_name(@query)
112
+ content_part_ids = Atreides::ContentPart.where("contentable_type = 'Atreides::Post' and LOWER(body) like ?", like_q).all.map(&:contentable_id)
113
+
114
+ @results = {
115
+ :posts => current_site.posts.
116
+ where("LOWER(state) like ? or LOWER(title) like ? or id in (?)", like_q, like_q, content_part_ids).
117
+ paginate(:page => 1),
118
+
119
+ :pages => current_site.pages.
120
+ where("LOWER(state) like ? or LOWER(body) like ? or LOWER(title) like ?", like_q, like_q, like_q).
121
+ paginate(:page => 1)
122
+ }
123
+ respond_to do |wants|
124
+ wants.html {
125
+ render :template => "atreides/admin_home/search"
126
+ }
127
+ end
128
+ end
129
+
130
+ def switch_site
131
+ # Set current-site if param matches an existing one
132
+ if s = Atreides::Site.find_by_name(params[:site])
133
+ @current_site = s
134
+ session[:site_name] = s.name
135
+ end
136
+ flash[:notice] = t('atreides.atreides.admin_home.switch_site.site_changed', :current_site => current_site.name)
137
+ redirect_to request.env["HTTP_REFERER"] || admin_path
138
+ end
139
+
140
+ private
141
+
142
+ def set_date
143
+ @date ||= if params[:month] || params[:year]
144
+ "1-#{params[:month]}-#{params[:year] || Date.today.year}".to_date rescue Date.today
145
+ else
146
+ Date.today
147
+ end
148
+ end
149
+
150
+ def end_of_association_chain
151
+ current_site.posts
152
+ end
153
+
154
+ def ensure_atreides_setup
155
+ if atreides_setup?
156
+ true
157
+ else
158
+ redirect_to :atreides_setup
159
+ false
160
+ end
161
+ end
162
+
163
+ def setup_only_once!
164
+ raise "Atreides is already set up !" if atreides_setup?
165
+ end
166
+
167
+ def google_analytics_reports
168
+ {
169
+ :visitors => {
170
+ :dimensions => %w(day),
171
+ :metrics => %w(visits)
172
+ },
173
+ :top_referrers => {
174
+ :dimensions => %w(source),
175
+ :metrics => %w(visits),
176
+ :sort => %w(-visits)
177
+ },
178
+ :top_landing_pages => {
179
+ :dimensions => %w(landingPagePath),
180
+ :metrics => %w(uniquePageviews),
181
+ :sort => %w(-uniquePageviews)
182
+ }
183
+ }
184
+ end
185
+
186
+ def with_profiling activity
187
+ puts Rails.logger.info "#{activity.capitalize}..."
188
+ prof_start = Time.now.to_f
189
+ res = yield
190
+ res.tap {
191
+ puts Rails.logger.info "Done #{activity} in #{Time.now.to_f - prof_start} seconds."
192
+ }
193
+ end
194
+
195
+ def fb
196
+ MiniFB.disable_logging
197
+ @fb ||= MiniFB::OAuthSession.new(Settings.facebook.page_token)
198
+ end
199
+
200
+ def fetch_with_caching(duration, &block)
201
+ report_name = @report_name
202
+ cache_key = "analytics_data:#{@report_name}:#{@since}"
203
+ cached = Rails.cache.fetch(cache_key, :expires_in => duration) do
204
+ fetched = with_profiling "getting report #{report_name.inspect}", &block
205
+ Marshal.dump fetched
206
+ end
207
+ Marshal.restore StringIO.new cached
208
+ end
209
+
210
+ include Atreides::Extendable
211
+ end