diff --git a/app/controllers/common/tracking/action.rb b/app/controllers/common/tracking/action.rb index 620b2cb92b453dc1f4551eda31b58efc49c0623c..503489fb41641ae4d9db35808379107f2d85ff9c 100644 --- a/app/controllers/common/tracking/action.rb +++ b/app/controllers/common/tracking/action.rb @@ -1,10 +1,6 @@ -# We have lists of former actions in a number of places. For example page -# history lists actions related to a given page. -# We want to list activities of groups and users on their landing pages and on -# a combined feed for the current_users friends and groups. -# -# Therefore we need to keep track of the things people do. We store them in -# different records based on the context (Activity and PageHistory). +# The page history lists actions related to a given page. +# Therefore we need to keep track of the changes. We store them in +# PageHistory. # # This module makes creating the records from the controller easy. # diff --git a/app/helpers/common/ui/entity_display_helper.rb b/app/helpers/common/ui/entity_display_helper.rb index dd8ac8da7991929e5af9e0558625025fdbaf7595..dbae543d66d4ab6bf75c534c91f3eb0b0d90b39d 100644 --- a/app/helpers/common/ui/entity_display_helper.rb +++ b/app/helpers/common/ui/entity_display_helper.rb @@ -191,68 +191,7 @@ module Common::Ui::EntityDisplayHelper end # - # used to display a list of entities - # - # options: - # - # :entities -- the entity objects to list. if empty, nothing is displayed. - # :before -- text to put before the list, if enitities is non-empty. - # :after -- text to put after the list. if set, entity list is always treated as non-empty. - # - # other options are passed on through to display_entity - # - # def entity_list(options) - # html = [] - # before = options.delete(:before) - # after = options.delete(:after) - # entities = options.delete(:entities) - # if entities or before or after - # html << before - # if entities.any? - # html << content_tag(:ul, :class => 'entities') do - # entities.collect do |entity| - # content_tag(:li, link_to_entity(entity, options)) - # end - # end - # end - # html << after - # end - # return html.join - # end - - # def entity_nav_list(options) - # html = [] - # header = options.delete(:header) - # footer = options.delete(:footer) - # entities = options.delete(:entities) - # if entities or header or footer - # content_tag(:ul, :class => 'nav nav-list') do - # html = "" - # if header - # html << content_tag(:li, header, :class => 'nav-header') - # end - # if entities.any? - # entities.collect do |entity| - # html << content_tag(:li, link_to_entity(entity, options)) - # end - # end - # html - # end - # else - # "" - # end - # end - - ## - ## ENCODED ENTITY TEXT - ## - ## There are many places where we have some text with a user or group encoded in it like so: - ## - ## "hey, check out <group>animals</group>." - ## - - # - # used to convert the text produced by activities & requests into actual links + # used to convert the text produced by requests into actual links # def expand_links(text, options = nil) if block_given? diff --git a/app/helpers/common/ui/text_helper.rb b/app/helpers/common/ui/text_helper.rb index 41c5a9671815e8ff6769e8f7796c23bcee77883f..1ef2cf9e8367f91d756180588419620fd79c0e52 100644 --- a/app/helpers/common/ui/text_helper.rb +++ b/app/helpers/common/ui/text_helper.rb @@ -47,29 +47,4 @@ module Common::Ui::TextHelper end truncate(text, length: length, omission: omission + link) end - - # def linked_activity_description(activity) - # description = activity.try.safe_description(self) - # expand_links(description) - # end - - # def display_activity(activity) - # description = activity.try.safe_description(self) - # return unless description - - # description = expand_links(description) - - # created_at = (friendly_date(activity.created_at) if activity.created_at) - - # more_link = activity.link - # if more_link.is_a? Hash - # more_link = link_to(I18n.t(:details_link) + ARROW, more_link, :class => 'shy') - # end - # more_link = content_tag(:span, [created_at, more_link].combine, :class => 'commands') - - # css_class = "small_icon #{activity.icon}_16 shy_parent" - # css_style = activity.style - - # content_tag :li, [description, more_link].combine, :class => css_class, :style => css_style - # end end diff --git a/app/models/activity.rb b/app/models/activity.rb deleted file mode 100644 index 660926165d23a5ff2db58d7dc4f397732287fec9..0000000000000000000000000000000000000000 --- a/app/models/activity.rb +++ /dev/null @@ -1,223 +0,0 @@ -# = Activity -# -# Activities are used to populate the recent activity list on the dashboard. -# They are usually created by using track_action in the controllers which -# hands the current state to Tracking::Action.track -# (see Common::Tracking::Action in controllers and Tracking::Action in models) -# Activities will show up on the subjects landing page. -# -# == Database Schema: -# -# create_table "activities", :force => true do |t| -# t.integer "subject_id", :limit => 11 -# t.string "subject_type" -# t.string "subject_name" -# t.integer "item_id", :limit => 11 -# t.string "item_type" -# t.string "item_name" -# t.string "type" -# t.string "extra" -# t.integer "related_id", -# t.integer "key", :limit => 11 -# t.datetime "created_at" -# t.integer "access", :limit => 1, :default => 2 -# t.integer "site_id", :limite => 11 -# end -# -# -# related_id and extra are used for generic storage and association, whatever -# the subclass wants to use it for. -# -class Activity < ActiveRecord::Base - # activity access (relative to self.subject): - PRIVATE = 1 # only you can see it - DEFAULT = 2 # your friends can see this activity for you - PUBLIC = 3 # anyone can see it. - - belongs_to :subject, polymorphic: true # the "subject" is typically the actor who is doing something. - belongs_to :item, polymorphic: true # the "item" is the thing that is acted upon. - - before_create :set_defaults - def set_defaults # :nodoc: - # the key is used to filter out twin activities so that we don't show - # duplicates. for example, if two of your friends become friends, you don't - # need to know about it twice. - self.key ||= rand(Time.now.to_i) - - # sometimes the subject or item may be deleted. - # therefore, we cache the name in case the subject or item doesn't exist. - self.subject_name ||= subject.name if subject and subject.respond_to?(:name) - self.item_name ||= item.name if item and item.respond_to?(:name) - end - - ## - ## ACTIVITY DISPLAY - ## - - # user to be used as avatar in the activities list for the current user - def avatar - respond_to?(:user) ? user : subject - end - - # to be defined by subclasses - def icon - 'exclamation' - end - - # to be defined by subclasses - def style; end - - # to be defined by subclasses - def description(view) end - - # to be defined by subclasses - def link() end - - # calls description, and if there is any problem, then we self destruct. - # why? because activities hold pointers to all kinds of items. These can be - # deleted at any time. So if there is an error, it is probably because we - # tried to reference a deleted record. - # - # (normally, groups and users will not cause a problem, because most the time - # we cache their name's at the time of the activity's creation) - def safe_description(view = nil) - description(view) - rescue - destroy - nil - end - - ## - ## FINDERS - ## - - def self.newest - order('created_at DESC') - end - - def self.unique - group('`key`') - end - - # - # for 'me/activities' - # - - def self.for_my_groups(me) - where "(subject_type = 'Group' AND subject_id IN (?))", - me.all_group_id_cache - end - - def self.for_me(me) - where "(subject_type = 'User' AND subject_id = ?)", - me.id - end - - def self.for_my_friends(me) - where "(subject_type = 'User' AND subject_id IN (?) AND access != ?)", - me.friend_id_cache, - Activity::PRIVATE - end - - def self.for_all(me) - where(social_activities_scope_conditions(me, me.friend_id_cache)) - end - - # +other_users_ids_list+ should be an array of user ids whose - # social activity should be retrieved - # show all activity for: - # - # (1) subject is current_user - # (2) subject belongs to the +other_users_ids_list+ (a list of current_user's friends or peers) - # (3) subject is a group current_user is in. - # (4) take the intersection with the contents of site if site.network.nil? - def self.social_activities_scope_conditions(user, other_users_ids_list) - ["(subject_type = 'User' AND subject_id = ?) OR - (subject_type = 'User' AND subject_id IN (?) AND access != ?) OR - (subject_type = 'Group' AND subject_id IN (?)) ", - user.id, - other_users_ids_list, - Activity::PRIVATE, - user.all_group_id_cache] - end - - # for user's landing page - # - # show all activity for: - # - # (1) subject matches 'user' - # (AND 'user' is friend of current_user) - # - # (3) subject matches 'user' - # (AND activity.public == true) - # - def self.for_user(user, current_user) - if current_user and current_user.friend_of?(user) or current_user == user - restricted = Activity::PRIVATE - # elsif current_user and current_user.peer_of?(user) - # restricted = Activity::DEFAULT - else - restricted = Activity::DEFAULT - end - where "subject_type = 'User' AND subject_id = ? AND access > ?", - user.id, restricted - end - - # for group's landing page - # - # show all activity for: - # - # (1) subject matches 'group' - # (and current_user is a member of group) - # - # (2) subject matches 'group' - # (and activity.public == true) - # - def self.for_group(group, current_user) - if current_user and current_user.member_of?(group) - where "subject_type = 'Group' AND subject_id IN (?)", - group.group_and_committee_ids - else - where "subject_type = 'Group' AND subject_id IN (?) AND access = ?", - group.group_and_committee_ids, Activity::PUBLIC - end - end - - ## - ## DISPLAY HELPERS - ## - ## used by the description() method of Activity subclasses - ## - - # a safe way to reference a group, even if the group has been deleted. - def group_span(attribute) - item_span(attribute, 'group') - end - - # a safe way to reference a user, even if the user has been deleted. - def user_span(attribute) - item_span(attribute, 'user') - end - - def group_class(attribute) - if group = send(attribute) - group.group_type.downcase - elsif group_type = send(attribute.to_s + '_type') - I18n.t(group_type.downcase.to_sym).downcase - end - end - - private - - # often, stuff that we want to report activity on has already been - # destroyed. so, if the item responds to :name, we cache the name. - def item_span(item, type) - # if it's a group, try to get the group name directly from the reference item - # need to figure out if i'm the subject or item! - if item.to_s == 'group' - name = item_type == 'Group' ? self.item.try.name : subject.try.name - end - name ||= send("#{item}_name") || send(item).try.name || I18n.t(:unknown) - format('<%s>%s</%s>', type, name, type) - end -end diff --git a/app/models/activity/friend.rb b/app/models/activity/friend.rb deleted file mode 100644 index 41dff3a61ec434ba82399fca39e769e8f4000c87..0000000000000000000000000000000000000000 --- a/app/models/activity/friend.rb +++ /dev/null @@ -1,51 +0,0 @@ -class Activity::Friend < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_format_of :item_type, with: /\AUser\z/ - validates_presence_of :subject_id - validates_presence_of :item_id - - alias_attr :user, :subject - alias_attr :other_user, :item - - before_create :set_access - after_create :create_twin - - def set_access - # this has a weird side effect of creating public and private - # profiles if they don't already exist. - self.access = if user.access? public: :see_contacts - Activity::PUBLIC - elsif user.access? user.associated(:friends) => :see_contacts - Activity::DEFAULT - else - Activity::PRIVATE - end - end - - def create_twin - twin.first_or_create do |other| - other.key = key - end - end - - def description(_view = nil) - I18n.t(:activity_contact_created, - user: user_span(:user), - other_user: user_span(:other_user)) - end - - # Warning: Do not use self.class or even Activity::Friend here... - # Why? It seems the scope of self is kept in that case. - # So activity.twin.twin would always return nil because it tries to - # fullfill both conditions (those for the twin and for the twin of that twin) - # at the same time. - def twin - Activity.where type: 'Friend', - subject_id: item_id, subject_type: 'User', - item_id: subject_id, item_type: 'User' - end - - def icon - 'user_add' - end -end diff --git a/app/models/activity/group_created.rb b/app/models/activity/group_created.rb deleted file mode 100644 index 93e42f6758fbfcd506c47f01919bdc7196e04b2b..0000000000000000000000000000000000000000 --- a/app/models/activity/group_created.rb +++ /dev/null @@ -1,18 +0,0 @@ -class Activity::GroupCreated < Activity - validates_format_of :subject_type, with: /\AGroup\z/ - validates_presence_of :subject_id - - alias_attr :group, :subject - alias_attr :user, :item - - def description(_view = nil) - I18n.t(:activity_group_created, - user: user_span(:user), - group_type: group_class(:group), - group: group_span(:group)) - end - - def icon - 'plus' - end -end diff --git a/app/models/activity/group_destroyed.rb b/app/models/activity/group_destroyed.rb deleted file mode 100644 index 3005e969a21e7f9a24865e11dbdf74d67002a5e6..0000000000000000000000000000000000000000 --- a/app/models/activity/group_destroyed.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Activity::GroupDestroyed < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_presence_of :subject_id - validates_presence_of :extra - - alias_attr :recipient, :subject - alias_attr :destroyed_by, :item - alias_attr :groupname, :extra - - def description(_view = nil) - I18n.t(:activity_group_destroyed, - user: user_span(:destroyed_by), - group: groupname) - end - - def icon - 'minus' - end -end diff --git a/app/models/activity/group_gained_user.rb b/app/models/activity/group_gained_user.rb deleted file mode 100644 index 983f8e8f5e4c7b85e89052447db1c99edaed5418..0000000000000000000000000000000000000000 --- a/app/models/activity/group_gained_user.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Activity::GroupGainedUser < Activity - validates_format_of :subject_type, with: /\AGroup\z/ - validates_format_of :item_type, with: /\AUser\z/ - validates_presence_of :subject_id - validates_presence_of :item_id - - alias_attr :group, :subject - alias_attr :user, :item - - before_create :set_access - def set_access - if user.has_access?(:see_groups, :public) and group.has_access?(:see_members, :public) - self.access = Activity::PUBLIC - end - end - - def description(_view = nil) - I18n.t(:activity_user_joined_group, - user: user_span(:user), - group_type: group_class(:group), - group: group_span(:group)) - end - - def icon - 'membership_add' - end -end diff --git a/app/models/activity/group_lost_user.rb b/app/models/activity/group_lost_user.rb deleted file mode 100644 index effff2ec12a13c0edba9a30914f310dd26dc4116..0000000000000000000000000000000000000000 --- a/app/models/activity/group_lost_user.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Activity::GroupLostUser < Activity::GroupGainedUser - def description(_view = nil) - I18n.t(:activity_user_left_group, - user: user_span(:user), - group_type: group_class(:group), - group: group_span(:group)) - end - - def icon - 'membership_delete' - end -end diff --git a/app/models/activity/message_sent.rb b/app/models/activity/message_sent.rb deleted file mode 100644 index 460698279cabe546b2da72d410a4972a07a4d024..0000000000000000000000000000000000000000 --- a/app/models/activity/message_sent.rb +++ /dev/null @@ -1,51 +0,0 @@ -class Activity::MessageSent < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_presence_of :subject_id - - validates_format_of :item_type, with: /\AUser\z/ - validates_presence_of :item_id - - alias_attr :user_to, :subject - alias_attr :user_from, :item - alias_attr :avatar, :item - alias_attr :post_id, :related_id - alias_attr :snippet, :extra - alias_attr :reply, :flag - - belongs_to :post, foreign_key: :related_id - - # This is likely created via Activity.track with controller options. - # The controller options like user may not be what we want... - # We only trust the post. - before_validation :extract_attrs_from_post - def extract_attrs_from_post - return true unless post - self.snippet = GreenCloth.new(post.body[0..140], 'page', [:lite_mode]).to_html - self.snippet += '...' if post.body.length > 140 - self.user = post.recipient - self.author = post.user - end - - protected - - before_create :set_access - def set_access - self.access = Activity::PRIVATE - end - - public - - def description(view) - url = view.send(:my_private_message_path, user_from_name) - link_text = reply ? I18n.t(:a_reply_link) : I18n.t(:a_message_link) - - I18n.t(:activity_message_received, - message_tag: view.link_to(link_text, url), - other_user: user_span(:user_from), - title: "<i>#{snippet}</i>") - end - - def icon - 'page_message' - end -end diff --git a/app/models/activity/twinkled.rb b/app/models/activity/twinkled.rb deleted file mode 100644 index c053a354a6968b8187213c6136134144071a222d..0000000000000000000000000000000000000000 --- a/app/models/activity/twinkled.rb +++ /dev/null @@ -1,34 +0,0 @@ -class Activity::Twinkled < Activity - include ActionView::Helpers::TagHelper - - validates_format_of :subject_type, with: /\AUser\z/ - validates_format_of :item_type, with: /\AUser\z/ - validates_presence_of :subject_id - validates_presence_of :item_id - validates_presence_of :extra - - serialize :extra - - alias_attr :user, :subject - alias_attr :twinkler, :item - alias_attr :avatar, :item - alias_attr :post, :extra - - before_create :set_access - def set_access - self.access = Activity::PRIVATE - end - - def description(_view = nil) - I18n.t(:activity_twinkled, - user: user_span(:twinkler), post: post_span(post)) - end - - def post_span(post) - content_tag :a, h(post[:snippet]), href: "/posts/jump/#{post[:id]}" - end - - def icon - 'star' - end -end diff --git a/app/models/activity/unread.rb b/app/models/activity/unread.rb deleted file mode 100644 index 2bc399403ac07f1106b4466a219e69f78a51b17a..0000000000000000000000000000000000000000 --- a/app/models/activity/unread.rb +++ /dev/null @@ -1,63 +0,0 @@ -class Activity::Unread < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_presence_of :subject_id - validate :has_unread_count, on: :create - - alias_attr :user, :subject - alias_attr :author, :item - alias_attr :unread_count, :key - - def has_unread_count - unless unread_count > 0 - errors.add('unread_count', 'must be greater than zero') - end - end - - protected - - before_validation :set_access, on: :create - def set_access - self.access = Activity::PRIVATE - self.unread_count = user.relationships.sum('unread_count') || 0 - end - - # We want to delete the other Activity::Unread even if we don't pass - # validations, because if there are no unread messages, we want no - # Activity. - before_validation :destroy_twins, on: :create - def destroy_twins - self.class.destroy_all format('subject_id = %s', user.id) - end - - public - - def avatar - unread_count == 1 ? author : user - end - - def description(view) - if unread_count == 1 - str = I18n.t(:activity_unread_singular) - link = if author - view.send(:my_private_message_path, author) - else - view.send(:my_private_messages_path) - end - else - str = I18n.t(:activity_unread, count: unread_count) - link = view.send(:my_private_messages_path) - end - - str.sub(/\[(.*)\]/) do |_match| - view.link_to(Regexp.last_match(1), link) - end - end - - def created_at - nil - end - - def icon - 'page_message' - end -end diff --git a/app/models/activity/user_created_group.rb b/app/models/activity/user_created_group.rb deleted file mode 100644 index 8f4fc26fc74b2d604977e122becffc055b1ab3e7..0000000000000000000000000000000000000000 --- a/app/models/activity/user_created_group.rb +++ /dev/null @@ -1,20 +0,0 @@ -class Activity::UserCreatedGroup < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_format_of :item_type, with: /\AGroup\z/ - validates_presence_of :subject_id - validates_presence_of :item_id - - alias_attr :user, :subject - alias_attr :group, :item - - def description(_view = nil) - I18n.t(:activity_group_created, - user: user_span(:user), - group_type: group_class(:group), - group: group_span(:group)) - end - - def icon - 'plus' - end -end diff --git a/app/models/activity/user_destroyed.rb b/app/models/activity/user_destroyed.rb deleted file mode 100644 index 4654e572601e18a20e791b55b83827588875d125..0000000000000000000000000000000000000000 --- a/app/models/activity/user_destroyed.rb +++ /dev/null @@ -1,20 +0,0 @@ -class Activity::UserDestroyed < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_presence_of :subject_id - validates_presence_of :extra - - alias_attr :recipient, :subject - alias_attr :username, :extra - - def avatar - nil - end - - def description(_view = nil) - I18n.t(:activity_user_destroyed, user: username) - end - - def icon - 'minus' - end -end diff --git a/app/models/activity/user_joined_group.rb b/app/models/activity/user_joined_group.rb deleted file mode 100644 index cd9f680aff41667031ccaac86fb3bdb2a8e2dfe1..0000000000000000000000000000000000000000 --- a/app/models/activity/user_joined_group.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Activity::UserJoinedGroup < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_format_of :item_type, with: /\AGroup\z/ - validates_presence_of :subject_id - validates_presence_of :item_id - - alias_attr :user, :subject - alias_attr :group, :item - - before_create :set_access - def set_access - if user.has_access?(:see_groups, :public) and group.has_access?(:see_members, :public) - self.access = Activity::PUBLIC - end - end - - def description(_view = nil) - I18n.t(:activity_user_joined_group, - user: user_span(:user), - group_type: group_class(:group), - group: group_span(:group)) - end - - def icon - 'membership_add' - end -end diff --git a/app/models/activity/user_joined_site.rb b/app/models/activity/user_joined_site.rb deleted file mode 100644 index ca4dfae7e68b62fc700777b6c91e105e7dbcb236..0000000000000000000000000000000000000000 --- a/app/models/activity/user_joined_site.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Activity::UserJoinedSite < Activity::UserJoinedGroup - def description(_view = nil) - I18n.t(:activity_user_joined_site, - user: user_span(:user), - group: group_span(:group)) - end -end diff --git a/app/models/activity/user_left_group.rb b/app/models/activity/user_left_group.rb deleted file mode 100644 index 29979ef02a7669c45b52b300d60652a3eedbb6d7..0000000000000000000000000000000000000000 --- a/app/models/activity/user_left_group.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Activity::UserLeftGroup < Activity::UserJoinedGroup - def description(_view = nil) - I18n.t(:activity_user_left_group, - user: user_span(:user), - group_type: group_class(:group), - group: group_span(:group)) - end - - def icon - 'membership_delete' - end -end diff --git a/app/models/activity/user_left_site.rb b/app/models/activity/user_left_site.rb deleted file mode 100644 index 021daf5b3b9d0eb01ac07fe2ef1c943049670d20..0000000000000000000000000000000000000000 --- a/app/models/activity/user_left_site.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Activity::UserLeftSite < Activity::UserLeftGroup - def description(_view = nil) - I18n.t(:activity_user_left_site, - user: user_span(:user), - group: group_span(:group)) - end -end diff --git a/app/models/activity/user_proposed_to_destroy_group.rb b/app/models/activity/user_proposed_to_destroy_group.rb deleted file mode 100644 index a8583039dc1b445424193d1e8ad6bbf1ff8c2330..0000000000000000000000000000000000000000 --- a/app/models/activity/user_proposed_to_destroy_group.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Activity::UserProposedToDestroyGroup < Activity - validates_format_of :subject_type, with: /\AUser\z/ - validates_format_of :item_type, with: /\AGroup\z/ - validates_presence_of :subject_id - validates_presence_of :item_id - - alias_attr :user, :subject - alias_attr :group, :item - - before_create :set_access - def set_access - if user.has_access?(:see_groups, :public) and group.has_access?(:see_members, :public) - self.access = Activity::PUBLIC - end - end - - def description(_view = nil) - I18n.t(:request_to_destroy_our_group_description, - user: user_span(:user), - group_type: group_class(:group), - group: group_span(:group)) - end - - def icon - 'minus' - end -end diff --git a/app/models/group.rb b/app/models/group.rb index f5a49318f5cff9a2b7252b2c53a019b7f9f2214b..7878caaf7dfe13a5278e03e56cdb4dda23070568 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -34,7 +34,6 @@ class Group < ActiveRecord::Base acts_as_castle - # not saved to database, just used by activity feed: attr_accessor :created_by ## diff --git a/app/models/page/history.rb b/app/models/page/history.rb index a1817c59bebf4af232af61f3d196be65f6e430bd..692256f8bf59589778f08cbcb391b4ff055742a1 100644 --- a/app/models/page/history.rb +++ b/app/models/page/history.rb @@ -83,6 +83,7 @@ class Page::History::Update < Page::History protected def self.class_for_update(page) + # FIXME: does not work, because page.public_changed? is always false return Page::History::MakePrivate if page.marked_as_private? return Page::History::MakePublic if page.marked_as_public? # return Page::History::ChangeOwner if page.owner_id_changed? diff --git a/app/models/post.rb b/app/models/post.rb index 116a31a1621d70cb5a25b1bea65ee2865bcd0e5e..6a2ec9b67686c43cdd2c7da5e544decb2828f6c8 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -64,10 +64,8 @@ class Post < ActiveRecord::Base alias created_by user attr_accessor :in_reply_to # the post this post was in reply to. - # it is tmp var used when post activities. attr_accessor :recipient # for private posts, a tmp var to store who - # this post is being sent to. used by activities. ## ## METHODS diff --git a/app/models/private_post.rb b/app/models/private_post.rb index 1eaa4fae7eeba6d1ef22ba8081c12eb433c48f5f..2779da8d1ab0eb3bf909cb122ee9ef4bc17a2451 100644 --- a/app/models/private_post.rb +++ b/app/models/private_post.rb @@ -1,9 +1,4 @@ class PrivatePost < Post - has_one :activity, - foreign_key: :related_id, - dependent: :delete, - class_name: 'Activity::MessageSent' - # deleted because they are also notices and Post.notices is # dependent: :delete_all has_many :private_message_notices, diff --git a/app/models/tracking.rb b/app/models/tracking.rb deleted file mode 100644 index 2ffc52a04446c77eb6c9da4f96675ded350593a8..0000000000000000000000000000000000000000 --- a/app/models/tracking.rb +++ /dev/null @@ -1,6 +0,0 @@ -# -# Module for all things related to tracking user activity -# - -module Tracking -end diff --git a/app/models/tracking/action.rb b/app/models/tracking/action.rb index c81dedab17fa781a4c3fcea577d681916d2d3b52..9f9117015dc54fcbee004fdc53c1cf80579023b2 100644 --- a/app/models/tracking/action.rb +++ b/app/models/tracking/action.rb @@ -1,10 +1,5 @@ module Tracking::Action EVENT_CREATES_ACTIVITIES = { - create_group: ['Activity::GroupCreated', 'Activity::UserCreatedGroup'], - create_membership: ['Activity::GroupGainedUser', 'Activity::UserJoinedGroup'], - destroy_membership: ['Activity::GroupLostUser', 'Activity::UserLeftGroup'], - request_to_destroy_group: ['Activity::UserProposedToDestroyGroup'], - create_friendship: ['Activity::Friend'], create_post: ['Page::History::AddComment'], update_post: ['Page::History::UpdateComment'], destroy_post: ['Page::History::DestroyComment'], diff --git a/extensions/themes/default/navigation.rb b/extensions/themes/default/navigation.rb index aa3e40f9de393f2f0435ecbb2d41c9130d2f2d52..946a9dbb49016d64f0b63fd5c1d8147f7a57eec5 100644 --- a/extensions/themes/default/navigation.rb +++ b/extensions/themes/default/navigation.rb @@ -1,5 +1,3 @@ - - define_navigation do ## ## HOME @@ -12,15 +10,12 @@ define_navigation do active { controller?(:account, :session, :root) } end - ## - ## ## ME ## global_section :me do label { :me.t } - # visible { logged_in? } url { logged_in? ? me_home_path : '/' } active { context?(:me) || controller?(:account, :session, :root) } html partial: '/layouts/global/nav/me_menu' @@ -40,40 +35,6 @@ define_navigation do icon :page_white_copy end - # context_section :activities do - # label { :activities.t } - # url { me_activities_path } - # active { controller?('me/activities') } - # icon :transmit - # local_section :all do - # label "All Activities" - # url { me_activities_path } - # active { controller?('me/activities') and params[:view].empty? } - # end - # local_section :my do - # label "Mine" - # url { me_activities_path(:view => 'my') } - # active { controller?('me/activities') and params[:view] == 'my' } - # end - # local_section :friends do - # label "People" - # url { me_activities_path(:view => 'friends') } - # active { controller?('me/activities') and params[:view] == 'friends' } - # end - # local_section :groups do - # label "Groups" - # url { me_activities_path(:view => 'groups') } - # active { controller?('me/activities') and params[:view] == 'groups' } - # end - # end - - # context_section :calendar do - # label "Calendar" - # url { me_events_path } - # active { controller?('me/events') } - # icon :date - # end - context_section :messages do label { :messages.t } url { me_discussions_path } @@ -206,9 +167,6 @@ define_navigation do html partial: '/layouts/global/nav/groups_menu' context_section :directory do - # visible { context?(:none) and controller?('group/directory') } - # active { context?(:none) and controller?('group/directory') } - visible { context?(:none) } active { context?(:none) } @@ -249,13 +207,6 @@ define_navigation do active { page_controller? } end - # context_section :calendar do - # label { :calendar.t } - # url { group_events_path(@group) } - # active { controller?('group/events') } - # icon :date - # end - context_section :members do visible { may_list_memberships? } label { :members.t } @@ -291,17 +242,6 @@ define_navigation do active { controller?('group/membership_requests') } end - # local_section :leave_group_link do - # visible { may_leave_group? } - # html { leave_group_link } - # end - - # local_section :membership_settings do - # visible { may_edit_group? } - # label { 'Membership Settings' } - # url { group_permissions_path(@group, :view => 'membership') } - # active false - # end end context_section :settings do @@ -355,19 +295,4 @@ define_navigation do end end - ## - ## GROUPS DIRECTORY - ## - - # global_section :group_directory do - # visible { @group.nil? } - # label "Groups" - # url { groups_directory_path } - # active { controller?('groups') } - # html :partial => '/layouts/global/nav/groups_menu' - ## section :place do - ## end - ## section :location do - ## end - # end end diff --git a/extensions/themes/minima/navigation.rb b/extensions/themes/minima/navigation.rb index f9a0d15bfb4ca7973c234658cc5536c723223040..d647e83062a97f6522a0663b19115c6049e4bf6b 100644 --- a/extensions/themes/minima/navigation.rb +++ b/extensions/themes/minima/navigation.rb @@ -1,6 +1,5 @@ define_navigation(parent: 'default') do global_section :me do - # remove_section(:activities) remove_section(:messages) context_section :settings do remove_section(:permissions) diff --git a/lib/tasks/cleanup.rake b/lib/tasks/cleanup.rake index 496a01eb8160846466ae94da8876cc8a8ca6b0f7..bfa19f381995c3f6c202ec306760f94fd5cef5c8 100644 --- a/lib/tasks/cleanup.rake +++ b/lib/tasks/cleanup.rake @@ -33,7 +33,6 @@ namespace :cg do :remove_invalid_federation_requests, :remove_invalid_email_requests, :remove_empty_tasks, - :fix_activity_types, :fix_invalid_request_states, :reset_peer_caches, :fix_contributors_count @@ -243,13 +242,6 @@ namespace :cg do puts "Removed #{count} tasks that lacked a name and a description" end - desc 'Fix type column in activities so the classes actually exist' - task(fix_activity_types: :environment) do - count = Activity.where(type: 'UserRemovedFromGroupActivity') - .update_all(type: 'UserLeftGroupActivity') - puts "Fixed #{count} Activities by setting an existing type." - end - desc 'Fix invalid states of requests' task(fix_invalid_request_states: :environment) do count = Request.where(state: 'ignored') diff --git a/test/fixtures/activities.yml b/test/fixtures/activities.yml deleted file mode 100644 index 25fa2a641b36f401a0339d4d04b42d8449e38f75..0000000000000000000000000000000000000000 --- a/test/fixtures/activities.yml +++ /dev/null @@ -1,150 +0,0 @@ ---- -activities_001: - item_name: gerrard - subject_name: animals - type: GroupCreated - id: "1" - subject_type: Group - subject_id: "2" - access: "2" - item_type: User - key: "933577122" - extra: - item_id: "3" - created_at: "<%= 1.week.ago.to_s(:db) %>" -activities_002: - item_name: animals - subject_name: gerrard - type: UserCreatedGroup - id: "2" - subject_type: User - subject_id: "3" - access: "2" - item_type: Group - key: "933577122" - extra: - item_id: "2" - created_at: "<%= 1.week.ago.to_s(:db) %>" -activities_003: - item_name: animals - subject_name: gerrard - type: UserJoinedGroup - id: "3" - subject_type: User - subject_id: "3" - access: "2" - item_type: Group - key: "250431626" - extra: - item_id: "2" - created_at: "<%= 1.week.ago.to_s(:db) %>" -activities_004: - item_name: gerrard - subject_name: animals - type: GroupGainedUser - id: "4" - subject_type: Group - subject_id: "2" - access: "2" - item_type: User - key: "250431626" - extra: - item_id: "3" - created_at: "<%= 1.week.ago.to_s(:db) %>" -activities_005: - item_name: animals - subject_name: blue - type: UserJoinedGroup - id: "5" - subject_type: User - subject_id: "4" - access: "2" - item_type: Group - key: "1171500401" - extra: - item_id: "2" - created_at: "<%= 1.hour.ago.to_s(:db) %>" -activities_006: - item_name: blue - subject_name: animals - type: GroupGainedUser - id: "6" - subject_type: Group - subject_id: "2" - access: "2" - item_type: User - key: "1171500401" - extra: - item_id: "4" - created_at: "<%= 1.hour.ago.to_s(:db) %>" -activities_007: - item_name: gerrard - subject_name: blue - type: Twinkled - id: "7" - subject_type: User - subject_id: "4" - access: "1" - item_type: User - key: "502126422" - extra: "--- \n\ - :snippet: blah blah blah blah\n\ - :id: 3\n" - item_id: "3" - created_at: "<%= 1.hour.ago.to_s(:db) %>" -activities_008: - item_name: blue - subject_name: gerrard - type: Friend - id: "8" - subject_type: User - subject_id: "3" - access: "1" - item_type: User - key: "1146383332" - extra: - item_id: "4" - created_at: "<%= 1.minute.ago.to_s(:db) %>" -activities_009: - item_name: gerrard - subject_name: blue - type: Friend - id: "9" - subject_type: User - subject_id: "4" - access: "1" - item_type: User - key: "1146383332" - extra: - item_id: "3" - created_at: "<%= 1.minute.ago.to_s(:db) %>" -activities_010: - item_name: - subject_name: blue - type: UserDestroyed - id: "10" - subject_type: User - subject_id: "4" - access: "1" - item_type: - key: "1146383123" - extra: "test_user" - item_id: - created_at: "<%= 1.day.ago.to_s(:db) %>" -activities_012: - item_name: gerrard - subject_name: blue - type: MessageWall - id: "12" - subject_type: User - subject_id: "4" - access: "1" - item_type: User - key: "1146383224" - extra: "--- \n\ - :snippet: Hi Blue, Just testing messages\n\ - :type: comment\n" - related_id: "3" - item_id: "3" - created_at: "<%= 10.minutes.ago.to_s(:db) %>" - diff --git a/test/functional/group/requests_controller_test.rb b/test/functional/group/requests_controller_test.rb index 6659bc9ae0945ec817805ac41a920f5e712e1f96..f3b387cba450b82dc60a1eef985f717aad0c4dd5 100644 --- a/test/functional/group/requests_controller_test.rb +++ b/test/functional/group/requests_controller_test.rb @@ -20,9 +20,6 @@ class Group::RequestsControllerTest < ActionController::TestCase get :create, group_id: @group.to_param, type: 'destroy_group' end assert_response :redirect - assert activity = Activity::UserProposedToDestroyGroup.last - assert_equal @user, activity.user - assert_equal @group, activity.group end def test_approve diff --git a/test/functional/me/requests_controller_test.rb b/test/functional/me/requests_controller_test.rb index fb27f5a0bdf8b18d92fc441b131fa5cf576fd051..84710723291debe9c604e0e1063b424fff305f66 100644 --- a/test/functional/me/requests_controller_test.rb +++ b/test/functional/me/requests_controller_test.rb @@ -20,9 +20,6 @@ class Me::RequestsControllerTest < ActionController::TestCase request = RequestToFriend.create created_by: requesting, recipient: @user login_as @user - assert_difference 'Activity.count', 2 do - xhr :post, :update, id: request.id, mark: 'approve' - end assert_response :success end @@ -34,9 +31,6 @@ class Me::RequestsControllerTest < ActionController::TestCase requesting = FactoryBot.create(:user) request = RequestToJoinYou.create created_by: requesting, recipient: @group - assert_difference 'Activity.count', 2 do - xhr :post, :update, id: request.id, mark: 'approve' - end assert_response :success end diff --git a/test/unit/activity_test.rb b/test/unit/activity_test.rb deleted file mode 100644 index f3ba448493b21312f787302d6df9bcf376bb78ab..0000000000000000000000000000000000000000 --- a/test/unit/activity_test.rb +++ /dev/null @@ -1,120 +0,0 @@ -require 'test_helper' - -class Activity::Test < ActiveSupport::TestCase - def setup - @blue = users(:blue) - @red = users(:red) - @group = groups(:rainbow) - end - - def test_contact - assert_difference 'Activity.count', 2 do - Activity::Friend.create! user: @blue, other_user: @red - end - act = Activity::Friend.for_me(@blue).last - assert act, 'there should be a friend activity created' - assert_equal @blue, act.user - assert_equal @red, act.other_user - end - - def test_group_created - act = Activity::GroupCreated.new group: @group, user: @red - assert_activity_for_user_group(act, @red, @group) - - act = Activity::UserCreatedGroup.new group: @group, user: @red - assert_activity_for_user_group(act, @red, @group) - end - - def test_create_membership - ruth = FactoryBot.create(:user) - @group.add_user!(ruth) - Tracking::Action.track :create_membership, group: @group, user: ruth - - act = Activity::UserJoinedGroup.for_all(@red).find_by_subject_id(ruth.id) - assert_nil act, "The new peers don't get UserJoinedGroupActivities." - - act = Activity::GroupGainedUser.for_all(@red).last - assert_equal @group.id, act.group.id, - 'New peers should get GroupGainedUserActivities.' - - act = Activity::GroupGainedUser.for_group(@group, ruth).last - assert_equal Activity::GroupGainedUser, act.class - assert_equal @group.id, act.group.id - - # users own activity should always show up: - act = Activity::UserJoinedGroup.for_all(ruth).last - assert_equal @group.id, act.group.id - end - - ## - ## Remove the user - ## - def test_destroy_membership - @group.remove_user!(@blue) - Tracking::Action.track :destroy_membership, group: @group, user: @blue - - act = Activity::GroupLostUser.for_all(@red).last - assert_activity_for_user_group(act, @blue, @group) - - act = Activity::GroupLostUser.for_group(@group, @red).last - assert_activity_for_user_group(act, @blue, @group) - - act = Activity::UserLeftGroup.for_all(@blue).last - assert_activity_for_user_group(act, @blue, @group) - end - - def test_deleted_subject - @blue.add_contact!(@red, :friend) - Tracking::Action.track :create_friendship, user: @blue, other_user: @red - act = Activity::Friend.for_me(@blue).last - former_name = @red.name - @red.destroy - - assert act.reload, 'there should still be a friend activity' - assert_nil act.other_user - assert_equal former_name, act.other_user_name - assert_equal "<user>#{former_name}</user>", - act.user_span(:other_user) - end - - def test_avatar - new_group = FactoryBot.create(:group) - - @blue.add_contact!(@red, :friend) - Tracking::Action.track :create_friendship, user: @blue, other_user: @red - @blue.send_message_to!(@red, 'hi @red') - new_group.add_user!(@blue) - Tracking::Action.track :create_membership, group: new_group, user: @blue - - friend_act = Activity::Friend.find_by_subject_id(@blue.id) - user_joined_act = Activity::UserJoinedGroup.find_by_subject_id(@blue.id) - gained_act = Activity::GroupGainedUser.find_by_subject_id(new_group.id) - post_act = Activity::MessageSent.find_by_subject_id(@red.id) - # we do not create PrivatePost Activities anymore - assert_nil post_act - - # the person doing the thing should be the avatar for it - # disregarding whatever is the subject (in the gramatical/language - # sense) of the activity - assert_equal @blue, friend_act.avatar - assert_equal @blue, user_joined_act.avatar - assert_equal @blue, gained_act.avatar - # assert_equal @blue, post_act.avatar - end - - def test_associations - assert check_associations(Activity) - end - - def assert_activity_for_user_group(act, user, group) - assert_equal group.id, act.group.id - assert_equal user.id, act.user.id - assert_in_description(act, group) - assert_in_description(act, user) - assert_not_nil act.icon - end - - def assert_in_description(act, thing) - assert_match thing.name, act.description - end -end diff --git a/test/unit/group_test.rb b/test/unit/group_test.rb index a054d48a77f37adc4310a0e2866bacd0256559e9..2eaaf16d397e27febfcad64fd846a6ff0381ad70 100644 --- a/test/unit/group_test.rb +++ b/test/unit/group_test.rb @@ -145,14 +145,10 @@ class GroupTest < ActiveSupport::TestCase def test_destroy g = groups(:warm) red = users(:red) - assert_difference 'Group::Membership.count', -1 * g.users.count do g.destroy end - assert_nil pages(:committee_page).reload.owner_id - assert_nil Activity::GroupLostUser.for_all(red).first, - 'there should be no user left group message' end def test_avatar diff --git a/test/unit/tracking/action_test.rb b/test/unit/tracking/action_test.rb deleted file mode 100644 index 8bb4366235d79a5a9e11a3d2653de7e420d848bf..0000000000000000000000000000000000000000 --- a/test/unit/tracking/action_test.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'test_helper' - -class Tracking::ActionTest < ActiveSupport::TestCase - def test_class_lookup - expecting_creation_of Activity::Friend do - Tracking::Action.track :create_friendship - end - end - - def test_args - expecting_creation_of Activity::Friend, with: [:key, :user] do - Tracking::Action.track :create_friendship, user: :dummy, dummy: :user - end - end - - def test_create_multiple_records - expecting_creation_of Activity::GroupCreated do - expecting_creation_of Activity::UserCreatedGroup do - Tracking::Action.track :create_group - end - end - end - - protected - - # okay... this is a bit too fancy. No idea how to simplify. - # calling this makes klass expect create! to be called. - # - # with: keys of the hash expected to be handed to create! - # only checked if present - def expecting_creation_of(klass, with: nil, &block) - method_mock = Minitest::Mock.new - method_mock.expect :call, nil do |args_hash| - !with || with.sort == args_hash.keys.sort - end - klass.stub :create!, method_mock, &block - method_mock.verify - end -end