2 from operator import itemgetter
5 def make_view_data(pkg_group):
6 logger = logging.getLogger(__name__)
8 def set_meta_require(meta_info):
9 meta_nodes = meta_info.get('nodes')
10 for child_meta in meta_nodes:
11 refer_count[child_meta['id']] += 1
12 set_meta_require(child_meta)
14 req_list = pkg_dict[meta_info['text']].get('requires')
15 if req_list is not None:
17 if provides.get(req['name']):
18 provide_info = provides[req['name']][0]
19 pkg_name = provide_info['name']
20 if 'meta' not in pkg_dict[pkg_name]:
21 child_pkg = pkg_dict[pkg_name]
22 meta_nodes.append(make_node(child_pkg))
23 refer_count[child_pkg['id']] += 1
25 # The meta-pkg of the other group are excluded.
26 # the dependent package does not exist.
29 def make_node(pkg_info):
30 return dict(id=pkg_info['id'], text=pkg_info['name'], nodes=[])
32 # view_data for tree view on web-ui
34 # temporary dictionary for referencing meta
40 pkg_dict = pkg_group['pkg_dict']
41 provides = pkg_group['provides']
42 refer_count = [0] * len(pkg_dict)
44 # sort by pkg_name ([0]:name, [1]:root, [2]:sub1)
45 meta_info = pkg_group.get('meta_info')
46 meta_info['root'] = sorted(meta_info['root'], key=itemgetter(0))
47 meta_info['sub1'] = sorted(meta_info['sub1'], key=itemgetter(0))
48 meta_info['sub2'] = sorted(meta_info['sub2'], key=itemgetter(0))
51 for root in meta_info['root']:
52 root_node = make_node(pkg_dict[root[0]])
53 view_ref[root[0]] = root_node
54 view_data.append(root_node)
56 for sub1 in meta_info['sub1']:
57 sub1_node = make_node(pkg_dict[sub1[0]])
58 view_ref[sub1[0]] = sub1_node
60 if sub1[1] in view_ref:
62 view_ref[sub1[1]]['nodes'].append(sub1_node)
64 # If root-meta does not exist, sub1 is added to top-level
65 view_data.append(sub1_node)
67 for sub2 in meta_info['sub2']:
68 sub2_node = make_node(pkg_dict[sub2[0]])
69 view_ref[sub2[0]] = sub2_node
71 if sub2[2] in view_ref:
72 view_ref[sub2[2]]['nodes'].append(sub2_node)
74 elif sub2[1] in view_ref:
75 # If sub1-meta does not exist, sub2 is added to child of root-meta
76 view_ref[sub2[1]]['nodes'].append(sub2_node)
78 # If root-meta/sub1-meta does not exist, sub1 is added to top-level
79 view_data.append(sub2_node)
81 # configure meta dependency tree (requires)
82 for meta_pkg in view_data:
83 refer_count[meta_pkg['id']] += 1
84 set_meta_require(meta_pkg)
86 #The remaining rpms are grouped into a MISC tree
88 misc_info['text'] = 'MISC'
89 misc_info['nodes'] = []
90 for k, v in pkg_dict.iteritems():
91 # Pkg is not referenced from Meta-pkg
92 if refer_count[v['id']] == 0:
93 misc_info['nodes'].append(make_node(v))
95 logger.info('meta: %d, misc: %d', len(view_ref), len(misc_info['nodes']))
97 view_data.append(misc_info)