Mercurial > farol > farol
annotate farol/producttree.py @ 178:e46fb0027e52 tip
Added tag 1.1.1 for changeset ae584cfe6252
author | Benoît Allard <benoit.allard@greenbone.net> |
---|---|
date | Thu, 08 Jan 2015 14:37:57 +0100 |
parents | 1d63a532ccce |
children |
rev | line source |
---|---|
0 | 1 # -*- encoding: utf-8 -*- |
2 # Description: | |
3 # Web stuff about the ProductTree | |
4 # | |
5 # Authors: | |
6 # BenoƮt Allard <benoit.allard@greenbone.net> | |
7 # | |
8 # Copyright: | |
9 # Copyright (C) 2014 Greenbone Networks GmbH | |
10 # | |
11 # This program is free software; you can redistribute it and/or | |
12 # modify it under the terms of the GNU General Public License | |
13 # as published by the Free Software Foundation; either version 2 | |
14 # of the License, or (at your option) any later version. | |
15 # | |
16 # This program is distributed in the hope that it will be useful, | |
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 # GNU General Public License for more details. | |
20 # | |
21 # You should have received a copy of the GNU General Public License | |
22 # along with this program; if not, write to the Free Software | |
23 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
24 | |
25 """\ | |
26 Web-stuff about the producttree | |
27 """ | |
28 | |
29 from functools import wraps | |
30 | |
31 from flask import Blueprint, render_template, redirect, url_for, abort, request, flash | |
32 | |
33 from farolluz.cvrf import (CVRFProductBranch, CVRFFullProductName, | |
34 CVRFRelationship, CVRFGroup) | |
163
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
35 from farolluz.parsers.cpe import parse as parseCPE |
0 | 36 from .session import document_required, get_current |
37 | |
38 producttree = Blueprint('producttree', __name__) | |
39 | |
40 def producttree_required(f): | |
41 @wraps(f) | |
42 def decorated_function(*args, **kwargs): | |
43 if get_current()._producttree is None: | |
44 flash('Operation invalid without producttree', 'warning') | |
22
dbfe89e3c6fe
Fix producttree urls
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
45 return redirect(url_for('document.view')) |
0 | 46 return f(*args, **kwargs) |
47 return decorated_function | |
48 | |
49 @producttree.route('/create', methods=['POST']) | |
50 @document_required | |
51 def create(): | |
52 get_current().createProductTree() | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
53 return redirect(url_for('.view')) |
0 | 54 |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
55 @producttree.route('/') |
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
56 @document_required |
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
57 @producttree_required |
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
58 def view(): |
86
2d41121ec991
Fix issue when relation are defined
Benoît Allard <benoit.allard@greenbone.net>
parents:
85
diff
changeset
|
59 cvrf = get_current() |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
60 return render_template('producttree/view.j2', |
86
2d41121ec991
Fix issue when relation are defined
Benoît Allard <benoit.allard@greenbone.net>
parents:
85
diff
changeset
|
61 producttree=cvrf._producttree, cvrf=cvrf) |
0 | 62 |
99
0b9f19f51d79
Add deletion of the whole Product Tree
Benoît Allard <benoit.allard@greenbone.net>
parents:
88
diff
changeset
|
63 @producttree.route('/delete', methods=['POST']) |
0b9f19f51d79
Add deletion of the whole Product Tree
Benoît Allard <benoit.allard@greenbone.net>
parents:
88
diff
changeset
|
64 @producttree_required |
0b9f19f51d79
Add deletion of the whole Product Tree
Benoît Allard <benoit.allard@greenbone.net>
parents:
88
diff
changeset
|
65 def delete(): |
135
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
66 if not cvrf.isProductTreeOrphan(): |
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
67 flash('Not deleting the Product Tree, some Products are mentionned in the document', 'danger') |
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
68 return redirect(url_for('.view')) |
99
0b9f19f51d79
Add deletion of the whole Product Tree
Benoît Allard <benoit.allard@greenbone.net>
parents:
88
diff
changeset
|
69 get_current()._producttree = None |
0b9f19f51d79
Add deletion of the whole Product Tree
Benoît Allard <benoit.allard@greenbone.net>
parents:
88
diff
changeset
|
70 return redirect(url_for('document.view')) |
0b9f19f51d79
Add deletion of the whole Product Tree
Benoît Allard <benoit.allard@greenbone.net>
parents:
88
diff
changeset
|
71 |
0 | 72 @producttree.route('/branch/<path:path>/edit', methods=['GET', 'POST']) |
73 @document_required | |
74 @producttree_required | |
75 def edit_branch(path): | |
76 path = [int(p) for p in path.split('/')] | |
77 cvrf = get_current() | |
78 ptree = cvrf._producttree | |
78
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
79 try: branch = cvrf._producttree.getBranch(path) |
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
80 except (ValueError, IndexError): abort(404) |
0 | 81 if request.method != 'POST': |
82 branches = [('', '')] + [(b.getName(), b.getPath(True)) for b in ptree.getNotTerminalBranches(branch)] | |
85
b6a48669edb8
Don't create a branch only to have empty name
Benoît Allard <benoit.allard@greenbone.net>
parents:
84
diff
changeset
|
83 return render_template('producttree/edit_branch.j2', |
b6a48669edb8
Don't create a branch only to have empty name
Benoît Allard <benoit.allard@greenbone.net>
parents:
84
diff
changeset
|
84 _type=branch._type, name=branch._name, parentpath=branch.getParentPath(), |
b6a48669edb8
Don't create a branch only to have empty name
Benoît Allard <benoit.allard@greenbone.net>
parents:
84
diff
changeset
|
85 branches=branches, types=branch.TYPES) |
0 | 86 |
87 pbranch = ptree | |
88 if request.form['parent']: | |
78
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
89 try: pbranch = ptree.getBranch([int(p) for p in request.form['parent'].split('/')]) |
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
90 except (ValueError, IndexError): abort(404) |
0 | 91 |
92 if pbranch is not branch.getParent(): | |
93 # We have to 're-link' the element ... | |
94 # 1. unlink | |
95 branch.unlink() | |
96 # 2. set the new parent | |
82
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
97 branch.link(pbranch) |
0 | 98 |
99 branch._type = request.form['type'] | |
100 branch._name = request.form['name'] | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
101 return redirect(url_for('.view')) |
0 | 102 |
103 @producttree.route('/branch/add', methods=['GET', 'POST']) | |
104 @document_required | |
105 @producttree_required | |
106 def add_branch(): | |
107 cvrf = get_current() | |
108 ptree = cvrf._producttree | |
109 if request.method != 'POST': | |
110 branches = [('', '')] + [(b.getName(), b.getPath(True)) for b in ptree.getNotTerminalBranches()] | |
85
b6a48669edb8
Don't create a branch only to have empty name
Benoît Allard <benoit.allard@greenbone.net>
parents:
84
diff
changeset
|
111 return render_template('producttree/edit_branch.j2', |
b6a48669edb8
Don't create a branch only to have empty name
Benoît Allard <benoit.allard@greenbone.net>
parents:
84
diff
changeset
|
112 action='Add', |
b6a48669edb8
Don't create a branch only to have empty name
Benoît Allard <benoit.allard@greenbone.net>
parents:
84
diff
changeset
|
113 branches=branches, types=CVRFProductBranch.TYPES) |
0 | 114 |
115 pbranch = ptree | |
116 if request.form['parent']: | |
78
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
117 try: pbranch = ptree.getBranch([int(p) for p in request.form['parent'].split('/')]) |
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
118 except (ValueError, IndexError): abort(404) |
0 | 119 branch = CVRFProductBranch(request.form['type'], request.form['name'], pbranch) |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
120 return redirect(url_for('.view')) |
0 | 121 |
80
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
122 @producttree.route('/branch/<path:path>/del', methods=['POST']) |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
123 @document_required |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
124 @producttree_required |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
125 def del_branch(path): |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
126 path = [int(p) for p in path.split('/')] |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
127 cvrf = get_current() |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
128 ptree = cvrf._producttree |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
129 try: branch = cvrf._producttree.getBranch(path) |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
130 except (ValueError, IndexError): |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
131 flash('Cannot find Branch', 'danger') |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
132 abort(404) |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
133 if branch._childs: |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
134 flash('Cannot delete a branch with childs', 'danger') |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
135 abort(403) |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
136 branch.unlink() |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
137 del branch |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
138 return redirect(url_for('.view')) |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
139 |
c00f20bd90ba
Allow deletion of (orphaned) Branches
Benoît Allard <benoit.allard@greenbone.net>
parents:
78
diff
changeset
|
140 |
0 | 141 @producttree.route('/product/<productid>') |
142 @document_required | |
143 @producttree_required | |
144 def view_product(productid): | |
145 cvrf = get_current() | |
146 try: | |
147 product = cvrf.getProductForID(productid) | |
136
64a6e69d54fc
Fix an issue where the Wrong Exception was being caught.
Benoît Allard <benoit.allard@greenbone.net>
parents:
135
diff
changeset
|
148 except KeyError: |
0 | 149 abort(404) |
106
4ea7966dcc99
Show where a Product is referenced in the Document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
99
diff
changeset
|
150 return render_template('producttree/view_product.j2', |
4ea7966dcc99
Show where a Product is referenced in the Document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
99
diff
changeset
|
151 product=product, groups=[g for g in cvrf._producttree._groups if productid in g._productids], |
4ea7966dcc99
Show where a Product is referenced in the Document.
Benoît Allard <benoit.allard@greenbone.net>
parents:
99
diff
changeset
|
152 cvrf=cvrf) |
0 | 153 |
154 @producttree.route('/product/<productid>/edit', methods=['GET', 'POST']) | |
155 @document_required | |
156 @producttree_required | |
157 def edit_product(productid): | |
158 cvrf = get_current() | |
159 ptree = cvrf._producttree | |
160 try: | |
161 product = cvrf.getProductForID(productid) | |
162 except KeyError: | |
163 abort(404) | |
164 | |
165 if request.method != 'POST': | |
166 current_rel = '' | |
167 if product.isRelationship(): | |
168 current_rel = str(ptree._relationships.index(product.getCurrentRelationship())) | |
169 leaves = [('', '')] + [(b.getName(), b.getPath(True)) for b in ptree.getOrphanedBranches(product)] | |
170 rels = [('', '')] + [(ptree.getNameOfRelationship(r), str(i)) for i, r in ptree.getOrphanedRelationships(product)] | |
171 return render_template('producttree/edit_product.j2', product=product, action='Update', orphaned_leaves=leaves, orphaned_relationships=rels, current_rel=current_rel) | |
172 | |
173 if request.form['parent_branch'] and request.form['parent_relationship']: | |
174 flash('Cannot set a parent branch and parent relationship', 'danger') | |
175 return redirect(url_for('.edit_product', productid=productid)) | |
176 | |
177 oldp = product._parent | |
178 if request.form['parent_branch']: | |
78
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
179 try: pbranch = ptree.getBranch([int(p) for p in request.form['parent_branch'].split('/')]) |
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
180 except (ValueError, IndexError): abort(404) |
0 | 181 if pbranch is not oldp: |
182 # Gonna be funny, needs re-link | |
183 product.unlink() | |
82
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
184 # And Link again |
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
185 product.link(pbranch) |
0 | 186 elif request.form['parent_relationship']: |
187 prel = ptree._relationships[int(request.form['parent_relationship'])] | |
188 if prel is not oldp: | |
82
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
189 # Unlink |
0 | 190 product.unlink() |
82
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
191 # Link again |
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
192 product.link(prel) |
0 | 193 else: |
194 if ptree is not oldp: | |
82
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
195 # Unlink |
0 | 196 product.unlink() |
82
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
197 # Link again |
d6fa288e92a7
Update to latest farolluz (unlink/link)
Benoît Allard <benoit.allard@greenbone.net>
parents:
80
diff
changeset
|
198 product.link(ptree) |
0 | 199 |
139
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
200 if (request.form['productid'] != product._productid) and not cvrf.isProductOrphan(product._productid): |
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
201 flash('Also updating the ProductID for %s in this Document' % request.form['name'], 'info') |
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
202 cvrf.changeProductID(product._productid, request.form['productid']) |
0 | 203 product._productid = request.form['productid'] |
204 product._name = request.form['name'] | |
205 product._cpe = request.form['cpe'] or None | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
206 return redirect(url_for('.view')) |
0 | 207 |
208 @producttree.route('/product/add', methods=['GET', 'POST']) | |
209 @document_required | |
210 @producttree_required | |
211 def add_product(): | |
212 cvrf = get_current() | |
213 ptree = cvrf._producttree | |
214 | |
215 if request.method != 'POST': | |
216 product=CVRFFullProductName('', '', ptree) | |
217 leaves = [('', '')] + [(b.getName(), b.getPath(True)) for b in ptree.getOrphanedBranches()] | |
218 rels = [('', '')] + [(ptree.getNameOfRelationship(r), str(i)) for i, r in ptree.getOrphanedRelationships()] | |
219 return render_template('producttree/edit_product.j2', product=product, action='Add', orphaned_leaves=leaves, orphaned_relationships=rels, current_rel='') | |
220 | |
163
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
221 if bool(request.form['parent_branch']) + bool(request.form['parent_relationship']) + bool(request.form['from_cpe']) > 1: |
0 | 222 flash('Cannot set a parent branch and parent relationship', 'danger') |
62
ce49bd1512dd
Make pyflafes a happier
Benoît Allard <benoit.allard@greenbone.net>
parents:
45
diff
changeset
|
223 return redirect(url_for('.add_product')) |
0 | 224 |
163
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
225 if request.form['from_cpe'] and not request.form['cpe']: |
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
226 flash('You need to specify the cpe value to infer the branching/relation from that value.', 'danger') |
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
227 return redirect(url_for('.add_product')) |
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
228 |
0 | 229 parent = ptree |
230 if request.form['parent_branch']: | |
83
2ecf13200e87
Fix issue from a previous commit
Benoît Allard <benoit.allard@greenbone.net>
parents:
82
diff
changeset
|
231 try: parent = ptree.getBranch([int(p) for p in request.form['parent_branch'].split('/')]) |
78
264d4579f6bf
More input validation
Benoît Allard <benoit.allard@greenbone.net>
parents:
62
diff
changeset
|
232 except (ValueError, IndexError): abort(404) |
0 | 233 elif request.form['parent_relationship']: |
234 parent = ptree._relationships[int(request.form['parent_relationship'])] | |
163
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
235 elif request.form['from_cpe']: |
1d63a532ccce
Add possibility to create product Tree from the cpe itself.
Benoît Allard <benoit.allard@greenbone.net>
parents:
139
diff
changeset
|
236 parent = parseCPE(request.form['cpe']).addToDoc(cvrf, finalProduct=False) |
0 | 237 |
238 product = CVRFFullProductName(request.form['productid'], request.form['name'], parent, request.form['cpe'] or None) | |
239 ptree.addProduct(product) | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
240 return redirect(url_for('.view')) |
0 | 241 |
84
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
242 @producttree.route('/product/<productid>/del', methods=['POST']) |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
243 @document_required |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
244 @producttree_required |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
245 def del_product(productid): |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
246 cvrf = get_current() |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
247 ptree = cvrf._producttree |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
248 try: |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
249 product = cvrf.getProductForID(productid) |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
250 except KeyError: |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
251 abort(404) |
135
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
252 if not cvrf.isProductOrphan(product._productid): |
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
253 flash('Not deleting the Product, it is used in the Document.', 'danger') |
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
254 return redirect(url_for('.view_product', productid=product._productid)) |
84
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
255 product.unlink() |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
256 ptree._products.remove(product) |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
257 del product |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
258 return redirect(url_for('.view')) |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
259 |
cc836f9e869e
Allow deletion of Products
Benoît Allard <benoit.allard@greenbone.net>
parents:
83
diff
changeset
|
260 |
0 | 261 @producttree.route('/relationship/<int:index>/edit', methods=['GET', 'POST']) |
262 @document_required | |
263 @producttree_required | |
264 def edit_relationship(index): | |
265 cvrf = get_current() | |
266 ptree = cvrf._producttree | |
267 try: | |
268 rel = ptree._relationships[index] | |
269 except IndexError: | |
270 abort(404) | |
271 | |
272 if request.method != 'POST': | |
273 return render_template('producttree/edit_relationship.j2', productreference=rel._productreference, relationtype=rel._relationtype, relatestoproductreference=rel._relatestoproductreference, types=rel.TYPES) | |
274 | |
275 rel._productreference = request.form['productreference'] | |
276 rel._relationtype = request.form['relationtype'] | |
277 rel._relatestoproductreference = request.form['relatestoproductreference'] | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
278 return redirect(url_for('.view')) |
0 | 279 |
280 @producttree.route('/relationship/add', methods=['GET', 'POST']) | |
281 @document_required | |
282 @producttree_required | |
283 def add_relationship(): | |
284 cvrf = get_current() | |
285 ptree = cvrf._producttree | |
286 if len(ptree._products) < 2: | |
287 flash('You need to have at least two products to create a relationship', 'warning') | |
288 return redirect(url_for('.add_product')) | |
289 | |
290 if request.method != 'POST': | |
291 return render_template('producttree/edit_relationship.j2', action='Add', types=CVRFRelationship.TYPES) | |
292 | |
293 prodid1 = request.form['productreference'] | |
294 prodid2 = request.form['relatestoproductreference'] | |
295 | |
296 if prodid1 == prodid2: | |
297 flash('You cannot create a relationship with the same product twice', 'danger') | |
298 return redirect(url_for('.add_relationship')) | |
299 | |
300 rel = CVRFRelationship(prodid1, request.form['relationtype'], prodid2) | |
301 ptree.addRelationship(rel) | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
302 return redirect(url_for('.view')) |
0 | 303 |
87
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
304 @producttree.route('/relationship/<int:index>/del', methods=['POST']) |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
305 @document_required |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
306 @producttree_required |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
307 def del_relationship(index): |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
308 rels = get_current()._producttree._relationships |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
309 if not (0 <= index < len(rels)): |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
310 flash('Relationship not found', 'danger') |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
311 abort(404) |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
312 rel = rels[index] |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
313 |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
314 if not rel.isOrphaned(): |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
315 flash('Not able to delete Relationship with Product', 'danger') |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
316 abort(403) |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
317 |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
318 del rels[index] |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
319 return redirect(url_for('.view')) |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
320 |
e02724c84bae
Add deletion of (orphaned) relationships
Benoît Allard <benoit.allard@greenbone.net>
parents:
86
diff
changeset
|
321 |
0 | 322 @producttree.route('/group/<groupid>/edit', methods=['GET', 'POST']) |
323 @document_required | |
324 @producttree_required | |
325 def edit_group(groupid): | |
139
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
326 cvrf = get_current() |
0 | 327 try: |
139
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
328 group = cvrf.getGroupForID(groupid) |
0 | 329 except KeyError: |
330 abort(404) | |
331 if request.method != 'POST': | |
332 return render_template('producttree/edit_group.j2', groupid=group._groupid, description=group._description, productids=group._productids) | |
333 | |
139
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
334 if (request.form['groupid'] != group._groupid) and not cvrf.isGroupOrphan(group._groupid): |
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
335 flash('Also updating the groupid in the whole document.', 'info') |
584587a000a2
Propagate ProductID and GroupID updates in the whole document
Benoît Allard <benoit.allard@greenbone.net>
parents:
136
diff
changeset
|
336 cvrf.changeGroupID(group._groupid, request.form['groupid']) |
0 | 337 group._groupid = request.form['groupid'] |
338 group.setDescription(request.form['description'] or None) | |
339 group._productids = [] | |
340 for productid in request.form.getlist('products'): | |
341 group.addProductID(productid) | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
342 return redirect(url_for('.view')) |
0 | 343 |
344 @producttree.route('/group/add', methods=['GET', 'POST']) | |
345 @document_required | |
346 @producttree_required | |
347 def add_group(): | |
348 if request.method != 'POST': | |
349 return render_template('producttree/edit_group.j2', action='Add') | |
350 | |
351 group = CVRFGroup(request.form['groupid']) | |
352 group.setDescription(request.form['description'] or None) | |
353 for productid in request.form.getlist('products'): | |
354 group.addProductID(productid) | |
355 get_current()._producttree.addGroup(group) | |
45
7c4d001839e7
Move the Display of the ProductTree to its own page
Benoît Allard <benoit.allard@greenbone.net>
parents:
22
diff
changeset
|
356 return redirect(url_for('.view')) |
88
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
357 |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
358 @producttree.route('/group/<groupid>/del', methods=['POST']) |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
359 @document_required |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
360 @producttree_required |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
361 def del_group(groupid): |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
362 cvrf = get_current() |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
363 try: |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
364 group = get_current().getGroupForID(groupid) |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
365 except KeyError: |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
366 flash('Group not found', 'danger') |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
367 abort(404) |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
368 |
135
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
369 if not cvrf.isGroupOrphan(group._groupid): |
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
370 flash('Not deleting group, it is mentionned in the document.', 'danger') |
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
371 return redirect(url_for('.view')) |
5e9237340630
Add server-side check before deleting a producttree element.
Benoît Allard <benoit.allard@greenbone.net>
parents:
106
diff
changeset
|
372 |
88
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
373 cvrf._producttree._groups.remove(group) |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
374 return redirect(url_for('.view')) |
521c0ec35338
Add deletion of Groups
Benoît Allard <benoit.allard@greenbone.net>
parents:
87
diff
changeset
|
375 |