annotate libervia/server/pages.py @ 1504:409d10211b20

server, browser: dynamic pages refactoring: dynamic pages has been reworked, to change the initial basic implementation. Pages are now dynamic by default, and a websocket is established by the first connected page of a session. The socket is used to transmit bridge signals, and then the signal is broadcasted to other tabs using broadcast channel. If the connecting tab is closed, an other one is chosen. Some tests are made to retry connecting in case of problem, and sometimes reload the pages (e.g. if profile is connected). Signals (or other data) are cached during reconnection phase, to avoid lost of data. All previous partial rendering mechanism have been removed, chat page is temporarily not working anymore, but will be eventually redone (one of the goal of this work is to have proper chat).
author Goffi <goffi@goffi.org>
date Wed, 01 Mar 2023 18:02:44 +0100
parents 1671d187e71d
children ce879da7fcf7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1239
f511f8fbbf8a fixed shebangs
Goffi <goffi@goffi.org>
parents: 1237
diff changeset
1 #!/usr/bin/env python3
f511f8fbbf8a fixed shebangs
Goffi <goffi@goffi.org>
parents: 1237
diff changeset
2
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
3 # Libervia: a Salut à Toi frontend
1396
822bd0139769 date update
Goffi <goffi@goffi.org>
parents: 1393
diff changeset
4 # Copyright (C) 2011-2021 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
5
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
6 # 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
7 # 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
8 # 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
9 # (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
10
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
11 # 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
12 # 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
13 # 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
14 # 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
15
339
2067d6241927 fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents: 336
diff changeset
16 # 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
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
18
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
19 from __future__ import annotations
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
20
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
21 import uuid
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
22 import os.path
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
23 import urllib.request, urllib.parse, urllib.error
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
24 import time
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
25 import hashlib
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
26 import copy
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
27 import json
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
28 import traceback
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
29 from pathlib import Path
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
30 from functools import reduce
1322
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
31 from typing import Optional, Union, List
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
32
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
33 from twisted.web import server
858
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
34 from twisted.web import resource as web_resource
7dde76708892 server: URL redirections + misc:
Goffi <goffi@goffi.org>
parents: 856
diff changeset
35 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
36 from twisted.internet import defer
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
37 from twisted.words.protocols.jabber import jid
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
38 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
39
984
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
40 from sat.core.i18n import _
f0fc28b3bd1e server: moved LiberviaPage code in its own module
Goffi <goffi@goffi.org>
parents: 980
diff changeset
41 from sat.core import exceptions
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
42 from sat.tools.utils import asDeferred
1109
3a7b2b239d3e pages: change module for date_parse, following backend change
Goffi <goffi@goffi.org>
parents: 1092
diff changeset
43 from sat.tools.common import date_utils
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
44 from sat.tools.common import utils
1322
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
45 from sat.tools.common import data_format
438
582c435dab6b server side: new log system is used
Goffi <goffi@goffi.org>
parents: 435
diff changeset
46 from sat.core.log import getLogger
1177
75c5e8d21c7d server: catch "not-allowed" error from bridge and show the appropriate error page in this case
Goffi <goffi@goffi.org>
parents: 1175
diff changeset
47 from sat_frontends.bridge.bridge_frontend import BridgeException
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
48
1286
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
49 from .constants import Const as C
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
50 from . import session_iface
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
51 from .utils import quote, SubPage
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
52 from .classes import WebsocketMeta
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
53 from .classes import Script
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
54
1145
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
55 log = getLogger(__name__)
29eb15062416 pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents: 1144
diff changeset
56
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
57
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
58 class CacheBase(object):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
59 def __init__(self):
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
60 self._created = time.time()
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
61 self._last_access = self._created
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
62
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
63 @property
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
64 def created(self):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
65 return self._created
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
66
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
67 @property
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
68 def last_access(self):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
69 return self._last_access
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
70
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
71 @last_access.setter
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
72 def last_access(self, timestamp):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
73 self._last_access = timestamp
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
74
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
75
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
76 class CachePage(CacheBase):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
77 def __init__(self, rendered):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
78 super(CachePage, self).__init__()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
79 self._created = time.time()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
80 self._last_access = self._created
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
81 self._rendered = rendered
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
82 self._hash = hashlib.sha256(rendered).hexdigest()
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
83
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
84 @property
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
85 def rendered(self):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
86 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
87
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
88 @property
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
89 def hash(self):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
90 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
91
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
92
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
93 class CacheURL(CacheBase):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
94 def __init__(self, request):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
95 super(CacheURL, self).__init__()
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
96 try:
1193
aee3d8fa679f pages: fixed cached data when `url_cache` is used:
Goffi <goffi@goffi.org>
parents: 1188
diff changeset
97 self._data = copy.deepcopy(request.data)
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
98 except AttributeError:
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
99 self._data = {}
1193
aee3d8fa679f pages: fixed cached data when `url_cache` is used:
Goffi <goffi@goffi.org>
parents: 1188
diff changeset
100 self._template_data = copy.deepcopy(request.template_data)
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
101 self._prepath = request.prepath[:]
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
102 self._postpath = request.postpath[:]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
103 del self._template_data["csrf_token"]
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
104
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
105 def use(self, request):
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
106 self.last_access = time.time()
1193
aee3d8fa679f pages: fixed cached data when `url_cache` is used:
Goffi <goffi@goffi.org>
parents: 1188
diff changeset
107 request.data = copy.deepcopy(self._data)
aee3d8fa679f pages: fixed cached data when `url_cache` is used:
Goffi <goffi@goffi.org>
parents: 1188
diff changeset
108 request.template_data.update(copy.deepcopy(self._template_data))
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
109 request.prepath = self._prepath[:]
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
110 request.postpath = self._postpath[:]
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
111
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
112
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
113 class LiberviaPage(web_resource.Resource):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
114 isLeaf = True #  we handle subpages ourself
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
115 cache = {}
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
116 #  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
117 # 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
118 cache_pubsub_sub = set()
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
119
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
120 def __init__(
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
121 self, host, vhost_root, root_dir, url, name=None, label=None, redirect=None,
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
122 access=None, dynamic=True, parse_url=None, add_breadcrumb=None,
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
123 prepare_render=None, render=None, template=None, on_data_post=None, on_data=None,
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
124 url_cache=False, replace_on_conflict=False
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
125 ):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
126 """Initiate LiberviaPage instance
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
127
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
128 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
129 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
130 @param host(Libervia): the running instance of Libervia
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
131 @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
132 handle this page.
1282
0e4e413eb8db server: user new OrderedSet to handle scripts:
Goffi <goffi@goffi.org>
parents: 1277
diff changeset
133 @param root_dir(Path): absolute file path of the page
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
134 @param url(unicode): relative URL to the page
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
135 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
136 @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
137 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
138 "/" 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
139 @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
140 A redirected parameter is used as in self.pageRedirect.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
141 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
142 using this redirect parameter is called "full redirection"
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
143 using self.pageRedirect is called "partial redirection" (because some
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
144 rendering method can still be used, e.g. parse_url)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
145 @param access(unicode, None): permission needed to access the page
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
146 None means public access.
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
147 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
148 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
149 admins. See C.PAGES_ACCESS_* for details
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
150 @param dynamic(bool): if True, activate websocket for bidirectional communication
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
151 @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
152 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
153 (request.postpath) else a the request will be transmitted to a subpage
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
154 @param add_breadcrumb(callable, None): if set, manage the breadcrumb data for this
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
155 page, otherwise it will be set automatically from page name or label.
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
156 @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
157 rendering. That often means gathering data using the bridge
1256
08cd652dea14 server, pages, tasks (brython): common_scripts:
Goffi <goffi@goffi.org>
parents: 1255
diff changeset
158 @param render(callable, None): if template is not set, this method will be
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
159 called and what it returns will be rendered.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
160 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
161 string.
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
162 @param template(unicode, None): path to the template to render.
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
163 This method is mutually exclusive with render
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
164 @param on_data_post(callable, None): method to call when data is posted
1188
263fed3ce354 server (pages): on_data_post can now raise an exceptions.DataError to reload the page with a warning message (without validating data posted)
Goffi <goffi@goffi.org>
parents: 1187
diff changeset
165 None if data post is not handled
1284
65c43eec15ad pages: `on_data_post` can be set to the string `continue` instead of a callable:
Goffi <goffi@goffi.org>
parents: 1283
diff changeset
166 "continue" if data post is not handled there, and we must not interrupt
65c43eec15ad pages: `on_data_post` can be set to the string `continue` instead of a callable:
Goffi <goffi@goffi.org>
parents: 1283
diff changeset
167 workflow (i.e. it's handled in "render" method).
65c43eec15ad pages: `on_data_post` can be set to the string `continue` instead of a callable:
Goffi <goffi@goffi.org>
parents: 1283
diff changeset
168 otherwise, on_data_post can return a string with following value:
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
169 - C.POST_NO_CONFIRM: confirm flag will not be set
1188
263fed3ce354 server (pages): on_data_post can now raise an exceptions.DataError to reload the page with a warning message (without validating data posted)
Goffi <goffi@goffi.org>
parents: 1187
diff changeset
170 on_data_post can raise following exceptions:
263fed3ce354 server (pages): on_data_post can now raise an exceptions.DataError to reload the page with a warning message (without validating data posted)
Goffi <goffi@goffi.org>
parents: 1187
diff changeset
171 - exceptions.DataError: value is incorrect, message will be displayed
263fed3ce354 server (pages): on_data_post can now raise an exceptions.DataError to reload the page with a warning message (without validating data posted)
Goffi <goffi@goffi.org>
parents: 1187
diff changeset
172 as a notification
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
173 @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
174 this method is used with Libervia's websocket mechanism
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
175 @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
176 Useful when costly calls (e.g. network) are done while parsing URL.
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
177 @param replace_on_conflict(boolean): if True, don't raise ConflictError if a
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
178 page of this name already exists, but replace it
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
179 """
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
180
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
181 web_resource.Resource.__init__(self)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
182 self.host = host
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
183 self.vhost_root = vhost_root
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
184 self.root_dir = root_dir
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
185 self.url = url
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
186 self.name = name
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
187 self.label = label
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
188 self.dyn_data = {}
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
189 if name is not None:
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
190 if (name in self.named_pages
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
191 and not (replace_on_conflict and self.named_pages[name].url == url)):
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
192 raise exceptions.ConflictError(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
193 _('a Libervia page named "{}" already exists'.format(name)))
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
194 if "/" in name:
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
195 raise ValueError(_('"/" is not allowed in page names'))
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
196 if not name:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
197 raise ValueError(_("a page name can't be empty"))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
198 self.named_pages[name] = self
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
199 if access is None:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
200 access = C.PAGES_ACCESS_PUBLIC
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
201 if access not in (
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
202 C.PAGES_ACCESS_PUBLIC,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
203 C.PAGES_ACCESS_PROFILE,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
204 C.PAGES_ACCESS_NONE,
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
205 ):
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
206 raise NotImplementedError(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
207 _("{} access is not implemented yet").format(access)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
208 )
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
209 self.access = access
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
210 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
211 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
212 # 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
213 # 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
214 if not all(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
215 lambda x: x is not None
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
216 for x in (parse_url, prepare_render, render, template)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
217 ):
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
218 raise ValueError(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
219 _("you can't use full page redirection with other rendering"
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
220 "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
221 self.redirect = redirect
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
222 else:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
223 self.redirect = None
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
224 self.parse_url = parse_url
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
225 self.add_breadcrumb = add_breadcrumb
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
226 self.prepare_render = prepare_render
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
227 self.template = template
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
228 self.render_method = render
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
229 self.on_data_post = on_data_post
995
f88325b56a6a server: dynamic pages first draft:
Goffi <goffi@goffi.org>
parents: 994
diff changeset
230 self.on_data = on_data
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
231 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
232 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
233 # 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
234 return
1059
d127a85b2fee pages: don't log error anymore when empty page_meta.py are used
Goffi <goffi@goffi.org>
parents: 1056
diff changeset
235 if template is not None and render is not None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
236 log.error(_("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
237
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
238 # if not None, next rendering will be cached
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
239 #  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
240 # 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
241 self._do_cache = None
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
242
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
243 def __str__(self):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
244 return "LiberviaPage {name} at {url} (vhost: {vhost_root})".format(
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
245 name=self.name or "<anonymous>", url=self.url, vhost_root=self.vhost_root)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
246
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
247 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
248 def named_pages(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
249 return self.vhost_root.named_pages
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
250
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
251 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
252 def uri_callbacks(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
253 return self.vhost_root.uri_callbacks
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
254
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
255 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
256 def pages_redirects(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
257 return self.vhost_root.pages_redirects
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
258
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
259 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
260 def cached_urls(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
261 return self.vhost_root.cached_urls
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
262
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
263 @property
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
264 def main_menu(self):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
265 return self.vhost_root.main_menu
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
266
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
267 @property
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
268 def default_theme(self):
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
269 return self.vhost_root.default_theme
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
270
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
271
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
272 @property
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
273 def site_themes(self):
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
274 return self.vhost_root.site_themes
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
275
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
276 @staticmethod
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
277 def createPage(host, meta_path, vhost_root, url_elts, replace_on_conflict=False):
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
278 """Create a LiberviaPage instance
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
279
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
280 @param meta_path(Path): path to the page_meta.py file
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
281 @param vhost_root(resource.Resource): root resource of the virtual host
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
282 @param url_elts(list[unicode]): list of path element from root site to this page
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
283 @param replace_on_conflict(bool): same as for [LiberviaPage]
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
284 @return (tuple[dict, LiberviaPage]): tuple with:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
285 - page_data: dict containing data of the page
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
286 - libervia_page: created resource
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
287 """
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
288 dir_path = meta_path.parent
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
289 page_data = {"__name__": ".".join(["page"] + url_elts)}
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
290 # we don't want to force the presence of __init__.py
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
291 # so we use execfile instead of import.
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
292 # TODO: when moved to Python 3, __init__.py is not mandatory anymore
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
293 # so we can switch to import
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
294 exec(compile(open(meta_path, "rb").read(), meta_path, 'exec'), page_data)
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
295 return page_data, LiberviaPage(
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
296 host=host,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
297 vhost_root=vhost_root,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
298 root_dir=dir_path,
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
299 url="/" + "/".join(url_elts),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
300 name=page_data.get("name"),
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
301 label=page_data.get("label"),
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
302 redirect=page_data.get("redirect"),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
303 access=page_data.get("access"),
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
304 dynamic=page_data.get("dynamic", True),
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
305 parse_url=page_data.get("parse_url"),
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
306 add_breadcrumb=page_data.get("add_breadcrumb"),
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
307 prepare_render=page_data.get("prepare_render"),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
308 render=page_data.get("render"),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
309 template=page_data.get("template"),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
310 on_data_post=page_data.get("on_data_post"),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
311 on_data=page_data.get("on_data"),
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
312 url_cache=page_data.get("url_cache", False),
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
313 replace_on_conflict=replace_on_conflict
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
314 )
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
315
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
316 @staticmethod
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
317 def createBrowserData(
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
318 vhost_root,
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
319 resource: Optional[LiberviaPage],
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
320 browser_path: Path,
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
321 path_elts: Optional[List[str]],
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
322 engine: str = "brython"
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
323 ) -> None:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
324 """create and store data for browser dynamic code"""
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
325 dyn_data = {
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
326 "path": browser_path,
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
327 "url_hash": (
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
328 hashlib.sha256('/'.join(path_elts).encode()).hexdigest()
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
329 if path_elts is not None else None
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
330 ),
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
331 }
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
332 browser_meta_path = browser_path / C.PAGES_BROWSER_META_FILE
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
333 if browser_meta_path.is_file():
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
334 with browser_meta_path.open() as f:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
335 browser_meta = json.load(f)
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
336 utils.recursive_update(vhost_root.browser_modules, browser_meta)
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
337 if resource is not None:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
338 utils.recursive_update(resource.dyn_data, browser_meta)
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
339
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
340 init_path = browser_path / '__init__.py'
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
341 if init_path.is_file():
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
342 vhost_root.browser_modules.setdefault(
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
343 engine, []).append(dyn_data)
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
344 if resource is not None:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
345 resource.dyn_data[engine] = dyn_data
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
346 elif path_elts is None:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
347 try:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
348 next(browser_path.glob('*.py'))
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
349 except StopIteration:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
350 # no python file, nothing for Brython
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
351 pass
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
352 else:
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
353 vhost_root.browser_modules.setdefault(
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
354 engine, []).append(dyn_data)
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
355
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
356
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
357 @classmethod
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
358 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
359 _extra_pages=False):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
360 """Recursively import Libervia pages
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
361
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
362 @param host(Libervia): Libervia instance
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
363 @param vhost_root(LiberviaRootResource): root of this VirtualHost
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
364 @param root_path(Path, None): use this root path instead of vhost_root's one
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
365 Used to add default site pages to external sites
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
366 @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
367 internal use only
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
368 @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
369 internal use only
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
370 @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
371 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
372 """
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
373 if _path is None:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
374 _path = []
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
375 if _parent is None:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
376 if root_path is None:
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
377 root_dir = vhost_root.site_path / C.PAGES_DIR
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
378 else:
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
379 root_dir = root_path / C.PAGES_DIR
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
380 _extra_pages = True
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
381 _parent = vhost_root
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
382 root_browser_path = root_dir / C.PAGES_BROWSER_DIR
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
383 if root_browser_path.is_dir():
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
384 cls.createBrowserData(vhost_root, None, root_browser_path, None)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
385 else:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
386 root_dir = _parent.root_dir
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
387
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
388 for d in os.listdir(root_dir):
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
389 dir_path = root_dir / d
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
390 if not dir_path.is_dir():
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
391 continue
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
392 if _extra_pages and d in _parent.children:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
393 log.debug(_("[{host_name}] {path} is already present, ignoring it")
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
394 .format(host_name=vhost_root.host_name, path='/'.join(_path+[d])))
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
395 continue
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
396 meta_path = dir_path / C.PAGES_META_FILE
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
397 if meta_path.is_file():
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
398 new_path = _path + [d]
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
399 try:
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
400 page_data, resource = cls.createPage(
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
401 host, meta_path, vhost_root, new_path)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
402 except exceptions.ConflictError as e:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
403 if _extra_pages:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
404 # 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
405 continue
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
406 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
407 raise e
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
408 _parent.putChild(str(d).encode(), resource)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
409 log_msg = ("[{host_name}] Added /{path} page".format(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
410 host_name=vhost_root.host_name,
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
411 path="[…]/".join(new_path)))
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
412 if _extra_pages:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
413 log.debug(log_msg)
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
414 else:
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
415 log.info(log_msg)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
416 if "uri_handlers" in page_data:
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
417 if not isinstance(page_data, dict):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
418 log.error(_("uri_handlers must be a dict"))
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
419 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
420 for uri_tuple, cb_name in page_data["uri_handlers"].items():
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
421 if len(uri_tuple) != 2 or not isinstance(cb_name, str):
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
422 log.error(_("invalid uri_tuple"))
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
423 continue
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
424 if not _extra_pages:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
425 log.info(_("setting {}/{} URIs handler")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
426 .format(*uri_tuple))
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
427 try:
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
428 cb = page_data[cb_name]
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
429 except KeyError:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
430 log.error(_("missing {name} method to handle {1}/{2}")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
431 .format(name=cb_name, *uri_tuple))
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
432 continue
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
433 else:
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
434 resource.registerURI(uri_tuple, cb)
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
435
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
436 LiberviaPage.importPages(
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
437 host, vhost_root, _parent=resource, _path=new_path,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
438 _extra_pages=_extra_pages)
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
439 # now we check if there is some code for browser
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
440 browser_path = dir_path / C.PAGES_BROWSER_DIR
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
441 if browser_path.is_dir():
1253
6d49fae517ba pages: browser metadata + root `_browser`:
Goffi <goffi@goffi.org>
parents: 1246
diff changeset
442 cls.createBrowserData(vhost_root, resource, browser_path, new_path)
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
443
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
444 @classmethod
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
445 def onFileChange(cls, host, file_path, flags, site_root, site_path):
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
446 """Method triggered by file_watcher when something is changed in files
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
447
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
448 This method is used in dev mode to reload pages when needed
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
449 @param file_path(filepath.FilePath): path of the file which triggered the event
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
450 @param flags[list[unicode]): human readable flags of the event (from
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
451 internet.inotify)
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
452 @param site_root(LiberviaRootResource): root of the site
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
453 @param site_path(unicode): absolute path of the site
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
454 """
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
455 if flags == ['create']:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
456 return
1277
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
457 path = Path(file_path.path.decode())
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
458 base_name = path.name
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
459 if base_name != "page_meta.py":
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
460 # we only handle libervia pages
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
461 return
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
462
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
463 log.debug("{flags} event(s) received for {file_path}".format(
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
464 flags=", ".join(flags), file_path=file_path))
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
465
1277
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
466 dir_path = path.parent
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
467
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
468 if dir_path == site_path:
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
469 return
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
470
1277
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
471 if not site_path in dir_path.parents:
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
472 raise exceptions.InternalError("watched file should be in a subdirectory of site path")
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
473
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
474 path_elts = list(dir_path.relative_to(site_path).parts)
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
475
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
476 if path_elts[0] == C.PAGES_DIR:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
477 # a page has been modified
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
478 del path_elts[0]
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
479 if not path_elts:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
480 # we need at least one element to parse
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
481 return
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
482 # we retrieve page by starting from site root and finding each path element
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
483 parent = page = site_root
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
484 new_page = False
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
485 for idx, child_name in enumerate(path_elts):
1277
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
486 child_name = child_name.encode()
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
487 try:
1157
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
488 try:
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
489 page = page.original.children[child_name]
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
490 except AttributeError:
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
491 page = page.children[child_name]
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
492 except KeyError:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
493 if idx != len(path_elts)-1:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
494 # a page has been created in a subdir when one or more
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
495 # page_meta.py are missing on the way
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
496 log.warning(_("Can't create a page at {path}, missing parents")
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
497 .format(path=path))
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
498 return
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
499 new_page = True
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
500 else:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
501 if idx<len(path_elts)-1:
1423
870b198e98ea pages: fix `onFileChange` when the page is not wrapped
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
502 try:
870b198e98ea pages: fix `onFileChange` when the page is not wrapped
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
503 parent = page.original
870b198e98ea pages: fix `onFileChange` when the page is not wrapped
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
504 except AttributeError:
870b198e98ea pages: fix `onFileChange` when the page is not wrapped
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
505 parent = page
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
506
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
507 try:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
508 # we (re)create a page with the new/modified code
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
509 __, resource = cls.createPage(host, path, site_root, path_elts,
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
510 replace_on_conflict=True)
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
511 if not new_page:
1157
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
512 try:
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
513 resource.children = page.original.children
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
514 except AttributeError:
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
515 # FIXME: this .original handling madness is due to EncodingResourceWrapper
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
516 # EncodingResourceWrapper should probably be removed
64952ba7affe pages: fixed children retrieval in onFileChange
Goffi <goffi@goffi.org>
parents: 1153
diff changeset
517 resource.children = page.children
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
518 except Exception as e:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
519 log.warning(_("Can't create page: {reason}").format(reason=e))
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
520 else:
1277
2e4fcd31f2a9 pages: use Path in onFileChange + fixed encoding issue
Goffi <goffi@goffi.org>
parents: 1276
diff changeset
521 url_elt = path_elts[-1].encode()
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
522 if not new_page:
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
523 # the page was already existing, we remove it
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
524 del parent.children[url_elt]
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
525 # we can now add the new page
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
526 parent.putChild(url_elt, resource)
1380
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
527
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
528 # is there any browser data to create?
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
529 browser_path = resource.root_dir / C.PAGES_BROWSER_DIR
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
530 if browser_path.is_dir():
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
531 cls.createBrowserData(
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
532 resource.vhost_root,
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
533 resource,
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
534 browser_path,
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
535 resource.url.split('/')
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
536 )
df79874947d7 pages: fix browser data re-creation on dev mode reload
Goffi <goffi@goffi.org>
parents: 1378
diff changeset
537
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
538 if new_page:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
539 log.info(_("{page} created").format(page=resource))
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
540 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
541 log.info(_("{page} reloaded").format(page=resource))
990
6daa59d44ee2 pages: menu implementation, first draft:
Goffi <goffi@goffi.org>
parents: 985
diff changeset
542
1283
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
543 def checkCSRF(self, request):
1479
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
544 session = self.host.getSessionData(
1283
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
545 request, session_iface.ISATSession
1479
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
546 )
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
547 if session.profile is None:
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
548 # CSRF doesn't make sense when no user is logged
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
549 log.debug("disabling CSRF check because service profile is used")
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
550 return
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
551 csrf_token = session.csrf_token
1283
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
552 given_csrf = request.getHeader("X-Csrf-Token")
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
553 if given_csrf is None:
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
554 try:
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
555 given_csrf = self.getPostedData(request, "csrf_token")
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
556 except KeyError:
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
557 pass
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
558 if given_csrf is None or given_csrf != csrf_token:
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
559 log.warning(
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
560 _("invalid CSRF token, hack attempt? URL: {url}, IP: {ip}").format(
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
561 url=request.uri, ip=request.getClientIP()
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
562 )
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
563 )
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
564 self.pageError(request, C.HTTP_FORBIDDEN)
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
565
1286
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
566 def exposeToScripts(
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
567 self,
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
568 request: server.Request,
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
569 **kwargs: str
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
570 ) -> None:
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
571 """Make a local variable available to page script as a global variable
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
572
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
573 No check is done for conflicting name, use this carefully
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
574 """
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
575 template_data = request.template_data
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
576 scripts = template_data.setdefault("scripts", utils.OrderedSet())
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
577 for name, value in kwargs.items():
1304
70e3341d25bf pages: take care of None/null when exposing a variable
Goffi <goffi@goffi.org>
parents: 1302
diff changeset
578 if value is None:
70e3341d25bf pages: take care of None/null when exposing a variable
Goffi <goffi@goffi.org>
parents: 1302
diff changeset
579 value = "null"
1471
83dce05226ac pages: workaround to expose variables coming from python-dbus
Goffi <goffi@goffi.org>
parents: 1465
diff changeset
580 elif isinstance(value, str):
83dce05226ac pages: workaround to expose variables coming from python-dbus
Goffi <goffi@goffi.org>
parents: 1465
diff changeset
581 # FIXME: workaround for subtype used by python-dbus (dbus.String)
83dce05226ac pages: workaround to expose variables coming from python-dbus
Goffi <goffi@goffi.org>
parents: 1465
diff changeset
582 # to be removed when we get rid of python-dbus
83dce05226ac pages: workaround to expose variables coming from python-dbus
Goffi <goffi@goffi.org>
parents: 1465
diff changeset
583 value = repr(str(value))
1304
70e3341d25bf pages: take care of None/null when exposing a variable
Goffi <goffi@goffi.org>
parents: 1302
diff changeset
584 else:
70e3341d25bf pages: take care of None/null when exposing a variable
Goffi <goffi@goffi.org>
parents: 1302
diff changeset
585 value = repr(value)
70e3341d25bf pages: take care of None/null when exposing a variable
Goffi <goffi@goffi.org>
parents: 1302
diff changeset
586 scripts.add(Script(content=f"var {name}={value};"))
1286
63328c793a9e pages: new method `exposeToScripts` to make variables accessible to scripts in browser
Goffi <goffi@goffi.org>
parents: 1285
diff changeset
587
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
588 def registerURI(self, uri_tuple, get_uri_cb):
1153
94f9d81a475e pages: auto reloading
Goffi <goffi@goffi.org>
parents: 1148
diff changeset
589 """Register a URI handler
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
590
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
591 @param uri_tuple(tuple[unicode, unicode]): type or URIs handler
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
592 type/subtype as returned by tools/common/parseXMPPUri
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
593 or type/None to handle all subtypes
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
594 @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
595 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
596 can't handle this URL
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
597 """
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
598 if uri_tuple in self.uri_callbacks:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
599 log.info(_("{}/{} URIs are already handled, replacing by the new handler")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
600 .format( *uri_tuple))
1038
6b906b1f419a pages: fixed XMPP URIs handling
Goffi <goffi@goffi.org>
parents: 1033
diff changeset
601 self.uri_callbacks[uri_tuple] = (self, get_uri_cb)
925
e00151140f77 server (pages): URIs handling:
Goffi <goffi@goffi.org>
parents: 924
diff changeset
602
1147
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
603 def getConfig(self, key, default=None, value_type=None):
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
604 return self.host.getConfig(self.vhost_root, key=key, default=default,
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
605 value_type=value_type)
02afab1b15c5 server, pages, tasks: moved getConfig to backend, and added shorcut version in LiberviaPage and TasksManager
Goffi <goffi@goffi.org>
parents: 1146
diff changeset
606
1146
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
607 def getBuildPath(self, session_data):
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
608 return session_data.cache_dir + self.vhost.site_name
76d75423ef53 server: tasks manager first draft:
Goffi <goffi@goffi.org>
parents: 1145
diff changeset
609
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
610 def getPageByName(self, name):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
611 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
612
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
613 def getPagePathFromURI(self, uri):
1175
ab858db9dbee server: fixed getPagePathFromURI
Goffi <goffi@goffi.org>
parents: 1173
diff changeset
614 return self.vhost_root.getPagePathFromURI(uri)
936
78692d47340d server (pages): added getPageByName
Goffi <goffi@goffi.org>
parents: 935
diff changeset
615
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
616 def getPageRedirectURL(self, request, page_name="login", url=None):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
617 """generate URL for a page with redirect_url parameter set
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
618
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
619 mainly used for login page with redirection to current page
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
620 @param request(server.Request): current HTTP request
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
621 @param page_name(unicode): name of the page to go
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
622 @param url(None, unicode): url to redirect to
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
623 None to use request path (i.e. current page)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
624 @return (unicode): URL to use
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
625 """
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
626 return "{root_url}?redirect_url={redirect_url}".format(
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
627 root_url=self.getPageByName(page_name).url,
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
628 redirect_url=urllib.parse.quote_plus(request.uri)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
629 if url is None
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
630 else url.encode("utf-8"),
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
631 )
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
632
1463
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
633 def getURL(self, *args: str, **kwargs: str) -> str:
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
634 """retrieve URL of the page set arguments
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
635
1456
284522d8af44 pages: check redirections for LiberviaPage.getURL:
Goffi <goffi@goffi.org>
parents: 1455
diff changeset
636 @param *args: arguments to add to the URL as path elements empty or None
284522d8af44 pages: check redirections for LiberviaPage.getURL:
Goffi <goffi@goffi.org>
parents: 1455
diff changeset
637 arguments will be ignored
1463
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
638 @param **kwargs: query parameters
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
639 """
1014
dfced7992460 pages: ignore empty or unset arguments in getURL
Goffi <goffi@goffi.org>
parents: 1013
diff changeset
640 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
641
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
642 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
643 #  we check for redirection
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
644 redirect_data = self.pages_redirects[self.name]
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
645 args_hash = tuple(args)
1476
c669b5bfb8a0 pages: fix args range in `getURL` + use `urljoin`:
Goffi <goffi@goffi.org>
parents: 1473
diff changeset
646 for limit in range(len(args), -1, -1):
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
647 current_hash = args_hash[:limit]
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
648 if current_hash in redirect_data:
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
649 url_base = redirect_data[current_hash]
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
650 remaining = args[limit:]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
651 remaining_url = "/".join(remaining)
1476
c669b5bfb8a0 pages: fix args range in `getURL` + use `urljoin`:
Goffi <goffi@goffi.org>
parents: 1473
diff changeset
652 url = urllib.parse.urljoin(url_base, remaining_url)
1463
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
653 break
1473
b4cead3cea43 pages: fix crash when page is redirected but with different args
Goffi <goffi@goffi.org>
parents: 1471
diff changeset
654 else:
b4cead3cea43 pages: fix crash when page is redirected but with different args
Goffi <goffi@goffi.org>
parents: 1471
diff changeset
655 url = os.path.join(self.url, *url_args)
1463
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
656 else:
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
657 url = os.path.join(self.url, *url_args)
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
658
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
659 if kwargs:
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
660 encoded = urllib.parse.urlencode(
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
661 {k: v for k, v in kwargs.items()}
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
662 )
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
663 url += f"?{encoded}"
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
664
1456
284522d8af44 pages: check redirections for LiberviaPage.getURL:
Goffi <goffi@goffi.org>
parents: 1455
diff changeset
665 return self.host.checkRedirection(
284522d8af44 pages: check redirections for LiberviaPage.getURL:
Goffi <goffi@goffi.org>
parents: 1455
diff changeset
666 self.vhost_root,
1463
2c8449885272 pages: query parameters can now be specified using keyword arguments in `getURL:`
Goffi <goffi@goffi.org>
parents: 1456
diff changeset
667 url
1456
284522d8af44 pages: check redirections for LiberviaPage.getURL:
Goffi <goffi@goffi.org>
parents: 1455
diff changeset
668 )
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
669
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
670 def getCurrentURL(self, request):
1015
16d52917666c pages: fixed redirection
Goffi <goffi@goffi.org>
parents: 1014
diff changeset
671 """retrieve URL used to access this page
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
672
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
673 @return(unicode): current URL
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
674 """
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
675 # 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
676 # request.prepath) because request.prepath may have been modified by
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
677 # redirection (if redirection args have been specified), while path reflect
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
678 # the real request
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
679
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
680 # we ignore empty path elements (i.e. double '/' or '/' at the end)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
681 path_elts = [p for p in request.path.decode('utf-8').split("/") if p]
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
682
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
683 if request.postpath:
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
684 if not request.postpath[-1]:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
685 #  we remove trailing slash
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
686 request.postpath = request.postpath[:-1]
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
687 if request.postpath:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
688 #  getSubPageURL must return subpage from the point where
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
689 # the it is called, so we have to remove remanining
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
690 # path elements
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
691 path_elts = path_elts[: -len(request.postpath)]
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
692
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
693 return "/" + "/".join(path_elts)
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
694
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
695 def getParamURL(self, request, **kwargs):
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
696 """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
697
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
698 **kwargs(dict[str, unicode]): argument to use as query parameters
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
699 @return (unicode): constructed URL
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
700 """
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
701 current_url = self.getCurrentURL(request)
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
702 if kwargs:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
703 encoded = urllib.parse.urlencode(
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
704 {k: v for k, v in kwargs.items()}
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
705 )
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
706 current_url = current_url + "?" + encoded
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
707 return current_url
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
708
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
709 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
710 """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
711
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
712 @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
713 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
714 @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
715 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
716 @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
717 @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
718 """
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
719 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
720 parent = self
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
721 for path, child in parent.children.items():
1030
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
722 try:
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
723 child_name = child.name
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
724 except AttributeError:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
725 #  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
726 continue
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
727 if child_name == subpage_name:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
728 return path.decode('utf-8'), child
1378
e3e303a30a74 pages (tickets): renamed "tickets" to "lists":
Goffi <goffi@goffi.org>
parents: 1376
diff changeset
729 raise exceptions.NotFound(
e3e303a30a74 pages (tickets): renamed "tickets" to "lists":
Goffi <goffi@goffi.org>
parents: 1376
diff changeset
730 _("requested sub page has not been found ({subpage_name})").format(
e3e303a30a74 pages (tickets): renamed "tickets" to "lists":
Goffi <goffi@goffi.org>
parents: 1376
diff changeset
731 subpage_name=subpage_name))
1030
66a050b32df8 pages: moved code getting subpage from getSubPageURL to new getSubPageByName method.
Goffi <goffi@goffi.org>
parents: 1019
diff changeset
732
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
733 def getSubPageURL(self, request, page_name, *args):
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
734 """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
735
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
736 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
737 i.e. it's more prepath than path).
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
738 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
739 by the resulting combination.
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
740 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
741 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
742 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
743 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
744 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
745 and potential redirections.
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
746 @param request(server.Request): current HTTP request
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
747 @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
748 it must be a direct children of current page
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
749 @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
750 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
751 @return (unicode): absolute URL to the sub page
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
752 """
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
753 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
754 path, child = self.getSubPageByName(page_name)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
755 return os.path.join(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
756 "/", current_url, path, *[quote(a) for a in args if a is not None]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
757 )
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
758
1031
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
759 def getURLByNames(self, named_path):
1171
469d0de8da0e pages (blog, u): added atom feed link in "links" template data.
Goffi <goffi@goffi.org>
parents: 1169
diff changeset
760 """Retrieve URL from pages names and arguments
1031
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
761
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
762 @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
763 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
764 - 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
765 - 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
766 @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
767 @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
768 """
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
769 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
770 path = []
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
771 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
772 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
773 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
774 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
775 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
776 sub_path, current_page = self.getSubPageByName(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
777 page_name, parent=current_page
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
778 )
1031
4ba7df23b976 pages: new method getURLByNames to retrieve URL from list of page names/path arguments
Goffi <goffi@goffi.org>
parents: 1030
diff changeset
779 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
780 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
781 path.extend([quote(a) for a in page_args])
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
782 return self.host.checkRedirection(self.vhost_root, "/".join(path))
980
bcacf970f970 core (pages redirection): inverted redirection + getSubPageURL:
Goffi <goffi@goffi.org>
parents: 979
diff changeset
783
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
784 def getURLByPath(self, *args):
1171
469d0de8da0e pages (blog, u): added atom feed link in "links" template data.
Goffi <goffi@goffi.org>
parents: 1169
diff changeset
785 """Generate URL by path
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
786
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
787 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
788 by using SubPage to get pages instead of using tuples
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
789 @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
790 - 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
791 - 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
792 @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
793 """
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
794 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
795 if not args:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
796 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
797 # 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
798 # 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
799 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
800 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
801 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
802 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
803 # 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
804 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
805 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
806 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
807 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
808 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
809 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
810 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
811 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
812 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
813 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
814 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
815 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
816 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
817 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
818 arguments = [path]
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
819 return self.host.checkRedirection(self.vhost_root, "/".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
820
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
821 def getChildWithDefault(self, path, request):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
822 # we handle children ourselves
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
823 raise exceptions.InternalError(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
824 "this method should not be used with LiberviaPage"
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
825 )
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
826
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
827 def nextPath(self, request):
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
828 """get next URL path segment, and update request accordingly
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
829
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
830 will move first segment of postpath in prepath
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
831 @param request(server.Request): current HTTP request
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
832 @return (unicode): unquoted segment
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
833 @raise IndexError: there is no segment left
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
834 """
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
835 pathElement = request.postpath.pop(0)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
836 request.prepath.append(pathElement)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
837 return urllib.parse.unquote(pathElement.decode('utf-8'))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
838
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
839 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
840 """Modify a path value according to handler (see [getPathArgs])"""
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
841 if handler in ("@", "@jid") and 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
842 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
843
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
844 if handler in ("", "@"):
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
845 if value is None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
846 return ""
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
847 elif handler in ("jid", "@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
848 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
849 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
850 return jid.JID(value)
1317
a7ab4d244982 pages: handle `jid.InvalidFormat` exception in `_filterPathValue`
Goffi <goffi@goffi.org>
parents: 1305
diff changeset
851 except (RuntimeError, jid.InvalidFormat):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
852 log.warning(_("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
853 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
854 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
855 return ""
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
856 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
857 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
858
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
859 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
860
1056
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
861 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
862 """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
863
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
864 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
865 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
866 @param names(list[unicode]): list of arguments to get
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
867 @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
868 C.HTTP_BAD_REQUEST
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
869 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
870 @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
871 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
872 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
873 - '': 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
874 - '@': 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
875 - '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
876 string is used
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
877 - '@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
878 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
879 """
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
880 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
881
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
882 for idx, name in enumerate(names):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
883 if name[0] == "*":
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
884 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
885 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
886 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
887 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
888 except IndexError:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
889 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
890 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
891 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
892 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
893 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
894 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
895 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
896 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
897 data[name] = None
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
898 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
899 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
900
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
901 values_count = idx + 1
1071
8f77e36cd51d pages: fixed args count in getPathArgs
Goffi <goffi@goffi.org>
parents: 1065
diff changeset
902 if values_count < min_args:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
903 log.warning(_("Missing arguments in URL (got {count}, expected at least "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
904 "{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
905 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
906
1071
8f77e36cd51d pages: fixed args count in getPathArgs
Goffi <goffi@goffi.org>
parents: 1065
diff changeset
907 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
908 data[name] = None
47c354ca66a3 pages: new getPathArgs helper method to retrieve several path arguments at once
Goffi <goffi@goffi.org>
parents: 1054
diff changeset
909
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
910 for name, handler in kwargs.items():
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
911 if name[0] == "*":
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
912 data[name] = [
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
913 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
914 ]
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
915 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
916 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
917
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
918 ## Pagination/Filtering ##
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
919
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
920 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
921 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
922 """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
923
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
924 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
925 - 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
926 - 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
927 @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
928 @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
929 @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
930 self.getAllPostedData.
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
931 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
932 @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
933 @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
934 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
935 @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
936 """
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
937 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
938 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
939 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
940 extra = {}
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
941 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
942 assert not {"rsm_max", "rsm_after", "rsm_before",
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
943 C.KEY_ORDER_BY}.intersection(list(extra.keys()))
1464
a8435aebfbcc pages: `page_max` query parameter can now be used on pubsub based pages:
Goffi <goffi@goffi.org>
parents: 1463
diff changeset
944 extra["rsm_max"] = params.get("page_max", str(page_max))
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
945 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
946 extra[C.KEY_ORDER_BY] = order_by
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
947 if 'after' in params:
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
948 extra['rsm_after'] = params['after']
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
949 elif 'before' in params:
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
950 extra['rsm_before'] = params['before']
1433
1a5410981c45 pages: get last page by default with RSM:
Goffi <goffi@goffi.org>
parents: 1423
diff changeset
951 else:
1a5410981c45 pages: get last page by default with RSM:
Goffi <goffi@goffi.org>
parents: 1423
diff changeset
952 # RSM returns list in order (oldest first), but we want most recent first
1a5410981c45 pages: get last page by default with RSM:
Goffi <goffi@goffi.org>
parents: 1423
diff changeset
953 # so we start by the end
1a5410981c45 pages: get last page by default with RSM:
Goffi <goffi@goffi.org>
parents: 1423
diff changeset
954 extra['rsm_before'] = ""
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
955 return extra
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
956
1465
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
957 def setPagination(self, request: server.Request, pubsub_data: dict) -> None:
1256
08cd652dea14 server, pages, tasks (brython): common_scripts:
Goffi <goffi@goffi.org>
parents: 1255
diff changeset
958 """Add to template_data if suitable
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
959
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
960 "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
961 "before" and "after" URL parameters
1465
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
962 @param request: current HTTP request
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
963 @param pubsub_data: pubsub metadata
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
964 """
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
965 template_data = request.template_data
1410
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
966 extra = {}
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
967 try:
1302
04e7dd6b6f4d pages (blog, tickets, merge-requests): updated code to handle new serialisation, following backend changes
Goffi <goffi@goffi.org>
parents: 1294
diff changeset
968 rsm = pubsub_data["rsm"]
04e7dd6b6f4d pages (blog, tickets, merge-requests): updated code to handle new serialisation, following backend changes
Goffi <goffi@goffi.org>
parents: 1294
diff changeset
969 last_id = rsm["last"]
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
970 except KeyError:
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
971 # 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
972 return
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
973
1410
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
974 # if we have a search query, we must keep it
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
975 search = self.getPostedData(request, 'search', raise_on_missing=False)
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
976 if search is not None:
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
977 extra['search'] = search.strip()
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
978
1465
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
979 # same for page_max
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
980 page_max = self.getPostedData(request, 'page_max', raise_on_missing=False)
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
981 if page_max is not None:
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
982 extra['page_max'] = page_max
a410db730301 pages: keep `page_max` if set in query params in `setPagination`:
Goffi <goffi@goffi.org>
parents: 1464
diff changeset
983
1302
04e7dd6b6f4d pages (blog, tickets, merge-requests): updated code to handle new serialisation, following backend changes
Goffi <goffi@goffi.org>
parents: 1294
diff changeset
984 if rsm.get("index", 1) > 0:
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
985 # 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
986 # 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
987 # as we can't know if we are on the first page or not.
1302
04e7dd6b6f4d pages (blog, tickets, merge-requests): updated code to handle new serialisation, following backend changes
Goffi <goffi@goffi.org>
parents: 1294
diff changeset
988 first_id = rsm["first"]
1410
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
989 template_data['previous_page_url'] = self.getParamURL(
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
990 request, before=first_id, **extra)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
991 if not pubsub_data["complete"]:
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
992 # 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
993 # can't know where we are in the feed in this case.
1410
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
994 template_data['next_page_url'] = self.getParamURL(
80683be8d341 pages: keep `search` query when using pagination
Goffi <goffi@goffi.org>
parents: 1405
diff changeset
995 request, after=last_id, **extra)
1141
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
996
02fc28aac2b6 pages: move pagination core from blog to LiberviaPage so it can be reused:
Goffi <goffi@goffi.org>
parents: 1128
diff changeset
997
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
998 ## Cache handling ##
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
999
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1000 def _setCacheHeaders(self, request, cache):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1001 """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
1002 request.setHeader("ETag", cache.hash)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1003 last_modified = self.host.getHTTPDate(cache.created)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1004 request.setHeader("Last-Modified", last_modified)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1005
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1006 def _checkCacheHeaders(self, request, cache):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1007 """Check if a cache condition is set on the request
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1008
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1009 if condition is valid, C.HTTP_NOT_MODIFIED is returned
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1010 """
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1011 etag_match = request.getHeader("If-None-Match")
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1012 if etag_match is not None:
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1013 if cache.hash == etag_match:
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1014 self.pageError(request, C.HTTP_NOT_MODIFIED, no_body=True)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1015 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1016 modified_match = request.getHeader("If-Modified-Since")
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1017 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
1018 modified = date_utils.date_parse(modified_match)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1019 if modified >= int(cache.created):
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1020 self.pageError(request, C.HTTP_NOT_MODIFIED, no_body=True)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1021
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1022 def checkCacheSubscribeCb(self, sub_id, service, node):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1023 self.cache_pubsub_sub.add((service, node, sub_id))
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1024
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1025 def checkCacheSubscribeEb(self, failure_, service, node):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1026 log.warning(_("Can't subscribe to node: {msg}").format(msg=failure_))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1027 # FIXME: cache must be marked as unusable here
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1028
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1029 def psNodeWatchAddEb(self, failure_, service, node):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1030 log.warning(_("Can't add node watched: {msg}").format(msg=failure_))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1031
1490
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1032 def useCache(self, request: server.Request) -> bool:
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1033 """Indicate if the cache should be used
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1034
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1035 test request header to see if it is requested to skip the cache
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1036 @return: True if cache should be used
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1037 """
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1038 return request.getHeader('cache-control') != 'no-cache'
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1039
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1040 def checkCache(self, request, cache_type, **kwargs):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1041 """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
1042
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1043 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
1044 pubsub node)
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1045 @param request(server.Request): current HTTP request
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1046 @param cache_type(int): on of C.CACHE_* const.
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1047 @param **kwargs: args according to cache_type:
1010
4de970de87d7 pages: added getCurrentURL and getParamURL:
Goffi <goffi@goffi.org>
parents: 1009
diff changeset
1048 C.CACHE_PUBSUB:
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1049 service: pubsub service
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1050 node: pubsub node
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1051 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
1052
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1053 """
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1054 if request.postpath:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1055 #  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
1056 return
1033
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1057
1375
e943b0c8eec5 pages: cache is skipped if there are query arguments in URL
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
1058 if request.uri != request.path:
e943b0c8eec5 pages: cache is skipped if there are query arguments in URL
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
1059 # we don't cache page with query arguments as there can be a lot of variants
e943b0c8eec5 pages: cache is skipped if there are query arguments in URL
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
1060 # influencing page results (e.g. search terms)
e943b0c8eec5 pages: cache is skipped if there are query arguments in URL
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
1061 log.debug("ignoring cache due to query arguments")
e943b0c8eec5 pages: cache is skipped if there are query arguments in URL
Goffi <goffi@goffi.org>
parents: 1374
diff changeset
1062
1490
774a81a6e8b5 pages: new `useCache` method to check if `no-cache` is used in request
Goffi <goffi@goffi.org>
parents: 1479
diff changeset
1063 no_cache = not self.useCache(request)
1255
b1fb57e9176d pages: don't use cache when `cache-control` header is set to `no-cache`
Goffi <goffi@goffi.org>
parents: 1253
diff changeset
1064
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1065 profile = self.getProfile(request) or C.SERVICE_PROFILE
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1066
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1067 if cache_type == C.CACHE_PUBSUB:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1068 service, node = kwargs["service"], kwargs["node"]
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1069 if not node:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1070 try:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1071 short = kwargs["short"]
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1072 node = self.host.ns_map[short]
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1073 except KeyError:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1074 log.warning(_('Can\'t use cache for empty node without namespace '
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1075 'set, please ensure to set "short" and that it is '
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1076 'registered'))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1077 return
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1078 if profile != C.SERVICE_PROFILE:
1374
25104d31479f pages: `on_data_post` can now return `"continue"` string:
Goffi <goffi@goffi.org>
parents: 1338
diff changeset
1079 #  only service profile is cached for now
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1080 return
1167
7d2e098ea3f4 pages (cache): separate cached pages using locales, to avoid having a page cache in a specific locale used for an other one.
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
1081 session_data = self.host.getSessionData(request, session_iface.ISATSession)
7d2e098ea3f4 pages (cache): separate cached pages using locales, to avoid having a page cache in a specific locale used for an other one.
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
1082 locale = session_data.locale
7d2e098ea3f4 pages (cache): separate cached pages using locales, to avoid having a page cache in a specific locale used for an other one.
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
1083 if locale == C.DEFAULT_LOCALE:
7d2e098ea3f4 pages (cache): separate cached pages using locales, to avoid having a page cache in a specific locale used for an other one.
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
1084 # no need to duplicate cache here
7d2e098ea3f4 pages (cache): separate cached pages using locales, to avoid having a page cache in a specific locale used for an other one.
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
1085 locale = None
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1086 try:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1087 cache = (self.cache[profile][cache_type][service][node]
1167
7d2e098ea3f4 pages (cache): separate cached pages using locales, to avoid having a page cache in a specific locale used for an other one.
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
1088 [self.vhost_root][request.uri][locale][self])
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1089 except KeyError:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1090 # 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
1091 d1 = self.host.bridgeCall(
1494
1671d187e71d server (pages): update psSubscribe call following change in backend
Goffi <goffi@goffi.org>
parents: 1490
diff changeset
1092 "psSubscribe", service.full(), node, "", profile
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1093 )
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1094 d1.addCallback(self.checkCacheSubscribeCb, service, node)
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1095 d1.addErrback(self.checkCacheSubscribeEb, service, node)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1096 d2 = self.host.bridgeCall("psNodeWatchAdd", service.full(), node, profile)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1097 d2.addErrback(self.psNodeWatchAddEb, service, node)
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1098 self._do_cache = [self, profile, cache_type, service, node,
1167
7d2e098ea3f4 pages (cache): separate cached pages using locales, to avoid having a page cache in a specific locale used for an other one.
Goffi <goffi@goffi.org>
parents: 1165
diff changeset
1099 self.vhost_root, request.uri, locale]
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1100 #  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
1101 # the subscription to continue with page rendering
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1102 return
1267
b5f920845d34 pages: delete existing cache instead of just ignoring it when `no-cache` is used
Goffi <goffi@goffi.org>
parents: 1266
diff changeset
1103 else:
b5f920845d34 pages: delete existing cache instead of just ignoring it when `no-cache` is used
Goffi <goffi@goffi.org>
parents: 1266
diff changeset
1104 if no_cache:
b5f920845d34 pages: delete existing cache instead of just ignoring it when `no-cache` is used
Goffi <goffi@goffi.org>
parents: 1266
diff changeset
1105 del (self.cache[profile][cache_type][service][node]
b5f920845d34 pages: delete existing cache instead of just ignoring it when `no-cache` is used
Goffi <goffi@goffi.org>
parents: 1266
diff changeset
1106 [self.vhost_root][request.uri][locale][self])
b5f920845d34 pages: delete existing cache instead of just ignoring it when `no-cache` is used
Goffi <goffi@goffi.org>
parents: 1266
diff changeset
1107 log.debug(f"cache removed for {self}")
b5f920845d34 pages: delete existing cache instead of just ignoring it when `no-cache` is used
Goffi <goffi@goffi.org>
parents: 1266
diff changeset
1108 return
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1109
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1110 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1111 raise exceptions.InternalError("Unknown cache_type")
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1112 log.debug("using cache for {page}".format(page=self))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1113 cache.last_access = time.time()
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1114 self._setCacheHeaders(request, cache)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1115 self._checkCacheHeaders(request, cache)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1116 request.write(cache.rendered)
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1117 request.finish()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1118 raise failure.Failure(exceptions.CancelError("cache is used"))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1119
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1120 def _cacheURL(self, request, profile):
1018
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1121 self.cached_urls.setdefault(profile, {})[request.uri] = CacheURL(request)
78af5457d3f8 Pages: added url_cache setting:
Goffi <goffi@goffi.org>
parents: 1015
diff changeset
1122
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1123 @classmethod
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1124 def onNodeEvent(cls, host, service, node, event_type, items, profile):
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1125 """Invalidate cache for all pages linked to this node"""
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1126 try:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1127 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
1128 except KeyError:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1129 log.info(_(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1130 "Removing subscription for {service}/{node}: "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1131 "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
1132 d1 = host.bridgeCall("psUnsubscribe", service, node, profile)
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1133 d1.addErrback(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1134 lambda failure_: log.warning(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1135 _("Can't unsubscribe from {service}/{node}: {msg}").format(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1136 service=service, node=node, msg=failure_)))
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1137 d2 = host.bridgeCall("psNodeWatchAdd", service, node, profile)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1138 # 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
1139 d2.addErrback(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1140 lambda failure_: log.warning(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1141 _("Can't remove watch for {service}/{node}: {msg}").format(
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1142 service=service, node=node, msg=failure_)))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1143 else:
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1144 cache.clear()
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1145
1322
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1146 # identities
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1147
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1148 async def fillMissingIdentities(
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1149 self,
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1150 request: server.Request,
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1151 entities: List[Union[str, jid.JID, None]],
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1152 ) -> None:
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1153 """Check if all entities have an identity cache, get missing ones from backend
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1154
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1155 @param request: request with a plugged profile
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1156 @param entities: entities to check, None or empty strings will be filtered
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1157 """
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1158 entities = {str(e) for e in entities if e}
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1159 profile = self.getProfile(request) or C.SERVICE_PROFILE
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1160 identities = self.host.getSessionData(
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1161 request,
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1162 session_iface.ISATSession
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1163 ).identities
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1164 for e in entities:
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1165 if e not in identities:
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1166 id_raw = await self.host.bridgeCall(
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1167 'identityGet', e, [], True, profile)
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1168 identities[e] = data_format.deserialise(id_raw)
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1169
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1170 # signals, server => browser communication
a0954b6610aa pages: identities are not using `data_objects` anymore:
Goffi <goffi@goffi.org>
parents: 1319
diff changeset
1171
1062
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
1172 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
1173 """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
1174 buf = resource.render(request)
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
1175 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
1176 pass
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
1177 else:
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
1178 request.write(buf)
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
1179 request.finish()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1180 raise failure.Failure(exceptions.CancelError("resource delegation"))
1062
c80649cdadd5 pages: new delegateToResource method to continue workflow with a Twisted Resource
Goffi <goffi@goffi.org>
parents: 1061
diff changeset
1181
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1182 def HTTPRedirect(self, request, url):
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1183 """redirect to an URL using HTTP redirection
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1184
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1185 @param request(server.Request): current HTTP request
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1186 @param url(unicode): url to redirect to
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1187 """
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1188 web_util.redirectTo(url.encode("utf-8"), request)
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1189 request.finish()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1190 raise failure.Failure(exceptions.CancelError("HTTP redirection is used"))
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1191
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1192 def redirectOrContinue(self, request, redirect_arg="redirect_url"):
1392
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1193 """Helper method to redirect a page to an url given as arg
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1194
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1195 if the arg is not present, the page will continue normal workflow
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1196 @param request(server.Request): current HTTP request
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1197 @param redirect_arg(unicode): argument to use to get redirection URL
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1198 @interrupt: redirect the page to requested URL
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1199 @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
1200 """
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1201 redirect_arg = redirect_arg.encode('utf-8')
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1202 try:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1203 url = request.args[redirect_arg][0].decode('utf-8')
1061
bacb8f229742 pages: fixed unicode escaping when using a redirecting URL
Goffi <goffi@goffi.org>
parents: 1060
diff changeset
1204 except (KeyError, IndexError):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1205 pass
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1206 else:
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1207 #  a redirection is requested
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1208 if not url or url[0] != "/":
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1209 # we only want local urls
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1210 self.pageError(request, C.HTTP_BAD_REQUEST)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1211 else:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1212 self.HTTPRedirect(request, url)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1213
1032
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1214 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
1215 """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
1216
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1217 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
1218 skipping named page's parse_url method if it exist.
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1219 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
1220 @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
1221 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
1222 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
1223 else:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1224 - 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
1225 - 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
1226 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
1227 "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
1228 "/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
1229 @param request(server.Request): current HTTP request
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1230 @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
1231 skipped
1032
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1232 @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
1233 @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
1234 """
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1235 # FIXME: render non LiberviaPage resources
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1236 path = page_path.rstrip("/").split("/")
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1237 if not path[0]:
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1238 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
1239 else:
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1240 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
1241
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1242 for subpage in path[1:]:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1243 subpage = subpage.encode('utf-8')
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1244 if redirect_page is self.vhost_root:
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1245 redirect_page = redirect_page.children[subpage]
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1246 else:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1247 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
1248
1032
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1249 if path_args is not None:
1224
62bf4f87c249 server: some encoding fixes following python 3 port
Goffi <goffi@goffi.org>
parents: 1216
diff changeset
1250 args = [quote(a).encode() for a in path_args]
1032
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1251 request.postpath = args + request.postpath
863cc6f97068 pages: path arguments can now be specified in pageRedirect
Goffi <goffi@goffi.org>
parents: 1031
diff changeset
1252
1033
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1253 if self._do_cache:
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1254 # 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
1255 redirect_page._do_cache = self._do_cache
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1256 self._do_cache = None
c34f08e05cdf pages: cache is now working even after pageRedirect
Goffi <goffi@goffi.org>
parents: 1032
diff changeset
1257
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1258 defer.ensureDeferred(
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1259 redirect_page.renderPage(request, skip_parse_url=skip_parse_url)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1260 )
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1261 raise failure.Failure(exceptions.CancelError("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
1262
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1263 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
1264 """generate an error page and terminate the request
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1265
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1266 @param request(server.Request): HTTP request
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1267 @param core(int): error code to use
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1268 @param no_body: don't write body if True
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1269 """
1198
1211dbc3cca7 pages: don't put error pages in cache
Goffi <goffi@goffi.org>
parents: 1193
diff changeset
1270 if self._do_cache is not None:
1211dbc3cca7 pages: don't put error pages in cache
Goffi <goffi@goffi.org>
parents: 1193
diff changeset
1271 # we don't want to cache error pages
1211dbc3cca7 pages: don't put error pages in cache
Goffi <goffi@goffi.org>
parents: 1193
diff changeset
1272 self._do_cache = None
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1273 request.setResponseCode(code)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1274 if no_body:
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1275 request.finish()
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1276 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1277 template = "error/" + str(code) + ".html"
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1278 template_data = request.template_data
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1279 session_data = self.host.getSessionData(request, session_iface.ISATSession)
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1280 if session_data.locale is not None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1281 template_data['locale'] = session_data.locale
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1282 if self.vhost_root.site_name:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1283 template_data['site'] = self.vhost_root.site_name
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1284
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1285 rendered = self.host.renderer.render(
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1286 template,
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1287 theme=session_data.theme or self.default_theme,
1318
38875bc292ff pages: add `media_path` and `build_path` in template data for error pages.
Goffi <goffi@goffi.org>
parents: 1317
diff changeset
1288 media_path=f"/{C.MEDIA_DIR}",
38875bc292ff pages: add `media_path` and `build_path` in template data for error pages.
Goffi <goffi@goffi.org>
parents: 1317
diff changeset
1289 build_path=f"/{C.BUILD_DIR}/",
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1290 site_themes=self.site_themes,
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1291 error_code=code,
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1292 **template_data
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1293 )
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1294
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1295 self.writeData(rendered, request)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1296 raise failure.Failure(exceptions.CancelError("error page is used"))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1297
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1298 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
1299 """write data to transport and finish the request"""
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1300 if data is None:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1301 self.pageError(request)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1302 data_encoded = data.encode("utf-8")
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1303
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1304 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
1305 redirected_page = self._do_cache.pop(0)
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1306 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
1307 page_cache = cache[redirected_page] = CachePage(data_encoded)
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1308 self._setCacheHeaders(request, page_cache)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1309 log.debug(_("{page} put in cache for [{profile}]")
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1310 .format( page=self, profile=self._do_cache[0]))
985
64826e69f365 pages: cache mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 984
diff changeset
1311 self._do_cache = None
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1312 self._checkCacheHeaders(request, page_cache)
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1313
1208
584e29d9510a pages: display a warning instead or raising exception if write fails:
Goffi <goffi@goffi.org>
parents: 1205
diff changeset
1314 try:
584e29d9510a pages: display a warning instead or raising exception if write fails:
Goffi <goffi@goffi.org>
parents: 1205
diff changeset
1315 request.write(data_encoded)
584e29d9510a pages: display a warning instead or raising exception if write fails:
Goffi <goffi@goffi.org>
parents: 1205
diff changeset
1316 except AttributeError:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1317 log.warning(_("Can't write page, the request has probably been cancelled "
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1318 "(browser tab closed or reloaded)"))
1208
584e29d9510a pages: display a warning instead or raising exception if write fails:
Goffi <goffi@goffi.org>
parents: 1205
diff changeset
1319 return
1019
34240d08f682 pages: HTTP cache headers handling:
Goffi <goffi@goffi.org>
parents: 1018
diff changeset
1320 request.finish()
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1321
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1322 def _subpagesHandler(self, request):
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1323 """render subpage if suitable
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1324
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1325 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
1326 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
1327 else it render a NoResource.
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1328 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
1329 """
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1330 if request.postpath:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1331 subpage = self.nextPath(request).encode('utf-8')
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1332 try:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1333 child = self.children[subpage]
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1334 except KeyError:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1335 self.pageError(request)
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1336 else:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1337 child.render(request)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1338 raise failure.Failure(exceptions.CancelError("subpage page is used"))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1339
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1340 def _prepare_dynamic(self, request):
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
1341 session_data = self.host.getSessionData(request, session_iface.ISATSession)
998
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1342 # 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
1343 # we set data for template, and create/register token
1504
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
1344 # socket_token = str(uuid.uuid4())
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
1345 socket_url = self.host.get_websocket_url(request)
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
1346 # as for CSRF, it is important to not let the socket token if we use the service
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
1347 # profile, as those pages can be cached, and then the token leaked.
409d10211b20 server, browser: dynamic pages refactoring:
Goffi <goffi@goffi.org>
parents: 1494
diff changeset
1348 socket_token = '' if session_data.profile is None else session_data.ws_token
998
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1349 socket_debug = C.boolConst(self.host.debug)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1350 request.template_data["websocket"] = WebsocketMeta(
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1351 socket_url, socket_token, socket_debug
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1352 )
998
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1353 # 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
1354 request._signals_registered = []
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1355 # 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
1356 request._signals_cache = []
0848b8b0188d pages: dynamic set up is now done just before prepare_render call:
Goffi <goffi@goffi.org>
parents: 995
diff changeset
1357
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1358 def _render_template(self, request):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1359 template_data = request.template_data
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1360
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1361 # if confirm variable is set in case of successfuly data post
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1362 session_data = self.host.getSessionData(request, session_iface.ISATSession)
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1363 template_data['identities'] = session_data.identities
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1364 if session_data.popPageFlag(self, C.FLAG_CONFIRM):
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1365 template_data["confirm"] = True
1186
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1185
diff changeset
1366 notifs = session_data.popPageNotifications(self)
352865f4a268 server: added a generic way to have notification messages in pages
Goffi <goffi@goffi.org>
parents: 1185
diff changeset
1367 if notifs:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1368 template_data["notifications"] = notifs
1266
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1369 if session_data.jid is not None:
6b7f9c3558cc server, pages: better identities handling:
Goffi <goffi@goffi.org>
parents: 1258
diff changeset
1370 template_data["own_jid"] = session_data.jid
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1371 if session_data.locale is not None:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1372 template_data['locale'] = session_data.locale
1294
44da7b118b02 pages: set `guest_session` in template data when suitable
Goffi <goffi@goffi.org>
parents: 1293
diff changeset
1373 if session_data.guest:
44da7b118b02 pages: set `guest_session` in template data when suitable
Goffi <goffi@goffi.org>
parents: 1293
diff changeset
1374 template_data['guest_session'] = True
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1375 if self.vhost_root.site_name:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1376 template_data['site'] = self.vhost_root.site_name
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
1377 if self.dyn_data:
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
1378 for data in self.dyn_data.values():
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
1379 try:
1256
08cd652dea14 server, pages, tasks (brython): common_scripts:
Goffi <goffi@goffi.org>
parents: 1255
diff changeset
1380 scripts = data['scripts']
1246
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
1381 except KeyError:
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
1382 pass
aaf28d45ae67 pages: browser code, first draft:
Goffi <goffi@goffi.org>
parents: 1239
diff changeset
1383 else:
1282
0e4e413eb8db server: user new OrderedSet to handle scripts:
Goffi <goffi@goffi.org>
parents: 1277
diff changeset
1384 template_data.setdefault('scripts', utils.OrderedSet()).update(scripts)
1256
08cd652dea14 server, pages, tasks (brython): common_scripts:
Goffi <goffi@goffi.org>
parents: 1255
diff changeset
1385 template_data.update(data.get('template', {}))
1268
e628724530ec pages, tasks (brython): use set for scripts + common template data:
Goffi <goffi@goffi.org>
parents: 1267
diff changeset
1386 data_common = self.vhost_root.dyn_data_common
e628724530ec pages, tasks (brython): use set for scripts + common template data:
Goffi <goffi@goffi.org>
parents: 1267
diff changeset
1387 common_scripts = data_common['scripts']
1256
08cd652dea14 server, pages, tasks (brython): common_scripts:
Goffi <goffi@goffi.org>
parents: 1255
diff changeset
1388 if common_scripts:
1282
0e4e413eb8db server: user new OrderedSet to handle scripts:
Goffi <goffi@goffi.org>
parents: 1277
diff changeset
1389 template_data.setdefault('scripts', utils.OrderedSet()).update(common_scripts)
1268
e628724530ec pages, tasks (brython): use set for scripts + common template data:
Goffi <goffi@goffi.org>
parents: 1267
diff changeset
1390 if "template" in data_common:
e628724530ec pages, tasks (brython): use set for scripts + common template data:
Goffi <goffi@goffi.org>
parents: 1267
diff changeset
1391 for key, value in data_common["template"].items():
e628724530ec pages, tasks (brython): use set for scripts + common template data:
Goffi <goffi@goffi.org>
parents: 1267
diff changeset
1392 if key not in template_data:
e628724530ec pages, tasks (brython): use set for scripts + common template data:
Goffi <goffi@goffi.org>
parents: 1267
diff changeset
1393 template_data[key] = value
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1394
1293
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1286
diff changeset
1395 theme = session_data.theme or self.default_theme
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1286
diff changeset
1396 self.exposeToScripts(
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1286
diff changeset
1397 request,
1324
898442c4ff68 pages: expose `cache_path` to scripts + `session_uuid` to templates
Goffi <goffi@goffi.org>
parents: 1322
diff changeset
1398 cache_path=session_data.cache_dir,
1305
db9ea167c409 pages: `profile` is now exposed to scripts
Goffi <goffi@goffi.org>
parents: 1304
diff changeset
1399 templates_root_url=str(self.vhost_root.getFrontURL(theme)),
db9ea167c409 pages: `profile` is now exposed to scripts
Goffi <goffi@goffi.org>
parents: 1304
diff changeset
1400 profile=session_data.profile)
1293
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1286
diff changeset
1401
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1402 uri = request.uri.decode()
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1403 try:
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1404 template_data["current_page"] = next(
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1405 m[0] for m in self.main_menu if uri.startswith(m[1])
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1406 )
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1407 except StopIteration:
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1408 pass
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1409
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1410 return self.host.renderer.render(
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1411 self.template,
1293
de3b15d68bb6 pages: expose `templates_root_url` to scripts
Goffi <goffi@goffi.org>
parents: 1286
diff changeset
1412 theme=theme,
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1413 site_themes=self.site_themes,
1148
3c7a64adfd42 pages: use absolute path for build_path + added page_url to template (which is getURL() without argument)
Goffi <goffi@goffi.org>
parents: 1147
diff changeset
1414 page_url=self.getURL(),
1256
08cd652dea14 server, pages, tasks (brython): common_scripts:
Goffi <goffi@goffi.org>
parents: 1255
diff changeset
1415 media_path=f"/{C.MEDIA_DIR}",
1318
38875bc292ff pages: add `media_path` and `build_path` in template data for error pages.
Goffi <goffi@goffi.org>
parents: 1317
diff changeset
1416 build_path=f"/{C.BUILD_DIR}/",
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1417 cache_path=session_data.cache_dir,
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1418 main_menu=self.main_menu,
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1419 **template_data)
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1420
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1421 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
1422 """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
1423
968
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1424 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
1425 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
1426 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
1427 a list of unicode arguments to append to the url.
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1428 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
1429 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
1430 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
1431 this case.
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1432 @param ret(None, unicode, iterable): on_data_post return value
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1433 see LiberviaPage.__init__ on_data_post docstring
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1434 """
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1435 if ret is None:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1436 ret = ()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1437 elif isinstance(ret, str):
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1438 ret = (ret,)
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1439 else:
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1440 ret = tuple(ret)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1441 raise NotImplementedError(
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1442 _("iterable in on_data_post return value is not used yet")
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1443 )
957
67bf14c91d5c server (pages): added a confirm flag on successful post:
Goffi <goffi@goffi.org>
parents: 956
diff changeset
1444 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
1445 request_data = self.getRData(request)
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1446 if "post_redirect_page" in request_data:
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1447 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
1448 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
1449 redirect_page = redirect_page_data[0]
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
1450 redirect_page_args = redirect_page_data[1:]
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
1451 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
1452 else:
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1453 redirect_page = redirect_page_data
972
c4e58c4dba75 server: getURL + minor improvments:
Goffi <goffi@goffi.org>
parents: 968
diff changeset
1454 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
1455 else:
4d37b23777c3 pages (core, tickets/new): replaced post_redirect_uri mechanism by post_redirect_page:
Goffi <goffi@goffi.org>
parents: 966
diff changeset
1456 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
1457 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
1458
962
c7fba7709d05 Pages: various improvments:
Goffi <goffi@goffi.org>
parents: 961
diff changeset
1459 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
1460 session_data.setPageFlag(redirect_page, C.FLAG_CONFIRM)
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1461 request.setResponseCode(C.HTTP_SEE_OTHER)
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1462 request.setHeader(b"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
1463 request.finish()
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1464 raise failure.Failure(exceptions.CancelError("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
1465
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1466 async def _on_data_post(self, request):
1283
436ef2ad92af pages: moved CSRF checking code to a separate method:
Goffi <goffi@goffi.org>
parents: 1282
diff changeset
1467 self.checkCSRF(request)
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1468 try:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1469 ret = await asDeferred(self.on_data_post, self, request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1470 except exceptions.DataError as e:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1471 # something is wrong with the posted data, we re-display the page with a
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1472 # warning notification
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1473 session_data = self.host.getSessionData(request, session_iface.ISATSession)
1338
9bfd2d0661b2 pages: fixed handling of DataError when posting data
Goffi <goffi@goffi.org>
parents: 1324
diff changeset
1474 session_data.setPageNotification(self, str(e), C.LVL_WARNING)
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1475 request.setResponseCode(C.HTTP_SEE_OTHER)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1476 request.setHeader("location", request.uri)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1477 request.finish()
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1478 raise failure.Failure(exceptions.CancelError("Post/Redirect/Get is used"))
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1479 else:
1374
25104d31479f pages: `on_data_post` can now return `"continue"` string:
Goffi <goffi@goffi.org>
parents: 1338
diff changeset
1480 if ret != "continue":
25104d31479f pages: `on_data_post` can now return `"continue"` string:
Goffi <goffi@goffi.org>
parents: 1338
diff changeset
1481 self._on_data_post_redirect(ret, request)
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1482
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1483 def getPostedData(
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1484 self,
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1485 request: server.Request,
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1486 keys,
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1487 multiple: bool = False,
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1488 raise_on_missing: bool = True,
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1489 strip: bool = True
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1490 ):
1187
dab7a2b151ea server (pages): added raise_on_missing arguments in getPostedData:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
1491 """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
1492
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1493 @param request: request linked to the session
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1494 @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
1495 unicode to get one value
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1496 iterable to get more than one
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1497 @param multiple: True if multiple values are possible/expected
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1498 if False, the first value is returned
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1499 @param raise_on_missing: raise KeyError on missing key if True
1187
dab7a2b151ea server (pages): added raise_on_missing arguments in getPostedData:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
1500 else use None for missing values
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1501 @param strip: if True, apply "strip()" on values
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1502 @return (iterator[unicode], list[iterator[unicode], unicode, list[unicode]):
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1503 values received for this(these) key(s)
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1504 @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
1505 """
1128
6414fd795df4 server, pages: multi-sites refactoring:
Goffi <goffi@goffi.org>
parents: 1127
diff changeset
1506 #  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
1507 # double unquote
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1508 if isinstance(keys, str):
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1509 keys = [keys]
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1510
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1511 keys = [k.encode('utf-8') for k in keys]
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1512
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1513 ret = []
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1514 for key in keys:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1515 gen = (urllib.parse.unquote(v.decode("utf-8"))
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1516 for v in request.args.get(key, []))
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1517 if multiple:
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1518 ret.append(gen.strip() if strip else gen)
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1519 else:
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1520 try:
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1521 v = next(gen)
956
dabecab10faa server (pages): impleted CSRF protection:
Goffi <goffi@goffi.org>
parents: 955
diff changeset
1522 except StopIteration:
1187
dab7a2b151ea server (pages): added raise_on_missing arguments in getPostedData:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
1523 if raise_on_missing:
dab7a2b151ea server (pages): added raise_on_missing arguments in getPostedData:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
1524 raise KeyError(key)
dab7a2b151ea server (pages): added raise_on_missing arguments in getPostedData:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
1525 else:
dab7a2b151ea server (pages): added raise_on_missing arguments in getPostedData:
Goffi <goffi@goffi.org>
parents: 1186
diff changeset
1526 ret.append(None)
1393
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1527 else:
d9a328ddef9c pages: implements `strip` argument in `getPostedData`
Goffi <goffi@goffi.org>
parents: 1392
diff changeset
1528 ret.append(v.strip() if strip else v)
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1529
1392
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1530 if len(keys) == 1:
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1531 return ret[0]
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1532 else:
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1533 return ret
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1534
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1535 def getAllPostedData(self, request, except_=(), multiple=True):
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1536 """get all posted data
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1537
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1538 @param request(server.Request): request linked to the session
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1539 @param except_(iterable[unicode]): key of values to ignore
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1540 csrf_token will always be ignored
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1541 @param multiple(bool): if False, only the first values are returned
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1542 @return (dict[unicode, list[unicode]]): post values
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1543 """
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1544 except_ = tuple(except_) + ("csrf_token",)
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1545 ret = {}
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1546 for key, values in request.args.items():
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1547 key = key.decode('utf-8')
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1548 key = urllib.parse.unquote(key)
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1549 if key in except_:
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1550 continue
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1551 values = [v.decode('utf-8') for v in values]
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1552 if not multiple:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1553 ret[key] = urllib.parse.unquote(values[0])
1009
b57f86bc1177 pages: added "multiple" argument to getAllPostedData
Goffi <goffi@goffi.org>
parents: 1003
diff changeset
1554 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1555 ret[key] = [urllib.parse.unquote(v) for v in values]
959
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1556 return ret
968eda9e982a server: added getAllPostedData
Goffi <goffi@goffi.org>
parents: 957
diff changeset
1557
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
1558 def getProfile(self, request):
1392
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1559 """Helper method to easily get current profile
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
1560
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
1561 @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
1562 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
1563 """
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
1564 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
1565 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
1566
1381
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1567 def getJid(self, request):
1392
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1568 """Helper method to easily get current jid
1381
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1569
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1570 @return: current jid
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1571 """
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1572 sat_session = self.host.getSessionData(request, session_iface.ISATSession)
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1573 return sat_session.jid
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1574
a53e22400dad pages: helper method to get current profile's jid
Goffi <goffi@goffi.org>
parents: 1380
diff changeset
1575
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
1576 def getRData(self, request):
1392
e11a71a08a48 pages: fix `getPostedData` when a single value is requested and a list is used
Goffi <goffi@goffi.org>
parents: 1390
diff changeset
1577 """Helper method to get request data dict
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
1578
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
1579 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
1580 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
1581 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
1582 @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
1583 """
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
1584 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
1585 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
1586 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
1587 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
1588 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
1589
1390
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1590 def getPageData(self, request, key):
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1591 """Helper method to retrieve reload resistant data"""
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1592 sat_session = self.host.getSessionData(request, session_iface.ISATSession)
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1593 return sat_session.getPageData(self, key)
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1594
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1595 def setPageData(self, request, key, value):
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1596 """Helper method to set reload resistant data"""
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1597 sat_session = self.host.getSessionData(request, session_iface.ISATSession)
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1598 return sat_session.setPageData(self, key, value)
3e482795630c pages: implement `getPageData` and `setPageData` helper methods
Goffi <goffi@goffi.org>
parents: 1382
diff changeset
1599
1376
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1600 def handleSearch(self, request, extra):
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1601 """Manage Full-Text Search
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1602
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1603 Check if "search" query argument is present, and add MAM filter for it if
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1604 necessary.
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1605 If used, the "search" variable will also be available in template data, thus
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1606 frontend can display some information about it.
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1607 """
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1608 search = self.getPostedData(request, 'search', raise_on_missing=False)
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1609 if search is not None:
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1610 search = search.strip()
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1611 if search:
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1612 try:
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1613 extra[f'mam_filter_{self.host.ns_map["fulltextmam"]}'] = search
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1614 except KeyError:
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1615 log.warning(_("Full-text search is not available"))
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1616 else:
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1617 request.template_data['search'] = search
1b94a5ab155f pages (blog/view): Full-Text Search is used when `search` query argument is present
Goffi <goffi@goffi.org>
parents: 1375
diff changeset
1618
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1619 def _checkAccess(self, request):
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
1620 """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
1621
1173
0f37b65fe7c2 server: replaced wrong usage of C.HTTP_UNAUTHORIZED by C.HTTP_FORBIDDEN
Goffi <goffi@goffi.org>
parents: 1171
diff changeset
1622 if access is not granted, show a HTTP_FORBIDDEN pageError and stop request,
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
1623 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
1624 """
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
1625 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
1626 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
1627 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
1628 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
1629 if not profile:
1405
3dff555fe691 pages: do no send HTTP_FORBIDDEN when registration is not allowed and no profile is connected:
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
1630 # registration allowed, we redirect to login page
3dff555fe691 pages: do no send HTTP_FORBIDDEN when registration is not allowed and no profile is connected:
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
1631 login_url = self.getPageRedirectURL(request)
3dff555fe691 pages: do no send HTTP_FORBIDDEN when registration is not allowed and no profile is connected:
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
1632 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
1633
1169
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1634 def setBestLocale(self, request):
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1635 """Guess the best locale when it is not specified explicitly by user
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1636
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1637 This method will check "accept-language" header, and set locale to first
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1638 matching value with available translations.
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1639 """
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1640 accept_language = request.getHeader("accept-language")
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1641 if not accept_language:
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1642 return
1455
e8c480b0078e server: don't use unordered set for accepted languages:
Goffi <goffi@goffi.org>
parents: 1433
diff changeset
1643 accepted = [a.strip() for a in accept_language.split(',')]
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1644 available = [str(l) for l in self.host.renderer.translations]
1169
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1645 for lang in accepted:
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1646 lang = lang.split(';')[0].strip().lower()
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1647 if not lang:
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1648 continue
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1649 for a in available:
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1650 if a.lower().startswith(lang):
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1651 session_data = self.host.getSessionData(request,
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1652 session_iface.ISATSession)
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1653 session_data.locale = a
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1654 return
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1655
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1656 async 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
1657 """Main method to handle the workflow of a LiberviaPage"""
923
edb322c87ea4 server (pages): pages now handle redirection, check self.pageRedirect docstring for details
Goffi <goffi@goffi.org>
parents: 922
diff changeset
1658 # template_data are the variables passed to template
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1659 if not hasattr(request, "template_data"):
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1660 # if template_data doesn't exist, it's the beginning of the request workflow
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1661 # so we fill essential data
957
67bf14c91d5c server (pages): added a confirm flag on successful post:
Goffi <goffi@goffi.org>
parents: 956
diff changeset
1662 session_data = self.host.getSessionData(request, session_iface.ISATSession)
1479
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
1663 profile = session_data.profile
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1664 request.template_data = {
1479
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
1665 "profile": profile,
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
1666 # it's important to not add CSRF token and session uuid if service profile
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
1667 # is used because the page may be cached, and the token then leaked
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
1668 "csrf_token": "" if profile is None else session_data.csrf_token,
095e94ca6728 pages: disable CSRF token check when service profile is used:
Goffi <goffi@goffi.org>
parents: 1476
diff changeset
1669 "session_uuid": "public" if profile is None else session_data.uuid,
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1670 "breadcrumbs": []
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1671 }
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
1672
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
1673 # 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
1674 # at the beginning of the request hanling
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1675 if request.postpath and not request.postpath[-1]:
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1676 # we don't differenciate URLs finishing with '/' or not
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1677 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
1678
1168
ea0caa7b1bcc pages (i18n): check presence of u"/" in locale:
Goffi <goffi@goffi.org>
parents: 1167
diff changeset
1679 # i18n
1224
62bf4f87c249 server: some encoding fixes following python 3 port
Goffi <goffi@goffi.org>
parents: 1216
diff changeset
1680 key_lang = C.KEY_LANG.encode()
62bf4f87c249 server: some encoding fixes following python 3 port
Goffi <goffi@goffi.org>
parents: 1216
diff changeset
1681 if key_lang in request.args:
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1682 try:
1224
62bf4f87c249 server: some encoding fixes following python 3 port
Goffi <goffi@goffi.org>
parents: 1216
diff changeset
1683 locale = request.args.pop(key_lang)[0].decode()
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1684 except IndexError:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1685 log.warning("empty lang received")
1168
ea0caa7b1bcc pages (i18n): check presence of u"/" in locale:
Goffi <goffi@goffi.org>
parents: 1167
diff changeset
1686 else:
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1687 if "/" in locale:
1168
ea0caa7b1bcc pages (i18n): check presence of u"/" in locale:
Goffi <goffi@goffi.org>
parents: 1167
diff changeset
1688 # "/" is refused because locale may sometime be used to access
ea0caa7b1bcc pages (i18n): check presence of u"/" in locale:
Goffi <goffi@goffi.org>
parents: 1167
diff changeset
1689 # path, if localised documents are available for instance
1216
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1690 log.warning(_('illegal char found in locale ("/"), hack '
b2d067339de3 python 3 port:
Goffi <goffi@goffi.org>
parents: 1208
diff changeset
1691 'attempt? locale={locale}').format(locale=locale))
1168
ea0caa7b1bcc pages (i18n): check presence of u"/" in locale:
Goffi <goffi@goffi.org>
parents: 1167
diff changeset
1692 locale = None
ea0caa7b1bcc pages (i18n): check presence of u"/" in locale:
Goffi <goffi@goffi.org>
parents: 1167
diff changeset
1693 session_data.locale = locale
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1694
1169
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1695 # if locale is not specified, we try to find one requested by browser
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1696 if session_data.locale is None:
97e850e6fae9 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one
Goffi <goffi@goffi.org>
parents: 1168
diff changeset
1697 self.setBestLocale(request)
1165
6424d3684d1e pages: locale handling:
Goffi <goffi@goffi.org>
parents: 1157
diff changeset
1698
1270
6dfcdbeb0d33 pages: handle themes using `theme` request argument
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1699 # theme
6dfcdbeb0d33 pages: handle themes using `theme` request argument
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1700 key_theme = C.KEY_THEME.encode()
6dfcdbeb0d33 pages: handle themes using `theme` request argument
Goffi <goffi@goffi.org>
parents: 1268
diff changeset
1701 if key_theme in request.args:
1275
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1702 theme = request.args.pop(key_theme)[0].decode()
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1703 if key_theme != session_data.theme:
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1704 if theme not in self.site_themes:
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1705 log.warning(_(
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1706 "Theme {theme!r} doesn't exist for {vhost}"
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1707 .format(theme=theme, vhost=self.vhost_root)))
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1708 else:
334d044f2713 server: default theme can now be specified in site section of `sat.conf` with `theme` key
Goffi <goffi@goffi.org>
parents: 1271
diff changeset
1709 session_data.theme = theme
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1710 try:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1711
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1712 try:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1713 self._checkAccess(request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1714
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1715 if self.redirect is not None:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1716 self.pageRedirect(self.redirect, request, skip_parse_url=False)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1717
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1718 if self.parse_url is not None and not skip_parse_url:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1719 if self.url_cache:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1720 profile = self.getProfile(request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1721 try:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1722 cache_url = self.cached_urls[profile][request.uri]
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1723 except KeyError:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1724 # no cache for this URI yet
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1725 #  we do normal URL parsing, and then the cache
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1726 await asDeferred(self.parse_url, self, request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1727 self._cacheURL(request, profile)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1728 else:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1729 log.debug(f"using URI cache for {self}")
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1730 cache_url.use(request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1731 else:
1411
2c3bdba880bb pages: remove forgotten breakpoing
Goffi <goffi@goffi.org>
parents: 1410
diff changeset
1732 await asDeferred(self.parse_url, self, request)
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1733
1417
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1734 if self.add_breadcrumb is None:
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1735 label = (
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1736 self.label
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1737 or self.name
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1738 or self.url[self.url.rfind('/')+1:]
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1739 )
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1740 breadcrumb = {
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1741 "url": self.url,
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1742 "label": label.title(),
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1743 }
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1744 request.template_data["breadcrumbs"].append(breadcrumb)
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1745 else:
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1746 await asDeferred(
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1747 self.add_breadcrumb,
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1748 self,
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1749 request,
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1750 request.template_data["breadcrumbs"]
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1751 )
314bba1ae433 pages: breadcrumbs handling:
Goffi <goffi@goffi.org>
parents: 1411
diff changeset
1752
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1753 self._subpagesHandler(request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1754
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1755 if request.method not in (C.HTTP_METHOD_GET, C.HTTP_METHOD_POST):
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1756 # only HTTP GET and POST are handled so far
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1757 self.pageError(request, C.HTTP_BAD_REQUEST)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1758
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1759 if request.method == C.HTTP_METHOD_POST:
1284
65c43eec15ad pages: `on_data_post` can be set to the string `continue` instead of a callable:
Goffi <goffi@goffi.org>
parents: 1283
diff changeset
1760 if self.on_data_post == 'continue':
65c43eec15ad pages: `on_data_post` can be set to the string `continue` instead of a callable:
Goffi <goffi@goffi.org>
parents: 1283
diff changeset
1761 pass
65c43eec15ad pages: `on_data_post` can be set to the string `continue` instead of a callable:
Goffi <goffi@goffi.org>
parents: 1283
diff changeset
1762 elif self.on_data_post is None:
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1763 # if we don't have on_data_post, the page was not expecting POST
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1764 # so we return an error
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1765 self.pageError(request, C.HTTP_BAD_REQUEST)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1766 else:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1767 await self._on_data_post(request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1768 # by default, POST follow normal behaviour after on_data_post is called
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1769 # this can be changed by a redirection or other method call in on_data_post
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
1770
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1771 if self.dynamic:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1772 self._prepare_dynamic(request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1773
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1774 if self.prepare_render:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1775 await asDeferred(self.prepare_render, self, request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1776
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1777 if self.template:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1778 rendered = self._render_template(request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1779 elif self.render_method:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1780 rendered = await asDeferred(self.render_method, self, request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1781 else:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1782 raise exceptions.InternalError(
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1783 "No method set to render page, please set a template or use a "
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1784 "render method"
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1785 )
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1786
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1787 self.writeData(rendered, request)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1788
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1789 except failure.Failure as f:
1382
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1790 # we have to unpack the Failure to catch the right Exception
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1791 raise f.value
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1792
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1793 except exceptions.CancelError:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1794 pass
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1795 except BridgeException as e:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1796 if e.condition == 'not-allowed':
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1797 log.warning("not allowed exception catched")
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1798 self.pageError(request, C.HTTP_FORBIDDEN)
1382
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1799 elif e.condition == 'item-not-found' or e.classname == 'NotFound':
1319
6e2821e78489 pages: render HTTP_NOT_FOUND page on `item-not-found` bridge error.
Goffi <goffi@goffi.org>
parents: 1318
diff changeset
1800 self.pageError(request, C.HTTP_NOT_FOUND)
1285
37a582b0fe53 pages: 404 is now returne if a remote server is not found
Goffi <goffi@goffi.org>
parents: 1284
diff changeset
1801 elif e.condition == 'remote-server-not-found':
37a582b0fe53 pages: 404 is now returne if a remote server is not found
Goffi <goffi@goffi.org>
parents: 1284
diff changeset
1802 self.pageError(request, C.HTTP_NOT_FOUND)
1382
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1803 elif e.condition == 'forbidden':
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1804 if self.getProfile(request) is None:
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1805 log.debug("access forbidden, we're redirecting to log-in page")
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1806 self.HTTPRedirect(request, self.getPageRedirectURL(request))
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1807 else:
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1808 self.pageError(request, C.HTTP_FORBIDDEN)
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1809 else:
1382
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1810 log.error(
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1811 _("Uncatched bridge exception for HTTP request on {url}: {e}\n"
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1812 "page name: {name}\npath: {path}\nURL: {full_url}\n{tb}")
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1813 .format(
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1814 url=self.url,
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1815 e=e,
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1816 name=self.name or "",
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1817 path=self.root_dir,
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1818 full_url=request.URLPath(),
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1819 tb=traceback.format_exc(),
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1820 )
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1821 )
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1822 try:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1823 self.pageError(request, C.HTTP_INTERNAL_ERROR)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1824 except exceptions.CancelError:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1825 pass
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1826 except Exception as e:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1827 log.error(
1382
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1828 _("Uncatched error for HTTP request on {url}: {e}\npage name: "
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1829 "{name}\npath: {path}\nURL: {full_url}\n{tb}")
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1830 .format(
1382
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1831 url=self.url,
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1832 e=e,
1382
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1833 name=self.name or "",
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1834 path=self.root_dir,
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1835 full_url=request.URLPath(),
21d30f5d582a pages: better generic errors handling:
Goffi <goffi@goffi.org>
parents: 1381
diff changeset
1836 tb=traceback.format_exc(),
1113
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1837 )
cdd389ef97bc server: code style reformatting using black
Goffi <goffi@goffi.org>
parents: 1110
diff changeset
1838 )
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1839 try:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1840 self.pageError(request, C.HTTP_INTERNAL_ERROR)
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1841 except exceptions.CancelError:
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1842 pass
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1843
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1844 def render_GET(self, request):
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1845 defer.ensureDeferred(self.renderPage(request))
917
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1846 return server.NOT_DONE_YET
86563d6c83b0 server: Libervia pages:
Goffi <goffi@goffi.org>
parents: 915
diff changeset
1847
931
8a393ae90f8c server (pages): post requests are now handled:
Goffi <goffi@goffi.org>
parents: 927
diff changeset
1848 def render_POST(self, request):
1276
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1849 defer.ensureDeferred(self.renderPage(request))
cad8f24e23d4 pages: use a coroutine for renderPage:
Goffi <goffi@goffi.org>
parents: 1275
diff changeset
1850 return server.NOT_DONE_YET