annotate libervia/server/pages.py @ 1466:cff720e26089

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