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