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,4 @@
1
+ module Atreides::AdminHomeHelper
2
+
3
+ include Atreides::Extendable
4
+ end
@@ -0,0 +1,210 @@
1
+ # Methods added to this helper will be available to all templates in the application.
2
+ module Atreides::ApplicationHelper
3
+
4
+ def facebook_meta_tags
5
+
6
+ return unless page_object
7
+
8
+ title = Settings.app_name + " - #{page_title}"
9
+
10
+ str = tag(:meta, :name => "title", :content => title) + "\n"
11
+ str += tag(:meta, :name => "description", :content => page_description) + "\n"
12
+
13
+ str += tag(:meta, :property => "og:title", :content => title) + "\n"
14
+ str += tag(:meta, :property => "og:description", :content => page_description) + "\n"
15
+ str += tag(:meta, :property => "og:url", :content => request.url) + "\n"
16
+ str += tag(:meta, :property => "og:site_name", :content => Settings.app_name) + "\n"
17
+ str += tag(:meta, :property => "og:type", :content => "article") + "\n"
18
+
19
+ return str unless page_object.respond_to?(:post_type)
20
+
21
+ str += case page_object.post_type.to_s
22
+ when "video"
23
+ unless page_object.videos.empty?
24
+ v = page_object.videos.first
25
+ tag(:link, :rel => "video_src", :href => v.embed_url, :title => title) + "\n" +
26
+ tag(:meta, :rel => "video_height", :content => v.height) + "\n" +
27
+ tag(:meta, :rel => "video_width", :content => v.width) + "\n" +
28
+ tag(:meta, :rel => "video_type", :content => "application/x-shockwave-flash") + "\n" +
29
+ tag(:link, :rel => "image_src", :href => v.thumb_url, :title => title) + "\n" +
30
+ tag(:meta, :property => "og:video", :content => v.embed_url) + "\n" +
31
+ tag(:meta, :property => "og:video:height", :content => v.height) + "\n" +
32
+ tag(:meta, :property => "og:video:width", :content => v.width) + "\n" +
33
+ tag(:meta, :property => "og:video:type", :content => "application/x-shockwave-flash") + "\n" +
34
+ tag(:meta, :property => "og:image", :content => v.thumb_url)
35
+ end
36
+ else
37
+ if page_object.thumbnail
38
+ tag(:link, :rel => "image_src", :href => page_object.thumbnail, :title => title) + "\n" +
39
+ tag(:meta, :name => "medium", :content => "image") + "\n" +
40
+ tag(:meta, :property => "og:image", :content => page_object.thumbnail) + "\n"
41
+ end
42
+ end
43
+ str.html_safe
44
+ end
45
+
46
+ def page_title
47
+ return "" if page_object.nil?
48
+
49
+ page_object.title
50
+ end
51
+
52
+ def page_description
53
+ return "" if page_object.nil?
54
+ truncate_words(strip_tags(page_object.body), :length => 20, :omission => "...")
55
+ end
56
+
57
+ def page_object
58
+ page_object ||= @post || @page
59
+ page_object ||= @posts.first if @posts
60
+ page_object
61
+ end
62
+
63
+ #
64
+ # Common
65
+ #
66
+ def flash_messages
67
+ return unless messages = flash.keys.select{|k| [:notice, :message, :warning, :error].include?(k)}
68
+ content_tag(:div, :id => "flash") do
69
+ messages.map do |type|
70
+ content_tag :div, :id => "flash-#{type.to_s}", :class => "flash #{type.to_s}" do
71
+ content_tag :span, message_for_item(flash[type], flash["#{type}_item".to_sym]).html_safe
72
+ end
73
+ end.join.html_safe
74
+ end
75
+ end
76
+
77
+ def message_for_item(message, item = nil)
78
+ if item.is_a?(Array)
79
+ message % link_to(*item)
80
+ else
81
+ message
82
+ end
83
+ end
84
+
85
+ def session_key
86
+ @session_key ||= Rails.application.config.session_options[:key]
87
+ end
88
+
89
+ def link_current_block
90
+ @link_current_block ||= Proc.new { |name| content_tag(:span, name) }
91
+ end
92
+
93
+ def body_classes
94
+ con = params[:controller].split('/').last.strip
95
+ act = params[:action].strip
96
+ id = resource ? resource.to_param : nil
97
+ "#{con} #{con}-#{act} #{id} #{@body_classes.to_s}"
98
+ end
99
+
100
+ def truncate_words(txt, ops = {})
101
+ ops.reverse_merge({
102
+ :length => 100,
103
+ :omission => "..."
104
+ })
105
+ words = txt.to_s.split()
106
+ words[0..(ops[:length]-1)].join(' ').to_s + (words.length > ops[:length] ? ops[:omission] : '').to_s
107
+ end
108
+
109
+ #
110
+ # ScriptaculousHelper overrides for jQuery
111
+ #
112
+ def sortable_element_js(element_id, options = {}) #:nodoc:
113
+ # Make AJAX callback request if URL provided
114
+ if options.key?(:url)
115
+ options[:data] = %($(#{ActiveSupport::JSON.encode(element_id)}).sortable('serialize'))
116
+ options[:update] = "function(){" + remote_function(options) + "}"
117
+ options.delete(:url)
118
+ options.delete(:data)
119
+ end
120
+ [:axis].each {|k| options[k] = "'#{options[k]}'" }
121
+
122
+ %($(#{ActiveSupport::JSON.encode(element_id)}).sortable(#{options_for_javascript(options)});)
123
+ end
124
+
125
+ def sortable_element(element_id, options = {})
126
+ javascript_tag(sortable_element_js(element_id, options))
127
+ end
128
+
129
+ def remote_function(options)
130
+ opts = {
131
+ :type => options[:type] || options[:method] || 'post',
132
+ :dataType => options[:dataType] || 'script',
133
+ :url => options[:url] || url_for(params)
134
+ }
135
+ opts.each_pair{|k,v| opts[k] = "'#{v}'" }
136
+ opts[:data] = options[:data] if options.key?(:data)
137
+
138
+ [:success, :complete, :beforeSend, :error].each do |k|
139
+ opts[k] = "function(){" + options[k] + "}" if options.key?(k)
140
+ end
141
+
142
+ %($.ajax(#{options_for_javascript(opts)});)
143
+ end
144
+
145
+ #
146
+ # Forms and Lists
147
+ #
148
+ def col_to_field(col)
149
+ case col.type
150
+ when :text
151
+ :text_area
152
+ when :boolean
153
+ :check_box
154
+ when :date
155
+ :date_select
156
+ when :datetime, :time
157
+ :datetime_select
158
+ else
159
+ :text_field
160
+ end
161
+ end
162
+
163
+ def col_to_class_name(col)
164
+ case col.type
165
+ when :text
166
+ :textarea
167
+ when :boolean
168
+ :checkbox
169
+ when :date, :datetime, :time
170
+ :select
171
+ else
172
+ :text
173
+ end
174
+ end
175
+
176
+ def sort_col(col)
177
+ col_sym = col.class.to_s.downcase.to_sym rescue nil
178
+ case col_sym
179
+ when :datetime, :time
180
+ "date-iso"
181
+ else
182
+ "text"
183
+ end
184
+ end
185
+
186
+ def action_link(action, record, record_name, final_options = {})
187
+ url = case action.to_sym
188
+ when :show, :destroy, :update
189
+ "#{record_name}_path"
190
+ when :edit
191
+ "edit_#{record_name}_path"
192
+ when :new
193
+ "new_#{record_name}_path"
194
+ else
195
+ "#{action}_#{record_name}_path"
196
+ end
197
+
198
+ options = case action.to_sym
199
+ when :destroy
200
+ {:confirm => 'Are you sure?', :method => :delete}
201
+ when :moderate
202
+ {:confirm => 'Are you sure?', :method => :put }
203
+ end
204
+ options ||= {}
205
+
206
+ link_to action.capitalize, send(url, record), {:class => action}.merge(options).merge(final_options)
207
+ end
208
+
209
+ include Atreides::Extendable
210
+ end
@@ -0,0 +1,4 @@
1
+ module Atreides::HomeHelper
2
+
3
+ include Atreides::Extendable
4
+ end
@@ -0,0 +1,119 @@
1
+ module Atreides::PostsHelper
2
+
3
+ def like_label(post)
4
+ count = post.likes.count
5
+ str = count.zero? ? "like this?" : "#{pluralize(count, 'people')} like this"
6
+ content_tag :div, link_to(str, post_likes_path(post), :remote => true), :id => post.dom_id('like_label')
7
+ end
8
+
9
+ def post_item(post)
10
+ content_tag(:div, :class => "post-title") do
11
+ link_to_unless_current(post.title? ? post.title : post.published_at.to_s(:date_ordinal), post_path(post, post.slug))
12
+ end +
13
+ post.parts.map do |part|
14
+ case part.content_type.to_sym
15
+ when :photos
16
+ photos_part(part)
17
+ when :videos
18
+ videos_part(part)
19
+ when :text
20
+ text_part(part)
21
+ end
22
+ end.join.html_safe +
23
+ # Tags
24
+ post_action_links(post)
25
+ end
26
+
27
+ def photos_part(part)
28
+ contentable = part.contentable
29
+ obj_type = contentable.class.to_s.demodulize.downcase
30
+ # Rejection cases
31
+ return unless %w(post product page).include?(obj_type.to_s)
32
+ return if part.photos.empty?
33
+
34
+ detail_path = send("#{obj_type}_path", contentable.to_param, contentable.slug)
35
+ image_size = :list # Is this needed? -> detail_page? ? :medium : :list
36
+ thumb_panes = detail_page? ? 6 : 4
37
+ thumb_photos = part.photos[(detail_page? ? 0 : 1)..(detail_page? ? part.photos.count : thumb_panes+1)]
38
+ is_gallery = (part.respond_to?(:display_type) and part.display_type? and part.display_type.gallery?)
39
+
40
+ content_tag(:div, :class => "photos-slideshow") do
41
+ content_tag(:div, :class => (detail_page? && is_gallery) ? "slideshow" : "stacked-photos") do
42
+ photos = detail_page? ? part.photos : [part.photos.first]
43
+ photos.map do |f|
44
+ display = (f==part.photos.first || !is_gallery) ? "block" : "none"
45
+ dom_id = f.dom_id
46
+ # Make link
47
+ content_tag(:div, :id => dom_id, :class => "slide", :style => "display:#{display}") do
48
+ s = f.size(image_size) rescue {}
49
+ link_to(image_tag(f.image.url(image_size), :size => [s[:width], s[:height]].join('x')), send("#{obj_type}_path", contentable.to_param, contentable.slug, :anchor => dom_id), :name => dom_id) +
50
+ content_tag(:p, (f.caption? ? f.caption : " "), :class => "photo-caption")
51
+ end
52
+ end.join.html_safe
53
+ end +
54
+
55
+ # Only show thumbs on details page
56
+ if thumb_photos.size > 1 && (!detail_page? || is_gallery)
57
+ content_tag(:div, :class => "slideshow-controls") do
58
+ content_tag(:ul, :class => "slideshow-controls-container #{'carousel' if detail_page? && thumb_photos.size > thumb_panes}") do
59
+ thumb_photos.map do |p|
60
+ content_tag(:li) do
61
+ link_to(image_tag(p.image.url(:thumb), :size => "95x95"), send("#{obj_type}_path", contentable, contentable.slug, :anchor => p.dom_id), :class => (p==thumb_photos.last ? "last" : ""))
62
+ end
63
+ end.join.html_safe
64
+ end
65
+ end
66
+ end.to_s
67
+
68
+ end +
69
+ content_tag(:div, "", :class => "clear")
70
+ end
71
+
72
+ def text_part(part)
73
+ post = part.contentable
74
+ parts = part.body.to_s.split('<!--more-->')
75
+
76
+ if parts.size > 1 && controller.action_name!='show'
77
+ parts.first.to_s + "... " + link_to("Continue reading #{post.title}.", post_path(post, post.slug))
78
+ else
79
+ part.body.to_s
80
+ end.html_safe
81
+ end
82
+
83
+ def videos_part(part)
84
+ post = part.contentable
85
+
86
+ return "No videos found" if part.videos.empty?
87
+ part.videos.map do |video|
88
+ # Details and list sizes are different
89
+ width = 630
90
+ height = ((width.to_f/video.width) * video.height).to_i
91
+ content_tag(:div, video.embed(:width => width, :height => height).html_safe, :id => video.dom_id, :class => "post-video")
92
+ end.join.html_safe
93
+ end
94
+
95
+ def post_action_links(post)
96
+ content_tag(:div, :class => "post-links clear") do
97
+ content_tag(:ul) do
98
+ lnks = [
99
+ link_to("+ Share", post_url(post, post.slug), :class => "share", :title => "#{Settings.app_name} - #{post.title}"),
100
+ post.tag_list.map{|t| link_to(t.titleize, tagged_posts_path(t), :class => "tag") }
101
+ ].flatten
102
+ lnks.map{|lnk| content_tag(:li, lnk) }.join.html_safe
103
+ end
104
+ end
105
+ end
106
+
107
+ def detail_page?
108
+ return true if %w(atom rss application/atom+xml application/rss+xml).include?(request.format.to_s)
109
+
110
+ case controller.controller_name.to_sym
111
+ when :contributors
112
+ false
113
+ else
114
+ %w(show feeds).include?(controller.action_name)
115
+ end
116
+ end
117
+
118
+ include Atreides::Extendable
119
+ end
@@ -0,0 +1,13 @@
1
+ class FilesInput
2
+ include Formtastic::Inputs::Base
3
+
4
+ def to_html
5
+ input_wrapping do
6
+ label_html <<
7
+ builder.send(:file_field, method, input_html_options)
8
+ end
9
+ end
10
+
11
+ end
12
+
13
+
@@ -0,0 +1,18 @@
1
+ class PriceInput
2
+ include Formtastic::Inputs::Base
3
+
4
+ def to_html
5
+ input_wrapping do
6
+ label_html <<
7
+ builder.send(:text_field, method, input_html_options)
8
+ end
9
+ end
10
+
11
+ def label_html
12
+ super <<
13
+ "<span>$</span>".html_safe
14
+ end
15
+
16
+ end
17
+
18
+
@@ -0,0 +1,16 @@
1
+ class UnderlineInput
2
+ include Formtastic::Inputs::Base
3
+
4
+ def to_html
5
+ input_wrapping do
6
+ label_html <<
7
+ builder.send(:text_field, method, input_html_options)
8
+ end
9
+ end
10
+
11
+ def label_html
12
+ super <<
13
+ "<span>#{options[:prefix]}</span>".html_safe
14
+ end
15
+
16
+ end
@@ -0,0 +1,24 @@
1
+ class Atreides::Ability
2
+ include CanCan::Ability
3
+
4
+ # Define abilities for the passed in user here. For example:
5
+ # doc: https://github.com/ryanb/cancan/wiki/Defining-Abilities
6
+ def initialize(user)
7
+ user ||= Atreides::User.new
8
+ if user.admin?
9
+ can :manage, :all
10
+ elsif user.role == :editor
11
+ can :read, :all
12
+ can :manage, Atreides::Post
13
+ can :manage, Atreides::Page
14
+ elsif user.role == :writer
15
+ can :read, :all
16
+ can :create, Atreides::Page
17
+ can :create, Atreides::Post
18
+ can :manage, Atreides::Page, :author => user
19
+ can :manage, Atreides::Post, :author => user
20
+ end
21
+ end
22
+
23
+ include Atreides::Extendable
24
+ end
@@ -0,0 +1,93 @@
1
+ class Atreides::Comment < Atreides::Base
2
+
3
+ acts_as_commentable
4
+
5
+ #
6
+ # Constants
7
+ #
8
+
9
+ #
10
+ # Associatons
11
+ #
12
+ belongs_to :commentable, :polymorphic => true, :counter_cache => true
13
+ belongs_to :user
14
+
15
+ #
16
+ # Validations
17
+ #
18
+ validates_presence_of :comment
19
+ validate :spam_filter, :on => :create
20
+
21
+ def spam_filter
22
+ errors.add(:base, "Unfortunately this comment is considered spam by Akismet. It will show up once it has been approved by the administrator.") if spam?
23
+ end
24
+
25
+ #
26
+ # Scopes
27
+ #
28
+ default_scope order('created_at ASC')
29
+ scope :moderated, where("moderated_at is not null")
30
+ scope :approved, where("moderated_at is null")
31
+
32
+ #
33
+ # Callbacks
34
+ #
35
+
36
+ #
37
+ # Class Methods
38
+ #
39
+ class << self
40
+ def base_class
41
+ self
42
+ end
43
+ end
44
+
45
+ #
46
+ # Instance Methods
47
+ #
48
+ def moderated?
49
+ moderated_at?
50
+ end
51
+
52
+ def moderate!
53
+ update_attributes!(:moderated_at => Time.zone.now)
54
+ end
55
+
56
+ def request=(request)
57
+ @user_ip = request.remote_ip
58
+ @user_agent = request.env['HTTP_USER_AGENT']
59
+ @referrer = request.env['HTTP_REFERER']
60
+ @has_request = true
61
+ end
62
+
63
+ def spam?
64
+ result = @has_request ? Akismetor.spam?(akismet_attributes) : false
65
+ moderate! if result
66
+ result
67
+ end
68
+
69
+ def akismet_attributes
70
+ {
71
+ :key => 'abc123',
72
+ :blog => "http://#{Settings.domain}",
73
+ :user_ip => @user_ip,
74
+ :user_agent => @user_agent,
75
+ :comment_author => user.full_name,
76
+ :comment_author_email => user.email,
77
+ # :comment_author_url => site_url,
78
+ :comment_content => comment
79
+ }
80
+ end
81
+
82
+ def mark_as_spam!
83
+ moderate!
84
+ Akismetor.submit_spam(akismet_attributes)
85
+ end
86
+
87
+ def mark_as_ham!
88
+ update_attribute(:moderated_at, nil)
89
+ Akismetor.submit_ham(akismet_attributes)
90
+ end
91
+
92
+ include Atreides::Extendable
93
+ end