summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2017-01-18 15:49:22 +0000
committerDouwe Maan <douwe@gitlab.com>2017-01-18 15:49:22 +0000
commitf208897ccbdb539eb16a72d32cce68881eaffca7 (patch)
tree1b731e73ac9bc08757c29f1fc157617221eb612c /app/models
parent5e9196b3bcc31ce7fd698ed49af5d39eae1da630 (diff)
parent63b36241945a7f9bb280f360b3b269de8c5be8f6 (diff)
downloadgitlab-ce-f208897ccbdb539eb16a72d32cce68881eaffca7.tar.gz
Merge branch 'backport-time-tracking-ce' into 'master'
Backport timetracking to CE See merge request !8195
Diffstat (limited to 'app/models')
-rw-r--r--app/models/concerns/issuable.rb1
-rw-r--r--app/models/concerns/time_trackable.rb58
-rw-r--r--app/models/timelog.rb6
3 files changed, 65 insertions, 0 deletions
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 5e63825bf99..3517969eabc 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -13,6 +13,7 @@ module Issuable
include StripAttribute
include Awardable
include Taskable
+ include TimeTrackable
included do
cache_markdown_field :title, pipeline: :single_line
diff --git a/app/models/concerns/time_trackable.rb b/app/models/concerns/time_trackable.rb
new file mode 100644
index 00000000000..6fa2af4e4e6
--- /dev/null
+++ b/app/models/concerns/time_trackable.rb
@@ -0,0 +1,58 @@
+# == TimeTrackable concern
+#
+# Contains functionality related to objects that support time tracking.
+#
+# Used by Issue and MergeRequest.
+#
+
+module TimeTrackable
+ extend ActiveSupport::Concern
+
+ included do
+ attr_reader :time_spent
+
+ alias_method :time_spent?, :time_spent
+
+ default_value_for :time_estimate, value: 0, allows_nil: false
+
+ has_many :timelogs, as: :trackable, dependent: :destroy
+ end
+
+ def spend_time(seconds, user)
+ return if seconds == 0
+
+ @time_spent = seconds
+ @time_spent_user = user
+
+ if seconds == :reset
+ reset_spent_time
+ else
+ add_or_subtract_spent_time
+ end
+ end
+
+ def total_time_spent
+ timelogs.sum(:time_spent)
+ end
+
+ def human_total_time_spent
+ Gitlab::TimeTrackingFormatter.output(total_time_spent)
+ end
+
+ def human_time_estimate
+ Gitlab::TimeTrackingFormatter.output(time_estimate)
+ end
+
+ private
+
+ def reset_spent_time
+ timelogs.new(time_spent: total_time_spent * -1, user: @time_spent_user)
+ end
+
+ def add_or_subtract_spent_time
+ # Exit if time to subtract exceeds the total time spent.
+ return if time_spent < 0 && (time_spent.abs > total_time_spent)
+
+ timelogs.new(time_spent: time_spent, user: @time_spent_user)
+ end
+end
diff --git a/app/models/timelog.rb b/app/models/timelog.rb
new file mode 100644
index 00000000000..f768c4e3da5
--- /dev/null
+++ b/app/models/timelog.rb
@@ -0,0 +1,6 @@
+class Timelog < ActiveRecord::Base
+ validates :time_spent, :user, presence: true
+
+ belongs_to :trackable, polymorphic: true
+ belongs_to :user
+end