Implemented report on core reviewers
New report is available at /report/cores Change-Id: I411476d27d82eeac3a108cb3d53a719f854c1553
This commit is contained in:
@@ -55,7 +55,8 @@ METRIC_TO_RECORD_TYPE = {
|
||||
}
|
||||
|
||||
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_STATIC_ACTIVITY_SIZE = 100
|
||||
|
||||
@@ -24,6 +24,7 @@ import six
|
||||
|
||||
from stackalytics.dashboard import decorators
|
||||
from stackalytics.dashboard import helpers
|
||||
from stackalytics.dashboard import parameters
|
||||
from stackalytics.dashboard import vault
|
||||
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):
|
||||
punch_card_raw = [] # matrix days x hours
|
||||
for wday in six.moves.range(0, 7):
|
||||
|
||||
186
stackalytics/dashboard/templates/reports/cores.html
Normal file
186
stackalytics/dashboard/templates/reports/cores.html
Normal 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 %}
|
||||
@@ -414,15 +414,37 @@ def get_bpd(records, **kwargs):
|
||||
@decorators.jsonify()
|
||||
@decorators.record_filter(ignore=['user_id'])
|
||||
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_id', record_ids)
|
||||
if kwargs['_params']['user_id']:
|
||||
user_ids.add(kwargs['_params']['user_id'][0])
|
||||
|
||||
result = [{'id': user_id,
|
||||
'text': (vault.get_user_from_runtime_storage(user_id)
|
||||
['user_name'])}
|
||||
for user_id in user_ids]
|
||||
result = []
|
||||
for user_id in user_ids:
|
||||
user = vault.get_user_from_runtime_storage(user_id)
|
||||
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'])
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user