summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Andrinopoulos <geoandri@gmail.com>2017-10-29 22:58:49 +0200
committerWinnie Hellmann <winnie@gitlab.com>2017-11-13 15:04:11 +0100
commit0c7bd98d13410586eaf2be5fe7988b28932c367a (patch)
tree950eb4dc71f4dde0c481014b5806643af91a4a29
parent9b1e9da986267e3d5c910ca523d67f40be7b4878 (diff)
downloadgitlab-ce-0c7bd98d13410586eaf2be5fe7988b28932c367a.tar.gz
Add total time spent to milestones
-rw-r--r--app/models/global_milestone.rb8
-rw-r--r--app/models/milestone.rb8
-rw-r--r--app/views/shared/milestones/_sidebar.html.haml10
-rw-r--r--spec/models/global_milestone_spec.rb33
-rw-r--r--spec/models/milestone_spec.rb23
5 files changed, 82 insertions, 0 deletions
diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb
index c0864769314..af4780f78d0 100644
--- a/app/models/global_milestone.rb
+++ b/app/models/global_milestone.rb
@@ -152,4 +152,12 @@ class GlobalMilestone
@milestones.first.start_date
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
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 47e6b785c39..5e174a15c91 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -213,6 +213,14 @@ class Milestone < ActiveRecord::Base
project_id.present?
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
# Milestone titles must be unique across project milestones and group milestones
diff --git a/app/views/shared/milestones/_sidebar.html.haml b/app/views/shared/milestones/_sidebar.html.haml
index f03e0ab154c..6267151f460 100644
--- a/app/views/shared/milestones/_sidebar.html.haml
+++ b/app/views/shared/milestones/_sidebar.html.haml
@@ -85,6 +85,16 @@
Closed:
= 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
.sidebar-collapsed-icon
%strong
diff --git a/spec/models/global_milestone_spec.rb b/spec/models/global_milestone_spec.rb
index ab58f5c5021..4874dcbd58e 100644
--- a/spec/models/global_milestone_spec.rb
+++ b/spec/models/global_milestone_spec.rb
@@ -190,4 +190,37 @@ describe GlobalMilestone do
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
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index 13e37fffa4e..10c24317574 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -284,4 +284,27 @@ describe Milestone do
expect(milestone.participants).to eq [user]
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