Skip to content

Commit

Permalink
Cycle time distribution chart added
Browse files Browse the repository at this point in the history
Closes #3
  • Loading branch information
cmheisel committed Aug 23, 2011
1 parent c3c1674 commit 9b24300
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 5 deletions.
3 changes: 2 additions & 1 deletion kardboard/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ def get_app():
app.jinja_env.filters['slugify'] = slugify
app.jinja_env.filters['timesince'] = timesince


configure_logging(app)

return app
Expand All @@ -51,6 +50,8 @@ def url(url_rule, import_name, **options):
url('/chart/throughput/<int:months>/', 'chart_throughput')
url('/chart/cycle/', 'chart_cycle')
url('/chart/cycle/<int:months>/', 'chart_cycle')
url('/chart/cycle/distribution/', 'chart_cycle_distribution')
url('/chart/cycle/distribution/<int:months>/', 'chart_cycle_distribution')
url('/chart/cycle/from/<int:year>/<int:month>/<int:day>/', 'chart_cycle')
url('/chart/flow/', 'chart_flow')
url('/chart/flow/<int:months>/', 'chart_flow')
Expand Down
10 changes: 9 additions & 1 deletion kardboard/charts.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import requests

from pygooglechart import StackedVerticalBarChart, SimpleLineChart, Axis
from pygooglechart import StackedVerticalBarChart, SimpleLineChart, Axis, PieChart2D


class KardboardChartMixer(object):
Expand Down Expand Up @@ -117,3 +117,11 @@ def setup_grid(self, dataset):
self.add_fill_range("F4C3B7", 0, 1)
self.add_fill_range("FFE0B2", 1, 2)
self.add_fill_range("B7DFB9", 2, 3)


class CycleDistributionChart(PieChart2D):
def __init__(self, *args, **kwargs):
super(CycleDistributionChart, self).__init__(*args, **kwargs)

self.colours = ['3366CC', 'DC3912', 'FF9900', '109618', '990099', '0099C6', 'DD4477']
self.set_colours(self.colours)
29 changes: 29 additions & 0 deletions kardboard/templates/chart-cycle-distro.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{% extends "base.html" %}

{% block content %}

{% if not error %}
<img src="{{ chart.get_url() }}" />
{% endif %}

<div id="wip_data">
{% if error %}
<h3>{{ error }}</h3>
{% else %}
<table>
<tr>
<th>Range</th>
<th>% of cards</th>
</tr>

{% for row in distro %}
<tr class="{{ loop.cycle('odd', 'even') }}">
<td>{{ row[0] }}</td>
<td>{{ "%.0f%%"|format(row[1]*100) }}</td>
</tr>
{% endfor %}
</table>
{% endif %}

</div>
{% endblock %}
1 change: 1 addition & 0 deletions kardboard/templates/charts.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<p class="nav">
<a href="/chart/throughput/">Throughput</a> /
<a href="/chart/cycle/">Cycle Time History</a> /
<a href="/chart/cycle/distribution/">Cycle Time Distribution</a> /
<a href="/chart/flow/">Cumulative Flow</a>
</p>
{% endblock %}
27 changes: 27 additions & 0 deletions kardboard/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1009,6 +1009,33 @@ def test_throughput(self):
self.assertEqual(200, res.status_code)


class CycleDistributionTests(KardboardTestCase):
def _get_target_url(self, months=None):
base_url = '/chart/cycle/distribution/'
if months:
base_url = base_url = "%s/" % months
return base_url

def setUp(self):
super(CycleDistributionTests, self).setUp()

for i in xrange(0, 30):
today = datetime.datetime.now()
backlog_date = today - relativedelta(days=2 + i)
start_date = today - relativedelta(days=1 + i)
done_date = today
k = self.make_card(
backlog_date=backlog_date,
start_date=start_date,
done_date=done_date,)
k.save()

def test_distribution(self):
target_url = self._get_target_url()
res = self.app.get(target_url)
self.assertEqual(200, res.status_code)


class CycleTimeHistoryTests(DashboardTestCase):
def setUp(self):
super(CycleTimeHistoryTests, self).setUp()
Expand Down
58 changes: 55 additions & 3 deletions kardboard/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

from kardboard.version import VERSION
from kardboard.app import app
from kardboard.models import Kard, DailyRecord
from kardboard.models import Kard, DailyRecord, Q
from kardboard.forms import get_card_form, _make_choice_field_ready
from kardboard.util import (
month_range,
Expand All @@ -30,7 +30,8 @@
from kardboard.charts import (
ThroughputChart,
MovingCycleTimeChart,
CumulativeFlowChart
CumulativeFlowChart,
CycleDistributionChart
)


Expand Down Expand Up @@ -475,6 +476,57 @@ def chart_cycle(months=6, year=None, month=None, day=None):
return render_template('chart-cycle.html', **context)


def chart_cycle_distribution(months=3):
ranges = (
(0, 4, "< 5 days"),
(5, 10, "5-10 days"),
(11, 15, "11-15 days"),
(16, 20, "16-20 days"),
(21, 25, "21-25 days"),
(26, 30, "26-30 days",),
(31, 9999, "> 30 days"),
)
today = datetime.datetime.today()
start_day = today - relativedelta.relativedelta(months=months)
start_day = make_start_date(date=start_day)
end_day = make_end_date(date=today)

context = {
'title': "How quick can we do it?",
'updated_at': datetime.datetime.now(),
'version': VERSION,
}

query = Q(done_date__gte=start_day) & Q(done_date__lte=end_day)
total = Kard.objects.filter(query).count()
if total == 0:
context = {
'error': "Zero cards were completed in the past %s months" % months
}
return render_template('chart-cycle-distro.html', **context)

distro = []
for row in ranges:
lower, upper, label = row
query = Q(done_date__gte=start_day) & Q(done_date__lte=end_day) & \
Q(_cycle_time__gte=lower) & Q(_cycle_time__lte=upper)
pct = Kard.objects.filter(query).count() / float(total)
distro.append((label, pct))

chart = CycleDistributionChart(700, 400)
chart.add_data([r[1] for r in distro])
chart.set_pie_labels([r[0] for r in distro])
context = {
'data': distro,
'chart': chart,
'title': "How quick can we do it?",
'updated_at': datetime.datetime.now(),
'distro': distro,
'version': VERSION,
}
return render_template('chart-cycle-distro.html', **context)


def robots():
response = make_response(render_template('robots.txt'))
content_type = response.headers['Content-type']
Expand Down Expand Up @@ -508,4 +560,4 @@ def chart_flow(months=3, end=None):
'version': VERSION,
}

return render_template('chart-flow.html', **context)
return render_template('chart-flow.html', **context)

0 comments on commit 9b24300

Please sign in to comment.