diff --git a/app/controllers/admin/activity_controller.rb b/app/controllers/admin/activity_controller.rb new file mode 100644 index 000000000..8f7993a09 --- /dev/null +++ b/app/controllers/admin/activity_controller.rb @@ -0,0 +1,8 @@ +class Admin::ActivityController < Admin::BaseController + has_filters %w{all on_users on_proposals on_debates on_comments} + + def show + @activity = Activity.for_render.send(@current_filter).order(created_at: :desc).page(params[:page]) + end + +end diff --git a/app/controllers/admin/comments_controller.rb b/app/controllers/admin/comments_controller.rb index ebe2f1066..3a9c360f5 100644 --- a/app/controllers/admin/comments_controller.rb +++ b/app/controllers/admin/comments_controller.rb @@ -14,6 +14,7 @@ class Admin::CommentsController < Admin::BaseController def restore @comment.restore + Activity.log(current_user, :restore, @comment) redirect_to request.query_parameters.merge(action: :index) end diff --git a/app/controllers/admin/debates_controller.rb b/app/controllers/admin/debates_controller.rb index 544c3f23d..41e5af848 100644 --- a/app/controllers/admin/debates_controller.rb +++ b/app/controllers/admin/debates_controller.rb @@ -14,6 +14,7 @@ class Admin::DebatesController < Admin::BaseController def restore @debate.restore + Activity.log(current_user, :restore, @debate) redirect_to request.query_parameters.merge(action: :index) end diff --git a/app/controllers/admin/proposals_controller.rb b/app/controllers/admin/proposals_controller.rb index 4f399bff7..57e8809e2 100644 --- a/app/controllers/admin/proposals_controller.rb +++ b/app/controllers/admin/proposals_controller.rb @@ -14,6 +14,7 @@ class Admin::ProposalsController < Admin::BaseController def restore @proposal.restore + Activity.log(current_user, :restore, @proposal) redirect_to request.query_parameters.merge(action: :index) end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 013fe4e90..eed1c4fea 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -20,6 +20,7 @@ class Admin::UsersController < Admin::BaseController def restore @user.restore + Activity.log(current_user, :restore, @user) redirect_to request.query_parameters.merge(action: :index) end diff --git a/app/controllers/moderation/comments_controller.rb b/app/controllers/moderation/comments_controller.rb index 07c0201ee..7177911e8 100644 --- a/app/controllers/moderation/comments_controller.rb +++ b/app/controllers/moderation/comments_controller.rb @@ -14,21 +14,21 @@ class Moderation::CommentsController < Moderation::BaseController end def hide - @comment.hide + hide_comment @comment end def moderate @comments = @comments.where(id: params[:comment_ids]) if params[:hide_comments].present? - @comments.accessible_by(current_ability, :hide).each(&:hide) + @comments.accessible_by(current_ability, :hide).each {|comment| hide_comment comment} elsif params[:ignore_flags].present? @comments.accessible_by(current_ability, :ignore_flag).each(&:ignore_flag) elsif params[:block_authors].present? author_ids = @comments.pluck(:user_id).uniq - User.where(id: author_ids).accessible_by(current_ability, :block).each(&:block) + User.where(id: author_ids).accessible_by(current_ability, :block).each {|user| block_user user} end redirect_to request.query_parameters.merge(action: :index) @@ -40,4 +40,14 @@ class Moderation::CommentsController < Moderation::BaseController @comments = Comment.accessible_by(current_ability, :moderate) end + def hide_comment(comment) + comment.hide + Activity.log(current_user, :hide, comment) + end + + def block_user(user) + user.block + Activity.log(current_user, :block, user) + end + end diff --git a/app/controllers/moderation/debates_controller.rb b/app/controllers/moderation/debates_controller.rb index 1fe3eb4b4..57c6a0e05 100644 --- a/app/controllers/moderation/debates_controller.rb +++ b/app/controllers/moderation/debates_controller.rb @@ -14,21 +14,21 @@ class Moderation::DebatesController < Moderation::BaseController end def hide - @debate.hide + hide_debate @debate end def moderate @debates = @debates.where(id: params[:debate_ids]) if params[:hide_debates].present? - @debates.accessible_by(current_ability, :hide).each(&:hide) + @debates.accessible_by(current_ability, :hide).each {|debate| hide_debate debate} elsif params[:ignore_flags].present? @debates.accessible_by(current_ability, :ignore_flag).each(&:ignore_flag) elsif params[:block_authors].present? author_ids = @debates.pluck(:author_id).uniq - User.where(id: author_ids).accessible_by(current_ability, :block).each(&:block) + User.where(id: author_ids).accessible_by(current_ability, :block).each {|user| block_user user} end redirect_to request.query_parameters.merge(action: :index) @@ -40,4 +40,14 @@ class Moderation::DebatesController < Moderation::BaseController @debates = Debate.accessible_by(current_ability, :moderate) end + def hide_debate(debate) + debate.hide + Activity.log(current_user, :hide, debate) + end + + def block_user(user) + user.block + Activity.log(current_user, :block, user) + end + end diff --git a/app/controllers/moderation/proposals_controller.rb b/app/controllers/moderation/proposals_controller.rb index e7cf86043..e59f3c79f 100644 --- a/app/controllers/moderation/proposals_controller.rb +++ b/app/controllers/moderation/proposals_controller.rb @@ -15,21 +15,21 @@ class Moderation::ProposalsController < Moderation::BaseController end def hide - @proposal.hide + hide_proposal @proposal end def moderate @proposals = @proposals.where(id: params[:proposal_ids]) if params[:hide_proposals].present? - @proposals.accessible_by(current_ability, :hide).each(&:hide) + @proposals.accessible_by(current_ability, :hide).each {|proposal| hide_proposal proposal} elsif params[:ignore_flags].present? @proposals.accessible_by(current_ability, :ignore_flag).each(&:ignore_flag) elsif params[:block_authors].present? author_ids = @proposals.pluck(:author_id).uniq - User.where(id: author_ids).accessible_by(current_ability, :block).each(&:block) + User.where(id: author_ids).accessible_by(current_ability, :block).each {|user| block_user user} end redirect_to request.query_parameters.merge(action: :index) @@ -41,4 +41,14 @@ class Moderation::ProposalsController < Moderation::BaseController @proposals = Proposal.accessible_by(current_ability, :moderate) end + def hide_proposal(proposal) + proposal.hide + Activity.log(current_user, :hide, proposal) + end + + def block_user(user) + user.block + Activity.log(current_user, :block, user) + end + end diff --git a/app/controllers/moderation/users_controller.rb b/app/controllers/moderation/users_controller.rb index 39f4c200a..fc8b4488e 100644 --- a/app/controllers/moderation/users_controller.rb +++ b/app/controllers/moderation/users_controller.rb @@ -8,12 +8,14 @@ class Moderation::UsersController < Moderation::BaseController end def hide_in_moderation_screen - @user.block + block_user + redirect_to request.query_parameters.merge(action: :index), notice: I18n.t('moderation.users.notice_hide') end def hide - @user.block + block_user + redirect_to debates_path end @@ -23,4 +25,9 @@ class Moderation::UsersController < Moderation::BaseController @users = User.with_hidden.search(params[:name_or_email]).page(params[:page]).for_render end + def block_user + @user.block + Activity.log(current_user, :block, @user) + end + end diff --git a/app/models/activity.rb b/app/models/activity.rb new file mode 100644 index 000000000..977204669 --- /dev/null +++ b/app/models/activity.rb @@ -0,0 +1,28 @@ +class Activity < ActiveRecord::Base + + belongs_to :actionable, -> { with_hidden }, polymorphic: true + belongs_to :user, -> { with_hidden } + + VALID_ACTIONS = %w( hide block restore ) + + validates :action, inclusion: {in: VALID_ACTIONS} + + scope :on_proposals, -> { where(actionable_type: 'Proposal') } + scope :on_debates, -> { where(actionable_type: 'Debate') } + scope :on_users, -> { where(actionable_type: 'User') } + scope :on_comments, -> { where(actionable_type: 'Comment') } + scope :for_render, -> { includes(user: [:moderator, :administrator]).includes(:actionable) } + + def self.log(user, action, actionable) + create(user: user, action: action.to_s, actionable: actionable) + end + + def self.on(actionable) + where(actionable: actionable) + end + + def self.by(user) + where(user: user) + end + +end diff --git a/app/models/comment.rb b/app/models/comment.rb index 6a3125285..187e35037 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -73,11 +73,11 @@ class Comment < ActiveRecord::Base end def after_hide - commentable_type.constantize.reset_counters(commentable_id, :comments) + commentable_type.constantize.with_hidden.reset_counters(commentable_id, :comments) end def after_restore - commentable_type.constantize.reset_counters(commentable_id, :comments) + commentable_type.constantize.with_hidden.reset_counters(commentable_id, :comments) end def reply? diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb index 42d979209..89e1b6641 100644 --- a/app/views/admin/_menu.html.erb +++ b/app/views/admin/_menu.html.erb @@ -60,6 +60,13 @@ <% end %> +
  • > + <%= link_to admin_activity_path do %> + + <%= t('admin.menu.activity') %> + <% end %> +
  • +
  • > <%= link_to admin_settings_path do %> diff --git a/app/views/admin/activity/show.html.erb b/app/views/admin/activity/show.html.erb new file mode 100644 index 000000000..0f422cfa8 --- /dev/null +++ b/app/views/admin/activity/show.html.erb @@ -0,0 +1,43 @@ +

    <%= t("admin.activity.show.title") %>

    + +<%= render 'shared/filter_subnav', i18n_namespace: "admin.activity.show" %> + +

    <%= page_entries_info @activity %>

    + + + + + + + + + <% @activity.each do |activity| %> + + + + + + + <% end %> +
    <%= t("admin.activity.show.type") %><%= t("admin.activity.show.action") %> <%= t("admin.activity.show.by") %>
    + <%= activity.actionable_type.constantize.model_name.human %>
    + <%= l activity.actionable.created_at.to_date %> +
    + <%= t("admin.activity.show.actions.#{activity.action}") %>
    + <%= l activity.created_at.to_date %> +
    + <% case activity.actionable_type %> + <% when "User" %> + <%= activity.actionable.username %> (<%= activity.actionable.email %>) + <% when "Comment" %> + <%= activity.actionable.body %> + <% else %> + <%= activity.actionable.title %> +
    +
    + <%= activity.actionable.description %> +
    + <% end %> +
    <%= activity.user.name %> (<%= activity.user.email %>)
    + +<%= paginate @activity %> diff --git a/app/views/admin/users/index.html.erb b/app/views/admin/users/index.html.erb index b3c0ad40b..bb71fcd8f 100644 --- a/app/views/admin/users/index.html.erb +++ b/app/views/admin/users/index.html.erb @@ -6,7 +6,7 @@