Show which modules are available in module group details
Also process modules as sets to avoid duplicates. Change-Id: I5f09af93b60e3610145f9c4221d47bf2e2ef3a38
This commit is contained in:
@@ -128,7 +128,7 @@ def extend_user(user):
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
def extend_module(module_id):
|
def extend_module(module_id, project_type, release):
|
||||||
module_id_index = vault.get_vault()['module_id_index']
|
module_id_index = vault.get_vault()['module_id_index']
|
||||||
module_id = module_id.lower()
|
module_id = module_id.lower()
|
||||||
|
|
||||||
@@ -142,13 +142,20 @@ def extend_module(module_id):
|
|||||||
if name[0].islower():
|
if name[0].islower():
|
||||||
name = name.capitalize()
|
name = name.capitalize()
|
||||||
|
|
||||||
|
# (module, release) pairs
|
||||||
|
own_sub_modules = set(vault.resolve_modules([module_id], [release]))
|
||||||
|
visible_sub_modules = own_sub_modules & set(vault.resolve_modules(
|
||||||
|
vault.resolve_project_types([project_type]), [release]))
|
||||||
|
|
||||||
child_modules = []
|
child_modules = []
|
||||||
for m in module['modules']:
|
for m, r in own_sub_modules:
|
||||||
child = {'module_name': m}
|
child = {'module_name': m, 'visible': (m, r) in visible_sub_modules}
|
||||||
if m in repos_index:
|
if m in repos_index:
|
||||||
child['repo_uri'] = repos_index[m]['uri']
|
child['repo_uri'] = repos_index[m]['uri']
|
||||||
child_modules.append(child)
|
child_modules.append(child)
|
||||||
|
|
||||||
|
child_modules.sort(key=lambda x: x['module_name'])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': module_id,
|
'id': module_id,
|
||||||
'name': name,
|
'name': name,
|
||||||
|
|||||||
@@ -503,3 +503,7 @@ div.stackamenu li.current-menu-item a span {
|
|||||||
width: 99%;
|
width: 99%;
|
||||||
height: 350px;
|
height: 350px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.disabled {
|
||||||
|
color: grey;
|
||||||
|
}
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
for (var i=0; i < module.modules.length; i++) {
|
for (var i=0; i < module.modules.length; i++) {
|
||||||
module.modules[i].uri = makeURI('/', {module: module.modules[i].module_name});
|
module.modules[i].uri = makeURI('/', {module: module.modules[i].module_name});
|
||||||
}
|
}
|
||||||
console.log(module);
|
|
||||||
$("#module_details_template").tmpl(data["module"]).appendTo("#module_details_container");
|
$("#module_details_template").tmpl(data["module"]).appendTo("#module_details_container");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -42,7 +41,9 @@
|
|||||||
{%else%}
|
{%else%}
|
||||||
Modules:
|
Modules:
|
||||||
{%each(index,module) modules %}{%if index>0 %}, {%/if%}
|
{%each(index,module) modules %}{%if index>0 %}, {%/if%}
|
||||||
<a href="${module.uri}">${module.module_name}</a>{%/each%}
|
{%if module.visible %}
|
||||||
|
<a href="${module.uri}">${module.module_name}</a>{%else%}
|
||||||
|
<span title="Not available in current project type and release" class="disabled">${module.module_name}</span>{%/if%}{%/each%}
|
||||||
{%/if%}
|
{%/if%}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -341,7 +341,9 @@ def get_company(company_name, **kwargs):
|
|||||||
@decorators.cached()
|
@decorators.cached()
|
||||||
@decorators.jsonify('module')
|
@decorators.jsonify('module')
|
||||||
def get_module(module_id, **kwargs):
|
def get_module(module_id, **kwargs):
|
||||||
module = helpers.extend_module(module_id)
|
project_type = parameters.get_single_parameter(kwargs, 'project_type')
|
||||||
|
release = parameters.get_single_parameter(kwargs, 'release')
|
||||||
|
module = helpers.extend_module(module_id, project_type, release)
|
||||||
if not module:
|
if not module:
|
||||||
flask.abort(404)
|
flask.abort(404)
|
||||||
return module
|
return module
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ def _make_module_group(module_groups, name):
|
|||||||
m = module_groups[name] # object created by defaultdict
|
m = module_groups[name] # object created by defaultdict
|
||||||
m['tag'] = 'project_type'
|
m['tag'] = 'project_type'
|
||||||
m['module_group_name'] = name
|
m['module_group_name'] = name
|
||||||
m['releases'] = collections.defaultdict(list)
|
m['releases'] = collections.defaultdict(set)
|
||||||
return m
|
return m
|
||||||
|
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ def read_legacy_programs_yaml(module_groups, release_name, content):
|
|||||||
mn = module['repo'].split('/')[1] # module_name
|
mn = module['repo'].split('/')[1] # module_name
|
||||||
|
|
||||||
# module_groups[group_id]['releases'][release_name].append(mn)
|
# module_groups[group_id]['releases'][release_name].append(mn)
|
||||||
all_official['releases'][release_name].append(mn)
|
all_official['releases'][release_name].add(mn)
|
||||||
|
|
||||||
|
|
||||||
def read_early_big_tent_projects_yaml(module_groups, release_name, content):
|
def read_early_big_tent_projects_yaml(module_groups, release_name, content):
|
||||||
@@ -56,7 +56,7 @@ def read_early_big_tent_projects_yaml(module_groups, release_name, content):
|
|||||||
mn = repo_split[1]
|
mn = repo_split[1]
|
||||||
|
|
||||||
# module_groups[group_id]['releases'][release_name].append(mn)
|
# module_groups[group_id]['releases'][release_name].append(mn)
|
||||||
all_official['releases'][release_name].append(mn)
|
all_official['releases'][release_name].add(mn)
|
||||||
|
|
||||||
|
|
||||||
def read_big_tent_projects_yaml(module_groups, release_name, content):
|
def read_big_tent_projects_yaml(module_groups, release_name, content):
|
||||||
@@ -76,18 +76,18 @@ def read_big_tent_projects_yaml(module_groups, release_name, content):
|
|||||||
|
|
||||||
mn = repo_split[1] # module_name
|
mn = repo_split[1] # module_name
|
||||||
|
|
||||||
module_groups[group_id]['modules'].append(mn)
|
module_groups[group_id]['modules'].add(mn)
|
||||||
all_official['releases'][release_name].append(mn)
|
all_official['releases'][release_name].add(mn)
|
||||||
|
|
||||||
tags = deliverable.get('tags', [])
|
tags = deliverable.get('tags', [])
|
||||||
for tag in tags:
|
for tag in tags:
|
||||||
if tag in TAGS:
|
if tag in TAGS:
|
||||||
module_groups[tag]['releases'][release_name].append(mn)
|
module_groups[tag]['releases'][release_name].add(mn)
|
||||||
|
|
||||||
|
|
||||||
def _make_default_module_groups():
|
def _make_default_module_groups():
|
||||||
# create default module groups
|
# create default module groups
|
||||||
module_groups = collections.defaultdict(lambda: {'modules': []})
|
module_groups = collections.defaultdict(lambda: {'modules': set()})
|
||||||
|
|
||||||
# openstack official
|
# openstack official
|
||||||
_make_module_group(module_groups, 'openstack-official')
|
_make_module_group(module_groups, 'openstack-official')
|
||||||
@@ -130,10 +130,5 @@ def process_official_list(releases):
|
|||||||
# set ids for module groups
|
# set ids for module groups
|
||||||
for group_id, group in six.iteritems(module_groups):
|
for group_id, group in six.iteritems(module_groups):
|
||||||
group['id'] = group_id
|
group['id'] = group_id
|
||||||
group['modules'].sort()
|
|
||||||
|
|
||||||
if 'releases' in group:
|
|
||||||
for gr in six.itervalues(group['releases']):
|
|
||||||
gr.sort()
|
|
||||||
|
|
||||||
return module_groups
|
return module_groups
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ def process_project_list(runtime_storage_inst):
|
|||||||
for module in module_groups['openstack']['modules']:
|
for module in module_groups['openstack']['modules']:
|
||||||
for r, off_m in six.iteritems(official):
|
for r, off_m in six.iteritems(official):
|
||||||
if module not in off_m:
|
if module not in off_m:
|
||||||
others['releases'][r].append(module)
|
others['releases'][r].add(module)
|
||||||
|
|
||||||
# register modules as module groups
|
# register modules as module groups
|
||||||
repos = runtime_storage_inst.get_by_key('repos') or []
|
repos = runtime_storage_inst.get_by_key('repos') or []
|
||||||
|
|||||||
@@ -290,7 +290,7 @@ def keep_safe_chars(s):
|
|||||||
def make_module_group(module_group_id, name=None, modules=None, tag='module'):
|
def make_module_group(module_group_id, name=None, modules=None, tag='module'):
|
||||||
return {'id': module_group_id,
|
return {'id': module_group_id,
|
||||||
'module_group_name': name or module_group_id,
|
'module_group_name': name or module_group_id,
|
||||||
'modules': modules or [module_group_id],
|
'modules': modules or {module_group_id},
|
||||||
'tag': tag}
|
'tag': tag}
|
||||||
|
|
||||||
BAD_NAME_SUFFIXES = ['Ltd', 'Pvt', 'Inc', 'GmbH', 'AG', 'Corporation', 'Corp',
|
BAD_NAME_SUFFIXES = ['Ltd', 'Pvt', 'Inc', 'GmbH', 'AG', 'Corporation', 'Corp',
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ class TestAPIModules(test_api.TestAPI):
|
|||||||
{'id': 'nova',
|
{'id': 'nova',
|
||||||
'modules': [
|
'modules': [
|
||||||
{'module_name': 'nova',
|
{'module_name': 'nova',
|
||||||
|
'visible': True,
|
||||||
'repo_uri': 'git://git.openstack.org/openstack/nova.git'}
|
'repo_uri': 'git://git.openstack.org/openstack/nova.git'}
|
||||||
],
|
],
|
||||||
'name': 'Nova', 'tag': 'module'}, module)
|
'name': 'Nova', 'tag': 'module'}, module)
|
||||||
@@ -112,9 +113,10 @@ class TestAPIModules(test_api.TestAPI):
|
|||||||
module = test_api.load_json(response)['module']
|
module = test_api.load_json(response)['module']
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
{'id': 'nova-group',
|
{'id': 'nova-group',
|
||||||
'modules': [
|
'modules': [{
|
||||||
{'module_name': 'nova-cli'},
|
'module_name': 'nova',
|
||||||
{'module_name': 'nova',
|
'visible': True,
|
||||||
'repo_uri': 'git://git.openstack.org/openstack/nova.git'}
|
'repo_uri': 'git://git.openstack.org/openstack/nova.git'},
|
||||||
|
{'module_name': 'nova-cli', 'visible': False},
|
||||||
],
|
],
|
||||||
'name': 'Nova-group', 'tag': 'group'}, module)
|
'name': 'Nova-group', 'tag': 'group'}, module)
|
||||||
|
|||||||
@@ -69,55 +69,55 @@ class TestGovernance(testtools.TestCase):
|
|||||||
'sahara-group': {
|
'sahara-group': {
|
||||||
'id': 'sahara-group',
|
'id': 'sahara-group',
|
||||||
'module_group_name': 'Sahara Official',
|
'module_group_name': 'Sahara Official',
|
||||||
'modules': ['python-saharaclient', 'sahara',
|
'modules': {'python-saharaclient', 'sahara',
|
||||||
'sahara-dashboard', 'sahara-extra',
|
'sahara-dashboard', 'sahara-extra',
|
||||||
'sahara-image-elements', 'sahara-specs'],
|
'sahara-image-elements', 'sahara-specs'},
|
||||||
'tag': 'program'
|
'tag': 'program'
|
||||||
},
|
},
|
||||||
'tc-approved-release': {
|
'tc-approved-release': {
|
||||||
'id': 'tc-approved-release',
|
'id': 'tc-approved-release',
|
||||||
'module_group_name': 'tc-approved-release',
|
'module_group_name': 'tc-approved-release',
|
||||||
'modules': [],
|
'modules': set(),
|
||||||
'releases': {
|
'releases': {
|
||||||
'liberty': ['sahara', 'sahara-extra',
|
'liberty': {'sahara', 'sahara-extra',
|
||||||
'sahara-image-elements'],
|
'sahara-image-elements'},
|
||||||
},
|
},
|
||||||
'tag': 'project_type'
|
'tag': 'project_type'
|
||||||
},
|
},
|
||||||
'type:library': {
|
'type:library': {
|
||||||
'id': 'type:library',
|
'id': 'type:library',
|
||||||
'module_group_name': 'type:library',
|
'module_group_name': 'type:library',
|
||||||
'modules': [],
|
'modules': set(),
|
||||||
'releases': {
|
'releases': {
|
||||||
'liberty': ['python-saharaclient', 'sahara-dashboard'],
|
'liberty': {'python-saharaclient', 'sahara-dashboard'},
|
||||||
},
|
},
|
||||||
'tag': 'project_type'
|
'tag': 'project_type'
|
||||||
},
|
},
|
||||||
'type:service': {
|
'type:service': {
|
||||||
'id': 'type:service',
|
'id': 'type:service',
|
||||||
'module_group_name': 'type:service',
|
'module_group_name': 'type:service',
|
||||||
'modules': [],
|
'modules': set(),
|
||||||
'releases': {
|
'releases': {
|
||||||
'liberty': ['sahara', 'sahara-extra',
|
'liberty': {'sahara', 'sahara-extra',
|
||||||
'sahara-image-elements'],
|
'sahara-image-elements'},
|
||||||
},
|
},
|
||||||
'tag': 'project_type'
|
'tag': 'project_type'
|
||||||
},
|
},
|
||||||
'openstack-official': {
|
'openstack-official': {
|
||||||
'id': 'openstack-official',
|
'id': 'openstack-official',
|
||||||
'module_group_name': 'openstack-official',
|
'module_group_name': 'openstack-official',
|
||||||
'modules': [],
|
'modules': set(),
|
||||||
'releases': {
|
'releases': {
|
||||||
'liberty': ['python-saharaclient', 'sahara',
|
'liberty': {'python-saharaclient', 'sahara',
|
||||||
'sahara-dashboard', 'sahara-extra',
|
'sahara-dashboard', 'sahara-extra',
|
||||||
'sahara-image-elements', 'sahara-specs'],
|
'sahara-image-elements', 'sahara-specs'},
|
||||||
},
|
},
|
||||||
'tag': 'project_type'
|
'tag': 'project_type'
|
||||||
},
|
},
|
||||||
'openstack-others': {
|
'openstack-others': {
|
||||||
'id': 'openstack-others',
|
'id': 'openstack-others',
|
||||||
'module_group_name': 'openstack-others',
|
'module_group_name': 'openstack-others',
|
||||||
'modules': [],
|
'modules': set(),
|
||||||
'releases': {},
|
'releases': {},
|
||||||
'tag': 'project_type'
|
'tag': 'project_type'
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user