annotate farolluz/producttree.py @ 26:809db989cac5

Reorganize the code in smaller mpodules
author Benoît Allard <benoit.allard@greenbone.net>
date Fri, 24 Oct 2014 17:01:26 +0200
parents farolluz/cvrf.py@4004b67216a9
children b87f2a6e613a
rev   line source
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
2 #
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
3 # Authors:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
4 # BenoƮt Allard <benoit.allard@greenbone.net>
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
5 #
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
6 # Copyright:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
7 # Copyright (C) 2014 Greenbone Networks GmbH
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
8 #
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
9 # This program is free software; you can redistribute it and/or
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
10 # modify it under the terms of the GNU General Public License
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
11 # as published by the Free Software Foundation; either version 2
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
12 # of the License, or (at your option) any later version.
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
13 #
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
14 # This program is distributed in the hope that it will be useful,
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
17 # GNU General Public License for more details.
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
18 #
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
19 # You should have received a copy of the GNU General Public License
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
20 # along with this program; if not, write to the Free Software
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
21 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
22
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
23 """\
26
809db989cac5 Reorganize the code in smaller mpodules
Benoît Allard <benoit.allard@greenbone.net>
parents: 22
diff changeset
24 Product Tree Objects related to CVRF Documents
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
25 """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
26
26
809db989cac5 Reorganize the code in smaller mpodules
Benoît Allard <benoit.allard@greenbone.net>
parents: 22
diff changeset
27 from .common import ValidationError
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
28
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
29 class CVRFProductTree(object):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
30 def __init__(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
31 # All the branches, they can be order with their `parent` attribute
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
32 self._branches = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
33 self._groups = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
34 self._relationships = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
35 self._products = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
36 self._groups = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
37
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
38 def addProduct(self, product):
15
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
39 """ Add to the product list """
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
40 self._products.append(product)
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
41
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
42 def addRelationship(self, rel):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
43 self._relationships.append(rel)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
44
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
45 def addGroup(self, group):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
46 self._groups.append(group)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
47
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
48 def getProductForID(self, productid):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
49 for product in self._products:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
50 if product._productid == productid:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
51 return product
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
52 raise KeyError(productid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
53
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
54 def getGroupForID(self, groupid):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
55 for group in self._groups:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
56 if group._groupid == groupid:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
57 return group
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
58 raise KeyError(groupid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
59
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
60 def decomposeProduct(self, productid):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
61 """ In case of product defined as a relationship (product X installed
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
62 on OS Y), this gives us the following tuple: (OS, product). """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
63 product = self.getProductForID(productid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
64 parent = product._parent
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
65 if parent is None:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
66 return (None, None)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
67 if not isinstance(parent, CVRFRelationship):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
68 return (None, None)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
69 relationtype = parent._relationtype.replace(' ', '').lower()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
70 if relationtype not in ('defaultcomponentof', 'installedon'):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
71 return (None, None)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
72 return (
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
73 self.getProductForID(parent._relatestoproductreference),
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
74 self.getProductForID(parent._productreference)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
75 )
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
76
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
77 def getBranch(self, path):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
78 if len(path) == 0:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
79 return self
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
80 branches = self._branches
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
81 node = None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
82 for idx in path:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
83 node = branches[idx]
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
84 branches = node._childs
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
85 return node
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
86
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
87 def getBranches(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
88 for branch in self._branches:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
89 yield branch
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
90 for sub_branch in branch.getBranches():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
91 yield sub_branch
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
92
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
93 def getPath(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
94 return ()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
95
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
96 def getNameOfRelationship(self, relationship):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
97 if relationship is None:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
98 return ''
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
99 return ' '.join((self.getProductForID(relationship._productreference)._name, 'as',
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
100 relationship._relationtype.lower(),
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
101 self.getProductForID(relationship._relatestoproductreference)._name))
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
102
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
103 def getOrphanedBranches(self, product=None):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
104 """ The branches that could accept `product` as Product Definition """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
105 white_list = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
106 if product is not None:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
107 white_list = [product._parent]
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
108 for branch in self.getBranches():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
109 if (branch in white_list) or branch.isOrphaned():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
110 yield branch
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
111
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
112 def getNotTerminalBranches(self, b2=None):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
113 """\
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
114 The branches that could accept `b2` as new sub-branches
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
115 Note that b2 and all its sub-branches cannot be listed
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
116 """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
117 black_list = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
118 if b2 is not None:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
119 black_list = [b2] + list(b2.getBranches())
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
120 for branch in self.getBranches():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
121 if branch in black_list:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
122 continue
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
123 if branch._product is None:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
124 yield branch
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
125
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
126 def getOrphanedRelationships(self, product=None):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
127 """ The relationships that need a product defninition """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
128 white_list = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
129 if product is not None:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
130 white_list = [product.getCurrentRelationship()]
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
131 for i, relationship in enumerate(self._relationships):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
132 if (relationship in white_list) or relationship.isOrphaned():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
133 yield (i, relationship)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
134
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
135 def nbProducts(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
136 """ Amount of 'raw' Products """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
137 return len([p for p in self._products if p._parent is self])
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
138
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
139 def validate(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
140 for branch in self._branches:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
141 branch.validate()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
142 productids = set()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
143 for product in self._products:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
144 product.validate()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
145 if product._productid in productids:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
146 raise ValidationError('Each ProductID must be unique (%s)' % product._productid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
147 productids.add(product._productid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
148 for relationship in self._relationships:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
149 relationship.validate()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
150 for productid in (relationship._productreference,
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
151 relationship._relatestoproductreference):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
152 if productid not in productids:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
153 raise ValidationError('ProductID %s is unknown' % productid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
154 groupids = set()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
155 for group in self._groups:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
156 group.validate()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
157 if group._groupid in groupids:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
158 raise ValidationError('Duplicated GroupID: %s' % group._groupid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
159 groupids.add(group._groupid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
160 for productid in group._productids:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
161 if productid not in productids:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
162 raise ValidationError('ProductID %s is unknown' % productid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
163 return productids, groupids
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
164
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
165 def __str__(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
166 return 'Products: %s' % '\n'.join(str(p) for p in self._products)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
167
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
168
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
169 class CVRFProductBranch(object):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
170 TYPES = ('Vendor', 'Product Family', 'Product Name', 'Product Version',
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
171 'Patch Level', 'Service Pack', 'Architecture', 'Language',
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
172 'Legacy', 'Specification')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
173 def __init__(self, _type, name, parentbranch):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
174 self._type = _type
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
175 self._name = name
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
176 self._childs = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
177 self._product = None
15
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
178 self.link(parentbranch)
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
179
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
180 def getParent(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
181 return self._parentbranch
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
182
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
183 def getPath(self, string=False):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
184 """ return the path to that branch element as a tuple """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
185 if self.isRoot():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
186 for i, b in enumerate(self._parentbranch._branches):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
187 if b is self:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
188 if string:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
189 return '%d' % i
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
190 return (i, )
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
191 else:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
192 for i, b in enumerate(self._parentbranch._childs):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
193 if b is self:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
194 if string:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
195 return '/'.join([self._parentbranch.getPath(string), '%d' % i])
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
196 return self._parentbranch.getPath(string) + (i,)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
197 if string:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
198 return ''
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
199 return ()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
200
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
201 def getTree(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
202 """ this returns a list of tuples (type, name) leading to here"""
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
203 if self.isRoot():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
204 return [(self._type, self._name)]
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
205 return self._parentbranch.getTree() + [(self._type, self._name)]
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
206
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
207 def getName(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
208 return ' / '.join("%s: %s" % (type_, name) for type_, name in self.getTree())
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
209
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
210 def getParentPath(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
211 """ return as string the path to the parent """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
212 return '/'.join('%s' % p for p in self.getPath()[:-1])
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
213
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
214 def isRoot(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
215 return isinstance(self._parentbranch, CVRFProductTree)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
216
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
217 def isOrphaned(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
218 """ Has no childs and no product """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
219 return len(self._childs) == 0 and (self._product is None)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
220
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
221 def getBranches(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
222 for branch in self._childs:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
223 yield branch
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
224 for sub_branch in branch.getBranches():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
225 yield sub_branch
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
226
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
227 def unlink(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
228 """ Unset our _parent, and remove us from the _parent._childs """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
229 if self.isRoot():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
230 self.getParent()._branches.remove(self)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
231 else:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
232 self.getParent()._childs.remove(self)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
233 self._parentbranch = None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
234
15
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
235 def link(self, parent):
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
236 """ Actually, only set the parent """
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
237 self._parentbranch = parent
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
238 if self.isRoot():
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
239 parent._branches.append(self)
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
240 else:
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
241 parent._childs.append(self)
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
242
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
243
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
244 def validate(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
245 if not self._type:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
246 raise ValidationError('A Branch must have a Type')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
247 if self._type not in self.TYPES:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
248 raise ValidationError('A Branch Type must be one of %s' % ', '.join(self.TYPES))
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
249 if not self._name:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
250 raise ValidationError('A Branch must have a Name')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
251 for branch in self._childs:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
252 branch.validate()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
253 if self.isOrphaned():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
254 raise ValidationError('A Branch must have at least a sub-product or sub-branches')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
255
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
256 def __str__(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
257 return "%s: %s" % (self._type, self._name)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
258
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
259
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
260 class CVRFFullProductName(object):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
261 def __init__(self, productid, name, parent, cpe=None):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
262 self._productid = productid
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
263 self._name = name
15
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
264 self._cpe = cpe
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
265 # Can be None (directly under the tree), a ProductBranch, or a
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
266 # Relationship
15
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
267 self.link(parent)
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
268
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
269 def isRoot(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
270 return isinstance(self._parent, CVRFProductTree)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
271
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
272 def isRelationship(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
273 return isinstance(self._parent, CVRFRelationship)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
274
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
275 def getTree(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
276 if not isinstance(self._parent, CVRFProductBranch):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
277 return []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
278 return self._parent.getTree()
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
279
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
280 def getParentPath(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
281 if self.isRoot() or self.isRelationship():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
282 return ''
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
283 return self._parent.getPath(True)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
284
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
285 def getCurrentRelationship(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
286 if self.isRelationship():
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
287 return self._parent
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
288 return None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
289
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
290 def unlink(self):
15
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
291 """ Unset our _parent, and remove us from the _parent._childs
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
292 We are still in the product list.
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
293 """
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
294 if not self.isRoot():
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
295 self._parent._product = None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
296 self._parent = None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
297
15
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
298 def link(self, parent):
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
299 self._parent = parent
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
300 if not self.isRoot():
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
301 parent._product = self
dcc946b30343 Consolidate productTree edition
Benoît Allard <benoit.allard@greenbone.net>
parents: 14
diff changeset
302
0
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
303 def validate(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
304 if not self._productid:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
305 raise ValidationError('A Product must have a ProductID')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
306 if not self._name:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
307 raise ValidationError('A Product must have a Name')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
308
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
309 def __str__(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
310 return "%s (%s)" % (self._productid, self._name)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
311
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
312
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
313 class CVRFRelationship(object):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
314 TYPES = ('Default Component Of', 'Optional Component Of',
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
315 'External Component Of', 'Installed On', 'Installed With')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
316 def __init__(self, productref, reltype, relatestoproductref):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
317 self._productreference = productref
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
318 self._relationtype = reltype
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
319 self._relatestoproductreference = relatestoproductref
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
320 self._product = None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
321
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
322 def getParent(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
323 """ All parent element of a FullProductName should implement that
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
324 method """
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
325 return None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
326
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
327 def isOrphaned(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
328 return self._product is None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
329
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
330 def validate(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
331 if not self._productreference:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
332 raise ValidationError('A Relationship must have a Product Reference')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
333 if not self._relationtype:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
334 raise ValidationError('A Relationship must have a Relation Type')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
335 if self._relationtype not in self.TYPES:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
336 raise ValidationError('Relation Type must be one of %s' % ', '.join(self.TYPES))
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
337 if not self._relatestoproductreference:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
338 raise ValidationError('A Relationship must have a "Relates To product Reference"')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
339 if self._productreference == self._relatestoproductreference:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
340 raise ValidationError('A Relationship cannot reference twice the same Product')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
341
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
342
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
343 class CVRFGroup(object):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
344 def __init__(self, groupid):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
345 self._groupid = groupid
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
346 self._description = None
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
347 self._productids = []
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
348
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
349 def setDescription(self, description):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
350 self._description = description
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
351
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
352 def addProductID(self, productid):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
353 self._productids.append(productid)
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
354
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
355 def getTitle(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
356 if self._description:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
357 return "%s (%d products)" % (self._description, len(self._productids))
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
358 return "#%s (%d products)" % (self._groupid, len(self._productids))
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
359
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
360 def validate(self):
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
361 if not self._groupid:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
362 raise ValidationError('A Group must have a GroupID')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
363 if not self._productids or len(self._productids) < 2:
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
364 raise ValidationError('A Group must contain at least two products')
e18b61a73a68 Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
365
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)