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:
@@ -101,22 +101,40 @@ def open_reviews(module):
|
|||||||
memory_storage_inst.get_record_ids_by_types(['review']))
|
memory_storage_inst.get_record_ids_by_types(['review']))
|
||||||
|
|
||||||
waiting_on_reviewer = []
|
waiting_on_reviewer = []
|
||||||
|
waiting_on_submitter = []
|
||||||
total_open = 0
|
total_open = 0
|
||||||
|
|
||||||
for review in memory_storage_inst.get_records(review_ids):
|
for review in memory_storage_inst.get_records(review_ids):
|
||||||
if review.status == 'NEW':
|
if review.status == 'NEW':
|
||||||
total_open += 1
|
total_open += 1
|
||||||
|
|
||||||
|
# review.value is minimum from votes made for the latest patch
|
||||||
if review.value in [1, 2]:
|
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 {
|
return {
|
||||||
'module': module,
|
'module': module,
|
||||||
'total_open': total_open,
|
'total_open': total_open,
|
||||||
'waiting_on_reviewer': len(waiting_on_reviewer),
|
'waiting_on_reviewer': len(waiting_on_reviewer),
|
||||||
'waiting_on_submitter': total_open - len(waiting_on_reviewer),
|
'waiting_on_submitter': len(waiting_on_submitter),
|
||||||
'latest_revision': _process_stat(
|
'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),
|
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),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -7,8 +7,18 @@ Open change requests report for {{ module }}
|
|||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
renderBarChart("latest_revision_chart", [{{ latest_revision.chart_data }}]);
|
{% if reviewer_latest_revision.chart_data %}
|
||||||
renderBarChart("first_revision_chart", [{{ first_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>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -21,40 +31,77 @@ Open change requests report for {{ module }}
|
|||||||
<li>Total open reviews: {{ total_open }}</li>
|
<li>Total open reviews: {{ total_open }}</li>
|
||||||
<li>Waiting on submitter: {{ waiting_on_submitter }}</li>
|
<li>Waiting on submitter: {{ waiting_on_submitter }}</li>
|
||||||
<li>Waiting on reviewer: {{ waiting_on_reviewer }}</li>
|
<li>Waiting on reviewer: {{ waiting_on_reviewer }}</li>
|
||||||
|
<li>Waiting on CI (no votes yet): {{ waiting_on_ci }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
{% if waiting_on_reviewer %}
|
{% if waiting_on_reviewer %}
|
||||||
<h3>Change requests waiting for reviewers since the last vote or mark</h3>
|
<h3>Change requests waiting for reviewers since the last vote or mark</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Average wait time: {{ latest_revision.average }}</li>
|
<li>Average wait time: {{ reviewer_latest_revision.average }}</li>
|
||||||
<li>Max wait time: {{ latest_revision.max }}</li>
|
<li>Max wait time: {{ reviewer_latest_revision.max }}</li>
|
||||||
</ul>
|
</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>
|
<ol>
|
||||||
{% for item in latest_revision.reviews[:5] %}
|
{% 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_name }} ({{ item.company_name }})</li>
|
<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 %}
|
{% endfor %}
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<h3>Change requests waiting for reviewers since the creation date</h3>
|
<h3>Change requests waiting for reviewers since the creation date</h3>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Average wait time: {{ first_revision.average }}</li>
|
<li>Average wait time: {{ reviewer_first_revision.average }}</li>
|
||||||
<li>Max wait time: {{ first_revision.max }}</li>
|
<li>Max wait time: {{ reviewer_first_revision.max }}</li>
|
||||||
</ul>
|
</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>
|
<ol>
|
||||||
{% for item in first_revision.reviews[:5] %}
|
{% for item in reviewer_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>
|
<li>{{ item.date_age }} <a href="{{ item.url }}">{{ item.url }}</a> {{ item.subject }} by {{ item.author_link|safe }} ({{ item.company_link|safe }})</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
<h3>No change requests waiting for reviewers</h3>
|
<h3>No change requests waiting for reviewers</h3>
|
||||||
{% endif %}
|
{% 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 %}
|
{% endblock %}
|
||||||
|
@@ -195,8 +195,7 @@ def format_text(s):
|
|||||||
def make_age_string(seconds):
|
def make_age_string(seconds):
|
||||||
days = seconds / (3600 * 24)
|
days = seconds / (3600 * 24)
|
||||||
hours = (seconds / 3600) - (days * 24)
|
hours = (seconds / 3600) - (days * 24)
|
||||||
minutes = (seconds / 60) - (days * 24 * 60) - (hours * 60)
|
return '%d days and %d hours' % (days, hours)
|
||||||
return '%d days, %d hours, %d minutes' % (days, hours, minutes)
|
|
||||||
|
|
||||||
|
|
||||||
def merge_records(original, new):
|
def merge_records(original, new):
|
||||||
|
Reference in New Issue
Block a user