author | Julien Cristau <julien.cristau@logilab.fr> |
Thu, 08 Jan 2015 12:20:36 +0100 | |
changeset 10152 | 2ca571e4cb2f |
parent 9229 | 739ae5366bed |
child 10663 | 54b8a1f249fb |
permissions | -rw-r--r-- |
9229
739ae5366bed
[web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8697
diff
changeset
|
1 |
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
2 |
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
3 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
4 |
# This file is part of CubicWeb. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
5 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
6 |
# CubicWeb is free software: you can redistribute it and/or modify it under the |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
7 |
# terms of the GNU Lesser General Public License as published by the Free |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
8 |
# Software Foundation, either version 2.1 of the License, or (at your option) |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
9 |
# any later version. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
10 |
# |
5424
8ecbcbff9777
replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5421
diff
changeset
|
11 |
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
13 |
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
14 |
# details. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
15 |
# |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
16 |
# You should have received a copy of the GNU Lesser General Public License along |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5040
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
5886 | 18 |
"""abstract controller classe for CubicWeb web client""" |
0 | 19 |
|
20 |
__docformat__ = "restructuredtext en" |
|
21 |
||
4897
e402e0b32075
[web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4884
diff
changeset
|
22 |
from logilab.mtconverter import xml_escape |
8190
2a3c1b787688
[vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7879
diff
changeset
|
23 |
from logilab.common.registry import yes |
9229
739ae5366bed
[web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8697
diff
changeset
|
24 |
from logilab.common.deprecation import deprecated |
4897
e402e0b32075
[web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4884
diff
changeset
|
25 |
|
722 | 26 |
from cubicweb.appobject import AppObject |
5694
ce2c108a9595
[pylint] fix detected name errors
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
27 |
from cubicweb.mail import format_mail |
0 | 28 |
from cubicweb.web import LOGGER, Redirect, RequestError |
29 |
||
30 |
||
31 |
NAVIGATION_PARAMETERS = (('vid', '__redirectvid'), |
|
32 |
('rql', '__redirectrql'), |
|
33 |
('__redirectpath', '__redirectpath'), |
|
34 |
('__redirectparams', '__redirectparams'), |
|
35 |
) |
|
1103
f719caf263de
NAV_FORM_PARAMETERS should be a tuple
sylvain.thenault@logilab.fr
parents:
1092
diff
changeset
|
36 |
NAV_FORM_PARAMETERS = tuple(fp for ap, fp in NAVIGATION_PARAMETERS) |
0 | 37 |
|
38 |
def redirect_params(form): |
|
39 |
"""transform redirection parameters into navigation parameters |
|
40 |
""" |
|
41 |
params = {} |
|
42 |
# extract navigation parameters from redirection parameters |
|
43 |
for navparam, redirectparam in NAVIGATION_PARAMETERS: |
|
44 |
if navparam == redirectparam: |
|
45 |
continue |
|
46 |
if redirectparam in form: |
|
47 |
params[navparam] = form[redirectparam] |
|
48 |
return params |
|
49 |
||
50 |
def append_url_params(url, params): |
|
51 |
"""append raw parameters to the url. Given parameters, if any, are expected |
|
52 |
to be already url-quoted. |
|
53 |
""" |
|
54 |
if params: |
|
55 |
if not '?' in url: |
|
56 |
url += '?' |
|
57 |
else: |
|
58 |
url += '&' |
|
59 |
url += params |
|
60 |
return url |
|
61 |
||
62 |
||
63 |
class Controller(AppObject): |
|
64 |
"""a controller is responsible to make necessary stuff to publish |
|
65 |
a request. There is usually at least one standard "view" controller |
|
66 |
and another linked by forms to edit objects ("edit"). |
|
67 |
""" |
|
68 |
__registry__ = 'controllers' |
|
742
99115e029dca
replaced most of __selectors__ assignments with __select__
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
722
diff
changeset
|
69 |
__select__ = yes() |
0 | 70 |
|
71 |
def __init__(self, *args, **kwargs): |
|
2663
2bb628e0cc3b
[controller] should catch and set appli argument here now that the old AppObject class is gone
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2650
diff
changeset
|
72 |
self.appli = kwargs.pop('appli', None) |
0 | 73 |
super(Controller, self).__init__(*args, **kwargs) |
74 |
# attributes use to control after edition redirection |
|
75 |
self._after_deletion_path = None |
|
76 |
self._edited_entity = None |
|
1433 | 77 |
|
0 | 78 |
def publish(self, rset=None): |
4741
f9a176ebe090
[book/controllers] add some content (overview, api super sketch) for the cubicweb controllers
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4719
diff
changeset
|
79 |
"""publish the current request, with an optional input rset""" |
0 | 80 |
raise NotImplementedError |
81 |
||
4741
f9a176ebe090
[book/controllers] add some content (overview, api super sketch) for the cubicweb controllers
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4719
diff
changeset
|
82 |
# generic methods useful for concrete implementations ###################### |
1092
b8fbb95dc0eb
process_rql now done in the controller
sylvain.thenault@logilab.fr
parents:
1016
diff
changeset
|
83 |
|
5715
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
84 |
def process_rql(self): |
1092
b8fbb95dc0eb
process_rql now done in the controller
sylvain.thenault@logilab.fr
parents:
1016
diff
changeset
|
85 |
"""execute rql if specified""" |
5715
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
86 |
req = self._cw |
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
87 |
rql = req.form.get('rql') |
1092
b8fbb95dc0eb
process_rql now done in the controller
sylvain.thenault@logilab.fr
parents:
1016
diff
changeset
|
88 |
if rql: |
5715
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
89 |
req.ensure_ro_rql(rql) |
1092
b8fbb95dc0eb
process_rql now done in the controller
sylvain.thenault@logilab.fr
parents:
1016
diff
changeset
|
90 |
if not isinstance(rql, unicode): |
5715
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
91 |
rql = unicode(rql, req.encoding) |
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
92 |
pp = req.vreg['components'].select_or_none('magicsearch', req) |
2058
7ef12c03447c
nicer vreg api, try to make rset an optional named argument in select and derivated (including selectors)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2001
diff
changeset
|
93 |
if pp is not None: |
5715
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
94 |
return pp.process_query(rql) |
6542
f13c47ac9137
[ui controller] closes #1333236: configuring boxes crashes with traceback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5890
diff
changeset
|
95 |
if 'eid' in req.form and not isinstance(req.form['eid'], list): |
5715
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
96 |
return req.eid_rset(req.form['eid']) |
2c3e83817a8e
[view] add a new entity_call method to entity view protocol, allowing some to work with not yet created entities. Also, start considering 'eid' form parameters where we only consider 'rql', so we can move on bloquing arbitrary rql inputs (more to do on this...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5694
diff
changeset
|
97 |
return None |
1433 | 98 |
|
0 | 99 |
def notify_edited(self, entity): |
100 |
"""called by edit_entity() to notify which entity is edited""" |
|
101 |
# NOTE: we can't use entity.rest_path() at this point because |
|
102 |
# rest_path() could rely on schema constraints (such as a required |
|
103 |
# relation) that might not be satisfied yet (in case of creations) |
|
104 |
if not self._edited_entity: |
|
105 |
self._edited_entity = entity |
|
1433 | 106 |
|
9229
739ae5366bed
[web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8697
diff
changeset
|
107 |
@deprecated('[3.18] call view.set_http_cache_headers then ' |
739ae5366bed
[web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8697
diff
changeset
|
108 |
'.is_client_cache_valid() method and return instead') |
4557
a0571ff0cb5d
[http cache/json controller] ensure json_view does proper cache validation #390986
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4212
diff
changeset
|
109 |
def validate_cache(self, view): |
a0571ff0cb5d
[http cache/json controller] ensure json_view does proper cache validation #390986
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
4212
diff
changeset
|
110 |
view.set_http_cache_headers() |
4666
737cbdb87e87
3.6 api update (introduced by merge)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4636
diff
changeset
|
111 |
self._cw.validate_cache() |
1433 | 112 |
|
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
113 |
def sendmail(self, recipient, subject, body): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
114 |
senderemail = self._cw.user.cw_adapt_to('IEmailable').get_email() |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
115 |
msg = format_mail({'email' : senderemail, |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
116 |
'name' : self._cw.user.dc_title(),}, |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
117 |
[recipient], body, subject) |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
118 |
if not self._cw.vreg.config.sendmails([(msg, [recipient])]): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
119 |
msg = self._cw._('could not connect to the SMTP server') |
7879
9aae456abab5
[pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7432
diff
changeset
|
120 |
url = self._cw.build_url(__message=msg) |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
121 |
raise Redirect(url) |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5424
diff
changeset
|
122 |
|
0 | 123 |
def reset(self): |
124 |
"""reset form parameters and redirect to a view determinated by given |
|
125 |
parameters |
|
126 |
""" |
|
127 |
newparams = {} |
|
128 |
# sets message if needed |
|
7432
cab99ccdb774
[ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents:
7293
diff
changeset
|
129 |
# XXX - don't call .message twice since it pops the id |
cab99ccdb774
[ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents:
7293
diff
changeset
|
130 |
msg = self._cw.message |
cab99ccdb774
[ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents:
7293
diff
changeset
|
131 |
if msg: |
cab99ccdb774
[ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents:
7293
diff
changeset
|
132 |
newparams['_cwmsgid'] = self._cw.set_redirect_message(msg) |
8697
574bb05e40a4
[toward py3k] rewrite has_key() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8696
diff
changeset
|
133 |
if '__action_apply' in self._cw.form: |
0 | 134 |
self._return_to_edition_view(newparams) |
8697
574bb05e40a4
[toward py3k] rewrite has_key() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8696
diff
changeset
|
135 |
if '__action_cancel' in self._cw.form: |
0 | 136 |
self._return_to_lastpage(newparams) |
137 |
else: |
|
138 |
self._return_to_original_view(newparams) |
|
139 |
||
140 |
def _return_to_original_view(self, newparams): |
|
141 |
"""validate-button case""" |
|
142 |
# transforms __redirect[*] parameters into regular form parameters |
|
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
143 |
newparams.update(redirect_params(self._cw.form)) |
0 | 144 |
# find out if we have some explicit `rql` needs |
145 |
rql = newparams.pop('rql', None) |
|
146 |
# if rql is needed (explicit __redirectrql or multiple deletions for |
|
147 |
# instance), we have to use the old `view?rql=...` form |
|
148 |
if rql: |
|
149 |
path = 'view' |
|
150 |
newparams['rql'] = rql |
|
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
151 |
elif '__redirectpath' in self._cw.form: |
0 | 152 |
# if redirect path was explicitly specified in the form, use it |
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
153 |
path = self._cw.form['__redirectpath'] |
4897
e402e0b32075
[web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4884
diff
changeset
|
154 |
if (self._edited_entity and path != self._edited_entity.rest_path() |
e402e0b32075
[web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4884
diff
changeset
|
155 |
and '_cwmsgid' in newparams): |
6866
51d7868264b1
[after edition ui] closes #1381425: Wrong message : 'entity edited (click here to see created entity)'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6542
diff
changeset
|
156 |
# are we here on creation or modification? |
51d7868264b1
[after edition ui] closes #1381425: Wrong message : 'entity edited (click here to see created entity)'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6542
diff
changeset
|
157 |
if any(eid == self._edited_entity.eid |
8696
0bb18407c053
[toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
8258
diff
changeset
|
158 |
for eid in self._cw.data.get('eidmap', {}).itervalues()): |
6866
51d7868264b1
[after edition ui] closes #1381425: Wrong message : 'entity edited (click here to see created entity)'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6542
diff
changeset
|
159 |
msg = self._cw._('click here to see created entity') |
51d7868264b1
[after edition ui] closes #1381425: Wrong message : 'entity edited (click here to see created entity)'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6542
diff
changeset
|
160 |
else: |
51d7868264b1
[after edition ui] closes #1381425: Wrong message : 'entity edited (click here to see created entity)'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6542
diff
changeset
|
161 |
msg = self._cw._('click here to see edited entity') |
51d7868264b1
[after edition ui] closes #1381425: Wrong message : 'entity edited (click here to see created entity)'
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6542
diff
changeset
|
162 |
msg = u'(<a href="%s">%s</a>)' % (xml_escape(self._edited_entity.absolute_url()), msg) |
4897
e402e0b32075
[web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4884
diff
changeset
|
163 |
self._cw.append_to_redirect_message(msg) |
0 | 164 |
elif self._after_deletion_path: |
165 |
# else it should have been set during form processing |
|
166 |
path, params = self._after_deletion_path |
|
167 |
params = dict(params) # params given as tuple |
|
168 |
params.update(newparams) |
|
169 |
newparams = params |
|
170 |
elif self._edited_entity: |
|
5040
00782905b720
[form controller] clear caches in case some attribute participating to the rest path has been modified, avoid redirection to a no more existant page (fix #753567)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4897
diff
changeset
|
171 |
# clear caches in case some attribute participating to the rest path |
00782905b720
[form controller] clear caches in case some attribute participating to the rest path has been modified, avoid redirection to a no more existant page (fix #753567)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4897
diff
changeset
|
172 |
# has been modified |
7293
97505b798975
[entity 3.13 api] rename clear_all_caches into cw_clear_all_cache
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6866
diff
changeset
|
173 |
self._edited_entity.cw_clear_all_caches() |
0 | 174 |
path = self._edited_entity.rest_path() |
175 |
else: |
|
176 |
path = 'view' |
|
3460
e4843535db25
[api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2890
diff
changeset
|
177 |
url = self._cw.build_url(path, **newparams) |
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
178 |
url = append_url_params(url, self._cw.form.get('__redirectparams')) |
0 | 179 |
raise Redirect(url) |
1433 | 180 |
|
0 | 181 |
def _return_to_edition_view(self, newparams): |
182 |
"""apply-button case""" |
|
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
183 |
form = self._cw.form |
0 | 184 |
if self._edited_entity: |
185 |
path = self._edited_entity.rest_path() |
|
186 |
newparams.pop('rql', None) |
|
187 |
# else, fallback on the old `view?rql=...` url form |
|
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
188 |
elif 'rql' in self._cw.form: |
0 | 189 |
path = 'view' |
190 |
newparams['rql'] = form['rql'] |
|
191 |
else: |
|
4897
e402e0b32075
[web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4884
diff
changeset
|
192 |
self.warning('the edited data seems inconsistent') |
0 | 193 |
path = 'view' |
194 |
# pick up the correction edition view |
|
195 |
if form.get('__form_id'): |
|
196 |
newparams['vid'] = form['__form_id'] |
|
197 |
# re-insert copy redirection parameters |
|
198 |
for redirectparam in NAV_FORM_PARAMETERS: |
|
199 |
if redirectparam in form: |
|
200 |
newparams[redirectparam] = form[redirectparam] |
|
3460
e4843535db25
[api] some more _cw / __regid__, automatic tests now pass again
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2890
diff
changeset
|
201 |
raise Redirect(self._cw.build_url(path, **newparams)) |
0 | 202 |
|
203 |
||
204 |
def _return_to_lastpage(self, newparams): |
|
205 |
"""cancel-button case: in this case we are always expecting to go back |
|
206 |
where we came from, and this is not easy. Currently we suppose that |
|
207 |
__redirectpath is specifying that place if found, else we look in the |
|
208 |
request breadcrumbs for the last visited page. |
|
209 |
""" |
|
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
210 |
if '__redirectpath' in self._cw.form: |
0 | 211 |
# if redirect path was explicitly specified in the form, use it |
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
212 |
path = self._cw.form['__redirectpath'] |
8254
eff5b930998d
[web/controller] fix some cases where _cwmsgid may appears twice
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7879
diff
changeset
|
213 |
url = self._cw.build_url(path) |
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
214 |
url = append_url_params(url, self._cw.form.get('__redirectparams')) |
0 | 215 |
else: |
3655
af86ab65a282
3.6 updates
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3460
diff
changeset
|
216 |
url = self._cw.last_visited_page() |
8254
eff5b930998d
[web/controller] fix some cases where _cwmsgid may appears twice
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7879
diff
changeset
|
217 |
# The newparams must update the params in all cases |
eff5b930998d
[web/controller] fix some cases where _cwmsgid may appears twice
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
7879
diff
changeset
|
218 |
url = self._cw.rebuild_url(url, **newparams) |
0 | 219 |
raise Redirect(url) |
220 |
||
221 |
||
222 |
from cubicweb import set_log_methods |
|
223 |
set_log_methods(Controller, LOGGER) |
|
224 |