2 from operator import itemgetter
3 from tic.utils.rpmmisc import meetRequireVersion
6 def make_view_data(pkg_group):
7 logger = logging.getLogger(__name__)
9 def _select_provide_rpm(capability, require):
11 if require.get('ver') is not None:
12 for provide in capability:
13 ver_data = provide['data']
14 if not ver_data.get('ver'):
15 ver_data = pkg_dict.get(provide['name']).get('version')
16 if meetRequireVersion(require, ver_data):
17 provide_list.append(provide)
19 provide_list = capability
22 for provide in provide_list:
23 result.append(pkg_dict[provide['name']])
27 def set_meta_require(meta_info):
28 meta_nodes = meta_info.get('nodes')
29 for child_meta in meta_nodes:
30 set_meta_require(child_meta)
33 pkg_info = pkg_dict[meta_info['metaname']]
34 for dep_tag in ['requires', 'recommends', 'suggests']:
35 if pkg_info.get(dep_tag):
36 for req in pkg_info.get(dep_tag):
38 if req['name'] in provides:
39 targets = _select_provide_rpm(provides[req['name']], req)
40 elif req['name'] in files:
41 for fname in files[req['name']]:
42 targets.append(pkg_dict.get(fname))
43 elif req['name'] in pkg_dict:
44 targets.append(pkg_dict.get(req['name']))
46 # the dependent package does not exist.
50 # The meta-pkg of the other group are excluded.
51 if not pkg.get('meta') and pkg['name'] not in duplicate:
52 refer_count[pkg['id']] += 1
53 duplicate.add(pkg['name'])
54 meta_nodes.append(make_node(pkg, meta_info.get('category')))
55 # Added 'zz' to non meta-package because they are to be listed last
56 meta_nodes = sorted(meta_nodes, key = lambda k: k['metaname'] if 'metaname' in k else 'zz'+k['text'])
57 meta_info['nodes'] = meta_nodes
58 def make_node(pkg_info, category=None):
59 n = dict(text=pkg_info['name'], nodes=[])
60 if category: n['category'] = category
62 def make_meta_node(pkgname, viewtext):
63 return dict(text=viewtext, metaname=pkgname, nodes=[])
65 # view_data for tree view on web-ui
67 # temporary dictionary for referencing meta
73 pkg_dict = pkg_group['pkg_dict']
74 provides = pkg_group['provides']
75 files = pkg_group['files']
76 refer_count = [0] * len(pkg_dict)
78 # sort meta-pkg by pkt_name in ascending order
79 meta_info = pkg_group.get('meta_info')
80 meta_info['root'] = sorted(meta_info['root'], key=itemgetter(0))
81 meta_info['sub1'] = sorted(meta_info['sub1'], key=itemgetter(0))
82 meta_info['sub2'] = sorted(meta_info['sub2'], key=itemgetter(0))
86 if meta_info.get('category'):
87 for category in meta_info['category']:
88 c_rpm = pkg_dict[category[0]]
89 if hasattr(c_rpm.get('suggests'), '__iter__'):
90 for suggest in c_rpm.get('suggests'):
91 category_dict[suggest['name']] = category[1]
93 logger.info(c_rpm.get('suggests'))
94 logger.info(c_rpm.get('name'))
98 for root in meta_info['root']:
99 root_node = make_meta_node(root[0], root[1])
100 view_ref[root[0]] = root_node
101 if root[0] in category_dict:
102 root_node['category'] = category_dict[root[0]]
103 view_data.append(root_node)
105 for sub1 in meta_info['sub1']:
106 sub1_node = make_meta_node(sub1[0], sub1[2])
107 view_ref[sub1[0]] = sub1_node
109 if sub1[1] in view_ref:
111 if 'category' in view_ref[sub1[1]] and view_ref[sub1[1]]['category']:
112 sub1_node['category'] = view_ref[sub1[1]]['category']
113 view_ref[sub1[1]]['nodes'].append(sub1_node)
115 # If root-meta does not exist, sub1 is added to top-level
116 view_data.append(sub1_node)
118 for sub2 in meta_info['sub2']:
119 sub2_node = make_meta_node(sub2[0], sub2[3])
120 view_ref[sub2[0]] = sub2_node
122 if sub2[2] in view_ref:
123 if 'category' in view_ref[sub2[2]] and view_ref[sub2[2]]['category']:
124 sub2_node['category'] = view_ref[sub2[2]]['category']
125 view_ref[sub2[2]]['nodes'].append(sub2_node)
127 elif sub2[1] in view_ref:
128 if view_ref[sub2[1]]['category']:
129 sub2_node['category'] = view_ref[sub2[1]]['category']
130 # If sub1-meta does not exist, sub2 is added to child of root-meta
131 view_ref[sub2[1]]['nodes'].append(sub2_node)
133 # If root-meta/sub1-meta does not exist, sub1 is added to top-level
134 view_data.append(sub2_node)
136 # configure meta dependency tree (requires)
137 for meta_pkg in view_data:
138 set_meta_require(meta_pkg)
140 #The remaining rpms are grouped into a MISC tree
142 misc_info['text'] = 'Advanced (individual packages)'
143 misc_info['nodes'] = []
144 for k, v in pkg_dict.iteritems():
145 # Pkg is not referenced from Meta-pkg
146 if not v.get('meta') and refer_count[v['id']] == 0:
147 misc_info['nodes'].append(make_node(v))
148 misc_info['nodes'] = sorted(misc_info['nodes'], key = lambda k: k['metaname'] if 'metaname' in k else k['text'])
150 view_data.append(misc_info)
151 logger.info('meta: %d, misc: %d', len(view_ref), len(misc_info['nodes']))