FEATURE: add group filter for admin reports (#23381)

FEATURE: add group filter for admin reports

DEV: add plugin outlet for admin dashboard tabs
This commit is contained in:
Arpit Jalan 2023-09-05 11:17:18 +05:30 committed by GitHub
parent d1253bc3af
commit e5f3c26d20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 124 additions and 2 deletions

View File

@ -49,6 +49,8 @@
</LinkTo> </LinkTo>
</li> </li>
{{/if}} {{/if}}
<PluginOutlet @name="admin-dashboard-tabs-after" />
</ul> </ul>
{{outlet}} {{outlet}}

View File

@ -199,6 +199,7 @@
<PluginOutlet <PluginOutlet
@name="admin-dashboard-general-bottom" @name="admin-dashboard-general-bottom"
@connectorTagName="div" @connectorTagName="div"
@outletArgs={{hash filters=this.filters}}
/> />
</span> </span>
</ConditionalLoadingSpinner> </ConditionalLoadingSpinner>

View File

@ -868,7 +868,8 @@ class Post < ActiveRecord::Base
start_date, start_date,
end_date, end_date,
category_id = nil, category_id = nil,
include_subcategories = false include_subcategories = false,
group_ids = nil
) )
result = result =
public_posts.where( public_posts.where(
@ -884,6 +885,13 @@ class Post < ActiveRecord::Base
result = result.where("topics.category_id = ?", category_id) result = result.where("topics.category_id = ?", category_id)
end end
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 result.group("date(posts.created_at)").order("date(posts.created_at)").count
end end

View File

@ -82,6 +82,15 @@ class PostAction < ActiveRecord::Base
result = result.joins(post: :topic).where("topics.category_id = ?", opts[:category_id]) result = result.joins(post: :topic).where("topics.category_id = ?", opts[:category_id])
end end
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 result.group("date(post_actions.created_at)").order("date(post_actions.created_at)").count
end end

View File

@ -652,7 +652,8 @@ class Topic < ActiveRecord::Base
start_date, start_date,
end_date, end_date,
category_id = nil, category_id = nil,
include_subcategories = false include_subcategories = false,
group_ids = nil
) )
result = result =
listable_topics.where( listable_topics.where(
@ -665,6 +666,15 @@ class Topic < ActiveRecord::Base
result.where( result.where(
category_id: include_subcategories ? Category.subcategory_ids(category_id) : category_id, category_id: include_subcategories ? Category.subcategory_ids(category_id) : category_id,
) if 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 result.count
end end

View File

@ -987,4 +987,38 @@ RSpec.describe PostAction do
end end
end 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 end

View File

@ -2109,4 +2109,52 @@ RSpec.describe Post do
expect(post4.canonical_url).to eq("#{topic_url}?page=2#post_#{post4.post_number}") expect(post4.canonical_url).to eq("#{topic_url}?page=2#post_#{post4.post_number}")
end end
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 end

View File

@ -2573,6 +2573,16 @@ RSpec.describe Topic do
4.days.ago.to_date => 1, 4.days.ago.to_date => 1,
) )
end 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 end
describe "#secure_category?" do describe "#secure_category?" do