Module: Milestoneish

Included in:
Milestone
Defined in:
app/models/concerns/milestoneish.rb

Constant Summary collapse

DISPLAY_ISSUES_LIMIT =
500

Instance Method Summary collapse

Instance Method Details

#closed_issues_countObject



10
11
12
# File 'app/models/concerns/milestoneish.rb', line 10

def closed_issues_count
  @close_issues_count ||= Milestones::ClosedIssuesCountService.new(self).count
end

#complete?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'app/models/concerns/milestoneish.rb', line 22

def complete?
  total_issues_count > 0 && total_issues_count == closed_issues_count
end

#elapsed_daysObject



38
39
40
41
42
# File 'app/models/concerns/milestoneish.rb', line 38

def elapsed_days
  return 0 if !start_date || start_date.future?

  (Date.today - start_date).to_i
end

#expiredObject



105
106
107
# File 'app/models/concerns/milestoneish.rb', line 105

def expired
  expired? || false
end

#expired?Boolean

Returns:

  • (Boolean)


101
102
103
# File 'app/models/concerns/milestoneish.rb', line 101

def expired?
  due_date && due_date.past?
end

#expires_atObject



91
92
93
94
95
96
97
98
99
# File 'app/models/concerns/milestoneish.rb', line 91

def expires_at
  if due_date
    if due_date.past?
      "expired on #{due_date.to_fs(:medium)}"
    else
      "expires on #{due_date.to_fs(:medium)}"
    end
  end
end

#human_total_time_estimateObject



121
122
123
# File 'app/models/concerns/milestoneish.rb', line 121

def human_total_time_estimate
  Gitlab::TimeTrackingFormatter.output(total_time_estimate)
end

#human_total_time_spentObject



113
114
115
# File 'app/models/concerns/milestoneish.rb', line 113

def human_total_time_spent
  Gitlab::TimeTrackingFormatter.output(total_time_spent)
end

#issue_labels_visible_by_user(user) ⇒ Object



58
59
60
61
62
# File 'app/models/concerns/milestoneish.rb', line 58

def issue_labels_visible_by_user(user)
  Label.joins(:label_links)
    .where('label_links.target_id' => issues_visible_to_user(user).select(:id), 'label_links.target_type' => 'Issue')
    .distinct
end

#issue_participants_visible_by_user(user) ⇒ Object



51
52
53
54
55
56
# File 'app/models/concerns/milestoneish.rb', line 51

def issue_participants_visible_by_user(user)
  User.joins(:issue_assignees)
    .where('issue_assignees.issue_id' => issues_visible_to_user(user).select(:id))
    .allow_cross_joins_across_databases(url: "https://gitlab.com/gitlab-org/gitlab/-/issues/417457")
    .distinct
end

#issues_visible_to_user(user) ⇒ Object



44
45
46
47
48
49
# File 'app/models/concerns/milestoneish.rb', line 44

def issues_visible_to_user(user)
  memoize_per_user(user, :issues_visible_to_user) do
    IssuesFinder.new(user, issues_finder_params)
      .execute.preload(:assignees).where(milestone_id: milestoneish_id)
  end
end

#merge_requests_visible_to_user(user) ⇒ Object



80
81
82
83
84
85
# File 'app/models/concerns/milestoneish.rb', line 80

def merge_requests_visible_to_user(user)
  memoize_per_user(user, :merge_requests_visible_to_user) do
    MergeRequestsFinder.new(user, issues_finder_params)
      .execute.where(milestone_id: milestoneish_id)
  end
end

#opened_issues_countObject



14
15
16
# File 'app/models/concerns/milestoneish.rb', line 14

def opened_issues_count
  total_issues_count - closed_issues_count
end

#percent_completeObject



26
27
28
29
30
# File 'app/models/concerns/milestoneish.rb', line 26

def percent_complete
  closed_issues_count * 100 / total_issues_count
rescue ZeroDivisionError
  0
end

#remaining_daysObject



32
33
34
35
36
# File 'app/models/concerns/milestoneish.rb', line 32

def remaining_days
  return 0 if !due_date || expired?

  (due_date - Date.today).to_i
end

#sorted_issues(user) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
# File 'app/models/concerns/milestoneish.rb', line 64

def sorted_issues(user)
  # This method is used on milestone view to filter opened assigned, opened unassigned and closed issues columns.
  # We want a limit of DISPLAY_ISSUES_LIMIT for total issues present on all columns.
  limited_ids =
    issues_visible_to_user(user).sort_by_attribute('label_priority').limit(DISPLAY_ISSUES_LIMIT)

  Issue
    .where(id: Issue.select(:id).from(limited_ids))
    .preload_associated_models
    .sort_by_attribute('label_priority')
end

#sorted_merge_requests(user) ⇒ Object



76
77
78
# File 'app/models/concerns/milestoneish.rb', line 76

def sorted_merge_requests(user)
  merge_requests_visible_to_user(user).sort_by_attribute('label_priority')
end

#total_issues_countObject



6
7
8
# File 'app/models/concerns/milestoneish.rb', line 6

def total_issues_count
  @total_issues_count ||= Milestones::IssuesCountService.new(self).count
end

#total_merge_requests_countObject



18
19
20
# File 'app/models/concerns/milestoneish.rb', line 18

def total_merge_requests_count
  @total_merge_request_count ||= Milestones::MergeRequestsCountService.new(self).count
end

#total_time_estimateObject



117
118
119
# File 'app/models/concerns/milestoneish.rb', line 117

def total_time_estimate
  @total_time_estimate ||= issues.sum(:time_estimate) + merge_requests.sum(:time_estimate)
end

#total_time_spentObject



109
110
111
# File 'app/models/concerns/milestoneish.rb', line 109

def total_time_spent
  @total_time_spent ||= issues.joins(:timelogs).sum(:time_spent) + merge_requests.joins(:timelogs).sum(:time_spent)
end

#upcoming?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'app/models/concerns/milestoneish.rb', line 87

def upcoming?
  start_date && start_date.future?
end