def test_can_have_two_markers(self): changes = [ BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), ] aggregated = self.aggregate(changes, interval=timedelta(hours=1)) self.assert_length(2, aggregated) self.assert_equals(0, aggregated[0].remaining_time) self.assert_equals(0, aggregated[1].remaining_time)
def _record_value_change(self, sprint, point_change, component=None, fieldname=Key.REMAINING_TIME): if fieldname == Key.STORY_POINTS: change = BurndownDataChange.remaining_points_entry(self.env, point_change, sprint, now()) else: change = BurndownDataChange.remaining_time_entry(self.env, point_change, sprint, now()) if component is not None and AgiloConfig(self.env).is_filtered_burndown_enabled(): change.update_marker(Key.COMPONENT, component) change.save()
def change(self, time_delta, how_much, type=None, scope=None, marker_key=None, marker_value=True): instance = BurndownDataChange(self.env).update_values( type= type or BurndownDataConstants.REMAINING_TIME, scope=getattr(scope, 'name', self.sprint.name), when= now() + time_delta, delta=how_much, ) if marker_key is not None: instance.update_marker(marker_key, marker_value) return instance
def test_only_changes_surrounded_with_markers_(self): changes = [ BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), self.change(timedelta(), 10), self.change(timedelta(), 10), self.change(timedelta(), 10), BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), ] aggregated = self.aggregate(changes, interval=timedelta(hours=1)) self.assert_length(2, aggregated) self.assert_equals(0, aggregated[0].remaining_time) self.assert_equals(30, aggregated[1].remaining_time)
def test_can_have_normal_intersection_of_entries(self): changes = [ self.change(timedelta(minutes=-1), 10), BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), self.change(timedelta(), 10), BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), self.change(timedelta(minutes=1), 10), ] aggregated = self.aggregate(changes) self.assert_length(4, aggregated) self.assert_equals(10, aggregated[0].remaining_time) self.assert_equals(10, aggregated[1].remaining_time) self.assert_equals(20, aggregated[2].remaining_time) # this is the jump self.assert_equals(30, aggregated[3].remaining_time)
def test_only_changes_surrounded_with_markers_(self): changes = [ BurndownDataChange.create_aggregation_skip_marker( self.env, self.sprint_name()), self.change(timedelta(), 10), self.change(timedelta(), 10), self.change(timedelta(), 10), BurndownDataChange.create_aggregation_skip_marker( self.env, self.sprint_name()), ] aggregated = self.aggregate(changes, interval=timedelta(hours=1)) self.assert_length(2, aggregated) self.assert_equals(0, aggregated[0].remaining_time) self.assert_equals(30, aggregated[1].remaining_time)
def change(self, time_delta, how_much, type=None, scope=None, marker_key=None, marker_value=True): instance = BurndownDataChange(self.env).update_values( type=type or BurndownDataConstants.REMAINING_TIME, scope=getattr(scope, 'name', self.sprint.name), when=now() + time_delta, delta=how_much, ) if marker_key is not None: instance.update_marker(marker_key, marker_value) return instance
def _record_value_change(self, sprint, point_change, component=None, fieldname=Key.REMAINING_TIME): if fieldname == Key.STORY_POINTS: change = BurndownDataChange.remaining_points_entry( self.env, point_change, sprint, now()) else: change = BurndownDataChange.remaining_time_entry( self.env, point_change, sprint, now()) if component is not None and AgiloConfig( self.env).is_filtered_burndown_enabled(): change.update_marker(Key.COMPONENT, component) change.save()
def test_can_have_normal_intersection_of_entries(self): changes = [ self.change(timedelta(minutes=-1), 10), BurndownDataChange.create_aggregation_skip_marker( self.env, self.sprint_name()), self.change(timedelta(), 10), BurndownDataChange.create_aggregation_skip_marker( self.env, self.sprint_name()), self.change(timedelta(minutes=1), 10), ] aggregated = self.aggregate(changes) self.assert_length(4, aggregated) self.assert_equals(10, aggregated[0].remaining_time) self.assert_equals(10, aggregated[1].remaining_time) self.assert_equals(20, aggregated[2].remaining_time) # this is the jump self.assert_equals(30, aggregated[3].remaining_time)
def create_change(self, delta=23, marker_key=None, marker_value=None, **kwargs): change = BurndownDataChange(self.env) change.type = BurndownDataConstants.REMAINING_TIME change.scope = self.sprint.name change.when = now() change.set_delta(delta) for key, value in kwargs.items(): setattr(change, key, value) if marker_key is not None: change.update_marker(marker_key, marker_value) return change
def test_can_have_skip_marker_as_first_entry(self): changes = [ BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), self.change(timedelta(minutes=1), 10), self.change(timedelta(minutes=30), 10), ] aggregated = self.aggregate(changes) self.assert_length(2, aggregated) self.assert_equals(0, aggregated[0].remaining_time) self.assert_equals(20, aggregated[1].remaining_time)
def test_can_have_skip_marker_as_first_entry(self): changes = [ BurndownDataChange.create_aggregation_skip_marker( self.env, self.sprint_name()), self.change(timedelta(minutes=1), 10), self.change(timedelta(minutes=30), 10), ] aggregated = self.aggregate(changes) self.assert_length(2, aggregated) self.assert_equals(0, aggregated[0].remaining_time) self.assert_equals(20, aggregated[1].remaining_time)
def test_can_add_additional_points_when_agregation_is_disabled_with_marker(self): changes = [ self.change(timedelta(minutes=-30), 0), self.change(timedelta(minutes=-1), 10), BurndownDataChange.create_aggregation_skip_marker(self.env, self.sprint_name()), self.change(timedelta(minutes=1), 10), self.change(timedelta(minutes=30), 10), ] aggregated = self.aggregate(changes) self.assert_length(3, aggregated) self.assert_equals(0, aggregated[0].remaining_time) self.assert_equals(10, aggregated[1].remaining_time) self.assert_equals(30, aggregated[2].remaining_time)
def test_can_add_additional_points_when_agregation_is_disabled_with_marker( self): changes = [ self.change(timedelta(minutes=-30), 0), self.change(timedelta(minutes=-1), 10), BurndownDataChange.create_aggregation_skip_marker( self.env, self.sprint_name()), self.change(timedelta(minutes=1), 10), self.change(timedelta(minutes=30), 10), ] aggregated = self.aggregate(changes) self.assert_length(3, aggregated) self.assert_equals(0, aggregated[0].remaining_time) self.assert_equals(10, aggregated[1].remaining_time) self.assert_equals(30, aggregated[2].remaining_time)
def _add_marker_if_neccessary(self, sprint_name): if sprint_name is None: return BurndownDataChange.create_aggregation_skip_marker( self.env, sprint_name).save()
def _add_marker_if_neccessary(self, sprint_name): if sprint_name is None: return BurndownDataChange.create_aggregation_skip_marker(self.env, sprint_name).save()