annotate libervia/server/pages.py @ 1146:76d75423ef53

server: tasks manager first draft: A new task manager will check /tasks directory of website to scripts to execute before launching the site. This allows to generate docs, scripts, or do anything else useful. Generated files are put in in sat local dir, in cache, and are accessible from the website using the new "build_dir" variable.
author Goffi <goffi@goffi.org>
date Fri, 25 Jan 2019 08:58:41 +0100
parents 29eb15062416
children 02afab1b15c5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
1 #!/usr/bin/python
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
2 # -*- coding: utf-8 -*-
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
3
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
4 # Libervia: a Salut à Toi frontend
1144
2af117bfe6cc dates update
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
5 # Copyright (C) 2011-2019 Jérôme Poisson <goffi@goffi.org>
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
6
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
7 # This program is free software: you can redistribute it and/or modify
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
10 # (at your option) any later version.
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
11
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
12 # This program is distributed in the hope that it will be useful,
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
15 # GNU Affero General Public License for more details.
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
16
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
19 from twisted.web import server
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
20 from twisted.web import resource as web_resource
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
21 from twisted.web import util as web_util
984
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
22 from twisted.internet import defer
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
23 from twisted.words.protocols.jabber import jid
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
24 from twisted.python import failure
449
981ed669d3b3 /!\ reorganize all the file hierarchy, move the code and launching script to src:
souliane <souliane@mailoo.org>
parents: 448
diff changeset
25
984
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
26 from sat.core.i18n import _
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
27 from sat.core import exceptions
1109
3a7b2b239d3e pages: change module for date_parse, following backend change
Goffi <goffi@goffi.org>
parents: 1092
diff changeset
28 from sat.tools.common import date_utils
438
582c435dab6b server side: new log system is used
Goffi <goffi@goffi.org>
parents: 435
diff changeset
29 from sat.core.log import getLogger
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
30
984
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
31 from libervia.server.constants import Const as C
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
32 from libervia.server import session_iface
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
33 from libervia.server.utils import quote, SubPage
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
34
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
35 from collections import namedtuple
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
36 import uuid
984
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
37 import os.path
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
38 import urllib
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
39 import time
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
40 import hashlib
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
41
1145
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
42 log = getLogger(__name__)
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
43
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
44 WebsocketMeta = namedtuple("WebsocketMeta", ("url", "token", "debug"))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
45
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
46
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
47 class CacheBase(object):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
48 def __init__(self):
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
49 self._created = time.time()
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
50 self._last_access = self._created
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
51
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
52 @property
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
53 def created(self):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
54 return self._created
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
55
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
56 @property
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
57 def last_access(self):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
58 return self._last_access
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
59
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
60 @last_access.setter
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
61 def last_access(self, timestamp):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
62 self._last_access = timestamp
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
63
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
64
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
65 class CachePage(CacheBase):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
66 def __init__(self, rendered):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
67 super(CachePage, self).__init__()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
68 self._created = time.time()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
69 self._last_access = self._created
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
70 self._rendered = rendered
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
71 self._hash = hashlib.sha256(rendered).hexdigest()
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
72
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
73 @property
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
74 def rendered(self):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
75 return self._rendered
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
76
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
77 @property
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
78 def hash(self):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
79 return self._hash
331
06a48d805547 server side: make Libervia a Twisted plugin, and add it the --port argument + add a config file for the port.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 330
diff changeset
80
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
81
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
82 class CacheURL(CacheBase):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
83 def __init__(self, request):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
84 super(CacheURL, self).__init__()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
85 try:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
86 self._data = request.data.copy()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
87 except AttributeError:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
88 self._data = {}
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
89 self._template_data = request.template_data.copy()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
90 self._prepath = request.prepath[:]
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
91 self._postpath = request.postpath[:]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
92 del self._template_data["csrf_token"]
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
93
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
94 def use(self, request):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
95 self.last_access = time.time()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
96 request.data = self._data.copy()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
97 request.template_data.update(self._template_data)
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
98 request.prepath = self._prepath[:]
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
99 request.postpath = self._postpath[:]
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
100
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
101
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
102 class LiberviaPage(web_resource.Resource):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
103 isLeaf = True #  we handle subpages ourself
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
104 signals_handlers = {}
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
105 cache = {}
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
106 #  Set of tuples (service/node/sub_id) of nodes subscribed for caching
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
107 # sub_id can be empty string if not handled by service
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
108 cache_pubsub_sub = set()
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
109
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
110 def __init__(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
111 self, host, vhost_root, root_dir, url, name=None, redirect=None, access=None,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
112 dynamic=False, parse_url=None, prepare_render=None, render=None, template=None,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
113 on_data_post=None, on_data=None, on_signal=None, url_cache=False,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
114 ):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
115 """Initiate LiberviaPage instance
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
116
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
117 LiberviaPages are the main resources of Libervia, using easy to set python files
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
118 The non mandatory arguments are the variables found in page_meta.py
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
119 @param host(Libervia): the running instance of Libervia
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
120 @param vhost_root(web_resource.Resource): root resource of the virtual host which
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
121 handle this page.
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
122 @param root_dir(unicode): aboslute file path of the page
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
123 @param url(unicode): relative URL to the page
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
124 this URL may not be valid, as pages may require path arguments
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
125 @param name(unicode, None): if not None, a unique name to identify the page
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
126 can then be used for e.g. redirection
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
127 "/" is not allowed in names (as it can be used to construct URL paths)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
128 @param redirect(unicode, None): if not None, this page will be redirected.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
129 A redirected parameter is used as in self.pageRedirect.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
130 parse_url will not be skipped
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
131 using this redirect parameter is called "full redirection"
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
132 using self.pageRedirect is called "partial redirection" (because some
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
133 rendering method can still be used, e.g. parse_url)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
134 @param access(unicode, None): permission needed to access the page
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
135 None means public access.
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
136 Pages inherit from parent pages: e.g. if a "settings" page is restricted
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
137 to admins, and if "settings/blog" is public, it still can only be accessed by
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
138 admins. See C.PAGES_ACCESS_* for details
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
139 @param dynamic(bool): if True, activate websocket for bidirectional communication
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
140 @param parse_url(callable, None): if set it will be called to handle the URL path
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
141 after this method, the page will be rendered if noting is left in path
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
142 (request.postpath) else a the request will be transmitted to a subpage
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
143 @param prepare_render(callable, None): if set, will be used to prepare the
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
144 rendering. That often means gathering data using the bridge
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
145 @param render(callable, None): if not template is set, this method will be
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
146 called and what it returns will be rendered.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
147 This method is mutually exclusive with template and must return a unicode
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
148 string.
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
149 @param template(unicode, None): path to the template to render.
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
150 This method is mutually exclusive with render
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
151 @param on_data_post(callable, None): method to call when data is posted
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
152 None if not post is handled
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
153 on_data_post can return a string with following value:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
154 - C.POST_NO_CONFIRM: confirm flag will not be set
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
155 @param on_data(callable, None): method to call when dynamic data is sent
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
156 this method is used with Libervia's websocket mechanism
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
157 @param on_signal(callable, None): method to call when a registered signal is
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
158 received. This method is used with Libervia's websocket mechanism
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
159 @param url_cache(boolean): if set, result of parse_url is cached (per profile).
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
160 Useful when costly calls (e.g. network) are done while parsing URL.
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
161 """
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
162
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
163 web_resource.Resource.__init__(self)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
164 self.host = host
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
165 self.vhost_root = vhost_root
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
166 self.root_dir = root_dir
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
167 self.url = url
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
168 self.name = name
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
169 if name is not None:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
170 if name in self.named_pages:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
171 raise exceptions.ConflictError(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
172 _(u'a Libervia page named "{}" already exists'.format(name)))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
173 if u"/" in name:
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
174 raise ValueError(_(u'"/" is not allowed in page names'))
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
175 if not name:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
176 raise ValueError(_(u"a page name can't be empty"))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
177 self.named_pages[name] = self
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
178 if access is None:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
179 access = C.PAGES_ACCESS_PUBLIC
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
180 if access not in (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
181 C.PAGES_ACCESS_PUBLIC,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
182 C.PAGES_ACCESS_PROFILE,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
183 C.PAGES_ACCESS_NONE,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
184 ):
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
185 raise NotImplementedError(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
186 _(u"{} access is not implemented yet").format(access)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
187 )
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
188 self.access = access
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
189 self.dynamic = dynamic
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
190 if redirect is not None:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
191 # only page access and name make sense in case of full redirection
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
192 # so we check that rendering methods/values are not set
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
193 if not all(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
194 lambda x: x is not None
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
195 for x in (parse_url, prepare_render, render, template)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
196 ):
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
197 raise ValueError(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
198 _(u"you can't use full page redirection with other rendering"
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
199 u"method, check self.pageRedirect if you need to use them"))
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
200 self.redirect = redirect
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
201 else:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
202 self.redirect = None
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
203 self.parse_url = parse_url
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
204 self.prepare_render = prepare_render
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
205 self.template = template
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
206 self.render_method = render
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
207 self.on_data_post = on_data_post
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
208 self.on_data = on_data
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
209 self.on_signal = on_signal
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
210 self.url_cache = url_cache
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
211 if access == C.PAGES_ACCESS_NONE:
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
212 # none pages just return a 404, no further check is needed
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
213 return
1059
d127a85b2fee pages: don't log error anymore when empty page_meta.py are used
Goffi <goffi@goffi.org>
parents: 1056
diff changeset
214 if template is not None and render is not None:
d127a85b2fee pages: don't log error anymore when empty page_meta.py are used
Goffi <goffi@goffi.org>
parents: 1056
diff changeset
215 log.error(_(u"render and template methods can't be used at the same time"))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
216 if parse_url is not None and not callable(parse_url):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
217 log.error(_(u"parse_url must be a callable"))
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
218
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
219 # if not None, next rendering will be cached
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
220 #  it must then contain a list of the the keys to use (without the page instance)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
221 # e.g. [C.SERVICE_PROFILE, "pubsub", server@example.tld, pubsub_node]
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
222 self._do_cache = None
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
223
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
224 def __unicode__(self):
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
225 return u"LiberviaPage {name} at {url} (vhost: {vhost_root})".format(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
226 name=self.name or u"<anonymous>", url=self.url, vhost_root=self.vhost_root)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
227
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
228 def __str__(self):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
229 return self.__unicode__().encode("utf-8")
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
230
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
231
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
232 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
233 def named_pages(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
234 return self.vhost_root.named_pages
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
235
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
236 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
237 def uri_callbacks(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
238 return self.vhost_root.uri_callbacks
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
239
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
240 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
241 def pages_redirects(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
242 return self.vhost_root.pages_redirects
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
243
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
244 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
245 def cached_urls(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
246 return self.vhost_root.cached_urls
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
247
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
248 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
249 def main_menu(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
250 return self.vhost_root.main_menu
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
251
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
252 @classmethod
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
253 def importPages(cls, host, vhost_root, root_path=None, _parent=None, _path=None,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
254 _extra_pages=False):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
255 """Recursively import Libervia pages
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
256
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
257 @param host(Libervia): Libervia instance
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
258 @param vhost_root(LiberviaRootResource): root of this VirtualHost
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
259 @param root_path(unicode, None): use this root path instead of vhost_root's one
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
260 Used to add default site pages to external sites
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
261 @param _parent(Resource, None): _parent page. Do not set yourself, this is for
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
262 internal use only
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
263 @param _path(list(unicode), None): current path. Do not set yourself, this is for
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
264 internal use only
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
265 @param _extra_pages(boolean): set to True when extra pages are used (i.e.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
266 root_path is set). Do not set yourself, this is for internal use only
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
267 """
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
268 if _path is None:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
269 _path = []
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
270 if _parent is None:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
271 if root_path is None:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
272 root_dir = os.path.join(vhost_root.site_path, C.PAGES_DIR)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
273 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
274 root_dir = os.path.join(root_path, C.PAGES_DIR)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
275 _extra_pages = True
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
276 _parent = vhost_root
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
277 else:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
278 root_dir = _parent.root_dir
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
279 for d in os.listdir(root_dir):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
280 dir_path = os.path.join(root_dir, d)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
281 if not os.path.isdir(dir_path):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
282 continue
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
283 if _extra_pages and d in _parent.children:
1145
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
284 log.debug(_(u"[{host_name}] {path} is already present, ignoring it")
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
285 .format(host_name=vhost_root.host_name, path=u'/'.join(_path+[d])))
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
286 continue
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
287 meta_path = os.path.join(dir_path, C.PAGES_META_FILE)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
288 if os.path.isfile(meta_path):
1145
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
289 page_data = {"__name__": u".".join([u"page"] + _path + [d])}
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
290 new_path = _path + [d]
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
291 # we don't want to force the presence of __init__.py
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
292 # so we use execfile instead of import.
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
293 # TODO: when moved to Python 3, __init__.py is not mandatory anymore
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
294 # so we can switch to import
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
295 execfile(meta_path, page_data)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
296 try:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
297 resource = LiberviaPage(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
298 host=host,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
299 vhost_root=vhost_root,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
300 root_dir=dir_path,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
301 url=u"/" + u"/".join(new_path),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
302 name=page_data.get(u"name"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
303 redirect=page_data.get(u"redirect"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
304 access=page_data.get(u"access"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
305 dynamic=page_data.get(u"dynamic", False),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
306 parse_url=page_data.get(u"parse_url"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
307 prepare_render=page_data.get(u"prepare_render"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
308 render=page_data.get(u"render"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
309 template=page_data.get(u"template"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
310 on_data_post=page_data.get(u"on_data_post"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
311 on_data=page_data.get(u"on_data"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
312 on_signal=page_data.get(u"on_signal"),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
313 url_cache=page_data.get(u"url_cache", False),
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
314 )
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
315 except exceptions.ConflictError as e:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
316 if _extra_pages:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
317 # extra pages are discarded if there is already an existing page
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
318 continue
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
319 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
320 raise e
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
321 _parent.putChild(d, resource)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
322 log_msg = (u"[{host_name}] Added /{path} page".format(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
323 host_name=vhost_root.host_name,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
324 path=u"[…]/".join(new_path)))
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
325 if _extra_pages:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
326 log.debug(log_msg)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
327 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
328 log.info(log_msg)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
329 if "uri_handlers" in page_data:
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
330 if not isinstance(page_data, dict):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
331 log.error(_(u"uri_handlers must be a dict"))
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
332 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
333 for uri_tuple, cb_name in page_data["uri_handlers"].iteritems():
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
334 if len(uri_tuple) != 2 or not isinstance(cb_name, basestring):
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
335 log.error(_(u"invalid uri_tuple"))
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
336 continue
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
337 if not _extra_pages:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
338 log.info(_(u"setting {}/{} URIs handler")
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
339 .format(*uri_tuple))
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
340 try:
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
341 cb = page_data[cb_name]
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
342 except KeyError:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
343 log.error(_(u"missing {name} method to handle {1}/{2}")
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
344 .format(name=cb_name, *uri_tuple))
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
345 continue
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
346 else:
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
347 resource.registerURI(uri_tuple, cb)
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
348
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
349 LiberviaPage.importPages(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
350 host, vhost_root, _parent=resource, _path=new_path, _extra_pages=_extra_pages)
990
6daa59d44ee2 pages: menu implementation, first draft:
Goffi <goffi@goffi.org>
parents: 985
diff changeset
351
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
352 def registerURI(self, uri_tuple, get_uri_cb):
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
353 """register a URI handler
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
354
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
355 @param uri_tuple(tuple[unicode, unicode]): type or URIs handler
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
356 type/subtype as returned by tools/common/parseXMPPUri
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
357 or type/None to handle all subtypes
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
358 @param get_uri_cb(callable): method which take uri_data dict as only argument
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
359 and return absolute path with correct arguments or None if the page
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
360 can't handle this URL
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
361 """
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
362 if uri_tuple in self.uri_callbacks:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
363 log.info(_(u"{}/{} URIs are already handled, replacing by the new handler")
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
364 .format( *uri_tuple))
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
365 self.uri_callbacks[uri_tuple] = (self, get_uri_cb)
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
366
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
367 def registerSignal(self, request, signal, check_profile=True):
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
368 r"""register a signal handler
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
369
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
370 the page must be dynamic
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
371 when signal is received, self.on_signal will be called with:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
372 - request
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
373 - signal name
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
374 - signal arguments
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
375 signal handler will be removed when connection with dynamic page will be lost
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
376 @param signal(unicode): name of the signal
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
377 last arg of signal must be profile, as it will be checked to filter signals
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
378 @param check_profile(bool): if True, signal profile (which MUST be last arg)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
379 will be checked against session profile.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
380 /!\ if False, profile will not be checked/filtered, be sure to know what you
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
381 are doing if you unset this option /!\
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
382 """
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
383 # FIXME: add a timeout; if socket is not opened before it, signal handler
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
384 # must be removed
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
385 if not self.dynamic:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
386 log.error(_(u"You can't register signal if page is not dynamic"))
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
387 return
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
388 LiberviaPage.signals_handlers.setdefault(signal, {})[id(request)] = (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
389 self,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
390 request,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
391 check_profile,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
392 )
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
393 request._signals_registered.append(signal)
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
394
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
395 def getBuildPath(self, session_data):
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
396 return session_data.cache_dir + self.vhost.site_name
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
397
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
398 def getPageByName(self, name):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
399 return self.vhost_root.getPageByName(name)
927
bb4dfc2802c0 server (pages): added getPagePathFromURI method to retrieve page handling an URI
Goffi <goffi@goffi.org>
parents: 926
diff changeset
400
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
401 def getPagePathFromURI(self, uri):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
402 return self.vhost.getPagePathFromURI(uri)
936
78692d47340d server (pages): added getPageByName
Goffi <goffi@goffi.org>
parents: 935
diff changeset
403
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
404 def getPageRedirectURL(self, request, page_name=u"login", url=None):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
405 """generate URL for a page with redirect_url parameter set
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
406
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
407 mainly used for login page with redirection to current page
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
408 @param request(server.Request): current HTTP request
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
409 @param page_name(unicode): name of the page to go
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
410 @param url(None, unicode): url to redirect to
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
411 None to use request path (i.e. current page)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
412 @return (unicode): URL to use
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
413 """
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
414 return u"{root_url}?redirect_url={redirect_url}".format(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
415 root_url=self.getPageByName(page_name).url,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
416 redirect_url=urllib.quote_plus(request.uri)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
417 if url is None
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
418 else url.encode("utf-8"),
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
419 )
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
420
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
421 def getURL(self, *args):
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
422 """retrieve URL of the page set arguments
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
423
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
424 *args(list[unicode]): argument to add to the URL as path elements
1014
dfced7992460 pages: ignore empty or unset arguments in getURL
Goffi <goffi@goffi.org>
parents: 1013
diff changeset
425 empty or None arguments will be ignored
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
426 """
1014
dfced7992460 pages: ignore empty or unset arguments in getURL
Goffi <goffi@goffi.org>
parents: 1013
diff changeset
427 url_args = [quote(a) for a in args if a]
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
428
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
429 if self.name is not None and self.name in self.pages_redirects:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
430 #  we check for redirection
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
431 redirect_data = self.pages_redirects[self.name]
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
432 args_hash = tuple(args)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
433 for limit in xrange(len(args) + 1):
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
434 current_hash = args_hash[:limit]
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
435 if current_hash in redirect_data:
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
436 url_base = redirect_data[current_hash]
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
437 remaining = args[limit:]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
438 remaining_url = "/".join(remaining)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
439 return os.path.join("/", url_base, remaining_url)
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
440
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
441 return os.path.join(self.url, *url_args)
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
442
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
443 def getCurrentURL(self, request):
1015
16d52917666c pages: fixed redirection
Goffi <goffi@goffi.org>
parents: 1014
diff changeset
444 """retrieve URL used to access this page
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
445
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
446 @return(unicode): current URL
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
447 """
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
448 # we get url in the following way (splitting request.path instead of using
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
449 # request.prepath) because request.prepath may have been modified by
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
450 # redirection (if redirection args have been specified), while path reflect
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
451 # the real request
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
452
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
453 # we ignore empty path elements (i.e. double '/' or '/' at the end)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
454 path_elts = [p for p in request.path.split("/") if p]
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
455
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
456 if request.postpath:
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
457 if not request.postpath[-1]:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
458 #  we remove trailing slash
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
459 request.postpath = request.postpath[:-1]
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
460 if request.postpath:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
461 #  getSubPageURL must return subpage from the point where
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
462 # the it is called, so we have to remove remanining
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
463 # path elements
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
464 path_elts = path_elts[: -len(request.postpath)]
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
465
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
466 return u"/" + "/".join(path_elts).decode("utf-8")
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
467
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
468 def getParamURL(self, request, **kwargs):
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
469 """use URL of current request but modify the parameters in query part
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
470
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
471 **kwargs(dict[str, unicode]): argument to use as query parameters
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
472 @return (unicode): constructed URL
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
473 """
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
474 current_url = self.getCurrentURL(request)
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
475 if kwargs:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
476 encoded = urllib.urlencode(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
477 {k: v.encode("utf-8") for k, v in kwargs.iteritems()}
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
478 ).decode("utf-8")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
479 current_url = current_url + u"?" + encoded
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
480 return current_url
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
481
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
482 def getSubPageByName(self, subpage_name, parent=None):
1030
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
483 """retrieve a subpage and its path using its name
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
484
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
485 @param subpage_name(unicode): name of the sub page
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
486 it must be a direct children of parent page
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
487 @param parent(LiberviaPage, None): parent page
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
488 None to use current page
1030
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
489 @return (tuple[str, LiberviaPage]): page subpath and instance
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
490 @raise exceptions.NotFound: no page has been found
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
491 """
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
492 if parent is None:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
493 parent = self
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
494 for path, child in parent.children.iteritems():
1030
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
495 try:
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
496 child_name = child.name
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
497 except AttributeError:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
498 #  LiberviaPages have a name, but maybe this is an other Resource
1030
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
499 continue
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
500 if child_name == subpage_name:
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
501 return path, child
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
502 raise exceptions.NotFound(_(u"requested sub page has not been found"))
1030
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
503
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
504 def getSubPageURL(self, request, page_name, *args):
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
505 """retrieve a page in direct children and build its URL according to request
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
506
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
507 request's current path is used as base (at current parsing point,
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
508 i.e. it's more prepath than path).
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
509 Requested page is checked in children and an absolute URL is then built
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
510 by the resulting combination.
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
511 This method is useful to construct absolute URLs for children instead of
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
512 using relative path, which may not work in subpages, and are linked to the
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
513 names of directories (i.e. relative URL will break if subdirectory is renamed
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
514 while getSubPageURL won't as long as page_name is consistent).
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
515 Also, request.path is used, keeping real path used by user,
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
516 and potential redirections.
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
517 @param request(server.Request): current HTTP request
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
518 @param page_name(unicode): name of the page to retrieve
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
519 it must be a direct children of current page
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
520 @param *args(list[unicode]): arguments to add as path elements
1110
045e8bdaed4f pages: ignore args if they are None in getSubPageURL
Goffi <goffi@goffi.org>
parents: 1109
diff changeset
521 if an arg is None, it will be ignored
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
522 @return (unicode): absolute URL to the sub page
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
523 """
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
524 current_url = self.getCurrentURL(request)
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
525 path, child = self.getSubPageByName(page_name)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
526 return os.path.join(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
527 u"/", current_url, path, *[quote(a) for a in args if a is not None]
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
528 )
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
529
1031
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
530 def getURLByNames(self, named_path):
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
531 """retrieve URL from pages names and arguments
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
532
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
533 @param request(server.Request): request linked to the session
1031
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
534 @param named_path(list[tuple[unicode, list[unicode]]]): path to the page as a list
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
535 of tuples of 2 items:
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
536 - first item is page name
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
537 - second item is list of path arguments of this page
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
538 @return (unicode): URL to the requested page with given path arguments
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
539 @raise exceptions.NotFound: one of the page was not found
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
540 """
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
541 current_page = None
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
542 path = []
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
543 for page_name, page_args in named_path:
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
544 if current_page is None:
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
545 current_page = self.getPageByName(page_name)
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
546 path.append(current_page.getURL(*page_args))
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
547 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
548 sub_path, current_page = self.getSubPageByName(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
549 page_name, parent=current_page
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
550 )
1031
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
551 path.append(sub_path)
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
552 if page_args:
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
553 path.extend([quote(a) for a in page_args])
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
554 return self.host.checkRedirection(self.vhost_root, u"/".join(path))
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
555
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
556 def getURLByPath(self, *args):
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
557 """generate URL by path
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
558
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
559 this method as a similar effect as getURLByNames, but it is more readable
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
560 by using SubPage to get pages instead of using tuples
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
561 @param request(server.Request): request linked to the session
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
562 @param *args: path element:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
563 - if unicode, will be used as argument
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
564 - if util.SubPage instance, must be the name of a subpage
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
565 @return (unicode): generated path
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
566 """
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
567 args = list(args)
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
568 if not args:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
569 raise ValueError("You must specify path elements")
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
570 # root page is the one needed to construct the base of the URL
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
571 # if first arg is not a SubPage instance, we use current page
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
572 if not isinstance(args[0], SubPage):
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
573 root = self
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
574 else:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
575 root = self.getPageByName(args.pop(0))
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
576 # we keep track of current page to check subpage
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
577 current_page = root
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
578 url_elts = []
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
579 arguments = []
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
580 while True:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
581 while args and not isinstance(args[0], SubPage):
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
582 arguments.append(quote(args.pop(0)))
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
583 if not url_elts:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
584 url_elts.append(root.getURL(*arguments))
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
585 else:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
586 url_elts.extend(arguments)
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
587 if not args:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
588 break
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
589 else:
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
590 path, current_page = current_page.getSubPageByName(args.pop(0))
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
591 arguments = [path]
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
592 return self.host.checkRedirection(self.vhost_root, u"/".join(url_elts))
1092
63ed5f6bd4eb pages: new "getURLByPath" method in LiberviaPage, which is similar to getURLByNames, but which a more readable way to request a path with named pages.
Goffi <goffi@goffi.org>
parents: 1071
diff changeset
593
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
594 def getChildWithDefault(self, path, request):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
595 # we handle children ourselves
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
596 raise exceptions.InternalError(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
597 u"this method should not be used with LiberviaPage"
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
598 )
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
599
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
600 def nextPath(self, request):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
601 """get next URL path segment, and update request accordingly
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
602
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
603 will move first segment of postpath in prepath
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
604 @param request(server.Request): current HTTP request
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
605 @return (unicode): unquoted segment
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
606 @raise IndexError: there is no segment left
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
607 """
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
608 pathElement = request.postpath.pop(0)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
609 request.prepath.append(pathElement)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
610 return urllib.unquote(pathElement).decode("utf-8")
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
611
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
612 def _filterPathValue(self, value, handler, name, request):
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
613 """Modify a path value according to handler (see [getPathArgs])"""
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
614 if handler in (u"@", u"@jid") and value == u"@":
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
615 value = None
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
616
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
617 if handler in (u"", u"@"):
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
618 if value is None:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
619 return u""
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
620 elif handler in (u"jid", u"@jid"):
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
621 if value:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
622 try:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
623 return jid.JID(value)
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
624 except RuntimeError:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
625 log.warning(_(u"invalid jid argument: {value}").format(value=value))
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
626 self.pageError(request, C.HTTP_BAD_REQUEST)
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
627 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
628 return u""
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
629 else:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
630 return handler(self, value, name, request)
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
631
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
632 return value
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
633
1056
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
634 def getPathArgs(self, request, names, min_args=0, **kwargs):
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
635 """get several path arguments at once
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
636
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
637 Arguments will be put in request data.
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
638 Missing arguments will have None value
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
639 @param names(list[unicode]): list of arguments to get
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
640 @param min_args(int): if less than min_args are found, PageError is used with
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
641 C.HTTP_BAD_REQUEST
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
642 Use 0 to ignore
1056
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
643 @param **kwargs: special value or optional callback to use for arguments
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
644 names of the arguments must correspond to those in names
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
645 special values may be:
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
646 - '': use empty string instead of None when no value is specified
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
647 - '@': if value of argument is empty or '@', empty string will be used
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
648 - 'jid': value must be converted to jid.JID if it exists, else empty
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
649 string is used
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
650 - '@jid': if value of arguments is empty or '@', empty string will be
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
651 used, else it will be converted to jid
1056
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
652 """
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
653 data = self.getRData(request)
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
654
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
655 for idx, name in enumerate(names):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
656 if name[0] == u"*":
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
657 value = data[name[1:]] = []
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
658 while True:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
659 try:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
660 value.append(self.nextPath(request))
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
661 except IndexError:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
662 idx -= 1
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
663 break
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
664 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
665 idx += 1
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
666 else:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
667 try:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
668 value = data[name] = self.nextPath(request)
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
669 except IndexError:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
670 data[name] = None
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
671 idx -= 1
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
672 break
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
673
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
674 values_count = idx + 1
1071
8f77e36cd51d pages: fixed args count in getPathArgs
Goffi <goffi@goffi.org>
parents: 1065
diff changeset
675 if values_count < min_args:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
676 log.warning(_(u"Missing arguments in URL (got {count}, expected at least "
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
677 u"{min_args})").format(count=values_count, min_args=min_args))
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
678 self.pageError(request, C.HTTP_BAD_REQUEST)
1056
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
679
1071
8f77e36cd51d pages: fixed args count in getPathArgs
Goffi <goffi@goffi.org>
parents: 1065
diff changeset
680 for name in names[values_count:]:
1056
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
681 data[name] = None
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
682
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
683 for name, handler in kwargs.iteritems():
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
684 if name[0] == "*":
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
685 data[name] = [
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
686 self._filterPathValue(v, handler, name, request) for v in data[name]
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
687 ]
1060
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
688 else:
f0f7b3324749 pages: '*' can now be used to prefix the last arg name in getPathArgs, in which case the data will be a list of remaining path arguments.
Goffi <goffi@goffi.org>
parents: 1059
diff changeset
689 data[name] = self._filterPathValue(data[name], handler, name, request)
1056
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
690
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
691 ## Pagination/Filtering ##
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
692
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
693 def getPubsubExtra(self, request, page_max=10, params=None, extra=None,
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
694 order_by=C.ORDER_BY_CREATION):
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
695 """Set extra dict to retrieve PubSub items corresponding to URL parameters
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
696
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
697 Following parameters are used:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
698 - after: set rsm_after with ID of item
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
699 - before: set rsm_before with ID of item
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
700 @param request(server.Request): current HTTP request
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
701 @param page_max(int): required number of items per page
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
702 @param params(None, dict[unicode, list[unicode]]): params as returned by
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
703 self.getAllPostedData.
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
704 None to parse URL automatically
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
705 @param extra(None, dict): extra dict to use, or None to use a new one
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
706 @param order_by(unicode, None): key to order by
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
707 None to not specify order
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
708 @return (dict): fill extra data
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
709 """
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
710 if params is None:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
711 params = self.getAllPostedData(request, multiple=False)
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
712 if extra is None:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
713 extra = {}
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
714 else:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
715 assert not {u"rsm_max", u"rsm_after", u"rsm_before",
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
716 C.KEY_ORDER_BY}.intersection(extra.keys())
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
717 extra[u"rsm_max"] = unicode(page_max)
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
718 if order_by is not None:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
719 extra[C.KEY_ORDER_BY] = order_by
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
720 if u'after' in params:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
721 extra[u'rsm_after'] = params[u'after']
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
722 elif u'before' in params:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
723 extra[u'rsm_before'] = params[u'before']
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
724 return extra
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
725
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
726 def setPagination(self, request, pubsub_data):
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
727 """Add to template_data if suitable
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
728
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
729 "previous_page_url" and "next_page_url" will be added using respectively
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
730 "before" and "after" URL parameters
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
731 @param request(server.Request): current HTTP request
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
732 @param pubsub_data(dict): pubsub metadata parsed with
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
733 data_objects.parsePubSubMetadata
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
734 """
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
735 template_data = request.template_data
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
736 try:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
737 last_id = pubsub_data[u"rsm_last"]
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
738 except KeyError:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
739 # no pagination available
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
740 return
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
741
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
742 if pubsub_data.get("rsm_index", 1) > 0:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
743 # We only show previous button if it's not the first page already.
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
744 # If we have no index, we default to display the button anyway
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
745 # as we can't know if we are on the first page or not.
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
746 first_id = pubsub_data[u"rsm_first"]
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
747 template_data['previous_page_url'] = self.getParamURL(request,
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
748 before=first_id)
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
749 if not pubsub_data[u"complete"]:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
750 # we also show the page next button if complete is None because we
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
751 # can't know where we are in the feed in this case.
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
752 template_data['next_page_url'] = self.getParamURL(request, after=last_id)
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
753
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
754
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
755 ## Cache handling ##
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
756
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
757 def _setCacheHeaders(self, request, cache):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
758 """Set ETag and Last-Modified HTTP headers, used for caching"""
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
759 request.setHeader("ETag", cache.hash)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
760 last_modified = self.host.getHTTPDate(cache.created)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
761 request.setHeader("Last-Modified", last_modified)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
762
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
763 def _checkCacheHeaders(self, request, cache):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
764 """Check if a cache condition is set on the request
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
765
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
766 if condition is valid, C.HTTP_NOT_MODIFIED is returned
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
767 """
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
768 etag_match = request.getHeader("If-None-Match")
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
769 if etag_match is not None:
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
770 if cache.hash == etag_match:
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
771 self.pageError(request, C.HTTP_NOT_MODIFIED, no_body=True)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
772 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
773 modified_match = request.getHeader("If-Modified-Since")
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
774 if modified_match is not None:
1109
3a7b2b239d3e pages: change module for date_parse, following backend change
Goffi <goffi@goffi.org>
parents: 1092
diff changeset
775 modified = date_utils.date_parse(modified_match)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
776 if modified >= int(cache.created):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
777 self.pageError(request, C.HTTP_NOT_MODIFIED, no_body=True)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
778
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
779 def checkCacheSubscribeCb(self, sub_id, service, node):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
780 self.cache_pubsub_sub.add((service, node, sub_id))
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
781
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
782 def checkCacheSubscribeEb(self, failure_, service, node):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
783 log.warning(_(u"Can't subscribe to node: {msg}").format(msg=failure_))
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
784 # FIXME: cache must be marked as unusable here
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
785
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
786 def psNodeWatchAddEb(self, failure_, service, node):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
787 log.warning(_(u"Can't add node watched: {msg}").format(msg=failure_))
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
788
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
789 def checkCache(self, request, cache_type, **kwargs):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
790 """check if a page is in cache and return cached version if suitable
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
791
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
792 this method may perform extra operation to handle cache (e.g. subscribing to a
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
793 pubsub node)
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
794 @param request(server.Request): current HTTP request
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
795 @param cache_type(int): on of C.CACHE_* const.
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
796 @param **kwargs: args according to cache_type:
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
797 C.CACHE_PUBSUB:
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
798 service: pubsub service
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
799 node: pubsub node
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
800 short: short name of feature (needed if node is empty to find namespace)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
801
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
802 """
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
803 if request.postpath:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
804 #  we are not on the final page, no need to go further
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
805 return
1033
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
806
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
807 profile = self.getProfile(request) or C.SERVICE_PROFILE
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
808
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
809 if cache_type == C.CACHE_PUBSUB:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
810 service, node = kwargs["service"], kwargs["node"]
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
811 if not node:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
812 try:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
813 short = kwargs["short"]
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
814 node = self.host.ns_map[short]
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
815 except KeyError:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
816 log.warning(_(u'Can\'t use cache for empty node without namespace '
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
817 u'set, please ensure to set "short" and that it is '
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
818 u'registered'))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
819 return
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
820 if profile != C.SERVICE_PROFILE:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
821 #  only service profile is cache for now
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
822 return
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
823 try:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
824 cache = (self.cache[profile][cache_type][service][node]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
825 [self.vhost_root][request.uri][self])
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
826 except KeyError:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
827 # no cache yet, let's subscribe to the pubsub node
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
828 d1 = self.host.bridgeCall(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
829 "psSubscribe", service.full(), node, {}, profile
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
830 )
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
831 d1.addCallback(self.checkCacheSubscribeCb, service, node)
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
832 d1.addErrback(self.checkCacheSubscribeEb, service, node)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
833 d2 = self.host.bridgeCall("psNodeWatchAdd", service.full(), node, profile)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
834 d2.addErrback(self.psNodeWatchAddEb, service, node)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
835 self._do_cache = [self, profile, cache_type, service, node,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
836 self.vhost_root, request.uri]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
837 #  we don't return the Deferreds as it is not needed to wait for
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
838 # the subscription to continue with page rendering
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
839 return
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
840
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
841 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
842 raise exceptions.InternalError(u"Unknown cache_type")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
843 log.debug(u"using cache for {page}".format(page=self))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
844 cache.last_access = time.time()
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
845 self._setCacheHeaders(request, cache)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
846 self._checkCacheHeaders(request, cache)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
847 request.write(cache.rendered)
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
848 request.finish()
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
849 raise failure.Failure(exceptions.CancelError(u"cache is used"))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
850
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
851 def _cacheURL(self, __, request, profile):
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
852 self.cached_urls.setdefault(profile, {})[request.uri] = CacheURL(request)
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
853
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
854 @classmethod
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
855 def onNodeEvent(cls, host, service, node, event_type, items, profile):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
856 """Invalidate cache for all pages linked to this node"""
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
857 try:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
858 cache = cls.cache[profile][C.CACHE_PUBSUB][jid.JID(service)][node]
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
859 except KeyError:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
860 log.info(_(
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
861 u"Removing subscription for {service}/{node}: "
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
862 u"the page is not cached").format(service=service, node=node))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
863 d1 = host.bridgeCall("psUnsubscribe", service, node, profile)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
864 d1.addErrback(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
865 lambda failure_: log.warning(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
866 _(u"Can't unsubscribe from {service}/{node}: {msg}").format(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
867 service=service, node=node, msg=failure_)))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
868 d2 = host.bridgeCall("psNodeWatchAdd", service, node, profile)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
869 # TODO: check why the page is not in cache, remove subscription?
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
870 d2.addErrback(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
871 lambda failure_: log.warning(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
872 _(u"Can't remove watch for {service}/{node}: {msg}").format(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
873 service=service, node=node, msg=failure_)))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
874 else:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
875 cache.clear()
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
876
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
877 @classmethod
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
878 def onSignal(cls, host, signal, *args):
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
879 """Generic method which receive registered signals
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
880
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
881 if a callback is registered for this signal, call it
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
882 @param host: Libervia instance
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
883 @param signal(unicode): name of the signal
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
884 @param *args: args of the signals
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
885 """
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
886 for page, request, check_profile in cls.signals_handlers.get(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
887 signal, {}
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
888 ).itervalues():
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
889 if check_profile:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
890 signal_profile = args[-1]
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
891 request_profile = page.getProfile(request)
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
892 if not request_profile:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
893 # if you want to use signal without session, unset check_profile
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
894 # (be sure to know what you are doing)
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
895 log.error(_(u"no session started, signal can't be checked"))
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
896 continue
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
897 if signal_profile != request_profile:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
898 #  we ignore the signal, it's not for our profile
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
899 continue
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
900 if request._signals_cache is not None:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
901 # socket is not yet opened, we cache the signal
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
902 request._signals_cache.append((request, signal, args))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
903 log.debug(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
904 u"signal [{signal}] cached: {args}".format(signal=signal, args=args)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
905 )
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
906 else:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
907 page.on_signal(page, request, signal, *args)
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
908
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
909 def onSocketOpen(self, request):
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
910 """Called for dynamic pages when socket has just been opened
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
911
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
912 we send all cached signals
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
913 """
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
914 assert request._signals_cache is not None
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
915 cache = request._signals_cache
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
916 request._signals_cache = None
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
917 for request, signal, args in cache:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
918 self.on_signal(self, request, signal, *args)
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
919
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
920 def onSocketClose(self, request):
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
921 """Called for dynamic pages when socket has just been closed
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
922
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
923 we remove signal handler
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
924 """
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
925 for signal in request._signals_registered:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
926 try:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
927 del LiberviaPage.signals_handlers[signal][id(request)]
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
928 except KeyError:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
929 log.error(_(u"Can't find signal handler for [{signal}], this should not "
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
930 u"happen").format(signal=signal))
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
931 else:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
932 log.debug(_(u"Removed signal handler"))
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
933
1062
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
934 def delegateToResource(self, request, resource):
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
935 """continue workflow with Twisted Resource"""
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
936 buf = resource.render(request)
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
937 if buf == server.NOT_DONE_YET:
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
938 pass
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
939 else:
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
940 request.write(buf)
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
941 request.finish()
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
942 raise failure.Failure(exceptions.CancelError(u"resource delegation"))
1062
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
943
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
944 def HTTPRedirect(self, request, url):
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
945 """redirect to an URL using HTTP redirection
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
946
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
947 @param request(server.Request): current HTTP request
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
948 @param url(unicode): url to redirect to
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
949 """
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
950 web_util.redirectTo(url.encode("utf-8"), request)
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
951 request.finish()
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
952 raise failure.Failure(exceptions.CancelError(u"HTTP redirection is used"))
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
953
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
954 def redirectOrContinue(self, request, redirect_arg=u"redirect_url"):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
955 """helper method to redirect a page to an url given as arg
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
956
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
957 if the arg is not present, the page will continue normal workflow
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
958 @param request(server.Request): current HTTP request
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
959 @param redirect_arg(unicode): argument to use to get redirection URL
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
960 @interrupt: redirect the page to requested URL
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
961 @interrupt pageError(C.HTTP_BAD_REQUEST): empty or non local URL is used
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
962 """
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
963 try:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
964 url = request.args["redirect_url"][0]
1061
bacb8f229742 pages: fixed unicode escaping when using a redirecting URL
Goffi <goffi@goffi.org>
parents: 1060
diff changeset
965 except (KeyError, IndexError):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
966 pass
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
967 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
968 #  a redirection is requested
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
969 if not url or url[0] != u"/":
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
970 # we only want local urls
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
971 self.pageError(request, C.HTTP_BAD_REQUEST)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
972 else:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
973 self.HTTPRedirect(request, url)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
974
1032
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
975 def pageRedirect(self, page_path, request, skip_parse_url=True, path_args=None):
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
976 """redirect a page to a named page
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
977
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
978 the workflow will continue with the workflow of the named page,
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
979 skipping named page's parse_url method if it exist.
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
980 If you want to do a HTTP redirection, use HTTPRedirect
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
981 @param page_path(unicode): path to page (elements are separated by "/"):
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
982 if path starts with a "/":
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
983 path is a full path starting from root
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
984 else:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
985 - first element is name as registered in name variable
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
986 - following element are subpages path
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
987 e.g.: "blog" redirect to page named "blog"
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
988 "blog/atom.xml" redirect to atom.xml subpage of "blog"
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
989 "/common/blog/atom.xml" redirect to the page at the given full path
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
990 @param request(server.Request): current HTTP request
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
991 @param skip_parse_url(bool): if True, parse_url method on redirect page will be
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
992 skipped
1032
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
993 @param path_args(list[unicode], None): path arguments to use in redirected page
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
994 @raise KeyError: there is no known page with this name
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
995 """
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
996 # FIXME: render non LiberviaPage resources
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
997 path = page_path.rstrip(u"/").split(u"/")
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
998 if not path[0]:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
999 redirect_page = self.vhost_root
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1000 else:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1001 redirect_page = self.named_pages[path[0]]
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1002
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1003 for subpage in path[1:]:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1004 if redirect_page is self.vhost_root:
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1005 redirect_page = redirect_page.children[subpage]
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1006 else:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1007 redirect_page = redirect_page.original.children[subpage]
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1008
1032
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1009 if path_args is not None:
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1010 args = [quote(a) for a in path_args]
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1011 request.postpath = args + request.postpath
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1012
1033
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1013 if self._do_cache:
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1014 # if cache is needed, it will be handled by final page
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1015 redirect_page._do_cache = self._do_cache
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1016 self._do_cache = None
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1017
1015
16d52917666c pages: fixed redirection
Goffi <goffi@goffi.org>
parents: 1014
diff changeset
1018 redirect_page.renderPage(request, skip_parse_url=skip_parse_url)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1019 raise failure.Failure(exceptions.CancelError(u"page redirection is used"))
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1020
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1021 def pageError(self, request, code=C.HTTP_NOT_FOUND, no_body=False):
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1022 """generate an error page and terminate the request
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1023
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1024 @param request(server.Request): HTTP request
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1025 @param core(int): error code to use
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1026 @param no_body: don't write body if True
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1027 """
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1028 request.setResponseCode(code)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1029 if no_body:
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1030 request.finish()
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1031 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1032 template = u"error/" + unicode(code) + ".html"
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1033 if self.vhost_root.site_name:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1034 request.template_data[u'site'] = self.vhost_root.site_name
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1035
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1036 rendered = self.host.renderer.render(
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1037 template,
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1038 error_code=code,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1039 **request.template_data
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1040 )
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1041
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1042 self.writeData(rendered, request)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1043 raise failure.Failure(exceptions.CancelError(u"error page is used"))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1044
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1045 def writeData(self, data, request):
937
00236973e138 server (pages): an HTTP internal error is raised if an error is uncatched during page workflow
Goffi <goffi@goffi.org>
parents: 936
diff changeset
1046 """write data to transport and finish the request"""
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1047 if data is None:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1048 self.pageError(request)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1049 data_encoded = data.encode("utf-8")
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1050
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1051 if self._do_cache is not None:
1033
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1052 redirected_page = self._do_cache.pop(0)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1053 cache = reduce(lambda d, k: d.setdefault(k, {}), self._do_cache, self.cache)
1033
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1054 page_cache = cache[redirected_page] = CachePage(data_encoded)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1055 self._setCacheHeaders(request, page_cache)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1056 log.debug(_(u"{page} put in cache for [{profile}]")
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1057 .format( page=self, profile=self._do_cache[0]))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1058 self._do_cache = None
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1059 self._checkCacheHeaders(request, page_cache)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1060
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1061 request.write(data_encoded)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1062 request.finish()
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1063
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1064 def _subpagesHandler(self, __, request):
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1065 """render subpage if suitable
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1066
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1067 this method checks if there is still an unmanaged part of the path
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1068 and check if it corresponds to a subpage. If so, it render the subpage
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1069 else it render a NoResource.
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1070 If there is no unmanaged part of the segment, current page workflow is pursued
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1071 """
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1072 if request.postpath:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1073 subpage = self.nextPath(request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1074 try:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1075 child = self.children[subpage]
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1076 except KeyError:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1077 self.pageError(request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1078 else:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1079 child.render(request)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1080 raise failure.Failure(exceptions.CancelError(u"subpage page is used"))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1081
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1082 def _prepare_dynamic(self, __, request):
998
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1083 # we need to activate dynamic page
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1084 # we set data for template, and create/register token
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1085 socket_token = unicode(uuid.uuid4())
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1086 socket_url = self.host.getWebsocketURL(request)
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1087 socket_debug = C.boolConst(self.host.debug)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1088 request.template_data["websocket"] = WebsocketMeta(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1089 socket_url, socket_token, socket_debug
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1090 )
998
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1091 self.host.registerWSToken(socket_token, self, request)
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1092 # we will keep track of handlers to remove
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1093 request._signals_registered = []
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1094 # we will cache registered signals until socket is opened
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1095 request._signals_cache = []
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1096
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1097 def _prepare_render(self, __, request):
926
612e33fd32a8 server (pages): fixed _prepare_render handling
Goffi <goffi@goffi.org>
parents: 925
diff changeset
1098 return defer.maybeDeferred(self.prepare_render, self, request)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1099
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1100 def _render_method(self, __, request):
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1101 return defer.maybeDeferred(self.render_method, self, request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1102
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1103 def _render_template(self, __, request):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1104 template_data = request.template_data
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1105
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1106 # if confirm variable is set in case of successfuly data post
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1107 session_data = self.host.getSessionData(request, session_iface.ISATSession)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1108 if session_data.popPageFlag(self, C.FLAG_CONFIRM):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1109 template_data[u"confirm"] = True
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1110 if self.vhost_root.site_name:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1111 template_data[u'site'] = self.vhost_root.site_name
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1112
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1113 return self.host.renderer.render(
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1114 self.template,
1145
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
1115 media_path=u"/" + C.MEDIA_DIR,
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1116 cache_path=session_data.cache_dir,
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
1117 build_path=C.BUILD_DIR + u"/",
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1118 main_menu=self.main_menu,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1119 **template_data)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1120
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1121 def _renderEb(self, failure_, request):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1122 """don't raise error on CancelError"""
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1123 failure_.trap(exceptions.CancelError)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1124
937
00236973e138 server (pages): an HTTP internal error is raised if an error is uncatched during page workflow
Goffi <goffi@goffi.org>
parents: 936
diff changeset
1125 def _internalError(self, failure_, request):
00236973e138 server (pages): an HTTP internal error is raised if an error is uncatched during page workflow
Goffi <goffi@goffi.org>
parents: 936
diff changeset
1126 """called if an error is not catched"""
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1127 log.error(_(u"Uncatched error for HTTP request on {url}: {msg}")
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1128 .format( url=request.URLPath(), msg=failure_))
937
00236973e138 server (pages): an HTTP internal error is raised if an error is uncatched during page workflow
Goffi <goffi@goffi.org>
parents: 936
diff changeset
1129 self.pageError(request, C.HTTP_INTERNAL_ERROR)
00236973e138 server (pages): an HTTP internal error is raised if an error is uncatched during page workflow
Goffi <goffi@goffi.org>
parents: 936
diff changeset
1130
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1131 def _on_data_post_redirect(self, ret, request):
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1132 """called when page's on_data_post has been done successfuly
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1133
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1134 This will do a Post/Redirect/Get pattern.
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1135 this method redirect to the same page or to request.data['post_redirect_page']
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1136 post_redirect_page can be either a page or a tuple with page as first item, then
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1137 a list of unicode arguments to append to the url.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1138 if post_redirect_page is not used, initial request.uri (i.e. the same page as
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1139 where the data have been posted) will be used for redirection.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1140 HTTP status code "See Other" (303) is used as it is the recommanded code in
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1141 this case.
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1142 @param ret(None, unicode, iterable): on_data_post return value
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1143 see LiberviaPage.__init__ on_data_post docstring
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1144 """
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1145 if ret is None:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1146 ret = ()
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1147 elif isinstance(ret, basestring):
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1148 ret = (ret,)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1149 else:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1150 ret = tuple(ret)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1151 raise NotImplementedError(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1152 _(u"iterable in on_data_post return value is not used yet")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1153 )
957
67bf14c91d5c server (pages): added a confirm flag on successful post:
Goffi <goffi@goffi.org>
parents: 956
diff changeset
1154 session_data = self.host.getSessionData(request, session_iface.ISATSession)
974
4aa38c49bff7 pages: fixed use of request data in _on_data_post_redirect
Goffi <goffi@goffi.org>
parents: 972
diff changeset
1155 request_data = self.getRData(request)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1156 if "post_redirect_page" in request_data:
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1157 redirect_page_data = request_data["post_redirect_page"]
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1158 if isinstance(redirect_page_data, tuple):
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1159 redirect_page = redirect_page_data[0]
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
1160 redirect_page_args = redirect_page_data[1:]
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
1161 redirect_uri = redirect_page.getURL(*redirect_page_args)
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1162 else:
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1163 redirect_page = redirect_page_data
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
1164 redirect_uri = redirect_page.url
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1165 else:
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1166 redirect_page = self
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1167 redirect_uri = request.uri
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1168
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1169 if not C.POST_NO_CONFIRM in ret:
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1170 session_data.setPageFlag(redirect_page, C.FLAG_CONFIRM)
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1171 request.setResponseCode(C.HTTP_SEE_OTHER)
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1172 request.setHeader("location", redirect_uri)
955
4f7cb6335a33 server(pages): do Post/Redirect/Get pattern when on_data_post is used (avoid double posting on refresh)
Goffi <goffi@goffi.org>
parents: 950
diff changeset
1173 request.finish()
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1174 raise failure.Failure(exceptions.CancelError(u"Post/Redirect/Get is used"))
955
4f7cb6335a33 server(pages): do Post/Redirect/Get pattern when on_data_post is used (avoid double posting on refresh)
Goffi <goffi@goffi.org>
parents: 950
diff changeset
1175
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1176 def _on_data_post(self, __, request):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1177 csrf_token = self.host.getSessionData(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1178 request, session_iface.ISATSession
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1179 ).csrf_token
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1180 try:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1181 given_csrf = self.getPostedData(request, u"csrf_token")
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1182 except KeyError:
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1183 given_csrf = None
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1184 if given_csrf is None or given_csrf != csrf_token:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1185 log.warning(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1186 _(u"invalid CSRF token, hack attempt? URL: {url}, IP: {ip}").format(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1187 url=request.uri, ip=request.getClientIP()
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1188 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1189 )
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1190 self.pageError(request, C.HTTP_UNAUTHORIZED)
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1191 d = defer.maybeDeferred(self.on_data_post, self, request)
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1192 d.addCallback(self._on_data_post_redirect, request)
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1193 return d
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1194
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1195 def getPostedData(self, request, keys, multiple=False):
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
1196 """get data from a POST request or from URL's query part and decode it
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1197
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1198 @param request(server.Request): request linked to the session
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1199 @param keys(unicode, iterable[unicode]): name of the value(s) to get
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1200 unicode to get one value
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1201 iterable to get more than one
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1202 @param multiple(bool): True if multiple values are possible/expected
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1203 if False, the first value is returned
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1204 @return (iterator[unicode], list[iterator[unicode], unicode, list[unicode]):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1205 values received for this(these) key(s)
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1206 @raise KeyError: one specific key has been requested, and it is missing
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1207 """
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1208 #  FIXME: request.args is already unquoting the value, it seems we are doing
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1209 # double unquote
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1210 if isinstance(keys, basestring):
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1211 keys = [keys]
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1212 get_first = True
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1213 else:
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1214 get_first = False
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1215
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1216 ret = []
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1217 for key in keys:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1218 gen = (urllib.unquote(v).decode("utf-8") for v in request.args.get(key, []))
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1219 if multiple:
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1220 ret.append(gen)
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1221 else:
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1222 try:
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1223 ret.append(next(gen))
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1224 except StopIteration:
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1225 raise KeyError(key)
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1226
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1227 return ret[0] if get_first else ret
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1228
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1229 def getAllPostedData(self, request, except_=(), multiple=True):
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1230 """get all posted data
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1231
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1232 @param request(server.Request): request linked to the session
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1233 @param except_(iterable[unicode]): key of values to ignore
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1234 csrf_token will always be ignored
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1235 @param multiple(bool): if False, only the first values are returned
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1236 @return (dict[unicode, list[unicode]]): post values
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1237 """
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1238 except_ = tuple(except_) + (u"csrf_token",)
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1239 ret = {}
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1240 for key, values in request.args.iteritems():
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1241 key = urllib.unquote(key).decode("utf-8")
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1242 if key in except_:
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1243 continue
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1244 if not multiple:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1245 ret[key] = urllib.unquote(values[0]).decode("utf-8")
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1246 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1247 ret[key] = [urllib.unquote(v).decode("utf-8") for v in values]
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1248 return ret
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1249
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1250 def getProfile(self, request):
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1251 """helper method to easily get current profile
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1252
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1253 @return (unicode, None): current profile
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1254 None if no profile session is started
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1255 """
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1256 sat_session = self.host.getSessionData(request, session_iface.ISATSession)
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1257 return sat_session.profile
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1258
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1259 def getRData(self, request):
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1260 """helper method to get request data dict
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1261
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1262 this dictionnary if for the request only, it is not saved in session
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1263 It is mainly used to pass data between pages/methods called during request
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1264 workflow
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1265 @return (dict): request data
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1266 """
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1267 try:
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1268 return request.data
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1269 except AttributeError:
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1270 request.data = {}
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1271 return request.data
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1272
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1273 def _checkAccess(self, data, request):
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1274 """Check access according to self.access
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1275
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1276 if access is not granted, show a HTTP_UNAUTHORIZED pageError and stop request,
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1277 else return data (so it can be inserted in deferred chain
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1278 """
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1279 if self.access == C.PAGES_ACCESS_PUBLIC:
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1280 pass
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1281 elif self.access == C.PAGES_ACCESS_PROFILE:
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1282 profile = self.getProfile(request)
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1283 if not profile:
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1284 # no session started
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1285 if not self.host.options["allow_registration"]:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1286 # registration not allowed, access is not granted
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1287 self.pageError(request, C.HTTP_UNAUTHORIZED)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1288 else:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1289 # registration allowed, we redirect to login page
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1290 login_url = self.getPageRedirectURL(request)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1291 self.HTTPRedirect(request, login_url)
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1292
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1293 return data
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1294
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1295 def renderPartial(self, request, template, template_data):
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1296 """Render a template to be inserted in dynamic page
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1297
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1298 this is NOT the normal page rendering method, it is used only to update
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1299 dynamic pages
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1300 @param template(unicode): path of the template to render
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1301 @param template_data(dict): template_data to use
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1302 """
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1303 if not self.dynamic:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1304 raise exceptions.InternalError(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1305 _(u"renderPartial must only be used with dynamic pages")
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1306 )
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1307 session_data = self.host.getSessionData(request, session_iface.ISATSession)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1308 if self.vhost_root.site_name:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1309 template_data[u'site'] = self.vhost_root.site_name
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1310
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1311 return self.host.renderer.render(
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1312 template,
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1313 media_path="/" + C.MEDIA_DIR,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1314 cache_path=session_data.cache_dir,
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
1315 build_path=C.BUILD_DIR + u"/",
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1316 main_menu=self.main_menu,
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1317 **template_data
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1318 )
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1319
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1320 def renderAndUpdate(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1321 self, request, template, selectors, template_data_update, update_type="append"
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1322 ):
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1323 """Helper method to render a partial page element and update the page
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1324
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1325 this is NOT the normal page rendering method, it is used only to update
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1326 dynamic pages
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1327 @param request(server.Request): current HTTP request
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1328 @param template: same as for [renderPartial]
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1329 @param selectors: CSS selectors to use
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1330 @param template_data_update: template data to use
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1331 template data cached in request will be copied then updated
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1332 with this data
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1333 @parap update_type(unicode): one of:
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1334 append: append rendered element to selected element
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1335 """
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1336 template_data = request.template_data.copy()
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1337 template_data.update(template_data_update)
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1338 html = self.renderPartial(request, template, template_data)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1339 request.sendData(u"dom", selectors=selectors, update_type=update_type, html=html)
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
1340
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1341 def renderPage(self, request, skip_parse_url=False):
937
00236973e138 server (pages): an HTTP internal error is raised if an error is uncatched during page workflow
Goffi <goffi@goffi.org>
parents: 936
diff changeset
1342 """Main method to handle the workflow of a LiberviaPage"""
994
b92b06f023cb pages: profile is now always set in template_data, and None if there is no user logged
Goffi <goffi@goffi.org>
parents: 990
diff changeset
1343
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1344 # template_data are the variables passed to template
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1345 if not hasattr(request, "template_data"):
957
67bf14c91d5c server (pages): added a confirm flag on successful post:
Goffi <goffi@goffi.org>
parents: 956
diff changeset
1346 session_data = self.host.getSessionData(request, session_iface.ISATSession)
67bf14c91d5c server (pages): added a confirm flag on successful post:
Goffi <goffi@goffi.org>
parents: 956
diff changeset
1347 csrf_token = session_data.csrf_token
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1348 request.template_data = {
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1349 u"profile": session_data.profile,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1350 u"csrf_token": csrf_token,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1351 }
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1352
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1353 # XXX: here is the code which need to be executed once
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1354 # at the beginning of the request hanling
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1355 if request.postpath and not request.postpath[-1]:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1356 # we don't differenciate URLs finishing with '/' or not
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1357 del request.postpath[-1]
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1358
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1359 d = defer.Deferred()
922
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1360 d.addCallback(self._checkAccess, request)
16d1084d1371 server (pages): added "None" access (page is not rendered at all) and some HTTP code constants + helper methods to get session data
Goffi <goffi@goffi.org>
parents: 921
diff changeset
1361
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1362 if self.redirect is not None:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1363 d.addCallback(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1364 lambda __: self.pageRedirect(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1365 self.redirect, request, skip_parse_url=False
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1366 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1367 )
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1368
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1369 if self.parse_url is not None and not skip_parse_url:
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1370 if self.url_cache:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1371 profile = self.getProfile(request)
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1372 try:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1373 cache_url = self.cached_urls[profile][request.uri]
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1374 except KeyError:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1375 # no cache for this URI yet
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1376 #  we do normal URL parsing, and then the cache
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1377 d.addCallback(self.parse_url, request)
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1378 d.addCallback(self._cacheURL, request, profile)
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1379 else:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1380 log.debug(_(u"using URI cache for {page}").format(page=self))
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1381 cache_url.use(request)
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1382 else:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1383 d.addCallback(self.parse_url, request)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1384
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1385 d.addCallback(self._subpagesHandler, request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1386
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1387 if request.method not in (C.HTTP_METHOD_GET, C.HTTP_METHOD_POST):
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1388 # only HTTP GET and POST are handled so far
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1389 d.addCallback(lambda __: self.pageError(request, C.HTTP_BAD_REQUEST))
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1390
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1391 if request.method == C.HTTP_METHOD_POST:
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1392 if self.on_data_post is None:
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1393 # if we don't have on_data_post, the page was not expecting POST
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1394 # so we return an error
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1395 d.addCallback(lambda __: self.pageError(request, C.HTTP_BAD_REQUEST))
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1396 else:
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1397 d.addCallback(self._on_data_post, request)
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1398 # by default, POST follow normal behaviour after on_data_post is called
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1399 # this can be changed by a redirection or other method call in on_data_post
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1400
998
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1401 if self.dynamic:
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1402 d.addCallback(self._prepare_dynamic, request)
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1403
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1404 if self.prepare_render:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1405 d.addCallback(self._prepare_render, request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1406
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1407 if self.template:
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1408 d.addCallback(self._render_template, request)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1409 elif self.render_method:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1410 d.addCallback(self._render_method, request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1411
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1412 d.addCallback(self.writeData, request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1413 d.addErrback(self._renderEb, request)
937
00236973e138 server (pages): an HTTP internal error is raised if an error is uncatched during page workflow
Goffi <goffi@goffi.org>
parents: 936
diff changeset
1414 d.addErrback(self._internalError, request)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1415 d.callback(self)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1416 return server.NOT_DONE_YET
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1417
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1418 def render_GET(self, request):
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1419 return self.renderPage(request)
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1420
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1421 def render_POST(self, request):
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1422 return self.renderPage(request)