Commit f39fe4d8 authored by George Andrinopoulos's avatar George Andrinopoulos

Add total time spent to milestones

parent d180affa
...@@ -152,4 +152,12 @@ class GlobalMilestone ...@@ -152,4 +152,12 @@ class GlobalMilestone
@milestones.first.start_date @milestones.first.start_date
end end
end end
def total_time_spent
issues.joins(:timelogs).sum(:time_spent) + merge_requests.joins(:timelogs).sum(:time_spent)
end
def human_total_time_spent
Gitlab::TimeTrackingFormatter.output(total_time_spent) || 0
end
end end
...@@ -213,6 +213,14 @@ class Milestone < ActiveRecord::Base ...@@ -213,6 +213,14 @@ class Milestone < ActiveRecord::Base
project_id.present? project_id.present?
end end
def total_time_spent
issues.joins(:timelogs).sum(:time_spent) + merge_requests.joins(:timelogs).sum(:time_spent)
end
def human_total_time_spent
Gitlab::TimeTrackingFormatter.output(total_time_spent) || 0
end
private private
# Milestone titles must be unique across project milestones and group milestones # Milestone titles must be unique across project milestones and group milestones
......
...@@ -85,6 +85,16 @@ ...@@ -85,6 +85,16 @@
Closed: Closed:
= milestone.issues_visible_to_user(current_user).closed.count = milestone.issues_visible_to_user(current_user).closed.count
.block.time_spent
.sidebar-collapsed-icon
%strong
= custom_icon('icon_clock_o')
%span= milestone.human_total_time_spent
.title.hide-collapsed
Total time spent
.value.hide-collapsed
= milestone.human_total_time_spent
.block.merge-requests .block.merge-requests
.sidebar-collapsed-icon .sidebar-collapsed-icon
%strong %strong
......
...@@ -190,4 +190,37 @@ describe GlobalMilestone do ...@@ -190,4 +190,37 @@ describe GlobalMilestone do
end end
end end
end end
describe '#total_time_spent' do
let(:milestone1_project1) { create(:milestone, title: "Milestone v1.2", project: project1) }
let(:milestone1_project2) { create(:milestone, title: "Milestone v1.2", project: project2) }
let(:issue1) { create(:issue, milestone: milestone1_project1) }
let(:issue2) { create(:issue, milestone: milestone1_project2) }
let(:merge_request1) { create(:merge_request, milestone: milestone1_project1) }
let(:merge_request2) { create(:merge_request, milestone: milestone1_project2) }
before do
milestones =
[
milestone1_project1,
milestone1_project2
]
milestones_relation = Milestone.where(id: milestones.map(&:id))
@global_milestone = described_class.new(milestone1_project1.title, milestones_relation)
end
it 'calculates total time spent' do
issue1.spend_time(duration: 300, user: user)
issue1.save!
issue2.spend_time(duration: 600, user: user2)
issue2.save!
merge_request1.spend_time(duration: 200, user: user)
merge_request1.save!
merge_request2.spend_time(duration: 100, user: user2)
merge_request2.save!
expect(@global_milestone.total_time_spent).to eq(1200)
end
end
end end
...@@ -284,4 +284,27 @@ describe Milestone do ...@@ -284,4 +284,27 @@ describe Milestone do
expect(milestone.participants).to eq [user] expect(milestone.participants).to eq [user]
end end
end end
describe '#total_time_spent' do
let(:user) { build(:user) }
let(:project) { build(:project, name: 'sample-project') }
let(:milestone) { build(:milestone, iid: 1, project: project) }
let(:issue1) { build(:issue, milestone: milestone) }
let(:issue2) { build(:issue, milestone: milestone) }
let(:merge_request1) { build(:merge_request, milestone: milestone) }
let(:merge_request2) { build(:merge_request, milestone: milestone) }
it 'calculates total time spent' do
issue1.spend_time(duration: 300, user: user)
issue1.save!
issue2.spend_time(duration: 600, user: user)
issue2.save!
merge_request1.spend_time(duration: 200, user: user)
merge_request1.save!
merge_request2.spend_time(duration: 100, user: user)
merge_request2.save!
expect(milestone.total_time_spent).to eq(1200)
end
end
end end
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