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