Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FEATURE: add group filter for admin reports #23381

Merged
merged 2 commits into from Sep 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/assets/javascripts/admin/addon/templates/dashboard.hbs
Expand Up @@ -49,6 +49,8 @@
</LinkTo>
</li>
{{/if}}

<PluginOutlet @name="admin-dashboard-tabs-after" />
</ul>

{{outlet}}
Expand Down
Expand Up @@ -199,6 +199,7 @@
<PluginOutlet
@name="admin-dashboard-general-bottom"
@connectorTagName="div"
@outletArgs={{hash filters=this.filters}}
/>
</span>
</ConditionalLoadingSpinner>
10 changes: 9 additions & 1 deletion app/models/post.rb
Expand Up @@ -868,7 +868,8 @@ def self.public_posts_count_per_day(
start_date,
end_date,
category_id = nil,
include_subcategories = false
include_subcategories = false,
group_ids = nil
)
result =
public_posts.where(
Expand All @@ -884,6 +885,13 @@ def self.public_posts_count_per_day(
result = result.where("topics.category_id = ?", category_id)
end
end
if group_ids
result =
result
.joins("INNER JOIN users ON users.id = posts.user_id")
.joins("INNER JOIN group_users ON group_users.user_id = users.id")
.where("group_users.group_id IN (?)", group_ids)
end

result.group("date(posts.created_at)").order("date(posts.created_at)").count
end
Expand Down
9 changes: 9 additions & 0 deletions app/models/post_action.rb
Expand Up @@ -82,6 +82,15 @@ def self.count_per_day_for_type(post_action_type, opts = nil)
result = result.joins(post: :topic).where("topics.category_id = ?", opts[:category_id])
end
end

if opts[:group_ids]
result =
result
.joins("INNER JOIN users ON users.id = post_actions.user_id")
.joins("INNER JOIN group_users ON group_users.user_id = users.id")
.where("group_users.group_id IN (?)", opts[:group_ids])
end

result.group("date(post_actions.created_at)").order("date(post_actions.created_at)").count
end

Expand Down
12 changes: 11 additions & 1 deletion app/models/topic.rb
Expand Up @@ -652,7 +652,8 @@ def self.listable_count_per_day(
start_date,
end_date,
category_id = nil,
include_subcategories = false
include_subcategories = false,
group_ids = nil
)
result =
listable_topics.where(
Expand All @@ -665,6 +666,15 @@ def self.listable_count_per_day(
result.where(
category_id: include_subcategories ? Category.subcategory_ids(category_id) : category_id,
) if category_id

if group_ids
result =
result
.joins("INNER JOIN users ON users.id = topics.user_id")
.joins("INNER JOIN group_users ON group_users.user_id = users.id")
.where("group_users.group_id IN (?)", group_ids)
end

result.count
end

Expand Down
34 changes: 34 additions & 0 deletions spec/models/post_action_spec.rb
Expand Up @@ -987,4 +987,38 @@ def limiter(tl, type)
end
end
end

describe "count_per_day_for_type" do
before { PostActionCreator.create(eviltrout, post, :like) }

it "returns the correct count" do
expect(PostAction.count_per_day_for_type(PostActionType.types[:like])).to eq(
Time.now.utc.to_date => 1,
)
end

it "returns the correct count when there are multiple actions" do
PostActionCreator.create(codinghorror, post, :like)
expect(PostAction.count_per_day_for_type(PostActionType.types[:like])).to eq(
Time.now.utc.to_date => 2,
)
end

it "returns the correct count when there are multiple types" do
PostActionCreator.create(eviltrout, post, :spam)
expect(PostAction.count_per_day_for_type(PostActionType.types[:spam])).to eq(
Time.now.utc.to_date => 1,
)
end

it "returns the correct count with group filter" do
group = Fabricate(:group)
group.add(codinghorror)

PostActionCreator.create(codinghorror, post, :like)
expect(
PostAction.count_per_day_for_type(PostActionType.types[:like], { group_ids: [group.id] }),
).to eq(Time.now.utc.to_date => 1)
end
end
end
48 changes: 48 additions & 0 deletions spec/models/post_spec.rb
Expand Up @@ -2109,4 +2109,52 @@ def updates_topic_updated_at
expect(post4.canonical_url).to eq("#{topic_url}?page=2#post_#{post4.post_number}")
end
end

describe "public_posts_count_per_day" do
before do
freeze_time DateTime.parse("2017-03-01 12:00")

Fabricate(:post)
Fabricate(:post, created_at: 1.day.ago)
Fabricate(:post, created_at: 1.day.ago)
Fabricate(:post, created_at: 2.days.ago)
Fabricate(:post, created_at: 4.days.ago)
end

let(:listable_topics_count_per_day) do
{ 1.day.ago.to_date => 2, 2.days.ago.to_date => 1, Time.now.utc.to_date => 1 }
end

it "collect closed interval public post count" do
expect(Post.public_posts_count_per_day(2.days.ago, Time.now)).to include(
listable_topics_count_per_day,
)
expect(Post.public_posts_count_per_day(2.days.ago, Time.now)).not_to include(
4.days.ago.to_date => 1,
)
end

it "returns the correct number of public posts per day when there are no public posts" do
Fabricate(:post, post_type: Post.types[:whisper], created_at: 6.days.ago)
Fabricate(:post, post_type: Post.types[:whisper], created_at: 7.days.ago)

expect(Post.public_posts_count_per_day(10.days.ago, 5.days.ago)).to be_empty
end

it "returns the correct number of public posts per day with group filter" do
user = Fabricate(:user)
group_user = Fabricate(:user)
group = Fabricate(:group)
group.add(group_user)

Fabricate(:post, user: user, created_at: 6.days.ago)
Fabricate(:post, user: user, created_at: 7.days.ago)
Fabricate(:post, user: group_user, created_at: 6.days.ago)
Fabricate(:post, user: group_user, created_at: 7.days.ago)

expect(
Post.public_posts_count_per_day(10.days.ago, 5.days.ago, nil, false, [group.id]),
).to eq(6.days.ago.to_date => 1, 7.days.ago.to_date => 1)
end
end
end
10 changes: 10 additions & 0 deletions spec/models/topic_spec.rb
Expand Up @@ -2573,6 +2573,16 @@ def set_state!(group, user, state)
4.days.ago.to_date => 1,
)
end

it "returns the correct count with group filter" do
group = Fabricate(:group)
group.add(user)
topic = Fabricate(:topic, user: user)

expect(Topic.listable_count_per_day(2.days.ago, Time.now, nil, false, [group.id])).to include(
Time.now.utc.to_date => 1,
)
end
end

describe "#secure_category?" do
Expand Down