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,93 @@
1
+ class Atreides::ApplicationController < ApplicationController
2
+ helper 'atreides/application'
3
+
4
+ before_filter :current_site
5
+ before_filter :current_lang
6
+
7
+ private
8
+
9
+ def current_site
10
+ # Use subdomain as key for site
11
+ @current_site ||= Atreides::Site.find_by_name(request.subdomains.last) || Atreides::Site.default
12
+ session[:site_name] = @current_site.name
13
+ @current_site
14
+ end
15
+
16
+ def current_lang
17
+ @current_lang = I18n.locale = current_site.lang if I18n.available_locales.include?(current_site.lang)
18
+ end
19
+
20
+ def end_of_association_chain
21
+ assoc_name = params[:controller].split('/').last.strip.to_sym
22
+ if current_site.respond_to?(assoc_name)
23
+ current_site.send(assoc_name)
24
+ else
25
+ model_name.constantize
26
+ end
27
+ end
28
+
29
+ def store_location
30
+ session[:return_to] = request.fullpath
31
+ end
32
+
33
+ def redirect_back_or_default(default)
34
+ redirect_to(session[:return_to] || default)
35
+ session[:return_to] = nil
36
+ end
37
+
38
+ def cache_key
39
+ "#{request.url}/#{request.format.to_sym.to_s}/#{etag}/#{flash.to_s.gsub(/\W/,'')}"
40
+ end
41
+
42
+ def set_expires
43
+ expires_in 30.seconds, :private => false, :public => true
44
+ end
45
+
46
+ def set_fresh_when
47
+ if ActionController::Base.perform_caching and collection?
48
+ return !stale?(:etag => etag, :last_modified => last_modified, :public => true)
49
+ end
50
+ end
51
+
52
+ def etag
53
+ last_modified.to_i
54
+ end
55
+
56
+ LAST_MODIFIED_CACHE_KEY = 'site_last_modified'
57
+
58
+ def last_modified
59
+ # Update the cache last-modified date
60
+ set_last_modified(true) unless @last_modified ||= Rails.cache.read(LAST_MODIFIED_CACHE_KEY)
61
+ @last_modified
62
+ end
63
+
64
+ def set_last_modified(force = false)
65
+ # Don't update it unless forced to or the if the request is just a GET
66
+ @last_modified = Time.now.utc
67
+ Rails.cache.write(LAST_MODIFIED_CACHE_KEY, @last_modified) if force or !request.get?
68
+ end
69
+
70
+ def resource?
71
+ respond_to?(:resource, true) and !resource.nil?
72
+ end
73
+
74
+ def collection?
75
+ respond_to?(:collection, true) and !collection.nil? and !collection.empty?
76
+ end
77
+
78
+ def current_ability
79
+ @current_ability ||= Atreides::Ability.new(current_user)
80
+ end
81
+
82
+ def atreides_setup?
83
+ Atreides::User.admins.count > 0
84
+ end
85
+
86
+ def check_user_agent
87
+ if request.user_agent =~ /(facebookexternalhit|curl)/i
88
+ request.path_parameters.each do |k,v|
89
+ params[k.to_sym] = v
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,43 @@
1
+ class Atreides::CommentsController < Atreides::PublicController
2
+ helper "Atreides::Posts"
3
+ before_filter :require_user, :only => [:create, :update]
4
+
5
+ def index
6
+ super do |wants|
7
+ wants.html { head :not_found }
8
+ wants.json { render :json => collection.to_json }
9
+ wants.xml { render :xml => collection.to_xml }
10
+ end
11
+ end
12
+
13
+ def create
14
+ build_resource.request = request
15
+ super do |success, failure|
16
+ success.html { head :ok, :location => post_path(parent) }
17
+ success.js
18
+ failure.wants.html { head :error, :message => resource.errors.full_messages.to_sentence }
19
+ failure.wants.js
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def resource
26
+ @comment ||= parent.comments.find params[:id]
27
+ end
28
+
29
+ def build_resource
30
+ @comment ||= Comment.new params[:comment].update(:user => current_user, :commentable => parent)
31
+ end
32
+
33
+ def collection
34
+ @comments ||= parent.comments.approved.paginate :page => params[:page]
35
+ end
36
+
37
+ def parent
38
+ @parent ||= Atreides::Post.find_by_slug!(params[:post_id]) ||
39
+ Atreides::Post.find(params[:post_id])
40
+ end
41
+
42
+ include Atreides::Extendable
43
+ end
@@ -0,0 +1,71 @@
1
+ class Atreides::HomeController < Atreides::PublicController
2
+
3
+ helper 'atreides/posts'
4
+
5
+ caches_page :robots
6
+ before_filter :collection, :only => [:index, :sitemap, :feeds]
7
+
8
+ def search
9
+ end
10
+
11
+ def feeds
12
+ respond_to do |wants|
13
+ wants.rss {
14
+ render :template => "atreides/posts/index"
15
+ }
16
+ wants.atom {
17
+ render :template => "atreides/posts/index"
18
+ }
19
+ end
20
+ end
21
+
22
+ def sitemap
23
+ @posts = collection
24
+ @countdowns = live_posts.tagged_with('countdown').limit(500)
25
+ @pages = Atreides::Page.published.limit(500)
26
+ respond_to do |wants|
27
+ wants.xml
28
+ end
29
+ end
30
+
31
+ def robots
32
+ respond_to do |wants|
33
+ wants.txt
34
+ end
35
+ end
36
+
37
+ def error
38
+ respond_to do |wants|
39
+ wants.html {
40
+ render "atreides/errors/500"
41
+ }
42
+ end
43
+ end
44
+
45
+ def not_found
46
+ respond_to do |wants|
47
+ wants.html {
48
+ render "atreides/errors/404"
49
+ }
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def collection
56
+ @collection ||= case action_name
57
+ when 'sitemap'
58
+ live_posts.limit(500).order("updated_at desc")
59
+ when 'index', 'feeds'
60
+ live_posts.paginate :page => params[:page]
61
+ else
62
+ []
63
+ end
64
+ end
65
+
66
+ def live_posts
67
+ Atreides::Post.live
68
+ end
69
+
70
+ include Atreides::Extendable
71
+ end
@@ -0,0 +1,44 @@
1
+ class Atreides::LikesController < Atreides::PublicController
2
+ belongs_to :page, :post
3
+
4
+ helper "Atreides::Posts"
5
+ before_filter :require_user, :only => [:create]
6
+
7
+ def index
8
+ super do |wants|
9
+ wants.html { head :not_found }
10
+ wants.json { render :json => collection.to_json }
11
+ wants.xml { render :xml => collection.to_xml }
12
+ end
13
+ end
14
+
15
+ def create
16
+ super do |success, failure|
17
+ success.html { head :ok, :location => post_path(parent) }
18
+ success.js
19
+ failure.wants.html { head :error, :message => "You already liked this" }
20
+ failure.wants.js
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def resource
27
+ @like ||= parent.likes.find params[:id]
28
+ end
29
+
30
+ def build_resource
31
+ @like ||= Like.new :user => current_user, :likeable => parent
32
+ end
33
+
34
+ def collection
35
+ @likes ||= parent.likes.paginate :page => params[:page]
36
+ end
37
+
38
+ def parent
39
+ @parent ||= Atreides::Post.find_by_slug(params[:post_id]) ||
40
+ Atreides::Post.find(params[:post_id])
41
+ end
42
+
43
+ include Atreides::Extendable
44
+ end
@@ -0,0 +1,34 @@
1
+ class Atreides::PagesController < Atreides::PublicController
2
+
3
+ def show
4
+ track_resource_analytics
5
+ @page_title = resource.title
6
+ super
7
+ end
8
+
9
+ def preview
10
+ @page = end_of_association_chain.new(params[:page])
11
+ @page.id ||= 0
12
+ @page.published_at = 1.minute.ago
13
+ @page.slug = 'preview' unless @page.slug?
14
+ @body_classes = "page-show" # So that CSS will think it's the details page
15
+ respond_to do |wants|
16
+ wants.html {
17
+ render :template => "atreides/pages/show"
18
+ }
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def end_of_association_chain
25
+ current_site.pages.live
26
+ end
27
+
28
+ def resource
29
+ @page ||= end_of_association_chain.find_by_slug(params[:page_slug]) ||
30
+ end_of_association_chain.find_by_slug(params[:id])
31
+ end
32
+
33
+ include Atreides::Extendable
34
+ end
@@ -0,0 +1,119 @@
1
+ class Atreides::PostsController < Atreides::PublicController
2
+
3
+ before_filter :date, :only => [:index]
4
+ before_filter :resource, :only => [:gallery_params, :show, :next, :previous]
5
+ before_filter :featured_pics, :only => [:show]
6
+ before_filter :collection, :only => [:index, :tagged, :archives]
7
+
8
+ def index
9
+ super do |wants|
10
+ wants.atom
11
+ wants.rss
12
+ end
13
+ end
14
+
15
+ def show
16
+ @page_title = resource.title rescue nil
17
+ track_resource_analytics
18
+
19
+ super do |wants|
20
+ wants.xml { render "atreides/common/slideshow" }
21
+ end
22
+ end
23
+
24
+ def preview
25
+ @post = end_of_association_chain.new(params[:post])
26
+ @post.id ||= 0
27
+ @post.published_at = 1.minute.ago
28
+ @post.slug = 'preview' unless @post.slug?
29
+ @body_classes = "posts-show" # So that CSS will think it's the details page
30
+ respond_to do |wants|
31
+ wants.html { render :template => "atreides/posts/show" }
32
+ end
33
+ end
34
+
35
+ def archives
36
+ @page_title = 'Archives'
37
+ respond_to do |wants|
38
+ wants.html { render "atreides/posts/archives" }
39
+ wants.js { render "atreides/posts/archives" }
40
+ end
41
+ end
42
+
43
+ def tagged
44
+ @page_title = "Posts tagged #{params[:tag]}"
45
+ respond_to do |wants|
46
+ wants.html { render "atreides/posts/tagged" }
47
+ wants.js
48
+ end
49
+ end
50
+
51
+ def next
52
+ post = resource.next || resource
53
+ redirect_to post_path(post, post.slug)
54
+ end
55
+
56
+ def previous
57
+ post = resource.previous || resource
58
+ redirect_to post_path(post, post.slug)
59
+ end
60
+
61
+ private
62
+
63
+ def featured_pics
64
+ @featured_pics ||= current_site.features.live.tagged_with('sidebar')
65
+ end
66
+
67
+ def begin_of_association_chain
68
+ current_site
69
+ end
70
+
71
+ def end_of_association_chain
72
+ current_site.posts.live
73
+ end
74
+
75
+ def resource
76
+ @post ||= end_of_association_chain.find_by_id(params[:id]) ||
77
+ end_of_association_chain.find_by_slug(params[:slug]) || # Needed to keep permalinks alive
78
+ end_of_association_chain.find_by_slug(params[:id]) || # Needed to keep permalinks alive
79
+ end_of_association_chain.find_by_tumblr_id(params[:id]) # Needed to keep permalinks alive
80
+ end
81
+
82
+ def collection
83
+ @posts ||= case self.action_name
84
+ when 'index'
85
+ if !params[:search].blank?
86
+ # Normal post listing
87
+ @query = params[:search]
88
+ q = "%#{@query}%".downcase
89
+ end_of_association_chain.joins(:parts).where("lower(title) like ? OR lower(content_parts.body) like ?", q, q).paginate(:page => params[:page])
90
+ else
91
+ # Normal post listing
92
+ end_of_association_chain.paginate(:page => params[:page])
93
+ end
94
+
95
+ when 'tagged'
96
+ end_of_association_chain.tagged_with(params[:tag]).select("DISTINCT posts.id, posts.*").paginate(:page => params[:page])
97
+ when 'archives'
98
+ col = :published_at
99
+ conditions = if params[:month] and params[:year]
100
+ @date = Date.parse("#{params[:year]}-#{params[:month]}-1")
101
+ ["EXTRACT(MONTH from #{col}) = ? and EXTRACT(YEAR from #{col}) = ?", @date.month, @date.year]
102
+ else
103
+ []
104
+ end
105
+ end_of_association_chain.paginate(
106
+ :page => params[:page],
107
+ :conditions => conditions,
108
+ :order => "#{col} desc, created_at desc")
109
+ else
110
+ []
111
+ end
112
+ end
113
+
114
+ def date
115
+ @date ||= "1-#{params[:month]}-#{params[:year] || Date.today.year}".to_date rescue Date.today
116
+ end
117
+
118
+ include Atreides::Extendable
119
+ end
@@ -0,0 +1,43 @@
1
+ class Atreides::PublicController < Atreides::ApplicationController
2
+
3
+ unloadable
4
+ inherit_resources
5
+
6
+ analytical :modules => Settings.analytics_backends, :use_session_store => true
7
+
8
+ # caches_page # for making static sites
9
+ # around_filter :cache
10
+
11
+ # Set HTTP caching headers
12
+ before_filter :set_expires
13
+ before_filter :set_fresh_when
14
+ before_filter :check_user_agent
15
+
16
+ layout 'public'
17
+
18
+ if Rails.env.production? # || Rails.env.staging?
19
+ rescue_from 'Exception' do |exception|
20
+
21
+ Rails.logger.info "Exception: #{exception}"
22
+ Rails.logger.info exception.backtrace.join("\n")
23
+
24
+ case exception.class.to_s
25
+ when ActiveRecord::RecordNotFound.to_s
26
+ render :template => 'atreides/errors/404', :layout => 'public', :status => 404
27
+ else
28
+ render :template => 'atreides/errors/500', :layout => 'public', :status => 500
29
+ end
30
+ end
31
+ end
32
+
33
+ protected
34
+
35
+ def track_resource_analytics
36
+ resource.tag_list.each { |tag|
37
+ analytical.custom_event 'Tag', 'view', tag
38
+ } if resource.respond_to?(:tag_list)
39
+
40
+ analytical.custom_event 'Author', 'view', resource.author.email if resource.respond_to?(:author) && resource.author
41
+ end
42
+
43
+ end