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:
Ilya Shakhat
2015-10-19 16:24:14 +03:00
parent 5549ead1e4
commit fa0b8ec9d4
9 changed files with 49 additions and 38 deletions

View File

@@ -128,7 +128,7 @@ def extend_user(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 = module_id.lower()
@@ -142,13 +142,20 @@ def extend_module(module_id):
if name[0].islower():
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 = []
for m in module['modules']:
child = {'module_name': m}
for m, r in own_sub_modules:
child = {'module_name': m, 'visible': (m, r) in visible_sub_modules}
if m in repos_index:
child['repo_uri'] = repos_index[m]['uri']
child_modules.append(child)
child_modules.sort(key=lambda x: x['module_name'])
return {
'id': module_id,
'name': name,

View File

@@ -503,3 +503,7 @@ div.stackamenu li.current-menu-item a span {
width: 99%;
height: 350px;
}
.disabled {
color: grey;
}

View File

@@ -10,7 +10,6 @@
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");
}
});
@@ -42,7 +41,9 @@
{%else%}
Modules:
{%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%}
</div>
</div>

View File

@@ -341,7 +341,9 @@ def get_company(company_name, **kwargs):
@decorators.cached()
@decorators.jsonify('module')
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:
flask.abort(404)
return module

View File

@@ -30,7 +30,7 @@ def _make_module_group(module_groups, name):
m = module_groups[name] # object created by defaultdict
m['tag'] = 'project_type'
m['module_group_name'] = name
m['releases'] = collections.defaultdict(list)
m['releases'] = collections.defaultdict(set)
return m
@@ -42,7 +42,7 @@ def read_legacy_programs_yaml(module_groups, release_name, content):
mn = module['repo'].split('/')[1] # module_name
# 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):
@@ -56,7 +56,7 @@ def read_early_big_tent_projects_yaml(module_groups, release_name, content):
mn = repo_split[1]
# 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):
@@ -76,18 +76,18 @@ def read_big_tent_projects_yaml(module_groups, release_name, content):
mn = repo_split[1] # module_name
module_groups[group_id]['modules'].append(mn)
all_official['releases'][release_name].append(mn)
module_groups[group_id]['modules'].add(mn)
all_official['releases'][release_name].add(mn)
tags = deliverable.get('tags', [])
for 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():
# create default module groups
module_groups = collections.defaultdict(lambda: {'modules': []})
module_groups = collections.defaultdict(lambda: {'modules': set()})
# openstack official
_make_module_group(module_groups, 'openstack-official')
@@ -130,10 +130,5 @@ def process_official_list(releases):
# set ids for module groups
for group_id, group in six.iteritems(module_groups):
group['id'] = group_id
group['modules'].sort()
if 'releases' in group:
for gr in six.itervalues(group['releases']):
gr.sort()
return module_groups

View File

@@ -263,7 +263,7 @@ def process_project_list(runtime_storage_inst):
for module in module_groups['openstack']['modules']:
for r, off_m in six.iteritems(official):
if module not in off_m:
others['releases'][r].append(module)
others['releases'][r].add(module)
# register modules as module groups
repos = runtime_storage_inst.get_by_key('repos') or []

View File

@@ -290,7 +290,7 @@ def keep_safe_chars(s):
def make_module_group(module_group_id, name=None, modules=None, tag='module'):
return {'id': 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}
BAD_NAME_SUFFIXES = ['Ltd', 'Pvt', 'Inc', 'GmbH', 'AG', 'Corporation', 'Corp',

View File

@@ -104,6 +104,7 @@ class TestAPIModules(test_api.TestAPI):
{'id': 'nova',
'modules': [
{'module_name': 'nova',
'visible': True,
'repo_uri': 'git://git.openstack.org/openstack/nova.git'}
],
'name': 'Nova', 'tag': 'module'}, module)
@@ -112,9 +113,10 @@ class TestAPIModules(test_api.TestAPI):
module = test_api.load_json(response)['module']
self.assertEqual(
{'id': 'nova-group',
'modules': [
{'module_name': 'nova-cli'},
{'module_name': 'nova',
'repo_uri': 'git://git.openstack.org/openstack/nova.git'}
'modules': [{
'module_name': 'nova',
'visible': True,
'repo_uri': 'git://git.openstack.org/openstack/nova.git'},
{'module_name': 'nova-cli', 'visible': False},
],
'name': 'Nova-group', 'tag': 'group'}, module)

View File

@@ -69,55 +69,55 @@ class TestGovernance(testtools.TestCase):
'sahara-group': {
'id': 'sahara-group',
'module_group_name': 'Sahara Official',
'modules': ['python-saharaclient', 'sahara',
'modules': {'python-saharaclient', 'sahara',
'sahara-dashboard', 'sahara-extra',
'sahara-image-elements', 'sahara-specs'],
'sahara-image-elements', 'sahara-specs'},
'tag': 'program'
},
'tc-approved-release': {
'id': 'tc-approved-release',
'module_group_name': 'tc-approved-release',
'modules': [],
'modules': set(),
'releases': {
'liberty': ['sahara', 'sahara-extra',
'sahara-image-elements'],
'liberty': {'sahara', 'sahara-extra',
'sahara-image-elements'},
},
'tag': 'project_type'
},
'type:library': {
'id': 'type:library',
'module_group_name': 'type:library',
'modules': [],
'modules': set(),
'releases': {
'liberty': ['python-saharaclient', 'sahara-dashboard'],
'liberty': {'python-saharaclient', 'sahara-dashboard'},
},
'tag': 'project_type'
},
'type:service': {
'id': 'type:service',
'module_group_name': 'type:service',
'modules': [],
'modules': set(),
'releases': {
'liberty': ['sahara', 'sahara-extra',
'sahara-image-elements'],
'liberty': {'sahara', 'sahara-extra',
'sahara-image-elements'},
},
'tag': 'project_type'
},
'openstack-official': {
'id': 'openstack-official',
'module_group_name': 'openstack-official',
'modules': [],
'modules': set(),
'releases': {
'liberty': ['python-saharaclient', 'sahara',
'liberty': {'python-saharaclient', 'sahara',
'sahara-dashboard', 'sahara-extra',
'sahara-image-elements', 'sahara-specs'],
'sahara-image-elements', 'sahara-specs'},
},
'tag': 'project_type'
},
'openstack-others': {
'id': 'openstack-others',
'module_group_name': 'openstack-others',
'modules': [],
'modules': set(),
'releases': {},
'tag': 'project_type'
}