Added classification of projects by types.
Implemented blueprint project-classification Change-Id: Ia2606be7fb1d9d8fd00e3e29e6ffd4608cdfa894
This commit is contained in:
parent
178be17fbe
commit
dc2dea9bf9
@ -265,8 +265,15 @@
|
||||
<div class="drops" style='margin: 0.8em; height: 2em;'>
|
||||
<span class="drop_metric" style="float: right;">
|
||||
<label for="project_type">Projects </label><select id="project_type" name="project_type">
|
||||
<option value="openstack">OpenStack</option>
|
||||
<option value="stackforge">StackForge</option>
|
||||
<option value="All">all</option>
|
||||
{% for option_type, option_groups in project_type_options.iteritems() %}
|
||||
<optgroup label="{{ option_type }}">
|
||||
<option value="{{ option_type }}">{{ option_type }} - all</option>
|
||||
{% for option_group in option_groups %}
|
||||
<option value="{{ option_group }}">{{ option_group }}</option>
|
||||
{% endfor %}
|
||||
</optgroup>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</span>
|
||||
<span class="drop_metric" style="float: right;">
|
||||
|
@ -47,11 +47,6 @@ METRIC_LABELS = {
|
||||
'commits': 'Commits',
|
||||
}
|
||||
|
||||
PROJECT_TYPES = {
|
||||
'openstack': 'OpenStack',
|
||||
'stackforge': 'StackForge',
|
||||
}
|
||||
|
||||
DEFAULT_RECORDS_LIMIT = 10
|
||||
|
||||
|
||||
@ -96,6 +91,8 @@ def get_vault():
|
||||
vault['modules'] = dict((r['module'].lower(),
|
||||
r['project_type'].lower()) for r in modules)
|
||||
app.stackalytics_vault = vault
|
||||
|
||||
init_project_types(vault)
|
||||
else:
|
||||
if not getattr(flask.request, 'stackalytics_updated', None):
|
||||
flask.request.stackalytics_updated = True
|
||||
@ -110,6 +107,63 @@ def get_memory_storage():
|
||||
return get_vault()['memory_storage']
|
||||
|
||||
|
||||
def init_project_types(vault):
|
||||
persistent_storage_inst = vault['persistent_storage']
|
||||
project_type_options = {}
|
||||
project_type_group_index = {'all': set()}
|
||||
|
||||
for repo in persistent_storage_inst.get_repos():
|
||||
project_type = repo['project_type'].lower()
|
||||
project_group = None
|
||||
if 'project_group' in repo:
|
||||
project_group = repo['project_group'].lower()
|
||||
|
||||
if project_type in project_type_options:
|
||||
if project_group:
|
||||
project_type_options[project_type].add(project_group)
|
||||
else:
|
||||
if project_group:
|
||||
project_type_options[project_type] = set([project_group])
|
||||
else:
|
||||
project_type_options[project_type] = set()
|
||||
|
||||
module = repo['module']
|
||||
if project_type in project_type_group_index:
|
||||
project_type_group_index[project_type].add(module)
|
||||
else:
|
||||
project_type_group_index[project_type] = set([module])
|
||||
|
||||
if project_group:
|
||||
if project_group in project_type_group_index:
|
||||
project_type_group_index[project_group].add(module)
|
||||
else:
|
||||
project_type_group_index[project_group] = set([module])
|
||||
|
||||
project_type_group_index['all'].add(module)
|
||||
|
||||
vault['project_type_options'] = project_type_options
|
||||
vault['project_type_group_index'] = project_type_group_index
|
||||
|
||||
|
||||
def get_project_type_options():
|
||||
return get_vault()['project_type_options']
|
||||
|
||||
|
||||
def is_project_type_valid(project_type):
|
||||
if not project_type:
|
||||
return False
|
||||
project_type = project_type.lower()
|
||||
if project_type == 'all':
|
||||
return True
|
||||
project_types = get_project_type_options()
|
||||
if project_type in project_types:
|
||||
return True
|
||||
for p, g in project_types.iteritems():
|
||||
if project_type in g:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
# Utils ---------
|
||||
|
||||
def get_default(param_name):
|
||||
@ -158,9 +212,12 @@ def record_filter(ignore=None, use_default=True):
|
||||
param = get_parameter(kwargs, 'project_type', 'project_types',
|
||||
use_default)
|
||||
if param:
|
||||
modules = [module for module, project_type
|
||||
in vault['modules'].iteritems()
|
||||
if project_type in param]
|
||||
ptgi = vault['project_type_group_index']
|
||||
modules = set()
|
||||
for project_type in param:
|
||||
project_type = project_type.lower()
|
||||
if project_type in ptgi:
|
||||
modules |= ptgi[project_type]
|
||||
record_ids &= (
|
||||
memory_storage.get_record_ids_by_modules(modules))
|
||||
|
||||
@ -253,10 +310,9 @@ def templated(template=None):
|
||||
ctx['metric_label'] = METRIC_LABELS[ctx['metric']]
|
||||
|
||||
project_type = flask.request.args.get('project_type')
|
||||
if project_type not in PROJECT_TYPES:
|
||||
project_type = None
|
||||
ctx['project_type'] = project_type or get_default('project_type')
|
||||
ctx['project_type_label'] = PROJECT_TYPES[ctx['project_type']]
|
||||
if not is_project_type_valid(project_type):
|
||||
project_type = get_default('project_type')
|
||||
ctx['project_type'] = project_type
|
||||
|
||||
release = flask.request.args.get('release')
|
||||
releases = vault['releases']
|
||||
@ -268,6 +324,8 @@ def templated(template=None):
|
||||
release = releases[release]['release_name']
|
||||
ctx['release'] = (release or get_default('release')).lower()
|
||||
|
||||
ctx['project_type_options'] = get_project_type_options()
|
||||
|
||||
return flask.render_template(template_name, **ctx)
|
||||
|
||||
return templated_decorated_function
|
||||
|
@ -13482,6 +13482,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "nova",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/nova.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13510,6 +13511,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "keystone",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/keystone.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13538,6 +13540,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "cinder",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/cinder.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13561,6 +13564,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "glance",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/glance.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13589,6 +13593,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "neutron",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/neutron.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13617,6 +13622,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "horizon",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/horizon.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13645,6 +13651,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "swift",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/swift.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13673,6 +13680,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-keystoneclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-keystoneclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13696,6 +13704,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-novaclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-novaclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13719,6 +13728,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-cinderclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-cinderclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13737,6 +13747,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-glanceclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-glanceclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13755,6 +13766,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-neutronclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-neutronclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13778,6 +13790,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-swiftclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-swiftclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13796,6 +13809,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "heat",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/heat.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13814,6 +13828,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-heatclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-heatclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13832,6 +13847,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "ceilometer",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/ceilometer.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13850,6 +13866,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-ceilometerclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/python-ceilometerclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13863,6 +13880,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "oslo-incubator",
|
||||
"project_type": "openstack",
|
||||
"project_group": "incubation",
|
||||
"uri": "git://github.com/openstack/oslo-incubator.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13876,6 +13894,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "oslo.config",
|
||||
"project_type": "openstack",
|
||||
"project_group": "core",
|
||||
"uri": "git://github.com/openstack/oslo.config.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13889,6 +13908,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "compute-api",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/compute-api.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13902,6 +13922,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "identity-api",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/identity-api.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13915,6 +13936,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "image-api",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/image-api.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13928,6 +13950,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "netconn-api",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/netconn-api.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13941,6 +13964,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "object-api",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/object-api.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13954,6 +13978,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "volume-api",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/volume-api.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13967,6 +13992,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "openstack-manuals",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/openstack-manuals.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -13990,6 +14016,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "api-site",
|
||||
"project_type": "openstack",
|
||||
"project_group": "documentation",
|
||||
"uri": "git://github.com/openstack/api-site.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -14004,6 +14031,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "devstack",
|
||||
"project_type": "openstack",
|
||||
"project_group": "other",
|
||||
"uri": "git://github.com/openstack-dev/devstack.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -14017,6 +14045,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "tempest",
|
||||
"project_type": "openstack",
|
||||
"project_group": "other",
|
||||
"uri": "git://github.com/openstack/tempest.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -14030,6 +14059,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "requirements",
|
||||
"project_type": "openstack",
|
||||
"project_group": "other",
|
||||
"uri": "git://github.com/openstack/requirements.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -14042,8 +14072,9 @@
|
||||
|
||||
{
|
||||
"branches": ["master"],
|
||||
"module": "requirements",
|
||||
"project_type": "trove",
|
||||
"module": "trove",
|
||||
"project_type": "openstack",
|
||||
"project_group": "incubation",
|
||||
"uri": "git://github.com/openstack/trove.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -14057,6 +14088,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "trove-integration",
|
||||
"project_type": "openstack",
|
||||
"project_group": "incubation",
|
||||
"uri": "git://github.com/openstack/trove-integration.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -14070,6 +14102,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "python-troveclient",
|
||||
"project_type": "openstack",
|
||||
"project_group": "incubation",
|
||||
"uri": "git://github.com/openstack/python-troveclient.git",
|
||||
"releases": [
|
||||
{
|
||||
@ -14083,6 +14116,7 @@
|
||||
"branches": ["master"],
|
||||
"module": "ironic",
|
||||
"project_type": "openstack",
|
||||
"project_group": "incubation",
|
||||
"uri": "git://github.com/openstack/ironic.git",
|
||||
"releases": [
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user