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,206 @@
1
+ class Atreides::Video < Atreides::Base
2
+
3
+ #
4
+ # Constants
5
+ #
6
+ attr_accessor :upload
7
+
8
+ #
9
+ # Associatons
10
+ #
11
+ belongs_to :part, :touch => true, :class_name => "Atreides::ContentPart"
12
+
13
+ #
14
+ # Validations
15
+ #
16
+ validates_presence_of :vimeo_id, :unless => :url?
17
+ validates_presence_of :url, :unless => :vimeo_id?
18
+ validates_format_of :url, :with => /^http:\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix, :if => :url?
19
+
20
+ before_validation :upload_video, :on => :create
21
+
22
+ def upload_video
23
+
24
+ # upload to vimeo
25
+ send_to_vimeo if upload and File.exists?(upload)
26
+
27
+ # Set embed code
28
+ if !embedable? or url_changed?
29
+ if embedable?(:url)
30
+ self.embed = url
31
+ doc = Hpricot(self.embed)
32
+
33
+ # Get dimensions from embed code
34
+ object = doc.at("object[@width][@height]")
35
+ self.width = object.attributes['width'].to_i
36
+ self.height = object.attributes['height'].to_i
37
+
38
+ # Get url from embed code
39
+ param = doc.at("param[@name=movie]")
40
+ self.url = param.attributes['value']
41
+
42
+ # Guess image url if from youtube
43
+ if self.url =~ %r{^http://www.youtube.com/v/([0-9A-Za-z\-\_]+)\&.*$}
44
+ self.thumb_url = "http://i1.ytimg.com/vi/#{$1}/default.jpg"
45
+ end
46
+ else
47
+ require 'oembed_links'
48
+ OEmbed.register_yaml_file(File.join(Rails.root, 'config/oembed.yml'))
49
+ OEmbed.transform(url) do |r, url|
50
+ r.from?(:youtube) { |resp|
51
+ self.width = resp["width"].to_i
52
+ self.height = resp["height"].to_i
53
+ self.thumb_url = resp["thumbnail_url"]
54
+ self.embed = resp["html"]
55
+ # Extract URL from embed html
56
+ res = resp["html"].scan(/(http\:\/\/www\.youtube\.com\/embed\/.+?)\?/)
57
+ self.url = res.flatten.shift
58
+ }
59
+ r.from?(:vimeo) { |resp|
60
+ self.vimeo_id = resp["video_id"]
61
+ self.width = resp["width"].to_i
62
+ self.height = resp["height"].to_i
63
+ self.thumb_url = resp["thumbnail_url"]
64
+ self.embed = resp["html"]
65
+ }
66
+ r.any? { |resp|
67
+ self.embed = resp["html"]
68
+ self.thumb_url = resp["thumbnail_url"]
69
+ }
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ #
76
+ # Scopes
77
+ #
78
+
79
+ #
80
+ # Class Methods
81
+ #
82
+ class << self
83
+
84
+ def base_class
85
+ self
86
+ end
87
+
88
+ end
89
+
90
+ #
91
+ # Instance Methods
92
+ #
93
+ def embedable?(target = :embed)
94
+ send("#{target}?") and !send(target).strip.match(%r{^<\w+}).nil?
95
+ end
96
+
97
+ def embed(*args)
98
+ html = read_attribute(:embed)
99
+ dims = args.first if args.is_a?(Array)
100
+ return html if !dims.is_a?(Hash) or html.blank?
101
+
102
+ # Process embed for provided dimensions
103
+ doc = Hpricot(html)
104
+ %w(iframe object embed).each do |tag|
105
+ el = doc.at("#{tag}[@width][@height]")
106
+ next unless el
107
+ unless dims[:width].blank?
108
+ el.attributes['width'] = dims[:width].to_s
109
+ end
110
+ unless dims[:height].blank?
111
+ el.attributes['height'] = dims[:height].to_s
112
+ else
113
+ unless dims[:width].blank?
114
+ begin
115
+ el.attributes['height'] = (( self.height * dims[:width]) / self.width).to_s
116
+ rescue => e
117
+ logger.error "VIDEO - Error while resizing embed video : " + e.backtrace.join("\n")
118
+ end
119
+ end
120
+ end
121
+ end
122
+ doc.to_s
123
+ end
124
+
125
+ def embed_url(options = {})
126
+ @embed_url ||= if embedable?
127
+ # Parse for URL
128
+ if (tag = Hpricot(embed).at('embed'))
129
+ tag.attributes['src']
130
+ elsif (tag = Hpricot(embed).at("param[@name='movie']"))
131
+ tag.attributes['value']
132
+ elsif (tag = Hpricot(embed).at("iframe[@src]"))
133
+ tag.attributes['src']
134
+ end
135
+ elsif vimeo_id?
136
+ params = {
137
+ :clip_id => vimeo_id,
138
+ :server => "vimeo.com",
139
+ :show_title => 0,
140
+ :show_byline => 0,
141
+ :show_portrait => 0,
142
+ :full_screen => 1,
143
+ :color => "ffffff"
144
+ }.update(options)
145
+ "http://vimeo.com/moogaloop.swf?#{params.to_query}"
146
+ else
147
+ url
148
+ end
149
+ end
150
+
151
+ def flash_vars
152
+ @flash_vars ||= if vimeo_id?
153
+ {:clip_id => vimeo_id, :server => 'vimeo.com', :fullscreen => 1, :show_title => 1, :show_byline => 1, :show_portrait => 1, :color => '00ADEF'}.to_json
154
+ else
155
+ {}.to_json
156
+ end
157
+ end
158
+
159
+ def send_to_vimeo
160
+ return unless upload.respond_to?(:path) and File.exists?(upload.path)
161
+
162
+ # @vimeo.confirm("ticket_id", "json_manifest")
163
+ quota = vimeo_upload.get_quota
164
+
165
+ # Check size of upload
166
+ if upload.size > quota['user']['upload_space']['free'].to_i
167
+ return errors.add(:upload, "exceeds remaining Viemo quota")
168
+ end
169
+
170
+ ticket = vimeo_upload.get_ticket
171
+
172
+ resp = vimeo_upload.upload(Settings.vimeo.user_token, upload.path, ticket['ticket']['id'], ticket['ticket']['endpoint'])
173
+ conf = vimeo_upload.confirm(ticket['ticket']['id'])
174
+ self.vimeo_id = conf['ticket']['video_id']
175
+
176
+ # Set video's attributes
177
+ if vimeo_id?
178
+ begin
179
+ vimeo_video.set_privacy(vimeo_id, "anybody")
180
+ vimeo_video.set_description(vimeo_id, caption) if caption?
181
+ if post
182
+ # vimeo_video.set_title(vimeo_id, post.title) if post.title? # TODO: Why is the API broken here
183
+ vimeo_video.add_tags(vimeo_id, post.tag_list.join(",")) unless post.tag_list.empty?
184
+ end
185
+ rescue Exception => exc
186
+ logger.error { "Unable to set video attributes: #{exc}\nResp: #{resp.inspect}\nConf:#{conf}" }
187
+ end
188
+ self.upload = nil
189
+ else
190
+ logger.error { "Unable to save Vimeo video!\nResp: #{resp.inspect}\nConf:#{conf}" }
191
+ end
192
+ return vimeo_id?
193
+ end
194
+
195
+ private
196
+
197
+ def vimeo_upload
198
+ @vimeo_upload ||= Vimeo::Advanced::Upload.new(Settings.vimeo.consumer_key, Settings.vimeo.consumer_secret, :token => Settings.vimeo.user_token, :secret => Settings.vimeo.user_secret)
199
+ end
200
+
201
+ def vimeo_video
202
+ @video_upload ||= Vimeo::Advanced::Atreides::Video.new(Settings.vimeo.consumer_key, Settings.vimeo.consumer_secret, :token => Settings.vimeo.user_token, :secret => Settings.vimeo.user_secret)
203
+ end
204
+
205
+ include Atreides::Extendable
206
+ end
@@ -0,0 +1,43 @@
1
+ class Atreides::Vote < Atreides::Base
2
+
3
+ #
4
+ # Constants
5
+ #
6
+
7
+ #
8
+ # Associatons
9
+ #
10
+ belongs_to :votable, :polymorphic => true
11
+ belongs_to :user
12
+
13
+ #
14
+ # Validations
15
+ #
16
+ validates_presence_of :value, :votable, :ip
17
+ validates_numericality_of :value, :greater_than_or_equal_to => 0
18
+ validates_uniqueness_of :user_id, :scope => [:votable_type, :votable_id]
19
+ validates_uniqueness_of :ip, :scope => [:votable_type, :votable_id]
20
+
21
+ #
22
+ # Scopes
23
+ #
24
+
25
+ #
26
+ # Class Methods
27
+ #
28
+ class << self
29
+ end
30
+
31
+ #
32
+ # Instance Methods
33
+ #
34
+ def yes!
35
+ update_attributes!(:value => 1)
36
+ end
37
+
38
+ def no!
39
+ update_attributes!(:value => 0)
40
+ end
41
+
42
+ include Atreides::Extendable
43
+ end
@@ -0,0 +1,72 @@
1
+ # Class to aid in the publishing of posts to Facebook.
2
+ # This is typically used with Delayed Job in a background process
3
+ # Eg:
4
+ # Delayed::Job.enqueue(TumblrPostPublisherJob.new(post.id))
5
+ #
6
+ # It requires that there is a 'tumblr' section in your settings.yml config file
7
+ #
8
+ FbPostPublisherJob = Struct.new(:post_id)
9
+ class FbPostPublisherJob
10
+
11
+ return false unless Settings.has_key?('facebook')
12
+
13
+ require 'uri'
14
+ require 'yaml'
15
+ require 'mini_fb'
16
+
17
+ include Rails.application.routes.url_helpers
18
+ default_url_options[:host] = Settings.domain
19
+
20
+ # Executes the job. This authorizes the client with Facebook using settings.yml configuration
21
+ # It will update the post object with the posts facebook_id on success
22
+ # @return [Int] the tumblr id of the newly created post
23
+ def perform
24
+ post = Atreides::Post.find post_id
25
+
26
+ # Abort if already posted
27
+ return if post.facebook_id?
28
+
29
+ url = post_url(:id => post.to_param, :slug => post.slug.to_s)
30
+ msg = !post.social_msg.blank? ? post.social_msg : post.title.truncate(140)
31
+ body = post.body.gsub(%r{</?[^>]+?>}, '').gsub(/&nbsp;/,' ').truncate(420)
32
+ default_img_path = "#{root_url}images/fb_share.png"
33
+ part = post.parts.first
34
+ img_url = if part.content_type.video? && !part.videos.empty?
35
+ part.videos.first.thumb_url rescue default_img_path
36
+ else
37
+ uri = URI.parse(url)
38
+ !part.photos.empty? ? "#{uri.scheme}://#{uri.host}#{part.photos.first.image.url(:thumb)}" : default_img_path
39
+ end
40
+
41
+ resp = facebook.post("/me/feed", {
42
+ :message => msg,
43
+ :name => "#{Settings.app_name} - #{post.title.truncate(420)}",
44
+ :from => Settings.facebook.page_id, # Post as the page
45
+ :link => url,
46
+ :source => (!post.first_video.nil?) ? post.first_video.url : img_url,
47
+ :caption => body,
48
+ :description => Settings.app_name,
49
+ :picture => img_url,
50
+ :likes => true
51
+ })
52
+
53
+ # needs checking vs. returned facebook json object
54
+ if resp.keys.include?('id')
55
+ ids = resp["id"].split('_')
56
+ fbid = ids[0]
57
+ story_fbid = ids[1]
58
+ post.update_facebook_id(fbid.to_i)
59
+ end
60
+
61
+ end
62
+
63
+ protected
64
+
65
+ # Return a facebook client object
66
+ def facebook
67
+ MiniFB.disable_logging
68
+ @facebook ||= MiniFB::OAuthSession.new(Settings.facebook.page_token)
69
+ end
70
+
71
+ include Atreides::Extendable
72
+ end
@@ -0,0 +1,19 @@
1
+ # Provides access to configuration options stored in _config/settings.yml_
2
+ class Settings < Settingslogic
3
+ source "#{Rails.root}/config/settings.yml"
4
+ namespace Rails.env
5
+
6
+ # Check if we can use an Amazon S3 bucket to store photos
7
+ # @return true if the S3 gem and configuration is present, false otherwise
8
+ def s3_enabled?
9
+ !!(s3.access_key_id.present? && s3.secret_access_key.present? if respond_to? :s3)
10
+ end
11
+
12
+ def default_cross_post_to? service
13
+ setting = Settings.default_cross_posts && Settings.default_cross_posts[service] # by default, if nothing specified in Settings.yml
14
+ return true if setting.nil?
15
+ setting
16
+ end
17
+
18
+ include Atreides::Extendable
19
+ end
@@ -0,0 +1,75 @@
1
+ # Class to aid in the publishing of posts to Tumblr.
2
+ # This is typically used with Delayed Job in a background process
3
+ # Eg:
4
+ # Delayed::Job.enqueue(TumblrPostPublisherJob.new(post.id))
5
+ #
6
+ #
7
+ # It requires that there is a 'tumblr' section in your settings.yml config file
8
+ #
9
+ TumblrPostPublisherJob = Struct.new(:post_id)
10
+ class TumblrPostPublisherJob
11
+
12
+ require 'tumblr'
13
+
14
+ include Rails.application.routes.url_helpers
15
+ default_url_options[:host] = Settings.domain
16
+
17
+ # Executes the job. This authorizes the client with Tumblr using settings.yml configuration
18
+ # It will update the post object with the posts tumblr_id on success
19
+ # @return [Int] the tumblr id of the newly created post
20
+ def perform
21
+
22
+ return false unless Settings.has_key?('tumblr')
23
+
24
+ # Find objects
25
+ post = Atreides::Post.find(post_id)
26
+
27
+ # Abort if already posted
28
+ return if post.tumblr_id?
29
+
30
+ # Common part
31
+ tumblr = {
32
+ :slug => post.slug
33
+ }
34
+
35
+ add_link_for_more = false
36
+ part = posts.first
37
+
38
+ case part.content_type
39
+ when "text"
40
+ tumblr.merge!({
41
+ :type => "regular",
42
+ :title => part.title,
43
+ :body => part.body
44
+ })
45
+ when "videos"
46
+ tumblr.merge!({
47
+ :type => "video",
48
+ :embed => part.videos.first.url,
49
+ :caption => part.videos.first.caption
50
+ })
51
+ add_link_for_more = (part.videos.count > 1)
52
+ when "photos"
53
+ tumblr.merge!({
54
+ :type => "photo",
55
+ :source => part.photos.first.image.url,
56
+ :caption => part.photos.first.caption
57
+ })
58
+ add_link_for_more = (part.photos.count > 1)
59
+ end
60
+
61
+ link = post_url(post, :slug => post.slug)
62
+
63
+ tumblr[:caption] += "<br />View more <a href='#{link}'>here</a>" if add_link_for_more
64
+
65
+ # Authentication
66
+ user = Tumblr::User.new(Settings.tumblr.email, Settings.tumblr.pass, false)
67
+
68
+ tumblr_id = Tumblr::Post.create(user, tumblr)
69
+
70
+ # Tumblr it!
71
+ post.update_tumblr_id(tumblr_id)
72
+ end
73
+
74
+ include Atreides::Extendable
75
+ end
@@ -0,0 +1,54 @@
1
+ # Class to aid in the publishing of posts to Twitter.
2
+ # This is typically used with Delayed Job in a background process
3
+ # Eg:
4
+ # Delayed::Job.enqueue(TwCommentPublisherJob.new(post.id, url))
5
+ #
6
+ # It requires that there is a 'twitter' section in your settings.yml config file
7
+ #
8
+ TwPostPublisherJob = Struct.new(:post_id)
9
+ class TwPostPublisherJob
10
+
11
+ return false unless Settings.has_key?('twitter')
12
+
13
+ require 'yaml'
14
+ require 'bitly' unless defined? Bitly
15
+ require 'twitter' unless defined? Twitter
16
+
17
+ include Rails.application.routes.url_helpers
18
+ default_url_options[:host] = Settings.domain
19
+
20
+ # Executes the job. This authorizes the client with Twitter using settings.yml configuration
21
+ # It will update the post object with the posts twitter_id on success
22
+ # @return [Int] the twitter id of the newly created post
23
+ def perform
24
+
25
+ # Find objects
26
+ post = Atreides::Post.find(post_id)
27
+
28
+ # Abort if already posted
29
+ return if post.twitter_id?
30
+
31
+ # Auth user
32
+ Twitter.configure do |config|
33
+ config.consumer_key = Settings.twitter.consumer_key
34
+ config.consumer_secret = Settings.twitter.consumer_secret
35
+ config.oauth_token = Settings.twitter.app_user_token
36
+ config.oauth_token_secret = Settings.twitter.app_user_secret
37
+ end
38
+
39
+ # Shorten URL - take this out for now as not clear enough
40
+ bitly = Bitly.new(Settings.bitly.login, Settings.bitly.key)
41
+ url = post_url(:id => post.to_param, :slug => post.slug.to_s)
42
+ short_url = bitly.shorten(url.to_s).short_url rescue url
43
+
44
+ # Build message
45
+ body = !post.social_msg.blank? ? post.social_msg : post.title.truncate(160 - 1 - short_url.size)
46
+ msg = "New Post! #{body} #{short_url}"
47
+
48
+ # Tweet!
49
+ tweet = Twitter.update(msg)
50
+ post.update_twitter_id(tweet.id)
51
+ end
52
+
53
+ include Atreides::Extendable
54
+ end