summaryrefslogtreecommitdiff
path: root/app/models/global_milestone.rb
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-11-13 19:20:48 +0100
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2015-11-16 14:07:38 +0100
commit986695e136a8f6afa326048b30be77a9265d3bf7 (patch)
tree390e60bd0213b3c431094cfe71395be845b77714 /app/models/global_milestone.rb
parent05335a3c8584c48a9317bd0919eccee6948de742 (diff)
downloadgitlab-ce-986695e136a8f6afa326048b30be77a9265d3bf7.tar.gz
Refactor global and group milestones logic
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app/models/global_milestone.rb')
-rw-r--r--app/models/global_milestone.rb97
1 files changed, 97 insertions, 0 deletions
diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb
new file mode 100644
index 00000000000..f96e9d41c94
--- /dev/null
+++ b/app/models/global_milestone.rb
@@ -0,0 +1,97 @@
+class GlobalMilestone
+ attr_accessor :title, :milestones
+ alias_attribute :name, :title
+
+ def self.build_collection(milestones)
+ milestones = milestones.group_by(&:title)
+
+ milestones.map do |title, milestones|
+ new(title, milestones)
+ end
+ end
+
+ def initialize(title, milestones)
+ @title = title
+ @milestones = milestones
+ end
+
+ def safe_title
+ @title.parameterize
+ end
+
+ def projects
+ milestones.map { |milestone| milestone.project }
+ end
+
+ def issue_count
+ milestones.map { |milestone| milestone.issues.count }.sum
+ end
+
+ def merge_requests_count
+ milestones.map { |milestone| milestone.merge_requests.count }.sum
+ end
+
+ def open_items_count
+ milestones.map { |milestone| milestone.open_items_count }.sum
+ end
+
+ def closed_items_count
+ milestones.map { |milestone| milestone.closed_items_count }.sum
+ end
+
+ def total_items_count
+ milestones.map { |milestone| milestone.total_items_count }.sum
+ end
+
+ def percent_complete
+ ((closed_items_count * 100) / total_items_count).abs
+ rescue ZeroDivisionError
+ 0
+ end
+
+ def state
+ state = milestones.map { |milestone| milestone.state }
+
+ if state.count('closed') == state.size
+ 'closed'
+ else
+ 'active'
+ end
+ end
+
+ def active?
+ state == 'active'
+ end
+
+ def closed?
+ state == 'closed'
+ end
+
+ def issues
+ @issues ||= milestones.map(&:issues).flatten.group_by(&:state)
+ end
+
+ def merge_requests
+ @merge_requests ||= milestones.map(&:merge_requests).flatten.group_by(&:state)
+ end
+
+ def participants
+ @participants ||= milestones.map(&:participants).flatten.compact.uniq
+ end
+
+ def opened_issues
+ issues.values_at("opened", "reopened").compact.flatten
+ end
+
+ def closed_issues
+ issues['closed']
+ end
+
+ def opened_merge_requests
+ merge_requests.values_at("opened", "reopened").compact.flatten
+ end
+
+ def closed_merge_requests
+ merge_requests.values_at("closed", "merged", "locked").compact.flatten
+ end
+end