Commit 2e182714 authored by Douglas Barbosa Alexandre's avatar Douglas Barbosa Alexandre

Merge branch '7168-add-mr-approvals-to-contribution-analytics' into 'master'

Add approved MRs count to contribution analytics

Closes #7168

See merge request gitlab-org/gitlab!33601
parents 99aa9c9d 979c9ac4
......@@ -21,6 +21,7 @@ export default {
<td>{{ row.issuesCreated }}</td>
<td>{{ row.issuesClosed }}</td>
<td>{{ row.mergeRequestsCreated }}</td>
<td>{{ row.mergeRequestsApproved }}</td>
<td>{{ row.mergeRequestsMerged }}</td>
<td>{{ row.totalEvents }}</td>
</tr>
......
......@@ -6,6 +6,7 @@ const COLUMNS = [
{ name: 'issuesCreated', text: __('Opened issues') },
{ name: 'issuesClosed', text: __('Closed issues') },
{ name: 'mergeRequestsCreated', text: __('Opened MRs') },
{ name: 'mergeRequestsApproved', text: __('Approved MRs') },
{ name: 'mergeRequestsMerged', text: __('Merged MRs') },
{ name: 'totalEvents', text: __('Total Contributions') },
];
......
---
title: Add MR approval stats to group contribution analytics
merge_request: 33601
author:
type: added
......@@ -5,7 +5,7 @@
module Gitlab
module ContributionAnalytics
class DataCollector
EVENT_TYPES = %i[push issues_created issues_closed merge_requests_created merge_requests_merged total_events].freeze
EVENT_TYPES = %i[push issues_created issues_closed merge_requests_created merge_requests_merged merge_requests_approved total_events].freeze
attr_reader :group, :from
......@@ -44,6 +44,12 @@ module Gitlab
end
end
def merge_requests_approved_by_author_count
all_counts.each_with_object({}) do |(event, count), hash|
hash[event.author_id] = count if event.merge_request? && event.approved_action?
end
end
def total_events_by_author_count
all_counts.each_with_object({}) do |(event, count), hash|
hash[event.author_id] ||= 0
......@@ -71,6 +77,10 @@ module Gitlab
all_counts.sum { |event, count| event.merge_request? && event.merged_action? ? count : 0 }
end
def total_merge_requests_approved_count
all_counts.sum { |event, count| event.merge_request? && event.approved_action? ? count : 0 }
end
def total_issues_created_count
all_counts.sum { |event, count| event.issue? && event.created_action? ? count : 0 }
end
......@@ -103,6 +113,7 @@ module Gitlab
issues_closed: issues_closed_by_author_count,
merge_requests_created: merge_requests_created_by_author_count,
merge_requests_merged: merge_requests_merged_by_author_count,
merge_requests_approved: merge_requests_approved_by_author_count,
total_events: total_events_by_author_count
}
end
......@@ -113,7 +124,7 @@ module Gitlab
def base_query
Event
.where(action: :pushed).or(
Event.where(target_type: [::MergeRequest.name, ::Issue.name], action: [:created, :closed, :merged])
Event.where(target_type: [::MergeRequest.name, ::Issue.name], action: [:created, :closed, :merged, :approved])
)
.where(Event.arel_table[:created_at].gteq(from))
.joins(:project)
......
......@@ -33,7 +33,7 @@ describe('TableBodyComponent', () => {
const rowEl = vm.$el.querySelector('tr');
expect(rowEl).not.toBeNull();
expect(rowEl.querySelectorAll('td')).toHaveLength(7);
expect(rowEl.querySelectorAll('td')).toHaveLength(8);
});
it('renders username row cell element', () => {
......
......@@ -41,6 +41,7 @@ export const mockSortOrders = {
issuesClosed: 1,
issuesCreated: 1,
mergeRequestsCreated: 1,
mergeRequestsApproved: 1,
mergeRequestsMerged: 1,
push: 1,
totalEvents: 1,
......
......@@ -15,6 +15,7 @@ RSpec.describe Gitlab::ContributionAnalytics::DataCollector do
create(:event, :closed, project: project1, target: issue, author: user)
create(:event, :created, project: project2, target: mr, author: user)
create(:event, :approved, project: project2, target: mr, author: user)
data_collector = described_class.new(group: group)
expect(data_collector.totals).to eq({
......@@ -22,8 +23,9 @@ RSpec.describe Gitlab::ContributionAnalytics::DataCollector do
issues_created: {},
merge_requests_created: { user.id => 1 },
merge_requests_merged: {},
merge_requests_approved: { user.id => 1 },
push: {},
total_events: { user.id => 2 }
total_events: { user.id => 3 }
})
end
end
......@@ -37,6 +39,7 @@ RSpec.describe Gitlab::ContributionAnalytics::DataCollector do
[4, MergeRequest.name, Event.actions[:merged]] => 2,
[5, MergeRequest.name, Event.actions[:created]] => 0,
[6, MergeRequest.name, Event.actions[:created]] => 1,
[6, MergeRequest.name, Event.actions[:approved]] => 1,
[10, Issue.name, Event.actions[:closed]] => 10,
[11, Issue.name, Event.actions[:closed]] => 11
}
......@@ -68,6 +71,10 @@ RSpec.describe Gitlab::ContributionAnalytics::DataCollector do
expect(data_collector.total_merge_requests_merged_count).to eq(4)
end
it 'for #total_merge_requests_approved_count' do
expect(data_collector.total_merge_requests_approved_count).to eq(1)
end
it 'for #total_issues_closed_count' do
expect(data_collector.total_issues_closed_count).to eq(21)
end
......@@ -80,6 +87,7 @@ RSpec.describe Gitlab::ContributionAnalytics::DataCollector do
expect(data_collector.total_push_count).to eq(0)
expect(data_collector.total_merge_requests_created_count).to eq(0)
expect(data_collector.total_merge_requests_merged_count).to eq(0)
expect(data_collector.total_merge_requests_approved_count).to eq(0)
expect(data_collector.total_issues_closed_count).to eq(0)
end
end
......
......@@ -11,6 +11,7 @@ RSpec.describe UserAnalyticsEntity do
issues_closed: {},
merge_requests_created: {},
merge_requests_merged: {},
merge_requests_approved: {},
total_events: {}
}
end
......@@ -23,7 +24,7 @@ RSpec.describe UserAnalyticsEntity do
end
[:push, :issues_created, :issues_closed, :merge_requests_created,
:merge_requests_merged, :total_events].each do |event_type|
:merge_requests_merged, :merge_requests_approved, :total_events].each do |event_type|
it "fetches #{event_type} events for the user from the request" do
events[event_type] = { user.id => 42 }
......
......@@ -2658,6 +2658,9 @@ msgstr ""
msgid "Approved"
msgstr ""
msgid "Approved MRs"
msgstr ""
msgid "Approved by: "
msgstr ""
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment