Implemented report on core reviewers

New report is available at /report/cores

Change-Id: I411476d27d82eeac3a108cb3d53a719f854c1553
This commit is contained in:
Ilya Shakhat
2014-07-22 16:51:07 +04:00
parent 1f5409b775
commit 1cfa0cbe28
4 changed files with 225 additions and 5 deletions

View File

@@ -55,7 +55,8 @@ METRIC_TO_RECORD_TYPE = {
} }
FILTER_PARAMETERS = ['release', 'project_type', 'module', 'company', 'user_id', FILTER_PARAMETERS = ['release', 'project_type', 'module', 'company', 'user_id',
'metric', 'start_date', 'end_date', 'blueprint_id'] 'metric', 'start_date', 'end_date', 'blueprint_id',
'core_in']
DEFAULT_RECORDS_LIMIT = 10 DEFAULT_RECORDS_LIMIT = 10
DEFAULT_STATIC_ACTIVITY_SIZE = 100 DEFAULT_STATIC_ACTIVITY_SIZE = 100

View File

@@ -24,6 +24,7 @@ import six
from stackalytics.dashboard import decorators from stackalytics.dashboard import decorators
from stackalytics.dashboard import helpers from stackalytics.dashboard import helpers
from stackalytics.dashboard import parameters
from stackalytics.dashboard import vault from stackalytics.dashboard import vault
from stackalytics.processor import utils from stackalytics.processor import utils
@@ -158,6 +159,16 @@ def members():
} }
@blueprint.route('/cores')
@decorators.exception_handler()
@decorators.templated()
def cores():
project_type = parameters.get_single_parameter({}, 'project_type')
return {
'project_type': project_type,
}
def _get_punch_card_data(records): def _get_punch_card_data(records):
punch_card_raw = [] # matrix days x hours punch_card_raw = [] # matrix days x hours
for wday in six.moves.range(0, 7): for wday in six.moves.range(0, 7):

View File

@@ -0,0 +1,186 @@
{% extends "reports/base_report.html" %}
{% block title %}
Cores
{% endblock %}
{% block scripts %}
<script type="text/javascript">
$(document).ready(function () {
initSingleSelector("project_type", "/api/1.0/project_types", {
formatResultCssClass: function (item) {
return (item.child) ? "project_group_item" : "project_group";
}
}, function (options) {
options['module'] = null;
});
$.ajax({
url: "/api/1.0/users?project_type={{ project_type }}&core_in=master",
dataType: "json",
success: function (data) {
var users = data["data"];
var counters = {};
var modules_index = {};
for (var i in users) {
var user = users[i];
var company_name = user.company_name;
var company_stat = counters[company_name];
if (!company_stat) {
company_stat = {};
counters[company_name] = company_stat;
}
var modules = user.core;
for (var j in modules) {
var module = modules[j];
if (!company_stat[module]) {
company_stat[module] = [];
}
company_stat[module].push(user.text);
modules_index[module] = module;
}
}
var module_list = [];
for (var module_name in modules_index) {
module_list.push(module_name);
}
module_list.sort();
// make table
var table = $("<table id='table_cores'></table>");
var table_head = $("<thead></thead>");
table.append(table_head);
var table_body = $("<tbody></tbody>");
table.append(table_body);
var head_row = $('<tr></tr>');
table_head.append(head_row);
head_row.append($("<th>Company</th>"));
for (i in module_list) {
module = module_list[i];
head_row.append($("<th>" + module + "</th>"));
}
head_row.append($("<th>Total</th>"));
var module_sum = {};
for (company_name in counters) {
var row = $("<tr></tr>");
table_body.append(row);
row.append($("<td>" + company_name + "</td>"));
company_stat = counters[company_name];
var sum = 0;
for (i in module_list) {
module = module_list[i];
users = company_stat[module];
var title = "";
var counter = 0;
var cell_class = "nonzero";
if (users) {
counter = users.length;
title = users.join(", ");
} else {
cell_class = "zero"
}
sum += counter;
row.append($("<td title='" + title + "' class='" + cell_class + "'>" + counter + "</td>"));
if (!module_sum[module]) {
module_sum[module] = counter;
} else {
module_sum[module] += counter;
}
}
row.append($("<td>" + sum + "</td>"));
}
var table_foot = $("<tfoot></tfoot>");
table.append(table_foot);
var footer_row = $("<tr></tr>");
table_foot.append(footer_row);
footer_row.append($("<td>Total</th>"));
sum = 0;
for (i in module_list) {
module = module_list[i];
footer_row.append($("<td>" + module_sum[module] + "</td>"));
sum += module_sum[module];
}
footer_row.append($("<td>" + sum + "</td>"));
$("#table_container").append(table);
$("#table_container_loading").hide();
table.dataTable({
"bPaginate": false,
"iDisplayLength": -1,
"aoColumnDefs": [
{ "sClass": "left", "aTargets": [0] }
]
});
}
});
});
</script>
<style type="text/css">
table.dataTable tr.even {
background-color: #EEF1F4;
}
table.dataTable tr.even:hover, table.dataTable tr.odd:hover {
background-color: #F8FFEC;
}
table.dataTable tr.even td.sorting_1 {
background-color: #E0E8E8;
}
table.dataTable td {
text-align: center;
}
table.dataTable td.left, table.dataTable th.left {
text-align: left;
}
table.dataTable tfoot td {
background-color: #dadde0;
font-weight: bold;
}
.zero {
color: #A0A0A0;
}
.nonzero {
color: #000000;
}
</style>
{% endblock %}
{% block content %}
<h1>Cores in
<span style="display: inline; position: relative; top: -3px;">
<input type="hidden" id="project_type_selector" style="width: 200px" data-placeholder="Select project type"/>
</span>
</h1>
<div id="table_container"></div>
<div id="table_container_loading" class="select2-loading" style="width: 7em;">Loading...</div>
{% endblock %}

View File

@@ -414,15 +414,37 @@ def get_bpd(records, **kwargs):
@decorators.jsonify() @decorators.jsonify()
@decorators.record_filter(ignore=['user_id']) @decorators.record_filter(ignore=['user_id'])
def get_users_json(record_ids, **kwargs): def get_users_json(record_ids, **kwargs):
core_in = parameters.get_single_parameter({}, 'core_in') or None
valid_modules = set()
if core_in:
core_in = set(core_in.split(','))
valid_modules = vault.resolve_project_types(
kwargs['_params']['project_type'])
valid_modules = set(m[0] for m in vault.resolve_modules(
valid_modules, kwargs['_params']['release']))
user_ids = vault.get_memory_storage().get_index_keys_by_record_ids( user_ids = vault.get_memory_storage().get_index_keys_by_record_ids(
'user_id', record_ids) 'user_id', record_ids)
if kwargs['_params']['user_id']: if kwargs['_params']['user_id']:
user_ids.add(kwargs['_params']['user_id'][0]) user_ids.add(kwargs['_params']['user_id'][0])
result = [{'id': user_id, result = []
'text': (vault.get_user_from_runtime_storage(user_id) for user_id in user_ids:
['user_name'])} user = vault.get_user_from_runtime_storage(user_id)
for user_id in user_ids] r = {'id': user_id, 'text': user['user_name']}
add_flag = not core_in
if core_in and user.get('core'):
core_modules = [module_branch[0] for module_branch in user['core']
if (module_branch[1] in core_in and
module_branch[0] in valid_modules)]
if core_modules:
r['core'] = core_modules
if user['companies']:
r['company_name'] = user['companies'][-1]['company_name']
add_flag = True
if add_flag:
result.append(r)
result.sort(key=lambda x: x['text']) result.sort(key=lambda x: x['text'])
return result return result