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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
1 # -*- encoding: utf-8 -*-
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
2 # Description:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
3 # Web stuff about the ProductTree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
4 #
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
5 # Authors:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
6 # BenoƮt Allard <benoit.allard@greenbone.net>
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
7 #
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
8 # Copyright:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
9 # Copyright (C) 2014 Greenbone Networks GmbH
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
10 #
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
11 # This program is free software; you can redistribute it and/or
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
12 # modify it under the terms of the GNU General Public License
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
13 # as published by the Free Software Foundation; either version 2
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
14 # of the License, or (at your option) any later version.
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
15 #
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
16 # This program is distributed in the hope that it will be useful,
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
19 # GNU General Public License for more details.
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
20 #
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
21 # You should have received a copy of the GNU General Public License
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
22 # along with this program; if not, write to the Free Software
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
23 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
24
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
25 """\
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
26 Web-stuff about the producttree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
27 """
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
28
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
29 from functools import wraps
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
30
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
31 from flask import Blueprint, render_template, redirect, url_for, abort, request, flash
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
32
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
33 from farolluz.cvrf import (CVRFProductBranch, CVRFFullProductName,
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
36 from .session import document_required, get_current
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
37
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
38 producttree = Blueprint('producttree', __name__)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
39
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
40 def producttree_required(f):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
41 @wraps(f)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
42 def decorated_function(*args, **kwargs):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
43 if get_current()._producttree is None:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
46 return f(*args, **kwargs)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
47 return decorated_function
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
48
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
49 @producttree.route('/create', methods=['POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
50 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
51 def create():
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
72 @producttree.route('/branch/<path:path>/edit', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
73 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
74 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
75 def edit_branch(path):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
76 path = [int(p) for p in path.split('/')]
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
77 cvrf = get_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
81 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
86
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
87 pbranch = ptree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
91
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
92 if pbranch is not branch.getParent():
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
93 # We have to 're-link' the element ...
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
94 # 1. unlink
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
95 branch.unlink()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
98
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
99 branch._type = request.form['type']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
102
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
103 @producttree.route('/branch/add', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
104 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
105 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
106 def add_branch():
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
107 cvrf = get_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
108 ptree = cvrf._producttree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
109 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
114
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
115 pbranch = ptree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
141 @producttree.route('/product/<productid>')
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
142 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
143 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
144 def view_product(productid):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
145 cvrf = get_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
146 try:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
153
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
154 @producttree.route('/product/<productid>/edit', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
155 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
156 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
157 def edit_product(productid):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
158 cvrf = get_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
159 ptree = cvrf._producttree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
160 try:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
161 product = cvrf.getProductForID(productid)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
162 except KeyError:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
163 abort(404)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
164
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
165 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
166 current_rel = ''
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
167 if product.isRelationship():
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
168 current_rel = str(ptree._relationships.index(product.getCurrentRelationship()))
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
169 leaves = [('', '')] + [(b.getName(), b.getPath(True)) for b in ptree.getOrphanedBranches(product)]
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
170 rels = [('', '')] + [(ptree.getNameOfRelationship(r), str(i)) for i, r in ptree.getOrphanedRelationships(product)]
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
171 return render_template('producttree/edit_product.j2', product=product, action='Update', orphaned_leaves=leaves, orphaned_relationships=rels, current_rel=current_rel)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
172
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
173 if request.form['parent_branch'] and request.form['parent_relationship']:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
174 flash('Cannot set a parent branch and parent relationship', 'danger')
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
175 return redirect(url_for('.edit_product', productid=productid))
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
176
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
177 oldp = product._parent
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
181 if pbranch is not oldp:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
182 # Gonna be funny, needs re-link
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
186 elif request.form['parent_relationship']:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
187 prel = ptree._relationships[int(request.form['parent_relationship'])]
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
193 else:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
203 product._productid = request.form['productid']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
204 product._name = request.form['name']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
207
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
208 @producttree.route('/product/add', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
209 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
210 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
211 def add_product():
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
212 cvrf = get_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
213 ptree = cvrf._producttree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
214
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
215 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
216 product=CVRFFullProductName('', '', ptree)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
217 leaves = [('', '')] + [(b.getName(), b.getPath(True)) for b in ptree.getOrphanedBranches()]
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
218 rels = [('', '')] + [(ptree.getNameOfRelationship(r), str(i)) for i, r in ptree.getOrphanedRelationships()]
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
219 return render_template('producttree/edit_product.j2', product=product, action='Add', orphaned_leaves=leaves, orphaned_relationships=rels, current_rel='')
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
229 parent = ptree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
233 elif request.form['parent_relationship']:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
237
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
238 product = CVRFFullProductName(request.form['productid'], request.form['name'], parent, request.form['cpe'] or None)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
261 @producttree.route('/relationship/<int:index>/edit', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
262 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
263 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
264 def edit_relationship(index):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
265 cvrf = get_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
266 ptree = cvrf._producttree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
267 try:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
268 rel = ptree._relationships[index]
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
269 except IndexError:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
270 abort(404)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
271
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
272 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
273 return render_template('producttree/edit_relationship.j2', productreference=rel._productreference, relationtype=rel._relationtype, relatestoproductreference=rel._relatestoproductreference, types=rel.TYPES)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
274
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
275 rel._productreference = request.form['productreference']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
276 rel._relationtype = request.form['relationtype']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
279
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
280 @producttree.route('/relationship/add', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
281 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
282 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
283 def add_relationship():
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
284 cvrf = get_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
285 ptree = cvrf._producttree
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
286 if len(ptree._products) < 2:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
287 flash('You need to have at least two products to create a relationship', 'warning')
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
288 return redirect(url_for('.add_product'))
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
289
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
290 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
291 return render_template('producttree/edit_relationship.j2', action='Add', types=CVRFRelationship.TYPES)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
292
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
293 prodid1 = request.form['productreference']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
294 prodid2 = request.form['relatestoproductreference']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
295
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
296 if prodid1 == prodid2:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
297 flash('You cannot create a relationship with the same product twice', 'danger')
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
298 return redirect(url_for('.add_relationship'))
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
299
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
300 rel = CVRFRelationship(prodid1, request.form['relationtype'], prodid2)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
322 @producttree.route('/group/<groupid>/edit', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
323 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
324 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
329 except KeyError:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
330 abort(404)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
331 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
332 return render_template('producttree/edit_group.j2', groupid=group._groupid, description=group._description, productids=group._productids)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
337 group._groupid = request.form['groupid']
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
338 group.setDescription(request.form['description'] or None)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
339 group._productids = []
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
340 for productid in request.form.getlist('products'):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
343
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
344 @producttree.route('/group/add', methods=['GET', 'POST'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
345 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
346 @producttree_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
347 def add_group():
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
348 if request.method != 'POST':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
349 return render_template('producttree/edit_group.j2', action='Add')
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
350
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
351 group = CVRFGroup(request.form['groupid'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
352 group.setDescription(request.form['description'] or None)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
353 for productid in request.form.getlist('products'):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
354 group.addProductID(productid)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
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

http://farol.wald.intevation.org