annotate libervia/server/pages.py @ 1514:16228994ca3b

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