community_engine 2.0.0.beta1

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 (737) hide show
  1. data/.gitignore +15 -0
  2. data/.gitmodules +0 -0
  3. data/.travis.yml +9 -0
  4. data/CHANGELOG +118 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +30 -0
  7. data/README.markdown +188 -0
  8. data/Rakefile +54 -0
  9. data/UPGRADING.markdown +93 -0
  10. data/about.yml +7 -0
  11. data/app/assets/images/auth/facebook_32.png +0 -0
  12. data/app/assets/images/auth/facebook_64.png +0 -0
  13. data/app/assets/images/auth/google_32.png +0 -0
  14. data/app/assets/images/auth/google_64.png +0 -0
  15. data/app/assets/images/auth/linked_in_32.png +0 -0
  16. data/app/assets/images/auth/linked_in_64.png +0 -0
  17. data/app/assets/images/auth/open_id_32.png +0 -0
  18. data/app/assets/images/auth/remove.png +0 -0
  19. data/app/assets/images/auth/twitter_32.png +0 -0
  20. data/app/assets/images/auth/twitter_64.png +0 -0
  21. data/app/assets/images/bg_h6btn.gif +0 -0
  22. data/app/assets/images/bg_navbar.gif +0 -0
  23. data/app/assets/images/clearbits/bg_rounded.gif +0 -0
  24. data/app/assets/images/clearbits/comment.gif +0 -0
  25. data/app/assets/images/clearbits/lock.gif +0 -0
  26. data/app/assets/images/clearbits/smile.gif +0 -0
  27. data/app/assets/images/close.gif +0 -0
  28. data/app/assets/images/cropper/marqueeHoriz.gif +0 -0
  29. data/app/assets/images/cropper/marqueeVert.gif +0 -0
  30. data/app/assets/images/feed.png +0 -0
  31. data/app/assets/images/icon_missing_medium.gif +0 -0
  32. data/app/assets/images/icon_missing_thumb.gif +0 -0
  33. data/app/assets/images/icons/31.png +0 -0
  34. data/app/assets/images/icons/52.png +0 -0
  35. data/app/assets/images/icons/accept.png +0 -0
  36. data/app/assets/images/icons/activity_default.png +0 -0
  37. data/app/assets/images/icons/add.png +0 -0
  38. data/app/assets/images/icons/book.png +0 -0
  39. data/app/assets/images/icons/bullet_arrow_down.png +0 -0
  40. data/app/assets/images/icons/bullet_arrow_down_50.png +0 -0
  41. data/app/assets/images/icons/clipping.png +0 -0
  42. data/app/assets/images/icons/comment.png +0 -0
  43. data/app/assets/images/icons/comments.png +0 -0
  44. data/app/assets/images/icons/date.png +0 -0
  45. data/app/assets/images/icons/delete.png +0 -0
  46. data/app/assets/images/icons/email.png +0 -0
  47. data/app/assets/images/icons/email_edit.png +0 -0
  48. data/app/assets/images/icons/email_go.png +0 -0
  49. data/app/assets/images/icons/email_open.png +0 -0
  50. data/app/assets/images/icons/group_go.png +0 -0
  51. data/app/assets/images/icons/heart.png +0 -0
  52. data/app/assets/images/icons/heart_add.png +0 -0
  53. data/app/assets/images/icons/heart_off.png +0 -0
  54. data/app/assets/images/icons/ical.gif +0 -0
  55. data/app/assets/images/icons/page_white.png +0 -0
  56. data/app/assets/images/icons/page_white_magnify.png +0 -0
  57. data/app/assets/images/icons/picture.png +0 -0
  58. data/app/assets/images/icons/poll.png +0 -0
  59. data/app/assets/images/icons/post.png +0 -0
  60. data/app/assets/images/icons/printer.png +0 -0
  61. data/app/assets/images/icons/rss.png +0 -0
  62. data/app/assets/images/icons/slides.png +0 -0
  63. data/app/assets/images/icons/tag_blue.png +0 -0
  64. data/app/assets/images/icons/user.png +0 -0
  65. data/app/assets/images/icons/user_add.png +0 -0
  66. data/app/assets/images/icons/user_edit.png +0 -0
  67. data/app/assets/images/icons/user_go.png +0 -0
  68. data/app/assets/images/icons/vote.png +0 -0
  69. data/app/assets/images/icons/world.png +0 -0
  70. data/app/assets/images/icons/wrench.png +0 -0
  71. data/app/assets/images/logo.gif +0 -0
  72. data/app/assets/images/reply_background.png +0 -0
  73. data/app/assets/images/search.gif +0 -0
  74. data/app/assets/images/spinner.gif +0 -0
  75. data/app/assets/images/spinner_black.gif +0 -0
  76. data/app/assets/images/spinner_bounce.gif +0 -0
  77. data/app/assets/images/swf/choose.png +0 -0
  78. data/app/assets/images/swf/line_grapher.swf +0 -0
  79. data/app/assets/images/swf/swfupload.swf +0 -0
  80. data/app/assets/images/thumb.gif +0 -0
  81. data/app/assets/javascripts/builder.js +136 -0
  82. data/app/assets/javascripts/calendarview.js +839 -0
  83. data/app/assets/javascripts/community_engine.js +20 -0
  84. data/app/assets/javascripts/cropper.css +182 -0
  85. data/app/assets/javascripts/cropper.js +566 -0
  86. data/app/assets/javascripts/forum.js +73 -0
  87. data/app/assets/javascripts/lightbox.js +151 -0
  88. data/app/assets/javascripts/prototip-min.js +27 -0
  89. data/app/assets/javascripts/rails.js +202 -0
  90. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/css/advimage.css +84 -0
  91. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/editor_plugin.js +52 -0
  92. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/editor_plugin_src.js +45 -0
  93. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/image.htm +180 -0
  94. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/img/sample.gif +0 -0
  95. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/js/functions.js +508 -0
  96. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/langs/en.js +3 -0
  97. data/app/assets/javascripts/tinymce/plugins/curblyadvimage/langs/en_dlg.js +43 -0
  98. data/app/assets/stylesheets/community_engine.css +6 -0
  99. data/app/assets/stylesheets/forum.css +605 -0
  100. data/app/assets/stylesheets/lightbox.css +38 -0
  101. data/app/assets/stylesheets/prototip.css +73 -0
  102. data/app/assets/stylesheets/reset-fonts-grids.css +8 -0
  103. data/app/assets/stylesheets/screen.css +977 -0
  104. data/app/controllers/activities_controller.rb +38 -0
  105. data/app/controllers/admin_controller.rb +80 -0
  106. data/app/controllers/ads_controller.rb +85 -0
  107. data/app/controllers/albums_controller.rb +106 -0
  108. data/app/controllers/authorizations_controller.rb +41 -0
  109. data/app/controllers/base_controller.rb +151 -0
  110. data/app/controllers/categories_controller.rb +118 -0
  111. data/app/controllers/clippings_controller.rb +192 -0
  112. data/app/controllers/comment_sweeper.rb +35 -0
  113. data/app/controllers/comments_controller.rb +179 -0
  114. data/app/controllers/event_sweeper.rb +24 -0
  115. data/app/controllers/events_controller.rb +173 -0
  116. data/app/controllers/favorite_sweeper.rb +29 -0
  117. data/app/controllers/favorites_controller.rb +36 -0
  118. data/app/controllers/forums_controller.rb +71 -0
  119. data/app/controllers/friendships_controller.rb +126 -0
  120. data/app/controllers/homepage_features_controller.rb +68 -0
  121. data/app/controllers/invitations_controller.rb +46 -0
  122. data/app/controllers/messages_controller.rb +95 -0
  123. data/app/controllers/metro_areas_controller.rb +68 -0
  124. data/app/controllers/moderators_controller.rb +26 -0
  125. data/app/controllers/monitorships_controller.rb +20 -0
  126. data/app/controllers/page_sweeper.rb +33 -0
  127. data/app/controllers/pages_controller.rb +70 -0
  128. data/app/controllers/password_resets_controller.rb +52 -0
  129. data/app/controllers/photo_manager_controller.rb +11 -0
  130. data/app/controllers/photos_controller.rb +189 -0
  131. data/app/controllers/post_sweeper.rb +36 -0
  132. data/app/controllers/posts_controller.rb +252 -0
  133. data/app/controllers/rsvps_controller.rb +77 -0
  134. data/app/controllers/sb_posts_controller.rb +149 -0
  135. data/app/controllers/sessions_controller.rb +34 -0
  136. data/app/controllers/sitemap_controller.rb +21 -0
  137. data/app/controllers/statistics_controller.rb +34 -0
  138. data/app/controllers/taggable_sweeper.rb +38 -0
  139. data/app/controllers/tags_controller.rb +104 -0
  140. data/app/controllers/theme_controller.rb +60 -0
  141. data/app/controllers/topics_controller.rb +122 -0
  142. data/app/controllers/users_controller.rb +426 -0
  143. data/app/controllers/vote_sweeper.rb +16 -0
  144. data/app/controllers/votes_controller.rb +24 -0
  145. data/app/helpers/base_helper.rb +290 -0
  146. data/app/helpers/forums_helper.rb +31 -0
  147. data/app/helpers/friendships_helper.rb +16 -0
  148. data/app/helpers/monitorships_helper.rb +2 -0
  149. data/app/helpers/posts_helper.rb +17 -0
  150. data/app/helpers/sitemap_helper.rb +7 -0
  151. data/app/helpers/users_helper.rb +6 -0
  152. data/app/models/ad.rb +43 -0
  153. data/app/models/album.rb +12 -0
  154. data/app/models/asset.rb +3 -0
  155. data/app/models/authorization.rb +60 -0
  156. data/app/models/category.rb +20 -0
  157. data/app/models/choice.rb +13 -0
  158. data/app/models/clipping.rb +78 -0
  159. data/app/models/clipping_image.rb +9 -0
  160. data/app/models/comment.rb +122 -0
  161. data/app/models/country.rb +24 -0
  162. data/app/models/event.rb +61 -0
  163. data/app/models/facebook_profile.rb +32 -0
  164. data/app/models/facebook_publisher.rb +45 -0
  165. data/app/models/favorite.rb +47 -0
  166. data/app/models/forum.rb +22 -0
  167. data/app/models/friendship.rb +64 -0
  168. data/app/models/friendship_status.rb +3 -0
  169. data/app/models/homepage_feature.rb +15 -0
  170. data/app/models/invitation.rb +36 -0
  171. data/app/models/message.rb +84 -0
  172. data/app/models/message_thread.rb +33 -0
  173. data/app/models/metro_area.rb +16 -0
  174. data/app/models/moderatorship.rb +8 -0
  175. data/app/models/monitorship.rb +6 -0
  176. data/app/models/page.rb +8 -0
  177. data/app/models/photo.rb +83 -0
  178. data/app/models/poll.rb +39 -0
  179. data/app/models/post.rb +201 -0
  180. data/app/models/role.rb +5 -0
  181. data/app/models/rsvp.rb +24 -0
  182. data/app/models/sb_post.rb +67 -0
  183. data/app/models/state.rb +4 -0
  184. data/app/models/topic.rb +72 -0
  185. data/app/models/twitter_profile.rb +20 -0
  186. data/app/models/user.rb +483 -0
  187. data/app/models/user_notifier.rb +140 -0
  188. data/app/models/user_session.rb +14 -0
  189. data/app/models/vote.rb +19 -0
  190. data/app/views/activities/_activity.html.haml +56 -0
  191. data/app/views/activities/_icon.html.haml +14 -0
  192. data/app/views/activities/_unhandled_item.html.haml +1 -0
  193. data/app/views/activities/destroy.js.rjs +1 -0
  194. data/app/views/activities/index.html.haml +16 -0
  195. data/app/views/activities/network.html.haml +14 -0
  196. data/app/views/admin/comments.html.haml +71 -0
  197. data/app/views/admin/events.html.haml +33 -0
  198. data/app/views/admin/messages.html.haml +4 -0
  199. data/app/views/admin/users.html.haml +69 -0
  200. data/app/views/ads/edit.html.haml +46 -0
  201. data/app/views/ads/index.html.haml +43 -0
  202. data/app/views/ads/new.html.haml +44 -0
  203. data/app/views/ads/show.html.haml +36 -0
  204. data/app/views/albums/_form.html.haml +14 -0
  205. data/app/views/albums/edit.html.haml +16 -0
  206. data/app/views/albums/new.html.haml +15 -0
  207. data/app/views/albums/show.html.haml +32 -0
  208. data/app/views/base/_homepage_banner_message.html.haml +19 -0
  209. data/app/views/base/advertise.html.haml +8 -0
  210. data/app/views/base/plaxo.html.haml +5 -0
  211. data/app/views/base/site_index.html.haml +35 -0
  212. data/app/views/categories/_tips.html.haml +11 -0
  213. data/app/views/categories/edit.html.haml +34 -0
  214. data/app/views/categories/index.html.haml +30 -0
  215. data/app/views/categories/new.html.haml +9 -0
  216. data/app/views/categories/show.html.haml +45 -0
  217. data/app/views/clippings/_clipping.html.haml +18 -0
  218. data/app/views/clippings/_images.html.haml +3 -0
  219. data/app/views/clippings/_meta.html.haml +26 -0
  220. data/app/views/clippings/edit.html.haml +26 -0
  221. data/app/views/clippings/index.html.haml +35 -0
  222. data/app/views/clippings/load_images_from_uri.js.rjs +1 -0
  223. data/app/views/clippings/new.html.haml +29 -0
  224. data/app/views/clippings/new_clipping.html.haml +91 -0
  225. data/app/views/clippings/show.html.haml +56 -0
  226. data/app/views/clippings/site_index.html.haml +34 -0
  227. data/app/views/comments/_comment.html.haml +42 -0
  228. data/app/views/comments/_comment_form.html.haml +50 -0
  229. data/app/views/comments/_edit_form.html.haml +29 -0
  230. data/app/views/comments/create.js.rjs +20 -0
  231. data/app/views/comments/edit.js.rjs +7 -0
  232. data/app/views/comments/index.html.haml +23 -0
  233. data/app/views/comments/update.js.rjs +9 -0
  234. data/app/views/events/_event.html.haml +32 -0
  235. data/app/views/events/_subscribe.html.haml +7 -0
  236. data/app/views/events/edit.html.haml +34 -0
  237. data/app/views/events/index.html.haml +22 -0
  238. data/app/views/events/new.html.haml +32 -0
  239. data/app/views/events/show.html.haml +29 -0
  240. data/app/views/facebook/_fb_require.html.haml +11 -0
  241. data/app/views/favorites/_favorite.html.haml +5 -0
  242. data/app/views/favorites/create.js.rjs +17 -0
  243. data/app/views/favorites/destroy.js.rjs +14 -0
  244. data/app/views/favorites/index.html.haml +10 -0
  245. data/app/views/favorites/show.html.haml +13 -0
  246. data/app/views/forums/_form.html.haml +21 -0
  247. data/app/views/forums/edit.html.haml +11 -0
  248. data/app/views/forums/index.html.haml +70 -0
  249. data/app/views/forums/new.html.haml +9 -0
  250. data/app/views/forums/show.html.haml +85 -0
  251. data/app/views/friendships/_friendship.html.haml +16 -0
  252. data/app/views/friendships/_friendships.html.erb +14 -0
  253. data/app/views/friendships/accepted.html.haml +13 -0
  254. data/app/views/friendships/denied.html.haml +8 -0
  255. data/app/views/friendships/index.html.erb +3 -0
  256. data/app/views/friendships/index.xml.builder +29 -0
  257. data/app/views/friendships/pending.html.haml +7 -0
  258. data/app/views/friendships/show.html.haml +12 -0
  259. data/app/views/homepage_features/edit.html.haml +31 -0
  260. data/app/views/homepage_features/index.html.haml +30 -0
  261. data/app/views/homepage_features/new.html.haml +30 -0
  262. data/app/views/homepage_features/show.html.haml +29 -0
  263. data/app/views/invitations/index.html.erb +16 -0
  264. data/app/views/invitations/new.html.haml +33 -0
  265. data/app/views/layouts/application.html.haml +59 -0
  266. data/app/views/messages/_form.html.haml +24 -0
  267. data/app/views/messages/_inbox.html.haml +41 -0
  268. data/app/views/messages/_sent.html.haml +34 -0
  269. data/app/views/messages/_sidebar_nav.html.haml +9 -0
  270. data/app/views/messages/index.html.haml +8 -0
  271. data/app/views/messages/new.html.haml +10 -0
  272. data/app/views/messages/show.html.haml +40 -0
  273. data/app/views/metro_areas/edit.html.haml +16 -0
  274. data/app/views/metro_areas/index.html.haml +28 -0
  275. data/app/views/metro_areas/new.html.haml +16 -0
  276. data/app/views/metro_areas/show.html.haml +22 -0
  277. data/app/views/moderators/_toggle.html.erb +14 -0
  278. data/app/views/moderators/create.js.rjs +5 -0
  279. data/app/views/moderators/destroy.js.rjs +1 -0
  280. data/app/views/monitorships/create.js.rjs +4 -0
  281. data/app/views/monitorships/destroy.js.rjs +4 -0
  282. data/app/views/pages/_form.html.haml +25 -0
  283. data/app/views/pages/edit.html.haml +16 -0
  284. data/app/views/pages/edit.html.haml~ +16 -0
  285. data/app/views/pages/index.html.haml +34 -0
  286. data/app/views/pages/index.html.haml~ +28 -0
  287. data/app/views/pages/new.html.haml +14 -0
  288. data/app/views/pages/show.html.haml +8 -0
  289. data/app/views/pages/show.html.haml~ +6 -0
  290. data/app/views/password_resets/edit.html.haml +16 -0
  291. data/app/views/password_resets/new.html.haml +13 -0
  292. data/app/views/photo_manager/index.html.haml +49 -0
  293. data/app/views/photos/_manage_photos.html.haml +14 -0
  294. data/app/views/photos/_show_image_list.html.haml +24 -0
  295. data/app/views/photos/edit.html.haml +39 -0
  296. data/app/views/photos/index.html.haml +28 -0
  297. data/app/views/photos/index.xml.builder +9 -0
  298. data/app/views/photos/manage_photos.js.rjs +5 -0
  299. data/app/views/photos/new.html.haml +51 -0
  300. data/app/views/photos/recent.html.haml +8 -0
  301. data/app/views/photos/show.html.haml +53 -0
  302. data/app/views/polls/_edit.html.haml +15 -0
  303. data/app/views/polls/_excerpt.html.haml +4 -0
  304. data/app/views/polls/_new.html.haml +10 -0
  305. data/app/views/polls/_poll_ui.html.haml +37 -0
  306. data/app/views/polls/_polls_sidebar.html.haml +8 -0
  307. data/app/views/posts/_author_profile.html.haml +21 -0
  308. data/app/views/posts/_favorited_post.html.haml +10 -0
  309. data/app/views/posts/_post.html.haml +29 -0
  310. data/app/views/posts/_send_to_friend.html.erb +29 -0
  311. data/app/views/posts/_sidebar_post.html.haml +1 -0
  312. data/app/views/posts/edit.html.haml +48 -0
  313. data/app/views/posts/featured.html.haml +19 -0
  314. data/app/views/posts/index.html.haml +23 -0
  315. data/app/views/posts/manage.html.haml +66 -0
  316. data/app/views/posts/new.html.haml +67 -0
  317. data/app/views/posts/popular.html.haml +35 -0
  318. data/app/views/posts/preview.html.haml +27 -0
  319. data/app/views/posts/recent.html.haml +29 -0
  320. data/app/views/posts/show.html.haml +85 -0
  321. data/app/views/rsvps/edit.html.haml +9 -0
  322. data/app/views/rsvps/new.html.haml +9 -0
  323. data/app/views/sb_posts/_dummy_forum_post.html.erb +13 -0
  324. data/app/views/sb_posts/_edit.html.erb +31 -0
  325. data/app/views/sb_posts/_post.xml.builder +10 -0
  326. data/app/views/sb_posts/_reply_form.html.haml +37 -0
  327. data/app/views/sb_posts/_sb_post.html.haml +34 -0
  328. data/app/views/sb_posts/create.js.rjs +16 -0
  329. data/app/views/sb_posts/edit.html.erb +13 -0
  330. data/app/views/sb_posts/edit.js.rjs +6 -0
  331. data/app/views/sb_posts/index.html.haml +55 -0
  332. data/app/views/sb_posts/index.xml.builder +20 -0
  333. data/app/views/sb_posts/monitored.html.erb +55 -0
  334. data/app/views/sb_posts/monitored.xml.builder +15 -0
  335. data/app/views/sb_posts/update.js.rjs +5 -0
  336. data/app/views/sessions/new.html.haml +27 -0
  337. data/app/views/shared/_admin_nav.html.haml +19 -0
  338. data/app/views/shared/_bio_help.html.haml +4 -0
  339. data/app/views/shared/_box.html.haml +3 -0
  340. data/app/views/shared/_contact.html.haml +5 -0
  341. data/app/views/shared/_explore.html.haml +9 -0
  342. data/app/views/shared/_footer_content.html.haml +13 -0
  343. data/app/views/shared/_header.html.haml +42 -0
  344. data/app/views/shared/_location_chooser.html.haml +21 -0
  345. data/app/views/shared/_login_sidebar.html.haml +14 -0
  346. data/app/views/shared/_messages.html.haml +8 -0
  347. data/app/views/shared/_scripts_and_styles.html.haml +12 -0
  348. data/app/views/shared/_user_menu.html.haml +21 -0
  349. data/app/views/sitemap/index.html.haml +21 -0
  350. data/app/views/sitemap/index.xml.builder +28 -0
  351. data/app/views/statistics/activities.xml.builder +33 -0
  352. data/app/views/statistics/index.html.haml +56 -0
  353. data/app/views/tags/edit.html.haml +19 -0
  354. data/app/views/tags/index.html.haml +25 -0
  355. data/app/views/tags/manage.html.haml +37 -0
  356. data/app/views/tags/show.html.haml +65 -0
  357. data/app/views/topics/_form.html.haml +28 -0
  358. data/app/views/topics/_recent_topics_sidebar.haml +22 -0
  359. data/app/views/topics/edit.html.haml +10 -0
  360. data/app/views/topics/new.html.haml +21 -0
  361. data/app/views/topics/show.html.haml +107 -0
  362. data/app/views/topics/show.xml.builder +15 -0
  363. data/app/views/user_notifier/activation.text.erb +11 -0
  364. data/app/views/user_notifier/comment_notice.text.erb +8 -0
  365. data/app/views/user_notifier/follow_up_comment_notice.text.erb +15 -0
  366. data/app/views/user_notifier/follow_up_comment_notice_anonymous.text.erb +18 -0
  367. data/app/views/user_notifier/forgot_username.text.erb +8 -0
  368. data/app/views/user_notifier/friendship_accepted.text.erb +8 -0
  369. data/app/views/user_notifier/friendship_request.text.erb +8 -0
  370. data/app/views/user_notifier/message_notification.text.erb +14 -0
  371. data/app/views/user_notifier/new_forum_post_notice.text.erb +14 -0
  372. data/app/views/user_notifier/password_reset_instructions.text.erb +10 -0
  373. data/app/views/user_notifier/post_recommendation.text.erb +32 -0
  374. data/app/views/user_notifier/signup_invitation.text.erb +14 -0
  375. data/app/views/user_notifier/signup_notification.text.erb +16 -0
  376. data/app/views/users/_dashboard_nav.html.haml +40 -0
  377. data/app/views/users/_omniauth_connect.html.haml +21 -0
  378. data/app/views/users/_profile_completeness.html.haml +21 -0
  379. data/app/views/users/_profile_user_info_sidebar.html.haml +50 -0
  380. data/app/views/users/_search_options.html.haml +10 -0
  381. data/app/views/users/_sidebar_user.html.haml +8 -0
  382. data/app/views/users/_user.html.haml +31 -0
  383. data/app/views/users/crop_profile_photo.html.haml +40 -0
  384. data/app/views/users/dashboard.html.haml +44 -0
  385. data/app/views/users/edit.html.haml +75 -0
  386. data/app/views/users/edit_account.html.haml +64 -0
  387. data/app/views/users/forgot_username.html.haml +13 -0
  388. data/app/views/users/index.html.haml +18 -0
  389. data/app/views/users/invite.html.haml +31 -0
  390. data/app/views/users/new.html.haml +54 -0
  391. data/app/views/users/resend_activation.html.haml +13 -0
  392. data/app/views/users/show.html.haml +103 -0
  393. data/app/views/users/signup_completed.html.haml +8 -0
  394. data/app/views/users/statistics.html.haml +28 -0
  395. data/app/views/users/upload_profile_photo.html.haml +15 -0
  396. data/app/views/users/welcome_about.html.haml +66 -0
  397. data/app/views/users/welcome_invite.html.haml +33 -0
  398. data/app/views/users/welcome_photo.html.haml +29 -0
  399. data/app/views/votes/create.js.rjs +6 -0
  400. data/community_engine.gemspec +55 -0
  401. data/config/application_config.rb +162 -0
  402. data/config/initializers/cropper.rb +19 -0
  403. data/config/initializers/mce_options.rb +40 -0
  404. data/config/initializers/recaptcha_constants.rb +6 -0
  405. data/config/initializers/white_list.rb +7 -0
  406. data/config/locales/de-DE.yml +1271 -0
  407. data/config/locales/en.yml +1658 -0
  408. data/config/locales/es-AR.yml +758 -0
  409. data/config/locales/es-ES.yml +340 -0
  410. data/config/locales/es-MX.yml +672 -0
  411. data/config/locales/fr-FR.yml +1509 -0
  412. data/config/locales/ja-JP.yml +1321 -0
  413. data/config/locales/ru-RU.yml +97 -0
  414. data/config/locales/sr-CP.yml +89 -0
  415. data/config/locales/sv-SE.yml +1320 -0
  416. data/config/routes.rb +242 -0
  417. data/db/migrate/001_create_users.rb +26 -0
  418. data/db/migrate/002_add_activation_code_to_user.rb +11 -0
  419. data/db/migrate/003_create_photos.rb +22 -0
  420. data/db/migrate/004_add_tag_support.rb +21 -0
  421. data/db/migrate/005_create_friendships.rb +14 -0
  422. data/db/migrate/006_add_comments_tables.rb +18 -0
  423. data/db/migrate/007_create_friendship_statuses.rb +13 -0
  424. data/db/migrate/008_add_friendship_statuses.rb +14 -0
  425. data/db/migrate/009_create_clippings.rb +16 -0
  426. data/db/migrate/010_create_invitations.rb +14 -0
  427. data/db/migrate/011_create_homepage_features.rb +22 -0
  428. data/db/migrate/012_create_posts.rb +19 -0
  429. data/db/migrate/013_create_states.rb +13 -0
  430. data/db/migrate/014_add_states.rb +11 -0
  431. data/db/migrate/015_create_metro_areas.rb +15 -0
  432. data/db/migrate/016_add_metro_areas.rb +295 -0
  433. data/db/migrate/017_add_sessions_table.rb +20 -0
  434. data/db/migrate/018_create_categories.rb +11 -0
  435. data/db/migrate/019_change_comment_to_text_field.rb +10 -0
  436. data/db/migrate/020_create_login_slug.rb +9 -0
  437. data/db/migrate/021_add_category_names.rb +8 -0
  438. data/db/migrate/023_add_denied_friendship_status.rb +13 -0
  439. data/db/migrate/024_add_notification_preferences.rb +13 -0
  440. data/db/migrate/025_create_countries.rb +11 -0
  441. data/db/migrate/026_add_countries.rb +230 -0
  442. data/db/migrate/027_add_us_to_existing_metro_areas.rb +9 -0
  443. data/db/migrate/028_add_country_id_to_users.rb +9 -0
  444. data/db/migrate/029_add_us_to_users_with_states.rb +14 -0
  445. data/db/migrate/030_add_users_counter_cache.rb +9 -0
  446. data/db/migrate/031_news_to_talk.rb +10 -0
  447. data/db/migrate/033_featured_users.rb +9 -0
  448. data/db/migrate/034_add_last_login.rb +9 -0
  449. data/db/migrate/035_track_emailed.rb +9 -0
  450. data/db/migrate/036_create_skills.rb +11 -0
  451. data/db/migrate/037_create_offerings.rb +12 -0
  452. data/db/migrate/038_add_zag_to_users.rb +13 -0
  453. data/db/migrate/039_create_activities_table.rb +17 -0
  454. data/db/migrate/040_add_category_tips.rb +9 -0
  455. data/db/migrate/041_create_events_table.rb +19 -0
  456. data/db/migrate/042_add_privacy_to_users.rb +10 -0
  457. data/db/migrate/043_sql_session_store_setup.rb +39 -0
  458. data/db/migrate/044_category_improvements.rb +11 -0
  459. data/db/migrate/045_adding_indexes.rb +39 -0
  460. data/db/migrate/046_adding_ads.rb +20 -0
  461. data/db/migrate/047_add_polls.rb +30 -0
  462. data/db/migrate/049_add_activities_count.rb +9 -0
  463. data/db/migrate/050_create_initial_schema.rb +73 -0
  464. data/db/migrate/051_add_audience_limitation_to_ads.rb +9 -0
  465. data/db/migrate/052_create_assets.rb +21 -0
  466. data/db/migrate/053_create_favoritables.rb +23 -0
  467. data/db/migrate/054_add_published_as_to_posts.rb +13 -0
  468. data/db/migrate/055_add_published_at_to_posts.rb +15 -0
  469. data/db/migrate/056_create_roles.rb +28 -0
  470. data/db/migrate/057_add_more_indexes.rb +19 -0
  471. data/db/migrate/058_add_anonymous_commenting_fields.rb +15 -0
  472. data/db/migrate/059_create_messages.rb +16 -0
  473. data/db/migrate/060_still_more_indexes.rb +19 -0
  474. data/db/migrate/061_postgres_compatibility_changes.rb +9 -0
  475. data/db/migrate/062_add_notify_to_comments.rb +11 -0
  476. data/db/migrate/063_create_albums.rb +15 -0
  477. data/db/migrate/064_add_album_id_to_photos.rb +9 -0
  478. data/db/migrate/065_add_view_count_to_albums.rb +9 -0
  479. data/db/migrate/066_add_view_count_to_photos.rb +9 -0
  480. data/db/migrate/067_create_static_pages.rb +22 -0
  481. data/db/migrate/068_create_rsvps.rb +13 -0
  482. data/db/migrate/069_create_pages.rb +29 -0
  483. data/db/migrate/070_add_pages.rb +11 -0
  484. data/db/migrate/071_authlogic_compatibility_changes.rb +43 -0
  485. data/db/migrate/072_add_allow_rsvp_to_events.rb +9 -0
  486. data/db/migrate/073_add_taggings_count_to_tags.rb +9 -0
  487. data/db/migrate/074_add_threading_to_messages.rb +19 -0
  488. data/db/migrate/075_add_anonymous_forum_posting.rb +16 -0
  489. data/db/migrate/076_add_comment_notification_toggle.rb +9 -0
  490. data/db/migrate/077_paperclip_changes.rb +36 -0
  491. data/db/migrate/078_create_authorizations.rb +20 -0
  492. data/db/migrate/079_create_slugs.rb +18 -0
  493. data/db/sample/users.rb +55 -0
  494. data/generators/ce_plugin/USAGE +7 -0
  495. data/generators/ce_plugin/ce_plugin_generator.rb +25 -0
  496. data/generators/ce_plugin/templates/README +13 -0
  497. data/generators/ce_plugin/templates/desert_routes.rb +3 -0
  498. data/generators/ce_plugin/templates/init.rb +8 -0
  499. data/generators/ce_plugin/templates/plugin.rb +1 -0
  500. data/generators/plugin_migration/plugin_migration_generator.rb +101 -0
  501. data/generators/plugin_migration/templates/plugin_migration.erb +13 -0
  502. data/lang/TRANSLATION.markdown +32 -0
  503. data/lib/community_engine/authenticated_system.rb +167 -0
  504. data/lib/community_engine/authenticated_test_helper.rb +113 -0
  505. data/lib/community_engine/community_engine_sha1_crypto_method.rb +12 -0
  506. data/lib/community_engine/engine.rb +39 -0
  507. data/lib/community_engine/engines_extensions.rb +7 -0
  508. data/lib/community_engine/i18n_extensions.rb +31 -0
  509. data/lib/community_engine/localized_application.rb +83 -0
  510. data/lib/community_engine/rails_asset_extensions.rb +131 -0
  511. data/lib/community_engine/url_upload.rb +15 -0
  512. data/lib/community_engine/version.rb +10 -0
  513. data/lib/community_engine/viewable.rb +12 -0
  514. data/lib/community_engine.rb +34 -0
  515. data/lib/tag_hacks.rb +24 -0
  516. data/lib/tasks/community_engine_tasks.rake +87 -0
  517. data/public/favicon.ico +0 -0
  518. data/sample_files/s3.yml +17 -0
  519. data/test/fixtures/ads.yml +13 -0
  520. data/test/fixtures/albums.yml +16 -0
  521. data/test/fixtures/categories.yml +16 -0
  522. data/test/fixtures/clippings.yml +15 -0
  523. data/test/fixtures/comments.yml +55 -0
  524. data/test/fixtures/countries.yml +13 -0
  525. data/test/fixtures/events.yml +61 -0
  526. data/test/fixtures/files/Granite.bmp +0 -0
  527. data/test/fixtures/files/library.jpg +0 -0
  528. data/test/fixtures/forums.yml +10 -0
  529. data/test/fixtures/friendship_statuses.yml +10 -0
  530. data/test/fixtures/friendships.yml +15 -0
  531. data/test/fixtures/homepage_features.yml +13 -0
  532. data/test/fixtures/invitations.yml +5 -0
  533. data/test/fixtures/messages.yml +24 -0
  534. data/test/fixtures/metro_areas.yml +24 -0
  535. data/test/fixtures/moderatorships.yml +4 -0
  536. data/test/fixtures/monitorships.yml +10 -0
  537. data/test/fixtures/pages.yml +26 -0
  538. data/test/fixtures/photos.yml +29 -0
  539. data/test/fixtures/posts.yml +49 -0
  540. data/test/fixtures/roles.yml +9 -0
  541. data/test/fixtures/rsvps.yml +7 -0
  542. data/test/fixtures/sb_posts.yml +90 -0
  543. data/test/fixtures/states.yml +7 -0
  544. data/test/fixtures/taggings.yml +15 -0
  545. data/test/fixtures/tags.yml +11 -0
  546. data/test/fixtures/topics.yml +63 -0
  547. data/test/fixtures/users.yml +222 -0
  548. data/test/functional/activities_controller_test.rb +62 -0
  549. data/test/functional/admin_controller_test.rb +60 -0
  550. data/test/functional/ads_controller_test.rb +51 -0
  551. data/test/functional/albums_controller_test.rb +120 -0
  552. data/test/functional/base_controller_test.rb +27 -0
  553. data/test/functional/categories_controller_test.rb +51 -0
  554. data/test/functional/clippings_controller_test.rb +123 -0
  555. data/test/functional/comments_controller_test.rb +215 -0
  556. data/test/functional/events_controller_test.rb +104 -0
  557. data/test/functional/favorites_controller_test.rb +53 -0
  558. data/test/functional/forums_controller_test.rb +95 -0
  559. data/test/functional/friendships_controller_test.rb +98 -0
  560. data/test/functional/homepage_features_controller_test.rb +69 -0
  561. data/test/functional/invitations_controller_test.rb +45 -0
  562. data/test/functional/messages_controller_test.rb +154 -0
  563. data/test/functional/metro_areas_controller_test.rb +63 -0
  564. data/test/functional/moderators_controller_test.rb +22 -0
  565. data/test/functional/monitorships_controller_test.rb +72 -0
  566. data/test/functional/pages_controller_test.rb +95 -0
  567. data/test/functional/password_reset_controller_test.rb +34 -0
  568. data/test/functional/photo_manager_controller_test.rb +21 -0
  569. data/test/functional/photos_controller_test.rb +203 -0
  570. data/test/functional/posts_controller_test.rb +224 -0
  571. data/test/functional/rsvps_controller_test.rb +92 -0
  572. data/test/functional/sb_posts_controller_test.rb +193 -0
  573. data/test/functional/sessions_controller_test.rb +55 -0
  574. data/test/functional/sitemap_controller_test.rb +9 -0
  575. data/test/functional/statistics_controller_test.rb +18 -0
  576. data/test/functional/tags_controller_test.rb +52 -0
  577. data/test/functional/theme_controller_test.rb +11 -0
  578. data/test/functional/topics_controller_test.rb +201 -0
  579. data/test/functional/users_controller_test.rb +460 -0
  580. data/test/functional/votes_controller_test.rb +27 -0
  581. data/test/test_helper.rb +103 -0
  582. data/test/testapp/.gitignore +4 -0
  583. data/test/testapp/README +256 -0
  584. data/test/testapp/Rakefile +7 -0
  585. data/test/testapp/app/controllers/application_controller.rb +3 -0
  586. data/test/testapp/app/helpers/application_helper.rb +2 -0
  587. data/test/testapp/config/application.rb +45 -0
  588. data/test/testapp/config/application_config.rb +1 -0
  589. data/test/testapp/config/boot.rb +10 -0
  590. data/test/testapp/config/database.yml +22 -0
  591. data/test/testapp/config/environment.rb +6 -0
  592. data/test/testapp/config/environments/development.rb +25 -0
  593. data/test/testapp/config/environments/production.rb +49 -0
  594. data/test/testapp/config/environments/test.rb +35 -0
  595. data/test/testapp/config/initializers/backtrace_silencers.rb +7 -0
  596. data/test/testapp/config/initializers/inflections.rb +10 -0
  597. data/test/testapp/config/initializers/mime_types.rb +5 -0
  598. data/test/testapp/config/initializers/secret_token.rb +7 -0
  599. data/test/testapp/config/initializers/session_store.rb +8 -0
  600. data/test/testapp/config/locales/en.yml +5 -0
  601. data/test/testapp/config/routes.rb +3 -0
  602. data/test/testapp/config.ru +4 -0
  603. data/test/testapp/db/schema.rb +456 -0
  604. data/test/testapp/db/seeds.rb +7 -0
  605. data/test/testapp/doc/README_FOR_APP +2 -0
  606. data/test/testapp/lib/tasks/.gitkeep +0 -0
  607. data/test/testapp/public/404.html +26 -0
  608. data/test/testapp/public/422.html +26 -0
  609. data/test/testapp/public/500.html +26 -0
  610. data/test/testapp/public/favicon.ico +0 -0
  611. data/test/testapp/public/images/rails.png +0 -0
  612. data/test/testapp/public/robots.txt +5 -0
  613. data/test/testapp/script/rails +6 -0
  614. data/test/testapp/test/performance/browsing_test.rb +9 -0
  615. data/test/testapp/test/test_helper.rb +13 -0
  616. data/test/testapp/vendor/plugins/.gitkeep +0 -0
  617. data/test/unit/ad_test.rb +34 -0
  618. data/test/unit/asset_test.rb +15 -0
  619. data/test/unit/authorization_test.rb +55 -0
  620. data/test/unit/category_test.rb +22 -0
  621. data/test/unit/choice_test.rb +9 -0
  622. data/test/unit/clipping_image_test.rb +17 -0
  623. data/test/unit/clipping_test.rb +52 -0
  624. data/test/unit/comment_test.rb +107 -0
  625. data/test/unit/country_test.rb +15 -0
  626. data/test/unit/event_test.rb +75 -0
  627. data/test/unit/favorite_test.rb +71 -0
  628. data/test/unit/forum_test.rb +23 -0
  629. data/test/unit/friendship_status_test.rb +10 -0
  630. data/test/unit/friendship_test.rb +38 -0
  631. data/test/unit/homepage_feature_test.rb +10 -0
  632. data/test/unit/invitation_test.rb +27 -0
  633. data/test/unit/message_test.rb +49 -0
  634. data/test/unit/message_thread_test.rb +80 -0
  635. data/test/unit/metro_area_test.rb +10 -0
  636. data/test/unit/moderatorship_test.rb +30 -0
  637. data/test/unit/monitorships_test.rb +38 -0
  638. data/test/unit/page_test.rb +25 -0
  639. data/test/unit/photo_test.rb +42 -0
  640. data/test/unit/poll_test.rb +25 -0
  641. data/test/unit/post_test.rb +212 -0
  642. data/test/unit/rsvp_test.rb +33 -0
  643. data/test/unit/sb_post_test.rb +152 -0
  644. data/test/unit/state_test.rb +10 -0
  645. data/test/unit/tag_test.rb +22 -0
  646. data/test/unit/topic_test.rb +111 -0
  647. data/test/unit/user_notifier_test.rb +108 -0
  648. data/test/unit/user_test.rb +259 -0
  649. data/test/unit/vote_test.rb +9 -0
  650. data/vendor/plugins/activity_tracker/README +4 -0
  651. data/vendor/plugins/activity_tracker/Rakefile +22 -0
  652. data/vendor/plugins/activity_tracker/generators/activity_migration/USAGE +13 -0
  653. data/vendor/plugins/activity_tracker/generators/activity_migration/activity_migration_generator.rb +11 -0
  654. data/vendor/plugins/activity_tracker/generators/activity_migration/templates/migration.rb +17 -0
  655. data/vendor/plugins/activity_tracker/init.rb +1 -0
  656. data/vendor/plugins/activity_tracker/install.rb +1 -0
  657. data/vendor/plugins/activity_tracker/lib/activity.rb +40 -0
  658. data/vendor/plugins/activity_tracker/lib/activity_tracker.rb +80 -0
  659. data/vendor/plugins/activity_tracker/tasks/activity_tracker_tasks.rake +4 -0
  660. data/vendor/plugins/activity_tracker/test/abstract_unit.rb +47 -0
  661. data/vendor/plugins/activity_tracker/test/activity_tracker_test.rb +48 -0
  662. data/vendor/plugins/activity_tracker/test/database.yml +18 -0
  663. data/vendor/plugins/activity_tracker/test/debug.log +3329 -0
  664. data/vendor/plugins/activity_tracker/test/fixtures/test_post.rb +5 -0
  665. data/vendor/plugins/activity_tracker/test/fixtures/test_posts.yml +3 -0
  666. data/vendor/plugins/activity_tracker/test/fixtures/test_user.rb +4 -0
  667. data/vendor/plugins/activity_tracker/test/fixtures/test_users.yml +6 -0
  668. data/vendor/plugins/activity_tracker/test/schema.rb +21 -0
  669. data/vendor/plugins/activity_tracker/uninstall.rb +1 -0
  670. data/vendor/plugins/acts_as_list/README +23 -0
  671. data/vendor/plugins/acts_as_list/init.rb +3 -0
  672. data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +256 -0
  673. data/vendor/plugins/acts_as_list/test/list_test.rb +332 -0
  674. data/vendor/plugins/acts_as_publishable/README +3 -0
  675. data/vendor/plugins/acts_as_publishable/Rakefile +22 -0
  676. data/vendor/plugins/acts_as_publishable/generators/publishing/publishing_generator.rb +34 -0
  677. data/vendor/plugins/acts_as_publishable/generators/publishing/templates/migration.rb +13 -0
  678. data/vendor/plugins/acts_as_publishable/init.rb +3 -0
  679. data/vendor/plugins/acts_as_publishable/install.rb +3 -0
  680. data/vendor/plugins/acts_as_publishable/lib/acts_as_publishable.rb +81 -0
  681. data/vendor/plugins/acts_as_publishable/test/acts_as_publishable_test.rb +8 -0
  682. data/vendor/plugins/acts_as_publishable/uninstall.rb +1 -0
  683. data/vendor/plugins/auto_complete/README +23 -0
  684. data/vendor/plugins/auto_complete/Rakefile +22 -0
  685. data/vendor/plugins/auto_complete/init.rb +2 -0
  686. data/vendor/plugins/auto_complete/lib/auto_complete.rb +47 -0
  687. data/vendor/plugins/auto_complete/lib/auto_complete_macros_helper.rb +143 -0
  688. data/vendor/plugins/auto_complete/test/auto_complete_test.rb +67 -0
  689. data/vendor/plugins/enumerations_mixin/LICENSE +20 -0
  690. data/vendor/plugins/enumerations_mixin/README_ENUMERATIONS +163 -0
  691. data/vendor/plugins/enumerations_mixin/init.rb +21 -0
  692. data/vendor/plugins/enumerations_mixin/lib/active_record/acts/enumerated.rb +177 -0
  693. data/vendor/plugins/enumerations_mixin/lib/active_record/aggregations/has_enumerated.rb +60 -0
  694. data/vendor/plugins/enumerations_mixin/lib/active_record/virtual_enumerations.rb +68 -0
  695. data/vendor/plugins/enumerations_mixin/virtual_enumerations_sample.rb +76 -0
  696. data/vendor/plugins/prototype_legacy_helper/README.markdown +13 -0
  697. data/vendor/plugins/prototype_legacy_helper/init.rb +1 -0
  698. data/vendor/plugins/prototype_legacy_helper/lib/prototype_legacy_helper.rb +432 -0
  699. data/vendor/plugins/prototype_legacy_helper/test/test_prototype_helper.rb +297 -0
  700. data/vendor/plugins/resource_feeder/README +4 -0
  701. data/vendor/plugins/resource_feeder/Rakefile +22 -0
  702. data/vendor/plugins/resource_feeder/init.rb +2 -0
  703. data/vendor/plugins/resource_feeder/lib/resource_feeder/atom.rb +71 -0
  704. data/vendor/plugins/resource_feeder/lib/resource_feeder/rss.rb +71 -0
  705. data/vendor/plugins/resource_feeder/lib/resource_feeder.rb +2 -0
  706. data/vendor/plugins/resource_feeder/test/atom_feed_test.rb +85 -0
  707. data/vendor/plugins/resource_feeder/test/rss_feed_test.rb +61 -0
  708. data/vendor/plugins/resource_feeder/test/test_helper.rb +60 -0
  709. data/vendor/plugins/respond_to_parent/MIT-LICENSE +20 -0
  710. data/vendor/plugins/respond_to_parent/README +47 -0
  711. data/vendor/plugins/respond_to_parent/Rakefile +22 -0
  712. data/vendor/plugins/respond_to_parent/init.rb +1 -0
  713. data/vendor/plugins/respond_to_parent/install.rb +1 -0
  714. data/vendor/plugins/respond_to_parent/lib/responds_to_parent.rb +70 -0
  715. data/vendor/plugins/respond_to_parent/test/responds_to_parent_test.rb +10 -0
  716. data/vendor/plugins/respond_to_parent/test/test_helper.rb +6 -0
  717. data/vendor/plugins/respond_to_parent/uninstall.rb +1 -0
  718. data/vendor/plugins/tiny_mce/CHANGELOG_PLUGIN.rdoc +91 -0
  719. data/vendor/plugins/tiny_mce/CHANGELOG_TINYMCE +1226 -0
  720. data/vendor/plugins/tiny_mce/DEV_UPGRADE_NOTES.rdoc +12 -0
  721. data/vendor/plugins/tiny_mce/init.rb +2 -0
  722. data/vendor/plugins/tiny_mce/install.rb +18 -0
  723. data/vendor/plugins/tiny_mce/lib/tiny_mce/base.rb +33 -0
  724. data/vendor/plugins/tiny_mce/lib/tiny_mce/configuration.rb +114 -0
  725. data/vendor/plugins/tiny_mce/lib/tiny_mce/exceptions.rb +14 -0
  726. data/vendor/plugins/tiny_mce/lib/tiny_mce/helpers.rb +43 -0
  727. data/vendor/plugins/tiny_mce/lib/tiny_mce/railtie.rb +13 -0
  728. data/vendor/plugins/tiny_mce/lib/tiny_mce/spell_checker.rb +67 -0
  729. data/vendor/plugins/tiny_mce/lib/tiny_mce/valid_tinymce_langs.yml +25 -0
  730. data/vendor/plugins/tiny_mce/lib/tiny_mce/valid_tinymce_options.yml +167 -0
  731. data/vendor/plugins/tiny_mce/lib/tiny_mce.rb +24 -0
  732. data/vendor/plugins/white_list/README +35 -0
  733. data/vendor/plugins/white_list/Rakefile +22 -0
  734. data/vendor/plugins/white_list/init.rb +35 -0
  735. data/vendor/plugins/white_list/lib/white_list_helper.rb +61 -0
  736. data/vendor/plugins/white_list/test/white_list_test.rb +120 -0
  737. metadata +1073 -0
@@ -0,0 +1,111 @@
1
+ require 'test_helper'
2
+
3
+ class TopicTest < ActiveSupport::TestCase
4
+ fixtures :all
5
+
6
+ def test_save_should_update_post_id_for_posts_belonging_to_topic
7
+ # checking current forum_id's are in sync
8
+ topic = topics(:pdi)
9
+ post_forums = lambda do
10
+ topic.sb_posts.each { |p| assert_equal p.forum_id, topic.forum_id }
11
+ end
12
+ post_forums.call
13
+ assert_equal forums(:rails).id, topic.forum_id
14
+
15
+ # updating forum_id
16
+ topic.update_attribute :forum_id, forums(:comics).id
17
+ assert_equal forums(:comics).id, topic.reload.forum_id
18
+ post_forums.call
19
+ end
20
+
21
+ def test_knows_last_post
22
+ assert_equal sb_posts(:pdi_rebuttal), topics(:pdi).sb_posts.recent.last
23
+ end
24
+
25
+ def test_should_add_to_user_counter_cache
26
+ assert_difference SbPost, :count do
27
+ assert_difference users(:sam).sb_posts, :count do
28
+ p = topics(:galactus).sb_posts.new(:body => "I'll do it")
29
+ p.user = users(:sam)
30
+ p.save
31
+ end
32
+ end
33
+ end
34
+
35
+ def test_should_create_topic
36
+ counts = lambda { [Topic.count, forums(:rails).topics_count] }
37
+ old = counts.call
38
+ t = forums(:rails).topics.new(:title => 'foo')
39
+ t.user = users(:aaron)
40
+ assert t.valid?
41
+ t.save
42
+ assert_equal 0, t.sticky
43
+ [forums(:rails), users(:aaron)].each &:reload
44
+ assert_equal old.collect { |n| n + 1}, counts.call
45
+ end
46
+
47
+ def test_should_delete_topic
48
+ counts = lambda { [Topic.count, SbPost.count, forums(:rails).topics_count, forums(:rails).sb_posts_count, users(:sam).sb_posts_count] }
49
+ old = counts.call
50
+ topics(:ponies).destroy
51
+ [forums(:rails), users(:sam)].each &:reload
52
+ assert_equal old.collect { |n| n - 1}, counts.call
53
+ end
54
+
55
+ def test_hits
56
+ hits=topics(:pdi).views
57
+ topics(:pdi).hit!
58
+ topics(:pdi).hit!
59
+ assert_equal(topics(:pdi).hits, topics(:pdi).views)
60
+ assert_equal(hits+2, topics(:pdi).reload.hits)
61
+ end
62
+
63
+ def test_replied_at_set
64
+ t=Topic.new
65
+ t.user=users(:aaron)
66
+ t.title = "happy life"
67
+ t.forum = forums(:rails)
68
+ assert t.save
69
+ assert_not_nil t.replied_at
70
+ assert t.replied_at <= Time.now.utc
71
+ assert_in_delta t.replied_at, Time.now.utc, 5.seconds
72
+ end
73
+
74
+ def test_doesnt_change_replied_at_on_save
75
+ t=Topic.find(:first)
76
+ old=t.replied_at
77
+ assert t.save
78
+ assert_equal old, t.replied_at
79
+ end
80
+
81
+ def test_notify_of_new_post
82
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
83
+ # aaron and sam are monitoring, but aaron's the author, so just one notification
84
+ topics(:pdi).notify_of_new_post( topics(:pdi).sb_posts.last )
85
+ end
86
+ end
87
+
88
+ test "should notify for new anonymous post" do
89
+ configatron.allow_anonymous_forum_posting = true
90
+ assert_difference ActionMailer::Base.deliveries, :length, 2 do
91
+ post = topics(:pdi).sb_posts.create!(:body => "Anonymous post", :author_email => 'foo@bar.com', :author_ip => '1.2.3.4')
92
+ end
93
+ configatron.allow_anonymous_forum_posting = false
94
+ end
95
+
96
+ def test_topic_creator_should_monitor_automatically
97
+ t = forums(:rails).topics.new(:title => 'foo')
98
+ t.user = users(:aaron)
99
+ t.save
100
+ assert users(:aaron).monitoring_topic?(t)
101
+ end
102
+
103
+ def test_should_be_deleted_when_user_destroyed
104
+ topic = topics(:ponies)
105
+ id = topic.id
106
+ topic.user.destroy
107
+ assert !Topic.exists?(id)
108
+ end
109
+
110
+
111
+ end
@@ -0,0 +1,108 @@
1
+ require 'test_helper'
2
+ require 'hpricot'
3
+
4
+ class UserNotifierTest < ActiveSupport::TestCase
5
+ FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures'
6
+ CHARSET = "utf-8"
7
+
8
+ fixtures :users, :friendships, :friendship_statuses, :comments, :posts, :sb_posts, :topics, :forums, :roles
9
+
10
+ def setup
11
+ ActionMailer::Base.delivery_method = :test
12
+ ActionMailer::Base.perform_deliveries = true
13
+ ActionMailer::Base.deliveries = []
14
+
15
+ end
16
+
17
+ def test_should_deliver_signup_invitation_with_name_in_email
18
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
19
+ UserNotifier.signup_invitation('"Foo Bar" <foo@bar.com>', users(:quentin), 'please join').deliver
20
+ end
21
+ end
22
+
23
+
24
+ def test_should_deliver_signup_invitation
25
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
26
+ UserNotifier.signup_invitation('test@example.com', users(:quentin), 'please join').deliver
27
+ end
28
+ end
29
+
30
+ def test_should_deliver_friendship_request
31
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
32
+ UserNotifier.friendship_request(friendships(:aaron_receive_quentin_pending)).deliver
33
+ end
34
+ end
35
+
36
+ def test_should_deliver_friendship_accepted_notification
37
+ f = friendships(:aaron_receive_quentin_pending)
38
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
39
+ f.update_attributes(:friendship_status => FriendshipStatus[:accepted]) && f.reverse.update_attributes(:friendship_status => FriendshipStatus[:accepted])
40
+ end
41
+ end
42
+
43
+ def test_should_deliver_comment_notice
44
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
45
+ UserNotifier.comment_notice(comments(:aarons_comment_on_quentins_post)).deliver
46
+ end
47
+ end
48
+
49
+ def test_should_deliver_follow_up_comment_notice
50
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
51
+ UserNotifier.follow_up_comment_notice(users(:dwr), comments(:aarons_comment_on_quentins_post)).deliver
52
+ end
53
+ end
54
+
55
+ def test_should_deliver_follow_up_comment_notice_anonymous
56
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
57
+ UserNotifier.follow_up_comment_notice_anonymous('test@example.com', comments(:aarons_comment_on_quentins_post)).deliver
58
+ end
59
+ end
60
+
61
+ def test_should_deliver_new_forum_post_notice
62
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
63
+ UserNotifier.new_forum_post_notice(users(:dwr), sb_posts(:ponies)).deliver
64
+ end
65
+ end
66
+
67
+
68
+ def test_should_deliver_signup_notification
69
+ users(:aaron).update_attributes(:activated_at => nil, :activation_code => "123456")
70
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
71
+ UserNotifier.signup_notification(users(:aaron)).deliver
72
+ end
73
+ end
74
+
75
+ def test_should_deliver_post_recommendation
76
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
77
+ UserNotifier.post_recommendation('foo', 'bar@example.com', posts(:funny_post), 'check it out').deliver
78
+ end
79
+ end
80
+
81
+ def test_should_deliver_activation
82
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
83
+ UserNotifier.activation(users(:aaron)).deliver
84
+ end
85
+ end
86
+
87
+ def test_should_deliver_password_reset_instructions
88
+ activate_authlogic
89
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
90
+ UserNotifier.password_reset_instructions(users(:aaron)).deliver
91
+ end
92
+ end
93
+
94
+ def test_should_deliver_forgot_username
95
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
96
+ UserNotifier.forgot_username(users(:aaron)).deliver
97
+ end
98
+ end
99
+
100
+ private
101
+ def read_fixture(action)
102
+ IO.readlines("#{FIXTURES_PATH}/user_notifier/#{action}")
103
+ end
104
+
105
+ def encode(subject)
106
+ quoted_printable(subject, CHARSET)
107
+ end
108
+ end
@@ -0,0 +1,259 @@
1
+ require 'test_helper'
2
+
3
+ class UserTest < ActiveSupport::TestCase
4
+ fixtures :all
5
+
6
+ test "should_create_user" do
7
+ assert_difference User, :count do
8
+ user = create_user
9
+ assert !user.new_record?, "#{user.errors.full_messages.to_sentence}"
10
+ end
11
+ end
12
+
13
+ test "should_trim_whitespace" do
14
+ user = users(:quentin)
15
+ user.login = 'quentin '
16
+ user.save!
17
+ assert_equal user.login, 'quentin'
18
+ end
19
+
20
+ test "should_not_reject_spaces" do
21
+ user = User.new(:login => 'foo bar')
22
+ user.valid?
23
+ assert user.errors[:login].empty?
24
+ end
25
+
26
+ test "should_reject_special_chars" do
27
+ user = User.new(:login => '&stripes')
28
+ assert !user.valid?
29
+ assert user.errors[:login]
30
+ end
31
+
32
+ test "should_accept_normal_chars_in_login" do
33
+ u = create_user(:login => "foo_and_bar")
34
+ assert u.errors[:login].empty?
35
+ u = create_user(:login => "2foo-and-bar")
36
+ assert u.errors[:login].empty?
37
+ end
38
+
39
+ test "should_require_login" do
40
+ assert_no_difference User, :count do
41
+ u = create_user(:login => nil)
42
+ assert u.errors[:login]
43
+ end
44
+ end
45
+
46
+ test "should_find_user_with_numerals_in_login" do
47
+ u = create_user(:login => "2foo-and-bar")
48
+ assert u.errors[:login].empty?
49
+ assert_equal u, User.find("2foo-and-bar")
50
+ end
51
+
52
+ test "should_require_password" do
53
+ assert_no_difference User, :count do
54
+ u = create_user(:password => nil)
55
+ assert u.errors[:password]
56
+ end
57
+ end
58
+
59
+ test "should_require_password_confirmation" do
60
+ assert_no_difference User, :count do
61
+ u = create_user(:password_confirmation => nil)
62
+ assert u.errors[:password_confirmation]
63
+ end
64
+ end
65
+
66
+ test "should_require_email" do
67
+ assert_no_difference User, :count do
68
+ u = create_user(:email => nil)
69
+ assert u.errors[:email]
70
+ end
71
+ end
72
+
73
+ test "should_require_valid_birthday" do
74
+ assert_no_difference User, :count do
75
+ u = create_user(:birthday => 1.year.ago)
76
+ assert u.errors[:birthday].any?
77
+ end
78
+ end
79
+
80
+ test "should_handle_email_upcase" do
81
+ assert_difference User, :count, 1 do
82
+ assert create_user(:email => 'FOO@BAR.NET').valid?
83
+ end
84
+ end
85
+
86
+ test "should_update_password" do
87
+ activate_authlogic
88
+ users(:quentin).update_attributes(:password => 'new password', :password_confirmation => 'new password')
89
+ assert_equal users(:quentin), UserSession.create(:login => 'quentin', :password => 'new password').record
90
+ end
91
+
92
+ test "should deliver password reset instructions" do
93
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
94
+ users(:quentin).deliver_password_reset_instructions!
95
+ end
96
+ end
97
+
98
+ test "should_not_rehash_password" do
99
+ activate_authlogic
100
+ users(:quentin).update_attributes(:login => 'quentin_two')
101
+ assert_equal users(:quentin), UserSession.create(:login => 'quentin_two', :password => 'test').record
102
+ end
103
+
104
+ test "should_show_location" do
105
+ assert_equal users(:quentin).location, metro_areas(:twincities).name
106
+ end
107
+
108
+ test "should_call_avatar_photo" do
109
+ assert_equal users(:quentin).avatar_photo_url, configatron.photo.missing_medium
110
+ assert_equal users(:quentin).avatar_photo_url(:thumb), configatron.photo.missing_thumb
111
+ end
112
+
113
+ test "should_find_featured" do
114
+ featured = User.find_featured
115
+ assert_equal featured.size, 1
116
+ end
117
+
118
+ test "should_find_by_activity" do
119
+ assert_difference Activity, :count, 3 do
120
+ users(:quentin).track_activity(:logged_in)
121
+ users(:quentin).track_activity(:logged_in)
122
+ users(:quentin).track_activity(:logged_in)
123
+ end
124
+
125
+ assert !User.find_by_activity({:require_avatar => false}).empty?
126
+
127
+ users(:quentin).update_attribute(:avatar_id, 1) #just pretend
128
+ assert !User.find_by_activity.empty?
129
+ end
130
+
131
+ test "should_not_include_inactive_users_in_find_by_activity" do
132
+ inactive_user = create_user
133
+ assert !inactive_user.active?
134
+ Activity.create(:user => inactive_user)
135
+ assert_nothing_raised do
136
+ User.find_by_activity({:limit => 5, :require_avatar => false})
137
+ end
138
+ end
139
+
140
+
141
+ test "should_update_activities_counter_on_user" do
142
+ #make sure the initial count is right
143
+ Activity.destroy_all
144
+ users(:quentin).update_attribute( :activities_count, Activity.by(users(:quentin)) )
145
+
146
+ assert_difference users(:quentin), :activities_count, 1 do
147
+ users(:quentin).track_activity(:logged_in)
148
+ users(:quentin).reload
149
+ end
150
+ end
151
+
152
+
153
+ test "should_have_reached_daily_friend_request_limit" do
154
+ Friendship.daily_request_limit = 1
155
+
156
+ assert !users(:quentin).has_reached_daily_friend_request_limit?
157
+ f = Friendship.create!(:user => users(:quentin), :friend => users(:kevin), :initiator => true, :friendship_status => FriendshipStatus[:pending])
158
+ assert users(:quentin).has_reached_daily_friend_request_limit?
159
+ end
160
+
161
+ test "get_network_activity" do
162
+ users(:aaron).track_activity(:logged_in) #create an activity
163
+
164
+ u = users(:quentin)
165
+ f = friendships(:aaron_receive_quentin_pending)
166
+ f.update_attributes(:friendship_status => FriendshipStatus[:accepted]) && f.reverse.update_attributes(:friendship_status => FriendshipStatus[:accepted])
167
+ assert !u.network_activity.empty?
168
+ end
169
+
170
+ test "should_get_comments_activity" do
171
+ user = users(:quentin)
172
+
173
+ 2.times do
174
+ comment = user.comments.create!(:comment => "foo", :user => users(:aaron), :recipient => user)
175
+ end
176
+
177
+ assert_equal 2, user.comments_activity.size
178
+ end
179
+
180
+ test "should_deactivate" do
181
+ assert users(:quentin).active?
182
+ users(:quentin).deactivate
183
+ assert !users(:quentin).reload.active?
184
+ end
185
+
186
+ test "should activate and send email" do
187
+ #make quentin inactive
188
+ users(:quentin).deactivate
189
+ assert !users(:quentin).reload.active?
190
+
191
+ assert_difference ActionMailer::Base.deliveries, :length, 1 do
192
+ users(:quentin).activate
193
+ assert users(:quentin).reload.active?
194
+ end
195
+ end
196
+
197
+ test "should_return_full_location" do
198
+ assert_equal "Minneapolis / St. Paul", users(:quentin).full_location
199
+ end
200
+
201
+ test "should_prohibit_reserved_logins " do
202
+ user = create_user(:login => configatron.reserved_logins.first)
203
+ assert !user.valid?
204
+ end
205
+
206
+ test "should find user tagged with a tag" do
207
+ user = users(:quentin)
208
+ user.tag_list = 'foo'
209
+ user.save
210
+
211
+ assert User.tagged_with('foo').include?(user)
212
+ end
213
+
214
+ test "should prepare params for search" do
215
+ params = User.prepare_params_for_search(:metro_area_id => 1, :state_id => 1)
216
+ assert_equal(params, {:metro_area_id=>1, :state_id=>1, "metro_area_id"=>1, "state_id"=>1, "country_id"=>nil})
217
+ end
218
+
219
+ test "should build scope for search params" do
220
+ params = {'country_id' => 1, 'state_id' => 1, 'metro_area_id' => 1, 'login' => 'foo', 'vendor' => false, 'description' => 'baz'}
221
+ scope = User.build_conditions_for_search(params)
222
+
223
+ #This sucks; I want to make sure that the correct scopes are set up on the relation, but I don't know a better way.
224
+ assert_equal("SELECT \"users\".* FROM \"users\" WHERE \"users\".\"metro_area_id\" = 1 AND (users.activated_at IS NOT NULL) AND (`users`.login LIKE '%foo%') AND (`users`.description LIKE '%baz%')", scope.to_sql)
225
+ end
226
+
227
+ test "should create user from authorization" do
228
+ hash = {'provider' => 'twitter',
229
+ 'uid' => '12345',
230
+ 'nickname' => 'omniauthuser',
231
+ 'email' => 'email@example.com' }
232
+
233
+ Authorization.create!(hash) do |auth|
234
+ assert_difference User, :count, 1 do
235
+ user = User.find_or_create_from_authorization(auth)
236
+ auth.user = user
237
+ end
238
+ end
239
+
240
+ end
241
+
242
+ test "should not require password or email for omniauthed user" do
243
+ user = User.new
244
+ user.authorizing_from_omniauth = true
245
+ user.valid?
246
+ assert(user.errors[:email].empty?, "Should not have errors on email")
247
+ assert(user.errors[:birthday].empty?, "Should not have errors on birthday")
248
+ end
249
+
250
+ protected
251
+ def create_user(options = {})
252
+ User.create({
253
+ :login => 'quire',
254
+ :email => 'quire@example.com',
255
+ :password => 'quire123',
256
+ :password_confirmation => 'quire123',
257
+ :birthday => configatron.min_age.years.ago }.merge(options))
258
+ end
259
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+
3
+ class VoteTest < ActiveSupport::TestCase
4
+
5
+ # Replace this with your real tests.
6
+ def test_truth
7
+ assert true
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ ActivityTracker
2
+ ===============
3
+
4
+ Description goes here
@@ -0,0 +1,22 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the activity_tracker plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.pattern = 'test/**/*_test.rb'
12
+ t.verbose = true
13
+ end
14
+
15
+ desc 'Generate documentation for the activity_tracker plugin.'
16
+ Rake::RDocTask.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'ActivityTracker'
19
+ rdoc.options << '--line-numbers' << '--inline-source'
20
+ rdoc.rdoc_files.include('README')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
@@ -0,0 +1,13 @@
1
+ Description:
2
+ The migration generator creates a migration to add the activities table to your database
3
+
4
+ The generator takes no arguments.
5
+
6
+ The generator creates a migration in db/migrate.
7
+
8
+ Example:
9
+ ./script/generate activity_migration
10
+
11
+ Migration: db/migrate/add_activities_table.rb
12
+ The Activity model lives in the lib directory of this plugin. You can move that model into your models directory and modify it if you like.
13
+
@@ -0,0 +1,11 @@
1
+ class ActivityMigrationGenerator < Rails::Generator::Base
2
+
3
+ def manifest
4
+ record do |m|
5
+ m.migration_template 'migration.rb', 'db/migrate', :assigns => {
6
+ :migration_name => "CreateActivitiesTable"
7
+ }, :migration_file_name => "create_activities_table"
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,17 @@
1
+ class CreateActivitiesTable < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :activities do |t|
4
+ t.column :user_id, :integer, :limit => 10
5
+ t.column :action, :string, :limit => 50
6
+ t.column :item_id, :integer, :limit => 10
7
+ t.column :item_type, :string
8
+ t.column :created_at, :datetime
9
+ end
10
+
11
+
12
+ end
13
+
14
+ def self.down
15
+ drop_table :activities
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ ActiveRecord::Base.send(:include, ActivityTracker)
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1,40 @@
1
+ class Activity < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :item, :polymorphic => true
4
+ validates_presence_of :user_id
5
+
6
+ after_save :update_counter_on_user
7
+
8
+ scope :of_item_type, lambda {|type|
9
+ {:conditions => ["activities.item_type = ?", type]}
10
+ }
11
+ scope :since, lambda { |time|
12
+ {:conditions => ["activities.created_at > ?", time] }
13
+ }
14
+ scope :before, lambda {|time|
15
+ {:conditions => ["activities.created_at < ?", time] }
16
+ }
17
+ scope :recent, :order => "activities.created_at DESC"
18
+ scope :by_users, lambda {|user_ids|
19
+ {:conditions => ['activities.user_id in (?)', user_ids]}
20
+ }
21
+
22
+
23
+ def update_counter_on_user
24
+ if user && user.class.column_names.include?('activities_count')
25
+ new_count = Activity.by(user)
26
+ user.update_attribute(:activities_count, new_count )
27
+ end
28
+ end
29
+
30
+ def self.by(user)
31
+ Activity.count(:all, :conditions => ["user_id = ?", user.id])
32
+ end
33
+
34
+ def can_be_deleted_by?(user)
35
+ return false if user.nil?
36
+ return false unless user.admin? || user.moderator? || self.user_id.eql?(user.id)
37
+ true
38
+ end
39
+
40
+ end
@@ -0,0 +1,80 @@
1
+ module ActivityTracker # :nodoc:
2
+
3
+ def self.included(base) # :nodoc:
4
+ base.extend ActMethods
5
+ end
6
+
7
+ module ActMethods
8
+
9
+ # Arguments:
10
+ # <tt>:actor</tt> - the user model that owns this object. In most cases this will be :user. Required.
11
+ # <tt>:options</tt> - hash of options.
12
+ #
13
+ #
14
+ # Options:
15
+ # <tt>:if</tt> - a Proc that determines if the activity should be tracked.
16
+ #
17
+ # Examples:
18
+ # acts_as_activity :user
19
+ # acts_as_activity :author
20
+ # acts_as_activity :user, :if => Proc.new{|record| record.post.length > 100 } - will only track the activity if the length of the post is more than 100
21
+ def acts_as_activity(actor, options = {})
22
+ unless included_modules.include? InstanceMethods
23
+ after_create do |record|
24
+ unless options[:if].kind_of?(Proc) and not options[:if].call(record)
25
+ record.create_activity_from_self
26
+ end
27
+ end
28
+
29
+ has_many :activities, :as => :item, :dependent => :destroy
30
+ class_attribute :activity_options
31
+ include InstanceMethods
32
+ end
33
+ self.activity_options = {:actor => actor}
34
+ end
35
+
36
+ # This adds a helper method to the model which makes it easy to track actions that can't be associated with an object in the database.
37
+ # Options:
38
+ # <tt>:actions</tt> - An array of actions that are accepted to be tracked.
39
+ #
40
+ # Examples:
41
+ # tracks_unlinked_activities [:logged_in, :invited_friends] - class.track_activity(:logged_in)
42
+ #
43
+ def tracks_unlinked_activities(actions = [])
44
+ unless included_modules.include? InstanceMethods
45
+ class_attribute :activity_options
46
+ include InstanceMethods
47
+ end
48
+ self.activity_options = {:actions => actions}
49
+ after_destroy { |record| Activity.destroy_all(:user_id => record.id) }
50
+ end
51
+
52
+ end
53
+
54
+ module InstanceMethods
55
+
56
+ def create_activity_from_self
57
+ activity = Activity.new
58
+ activity.item = self
59
+ activity.action = self.class.to_s.underscore
60
+ actor_id = self.send( activity_options[:actor].to_s + "_id" )
61
+ activity.user_id = actor_id
62
+ activity.save
63
+ end
64
+
65
+ def track_activity(action)
66
+ if activity_options[:actions].include?(action)
67
+ activity = Activity.new
68
+ activity.action = action.to_s
69
+ activity.user_id = self.id
70
+ activity.save!
71
+ else
72
+ raise "The action #{action} can't be tracked."
73
+ end
74
+ end
75
+
76
+
77
+ end
78
+
79
+
80
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :activity_tracker do
3
+ # # Task goes here
4
+ # end