module MuckActivity # :nodoc: def self.included(base) # :nodoc: base.extend ActMethods end module ActMethods # +has_activities+ gives the class it is called on an activity feed and a method called # +add_activity+ that can add activities into a feed. Retrieve activity feed items # via object.activities. ie @user.activities. def has_activities unless included_modules.include? InstanceMethods has_many :activity_feeds, :as => :ownable has_many :activities, :through => :activity_feeds, :order => 'created_at desc' include InstanceMethods end end # +acts_as_activity_source+ gives the class it is called on a method called # +add_activity+ that can add activities into a feed. def acts_as_activity_source unless included_modules.include? InstanceMethods include InstanceMethods end end end module InstanceMethods # +add_activity+ adds an activity to all activites feeds that belong to the objects found in feed_to. # * +feed_to+: an array of objects that have +has_activities+ declared on them. The generated activity # will be pushed into the feed of each of these objects. # * +source+: the object that peformed the activity ie a user or group # * +item+: an object that will be used to generated the entry in an activity feed # * +template+: name of an partial that will be used to generated the entry in the activity feed. Place # templates in /app/views/activity_templates # * +title+: optional title that can be used in the template # * +content+: option content that can be used in the template. Useful for activities that might not have # an item but instead might have a message or other text. # * +check_method+: method that will be called on each item in the feed_to array. If the method evaluates # to false the activity won't be added to the object's activity feed. An example usage would be # letting users configure which items they want to have in their activity feed. def add_activity(feed_to, source, item, template, title = '', content = '', check_method = nil) feed_to = [feed_to] unless feed_to.is_a?(Array) activity = Activity.create(:item => item, :source => source, :template => template, :title => title, :content => content) feed_to.each do |ft| if check_method ft.activities << activity if ft.send(check_method) else ft.activities << activity end end end # +status+ returns the first activity item from the user's activity feed that is a status update. # Used for displaying the last status update the user made def status self.activities.find(:first, :conditions => ['is_status_update = true'], :order => 'created_at DESC') end def can_view?(check_object) self == check_object end end end