def scrumboard_chart_burndown(sprint): from scrumboard.models import Event timetable = Event.get_events_timetable(sprint) from datetime import timedelta, date def daterange(start_date, end_date): for n in range(int((end_date - start_date).days)): yield start_date + timedelta(n) def iso_date(single_date): return single_date.strftime("%Y-%m-%d") tomorrow = date.today() + timedelta(days=1) labels1 = [iso_date(single_date) for single_date in daterange(sprint.start_date, tomorrow)] # TODO: if not single_date in sprint.excluded_days() labels2 = [iso_date(single_date) for single_date in daterange(tomorrow, sprint.end_date + timedelta(days=1))] from itertools import accumulate dataset_burndown = list(accumulate([sum(timetable[l]) for l in labels1])) sprint_length = int((sprint.end_date - sprint.start_date).days) # TODO: sprint.length() that takes free days into account dataset_prognosis = [sprint.capacity*(1.0 - x/sprint_length) for x in range(sprint_length)] + [0] return {'sprint': sprint, 'labels': labels1 + labels2, 'dataset_burndown': dataset_burndown, 'dataset_prognosis': dataset_prognosis}
def test_events_can_be_fetched_ordered_by_date(self): more_changes = [("2015-05-01", 3), ("2015-05-02", 5), ("2015-05-09", -8)] events = self.create_events(self.sprint, self.changes + more_changes) assert len(events) == len(Event.get_events(self.sprint)) timetable = Event.get_events_timetable(self.sprint) assert 2 == len(timetable["2015-05-01"]) assert -2 == sum(timetable["2015-05-01"])