Show module details block
Implements blueprint module-details Change-Id: Ibbd5a7eca9054d13a3cf3df62f36fa562c458fec
This commit is contained in:

committed by
Ilya Shakhat

parent
84d8435faa
commit
d1b217ece8
@@ -404,15 +404,17 @@ def templated(template=None, return_code=200):
|
|||||||
|
|
||||||
module = parameters.get_single_parameter(kwargs, 'module')
|
module = parameters.get_single_parameter(kwargs, 'module')
|
||||||
ctx['module'] = module
|
ctx['module'] = module
|
||||||
|
module_name = None
|
||||||
if module and module in vault_inst['module_id_index']:
|
if module and module in vault_inst['module_id_index']:
|
||||||
ctx['module_inst'] = vault_inst['module_id_index'][module]
|
ctx['module_inst'] = vault_inst['module_id_index'][module]
|
||||||
|
module_name = ctx['module_inst']['module_group_name']
|
||||||
|
|
||||||
ctx['user_id'] = parameters.get_single_parameter(kwargs, 'user_id')
|
ctx['user_id'] = parameters.get_single_parameter(kwargs, 'user_id')
|
||||||
if ctx['user_id']:
|
if ctx['user_id']:
|
||||||
ctx['user_inst'] = vault.get_user_from_runtime_storage(
|
ctx['user_inst'] = vault.get_user_from_runtime_storage(
|
||||||
ctx['user_id'])
|
ctx['user_id'])
|
||||||
ctx['page_title'] = helpers.make_page_title(
|
ctx['page_title'] = helpers.make_page_title(
|
||||||
ctx['company'], ctx['user_id'], ctx['module'], ctx['release'])
|
ctx['company'], ctx['user_id'], module_name, ctx['release'])
|
||||||
ctx['stackalytics_version'] = (
|
ctx['stackalytics_version'] = (
|
||||||
stackalytics_version.version_info.version_string())
|
stackalytics_version.version_info.version_string())
|
||||||
ctx['stackalytics_release'] = (
|
ctx['stackalytics_release'] = (
|
||||||
|
@@ -111,6 +111,35 @@ def extend_user(user):
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
|
def extend_module(module_id):
|
||||||
|
module_id_index = vault.get_vault()['module_id_index']
|
||||||
|
module_id = module_id.lower()
|
||||||
|
|
||||||
|
if module_id not in module_id_index:
|
||||||
|
return None
|
||||||
|
|
||||||
|
repos_index = vault.get_vault()['repos_index']
|
||||||
|
|
||||||
|
module = module_id_index[module_id]
|
||||||
|
name = module['module_group_name']
|
||||||
|
if name[0].islower():
|
||||||
|
name = name.capitalize()
|
||||||
|
|
||||||
|
child_modules = []
|
||||||
|
for m in module['modules']:
|
||||||
|
child = {'module_name': m}
|
||||||
|
if m in repos_index:
|
||||||
|
child['repo_uri'] = repos_index[m]['uri']
|
||||||
|
child_modules.append(child)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'id': module_id,
|
||||||
|
'name': name,
|
||||||
|
'tag': module['tag'],
|
||||||
|
'modules': child_modules,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_activity(records, start_record, page_size, query_message=None):
|
def get_activity(records, start_record, page_size, query_message=None):
|
||||||
if query_message:
|
if query_message:
|
||||||
# note that all records are now dicts!
|
# note that all records are now dicts!
|
||||||
|
54
stackalytics/dashboard/templates/_macros/module_details.html
Normal file
54
stackalytics/dashboard/templates/_macros/module_details.html
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{% macro show_module_details(module) -%}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
function load_module_details(extra_options) {
|
||||||
|
$.ajax({
|
||||||
|
url: makeURI("/api/1.0/modules/{{ module }}", extra_options),
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
var module = data["module"];
|
||||||
|
for (var i=0; i < module.modules.length; i++) {
|
||||||
|
module.modules[i].uri = makeURI('/', {module: module.modules[i].module_name});
|
||||||
|
}
|
||||||
|
console.log(module);
|
||||||
|
$("#module_details_template").tmpl(data["module"]).appendTo("#module_details_container");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function () {
|
||||||
|
var uri_options = {};
|
||||||
|
load_module_details(uri_options);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script id="module_details_template" type="text/x-jquery-tmpl">
|
||||||
|
{% raw %}
|
||||||
|
<div>
|
||||||
|
<h2>${name}</h2>
|
||||||
|
<div style="font-style: italic; margin-bottom: 0.5em;">
|
||||||
|
{%if tag == 'program' %}
|
||||||
|
The official OpenStack program as defined in
|
||||||
|
<a href="https://git.openstack.org/cgit/openstack/governance/tree/reference/programs.yaml" target="_blank">programs.yaml</a>
|
||||||
|
{%/if%}
|
||||||
|
{%if tag == 'group' %}
|
||||||
|
Custom module group as defined in
|
||||||
|
<a href="https://git.openstack.org/cgit/stackforge/stackalytics/tree/etc/default_data.json" target="_blank">default_data.json</a>
|
||||||
|
{%/if%}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{%if tag == 'module' %}
|
||||||
|
Repo: ${modules[0].repo_uri}
|
||||||
|
{%else%}
|
||||||
|
Modules:
|
||||||
|
{%each(index,module) modules %}{%if index>0 %}, {%/if%}
|
||||||
|
<a href="${module.uri}">${module.module_name}</a>{%/each%}
|
||||||
|
{%/if%}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endraw %}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div id="module_details_container" style="margin-bottom: 2em;"></div>
|
||||||
|
|
||||||
|
{%- endmacro %}
|
@@ -2,6 +2,7 @@
|
|||||||
{% import '_macros/activity_log.html' as activity_log %}
|
{% import '_macros/activity_log.html' as activity_log %}
|
||||||
{% import '_macros/contribution_summary.html' as contribution_summary %}
|
{% import '_macros/contribution_summary.html' as contribution_summary %}
|
||||||
{% import '_macros/user_profile.html' as user_profile %}
|
{% import '_macros/user_profile.html' as user_profile %}
|
||||||
|
{% import '_macros/module_details.html' as module_details %}
|
||||||
|
|
||||||
{% set show_company_breakdown = (not company) and (not user_id) %}
|
{% set show_company_breakdown = (not company) and (not user_id) %}
|
||||||
{% set show_engineer_breakdown = (not user_id) %}
|
{% set show_engineer_breakdown = (not user_id) %}
|
||||||
@@ -13,6 +14,7 @@
|
|||||||
{% set show_contribution_on_left = (not user_id) and (module) %}
|
{% set show_contribution_on_left = (not user_id) and (module) %}
|
||||||
{% set show_contribution_on_right = (user_id) or (company and not module) %}
|
{% set show_contribution_on_right = (user_id) or (company and not module) %}
|
||||||
{% set show_user_profile = (user_id) %}
|
{% set show_user_profile = (user_id) %}
|
||||||
|
{% set show_module_details = (module) %}
|
||||||
{% set show_top_mentors_options = (metric == 'tm_marks') %}
|
{% set show_top_mentors_options = (metric == 'tm_marks') %}
|
||||||
{% set show_review_ratio = (metric in ['marks', 'tm_marks']) %}
|
{% set show_review_ratio = (metric in ['marks', 'tm_marks']) %}
|
||||||
|
|
||||||
@@ -184,6 +186,10 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if show_module_details %}
|
||||||
|
{{ module_details.show_module_details(module=module) }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if show_bp_breakdown %}
|
{% if show_bp_breakdown %}
|
||||||
<div id="bp_container">
|
<div id="bp_container">
|
||||||
<h2>Blueprint popularity</h2>
|
<h2>Blueprint popularity</h2>
|
||||||
|
@@ -89,6 +89,7 @@ def get_vault():
|
|||||||
_init_releases(vault)
|
_init_releases(vault)
|
||||||
_init_module_groups(vault)
|
_init_module_groups(vault)
|
||||||
_init_project_types(vault)
|
_init_project_types(vault)
|
||||||
|
_init_repos(vault)
|
||||||
_init_user_index(vault)
|
_init_user_index(vault)
|
||||||
|
|
||||||
return vault
|
return vault
|
||||||
@@ -128,8 +129,14 @@ def _init_project_types(vault):
|
|||||||
project_types = runtime_storage_inst.get_by_key('project_types') or {}
|
project_types = runtime_storage_inst.get_by_key('project_types') or {}
|
||||||
|
|
||||||
vault['project_types'] = project_types
|
vault['project_types'] = project_types
|
||||||
vault['project_types_index'] = dict([(pt['id'], pt)
|
vault['project_types_index'] = dict((pt['id'], pt) for pt in project_types)
|
||||||
for pt in project_types])
|
|
||||||
|
|
||||||
|
def _init_repos(vault):
|
||||||
|
runtime_storage_inst = vault['runtime_storage']
|
||||||
|
repos = runtime_storage_inst.get_by_key('repos') or {}
|
||||||
|
|
||||||
|
vault['repos_index'] = dict((r['module'], r) for r in repos)
|
||||||
|
|
||||||
|
|
||||||
def _init_user_index(vault):
|
def _init_user_index(vault):
|
||||||
@@ -173,7 +180,7 @@ def get_user_from_runtime_storage(user_id):
|
|||||||
return user_index[user_id]
|
return user_index[user_id]
|
||||||
|
|
||||||
|
|
||||||
def resolve_modules_for_releases(module_ids, releases):
|
def _resolve_modules_for_releases(module_ids, releases):
|
||||||
module_id_index = get_vault().get('module_id_index') or {}
|
module_id_index = get_vault().get('module_id_index') or {}
|
||||||
|
|
||||||
for module_id in module_ids:
|
for module_id in module_ids:
|
||||||
@@ -201,7 +208,7 @@ def resolve_modules_for_releases(module_ids, releases):
|
|||||||
|
|
||||||
def resolve_modules(module_ids, releases):
|
def resolve_modules(module_ids, releases):
|
||||||
all_releases = get_vault()['releases'].keys()
|
all_releases = get_vault()['releases'].keys()
|
||||||
for module, release in resolve_modules_for_releases(module_ids, releases):
|
for module, release in _resolve_modules_for_releases(module_ids, releases):
|
||||||
if release is None:
|
if release is None:
|
||||||
for r in all_releases:
|
for r in all_releases:
|
||||||
yield (module, r)
|
yield (module, r)
|
||||||
|
@@ -343,18 +343,15 @@ def get_company(company_name, **kwargs):
|
|||||||
flask.abort(404)
|
flask.abort(404)
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/1.0/modules/<module>')
|
@app.route('/api/1.0/modules/<module_id>')
|
||||||
@decorators.response()
|
@decorators.response()
|
||||||
@decorators.cached()
|
@decorators.cached()
|
||||||
@decorators.jsonify('module')
|
@decorators.jsonify('module')
|
||||||
def get_module(module, **kwargs):
|
def get_module(module_id, **kwargs):
|
||||||
module_id_index = vault.get_vault()['module_id_index']
|
module = helpers.extend_module(module_id)
|
||||||
module = module.lower()
|
if not module:
|
||||||
if module in module_id_index:
|
flask.abort(404)
|
||||||
return {'id': module_id_index[module]['id'],
|
return module
|
||||||
'text': module_id_index[module]['module_group_name'],
|
|
||||||
'tag': module_id_index[module]['tag']}
|
|
||||||
flask.abort(404)
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/api/1.0/members')
|
@app.route('/api/1.0/members')
|
||||||
|
@@ -79,7 +79,7 @@ class TestAPIModules(test_api.TestAPI):
|
|||||||
'module_groups': {
|
'module_groups': {
|
||||||
'nova-group': {'id': 'nova-group',
|
'nova-group': {'id': 'nova-group',
|
||||||
'module_group_name': 'nova-group',
|
'module_group_name': 'nova-group',
|
||||||
'modules': ['nova', 'nova-cli'],
|
'modules': ['nova-cli', 'nova'],
|
||||||
'tag': 'group'},
|
'tag': 'group'},
|
||||||
'nova': test_api.make_module('nova'),
|
'nova': test_api.make_module('nova'),
|
||||||
'nova-cli': test_api.make_module('nova-cli'),
|
'nova-cli': test_api.make_module('nova-cli'),
|
||||||
@@ -89,10 +89,20 @@ class TestAPIModules(test_api.TestAPI):
|
|||||||
response = self.app.get('/api/1.0/modules/nova')
|
response = self.app.get('/api/1.0/modules/nova')
|
||||||
module = test_api.load_json(response)['module']
|
module = test_api.load_json(response)['module']
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
{'id': 'nova', 'text': 'nova', 'tag': 'module'}, module)
|
{'id': 'nova',
|
||||||
|
'modules': [
|
||||||
|
{'module_name': 'nova',
|
||||||
|
'repo_uri': 'git://git.openstack.org/openstack/nova.git'}
|
||||||
|
],
|
||||||
|
'name': 'Nova', 'tag': 'module'}, module)
|
||||||
|
|
||||||
response = self.app.get('/api/1.0/modules/nova-group')
|
response = self.app.get('/api/1.0/modules/nova-group')
|
||||||
module = test_api.load_json(response)['module']
|
module = test_api.load_json(response)['module']
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
{'tag': 'group', 'id': 'nova-group', 'text': 'nova-group'},
|
{'id': 'nova-group',
|
||||||
module)
|
'modules': [
|
||||||
|
{'module_name': 'nova-cli'},
|
||||||
|
{'module_name': 'nova',
|
||||||
|
'repo_uri': 'git://git.openstack.org/openstack/nova.git'}
|
||||||
|
],
|
||||||
|
'name': 'Nova-group', 'tag': 'group'}, module)
|
||||||
|
Reference in New Issue
Block a user