115
115
def _find_milestones(self, project):
117
Return list of milestones in a project. Filter list by active status.
118
If the config `default_milestone` is set filter by that instead.
117
Return list of active milestones in a project. If the config
118
`default_milestone` is set filter by that. If not found, an
119
empty list will be returned.
120
121
default = self.config["default_milestone"]
122
for milestone in project.all_milestones:
123
if default is not None:
124
if milestone.name == default:
125
milestones.append(milestone)
129
if not milestone.is_active:
131
milestones.append(milestone)
132
if default is not None and not len(milestones):
133
self.logger.warning("Default Milestone not found: %s" % default)
123
return list(project.active_milestones)
124
for milestone in project.active_milestones:
125
if milestone.name == default:
127
self.logger.warning("Default Milestone not found: %s" % default)
137
130
def _find_target_milestone(self, project, now):
139
132
Find a target milestone when resolving a bug task.
141
134
Compare the selected datetime `now` to the list of milestones.
142
Return the milestone who's `targeted_date` is newer than the given
135
Return the milestone where `targeted_date` is newer than the given
143
136
datetime. If the given time is greater than all open milestones:
144
137
target to the newest milestone in the list.
152
145
2) least lexically sorting milestone (by name)
153
146
3) the last milestone in the list (covers len()==1 case).
155
# _find_milestones will take care of only getting 'active' milestones
156
# and the short-circuit case of the user config specifying the milestone
157
148
milestones = self._find_milestones(project)
158
if len(milestones) == 0:
161
# Purpose here is to Move all milestones with no date to the end of the
162
# list in lexical order.
149
earliest_after = latest_before = untargeted = None
165
150
for milestone in milestones:
166
151
if milestone.date_targeted is None:
167
name_milestones.append(milestone)
169
date_milestones.append(milestone)
170
milestones = sorted(date_milestones, key=lambda x: x.date_targeted)
171
milestones.extend(sorted(name_milestones, key=lambda x: x.name))
152
if untargeted is not None:
153
if milestone.name < untargeted.name:
154
untargeted = milestone
156
untargeted = milestone
157
elif milestone.date_targeted > now:
158
if earliest_after is not None:
159
if earliest_after.date_targeted > milestone.date_targeted:
160
earliest_after = milestone
162
earliest_after = milestone
163
elif milestone.date_targeted < now:
164
if latest_before is not None:
165
if latest_before.date_targeted < milestone.date_targeted:
166
latest_before = milestone
168
latest_before = milestone
173
previous_milestone = milestones[0]
174
if previous_milestone.date_targeted is None or \
175
now < previous_milestone.date_targeted:
176
return previous_milestone
177
for milestone in milestones:
178
if now > previous_milestone.date_targeted:
179
if milestone.date_targeted is None or \
180
now < milestone.date_targeted:
182
previous_milestone = milestone
183
return milestones[-1]
170
if earliest_after is not None:
171
return earliest_after
172
elif untargeted is not None:
186
178
tarmac_hooks['tarmac_post_commit'].hook(BugResolver(), 'Bug resolver')