annotate farol/cache.py @ 122:eb790c2848c3 0.2.2

Prepare the release of Farol 0.2.2
author Benoît Allard <benoit.allard@greenbone.net>
date Fri, 17 Oct 2014 16:11:05 +0200
parents 8a9fdf02bf5b
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:
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
3 # Web stuff related to the cache.
0
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
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
25 """\
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
26 The caching stuff ...
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
27 """
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
28
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
29 import os
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
30
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
31 from flask import (Blueprint, current_app, session, flash, redirect, url_for,
16
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
32 render_template, request, abort)
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
33 from werkzeug import secure_filename
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
34
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
35 from farolluz.parsers.cvrf import parse
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
36 from farolluz.renderer import render
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
37
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
38 from .session import get_current, set_current, del_current, has_current, document_required
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
39
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
40 mod = Blueprint('cache', __name__)
3
3478e20885fd Add a ReverseProxy and fix the cache path everywhere
Benoît Allard <benoit.allard@greenbone.net>
parents: 1
diff changeset
41
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
42 def caching_type():
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
43 """\
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
44 Returns the type of caching we are using:
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
45 None, 'session' or 'global'
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
46 """
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
47 c_type = current_app.config.get('CACHING', 'global')
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
48 return {'disabled': None}.get(c_type, c_type)
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
49
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
50 def _caching_dir():
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
51 """\
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
52 Returns the current caching directory
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
53 """
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
54 c_type = caching_type()
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
55 if c_type is None: return None
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
56 root_dir = current_app.config.get('CACHE_DIRECTORY',
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
57 os.path.join(current_app.instance_path, '_cache'))
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
58 if c_type == 'global': return root_dir
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
59 uid = session.get('id')
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
60 # No uid yet, so no cache ...
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
61 if uid is None: return None
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
62 return os.path.join(root_dir, uid.hex)
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
63
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
64 def cache_content():
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
65 """\
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
66 The content of the cache
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
67 """
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
68 dirname = _caching_dir()
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
69 if dirname is None: return []
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
70 if not os.path.exists(dirname):
1
63b00c10ada8 Add Configuration support, warning when in DEBUG mode, and Deployment instruction
Benoît Allard <benoit.allard@greenbone.net>
parents: 0
diff changeset
71 os.makedirs(dirname)
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
72 l = []
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
73 for path in os.listdir(dirname):
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
74 name, ext = os.path.splitext(path)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
75 if ext == '.xml':
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
76 l.append(name)
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
77 return l
8
2ce3676c9b2e Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents: 7
diff changeset
78
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
79 def cleanup_cache():
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
80 """\
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
81 Remove old documents ... maybe ... from time to time ...
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
82 """
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
83 pass
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
84
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
85 @mod.route('/save', methods=['GET', 'POST'])
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
86 @document_required
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
87 def save():
16
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
88 if caching_type() is None:
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
89 current_app.logger.warning('Tried to save although caching is disabled.')
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
90 flash('This version does not allow you to save your document !', 'danger')
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
91 abort(403)
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
92 if request.method != 'POST':
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
93 return render_template('cache/save.j2',
33
752b8bfe0baf Use FarolLuz method to get a document ID (increase dependency version)
Benoît Allard <benoit.allard@greenbone.net>
parents: 16
diff changeset
94 id_=get_current().getDocId())
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
95 # Get some kind of filename, and save the cvrf on cache (disk)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
96 path = secure_filename(request.form['fname'])
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
97 path, _ = os.path.splitext(path)
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
98 dirname = _caching_dir()
3
3478e20885fd Add a ReverseProxy and fix the cache path everywhere
Benoît Allard <benoit.allard@greenbone.net>
parents: 1
diff changeset
99 with open(os.path.join(dirname, path + '.xml'), 'wt') as f:
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
100 f.write(render(get_current(), 'cvrf.j2').encode('utf-8'))
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
101 flash('File saved as %s' % path)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
102 del_current()
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
103 return redirect(url_for('new'))
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
104
103
8a9fdf02bf5b Don't allow a GET request to modify the server state
Benoît Allard <benoit.allard@greenbone.net>
parents: 33
diff changeset
105 @mod.route('/load/<element>', methods=['POST'])
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
106 def load(element):
12
4219d6fb4c38 Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents: 11
diff changeset
107 dirname = _caching_dir()
16
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
108 element = secure_filename(element)
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
109 if dirname is None:
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
110 current_app.logger.warning('Tried to load something although no'
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
111 ' caching dir present: %s' % element)
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
112 flash('Not able to load %s' % element)
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
113 abort(404)
3
3478e20885fd Add a ReverseProxy and fix the cache path everywhere
Benoît Allard <benoit.allard@greenbone.net>
parents: 1
diff changeset
114 fpath = os.path.join(dirname, element+'.xml')
16
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
115 if not os.path.exists(fpath):
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
116 current_app.logger.warning('Tried to load an unexisting document: %s' % element)
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
117 flash('Document %s does not exists !' % element)
eedf9606ab33 Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents: 12
diff changeset
118 abort(404)
0
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
119 with open(fpath, 'rt') as f:
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
120 set_current(parse(f))
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
121 os.remove(fpath)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
122 flash('"%s" has been removed from cache' % element)
4a9f23230eba Initial Release
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
123 # Get some kind of id, and load the file.
7
8f41bb7f4681 Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents: 3
diff changeset
124 return redirect(url_for('document.view'))

http://farol.wald.intevation.org