fix imports, cleanup, repair some ajax calls tls-sprint
authorsylvain.thenault@logilab.fr
Tue, 28 Apr 2009 11:22:31 +0200
branchtls-sprint
changeset 1498 2c6eec0b46b9
parent 1493 8270580b65a0
child 1499 fd8751c3f3ee
fix imports, cleanup, repair some ajax calls
__init__.py
entities/__init__.py
entity.py
schema.py
view.py
web/data/cubicweb.ajax.js
web/uicfg.py
web/views/actions.py
web/views/autoform.py
web/views/baseforms.py
web/views/baseviews.py
web/views/bookmark.py
web/views/editforms.py
web/views/emailaddress.py
web/views/eproperties.py
web/views/idownloadable.py
web/views/schema.py
web/views/startup.py
web/views/tabs.py
--- a/__init__.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/__init__.py	Tue Apr 28 11:22:31 2009 +0200
@@ -74,7 +74,7 @@
             encoding = 'utf-8'
         self.encoding = encoding
         # cache result of execution for (rql expr / eids),
-        # should be emptied on commit/rollback of the server session / web 
+        # should be emptied on commit/rollback of the server session / web
         # connection
         self.local_perm_cache = {}
 
@@ -82,7 +82,7 @@
         if self.user:
             return self.user.property_value(key)
         return self.vreg.property_value(key)
-    
+
     def etype_rset(self, etype, size=1):
         """return a fake result set for a particular entity type"""
         from cubicweb.rset import ResultSet
@@ -114,7 +114,7 @@
             return None
 
     # url generation methods ##################################################
-    
+
     def build_url(self, method, base_url=None, **kwargs):
         """return an absolute URL using params dictionary key/values as URL
         parameters. Values are automatically URL quoted, and the
@@ -130,7 +130,7 @@
         if not kwargs:
             return u'%s%s' % (base_url, path)
         return u'%s%s?%s' % (base_url, path, self.build_url_params(**kwargs))
-        
+
 
     def build_url_params(self, **kwargs):
         """return encoded params to incorporate them in an URL"""
@@ -154,7 +154,7 @@
 
     def url_unquote(self, quoted):
         """returns a unicode unquoted string
-        
+
         decoding is based on `self.encoding` which is the encoding
         used in `url_quote`
         """
@@ -164,10 +164,10 @@
             return unicode(urlunquote(quoted), self.encoding)
         except UnicodeDecodeError: # might occurs on manually typed URLs
             return unicode(urlunquote(quoted), 'iso-8859-1')
-    
+
 
     # session's user related methods #####################################
-    
+
     @cached
     def user_data(self):
         """returns a dictionnary with this user's information"""
@@ -197,21 +197,21 @@
         return False
 
     # abstract methods to override according to the web front-end #############
-    
+
     def base_url(self):
         """return the root url of the application"""
         raise NotImplementedError
-    
+
     def decorate_rset(self, rset):
         """add vreg/req (at least) attributes to the given result set """
         raise NotImplementedError
-    
+
     def describe(self, eid):
         """return a tuple (type, sourceuri, extid) for the entity with id <eid>"""
         raise NotImplementedError
-        
+
 
-# XXX 2.45 is allowing nicer entity type names, use this map for bw compat    
+# XXX 2.45 is allowing nicer entity type names, use this map for bw compat
 ETYPE_NAME_MAP = {# 3.2 migration
                   'ECache': 'CWCache',
                   'EUser': 'CWUser',
@@ -268,7 +268,7 @@
                     'ezone': 'zone',
                     'i18ncontent': 'i18ncontent',
                     'svnfile': 'vcsfile',
-                    
+
                     'eclassschemes': 'keyword',
                     'eclassfolders': 'folder',
                     'eclasstags': 'tag',
@@ -300,4 +300,4 @@
         return obj.target
     except AttributeError:
         return neg_role(obj.role)
-        
+
--- a/entities/__init__.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/entities/__init__.py	Tue Apr 28 11:22:31 2009 +0200
@@ -261,12 +261,12 @@
 
     @obsolete('use AutomaticEntityForm.[e]relations_by_category')
     def relations_by_category(self, categories=None, permission=None):
-        from cubicweb.web.views.editforms import AutomaticEntityForm
+        from cubicweb.web.views.autoform import AutomaticEntityForm
         return AutomaticEntityForm.erelations_by_category(self, categories, permission)
 
     @obsolete('use AutomaticEntityForm.[e]srelations_by_category')
     def srelations_by_category(self, categories=None, permission=None):
-        from cubicweb.web.views.editforms import AutomaticEntityForm
+        from cubicweb.web.views.autoform import AutomaticEntityForm
         return AutomaticEntityForm.esrelations_by_category(self, categories, permission)
 
     def _default_format(self):
--- a/entity.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/entity.py	Tue Apr 28 11:22:31 2009 +0200
@@ -41,30 +41,26 @@
     return '1'
 
 
-MODE_TAGS = set(('link', 'create'))
-CATEGORY_TAGS = set(('primary', 'secondary', 'generic', 'generated')) # , 'metadata'))
+_MODE_TAGS = set(('link', 'create'))
+_CATEGORY_TAGS = set(('primary', 'secondary', 'generic', 'generated')) # , 'metadata'))
 
 try:
-    from cubicweb.web import formwidgets
+    from cubicweb.web import formwidgets, uicfg
     from cubicweb.web.views.editforms import AutomaticEntityForm
-    from cubicweb.web.views.boxes import EditBox
 
-    def dispatch_rtags(tags, rtype, role, stype, otype):
+    def _dispatch_rtags(tags, rtype, role, stype, otype):
         for tag in tags:
-            if tag in MODE_TAGS:
-                EditBox.rmode.set_rtag(tag, rtype, role, stype, otype)
-            elif tag in CATEGORY_TAGS:
-                AutomaticEntityForm.rcategories.set_rtag(tag, rtype, role, stype, otype)
+            if tag in _MODE_TAGS:
+                uicfg.rmode.set_rtag(tag, rtype, role, stype, otype)
+            elif tag in _CATEGORY_TAGS:
+                uicfg.rcategories.set_rtag(tag, rtype, role, stype, otype)
             elif tag == 'inlineview':
-                AutomaticEntityForm.rinlined.set_rtag(True, rtype, role, stype, otype)
+                uicfg.rinlined.set_rtag(True, rtype, role, stype, otype)
             else:
                 raise ValueError(tag)
 
 except ImportError:
-    AutomaticEntityForm = None
-
-    def dispatch_rtags(*args):
-        pass
+    _dispatch_rtags = None
 
 def _get_etype(bases, classdict):
     try:
@@ -87,14 +83,14 @@
             except AttributeError:
                 continue
 
-class metaentity(type):
+class _metaentity(type):
     """this metaclass sets the relation tags on the entity class
     and deals with the `widgets` attribute
     """
     def __new__(mcs, name, bases, classdict):
         # collect baseclass' rtags
         etype = _get_etype(bases, classdict)
-        if etype and AutomaticEntityForm is not None:
+        if etype and _dispatch_rtags is not None:
             for name, rtags in _get_defs('__rtags__', name, bases, classdict):
                 warn('%s: __rtags__ is deprecated' % name, DeprecationWarning)
                 for relation, tags in rtags.iteritems():
@@ -103,23 +99,23 @@
                         tags = (tags,)
                     # relation must become a 3-uple (rtype, targettype, role)
                     if isinstance(relation, basestring):
-                        dispatch_rtags(tags, relation, 'subject', etype, '*')
-                        dispatch_rtags(tags, relation, 'object', '*', etype)
+                        _dispatch_rtags(tags, relation, 'subject', etype, '*')
+                        _dispatch_rtags(tags, relation, 'object', '*', etype)
                     elif len(relation) == 1: # useful ?
-                        dispatch_rtags(tags, relation[0], 'subject', etype, '*')
-                        dispatch_rtags(tags, relation[0], 'object', '*', etype)
+                        _dispatch_rtags(tags, relation[0], 'subject', etype, '*')
+                        _dispatch_rtags(tags, relation[0], 'object', '*', etype)
                     elif len(relation) == 2:
                         rtype, ttype = relation
                         ttype = bw_normalize_etype(ttype) # XXX bw compat
-                        dispatch_rtags(tags, rtype, 'subject', etype, ttype)
-                        dispatch_rtags(tags, rtype, 'object', ttype, etype)
+                        _dispatch_rtags(tags, rtype, 'subject', etype, ttype)
+                        _dispatch_rtags(tags, rtype, 'object', ttype, etype)
                     elif len(relation) == 3:
                         rtype, ttype, role = relation
                         ttype = bw_normalize_etype(ttype)
                         if role == 'subject':
-                            dispatch_rtags(tags, rtype, 'subject', etype, ttype)
+                            _dispatch_rtags(tags, rtype, 'subject', etype, ttype)
                         else:
-                            dispatch_rtags(tags, rtype, 'object', ttype, etype)
+                            _dispatch_rtags(tags, rtype, 'object', ttype, etype)
                     else:
                         raise ValueError('bad rtag definition (%r)' % (relation,))
             for name, widgets in _get_defs('widgets', name, bases, classdict):
@@ -132,7 +128,7 @@
                         wdgname = 'TextInput'
                     widget = getattr(formwidgets, wdgname)
                     AutomaticEntityForm.rwidgets.set_rtag(wdgname, rtype, 'subject', etype)
-        return super(metaentity, mcs).__new__(mcs, name, bases, classdict)
+        return super(_metaentity, mcs).__new__(mcs, name, bases, classdict)
 
 
 class Entity(AppRsetObject, dict):
@@ -158,7 +154,7 @@
                          as composite relations or relations that have '?1' as object
                          cardinality
     """
-    __metaclass__ = metaentity
+    __metaclass__ = _metaentity
     __registry__ = 'etypes'
     __select__ = yes()
 
--- a/schema.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/schema.py	Tue Apr 28 11:22:31 2009 +0200
@@ -77,7 +77,7 @@
 ## cubicweb provides a RichString class for convenience
 class RichString(ybo.String):
     """Convenience RichString attribute type
-    The follwing declaration::
+    The following declaration::
 
       class Card(EntityType):
           content = RichString(fulltextindexed=True, default_format='text/rest')
--- a/view.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/view.py	Tue Apr 28 11:22:31 2009 +0200
@@ -51,6 +51,7 @@
  cubicweb:variables         CDATA   #IMPLIED
  cubicweb:displayactions    CDATA   #IMPLIED
  cubicweb:fallbackvid       CDATA   #IMPLIED
+ cubicweb:fname             CDATA   #IMPLIED
  cubicweb:vid               CDATA   #IMPLIED
  cubicweb:rql               CDATA   #IMPLIED
  cubicweb:actualrql         CDATA   #IMPLIED
--- a/web/data/cubicweb.ajax.js	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/data/cubicweb.ajax.js	Tue Apr 28 11:22:31 2009 +0200
@@ -282,6 +282,7 @@
     var props = {};
     if (node) {
 	props['rql'] = rql;
+	props['fname'] = 'view';
 	props['pageid'] = pageid;
 	if (vid) { props['vid'] = vid; }
 	if (extraparams) { jQuery.extend(props, extraparams); }
--- a/web/uicfg.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/uicfg.py	Tue Apr 28 11:22:31 2009 +0200
@@ -11,7 +11,7 @@
 __docformat__ = "restructuredtext en"
 from cubicweb.rtags import RelationTags
 
-# editforms.AutomaticEntityForm configuration #################################
+# autoform.AutomaticEntityForm configuration ##################################
 
 # relations'category (eg primary/secondary/generic/metadata/generated)
 rcategories = RelationTags()
--- a/web/views/actions.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/actions.py	Tue Apr 28 11:22:31 2009 +0200
@@ -15,7 +15,7 @@
     )
 from cubicweb.web.action import Action
 from cubicweb.web.views import linksearch_select_url, vid_from_rset
-from cubicweb.web.views.editforms import AutomaticEntityForm
+from cubicweb.web.views.autoform import AutomaticEntityForm
 
 _ = unicode
 
--- a/web/views/autoform.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/autoform.py	Tue Apr 28 11:22:31 2009 +0200
@@ -11,6 +11,7 @@
 from cubicweb import typed_eid
 from cubicweb.web import stdmsgs, uicfg
 from cubicweb.web.form import FieldNotFound, EntityFieldsForm
+from cubicweb.web.formfields import guess_field
 from cubicweb.web.formwidgets import Button, SubmitButton
 _ = unicode
 
--- a/web/views/baseforms.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/baseforms.py	Tue Apr 28 11:22:31 2009 +0200
@@ -21,7 +21,7 @@
 from cubicweb.web.controller import NAV_FORM_PARAMETERS
 from cubicweb.web.widgets import checkbox, InputWidget, ComboBoxWidget
 from cubicweb.web.form import FormMixIn
-from cubicweb.web.views.editforms import AutomaticEntityForm
+from cubicweb.web.views.autoform import AutomaticEntityForm
 
 _ = unicode
     
--- a/web/views/baseviews.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/baseviews.py	Tue Apr 28 11:22:31 2009 +0200
@@ -373,6 +373,7 @@
 
 from cubicweb.web.views import boxes, xmlrss, primary
 PrimaryView = class_moved(primary.PrimaryView)
+PRIMARY_SKIP_RELS = primary.PRIMARY_SKIP_RELS
 SideBoxView = class_moved(boxes.SideBoxView)
 XmlView = class_moved(xmlrss.XmlView)
 XmlItemView = class_moved(xmlrss.XmlItemView)
--- a/web/views/bookmark.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/bookmark.py	Tue Apr 28 11:22:31 2009 +0200
@@ -11,13 +11,11 @@
 from cubicweb import Unauthorized
 from cubicweb.selectors import implements
 from cubicweb.web.htmlwidgets import BoxWidget, BoxMenu, RawBoxItem
-from cubicweb.web import action, formwidgets
-from cubicweb.web.box import UserRQLBoxTemplate
+from cubicweb.web import uicfg, action, box, formwidgets
 from cubicweb.web.views.baseviews import PrimaryView
-from cubicweb.web.views.editforms import AutomaticEntityForm
 
-AutomaticEntityForm.rcategories.set_rtag('primary', 'path', 'subject', 'Bookmark')
-AutomaticEntityForm.rwidgets.set_rtag(formwidgets.TextInput, 'path', 'subject', 'Bookmark')
+uicfg.rcategories.set_rtag('primary', 'path', 'subject', 'Bookmark')
+uicfg.rwidgets.set_rtag(formwidgets.TextInput, 'path', 'subject', 'Bookmark')
 
 
 class FollowAction(action.Action):
@@ -26,14 +24,14 @@
 
     title = _('follow')
     category = 'mainactions'
-    
+
     def url(self):
         return self.rset.get_entity(self.row or 0, self.col or 0).actual_url()
 
 
 class BookmarkPrimaryView(PrimaryView):
     __select__ = implements('Bookmark')
-        
+
     def cell_call(self, row, col):
         """the primary view for bookmark entity"""
         entity = self.complete_entity(row, col)
@@ -49,7 +47,7 @@
         self.w(u'</div>')
 
 
-class BookmarksBox(UserRQLBoxTemplate):
+class BookmarksBox(box.UserRQLBoxTemplate):
     """display a box containing all user's bookmarks"""
     id = 'bookmarks_box'
     order = 40
@@ -59,8 +57,8 @@
            'U eid %(x)s')
     etype = 'Bookmark'
     rtype = 'bookmarked_by'
-    
-    
+
+
     def call(self, **kwargs):
         req = self.req
         ueid = req.user.eid
--- a/web/views/editforms.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/editforms.py	Tue Apr 28 11:22:31 2009 +0200
@@ -20,7 +20,6 @@
 from cubicweb.common import tags
 from cubicweb.web import stdmsgs
 from cubicweb.web.form import CompositeForm, EntityFieldsForm, FormViewMixIn
-from cubicweb.web.formfields import guess_field
 from cubicweb.web.formwidgets import Button, SubmitButton, ResetButton
 from cubicweb.web.formrenderers import (FormRenderer, EntityFormRenderer,
                                         EntityCompositeFormRenderer,
--- a/web/views/emailaddress.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/emailaddress.py	Tue Apr 28 11:22:31 2009 +0200
@@ -11,16 +11,15 @@
 from cubicweb.selectors import implements
 from cubicweb.common import Unauthorized
 from cubicweb.web.views import baseviews
-from cubicweb.web.views.editforms import AutomaticEntityForm
 
 
 class EmailAddressPrimaryView(baseviews.PrimaryView):
     __select__ = implements('EmailAddress')
-    
+
     def cell_call(self, row, col, skipeids=None):
         self.skipeids = skipeids
         super(EmailAddressPrimaryView, self).cell_call(row, col)
-        
+
     def render_entity_attributes(self, entity, siderelations):
         self.w(u'<h3>')
         entity.view('oneline', w=self.w)
@@ -70,10 +69,10 @@
         entity.view('oneline', w=self.w)
         self.w(u'</h5>')
 
-    
+
 class EmailAddressOneLineView(baseviews.OneLineView):
     __select__ = implements('EmailAddress')
-    
+
     def cell_call(self, row, col, **kwargs):
         entity = self.entity(row, col)
         if entity.reverse_primary_email:
@@ -93,7 +92,7 @@
 
     id = 'mailto'
     __select__ = implements('EmailAddress')
-    
+
     def cell_call(self, row, col, **kwargs):
         entity = self.entity(row, col)
         if entity.reverse_primary_email:
@@ -108,15 +107,15 @@
             mailto = "mailto:%s" % entity.display_address()
         self.w(u'<a href="%s">%s</a>' % (html_escape(mailto),
                                          html_escape(entity.display_address())))
-            
+
         if entity.alias:
             self.w(u'&gt;\n')
         if entity.reverse_primary_email:
             self.w(u'</b>')
 
-    
+
 class EmailAddressTextView(baseviews.TextView):
     __select__ = implements('EmailAddress')
-    
+
     def cell_call(self, row, col, **kwargs):
         self.w(self.entity(row, col).display_address())
--- a/web/views/eproperties.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/eproperties.py	Tue Apr 28 11:22:31 2009 +0200
@@ -21,7 +21,6 @@
 from cubicweb.web.form import CompositeForm, EntityFieldsForm, FormViewMixIn
 from cubicweb.web.formfields import FIELDS, StringField
 from cubicweb.web.formwidgets import Select, Button, SubmitButton
-from cubicweb.web.views.editforms import AutomaticEntityForm
 
 _ = unicode
 
--- a/web/views/idownloadable.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/idownloadable.py	Tue Apr 28 11:22:31 2009 +0200
@@ -43,9 +43,10 @@
     id = 'download_box'
     # no download box for images
     # XXX primary_view selector ?
-    __select__ = (one_line_rset() & implements(IDownloadable) & match_context_prop() & ~score_entity(is_image))
+    __select__ = (one_line_rset() & implements(IDownloadable) &
+                  match_context_prop() & ~score_entity(is_image))
     order = 10
-    
+
     def cell_call(self, row, col, title=None, label=None, **kwargs):
         entity = self.entity(row, col)
         download_box(self.w, entity, title, label)
@@ -86,14 +87,14 @@
     __select__ = implements(IDownloadable)
     title = None # should not be listed in possible views
 
-    
+
     def cell_call(self, row, col, title=None, **kwargs):
         entity = self.entity(row, col)
         url = html_escape(entity.download_url())
         self.w(u'<a href="%s">%s</a>' % (url, html_escape(title or entity.dc_title())))
 
 
-                                                                                
+
 class IDownloadablePrimaryView(baseviews.PrimaryView):
     __select__ = implements(IDownloadable)
     # XXX File/Image attributes but this is not specified in the IDownloadable interface
@@ -103,7 +104,7 @@
         self.w(u'<h1>%s %s</h1>'
                % (entity.dc_type().capitalize(),
                   html_escape(entity.dc_title())))
-    
+
     def render_entity_attributes(self, entity, siderelations):
         super(IDownloadablePrimaryView, self).render_entity_attributes(entity, siderelations)
         self.w(u'<div class="content">')
@@ -121,7 +122,7 @@
                 msg = self.req._("can't display data, unexpected error: %s") % ex
                 self.w('<div class="error">%s</div>' % msg)
         self.w(u'</div>')
-            
+
     def is_side_related(self, rschema, eschema):
         """display all relations as side related"""
         return True
@@ -143,16 +144,16 @@
 class ImageView(baseviews.EntityView):
     id = 'image'
     __select__ = implements(IDownloadable) & score_entity(is_image)
-    
+
     title = _('image')
-    
+
     def call(self):
         rset = self.rset
         for i in xrange(len(rset)):
             self.w(u'<div class="efile">')
             self.wview(self.id, rset, row=i, col=0)
             self.w(u'</div>')
-    
+
     def cell_call(self, row, col):
         entity = self.entity(row, col)
         #if entity.data_format.startswith('image/'):
--- a/web/views/schema.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/schema.py	Tue Apr 28 11:22:31 2009 +0200
@@ -15,49 +15,46 @@
 from cubicweb.schemaviewer import SchemaViewer
 from cubicweb.view import EntityView, StartupView
 from cubicweb.common.uilib import ureport_as_html
-from cubicweb.web.action import Action
-from cubicweb.web.views import baseviews
-from cubicweb.web.views import TmpFileViewMixin
-from cubicweb.web.views.editforms import AutomaticEntityForm
-from cubicweb.web.views.boxes import EditBox
+from cubicweb.web import uicfg, action
+from cubicweb.web.views import TmpFileViewMixin, baseviews
 
 
-AutomaticEntityForm.rcategories.set_rtag('primary', 'require_group', 'subject', 'CWPermission')
-AutomaticEntityForm.rcategories.set_rtag('generated', 'final', 'subject', 'EEtype')
-AutomaticEntityForm.rcategories.set_rtag('generated', 'final', 'subject', 'ERtype')
-AutomaticEntityForm.rinlined.set_rtag(True, 'relation_type', 'subject', 'CWRelation')
-AutomaticEntityForm.rinlined.set_rtag(True, 'from_entity', 'subject', 'CWRelation')
-AutomaticEntityForm.rinlined.set_rtag(True, 'to_entity', 'subject', 'CWRelation')
-AutomaticEntityForm.rwidgets.set_rtag('StringWidget', 'expression', 'subject', 'RQLExpression')
+uicfg.rcategories.set_rtag('primary', 'require_group', 'subject', 'CWPermission')
+uicfg.rcategories.set_rtag('generated', 'final', 'subject', 'EEtype')
+uicfg.rcategories.set_rtag('generated', 'final', 'subject', 'ERtype')
+uicfg.rinlined.set_rtag(True, 'relation_type', 'subject', 'CWRelation')
+uicfg.rinlined.set_rtag(True, 'from_entity', 'subject', 'CWRelation')
+uicfg.rinlined.set_rtag(True, 'to_entity', 'subject', 'CWRelation')
+uicfg.rwidgets.set_rtag('StringWidget', 'expression', 'subject', 'RQLExpression')
 
-EditBox.rmode.set_rtag('create', 'state_of', 'object', 'CWEType')
-EditBox.rmode.set_rtag('create', 'transition_of', 'object', 'CWEType')
-EditBox.rmode.set_rtag('create', 'relation_type', 'object', 'CWRType')
-EditBox.rmode.set_rtag('link', 'from_entity', 'object', 'CWEType')
-EditBox.rmode.set_rtag('link', 'to_entity', 'object', 'CWEType')
+uicfg.rmode.set_rtag('create', 'state_of', 'object', 'CWEType')
+uicfg.rmode.set_rtag('create', 'transition_of', 'object', 'CWEType')
+uicfg.rmode.set_rtag('create', 'relation_type', 'object', 'CWRType')
+uicfg.rmode.set_rtag('link', 'from_entity', 'object', 'CWEType')
+uicfg.rmode.set_rtag('link', 'to_entity', 'object', 'CWEType')
 
 
-class ViewSchemaAction(Action):
+class ViewSchemaAction(action.Action):
     id = 'schema'
     __select__ = yes()
-    
+
     title = _("site schema")
     category = 'siteactions'
     order = 30
-    
+
     def url(self):
         return self.build_url(self.id)
-    
-        
+
+
 # schema entity types views ###################################################
 
 class _SchemaEntityPrimaryView(baseviews.PrimaryView):
     show_attr_label = False
-    cache_max_age = 60*60*2 # stay in http cache for 2 hours by default 
-    
+    cache_max_age = 60*60*2 # stay in http cache for 2 hours by default
+
     def content_title(self, entity):
         return html_escape(entity.dc_long_title())
-    
+
 class CWETypePrimaryView(_SchemaEntityPrimaryView):
     __select__ = implements('CWEType')
     skip_attrs = _SchemaEntityPrimaryView.skip_attrs + ('name', 'meta', 'final')
@@ -73,7 +70,7 @@
 
 class CWETypeOneLineView(baseviews.OneLineView):
     __select__ = implements('CWEType')
-    
+
     def cell_call(self, row, col, **kwargs):
         entity = self.entity(row, col)
         final = entity.final
@@ -92,7 +89,7 @@
     main_related_section = False
     skip_rels = ('is', 'is_instance_of', 'identity', 'created_by', 'owned_by',
                  'has_text',)
-    
+
     def render_entity_attributes(self, entity, siderelations):
         super(CWETypeSchemaView, self).render_entity_attributes(entity, siderelations)
         eschema = self.vreg.schema.eschema(entity.name)
@@ -120,7 +117,7 @@
             self.w(u'<img src="%s" alt="%s"/>' % (
                 html_escape(entity.absolute_url(vid='eschemagraph')),
                 html_escape(self.req._('graphical schema for %s') % entity.name)))
-        
+
 
 # schema images ###############################################################
 
@@ -143,11 +140,11 @@
         self.nextcolor = cycle( ('#aa0000', '#00aa00', '#0000aa',
                                  '#000000', '#888888') ).next
         self.req = req
-        
+
     def display_attr(self, rschema):
         return not rschema.meta and (rschema.has_local_role('read')
                                      or rschema.has_perm(self.req, 'read'))
-    
+
     # XXX remove this method once yams > 0.20 is out
     def node_properties(self, eschema):
         """return default DOT drawing options for an entity schema"""
@@ -168,7 +165,7 @@
         # + 1 line going to the closest edge spline point)
         kwargs['decorate'] = 'false'
         return kwargs
-    
+
 
 class RestrictedSchemaVisitorMiIn:
     def __init__(self, req, *args, **kwargs):
@@ -177,12 +174,12 @@
         self.__parent = self.__class__.__bases__[1]
         self.__parent.__init__(self, *args, **kwargs)
         self.req = req
-        
+
     def nodes(self):
         for etype, eschema in self.__parent.nodes(self):
             if eschema.has_local_role('read') or eschema.has_perm(self.req, 'read'):
                 yield eschema.type, eschema
-            
+
     def edges(self):
         for setype, oetype, rschema in self.__parent.edges(self):
             if rschema.has_local_role('read') or rschema.has_perm(self.req, 'read'):
@@ -215,7 +212,7 @@
     content_type = 'image/png'
     __select__ = implements('CWEType')
     skip_rels = ('owned_by', 'created_by', 'identity', 'is', 'is_instance_of')
-    
+
     def _generate(self, tmpfile):
         """display schema information for an entity"""
         entity = self.entity(self.row, self.col)
@@ -226,7 +223,7 @@
 
 class CWRTypeSchemaImageView(CWETypeSchemaImageView):
     __select__ = implements('CWRType')
-    
+
     def _generate(self, tmpfile):
         """display schema information for an entity"""
         entity = self.entity(self.row, self.col)
--- a/web/views/startup.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/startup.py	Tue Apr 28 11:22:31 2009 +0200
@@ -19,12 +19,12 @@
 
 class ManageView(StartupView):
     id = 'manage'
-    title = _('manage')    
+    title = _('manage')
     http_cache_manager = EtagHTTPCacheManager
 
     def display_folders(self):
         return False
-    
+
     def call(self, **kwargs):
         """The default view representing the application's management"""
         self.req.add_css('cubicweb.manageview.css')
@@ -35,7 +35,7 @@
             self.w(u'<table><tr>\n')
             self.w(u'<td style="width:40%">')
             self._main_index()
-            self.w(u'</td><td style="width:60%">')            
+            self.w(u'</td><td style="width:60%">')
             self.folders()
             self.w(u'</td>')
             self.w(u'</tr></table>\n')
@@ -63,22 +63,22 @@
                 href = req.build_url('view', vid='creation', etype='Card', wikiid='index')
                 label = self.req._('create an index page')
             self.w(u'<br/><a href="%s">%s</a>\n' % (html_escape(href), label))
-        
+
     def folders(self):
         self.w(u'<h4>%s</h4>\n' % self.req._('Browse by category'))
         self.vreg.select_view('tree', self.req, None).dispatch(w=self.w)
-        
+
     def startup_views(self):
         self.w(u'<h4>%s</h4>\n' % self.req._('Startup views'))
         self.startupviews_table()
-        
+
     def startupviews_table(self):
         for v in self.vreg.possible_views(self.req, None):
             if v.category != 'startupview' or v.id in ('index', 'tree', 'manage'):
                 continue
             self.w('<p><a href="%s">%s</a></p>' % (
                 html_escape(v.url()), html_escape(self.req._(v.title).capitalize())))
-        
+
     def entities(self):
         schema = self.schema
         self.w(u'<h4>%s</h4>\n' % self.req._('The repository holds the following entities'))
@@ -88,7 +88,7 @@
             self.w(u'<tr><th colspan="4">%s</th></tr>\n' % self.req._('application entities'))
         self.entity_types_table(eschema for eschema in schema.entities()
                                 if not eschema.meta and not eschema.is_subobject(strict=True))
-        if manager: 
+        if manager:
             self.w(u'<tr><th colspan="4">%s</th></tr>\n' % self.req._('system entities'))
             self.entity_types_table(eschema for eschema in schema.entities()
                                     if eschema.meta and not eschema.schema_entity())
@@ -97,7 +97,7 @@
                 self.entity_types_table(schema.eschema(etype)
                                         for etype in schema.schema_entity_types())
         self.w(u'</table>')
-        
+
     def entity_types_table(self, eschemas):
         newline = 0
         infos = sorted(self.entity_types(eschemas),
@@ -111,8 +111,8 @@
             self.w(u'<td class="addcol">%s</td><td>%s</td>\n' % (addlink,  etypelink))
             self.w(u'<td class="addcol">%s</td><td>%s</td>\n' % (addlink2, etypelink2))
             self.w(u'</tr>\n')
-        
-        
+
+
     def entity_types(self, eschemas):
         """return a list of formatted links to get a list of entities of
         a each entity's types
@@ -133,7 +133,7 @@
             etypelink = u'&nbsp;<a href="%s">%s</a> (%d)' % (
                 html_escape(url), label, nb)
             yield (label, etypelink, self.add_entity_link(eschema, req))
-    
+
     def add_entity_link(self, eschema, req):
         """creates a [+] link for adding an entity if user has permission to do so"""
         if not eschema.has_perm(req, 'add'):
@@ -142,14 +142,14 @@
             html_escape(self.create_url(eschema.type)),
             self.req.__('add a %s' % eschema))
 
-    
+
 class IndexView(ManageView):
     id = 'index'
     title = _('index')
-    
+
     def display_folders(self):
         return 'Folder' in self.schema and self.req.execute('Any COUNT(X) WHERE X is Folder')[0][0]
-    
+
 
 
 class SchemaView(StartupView):
--- a/web/views/tabs.py	Tue Apr 28 10:11:08 2009 +0200
+++ b/web/views/tabs.py	Tue Apr 28 11:22:31 2009 +0200
@@ -38,7 +38,7 @@
             'lazyview wants at least : rql, or an eid, or an rset -- or call it with static=True'
         w = w or self.w
         self.req.add_js('cubicweb.lazy.js')
-        urlparams = {'vid' : vid, 'mode' : 'html'}
+        urlparams = {'vid' : vid, 'fname' : 'view'}
         if rql:
             urlparams['rql'] = rql
         elif eid: