Extend open reviews report with submitters queues

The report now also shows the longest waiting line for submitters.

Change-Id: I9d1e9a3023502aaf882f5b7aa19dd2b528820c35
This commit is contained in:
Ilya Shakhat
2014-12-26 15:10:46 +03:00
parent 3f3d6eebe2
commit 8f6a3eb80c
3 changed files with 82 additions and 18 deletions

View File

@@ -101,22 +101,40 @@ def open_reviews(module):
memory_storage_inst.get_record_ids_by_types(['review']))
waiting_on_reviewer = []
waiting_on_submitter = []
total_open = 0
for review in memory_storage_inst.get_records(review_ids):
if review.status == 'NEW':
total_open += 1
# review.value is minimum from votes made for the latest patch
if review.value in [1, 2]:
waiting_on_reviewer.append(vault.extend_record(review))
# CI or engineer liked this change request, waiting for someone
# to merge or to put dislike
waiting_on_reviewer.append(helpers.extend_record(review))
elif review.value in [-1, -2]:
# CI or reviewer do not like this, waiting for submitter to fix
waiting_on_submitter.append(helpers.extend_record(review))
else:
# new requests without votes, waiting for CI
pass
return {
'module': module,
'total_open': total_open,
'waiting_on_reviewer': len(waiting_on_reviewer),
'waiting_on_submitter': total_open - len(waiting_on_reviewer),
'latest_revision': _process_stat(
'waiting_on_submitter': len(waiting_on_submitter),
'waiting_on_ci': (total_open - len(waiting_on_reviewer) -
len(waiting_on_submitter)),
'reviewer_latest_revision': _process_stat(
waiting_on_reviewer, 'updated_on', time_now),
'first_revision': _process_stat(waiting_on_reviewer, 'date', time_now),
'reviewer_first_revision': _process_stat(
waiting_on_reviewer, 'date', time_now),
'submitter_latest_revision': _process_stat(
waiting_on_submitter, 'updated_on', time_now),
'submitter_first_revision': _process_stat(
waiting_on_submitter, 'date', time_now),
}

View File

@@ -7,8 +7,18 @@ Open change requests report for {{ module }}
{% block scripts %}
<script type="text/javascript">
$(document).ready(function () {
renderBarChart("latest_revision_chart", [{{ latest_revision.chart_data }}]);
renderBarChart("first_revision_chart", [{{ first_revision.chart_data }}]);
{% if reviewer_latest_revision.chart_data %}
renderBarChart("reviewer_latest_revision_chart", [{{ reviewer_latest_revision.chart_data }}]);
{% endif %}
{% if reviewer_first_revision.chart_data %}
renderBarChart("reviewer_first_revision_chart", [{{ reviewer_first_revision.chart_data }}]);
{% endif %}
{% if submitter_latest_revision.chart_data %}
renderBarChart("submitter_latest_revision_chart", [{{ submitter_latest_revision.chart_data }}]);
{% endif %}
{% if submitter_first_revision.chart_data %}
renderBarChart("submitter_first_revision_chart", [{{ submitter_first_revision.chart_data }}]);
{% endif %}
});
</script>
{% endblock %}
@@ -21,40 +31,77 @@ Open change requests report for {{ module }}
<li>Total open reviews: {{ total_open }}</li>
<li>Waiting on submitter: {{ waiting_on_submitter }}</li>
<li>Waiting on reviewer: {{ waiting_on_reviewer }}</li>
<li>Waiting on CI (no votes yet): {{ waiting_on_ci }}</li>
</ul>
{% if waiting_on_reviewer %}
<h3>Change requests waiting for reviewers since the last vote or mark</h3>
<ul>
<li>Average wait time: {{ latest_revision.average }}</li>
<li>Max wait time: {{ latest_revision.max }}</li>
<li>Average wait time: {{ reviewer_latest_revision.average }}</li>
<li>Max wait time: {{ reviewer_latest_revision.max }}</li>
</ul>
<div id="latest_revision_chart" style="width: 100%; height: 350px;"></div>
<div id="reviewer_latest_revision_chart" style="width: 100%; height: 350px;"></div>
<ol>
{% for item in latest_revision.reviews[:5] %}
<li>{{ item.updated_on_age }} <a href="{{ item.url }}">{{ item.url }}</a> {{ item.subject }} by {{ item.author_name }} ({{ item.company_name }})</li>
{% for item in reviewer_latest_revision.reviews[:5] %}
<li>{{ item.updated_on_age }} <a href="{{ item.url }}">{{ item.url }}</a> {{ item.subject }} by {{ item.author_link|safe }} ({{ item.company_link|safe }})</li>
{% endfor %}
</ol>
<h3>Change requests waiting for reviewers since the creation date</h3>
<ul>
<li>Average wait time: {{ first_revision.average }}</li>
<li>Max wait time: {{ first_revision.max }}</li>
<li>Average wait time: {{ reviewer_first_revision.average }}</li>
<li>Max wait time: {{ reviewer_first_revision.max }}</li>
</ul>
<div id="first_revision_chart" style="width: 100%; height: 350px;"></div>
<div id="reviewer_first_revision_chart" style="width: 100%; height: 350px;"></div>
<ol>
{% for item in first_revision.reviews[:5] %}
<li>{{ item.date_age }} <a href="{{ item.url }}">{{ item.url }}</a> {{ item.subject }} by {{ item.author_name }} ({{ item.company_name }})</li>
{% for item in reviewer_first_revision.reviews[:5] %}
<li>{{ item.date_age }} <a href="{{ item.url }}">{{ item.url }}</a> {{ item.subject }} by {{ item.author_link|safe }} ({{ item.company_link|safe }})</li>
{% endfor %}
</ol>
{% else %}
<h3>No change requests waiting for reviewers</h3>
{% endif %}
{% if waiting_on_submitter %}
<h3>Change requests waiting for submitters since the last vote or mark</h3>
<ul>
<li>Average wait time: {{ submitter_latest_revision.average }}</li>
<li>Max wait time: {{ submitter_latest_revision.max }}</li>
</ul>
<div id="submitter_latest_revision_chart" style="width: 100%; height: 350px;"></div>
<ol>
{% for item in submitter_latest_revision.reviews[:5] %}
<li>{{ item.updated_on_age }} <a href="{{ item.url }}">{{ item.url }}</a> {{ item.subject }} by {{ item.author_link|safe }} ({{ item.company_link|safe }})</li>
{% endfor %}
</ol>
<h3>Change requests waiting for submitters since the creation date</h3>
<ul>
<li>Average wait time: {{ submitter_first_revision.average }}</li>
<li>Max wait time: {{ submitter_first_revision.max }}</li>
</ul>
<div id="submitter_first_revision_chart" style="width: 100%; height: 350px;"></div>
<ol>
{% for item in submitter_first_revision.reviews[:5] %}
<li>{{ item.date_age }} <a href="{{ item.url }}">{{ item.url }}</a> {{ item.subject }} by {{ item.author_link|safe }} ({{ item.company_link|safe }})</li>
{% endfor %}
</ol>
{% else %}
<h3>No change requests waiting for submitters</h3>
{% endif %}
{% endblock %}

View File

@@ -195,8 +195,7 @@ def format_text(s):
def make_age_string(seconds):
days = seconds / (3600 * 24)
hours = (seconds / 3600) - (days * 24)
minutes = (seconds / 60) - (days * 24 * 60) - (hours * 60)
return '%d days, %d hours, %d minutes' % (days, hours, minutes)
return '%d days and %d hours' % (days, hours)
def merge_records(original, new):