author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Wed, 02 Feb 2011 11:12:03 +0100 | |
branch | stable |
changeset 6934 | e581a86a68f0 |
parent 6926 | 2cda8f1b4fae |
child 6931 | 0af44a38fe41 |
permissions | -rw-r--r-- |
5421
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5389
diff
changeset
|
1 |
# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. |
8167de96c523
proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
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:
5389
diff
changeset
|
17 |
# with CubicWeb. If not, see <http://www.gnu.org/licenses/>. |
5528 | 18 |
"""abstract views and templates classes for CubicWeb web client""" |
0 | 19 |
|
20 |
__docformat__ = "restructuredtext en" |
|
1999
b9a8f5995658
obsolete methods
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1985
diff
changeset
|
21 |
_ = unicode |
0 | 22 |
|
6864
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
23 |
import types, new |
0 | 24 |
from cStringIO import StringIO |
4244
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
25 |
from warnings import warn |
0 | 26 |
|
2613
5e19c2bb370e
R [all] logilab.common 0.44 provides only deprecated
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2558
diff
changeset
|
27 |
from logilab.common.deprecation import deprecated |
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2217
diff
changeset
|
28 |
from logilab.mtconverter import xml_escape |
4058
b3578583b57b
properly escape arguments of user callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3973
diff
changeset
|
29 |
|
2644
100b81ba3a98
F [view] missing import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2613
diff
changeset
|
30 |
from rql import nodes |
0 | 31 |
|
1181
620ec8e6ae19
cleanup, various fix to get something working
sylvain.thenault@logilab.fr
parents:
1144
diff
changeset
|
32 |
from cubicweb import NotAnEntity |
1132 | 33 |
from cubicweb.selectors import yes, non_final_entity, nonempty_rset, none_rset |
2656
a93ae0f6c0ad
R [base classes] only AppObject remaning, no more AppRsetObject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2644
diff
changeset
|
34 |
from cubicweb.appobject import AppObject |
708
b4728112625f
move utils from cw.common to cw
sylvain.thenault@logilab.fr
parents:
707
diff
changeset
|
35 |
from cubicweb.utils import UStringIO, HTMLStream |
6044
9e48ebd5400c
[view] use the new magic js object to generate javascript func call for auto reload user callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6038
diff
changeset
|
36 |
from cubicweb.uilib import domid, js |
2217
3a8cee8f8778
explicit display_name import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2207
diff
changeset
|
37 |
from cubicweb.schema import display_name |
5725
b5d595b66c35
[adapters] enhanced warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5715
diff
changeset
|
38 |
from cubicweb.vregistry import classid |
633 | 39 |
|
0 | 40 |
# robots control |
41 |
NOINDEX = u'<meta name="ROBOTS" content="NOINDEX" />' |
|
42 |
NOFOLLOW = u'<meta name="ROBOTS" content="NOFOLLOW" />' |
|
43 |
||
44 |
CW_XHTML_EXTENSIONS = '''[ |
|
45 |
<!ATTLIST html xmlns:cubicweb CDATA #FIXED \'http://www.logilab.org/2008/cubicweb\' > |
|
46 |
||
47 |
<!ENTITY % coreattrs |
|
522
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
497
diff
changeset
|
48 |
"id ID #IMPLIED |
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
497
diff
changeset
|
49 |
class CDATA #IMPLIED |
385ce5e0b30b
cubicweb__loadurl -> cubicweb:lazyloadurl
sylvain.thenault@logilab.fr
parents:
497
diff
changeset
|
50 |
style CDATA #IMPLIED |
0 | 51 |
title CDATA #IMPLIED |
52 |
||
3782
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
53 |
cubicweb:accesskey CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
54 |
cubicweb:actualrql CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
55 |
cubicweb:dataurl CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
56 |
cubicweb:facetName CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
57 |
cubicweb:facetargs CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
58 |
cubicweb:fallbackvid CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
59 |
cubicweb:fname CDATA #IMPLIED |
0 | 60 |
cubicweb:initfunc CDATA #IMPLIED |
61 |
cubicweb:inputid CDATA #IMPLIED |
|
62 |
cubicweb:inputname CDATA #IMPLIED |
|
3782
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
63 |
cubicweb:limit CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
64 |
cubicweb:loadtype CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
65 |
cubicweb:loadurl CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
66 |
cubicweb:maxlength CDATA #IMPLIED |
0 | 67 |
cubicweb:required CDATA #IMPLIED |
3782
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
68 |
cubicweb:rooteid CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
69 |
cubicweb:rql CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
70 |
cubicweb:size CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
71 |
cubicweb:sortvalue CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
72 |
cubicweb:target CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
73 |
cubicweb:tindex CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
74 |
cubicweb:tlunit CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
75 |
cubicweb:type CDATA #IMPLIED |
5533
5cb121d4f02f
[dtd] add unselimg attribute use by widget for HasRelationFacet
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5528
diff
changeset
|
76 |
cubicweb:unselimg CDATA #IMPLIED |
3782
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
77 |
cubicweb:uselabel CDATA #IMPLIED |
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
78 |
cubicweb:value CDATA #IMPLIED |
0 | 79 |
cubicweb:variables CDATA #IMPLIED |
80 |
cubicweb:vid CDATA #IMPLIED |
|
3782
c69fe7493b91
[cleanup] reorder cubicweb namespace attributes declaration
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
81 |
cubicweb:wdgtype CDATA #IMPLIED |
0 | 82 |
"> ] ''' |
83 |
||
1421
77ee26df178f
doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents:
1181
diff
changeset
|
84 |
TRANSITIONAL_DOCTYPE = u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" %s>\n' % CW_XHTML_EXTENSIONS |
6769
d784d64f28d0
Backed out changeset 84b67ae41a0d: with this fix, some
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6761
diff
changeset
|
85 |
TRANSITIONAL_DOCTYPE_NOEXT = u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n' |
1421
77ee26df178f
doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents:
1181
diff
changeset
|
86 |
STRICT_DOCTYPE = u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" %s>\n' % CW_XHTML_EXTENSIONS |
6769
d784d64f28d0
Backed out changeset 84b67ae41a0d: with this fix, some
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6761
diff
changeset
|
87 |
STRICT_DOCTYPE_NOEXT = u'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n' |
0 | 88 |
|
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
89 |
# base view object ############################################################ |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
90 |
|
2656
a93ae0f6c0ad
R [base classes] only AppObject remaning, no more AppRsetObject
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2644
diff
changeset
|
91 |
class View(AppObject): |
0 | 92 |
"""abstract view class, used as base for every renderable object such |
93 |
as views, templates, some components...web |
|
94 |
||
95 |
A view is instantiated to render a [part of a] result set. View |
|
96 |
subclasses may be parametred using the following class attributes: |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
97 |
|
0 | 98 |
* `templatable` indicates if the view may be embeded in a main |
99 |
template or if it has to be rendered standalone (i.e. XML for |
|
100 |
instance) |
|
101 |
* if the view is not templatable, it should set the `content_type` class |
|
102 |
attribute to the correct MIME type (text/xhtml by default) |
|
103 |
* the `category` attribute may be used in the interface to regroup related |
|
104 |
objects together |
|
105 |
||
4702
d9e51820d0c2
fix docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4459
diff
changeset
|
106 |
At instantiation time, the standard `_cw`, and `cw_rset` attributes are |
d9e51820d0c2
fix docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4459
diff
changeset
|
107 |
added and the `w` attribute will be set at rendering time to a write |
d9e51820d0c2
fix docstring
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4459
diff
changeset
|
108 |
function to use. |
0 | 109 |
""" |
816
9cd49a910fce
kill Template class and 'templates' registry
sylvain.thenault@logilab.fr
parents:
781
diff
changeset
|
110 |
__registry__ = 'views' |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
111 |
|
0 | 112 |
templatable = True |
113 |
# content_type = 'application/xhtml+xml' # text/xhtml' |
|
114 |
binary = False |
|
115 |
add_to_breadcrumbs = True |
|
116 |
category = 'view' |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
117 |
|
4244
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
118 |
@property |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
119 |
@deprecated('[3.6] need_navigation is deprecated, use .paginable') |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
120 |
def need_navigation(self): |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
121 |
return True |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
122 |
|
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
123 |
@property |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
124 |
def paginable(self): |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
125 |
if not isinstance(self.__class__.need_navigation, property): |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
126 |
warn('[3.6] %s.need_navigation is deprecated, use .paginable' |
4456 | 127 |
% self.__class__, DeprecationWarning) |
4244
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
128 |
return self.need_navigation |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
129 |
return True |
2c3de1953d00
rename need_navigation into paginable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4212
diff
changeset
|
130 |
|
1143
8d097defbf2c
change the way selected/__init__ are used for AppRsetObject
sylvain.thenault@logilab.fr
parents:
1132
diff
changeset
|
131 |
def __init__(self, req=None, rset=None, **kwargs): |
2822
f26578339214
deprecate appobject.vreg and rename appobject instance attributes using cw_ prefix
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2819
diff
changeset
|
132 |
super(View, self).__init__(req, rset=rset, **kwargs) |
0 | 133 |
self.w = None |
134 |
||
135 |
@property |
|
136 |
def content_type(self): |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
137 |
return self._cw.html_content_type() |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
138 |
|
0 | 139 |
def set_stream(self, w=None): |
140 |
if self.w is not None: |
|
141 |
return |
|
142 |
if w is None: |
|
143 |
if self.binary: |
|
144 |
self._stream = stream = StringIO() |
|
145 |
else: |
|
146 |
self._stream = stream = UStringIO() |
|
147 |
w = stream.write |
|
148 |
else: |
|
149 |
stream = None |
|
150 |
self.w = w |
|
151 |
return stream |
|
152 |
||
153 |
# main view interface ##################################################### |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
154 |
|
1723 | 155 |
def render(self, w=None, **context): |
0 | 156 |
"""called to render a view object for a result set. |
157 |
||
158 |
This method is a dispatched to an actual method selected |
|
159 |
according to optional row and col parameters, which are locating |
|
160 |
a particular row or cell in the result set: |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
161 |
|
1132 | 162 |
* if row is specified, `cell_call` is called |
0 | 163 |
* if none of them is supplied, the view is considered to apply on |
164 |
the whole result set (which may be None in this case), `call` is |
|
165 |
called |
|
166 |
""" |
|
6922
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
167 |
# XXX use .cw_row/.cw_col |
1132 | 168 |
row = context.get('row') |
0 | 169 |
if row is not None: |
170 |
context.setdefault('col', 0) |
|
171 |
view_func = self.cell_call |
|
172 |
else: |
|
173 |
view_func = self.call |
|
174 |
stream = self.set_stream(w) |
|
6563
33343d6eae0a
[view] log error on view_func call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6458
diff
changeset
|
175 |
try: |
33343d6eae0a
[view] log error on view_func call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6458
diff
changeset
|
176 |
view_func(**context) |
33343d6eae0a
[view] log error on view_func call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6458
diff
changeset
|
177 |
except: |
33343d6eae0a
[view] log error on view_func call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6458
diff
changeset
|
178 |
self.debug('view call %s failed (context=%s)', view_func, context) |
33343d6eae0a
[view] log error on view_func call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6458
diff
changeset
|
179 |
raise |
0 | 180 |
# return stream content if we have created it |
181 |
if stream is not None: |
|
182 |
return self._stream.getvalue() |
|
183 |
||
2795
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
184 |
def tal_render(self, template, variables): |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
185 |
"""render a precompiled page template with variables in the given |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
186 |
dictionary as context |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
187 |
""" |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
188 |
from cubicweb.ext.tal import CubicWebContext |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
189 |
context = CubicWebContext() |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
190 |
context.update({'self': self, 'rset': self.cw_rset, '_' : self._cw._, |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
191 |
'req': self._cw, 'user': self._cw.user}) |
2795
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
192 |
context.update(variables) |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
193 |
output = UStringIO() |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
194 |
template.expand(context, output) |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
195 |
return output.getvalue() |
59965167bef3
move tal_render to View
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2788
diff
changeset
|
196 |
|
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2656
diff
changeset
|
197 |
dispatch = deprecated('[3.4] .dispatch is deprecated, use .render')(render) |
1723 | 198 |
|
0 | 199 |
# should default .call() method add a <div classs="section"> around each |
200 |
# rset item |
|
201 |
add_div_section = True |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
202 |
|
0 | 203 |
def call(self, **kwargs): |
204 |
"""the view is called for an entire result set, by default loop |
|
205 |
other rows of the result set and call the same view on the |
|
206 |
particular row |
|
207 |
||
208 |
Views applicable on None result sets have to override this method |
|
209 |
""" |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
210 |
rset = self.cw_rset |
0 | 211 |
if rset is None: |
4141
637170c17643
improve error message
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
4063
diff
changeset
|
212 |
raise NotImplementedError, (self, "an rset is required") |
0 | 213 |
wrap = self.templatable and len(rset) > 1 and self.add_div_section |
6922
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
214 |
# avoid re-selection if rset of size 1, we already have the most |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
215 |
# specific view |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
216 |
if rset.rowcount != 1: |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
217 |
kwargs.setdefault('initargs', self.cw_extra_kwargs) |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
218 |
for i in xrange(len(rset)): |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
219 |
if wrap: |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
220 |
self.w(u'<div class="section">') |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
221 |
self.wview(self.__regid__, rset, row=i, **kwargs) |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
222 |
if wrap: |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
223 |
self.w(u"</div>") |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
224 |
else: |
0 | 225 |
if wrap: |
226 |
self.w(u'<div class="section">') |
|
6922
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
227 |
kwargs.setdefault('col', 0) |
cb1dd14a768f
[view] fix/enhance view.render
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6909
diff
changeset
|
228 |
self.cell_call(row=0, **kwargs) |
0 | 229 |
if wrap: |
230 |
self.w(u"</div>") |
|
231 |
||
232 |
def cell_call(self, row, col, **kwargs): |
|
233 |
"""the view is called for a particular result set cell""" |
|
234 |
raise NotImplementedError, self |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
235 |
|
0 | 236 |
def linkable(self): |
237 |
"""return True if the view may be linked in a menu |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
238 |
|
0 | 239 |
by default views without title are not meant to be displayed |
240 |
""" |
|
241 |
if not getattr(self, 'title', None): |
|
242 |
return False |
|
243 |
return True |
|
244 |
||
245 |
def is_primary(self): |
|
4045
f4a52abb6f4f
cw 3.6 api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
3998
diff
changeset
|
246 |
return self.cw_extra_kwargs.get('is_primary', self.__regid__ == 'primary') |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
247 |
|
0 | 248 |
def url(self): |
249 |
"""return the url associated with this view. Should not be |
|
250 |
necessary for non linkable views, but a default implementation |
|
251 |
is provided anyway. |
|
252 |
""" |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
253 |
rset = self.cw_rset |
2468
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
254 |
if rset is None: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
255 |
return self._cw.build_url('view', vid=self.__regid__) |
2468
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
256 |
coltypes = rset.column_types(0) |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
257 |
if len(coltypes) == 1: |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
258 |
etype = iter(coltypes).next() |
4045
f4a52abb6f4f
cw 3.6 api update
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
3998
diff
changeset
|
259 |
if not self._cw.vreg.schema.eschema(etype).final: |
2468
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
260 |
if len(rset) == 1: |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
261 |
entity = rset.get_entity(0, 0) |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
262 |
return entity.absolute_url(vid=self.__regid__) |
2468
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
263 |
# don't want to generate /<etype> url if there is some restriction |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
264 |
# on something else than the entity type |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
265 |
restr = rset.syntax_tree().children[0].where |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
266 |
# XXX norestriction is not correct here. For instance, in cases like |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
267 |
# "Any P,N WHERE P is Project, P name N" norestriction should equal |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
268 |
# True |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
269 |
norestriction = (isinstance(restr, nodes.Relation) and |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
270 |
restr.is_types_restriction()) |
93853b6f3bad
move all view.url() logic in a single implementation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2418
diff
changeset
|
271 |
if norestriction: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
272 |
return self._cw.build_url(etype.lower(), vid=self.__regid__) |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
273 |
return self._cw.build_url('view', rql=rset.printable_rql(), vid=self.__regid__) |
0 | 274 |
|
275 |
def set_request_content_type(self): |
|
276 |
"""set the content type returned by this view""" |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
277 |
self._cw.set_content_type(self.content_type) |
0 | 278 |
|
279 |
# view utilities ########################################################## |
|
1433 | 280 |
|
1985
9c1db4e06095
move view method's logic on the registry, so it's easier to call it from outside an appobject. Also make rset argument optional
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
281 |
def wview(self, __vid, rset=None, __fallback_vid=None, **kwargs): |
0 | 282 |
"""shortcut to self.view method automatically passing self.w as argument |
283 |
""" |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
284 |
self._cw.view(__vid, rset, __fallback_vid, w=self.w, **kwargs) |
1433 | 285 |
|
819 | 286 |
# XXX Template bw compat |
2788
8d3dbe577d3a
R put version info in deprecation warnings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2656
diff
changeset
|
287 |
template = deprecated('[3.4] .template is deprecated, use .view')(wview) |
0 | 288 |
|
289 |
def whead(self, data): |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
290 |
self._cw.html_headers.write(data) |
0 | 291 |
|
292 |
def wdata(self, data): |
|
293 |
"""simple helper that escapes `data` and writes into `self.w`""" |
|
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2217
diff
changeset
|
294 |
self.w(xml_escape(data)) |
0 | 295 |
|
296 |
def html_headers(self): |
|
297 |
"""return a list of html headers (eg something to be inserted between |
|
298 |
<head> and </head> of the returned page |
|
299 |
||
300 |
by default return a meta tag to disable robot indexation of the page |
|
301 |
""" |
|
302 |
return [NOINDEX] |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
303 |
|
0 | 304 |
def page_title(self): |
305 |
"""returns a title according to the result set - used for the |
|
306 |
title in the HTML header |
|
307 |
""" |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
308 |
vtitle = self._cw.form.get('vtitle') |
0 | 309 |
if vtitle: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
310 |
return self._cw._(vtitle) |
0 | 311 |
# class defined title will only be used if the resulting title doesn't |
312 |
# seem clear enough |
|
313 |
vtitle = getattr(self, 'title', None) or u'' |
|
314 |
if vtitle: |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
315 |
vtitle = self._cw._(vtitle) |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
316 |
rset = self.cw_rset |
0 | 317 |
if rset and rset.rowcount: |
318 |
if rset.rowcount == 1: |
|
319 |
try: |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
320 |
entity = rset.complete_entity(0, 0) |
0 | 321 |
# use long_title to get context information if any |
322 |
clabel = entity.dc_long_title() |
|
323 |
except NotAnEntity: |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
324 |
clabel = display_name(self._cw, rset.description[0][0]) |
0 | 325 |
clabel = u'%s (%s)' % (clabel, vtitle) |
326 |
else : |
|
327 |
etypes = rset.column_types(0) |
|
328 |
if len(etypes) == 1: |
|
329 |
etype = iter(etypes).next() |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
330 |
clabel = display_name(self._cw, etype, 'plural') |
0 | 331 |
else : |
332 |
clabel = u'#[*] (%s)' % vtitle |
|
333 |
else: |
|
334 |
clabel = vtitle |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
335 |
return u'%s (%s)' % (clabel, self._cw.property_value('ui.site-title')) |
0 | 336 |
|
6039
6e84db1b3e44
[view] deprecate create_url in favor of a cw_create_url class method on entity classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5725
diff
changeset
|
337 |
@deprecated('[3.10] use vreg["etypes"].etype_class(etype).cw_create_url(req)') |
0 | 338 |
def create_url(self, etype, **kwargs): |
339 |
""" return the url of the entity creation form for a given entity type""" |
|
6039
6e84db1b3e44
[view] deprecate create_url in favor of a cw_create_url class method on entity classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5725
diff
changeset
|
340 |
return self._cw.vreg["etypes"].etype_class(etype).cw_create_url( |
6e84db1b3e44
[view] deprecate create_url in favor of a cw_create_url class method on entity classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5725
diff
changeset
|
341 |
self._cw, **kwargs) |
0 | 342 |
|
6038
5c5d819e8e93
small cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5725
diff
changeset
|
343 |
def field(self, label, value, row=True, show_label=True, w=None, tr=True, |
5c5d819e8e93
small cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5725
diff
changeset
|
344 |
table=False): |
3809
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
345 |
"""read-only field""" |
0 | 346 |
if w is None: |
347 |
w = self.w |
|
3809
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
348 |
if table: |
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
349 |
w(u'<tr class="entityfield">') |
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
350 |
else: |
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
351 |
w(u'<div class="entityfield">') |
3326
e3089ceee1ea
don't show label if no label given
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3010
diff
changeset
|
352 |
if show_label and label: |
0 | 353 |
if tr: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
354 |
label = display_name(self._cw, label) |
3809
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
355 |
if table: |
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
356 |
w(u'<th>%s</th>' % label) |
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
357 |
else: |
6909
b8171392de16
[view] missing class on label span
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6864
diff
changeset
|
358 |
w(u'<span class="label">%s</span> ' % label) |
3809
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
359 |
if table: |
3969
970a748684b5
when fields are displayed in a table and label should'nt be displayed, set colspan to 2 on the field value cell
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3839
diff
changeset
|
360 |
if not (show_label and label): |
970a748684b5
when fields are displayed in a table and label should'nt be displayed, set colspan to 2 on the field value cell
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3839
diff
changeset
|
361 |
w(u'<td colspan="2">%s</td></tr>' % value) |
970a748684b5
when fields are displayed in a table and label should'nt be displayed, set colspan to 2 on the field value cell
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3839
diff
changeset
|
362 |
else: |
970a748684b5
when fields are displayed in a table and label should'nt be displayed, set colspan to 2 on the field value cell
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3839
diff
changeset
|
363 |
w(u'<td>%s</td></tr>' % value) |
3809
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
364 |
else: |
1b9b51ee543e
[web ui] PrimaryView.render_attributes now uses a table
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3782
diff
changeset
|
365 |
w(u'<span>%s</span></div>' % value) |
1433 | 366 |
|
0 | 367 |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
368 |
|
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
635
diff
changeset
|
369 |
# concrete views base classes ################################################# |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
635
diff
changeset
|
370 |
|
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
635
diff
changeset
|
371 |
class EntityView(View): |
843 | 372 |
"""base class for views applying on an entity (i.e. uniform result set)""" |
781
323656dd85a9
fix import, use non_final_entity instead of implements('Any')
sylvain.thenault@logilab.fr
parents:
757
diff
changeset
|
373 |
__select__ = non_final_entity() |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
635
diff
changeset
|
374 |
category = 'entityview' |
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
635
diff
changeset
|
375 |
|
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:
5679
diff
changeset
|
376 |
def call(self, **kwargs): |
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:
5679
diff
changeset
|
377 |
if self.cw_rset is None: |
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:
5679
diff
changeset
|
378 |
self.entity_call(self.cw_extra_kwargs.pop('entity')) |
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:
5679
diff
changeset
|
379 |
else: |
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:
5679
diff
changeset
|
380 |
super(EntityView, self).call(**kwargs) |
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:
5679
diff
changeset
|
381 |
|
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:
5679
diff
changeset
|
382 |
def cell_call(self, row, col, **kwargs): |
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:
5679
diff
changeset
|
383 |
self.entity_call(self.cw_rset.get_entity(row, col), **kwargs) |
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:
5679
diff
changeset
|
384 |
|
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:
5679
diff
changeset
|
385 |
def entity_call(self, entity, **kwargs): |
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:
5679
diff
changeset
|
386 |
raise NotImplementedError() |
640
8e64f12be69c
drop EntityAction usage in cw, upgrade rql_condition and friends
sylvain.thenault@logilab.fr
parents:
635
diff
changeset
|
387 |
|
6926 | 388 |
|
0 | 389 |
class StartupView(View): |
843 | 390 |
"""base class for views which doesn't need a particular result set to be |
391 |
displayed (so they can always be displayed !) |
|
0 | 392 |
""" |
707 | 393 |
__select__ = none_rset() |
1433 | 394 |
|
0 | 395 |
category = 'startupview' |
1433 | 396 |
|
0 | 397 |
def html_headers(self): |
398 |
"""return a list of html headers (eg something to be inserted between |
|
399 |
<head> and </head> of the returned page |
|
400 |
||
401 |
by default startup views are indexed |
|
402 |
""" |
|
403 |
return [] |
|
404 |
||
405 |
||
406 |
class EntityStartupView(EntityView): |
|
407 |
"""base class for entity views which may also be applied to None |
|
408 |
result set (usually a default rql is provided by the view class) |
|
409 |
""" |
|
781
323656dd85a9
fix import, use non_final_entity instead of implements('Any')
sylvain.thenault@logilab.fr
parents:
757
diff
changeset
|
410 |
__select__ = none_rset() | non_final_entity() |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
411 |
|
0 | 412 |
default_rql = None |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
413 |
|
2418
8f06e4f02733
optional rset
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2312
diff
changeset
|
414 |
def __init__(self, req, rset=None, **kwargs): |
2890
fdcb8a2bb6eb
fix __init__ parameters
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2822
diff
changeset
|
415 |
super(EntityStartupView, self).__init__(req, rset=rset, **kwargs) |
0 | 416 |
if rset is None: |
417 |
# this instance is not in the "entityview" category |
|
418 |
self.category = 'startupview' |
|
419 |
||
420 |
def startup_rql(self): |
|
873 | 421 |
"""return some rql to be executed if the result set is None""" |
0 | 422 |
return self.default_rql |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
423 |
|
0 | 424 |
def call(self, **kwargs): |
873 | 425 |
"""override call to execute rql returned by the .startup_rql method if |
426 |
necessary |
|
0 | 427 |
""" |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
428 |
rset = self.cw_rset |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
429 |
if rset is None: |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
430 |
rset = self.cw_rset = self._cw.execute(self.startup_rql()) |
0 | 431 |
for i in xrange(len(rset)): |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
432 |
self.wview(self.__regid__, rset, row=i, **kwargs) |
0 | 433 |
|
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
434 |
|
0 | 435 |
class AnyRsetView(View): |
436 |
"""base class for views applying on any non empty result sets""" |
|
707 | 437 |
__select__ = nonempty_rset() |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
438 |
|
0 | 439 |
category = 'anyrsetview' |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
440 |
|
2203
efdd3a9f9028
update to new rql get_description api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1999
diff
changeset
|
441 |
def columns_labels(self, mainindex=0, tr=True): |
370
7e76f651314b
fix rset xml view
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
369
diff
changeset
|
442 |
if tr: |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
443 |
translate = lambda val, req=self._cw: display_name(req, val) |
370
7e76f651314b
fix rset xml view
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
369
diff
changeset
|
444 |
else: |
2207
5fad58e603f4
fix translate argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2203
diff
changeset
|
445 |
translate = lambda val: val |
2203
efdd3a9f9028
update to new rql get_description api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1999
diff
changeset
|
446 |
# XXX [0] because of missing Union support |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
447 |
rqlstdescr = self.cw_rset.syntax_tree().get_description(mainindex, |
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
448 |
translate)[0] |
369
c8a6edc224bb
new rsetxml view, reusing most code from csvexport view
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
361
diff
changeset
|
449 |
labels = [] |
2203
efdd3a9f9028
update to new rql get_description api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1999
diff
changeset
|
450 |
for colindex, label in enumerate(rqlstdescr): |
369
c8a6edc224bb
new rsetxml view, reusing most code from csvexport view
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
361
diff
changeset
|
451 |
# compute column header |
2203
efdd3a9f9028
update to new rql get_description api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1999
diff
changeset
|
452 |
if label == 'Any': # find a better label |
2207
5fad58e603f4
fix translate argument
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2203
diff
changeset
|
453 |
label = ','.join(translate(et) |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
454 |
for et in self.cw_rset.column_types(colindex)) |
369
c8a6edc224bb
new rsetxml view, reusing most code from csvexport view
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
361
diff
changeset
|
455 |
labels.append(label) |
c8a6edc224bb
new rsetxml view, reusing most code from csvexport view
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents:
361
diff
changeset
|
456 |
return labels |
543
c0f2b6378f70
simplification of lazy tabs mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
522
diff
changeset
|
457 |
|
1433 | 458 |
|
0 | 459 |
# concrete template base classes ############################################## |
460 |
||
816
9cd49a910fce
kill Template class and 'templates' registry
sylvain.thenault@logilab.fr
parents:
781
diff
changeset
|
461 |
class MainTemplate(View): |
0 | 462 |
"""main template are primary access point to render a full HTML page. |
463 |
There is usually at least a regular main template and a simple fallback |
|
464 |
one to display error if the first one failed |
|
465 |
""" |
|
466 |
||
467 |
@property |
|
468 |
def doctype(self): |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
469 |
if self._cw.xhtml_browser(): |
1421
77ee26df178f
doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents:
1181
diff
changeset
|
470 |
return STRICT_DOCTYPE |
77ee26df178f
doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents:
1181
diff
changeset
|
471 |
return STRICT_DOCTYPE_NOEXT |
0 | 472 |
|
1424 | 473 |
def set_stream(self, w=None): |
474 |
if self.w is not None: |
|
0 | 475 |
return |
476 |
if w is None: |
|
477 |
if self.binary: |
|
478 |
self._stream = stream = StringIO() |
|
479 |
else: |
|
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
480 |
self._stream = stream = HTMLStream(self._cw) |
0 | 481 |
w = stream.write |
482 |
else: |
|
483 |
stream = None |
|
484 |
self.w = w |
|
485 |
return stream |
|
486 |
||
487 |
def write_doctype(self, xmldecl=True): |
|
488 |
assert isinstance(self._stream, HTMLStream) |
|
489 |
self._stream.doctype = self.doctype |
|
490 |
if not xmldecl: |
|
491 |
self._stream.xmldecl = u'' |
|
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
492 |
|
822 | 493 |
def linkable(self): |
494 |
return False |
|
1433 | 495 |
|
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
496 |
# concrete component base classes ############################################# |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
497 |
|
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
498 |
class ReloadableMixIn(object): |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
499 |
"""simple mixin for reloadable parts of UI""" |
1433 | 500 |
|
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
501 |
def user_callback(self, cb, args, msg=None, nonify=False): |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
502 |
"""register the given user callback and return an url to call it ready to be |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
503 |
inserted in html |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
504 |
""" |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
505 |
self._cw.add_js('cubicweb.ajax.js') |
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
506 |
if nonify: |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
507 |
_cb = cb |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
508 |
def cb(*args): |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
509 |
_cb(*args) |
3451
6b46d73823f5
[api] work in progress, use __regid__, cw_*, etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3369
diff
changeset
|
510 |
cbname = self._cw.register_onetime_callback(cb, *args) |
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2217
diff
changeset
|
511 |
return self.build_js(cbname, xml_escape(msg or '')) |
1433 | 512 |
|
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
513 |
def build_update_js_call(self, cbname, msg): |
4059 | 514 |
rql = self.cw_rset.printable_rql() |
6044
9e48ebd5400c
[view] use the new magic js object to generate javascript func call for auto reload user callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6038
diff
changeset
|
515 |
return "javascript: %s" % js.userCallbackThenUpdateUI( |
9e48ebd5400c
[view] use the new magic js object to generate javascript func call for auto reload user callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6038
diff
changeset
|
516 |
cbname, self.__regid__, rql, msg, self.__registry__, self.domid) |
1433 | 517 |
|
4062
d16b2927afe6
oops, bad indent
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4060
diff
changeset
|
518 |
def build_reload_js_call(self, cbname, msg): |
6044
9e48ebd5400c
[view] use the new magic js object to generate javascript func call for auto reload user callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6038
diff
changeset
|
519 |
return "javascript: %s" % js.userCallbackThenReloadPage(cbname, msg) |
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
520 |
|
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
521 |
build_js = build_update_js_call # expect updatable component by default |
1433 | 522 |
|
6140
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
523 |
@property |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
524 |
def domid(self): |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
525 |
return domid(self.__regid__) |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
526 |
|
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
527 |
@deprecated('[3.10] use .domid property') |
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
528 |
def div_id(self): |
6140
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
529 |
return self.domid |
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
530 |
|
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
531 |
|
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
532 |
class Component(ReloadableMixIn, View): |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
533 |
"""base class for components""" |
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
534 |
__registry__ = 'components' |
707 | 535 |
__select__ = yes() |
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
536 |
|
6140
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
537 |
# XXX huummm, much probably useless (should be...) |
3010
684a0c546774
[ui props] drop htmlclass as a persistent property, this is definitly useless/unusable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2656
diff
changeset
|
538 |
htmlclass = 'mainRelated' |
6140
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
539 |
@property |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
540 |
def cssclass(self): |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
541 |
return '%s %s' % (self.htmlclass, domid(self.__regid__)) |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
542 |
|
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
543 |
# XXX should rely on ReloadableMixIn.domid |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
544 |
@property |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
545 |
def domid(self): |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
546 |
return '%sComponent' % domid(self.__regid__) |
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
547 |
|
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
548 |
@deprecated('[3.10] use .cssclass property') |
661
4f61eb8a96b7
properly kill/depreciate component base class, only keep Component
sylvain.thenault@logilab.fr
parents:
660
diff
changeset
|
549 |
def div_class(self): |
6140
65a619eb31c4
[boxes] introduce new boxes system
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6047
diff
changeset
|
550 |
return self.cssclass |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
551 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
552 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
553 |
class Adapter(AppObject): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
554 |
"""base class for adapters""" |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
555 |
__registry__ = 'adapters' |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
556 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
557 |
|
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
558 |
def implements_adapter_compat(iface): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
559 |
def _pre39_compat(func): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
560 |
def decorated(self, *args, **kwargs): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
561 |
entity = self.entity |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
562 |
if hasattr(entity, func.__name__): |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
563 |
warn('[3.9] %s method is deprecated, define it on a custom ' |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
564 |
'%s for %s instead' % (func.__name__, iface, |
5725
b5d595b66c35
[adapters] enhanced warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5715
diff
changeset
|
565 |
classid(entity.__class__)), |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
566 |
DeprecationWarning) |
5571
5d024bf9424b
[adapters compat] make implements_adapter_compat selector compatible with attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
567 |
member = getattr(entity, func.__name__) |
5d024bf9424b
[adapters compat] make implements_adapter_compat selector compatible with attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
568 |
if callable(member): |
5d024bf9424b
[adapters compat] make implements_adapter_compat selector compatible with attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
569 |
return member(*args, **kwargs) |
5d024bf9424b
[adapters compat] make implements_adapter_compat selector compatible with attributes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5556
diff
changeset
|
570 |
return member |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
571 |
return func(self, *args, **kwargs) |
6864
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
572 |
decorated.decorated = func |
5556
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
573 |
return decorated |
9ab2b4c74baf
[entity] introduce a new 'adapters' registry
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
5533
diff
changeset
|
574 |
return _pre39_compat |
6864
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
575 |
|
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
576 |
|
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
577 |
def unwrap_adapter_compat(cls): |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
578 |
parent = cls.__bases__[0] |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
579 |
for member_name in dir(parent): |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
580 |
member = getattr(parent, member_name) |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
581 |
if isinstance(member, types.MethodType) and hasattr(member.im_func, 'decorated') and not member_name in cls.__dict__: |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
582 |
method = new.instancemethod(member.im_func.decorated, None, cls) |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
583 |
setattr(cls, member_name, method) |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
584 |
|
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
585 |
|
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
586 |
class auto_unwrap_bw_compat(type): |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
587 |
def __new__(mcs, name, bases, classdict): |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
588 |
cls = type.__new__(mcs, name, bases, classdict) |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
589 |
if not classdict.get('__needs_bw_compat__'): |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
590 |
unwrap_adapter_compat(cls) |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
591 |
return cls |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
592 |
|
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
593 |
|
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
594 |
class EntityAdapter(Adapter): |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
595 |
"""base class for entity adapters (eg adapt an entity to an interface)""" |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
596 |
__metaclass__ = auto_unwrap_bw_compat |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
597 |
def __init__(self, _cw, **kwargs): |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
598 |
try: |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
599 |
self.entity = kwargs.pop('entity') |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
600 |
except KeyError: |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
601 |
self.entity = kwargs['rset'].get_entity(kwargs.get('row') or 0, |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
602 |
kwargs.get('col') or 0) |
ea95004494a2
[adapters] fix #1424467 caused by precedence of bw compat method while the adapter is concret for a given class
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6769
diff
changeset
|
603 |
Adapter.__init__(self, _cw, **kwargs) |