merge
authorAdrien Di Mascio <Adrien.DiMascio@logilab.fr>
Wed, 23 Sep 2009 09:54:25 +0200
changeset 3396 fb261afd49cd
parent 3395 405f393bcac0 (current diff)
parent 3383 c6aff16e5aed (diff)
child 3397 a35c6ae5bef2
merge
appobject.py
selectors.py
server/hook.py
web/views/editcontroller.py
web/views/editforms.py
web/views/formrenderers.py
web/views/forms.py
--- a/appobject.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/appobject.py	Wed Sep 23 09:54:25 2009 +0200
@@ -209,7 +209,7 @@
     :__registry__:
       name of the registry for this object (string like 'views',
       'templates'...)
-    :__id__:
+    :__regid__:
       object's identifier in the registry (string like 'main',
       'primary', 'folder_box')
     :__select__:
@@ -240,7 +240,7 @@
       are interested in, else None
     """
     __registry__ = None
-    __id__ = None
+    __regid__ = None
     __select__ = yes()
 
     @classmethod
--- a/common/mail.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/common/mail.py	Wed Sep 23 09:54:25 2009 +0200
@@ -210,7 +210,13 @@
         """return a list of either 2-uple (email, language) or user entity to
         who this email should be sent
         """
-        finder = self.vreg['components'].select('recipients_finder', self.req,
+        # use super_session when available, we don't want to consider security
+        # when selecting recipients_finder
+        try:
+            req = self.req.super_session
+        except AttributeError:
+            req = self.req
+        finder = self.vreg['components'].select('recipients_finder', req,
                                                 rset=self.rset,
                                                 row=self.row or 0,
                                                 col=self.col or 0)
--- a/cwvreg.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/cwvreg.py	Wed Sep 23 09:54:25 2009 +0200
@@ -161,11 +161,11 @@
             objects = self['Any']
             assert len(objects) == 1, objects
             cls = objects[0]
-        # make a copy event if cls.__id__ == etype, else we may have pb for
+        # make a copy event if cls.__regid__ == etype, else we may have pb for
         # client application using multiple connections to different
         # repositories (eg shingouz)
         cls = dump_class(cls, etype)
-        cls.__id__ = etype
+        cls.__regid__ = etype
         cls.__initialize__(self.schema)
         return cls
 
--- a/entities/__init__.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/entities/__init__.py	Wed Sep 23 09:54:25 2009 +0200
@@ -22,7 +22,7 @@
     """an entity instance has e_schema automagically set on the class and
     instances have access to their issuing cursor
     """
-    id = 'Any'
+    __regid__ = 'Any'
     __implements__ = (IBreadCrumbs, IFeed)
 
     fetch_attrs = ('modification_date',)
--- a/entities/authobjs.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/entities/authobjs.py	Wed Sep 23 09:54:25 2009 +0200
@@ -13,7 +13,7 @@
 from cubicweb.entities import AnyEntity, fetch_config
 
 class CWGroup(AnyEntity):
-    id = 'CWGroup'
+    __regid__ = 'CWGroup'
     fetch_attrs, fetch_order = fetch_config(['name'])
     fetch_unrelated_order = fetch_order
 
@@ -22,7 +22,7 @@
         return self.get('name')
 
 class CWUser(AnyEntity):
-    id = 'CWUser'
+    __regid__ = 'CWUser'
     fetch_attrs, fetch_order = fetch_config(['login', 'firstname', 'surname'])
     fetch_unrelated_order = fetch_order
 
@@ -59,12 +59,13 @@
         try:
             # properties stored on the user aren't correctly typed
             # (e.g. all values are unicode string)
-            return self.vreg.typed_value(key, self.properties[key])
+            return self._cw.vreg.typed_value(key, self.properties[key])
         except KeyError:
             pass
         except ValueError:
-            self.warning('incorrect value for eproperty %s of user %s', key, self.login)
-        return self.vreg.property_value(key)
+            self.warning('incorrect value for eproperty %s of user %s',
+                         key, self.login)
+        return self._cw.vreg.property_value(key)
 
     def matching_groups(self, groups):
         """return the number of the given group(s) in which the user is
@@ -91,12 +92,12 @@
         return self.groups == frozenset(('guests', ))
 
     def owns(self, eid):
-        if hasattr(self.req, 'unsafe_execute'):
+        if hasattr(self._cw, 'unsafe_execute'):
             # use unsafe_execute on the repository side, in case
             # session's user doesn't have access to CWUser
-            execute = self.req.unsafe_execute
+            execute = self._cw.unsafe_execute
         else:
-            execute = self.req.execute
+            execute = self._cw.execute
         try:
             return execute('Any X WHERE X eid %(x)s, X owned_by U, U eid %(u)s',
                            {'x': eid, 'u': self.eid}, 'x')
@@ -114,7 +115,7 @@
             kwargs['x'] = contexteid
             cachekey = 'x'
         try:
-            return self.req.execute(rql, kwargs, cachekey)
+            return self._cw.execute(rql, kwargs, cachekey)
         except Unauthorized:
             return False
 
@@ -124,7 +125,7 @@
         """construct a name using firstname / surname or login if not defined"""
 
         if self.firstname and self.surname:
-            return self.req._('%(firstname)s %(surname)s') % {
+            return self._cw._('%(firstname)s %(surname)s') % {
                 'firstname': self.firstname, 'surname' : self.surname}
         if self.firstname:
             return self.firstname
--- a/entities/lib.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/entities/lib.py	Wed Sep 23 09:54:25 2009 +0200
@@ -24,7 +24,7 @@
     return '%s at %s' % (name, host.replace('.', ' dot '))
 
 class EmailAddress(AnyEntity):
-    id = 'EmailAddress'
+    __regid__ = 'EmailAddress'
     fetch_attrs, fetch_order = fetch_config(['address', 'alias'])
 
     def dc_title(self):
@@ -84,7 +84,7 @@
 
 class Bookmark(AnyEntity):
     """customized class for Bookmark entities"""
-    id = 'Bookmark'
+    __regid__ = 'Bookmark'
     fetch_attrs, fetch_order = fetch_config(['title', 'path'])
 
     def actual_url(self):
@@ -103,7 +103,7 @@
 
 
 class CWProperty(AnyEntity):
-    id = 'CWProperty'
+    __regid__ = 'CWProperty'
 
     fetch_attrs, fetch_order = fetch_config(['pkey', 'value'])
     rest_attr = 'pkey'
@@ -126,7 +126,7 @@
 
 class CWCache(AnyEntity):
     """Cache"""
-    id = 'CWCache'
+    __regid__ = 'CWCache'
     fetch_attrs, fetch_order = fetch_config(['name'])
 
     def touch(self):
--- a/entities/schemaobjs.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/entities/schemaobjs.py	Wed Sep 23 09:54:25 2009 +0200
@@ -16,7 +16,7 @@
 
 
 class CWEType(AnyEntity):
-    id = 'CWEType'
+    __regid__ = 'CWEType'
     fetch_attrs, fetch_order = fetch_config(['name'])
 
     def dc_title(self):
@@ -37,7 +37,7 @@
 
 
 class CWRType(AnyEntity):
-    id = 'CWRType'
+    __regid__ = 'CWRType'
     fetch_attrs, fetch_order = fetch_config(['name'])
 
     def dc_title(self):
@@ -87,7 +87,7 @@
 
 
 class CWRelation(AnyEntity):
-    id = 'CWRelation'
+    __regid__ = 'CWRelation'
     fetch_attrs = fetch_config(['cardinality'])[0]
 
     def dc_title(self):
@@ -130,7 +130,7 @@
 
 
 class CWAttribute(CWRelation):
-    id = 'CWAttribute'
+    __regid__ = 'CWAttribute'
 
     def dc_long_title(self):
         card = self.cardinality
@@ -144,7 +144,7 @@
 
 
 class CWConstraint(AnyEntity):
-    id = 'CWConstraint'
+    __regid__ = 'CWConstraint'
     fetch_attrs, fetch_order = fetch_config(['value'])
 
     def dc_title(self):
@@ -164,7 +164,7 @@
 
 
 class RQLExpression(AnyEntity):
-    id = 'RQLExpression'
+    __regid__ = 'RQLExpression'
     fetch_attrs, fetch_order = fetch_config(['exprtype', 'mainvars', 'expression'])
 
     def dc_title(self):
@@ -198,7 +198,7 @@
 
 
 class CWPermission(AnyEntity):
-    id = 'CWPermission'
+    __regid__ = 'CWPermission'
     fetch_attrs, fetch_order = fetch_config(['name', 'label'])
 
     def dc_title(self):
--- a/entities/wfobjs.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/entities/wfobjs.py	Wed Sep 23 09:54:25 2009 +0200
@@ -19,7 +19,7 @@
 class WorkflowException(Exception): pass
 
 class Workflow(AnyEntity):
-    id = 'Workflow'
+    __regid__ = 'Workflow'
 
     @property
     def initial(self):
@@ -156,11 +156,11 @@
     provides a specific may_be_fired method to check if the relation may be
     fired by the logged user
     """
-    id = 'BaseTransition'
+    __regid__ = 'BaseTransition'
     fetch_attrs, fetch_order = fetch_config(['name'])
 
     def __init__(self, *args, **kwargs):
-        if self.id == 'BaseTransition':
+        if self.__regid__ == 'BaseTransition':
             raise WorkflowException('should not be instantiated')
         super(BaseTransition, self).__init__(*args, **kwargs)
 
@@ -233,7 +233,7 @@
 
 class Transition(BaseTransition):
     """customized class for Transition entities"""
-    id = 'Transition'
+    __regid__ = 'Transition'
 
     def destination(self):
         return self.destination_state[0]
@@ -241,7 +241,7 @@
 
 class WorkflowTransition(BaseTransition):
     """customized class for WorkflowTransition entities"""
-    id = 'WorkflowTransition'
+    __regid__ = 'WorkflowTransition'
 
     @property
     def subwf(self):
@@ -284,7 +284,7 @@
 
 class SubWorkflowExitPoint(AnyEntity):
     """customized class for SubWorkflowExitPoint entities"""
-    id = 'SubWorkflowExitPoint'
+    __regid__ = 'SubWorkflowExitPoint'
 
     @property
     def subwf_state(self):
@@ -297,7 +297,7 @@
 
 class State(AnyEntity):
     """customized class for State entities"""
-    id = 'State'
+    __regid__ = 'State'
     fetch_attrs, fetch_order = fetch_config(['name'])
     rest_attr = 'eid'
 
@@ -318,7 +318,7 @@
 class TrInfo(AnyEntity):
     """customized class for Transition information entities
     """
-    id = 'TrInfo'
+    __regid__ = 'TrInfo'
     fetch_attrs, fetch_order = fetch_config(['creation_date', 'comment'],
                                             pclass=None) # don't want modification_date
     @property
--- a/entity.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/entity.py	Wed Sep 23 09:54:25 2009 +0200
@@ -78,7 +78,7 @@
         """initialize a specific entity class by adding descriptors to access
         entity type's attributes and relations
         """
-        etype = cls.__id__
+        etype = cls.__regid__
         assert etype != 'Any', etype
         cls.e_schema = eschema = schema.eschema(etype)
         for rschema, _ in eschema.attribute_definitions():
@@ -109,7 +109,7 @@
         """return a rql to fetch all entities of the class type"""
         restrictions = restriction or []
         if settype:
-            restrictions.append('%s is %s' % (mainvar, cls.__id__))
+            restrictions.append('%s is %s' % (mainvar, cls.__regid__))
         if fetchattrs is None:
             fetchattrs = cls.fetch_attrs
         selection = [mainvar]
@@ -142,7 +142,7 @@
                 rschema = eschema.subject_relation(attr)
             except KeyError:
                 cls.warning('skipping fetch_attr %s defined in %s (not found in schema)',
-                            attr, cls.__id__)
+                            attr, cls.__regid__)
                 continue
             if not user.matching_groups(rschema.get_groups('read')):
                 continue
@@ -166,7 +166,7 @@
                 # later information here, systematically add it.
                 restrictions[-1] += '?'
                 # XXX user.req.vreg iiiirk
-                destcls = user.req.vreg['etypes'].etype_class(desttype)
+                destcls = user._cw.vreg['etypes'].etype_class(desttype)
                 destcls._fetch_restrictions(var, varmaker, destcls.fetch_attrs,
                                             selection, orderby, restrictions,
                                             user, ordermethod, visited=visited)
@@ -247,24 +247,24 @@
 
     @cached
     def metainformation(self):
-        res = dict(zip(('type', 'source', 'extid'), self.req.describe(self.eid)))
-        res['source'] = self.req.source_defs()[res['source']]
+        res = dict(zip(('type', 'source', 'extid'), self._cw.describe(self.eid)))
+        res['source'] = self._cw.source_defs()[res['source']]
         return res
 
     def clear_local_perm_cache(self, action):
         for rqlexpr in self.e_schema.get_rqlexprs(action):
-            self.req.local_perm_cache.pop((rqlexpr.eid, (('x', self.eid),)), None)
+            self._cw.local_perm_cache.pop((rqlexpr.eid, (('x', self.eid),)), None)
 
     def check_perm(self, action):
-        self.e_schema.check_perm(self.req, action, self.eid)
+        self.e_schema.check_perm(self._cw, action, self.eid)
 
     def has_perm(self, action):
-        return self.e_schema.has_perm(self.req, action, self.eid)
+        return self.e_schema.has_perm(self._cw, action, self.eid)
 
     def view(self, vid, __registry='views', **kwargs):
         """shortcut to apply a view on this entity"""
-        return self.vreg[__registry].render(vid, self.req, rset=self.rset,
-                                            row=self.row, col=self.col, **kwargs)
+        return self._cw.vreg[__registry].render(
+            vid, self._cw, rset=self.rset, row=self.row, col=self.col, **kwargs)
 
     def absolute_url(self, *args, **kwargs):
         """return an absolute url to view this entity"""
@@ -278,18 +278,18 @@
         # in linksearch mode, we don't want external urls else selecting
         # the object for use in the relation is tricky
         # XXX search_state is web specific
-        if getattr(self.req, 'search_state', ('normal',))[0] == 'normal':
+        if getattr(self._cw, 'search_state', ('normal',))[0] == 'normal':
             kwargs['base_url'] = self.metainformation()['source'].get('base-url')
         if method in (None, 'view'):
             try:
                 kwargs['_restpath'] = self.rest_path(kwargs.get('base_url'))
             except TypeError:
                 warn('%s: rest_path() now take use_ext_eid argument, '
-                     'please update' % self.__id__, DeprecationWarning)
+                     'please update' % self.__regid__, DeprecationWarning)
                 kwargs['_restpath'] = self.rest_path()
         else:
             kwargs['rql'] = 'Any X WHERE X eid %s' % self.eid
-        return self.req.build_url(method, **kwargs)
+        return self._cw.build_url(method, **kwargs)
 
     def rest_path(self, use_ext_eid=False):
         """returns a REST-like (relative) path for this entity"""
@@ -305,7 +305,7 @@
                 # make sure url is not ambiguous
                 rql = 'Any COUNT(X) WHERE X is %s, X %s %%(value)s' % (
                     etype, mainattr)
-                nbresults = self.req.execute(rql, {'value' : value})[0][0]
+                nbresults = self._cw.execute(rql, {'value' : value})[0][0]
                 if nbresults != 1: # ambiguity?
                     mainattr = 'eid'
                     path += '/eid'
@@ -314,13 +314,13 @@
                 value = self.metainformation()['extid']
             else:
                 value = self.eid
-        return '%s/%s' % (path, self.req.url_quote(value))
+        return '%s/%s' % (path, self._cw.url_quote(value))
 
     def attr_metadata(self, attr, metadata):
         """return a metadata for an attribute (None if unspecified)"""
         value = getattr(self, '%s_%s' % (attr, metadata), None)
         if value is None and metadata == 'encoding':
-            value = self.vreg.property_value('ui.encoding')
+            value = self._cw.vreg.property_value('ui.encoding')
         return value
 
     def printable_value(self, attr, value=_marker, attrtype=None,
@@ -342,11 +342,11 @@
             # internalinalized *and* formatted string such as schema
             # description...
             if props.get('internationalizable'):
-                value = self.req._(value)
+                value = self._cw._(value)
             attrformat = self.attr_metadata(attr, 'format')
             if attrformat:
                 return self.mtc_transform(value, attrformat, format,
-                                          self.req.encoding)
+                                          self._cw.encoding)
         elif attrtype == 'Bytes':
             attrformat = self.attr_metadata(attr, 'format')
             if attrformat:
@@ -354,7 +354,7 @@
                 return self.mtc_transform(value.getvalue(), attrformat, format,
                                           encoding)
             return u''
-        value = printable_value(self.req, attrtype, value, props,
+        value = printable_value(self._cw, attrtype, value, props,
                                 displaytime=displaytime)
         if format == 'text/html':
             value = xml_escape(value)
@@ -365,7 +365,7 @@
         trdata = TransformData(data, format, encoding, appobject=self)
         data = _engine.convert(trdata, target_format).decode()
         if format == 'text/html':
-            data = soup2xhtml(data, self.req.encoding)
+            data = soup2xhtml(data, self._cw.encoding)
         return data
 
     # entity cloning ##########################################################
@@ -377,7 +377,7 @@
         Overrides this if you want another behaviour
         """
         assert self.has_eid()
-        execute = self.req.execute
+        execute = self._cw.execute
         for rschema in self.e_schema.subject_relations():
             if rschema.is_final() or rschema.meta:
                 continue
@@ -421,8 +421,8 @@
     def as_rset(self):
         """returns a resultset containing `self` information"""
         rset = ResultSet([(self.eid,)], 'Any X WHERE X eid %(x)s',
-                         {'x': self.eid}, [(self.__id__,)])
-        return self.req.decorate_rset(rset)
+                         {'x': self.eid}, [(self.__regid__,)])
+        return self._cw.decorate_rset(rset)
 
     def to_complete_relations(self):
         """by default complete final relations to when calling .complete()"""
@@ -434,7 +434,7 @@
                 # outer join correctly in this case
                 continue
             if rschema.inlined:
-                matching_groups = self.req.user.matching_groups
+                matching_groups = self._cw.user.matching_groups
                 if matching_groups(rschema.get_groups('read')) and \
                    all(matching_groups(es.get_groups('read'))
                        for es in rschema.objects(self.e_schema)):
@@ -449,7 +449,7 @@
             if attr == 'eid':
                 continue
             # password retreival is blocked at the repository server level
-            if not self.req.user.matching_groups(rschema.get_groups('read')) \
+            if not self._cw.user.matching_groups(rschema.get_groups('read')) \
                    or attrschema.type == 'Password':
                 self[attr] = None
                 continue
@@ -509,7 +509,7 @@
             # if some outer join are included to fetch inlined relations
             rql = 'Any %s,%s %s' % (V, ','.join(var for attr, var in selected),
                                     ','.join(rql))
-            execute = getattr(self.req, 'unsafe_execute', self.req.execute)
+            execute = getattr(self._cw, 'unsafe_execute', self._cw.execute)
             rset = execute(rql, {'x': self.eid}, 'x', build_descr=False)[0]
             # handle attributes
             for i in xrange(1, lastattr):
@@ -520,9 +520,9 @@
                 value = rset[i]
                 if value is None:
                     rrset = ResultSet([], rql, {'x': self.eid})
-                    self.req.decorate_rset(rrset)
+                    self._cw.decorate_rset(rrset)
                 else:
-                    rrset = self.req.eid_rset(value)
+                    rrset = self._cw.eid_rset(value)
                 self.set_related_cache(rtype, role, rrset)
 
     def get_value(self, name):
@@ -540,7 +540,7 @@
             rql = "Any A WHERE X eid %%(x)s, X %s A" % name
             # XXX should we really use unsafe_execute here? I think so (syt),
             # see #344874
-            execute = getattr(self.req, 'unsafe_execute', self.req.execute)
+            execute = getattr(self._cw, 'unsafe_execute', self._cw.execute)
             try:
                 rset = execute(rql, {'x': self.eid}, 'x')
             except Unauthorized:
@@ -555,7 +555,7 @@
                                   name, self.eid)
                     if self.e_schema.destination(name) == 'String':
                         # XXX (syt) imo emtpy string is better
-                        self[name] = value = self.req._('unaccessible')
+                        self[name] = value = self._cw._('unaccessible')
                     else:
                         self[name] = value = None
         return value
@@ -575,13 +575,13 @@
         rql = self.related_rql(rtype, role)
         # XXX should we really use unsafe_execute here? I think so (syt),
         # see #344874
-        execute = getattr(self.req, 'unsafe_execute', self.req.execute)
+        execute = getattr(self._cw, 'unsafe_execute', self._cw.execute)
         rset = execute(rql, {'x': self.eid}, 'x')
         self.set_related_cache(rtype, role, rset)
         return self.related(rtype, role, limit, entities)
 
     def related_rql(self, rtype, role='subject', targettypes=None):
-        rschema = self.req.vreg.schema[rtype]
+        rschema = self._cw.vreg.schema[rtype]
         if role == 'subject':
             if targettypes is None:
                 targettypes = rschema.objects(self.e_schema)
@@ -595,14 +595,14 @@
         if len(targettypes) > 1:
             fetchattrs_list = []
             for ttype in targettypes:
-                etypecls = self.vreg['etypes'].etype_class(ttype)
+                etypecls = self._cw.vreg['etypes'].etype_class(ttype)
                 fetchattrs_list.append(set(etypecls.fetch_attrs))
             fetchattrs = reduce(set.intersection, fetchattrs_list)
-            rql = etypecls.fetch_rql(self.req.user, [restriction], fetchattrs,
+            rql = etypecls.fetch_rql(self._cw.user, [restriction], fetchattrs,
                                      settype=False)
         else:
-            etypecls = self.vreg['etypes'].etype_class(targettypes[0])
-            rql = etypecls.fetch_rql(self.req.user, [restriction], settype=False)
+            etypecls = self._cw.vreg['etypes'].etype_class(targettypes[0])
+            rql = etypecls.fetch_rql(self._cw.user, [restriction], settype=False)
         # optimisation: remove ORDERBY if cardinality is 1 or ? (though
         # greater_card return 1 for those both cases)
         if card == '1':
@@ -626,7 +626,7 @@
         """
         ordermethod = ordermethod or 'fetch_unrelated_order'
         if isinstance(rtype, basestring):
-            rtype = self.req.vreg.schema.rschema(rtype)
+            rtype = self._cw.vreg.schema.rschema(rtype)
         if role == 'subject':
             evar, searchedvar = 'S', 'O'
             subjtype, objtype = self.e_schema, targettype
@@ -645,7 +645,7 @@
             args = {}
             securitycheck_args = {}
         insertsecurity = (rtype.has_local_role('add') and not
-                          rtype.has_perm(self.req, 'add', **securitycheck_args))
+                          rtype.has_perm(self._cw, 'add', **securitycheck_args))
         constraints = rtype.rproperty(subjtype, objtype, 'constraints')
         if vocabconstraints:
             # RQLConstraint is a subclass for RQLVocabularyConstraint, so they
@@ -655,8 +655,8 @@
         else:
             restriction += [cstr.restriction for cstr in constraints
                             if isinstance(cstr, RQLConstraint)]
-        etypecls = self.vreg['etypes'].etype_class(targettype)
-        rql = etypecls.fetch_rql(self.req.user, restriction,
+        etypecls = self._cw.vreg['etypes'].etype_class(targettype)
+        rql = etypecls.fetch_rql(self._cw.user, restriction,
                                  mainvar=searchedvar, ordermethod=ordermethod)
         # ensure we have an order defined
         if not ' ORDERBY ' in rql:
@@ -664,8 +664,8 @@
             rql = '%s ORDERBY %s WHERE %s' % (before, searchedvar, after)
         if insertsecurity:
             rqlexprs = rtype.get_rqlexprs('add')
-            rewriter = RQLRewriter(self.req)
-            rqlst = self.req.vreg.parse(self.req, rql, args)
+            rewriter = RQLRewriter(self._cw)
+            rqlst = self._cw.vreg.parse(self._cw, rql, args)
             for select in rqlst.children:
                 rewriter.rewrite(select, [((searchedvar, searchedvar), rqlexprs)],
                                  select.solutions, args)
@@ -680,11 +680,11 @@
         try:
             rql, args = self.unrelated_rql(rtype, targettype, role, ordermethod)
         except Unauthorized:
-            return self.req.empty_rset()
+            return self._cw.empty_rset()
         if limit is not None:
             before, after = rql.split(' WHERE ', 1)
             rql = '%s LIMIT %s WHERE %s' % (before, limit, after)
-        return self.req.execute(rql, args, tuple(args))
+        return self._cw.execute(rql, args, tuple(args))
 
     # relations cache handling ################################################
 
@@ -709,7 +709,7 @@
         """set cached values for the given relation"""
         if rset:
             related = list(rset.entities(col))
-            rschema = self.req.vreg.schema.rschema(rtype)
+            rschema = self._cw.vreg.schema.rschema(rtype)
             if role == 'subject':
                 rcard = rschema.rproperty(self.e_schema, related[0].e_schema,
                                           'cardinality')[1]
@@ -752,15 +752,15 @@
         # and now update the database
         kwargs['x'] = self.eid
         if _cw_unsafe:
-            self.req.unsafe_execute(
+            self._cw.unsafe_execute(
                 'SET %s WHERE X eid %%(x)s' % ','.join(relations), kwargs, 'x')
         else:
-            self.req.execute('SET %s WHERE X eid %%(x)s' % ','.join(relations),
+            self._cw.execute('SET %s WHERE X eid %%(x)s' % ','.join(relations),
                              kwargs, 'x')
 
     def delete(self):
         assert self.has_eid(), self.eid
-        self.req.execute('DELETE %s X WHERE X eid %%(x)s' % self.e_schema,
+        self._cw.execute('DELETE %s X WHERE X eid %%(x)s' % self.e_schema,
                          {'x': self.eid})
 
     # server side utilities ###################################################
@@ -779,10 +779,10 @@
         """
         # necessary since eid is handled specifically and yams require it to be
         # in the dictionary
-        if self.req is None:
+        if self._cw is None:
             _ = unicode
         else:
-            _ = self.req._
+            _ = self._cw._
         self.e_schema.check(self, creation=creation, _=_)
 
     def fti_containers(self, _done=None):
@@ -840,20 +840,6 @@
                     words += entity.get_words()
         return words
 
-    @deprecated('[3.2] see new form api')
-    def vocabulary(self, rtype, role='subject', limit=None):
-        """vocabulary functions must return a list of couples
-        (label, eid) that will typically be used to fill the
-        edition view's combobox.
-
-        If `eid` is None in one of these couples, it should be
-        interpreted as a separator in case vocabulary results are grouped
-        """
-        from logilab.common.testlib import mock_object
-        form = self.vreg.select('forms', 'edition', self.req, entity=self)
-        field = mock_object(name=rtype, role=role)
-        return form.form_field_vocabulary(field, limit)
-
 
 # attribute and relation descriptors ##########################################
 
--- a/hooks/bookmark.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/bookmark.py	Wed Sep 23 09:54:25 2009 +0200
@@ -21,7 +21,7 @@
 
 class DelBookmarkedByHook(hook.Hook):
     """ensure user logins are stripped"""
-    __id__ = 'autodelbookmark'
+    __regid__ = 'autodelbookmark'
     __select__ = hook.Hook.__select__ & entity_implements('bookmarked_by',)
     category = 'bookmark'
     events = ('after_delete_relation',)
--- a/hooks/email.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/email.py	Wed Sep 23 09:54:25 2009 +0200
@@ -43,7 +43,7 @@
 
 class SetPrimaryEmailHook(hook.Hook):
     """notify when a bug or story or version has its state modified"""
-    __id__ = 'setprimaryemail'
+    __regid__ = 'setprimaryemail'
     __select__ = hook.Hook.__select__ & hook.match_rtype('use_email')
     category = 'email'
     events = ('after_add_relation',)
@@ -56,7 +56,7 @@
 
 class SetUseEmailHook(hook.Hook):
     """notify when a bug or story or version has its state modified"""
-    __id__ = 'setprimaryemail'
+    __regid__ = 'setprimaryemail'
     __select__ = hook.Hook.__select__ & hook.match_rtype('primary_email')
     category = 'email'
     events = ('after_add_relation',)
--- a/hooks/integrity.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/integrity.py	Wed Sep 23 09:54:25 2009 +0200
@@ -65,7 +65,7 @@
 
 class CheckCardinalityHook(IntegrityHook):
     """check cardinalities are satisfied"""
-    __id__ = 'checkcard'
+    __regid__ = 'checkcard'
     events = ('after_add_entity', 'before_delete_relation')
 
     def __call__(self):
@@ -144,7 +144,7 @@
     this is delayed to a precommit time operation since other relation which
     will make constraint satisfied may be added later.
     """
-    __id__ = 'checkconstraint'
+    __regid__ = 'checkconstraint'
     events = ('after_add_relation',)
 
     def __call__(self):
@@ -156,7 +156,7 @@
 
 
 class CheckUniqueHook(IntegrityHook):
-    __id__ = 'checkunique'
+    __regid__ = 'checkunique'
     events = ('before_add_entity', 'before_update_entity')
 
     def __call__(self):
@@ -194,7 +194,7 @@
 class DeleteCompositeOrphanHook(IntegrityHook):
     """delete the composed of a composite relation when this relation is deleted
     """
-    __id__ = 'deletecomposite'
+    __regid__ = 'deletecomposite'
     events = ('before_delete_relation',)
 
     def __call__(self):
@@ -211,7 +211,7 @@
 class DontRemoveOwnersGroupHook(IntegrityHook):
     """delete the composed of a composite relation when this relation is deleted
     """
-    __id__ = 'checkownersgroup'
+    __regid__ = 'checkownersgroup'
     __select__ = IntegrityHook.__select__ & entity_implements('CWGroup')
     events = ('before_delete_entity', 'before_update_entity')
 
@@ -228,7 +228,7 @@
 
 class TidyHtmlFields(IntegrityHook):
     """tidy HTML in rich text strings"""
-    __id__ = 'htmltidy'
+    __regid__ = 'htmltidy'
     events = ('before_add_entity', 'before_update_entity')
 
     def __call__(self):
@@ -247,7 +247,7 @@
 
 class StripCWUserLoginHook(IntegrityHook):
     """ensure user logins are stripped"""
-    __id__ = 'stripuserlogin'
+    __regid__ = 'stripuserlogin'
     __select__ = IntegrityHook.__select__ & entity_implements('CWUser')
     events = ('before_add_entity', 'before_update_entity',)
 
--- a/hooks/metadata.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/metadata.py	Wed Sep 23 09:54:25 2009 +0200
@@ -37,7 +37,7 @@
 
     this is a conveniency hook, you shouldn't have to disable it
     """
-    __id__ = 'metaattrsinit'
+    __regid__ = 'metaattrsinit'
     events = ('before_add_entity',)
 
     def __call__(self):
@@ -51,7 +51,7 @@
 
 class UpdateMetaAttrsHook(MetaDataHook):
     """update an entity -> set modification date"""
-    __id__ = 'metaattrsupdate'
+    __regid__ = 'metaattrsupdate'
     events = ('before_update_entity',)
 
     def __call__(self):
@@ -71,7 +71,7 @@
 
 class SetIsHook(MetaDataHook):
     """create a new entity -> set is relation"""
-    __id__ = 'setis'
+    __regid__ = 'setis'
     events = ('after_add_entity',)
 
     def __call__(self):
@@ -92,7 +92,7 @@
 
 class SetOwnershipHook(MetaDataHook):
     """create a new entity -> set owner and creator metadata"""
-    __id__ = 'setowner'
+    __regid__ = 'setowner'
     events = ('after_add_entity',)
 
     def __call__(self):
@@ -114,7 +114,7 @@
     """when adding composite relation, the composed should have the same owners
     has the composite
     """
-    __id__ = 'synccompositeowner'
+    __regid__ = 'synccompositeowner'
     events = ('after_add_relation',)
 
     def __call__(self):
@@ -131,7 +131,7 @@
 
 class FixUserOwnershipHook(MetaDataHook):
     """when a user has been created, add owned_by relation on itself"""
-    __id__ = 'fixuserowner'
+    __regid__ = 'fixuserowner'
     __select__ = MetaDataHook.__select__ & entity_implements('CWUser')
     events = ('after_add_entity',)
 
@@ -142,7 +142,7 @@
 class UpdateFTIHook(MetaDataHook):
     """sync fulltext index when relevant relation is added / removed
     """
-    __id__ = 'updateftirel'
+    __regid__ = 'updateftirel'
     events = ('after_add_relation', 'after_delete_relation')
 
     def __call__(self):
--- a/hooks/notification.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/notification.py	Wed Sep 23 09:54:25 2009 +0200
@@ -36,7 +36,7 @@
 
 class StatusChangeHook(NotificationHook):
     """notify when a workflowable entity has its state modified"""
-    __id__ = 'notifystatuschange'
+    __regid__ = 'notifystatuschange'
     __select__ = NotificationHook.__select__ & entity_implements('TrInfo')
     events = ('after_add_entity',)
 
@@ -59,7 +59,7 @@
 
 
 class RelationChangeHook(NotificationHook):
-    __id__ = 'notifyrelationchange'
+    __regid__ = 'notifyrelationchange'
     events = ('before_add_relation', 'after_add_relation',
               'before_delete_relation', 'after_delete_relation')
 
@@ -79,7 +79,7 @@
     """if a notification view is defined for the event, send notification
     email defined by the view
     """
-    __id__ = 'notifyentitychange'
+    __regid__ = 'notifyentitychange'
     events = ('after_add_entity', 'after_update_entity')
 
     def __call__(self):
@@ -93,7 +93,7 @@
 # supervising ##################################################################
 
 class SomethingChangedHook(NotificationHook):
-    __id__ = 'supervising'
+    __regid__ = 'supervising'
     events = ('before_add_relation', 'before_delete_relation',
               'after_add_entity', 'before_update_entity')
 
@@ -124,7 +124,7 @@
 
 
 class EntityDeleteHook(SomethingChangedHook):
-    __id__ = 'supervisingentitydel'
+    __regid__ = 'supervisingentitydel'
     events = ('before_delete_entity',)
 
     def _call(self):
--- a/hooks/security.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/security.py	Wed Sep 23 09:54:25 2009 +0200
@@ -56,7 +56,7 @@
 
 
 class AfterAddEntitySecurityHook(SecurityHook):
-    __id__ = 'securityafteraddentity'
+    __regid__ = 'securityafteraddentity'
     events = ('after_add_entity',)
 
     def __call__(self):
@@ -64,7 +64,7 @@
 
 
 class AfterUpdateEntitySecurityHook(SecurityHook):
-    __id__ = 'securityafterupdateentity'
+    __regid__ = 'securityafterupdateentity'
     events = ('after_update_entity',)
 
     def __call__(self):
@@ -78,7 +78,7 @@
 
 
 class BeforeDelEntitySecurityHook(SecurityHook):
-    __id__ = 'securitybeforedelentity'
+    __regid__ = 'securitybeforedelentity'
     events = ('before_delete_entity',)
 
     def __call__(self):
@@ -86,7 +86,7 @@
 
 
 class BeforeAddRelationSecurityHook(SecurityHook):
-    __id__ = 'securitybeforeaddrelation'
+    __regid__ = 'securitybeforeaddrelation'
     events = ('before_add_relation',)
 
     def __call__(self):
@@ -99,7 +99,7 @@
 
 
 class AfterAddRelationSecurityHook(SecurityHook):
-    __id__ = 'securityafteraddrelation'
+    __regid__ = 'securityafteraddrelation'
     events = ('after_add_relation',)
 
     def __call__(self):
@@ -118,7 +118,7 @@
 
 
 class BeforeDelRelationSecurityHook(SecurityHook):
-    __id__ = 'securitybeforedelrelation'
+    __regid__ = 'securitybeforedelrelation'
     events = ('before_delete_relation',)
 
     def __call__(self):
--- a/hooks/syncschema.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/syncschema.py	Wed Sep 23 09:54:25 2009 +0200
@@ -763,7 +763,7 @@
     * cascade to delete related CWAttribute and CWRelation entities
     * instantiate an operation to delete the entity type on commit
     """
-    __id__ = 'syncdelcwetype'
+    __regid__ = 'syncdelcwetype'
     __select__ = SyncSchemaHook.__select__ & entity_implements('CWEType')
     events = ('before_delete_entity',)
 
@@ -779,7 +779,7 @@
 
 
 class AfterDelCWETypeHook(DelCWETypeHook):
-    __id__ = 'wfcleanup'
+    __regid__ = 'wfcleanup'
     events = ('after_delete_entity',)
 
     def __call__(self):
@@ -796,7 +796,7 @@
     * register an operation to add the entity type to the instance's
       schema on commit
     """
-    __id__ = 'syncaddcwetype'
+    __regid__ = 'syncaddcwetype'
     events = ('before_add_entity',)
 
     def __call__(self):
@@ -840,7 +840,7 @@
 
 class BeforeUpdateCWETypeHook(DelCWETypeHook):
     """check name change, handle final"""
-    __id__ = 'syncupdatecwetype'
+    __regid__ = 'syncupdatecwetype'
     events = ('before_update_entity',)
 
     def __call__(self):
@@ -864,7 +864,7 @@
     * cascade to delete related CWAttribute and CWRelation entities
     * instantiate an operation to delete the relation type on commit
     """
-    __id__ = 'syncdelcwrtype'
+    __regid__ = 'syncdelcwrtype'
     __select__ = SyncSchemaHook.__select__ & entity_implements('CWRType')
     events = ('before_delete_entity',)
 
@@ -887,7 +887,7 @@
 
     We don't know yet this point if a table is necessary
     """
-    __id__ = 'syncaddcwrtype'
+    __regid__ = 'syncaddcwrtype'
     events = ('after_add_entity',)
 
     def __call__(self):
@@ -903,7 +903,7 @@
 
 class BeforeUpdateCWRTypeHook(DelCWRTypeHook):
     """check name change, handle final"""
-    __id__ = 'checkupdatecwrtype'
+    __regid__ = 'checkupdatecwrtype'
     events = ('before_update_entity',)
 
     def __call__(self):
@@ -911,7 +911,7 @@
 
 
 class AfterUpdateCWRTypeHook(DelCWRTypeHook):
-    __id__ = 'syncupdatecwrtype'
+    __regid__ = 'syncupdatecwrtype'
     events = ('after_update_entity',)
 
     def __call__(self):
@@ -938,7 +938,7 @@
     * instantiate an operation to delete the relation definition on commit
     * delete the associated relation type when necessary
     """
-    __id__ = 'syncdelrelationtype'
+    __regid__ = 'syncdelrelationtype'
     __select__ = SyncSchemaHook.__select__ & hook.match_rtype('relation_type')
     events = ('after_delete_relation',)
 
@@ -985,7 +985,7 @@
 # CWAttribute / CWRelation hooks ###############################################
 
 class AfterAddCWAttributeHook(SyncSchemaHook):
-    __id__ = 'syncaddcwattribute'
+    __regid__ = 'syncaddcwattribute'
     __select__ = SyncSchemaHook.__select__ & entity_implements('CWAttribute')
     events = ('after_add_entity',)
 
@@ -994,7 +994,7 @@
 
 
 class AfterAddCWRelationHook(AfterAddCWAttributeHook):
-    __id__ = 'syncaddcwrelation'
+    __regid__ = 'syncaddcwrelation'
     __select__ = SyncSchemaHook.__select__ & entity_implements('CWRelation')
 
     def __call__(self):
@@ -1002,7 +1002,7 @@
 
 
 class AfterUpdateCWRDefHook(SyncSchemaHook):
-    __id__ = 'syncaddcwattribute'
+    __regid__ = 'syncaddcwattribute'
     __select__ = SyncSchemaHook.__select__ & entity_implements('CWAttribute',
                                                                'CWRelation')
     events = ('after_update_entity',)
@@ -1032,7 +1032,7 @@
 # constraints synchronization hooks ############################################
 
 class AfterAddCWConstraintHook(SyncSchemaHook):
-    __id__ = 'syncaddcwconstraint'
+    __regid__ = 'syncaddcwconstraint'
     __select__ = SyncSchemaHook.__select__ & entity_implements('CWConstraint')
     events = ('after_add_entity', 'after_update_entity')
 
@@ -1042,7 +1042,7 @@
 
 
 class AfterAddConstrainedByHook(SyncSchemaHook):
-    __id__ = 'syncdelconstrainedby'
+    __regid__ = 'syncdelconstrainedby'
     __select__ = SyncSchemaHook.__select__ & hook.match_rtype('constrainted_by')
     events = ('after_add_relation',)
 
@@ -1052,7 +1052,7 @@
 
 
 class BeforeDeleteConstrainedByHook(AfterAddConstrainedByHook):
-    __id__ = 'syncdelconstrainedby'
+    __regid__ = 'syncdelconstrainedby'
     events = ('before_delete_relation',)
 
     def __call__(self):
@@ -1077,7 +1077,7 @@
 
 class AfterAddPermissionHook(SyncSchemaHook):
     """added entity/relation *_permission, need to update schema"""
-    __id__ = 'syncaddperm'
+    __regid__ = 'syncaddperm'
     __select__ = SyncSchemaHook.__select__ & hook.match_rtype(
         'read_permission', 'add_permission', 'delete_permission',
         'update_permission')
@@ -1097,7 +1097,7 @@
 
     skip the operation if the related type is being deleted
     """
-    __id__ = 'syncdelperm'
+    __regid__ = 'syncdelperm'
     events = ('before_delete_relation',)
 
     def __call__(self):
@@ -1115,7 +1115,7 @@
 
 
 class AfterAddSpecializesHook(SyncSchemaHook):
-    __id__ = 'syncaddspecializes'
+    __regid__ = 'syncaddspecializes'
     __select__ = SyncSchemaHook.__select__ & hook.match_rtype('specializes')
     events = ('after_add_relation',)
 
@@ -1125,7 +1125,7 @@
 
 
 class AfterAddSpecializesHook(SyncSchemaHook):
-    __id__ = 'syncdelspecializes'
+    __regid__ = 'syncdelspecializes'
     __select__ = SyncSchemaHook.__select__ & hook.match_rtype('specializes')
     events = ('after_delete_relation',)
 
--- a/hooks/syncsession.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/syncsession.py	Wed Sep 23 09:54:25 2009 +0200
@@ -65,7 +65,7 @@
 
 
 class SyncInGroupHook(SyncSessionHook):
-    __id__ = 'syncingroup'
+    __regid__ = 'syncingroup'
     __select__ = SyncSessionHook.__select__ & hook.match_rtype('in_group')
     events = ('after_delete_relation', 'after_add_relation')
 
@@ -93,7 +93,7 @@
 
 
 class CloseDeletedUserSessionsHook(SyncSessionHook):
-    __id__ = 'closession'
+    __regid__ = 'closession'
     __select__ = SyncSessionHook.__select__ & entity_implements('CWUser')
     events = ('after_delete_entity',)
 
@@ -137,7 +137,7 @@
 
 
 class AddCWPropertyHook(SyncSessionHook):
-    __id__ = 'addcwprop'
+    __regid__ = 'addcwprop'
     __select__ = SyncSessionHook.__select__ & entity_implements('CWProperty')
     events = ('after_add_entity',)
 
@@ -159,7 +159,7 @@
 
 
 class UpdateCWPropertyHook(AddCWPropertyHook):
-    __id__ = 'updatecwprop'
+    __regid__ = 'updatecwprop'
     events = ('after_update_entity',)
 
     def __call__(self):
@@ -186,7 +186,7 @@
 
 
 class DeleteCWPropertyHook(AddCWPropertyHook):
-    __id__ = 'delcwprop'
+    __regid__ = 'delcwprop'
     events = ('before_delete_entity',)
 
     def __call__(self):
@@ -201,7 +201,7 @@
 
 
 class AddForUserRelationHook(SyncSessionHook):
-    __id__ = 'addcwpropforuser'
+    __regid__ = 'addcwpropforuser'
     __select__ = SyncSessionHook.__select__ & hook.match_rtype('for_user')
     events = ('after_add_relation',)
 
@@ -221,7 +221,7 @@
 
 
 class DelForUserRelationHook(AddForUserRelationHook):
-    __id__ = 'delcwpropforuser'
+    __regid__ = 'delcwpropforuser'
     events = ('after_delete_relation',)
 
     def __call__(self):
--- a/hooks/workflow.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/hooks/workflow.py	Wed Sep 23 09:54:25 2009 +0200
@@ -101,7 +101,7 @@
 
 
 class SetInitialStateHook(WorkflowHook):
-    __id__ = 'wfsetinitial'
+    __regid__ = 'wfsetinitial'
     __select__ = WorkflowHook.__select__ & entity_implements(IWorkflowable)
     events = ('after_add_entity',)
 
@@ -111,7 +111,7 @@
 
 class PrepareStateChangeHook(WorkflowHook):
     """record previous state information"""
-    __id__ = 'cwdelstate'
+    __regid__ = 'cwdelstate'
     __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
     events = ('before_delete_relation',)
 
@@ -125,7 +125,7 @@
     * wf_info_for inlined relation is set
     * by_transition or to_state (managers only) inlined relation is set
     """
-    __id__ = 'wffiretransition'
+    __regid__ = 'wffiretransition'
     __select__ = WorkflowHook.__select__ & entity_implements('TrInfo')
     events = ('before_add_entity',)
 
@@ -210,7 +210,7 @@
 
 class FiredTransitionHook(WorkflowHook):
     """change related entity state"""
-    __id__ = 'wffiretransition'
+    __regid__ = 'wffiretransition'
     __select__ = WorkflowHook.__select__ & entity_implements('TrInfo')
     events = ('after_add_entity',)
 
@@ -247,7 +247,7 @@
 class CheckInStateChangeAllowed(WorkflowHook):
     """check state apply, in case of direct in_state change using unsafe_execute
     """
-    __id__ = 'wfcheckinstate'
+    __regid__ = 'wfcheckinstate'
     __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
     events = ('before_add_relation',)
 
@@ -276,7 +276,7 @@
 
 class SetModificationDateOnStateChange(WorkflowHook):
     """update entity's modification date after changing its state"""
-    __id__ = 'wfsyncmdate'
+    __regid__ = 'wfsyncmdate'
     __select__ = WorkflowHook.__select__ & hook.match_rtype('in_state')
     events = ('after_add_relation',)
 
@@ -296,7 +296,7 @@
 
 class CheckWorkflowTransitionExitPoint(WorkflowHook):
     """check that there is no multiple exits from the same state"""
-    __id__ = 'wfcheckwftrexit'
+    __regid__ = 'wfcheckwftrexit'
     __select__ = WorkflowHook.__select__ & hook.match_rtype('subworkflow_exit')
     events = ('after_add_relation',)
 
@@ -305,7 +305,7 @@
 
 
 class SetCustomWorkflow(WorkflowHook):
-    __id__ = 'wfsetcustom'
+    __regid__ = 'wfsetcustom'
     __select__ = WorkflowHook.__select__ & hook.match_rtype('custom_workflow')
     events = ('after_add_relation',)
 
@@ -314,7 +314,7 @@
 
 
 class DelCustomWorkflow(SetCustomWorkflow):
-    __id__ = 'wfdelcustom'
+    __regid__ = 'wfdelcustom'
     events = ('after_delete_relation',)
 
     def __call__(self):
@@ -326,7 +326,7 @@
 
 
 class DelWorkflowHook(WorkflowHook):
-    __id__ = 'wfdel'
+    __regid__ = 'wfdel'
     __select__ = WorkflowHook.__select__ & entity_implements('Workflow')
     events = ('after_delete_entity',)
 
--- a/rset.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/rset.py	Wed Sep 23 09:54:25 2009 +0200
@@ -322,7 +322,7 @@
             # we also have to fix/remove from the request entity cache entities
             # which get a wrong rset reference by this limit call
             for entity in self.req.cached_entities():
-                if entity.rset is self:
+                if entity.cw_rset is self:
                     if offset <= entity.row < stop:
                         entity.row = entity.row - offset
                     else:
@@ -425,7 +425,7 @@
         except KeyError:
             pass
         else:
-            if entity.rset is None:
+            if entity.cw_rset is None:
                 # entity has no rset set, this means entity has been created by
                 # the querier (req is a repository session) and so jas no rset
                 # info. Add it.
--- a/selectors.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/selectors.py	Wed Sep 23 09:54:25 2009 +0200
@@ -637,7 +637,7 @@
           proximity so the most specific object'll be selected
     """
     def score_entity(self, entity):
-        return self.score_interfaces(entity.req, entity, entity.__class__)
+        return self.score_interfaces(entity._cw, entity, entity.__class__)
 
 
 class relation_possible(EClassSelector):
@@ -742,9 +742,9 @@
     def score_entity(self, entity):
         rschema = entity.schema.rschema(self.rtype)
         if self.role == 'subject':
-            if not rschema.has_perm(entity.req, 'add', fromeid=entity.eid):
+            if not rschema.has_perm(entity._cw, 'add', fromeid=entity.eid):
                 return 0
-        elif not rschema.has_perm(entity.req, 'add', toeid=entity.eid):
+        elif not rschema.has_perm(entity._cw, 'add', toeid=entity.eid):
             return 0
         return 1
 
@@ -795,7 +795,7 @@
 
     def score_entity(self, entity):
         relpossel = relation_possible(self.rtype, self.role, self.target_etype)
-        if not relpossel.score_class(entity.__class__, entity.req):
+        if not relpossel.score_class(entity.__class__, entity._cw):
             return 0
         rset = entity.related(self.rtype, self.role)
         if self.target_etype:
--- a/server/checkintegrity.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/server/checkintegrity.py	Wed Sep 23 09:54:25 2009 +0200
@@ -211,8 +211,8 @@
                     if not has_eid(cursor, eid, eids):
                         bad_related_msg(rschema, 'object', eid, fix)
                         if fix:
-                            sql = 'UPDATE %s SET %s = NULL WHERE %seid=%s;' % (
-                                table, column, SQL_PREFIX, eid)
+                            sql = 'UPDATE %s SET %s=NULL WHERE %s=%s;' % (
+                                table, column, column, eid)
                             session.system_sql(sql)
             continue
         cursor = session.system_sql('SELECT eid_from FROM %s_relation;' % rschema)
--- a/server/hook.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/server/hook.py	Wed Sep 23 09:54:25 2009 +0200
@@ -138,15 +138,17 @@
     enabled = True
 
     @classproperty
-    def __id__(cls):
-        warn('[3.6] %s: please specify an id for your hook' % cls)
+    def __regid__(cls):
+        warn('[3.6] %s.%s: please specify an id for your hook'
+             % (cls.__module__, cls.__name__), DeprecationWarning)
         return str(id(cls))
 
     @classmethod
     def __registered__(cls, vreg):
         super(Hook, cls).__registered__(vreg)
         if getattr(cls, 'accepts', None):
-            warn('[3.6] %s: accepts is deprecated, define proper __select__' % cls)
+            warn('[3.6] %s.%s: accepts is deprecated, define proper __select__'
+                 % (cls.__module__, cls.__name__), DeprecationWarning)
             rtypes = []
             for ertype in cls.accepts:
                 if ertype.islower():
@@ -167,8 +169,9 @@
 
     def __call__(self):
         if hasattr(self, 'call'):
-            warn('[3.6] %s: call is deprecated, implements __call__' % self.__class__,
-                 DeprecationWarning)
+            cls = self.__class__
+            warn('[3.6] %s.%s: call is deprecated, implements __call__'
+                 % (cls.__module__, cls.__name__), DeprecationWarning)
             if self.event.endswith('_relation'):
                 self.call(self._cw, self.eidfrom, self.rtype, self.eidto)
             elif 'delete' in self.event:
--- a/server/repository.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/server/repository.py	Wed Sep 23 09:54:25 2009 +0200
@@ -54,7 +54,8 @@
         remove inserted eid from repository type/source cache
         """
         try:
-            self.repo.clear_caches(self.session.transaction_data['pendingeids'])
+            self.session.repo.clear_caches(
+                self.session.transaction_data['pendingeids'])
         except KeyError:
             pass
 
@@ -63,7 +64,8 @@
         remove inserted eid from repository type/source cache
         """
         try:
-            self.repo.clear_caches(self.session.transaction_data['neweids'])
+            self.session.repo.clear_caches(
+                self.session.transaction_data['neweids'])
         except KeyError:
             pass
 
@@ -536,7 +538,7 @@
         finally:
             session.close()
         session = Session(user, self, cnxprops)
-        user._cw = user.rset.req = session
+        user._cw = user.cw_rset.req = session
         user.clear_related_cache()
         self._sessions[session.id] = session
         self.info('opened %s', session)
--- a/server/session.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/server/session.py	Wed Sep 23 09:54:25 2009 +0200
@@ -163,7 +163,7 @@
                 rset.description = list(rset.description)
             rset.description.append([self.describe(targeteid)[0]])
             targetentity = self.entity_from_eid(targeteid)
-            if targetentity.rset is None:
+            if targetentity.cw_rset is None:
                 targetentity.cw_rset = rset
                 targetentity.cw_row = rset.rowcount
                 targetentity.cw_col = 0
--- a/sobjects/notification.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/sobjects/notification.py	Wed Sep 23 09:54:25 2009 +0200
@@ -26,7 +26,7 @@
     by default user's with their email set are notified if any, else the default
     email addresses specified in the configuration are used
     """
-    id = 'recipients_finder'
+    __regid__ = 'recipients_finder'
     __select__ = yes()
     user_rql = ('Any X,E,A WHERE X is CWUser, X in_state S, S name "activated",'
                 'X primary_email E, E address A')
@@ -59,7 +59,7 @@
 
 
 class StatusChangeMixIn(object):
-    id = 'notif_status_change'
+    __regid__ = 'notif_status_change'
     msgid_timestamp = True
     message = _('status changed')
     content = _("""
@@ -89,7 +89,7 @@
       override call)
     """
     __abstract__ = True
-    id = 'notif_after_add_entity'
+    __regid__ = 'notif_after_add_entity'
     msgid_timestamp = False
     message = _('new')
     content = """
--- a/sobjects/supervising.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/sobjects/supervising.py	Wed Sep 23 09:54:25 2009 +0200
@@ -82,8 +82,8 @@
 class SupervisionEmailView(Component):
     """view implementing the email API for data changes supervision notification
     """
+    __regid__ = 'supervision_notif'
     __select__ = none_rset()
-    id = 'supervision_notif'
 
     def recipients(self):
         return self.config['supervising-addrs']
--- a/utils.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/utils.py	Wed Sep 23 09:54:25 2009 +0200
@@ -20,8 +20,6 @@
 from calendar import monthrange
 import decimal
 
-import simplejson
-
 # initialize random seed from current time
 seed()
 try:
@@ -364,24 +362,25 @@
     return True
 
 try:
-    # may not be there is cubicweb-web not there
-    from simplejson import JSONEncoder, dumps
+    # may not be there if cubicweb-web not installed
+    from simplejson import dumps, JSONEncoder
 except ImportError:
     pass
 else:
+
     class CubicWebJsonEncoder(JSONEncoder):
         """define a simplejson encoder to be able to encode yams std types"""
         def default(self, obj):
-            if isinstance(obj, datetime):
+            if isinstance(obj, pydatetime.datetime):
                 return obj.strftime('%Y/%m/%d %H:%M:%S')
-            elif isinstance(obj, date):
+            elif isinstance(obj, pydatetime.date):
                 return obj.strftime('%Y/%m/%d')
             elif isinstance(obj, pydatetime.time):
                 return obj.strftime('%H:%M:%S')
             elif isinstance(obj, decimal.Decimal):
                 return float(obj)
             try:
-                return simplejson.JSONEncoder.default(self, obj)
+                return JSONEncoder.default(self, obj)
             except TypeError:
                 # we never ever want to fail because of an unknown type,
                 # just return None in those cases.
--- a/vregistry.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/vregistry.py	Wed Sep 23 09:54:25 2009 +0200
@@ -61,11 +61,12 @@
 def class_regid(cls):
     """returns a unique identifier for an appobject class"""
     if 'id' in cls.__dict__:
-        warn('%s: id is deprecated, use __id__')
-        cls.__id__ = cls.id
+        warn('%s.%s: id is deprecated, use __regid__'
+             % (cls.__module__, cls.__name__), DeprecationWarning)
+        cls.__regid__ = cls.id
     if hasattr(cls, 'id'):
         return cls.id
-    return cls.__id__
+    return cls.__regid__
 
 
 class Registry(dict):
--- a/web/views/actions.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/actions.py	Wed Sep 23 09:54:25 2009 +0200
@@ -74,7 +74,7 @@
     any size entity result search it the current state is 'linksearch'
     if accept match.
     """
-    id = 'select'
+    __regid__ = 'select'
     __select__ = match_search_state('linksearch') & nonempty_rset() & match_searched_etype()
 
     title = _('select')
@@ -86,7 +86,7 @@
 
 
 class CancelSelectAction(Action):
-    id = 'cancel'
+    __regid__ = 'cancel'
     __select__ = match_search_state('linksearch')
 
     title = _('cancel select')
@@ -100,7 +100,7 @@
 
 
 class ViewAction(Action):
-    id = 'view'
+    __regid__ = 'view'
     __select__ = (match_search_state('normal') &
                   match_user_groups('users', 'managers') &
                   view_is_not_default_view() &
@@ -119,7 +119,7 @@
 
 
 class ModifyAction(Action):
-    id = 'edit'
+    __regid__ = 'edit'
     __select__ = (match_search_state('normal') &
                   one_line_rset() &
                   (has_permission('update') | has_editable_relation('add')))
@@ -134,7 +134,7 @@
 
 
 class MultipleEditAction(Action):
-    id = 'muledit' # XXX get strange conflicts if id='edit'
+    __regid__ = 'muledit' # XXX get strange conflicts if id='edit'
     __select__ = (match_search_state('normal') &
                   two_lines_rset() & one_etype_rset() &
                   has_permission('update'))
@@ -150,7 +150,7 @@
 # generic "more" actions #######################################################
 
 class ManagePermissionsAction(Action):
-    id = 'managepermission'
+    __regid__ = 'managepermission'
     __select__ = one_line_rset() & non_final_entity() & match_user_groups('managers')
 
     title = _('manage permissions')
@@ -171,7 +171,7 @@
 
 
 class DeleteAction(Action):
-    id = 'delete'
+    __regid__ = 'delete'
     __select__ = has_permission('delete')
 
     title = _('delete')
@@ -186,7 +186,7 @@
 
 
 class CopyAction(Action):
-    id = 'copy'
+    __regid__ = 'copy'
     __select__ = one_line_rset() & has_permission('add')
 
     title = _('copy')
@@ -202,7 +202,7 @@
     """when we're seeing more than one entity with the same type, propose to
     add a new one
     """
-    id = 'addentity'
+    __regid__ = 'addentity'
     __select__ = (match_search_state('normal') &
                   (addable_etype_empty_rset()
                    | (two_lines_rset() & one_etype_rset & has_add_permission()))
@@ -227,7 +227,7 @@
 
 class AddRelatedActions(Action):
     """fill 'addrelated' sub-menu of the actions box"""
-    id = 'addrelated'
+    __regid__ = 'addrelated'
     __select__ = Action.__select__ & one_line_rset() & non_final_entity()
 
     submenu = _('addrelated')
@@ -293,7 +293,7 @@
 # logged user actions #########################################################
 
 class UserPreferencesAction(Action):
-    id = 'myprefs'
+    __regid__ = 'myprefs'
     __select__ = authenticated_user()
 
     title = _('user preferences')
@@ -305,7 +305,7 @@
 
 
 class UserInfoAction(Action):
-    id = 'myinfos'
+    __regid__ = 'myinfos'
     __select__ = authenticated_user()
 
     title = _('personnal informations')
@@ -317,7 +317,7 @@
 
 
 class LogoutAction(Action):
-    id = 'logout'
+    __regid__ = 'logout'
     __select__ = authenticated_user()
 
     title = _('logout')
@@ -341,21 +341,21 @@
 
 
 class SiteConfigurationAction(ManagersAction):
-    id = 'siteconfig'
+    __regid__ = 'siteconfig'
     title = _('site configuration')
     order = 10
 
 
 class ManageAction(ManagersAction):
-    id = 'manage'
+    __regid__ = 'manage'
     title = _('manage')
     order = 20
 
 class SiteInfoAction(ManagersAction):
-    id = 'siteinfo'
+    __regid__ = 'siteinfo'
+    __select__ = match_user_groups('users','managers')
     title = _('info')
     order = 30
-    __select__ = match_user_groups('users','managers')
 
 
 from logilab.common.deprecation import class_moved
--- a/web/views/ajaxedit.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/ajaxedit.py	Wed Sep 23 09:54:25 2009 +0200
@@ -19,10 +19,10 @@
     class attributes.
     """
     __registry__ = 'views'
+    __regid__ = 'xaddrelation'
     __select__ = (match_form_params('rtype', 'target')
                   | match_kwargs('rtype', 'target'))
     cw_property_defs = {} # don't want to inherit this from Box
-    id = 'xaddrelation'
     expected_kwargs = form_params = ('rtype', 'target')
 
     build_js = EditRelationBoxTemplate.build_reload_js_call
--- a/web/views/basecomponents.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/basecomponents.py	Wed Sep 23 09:54:25 2009 +0200
@@ -29,7 +29,7 @@
 
 class RQLInputForm(component.Component):
     """build the rql input form, usually displayed in the header"""
-    id = 'rqlinput'
+    __regid__ = 'rqlinput'
     cw_property_defs = VISIBLE_PROP_DEF
     visible = False
 
@@ -59,7 +59,7 @@
 
 class ApplLogo(component.Component):
     """build the instance logo, usually displayed in the header"""
-    id = 'logo'
+    __regid__ = 'logo'
     cw_property_defs = VISIBLE_PROP_DEF
     # don't want user to hide this component using an cwproperty
     site_wide = True
@@ -71,7 +71,7 @@
 
 class ApplHelp(component.Component):
     """build the help button, usually displayed in the header"""
-    id = 'help'
+    __regid__ = 'help'
     cw_property_defs = VISIBLE_PROP_DEF
     def call(self):
         self.w(u'<a href="%s" class="help" title="%s">&#160;</a>'
@@ -86,7 +86,7 @@
     cw_property_defs = VISIBLE_PROP_DEF
     # don't want user to hide this component using an cwproperty
     site_wide = True
-    id = 'loggeduserlink'
+    __regid__ = 'loggeduserlink'
 
     def call(self):
         if not self.req.cnx.anonymous_connection:
@@ -123,7 +123,7 @@
     section
     """
     __select__ = yes()
-    id = 'applmessages'
+    __regid__ = 'applmessages'
     # don't want user to hide this component using an cwproperty
     cw_property_defs = {}
 
@@ -140,7 +140,7 @@
 
 class ApplicationName(component.Component):
     """display the instance name"""
-    id = 'appliname'
+    __regid__ = 'appliname'
     cw_property_defs = VISIBLE_PROP_DEF
     # don't want user to hide this component using an cwproperty
     site_wide = True
@@ -154,7 +154,7 @@
 
 class SeeAlsoVComponent(component.RelatedObjectsVComponent):
     """display any entity's see also"""
-    id = 'seealso'
+    __regid__ = 'seealso'
     context = 'navcontentbottom'
     rtype = 'see_also'
     role = 'subject'
@@ -168,7 +168,7 @@
     """displays the list of entity types contained in the resultset
     to be able to filter accordingly.
     """
-    id = 'etypenavigation'
+    __regid__ = 'etypenavigation'
     __select__ = two_etypes_rset() | match_form_params('__restrtype', '__restrtypes',
                                                        '__restrrql')
     cw_property_defs = VISIBLE_PROP_DEF
@@ -216,7 +216,7 @@
         self.w(u'</div>')
 
 class PdfViewComponent(component.Component):
-    id = 'pdfview'
+    __regid__ = 'pdfview'
     __select__ = yes()
 
     context = 'header'
--- a/web/views/basecontrollers.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/basecontrollers.py	Wed Sep 23 09:54:25 2009 +0200
@@ -64,7 +64,7 @@
 
 
 class LoginController(Controller):
-    id = 'login'
+    __regid__ = 'login'
 
     def publish(self, rset=None):
         """log in the instance"""
@@ -77,7 +77,7 @@
 
 
 class LogoutController(Controller):
-    id = 'logout'
+    __regid__ = 'logout'
 
     def publish(self, rset=None):
         """logout from the instance"""
@@ -89,7 +89,7 @@
     - build result set
     - select and call main template
     """
-    id = 'view'
+    __regid__ = 'view'
     template = 'main-template'
 
     def publish(self, rset=None):
@@ -208,7 +208,7 @@
 
 
 class FormValidatorController(Controller):
-    id = 'validateform'
+    __regid__ = 'validateform'
 
     def response(self, domid, status, args, entity):
         callback = str(self.req.form.get('__onsuccess', 'null'))
@@ -232,7 +232,7 @@
 
 
 class JSonController(Controller):
-    id = 'json'
+    __regid__ = 'json'
 
     def publish(self, rset=None):
         """call js_* methods. Expected form keys:
@@ -539,7 +539,7 @@
 
 
 class SendMailController(Controller):
-    id = 'sendmail'
+    __regid__ = 'sendmail'
     __select__ = match_user_groups('managers', 'users')
 
     def recipients(self):
@@ -588,7 +588,7 @@
 
 
 class MailBugReportController(SendMailController):
-    id = 'reportbug'
+    __regid__ = 'reportbug'
     __select__ = yes()
 
     def publish(self, rset=None):
--- a/web/views/basetemplates.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/basetemplates.py	Wed Sep 23 09:54:25 2009 +0200
@@ -43,7 +43,7 @@
 
 
 class LogInTemplate(LogInOutTemplate):
-    id = 'login'
+    __regid__ = 'login'
     title = 'log in'
 
     def content(self, w):
@@ -51,7 +51,7 @@
 
 
 class LoggedOutTemplate(LogInOutTemplate):
-    id = 'loggedout'
+    __regid__ = 'loggedout'
     title = 'logged out'
 
     def content(self, w):
@@ -78,7 +78,7 @@
 
 class NonTemplatableViewTemplate(MainTemplate):
     """main template for any non templatable views (xml, binaries, etc.)"""
-    id = 'main-template'
+    __regid__ = 'main-template'
     __select__ = ~templatable_view()
 
     def call(self, view):
@@ -101,7 +101,7 @@
 
     - call header / footer templates
     """
-    id = 'main-template'
+    __regid__ = 'main-template'
     __select__ = templatable_view()
 
     def call(self, view):
@@ -193,7 +193,7 @@
     main template. This template may be called for authentication error,
     which means that req.cnx and req.user may not be set.
     """
-    id = 'error-template'
+    __regid__ = 'error-template'
 
     def call(self):
         """display an unexpected error"""
@@ -222,7 +222,7 @@
 
 class SimpleMainTemplate(TheMainTemplate):
 
-    id = 'main-no-top'
+    __regid__ = 'main-no-top'
 
     def template_header(self, content_type, view=None, page_title='', additional_headers=()):
         page_title = page_title or view.page_title()
@@ -273,7 +273,7 @@
     from cubicweb.ext.xhtml2fo import ReportTransformer
 
     class PdfMainTemplate(TheMainTemplate):
-        id = 'pdf-main-template'
+        __regid__ = 'pdf-main-template'
 
         def call(self, view):
             """build the standard view, then when it's all done, convert xhtml to pdf
@@ -308,7 +308,7 @@
 
 class HTMLHeader(View):
     """default html headers"""
-    id = 'htmlheader'
+    __regid__ = 'htmlheader'
 
     def call(self, **kwargs):
         self.favicon()
@@ -352,7 +352,7 @@
 
 class HTMLPageHeader(View):
     """default html page header"""
-    id = 'header'
+    __regid__ = 'header'
     main_cell_components = ('appliname', 'breadcrumbs')
 
     def call(self, view, **kwargs):
@@ -419,7 +419,7 @@
 class HTMLPageFooter(View):
     """default html page footer: include logo if any, and close the HTML body
     """
-    id = 'footer'
+    __regid__ = 'footer'
 
     def call(self, **kwargs):
         req = self.req
@@ -440,7 +440,7 @@
     * include message component if selectable for this request
     * include selectable content navigation components
     """
-    id = 'contentheader'
+    __regid__ = 'contentheader'
 
     def call(self, view, **kwargs):
         """by default, display informal messages in content header"""
@@ -457,7 +457,7 @@
     """default html page content footer: include selectable content navigation
     components
     """
-    id = 'contentfooter'
+    __regid__ = 'contentfooter'
 
     def call(self, view, **kwargs):
         components = self.vreg['contentnavigation'].poss_visible_objects(
@@ -470,7 +470,7 @@
 
 
 class LogFormTemplate(View):
-    id = 'logform'
+    __regid__ = 'logform'
     __select__ = match_kwargs('id', 'klass')
 
     title = 'log in'
--- a/web/views/baseviews.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/baseviews.py	Wed Sep 23 09:54:25 2009 +0200
@@ -30,7 +30,7 @@
 
 class NullView(AnyRsetView):
     """default view when no result has been found"""
-    id = 'null'
+    __regid__ = 'null'
     __select__ = yes()
     def call(self, **kwargs):
         pass
@@ -40,7 +40,7 @@
 class NoResultView(View):
     """default view when no result has been found"""
     __select__ = empty_rset()
-    id = 'noresult'
+    __regid__ = 'noresult'
 
     def call(self, **kwargs):
         self.w(u'<div class="searchMessage"><strong>%s</strong></div>\n'
@@ -51,7 +51,7 @@
     """display values without any transformation (i.e. get a number for
     entities)
     """
-    id = 'final'
+    __regid__ = 'final'
     # record generated i18n catalog messages
     _('%d&#160;years')
     _('%d&#160;months')
@@ -112,7 +112,7 @@
 
 # XXX deprecated
 class SecondaryView(EntityView):
-    id = 'secondary'
+    __regid__ = 'secondary'
     title = _('secondary')
 
     def cell_call(self, row, col):
@@ -125,7 +125,7 @@
 
 
 class OneLineView(EntityView):
-    id = 'oneline'
+    __regid__ = 'oneline'
     title = _('oneline')
 
     def cell_call(self, row, col):
@@ -139,7 +139,7 @@
 
 class TextView(EntityView):
     """the simplest text view for an entity"""
-    id = 'text'
+    __regid__ = 'text'
     title = _('text')
     content_type = 'text/plain'
 
@@ -166,7 +166,7 @@
 
 class MetaDataView(EntityView):
     """paragraph view of some metadata"""
-    id = 'metadata'
+    __regid__ = 'metadata'
     show_eid = True
 
     def cell_call(self, row, col):
@@ -191,7 +191,7 @@
 
 
 class InContextTextView(TextView):
-    id = 'textincontext'
+    __regid__ = 'textincontext'
     title = None # not listed as a possible view
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
@@ -199,7 +199,7 @@
 
 
 class OutOfContextTextView(InContextTextView):
-    id = 'textoutofcontext'
+    __regid__ = 'textoutofcontext'
 
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
@@ -207,7 +207,7 @@
 
 
 class InContextView(EntityView):
-    id = 'incontext'
+    __regid__ = 'incontext'
 
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
@@ -220,7 +220,7 @@
 
 
 class OutOfContextView(EntityView):
-    id = 'outofcontext'
+    __regid__ = 'outofcontext'
 
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
@@ -235,7 +235,7 @@
 # list views ##################################################################
 
 class ListView(EntityView):
-    id = 'list'
+    __regid__ = 'list'
     title = _('list')
     item_vid = 'listitem'
 
@@ -269,7 +269,7 @@
 
 
 class ListItemView(EntityView):
-    id = 'listitem'
+    __regid__ = 'listitem'
 
     @property
     def redirect_vid(self):
@@ -290,13 +290,13 @@
 
 class SimpleListView(ListItemView):
     """list without bullets"""
-    id = 'simplelist'
+    __regid__ = 'simplelist'
     redirect_vid = 'incontext'
 
 
 class AdaptedListView(EntityView):
     """list of entities of the same type"""
-    id = 'adaptedlist'
+    __regid__ = 'adaptedlist'
     __select__ = EntityView.__select__ & one_etype_rset()
     item_vid = 'adaptedlistitem'
 
@@ -316,11 +316,11 @@
 
 
 class AdaptedListItemView(ListItemView):
-    id = 'adaptedlistitem'
+    __regid__ = 'adaptedlistitem'
 
 
 class CSVView(SimpleListView):
-    id = 'csv'
+    __regid__ = 'csv'
     redirect_vid = 'incontext'
 
     def call(self, **kwargs):
@@ -332,7 +332,7 @@
 
 
 class TreeItemView(ListItemView):
-    id = 'treeitem'
+    __regid__ = 'treeitem'
 
     def cell_call(self, row, col):
         self.wview('incontext', self.rset, row=row, col=col)
@@ -344,7 +344,7 @@
 
     XXX: finish me (fixed line width, fixed number of lines, CSS, etc.)
     """
-    id = 'tsearch'
+    __regid__ = 'tsearch'
 
     def cell_call(self, row, col, **kwargs):
         entity = self.complete_entity(row, col)
@@ -374,7 +374,7 @@
 
 class TooltipView(EntityView):
     """A entity view used in a tooltip"""
-    id = 'tooltip'
+    __regid__ = 'tooltip'
     def cell_call(self, row, col):
         self.wview('oneline', self.rset, row=row, col=col)
 
--- a/web/views/boxes.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/boxes.py	Wed Sep 23 09:54:25 2009 +0200
@@ -33,7 +33,7 @@
     box with all actions impacting the entity displayed: edit, copy, delete
     change state, add related entities
     """
-    id = 'edit_box'
+    __regid__ = 'edit_box'
     __select__ = BoxTemplate.__select__ & non_final_entity()
 
     title = _('actions')
@@ -106,7 +106,7 @@
 
 class SearchBox(BoxTemplate):
     """display a box with a simple search form"""
-    id = 'search_box'
+    __regid__ = 'search_box'
 
     visible = True # enabled by default
     title = _('search')
@@ -139,7 +139,7 @@
 
 class PossibleViewsBox(BoxTemplate):
     """display a box containing links to all possible views"""
-    id = 'possible_views_box'
+    __regid__ = 'possible_views_box'
     __select__ = BoxTemplate.__select__ & match_user_groups('users', 'managers')
 
     visible = False
@@ -162,7 +162,7 @@
 
 class StartupViewsBox(BoxTemplate):
     """display a box containing links to all startup views"""
-    id = 'startup_views_box'
+    __regid__ = 'startup_views_box'
     visible = False # disabled by default
     title = _('startup views')
     order = 70
@@ -181,7 +181,7 @@
 
 class SideBoxView(EntityView):
     """helper view class to display some entities in a sidebox"""
-    id = 'sidebox'
+    __regid__ = 'sidebox'
 
     def call(self, boxclass='sideBox', title=u''):
         """display a list of entities by calling their <item_vid> view"""
--- a/web/views/calendar.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/calendar.py	Wed Sep 23 09:54:25 2009 +0200
@@ -44,7 +44,7 @@
         content_type = 'text/calendar'
         title = _('iCalendar')
         templatable = False
-        id = 'ical'
+        __regid__ = 'ical'
 
         def call(self):
             ical = iCalendar()
@@ -71,7 +71,7 @@
 
     Does apply to ICalendarable compatible entities
     """
-    id = 'hcal'
+    __regid__ = 'hcal'
     __select__ = implements(ICalendarable)
     need_navigation = False
     title = _('hCalendar')
@@ -94,7 +94,7 @@
 
 
 class CalendarItemView(EntityView):
-    id = 'calendaritem'
+    __regid__ = 'calendaritem'
 
     def cell_call(self, row, col, dates=False):
         task = self.complete_entity(row)
@@ -106,7 +106,7 @@
                 self.w('<br/>to %s'%self.format_date(task.stop))
 
 class CalendarLargeItemView(CalendarItemView):
-    id = 'calendarlargeitem'
+    __regid__ = 'calendarlargeitem'
 
 
 class _TaskEntry(object):
@@ -129,7 +129,7 @@
 
 class OneMonthCal(EntityView):
     """At some point, this view will probably replace ampm calendars"""
-    id = 'onemonthcal'
+    __regid__ = 'onemonthcal'
     __select__ = implements(ICalendarable)
     need_navigation = False
     title = _('one month')
@@ -320,7 +320,7 @@
 
 class OneWeekCal(EntityView):
     """At some point, this view will probably replace ampm calendars"""
-    id = 'oneweekcal'
+    __regid__ = 'oneweekcal'
     __select__ = implements(ICalendarable)
     need_navigation = False
     title = _('one week')
--- a/web/views/csvexport.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/csvexport.py	Wed Sep 23 09:54:25 2009 +0200
@@ -33,7 +33,7 @@
 
 class CSVRsetView(CSVMixIn, AnyRsetView):
     """dumps raw result set in CSV"""
-    id = 'csvexport'
+    __regid__ = 'csvexport'
     title = _('csv export')
 
     def call(self):
@@ -64,7 +64,7 @@
     resultset. ('table' here only means empty lines separation between table
     contents)
     """
-    id = 'ecsvexport'
+    __regid__ = 'ecsvexport'
     title = _('csv entities export')
 
     def call(self):
--- a/web/views/cwproperties.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/cwproperties.py	Wed Sep 23 09:54:25 2009 +0200
@@ -65,7 +65,7 @@
 
 class SystemCWPropertiesForm(FormViewMixIn, StartupView):
     """site-wide properties edition form"""
-    id = 'systempropertiesform'
+    __regid__ = 'systempropertiesform'
     __select__ = none_rset() & match_user_groups('managers')
 
     title = _('site configuration')
@@ -227,7 +227,7 @@
 
 class CWPropertiesForm(SystemCWPropertiesForm):
     """user's preferences properties edition form"""
-    id = 'propertiesform'
+    __regid__ = 'propertiesform'
     __select__ = (
         (none_rset() & match_user_groups('users','managers'))
         | (one_line_rset() & match_user_groups('users') & is_user_prefs())
@@ -360,7 +360,7 @@
 
 class CWPropertiesFormRenderer(formrenderers.FormRenderer):
     """specific renderer for properties"""
-    id = 'cwproperties'
+    __regid__ = 'cwproperties'
 
     def open_form(self, form, values):
         err = '<div class="formsg"></div>'
--- a/web/views/cwuser.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/cwuser.py	Wed Sep 23 09:54:25 2009 +0200
@@ -17,7 +17,7 @@
 uicfg.primaryview_section.tag_attribute(('CWUser', 'login'), 'hidden')
 
 class UserPreferencesEntityAction(action.Action):
-    id = 'prefs'
+    __regid__ = 'prefs'
     __select__ = (one_line_rset() & implements('CWUser') &
                   match_user_groups('owners', 'managers'))
 
@@ -30,7 +30,7 @@
 
 
 class FoafView(EntityView):
-    id = 'foaf'
+    __regid__ = 'foaf'
     __select__ = implements('CWUser')
 
     title = _('foaf')
--- a/web/views/debug.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/debug.py	Wed Sep 23 09:54:25 2009 +0200
@@ -26,7 +26,7 @@
 
 
 class DebugView(StartupView):
-    id = 'debug'
+    __regid__ = 'debug'
     __select__ = none_rset() & match_user_groups('managers')
     title = _('server debug information')
 
@@ -60,3 +60,27 @@
             w(u'</ul>')
         else:
             w(u'<p>no web sessions found</p>')
+
+
+class RegistryView(StartupView):
+    __regid__ = 'registry'
+    __select__ = StartupView.__select__ & match_user_groups('managers')
+    title = _('registry')
+
+    def call(self, **kwargs):
+        """The default view representing the instance's management"""
+        self.w(u'<h1>%s</h1>' % _("Registry's content"))
+        keys = sorted(self.vreg)
+        self.w(u'<p>%s</p>\n' % ' - '.join('<a href="/_registry#%s">%s</a>'
+                                           % (key, key) for key in keys))
+        for key in keys:
+            self.w(u'<h2><a name="%s">%s</a></h2>' % (key,key))
+            items = self.vreg[key].items()
+            if items:
+                self.w(u'<table><tbody>')
+                for key, value in sorted(items):
+                    self.w(u'<tr><td>%s</td><td>%s</td></tr>'
+                           % (key, xml_escape(repr(value))))
+                self.w(u'</tbody></table>\n')
+            else:
+                self.w(u'<p>Empty</p>\n')
--- a/web/views/editcontroller.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/editcontroller.py	Wed Sep 23 09:54:25 2009 +0200
@@ -49,7 +49,7 @@
         return rql
 
 class EditController(ViewController):
-    id = 'edit'
+    __regid__ = 'edit'
 
     def publish(self, rset=None):
         """edit / create / copy / delete entity / relations"""
--- a/web/views/editforms.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/editforms.py	Wed Sep 23 09:54:25 2009 +0200
@@ -45,7 +45,7 @@
 
 
 class DeleteConfForm(forms.CompositeForm):
-    id = 'deleteconf'
+    __regid__ = 'deleteconf'
     __select__ = non_final_entity()
 
     domid = 'deleteconf'
@@ -70,7 +70,7 @@
 
 class DeleteConfFormView(FormViewMixIn, EntityView):
     """form used to confirm deletion of some entities"""
-    id = 'deleteconf'
+    __regid__ = 'deleteconf'
     title = _('delete')
     # don't use navigation, all entities asked to be deleted should be displayed
     # else we will only delete the displayed page
@@ -101,7 +101,7 @@
 
     (double-click on the field to see an appropriate edition widget).
     """
-    id = 'doreledit'
+    __regid__ = 'doreledit'
     __select__ = non_final_entity() & match_kwargs('rtype')
     # FIXME editableField class could be toggleable from userprefs
 
@@ -262,7 +262,7 @@
     """same as ClickAndEditFormView but checking if the view *should* be applied
     by checking uicfg configuration and composite relation property.
     """
-    id = 'reledit'
+    __regid__ = 'reledit'
 
     def should_edit_relation(self, entity, rschema, role, rvid):
         eschema = entity.e_schema
@@ -282,7 +282,7 @@
 
 class EditionFormView(FormViewMixIn, EntityView):
     """display primary entity edition form"""
-    id = 'edition'
+    __regid__ = 'edition'
     # add yes() so it takes precedence over deprecated views in baseforms,
     # though not baseforms based customized view
     __select__ = one_line_rset() & non_final_entity() & yes()
@@ -319,7 +319,7 @@
 
 class CreationFormView(EditionFormView):
     """display primary entity creation form"""
-    id = 'creation'
+    __regid__ = 'creation'
     __select__ = specified_etype_implements('Any') & yes()
 
     title = _('creation')
@@ -369,7 +369,7 @@
     """display primary entity creation form initialized with values from another
     entity
     """
-    id = 'copy'
+    __regid__ = 'copy'
     warning_message = _('Please note that this is only a shallow copy')
 
     def render_form(self, entity):
@@ -405,7 +405,7 @@
 
 
 class TableEditForm(forms.CompositeForm):
-    id = 'muledit'
+    __regid__ = 'muledit'
     domid = 'entityForm'
     onsubmit = "return validateForm('%s', null);" % domid
     form_buttons = [SubmitButton(_('validate modifications on selected items')),
@@ -425,7 +425,7 @@
 
 
 class TableEditFormView(FormViewMixIn, EntityView):
-    id = 'muledit'
+    __regid__ = 'muledit'
     __select__ = EntityView.__select__ & yes()
     title = _('multiple edit')
 
@@ -439,7 +439,7 @@
 
 
 class InlineEntityEditionFormView(FormViewMixIn, EntityView):
-    id = 'inline-edition'
+    __regid__ = 'inline-edition'
     __select__ = non_final_entity() & match_kwargs('peid', 'rtype')
     removejs = "removeInlinedEntity('%s', '%s', '%s')"
 
@@ -500,7 +500,7 @@
 
 
 class InlineEntityCreationFormView(InlineEntityEditionFormView):
-    id = 'inline-creation'
+    __regid__ = 'inline-creation'
     __select__ = (match_kwargs('peid', 'rtype')
                   & specified_etype_implements('Any'))
     removejs = "removeInlineForm('%s', '%s', '%s')"
--- a/web/views/editviews.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/editviews.py	Wed Sep 23 09:54:25 2009 +0200
@@ -27,7 +27,7 @@
     """view called by the edition view when the user asks to search for
     something to link to the edited eid
     """
-    id = 'search-associate'
+    __regid__ = 'search-associate'
     __select__ = (one_line_rset() & match_search_state('linksearch')
                   & non_final_entity())
 
@@ -58,7 +58,7 @@
 
 
 class OutOfContextSearch(EntityView):
-    id = 'outofcontext-search'
+    __regid__ = 'outofcontext-search'
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
         erset = entity.as_rset()
@@ -74,7 +74,7 @@
 
 
 class UnrelatedDivs(EntityView):
-    id = 'unrelateddivs'
+    __regid__ = 'unrelateddivs'
     __select__ = match_form_params('relation')
 
     def cell_call(self, row, col):
@@ -184,7 +184,7 @@
 
     THIS IS A TEXT VIEW. DO NOT HTML_ESCAPE
     """
-    id = 'combobox'
+    __regid__ = 'combobox'
     title = None
 
     def cell_call(self, row, col):
@@ -196,7 +196,7 @@
 
 class EditableFinalView(FinalView):
     """same as FinalView but enables inplace-edition when possible"""
-    id = 'editable-final'
+    __regid__ = 'editable-final'
 
     def cell_call(self, row, col, props=None):
         entity, rtype = self.rset.related_entity(row, col)
--- a/web/views/emailaddress.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/emailaddress.py	Wed Sep 23 09:54:25 2009 +0200
@@ -55,7 +55,7 @@
 
 class EmailAddressShortPrimaryView(EmailAddressPrimaryView):
     __select__ = implements('EmailAddress')
-    id = 'shortprimary'
+    __regid__ = 'shortprimary'
     title = None # hidden view
 
     def render_entity_attributes(self, entity):
@@ -85,7 +85,7 @@
     """A one line view that builds a user clickable URL for an email with
     'mailto:'"""
 
-    id = 'mailto'
+    __regid__ = 'mailto'
     __select__ = implements('EmailAddress')
 
     def cell_call(self, row, col, **kwargs):
--- a/web/views/embedding.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/embedding.py	Wed Sep 23 09:54:25 2009 +0200
@@ -29,7 +29,7 @@
 class ExternalTemplate(basetemplates.TheMainTemplate):
     """template embeding an external web pages into CubicWeb web interface
     """
-    id = 'external'
+    __regid__ = 'external'
 
     def call(self, body):
         # XXX fallback to HTML 4 mode when embeding ?
@@ -44,7 +44,7 @@
 
 
 class EmbedController(Controller):
-    id = 'embed'
+    __regid__ = 'embed'
     template = 'external'
 
     def publish(self, rset=None):
@@ -92,7 +92,7 @@
     """display an 'embed' link on entity implementing `embeded_url` method
     if the returned url match embeding configuration
     """
-    id = 'embed'
+    __regid__ = 'embed'
     __select__ = (one_line_rset() & match_search_state('normal')
                   & implements(IEmbedable)
                   & score_entity(entity_has_embedable_url))
--- a/web/views/error.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/error.py	Wed Sep 23 09:54:25 2009 +0200
@@ -11,7 +11,7 @@
 from cubicweb.view import StartupView
 
 class FourOhFour(StartupView):
-    id = '404'
+    __regid__ = '404'
 
     def call(self):
         _ = self.req._
@@ -19,7 +19,7 @@
 
 
 class ErrorOccured(StartupView):
-    id = '500'
+    __regid__ = '500'
 
     def call(self):
         _ = self.req._
--- a/web/views/facets.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/facets.py	Wed Sep 23 09:54:25 2009 +0200
@@ -29,7 +29,7 @@
 
 class FilterBox(BoxTemplate):
     """filter results of a query"""
-    id = 'filter_box'
+    __regid__ = 'filter_box'
     __select__ = (((non_final_entity() & two_lines_rset())
                    | contextview_selector()
                    ) & match_context_prop())
@@ -125,23 +125,23 @@
 # facets ######################################################################
 
 class CreatedByFacet(RelationFacet):
-    id = 'created_by-facet'
+    __regid__ = 'created_by-facet'
     rtype = 'created_by'
     target_attr = 'login'
 
 class InGroupFacet(RelationFacet):
-    id = 'in_group-facet'
+    __regid__ = 'in_group-facet'
     rtype = 'in_group'
     target_attr = 'name'
 
 class InStateFacet(RelationFacet):
-    id = 'in_state-facet'
+    __regid__ = 'in_state-facet'
     rtype = 'in_state'
     target_attr = 'name'
 
 # inherit from RelationFacet to benefit from its possible_values implementation
 class ETypeFacet(RelationFacet):
-    id = 'etype-facet'
+    __regid__ = 'etype-facet'
     __select__ = yes()
     order = 1
     rtype = 'is'
@@ -182,7 +182,7 @@
 
 class HasTextFacet(AbstractFacet):
     __select__ = relation_possible('has_text', 'subject') & match_context_prop()
-    id = 'has_text-facet'
+    __regid__ = 'has_text-facet'
     rtype = 'has_text'
     role = 'subject'
     order = 0
--- a/web/views/formrenderers.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/formrenderers.py	Wed Sep 23 09:54:25 2009 +0200
@@ -39,7 +39,7 @@
     +---------+
     """
     __registry__ = 'formrenderers'
-    id = 'default'
+    __regid__ = 'default'
 
     _options = ('display_fields', 'display_label', 'display_help',
                 'display_progress_div', 'table_class', 'button_bar_class',
@@ -244,7 +244,7 @@
     """use form_renderer_id = 'base' if you want base FormRenderer layout even
     when selected for an entity
     """
-    id = 'base'
+    __regid__ = 'base'
 
 
 class EntityBaseFormRenderer(BaseFormRenderer):
@@ -271,7 +271,7 @@
     | field1 input | field2 input | buttons
     +--------------+--------------+---------+
     """
-    id = 'htable'
+    __regid__ = 'htable'
 
     display_help = False
     def _render_fields(self, fields, w, form):
@@ -308,7 +308,7 @@
 
 class EntityCompositeFormRenderer(FormRenderer):
     """specific renderer for multiple entities edition form (muledit)"""
-    id = 'composite'
+    __regid__ = 'composite'
 
     _main_display_fields = None
 
@@ -368,7 +368,7 @@
 
 class EntityFormRenderer(EntityBaseFormRenderer):
     """specific renderer for entity edition form (edition)"""
-    id = 'default'
+    __regid__ = 'default'
     # needs some additional points in some case (XXX explain cases)
     __select__ = EntityBaseFormRenderer.__select__ & yes()
 
@@ -528,7 +528,7 @@
     """specific renderer for entity inlined edition form
     (inline-[creation|edition])
     """
-    id = 'inline'
+    __regid__ = 'inline'
 
     def render(self, form, values):
         form.add_media()
--- a/web/views/forms.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/forms.py	Wed Sep 23 09:54:25 2009 +0200
@@ -54,7 +54,7 @@
 
     * `fieldsets_in_order`: fieldset name sequence, to control order
     """
-    id = 'base'
+    __regid__ = 'base'
 
     is_subform = False
     internal_fields = ('__errorurl',) + NAV_FORM_PARAMETERS
@@ -291,7 +291,7 @@
 
 
 class EntityFieldsForm(FieldsForm):
-    id = 'base'
+    __regid__ = 'base'
     __select__ = (match_kwargs('entity')
                   | (one_line_rset() & non_final_entity()))
 
@@ -557,7 +557,7 @@
 
 class CompositeForm(FieldsForm):
     """form composed of sub-forms"""
-    id = 'composite'
+    __regid__ = 'composite'
     form_renderer_id = id
 
     def __init__(self, *args, **kwargs):
@@ -572,7 +572,7 @@
 
 class CompositeEntityForm(EntityFieldsForm):
     """form composed of sub-forms"""
-    id = 'composite'
+    __regid__ = 'composite'
     form_renderer_id = id
 
     def __init__(self, *args, **kwargs):
--- a/web/views/ibreadcrumbs.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/ibreadcrumbs.py	Wed Sep 23 09:54:25 2009 +0200
@@ -20,7 +20,7 @@
 
 
 class BreadCrumbEntityVComponent(Component):
-    id = 'breadcrumbs'
+    __regid__ = 'breadcrumbs'
     __select__ = one_line_rset() & implements(IBreadCrumbs)
 
     property_defs = {
@@ -94,7 +94,7 @@
 
 
 class BreadCrumbView(EntityView):
-    id = 'breadcrumbs'
+    __regid__ = 'breadcrumbs'
 
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
@@ -105,7 +105,7 @@
 
 
 class BreadCrumbTextView(EntityView):
-    id = 'breadcrumbtext'
+    __regid__ = 'breadcrumbtext'
 
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
--- a/web/views/idownloadable.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/idownloadable.py	Wed Sep 23 09:54:25 2009 +0200
@@ -42,7 +42,7 @@
 
 
 class DownloadBox(EntityBoxTemplate):
-    id = 'download_box'
+    __regid__ = 'download_box'
     # no download box for images
     # XXX primary_view selector ?
     __select__ = (one_line_rset() & implements(IDownloadable) &
@@ -58,7 +58,7 @@
     """this view is replacing the deprecated 'download' controller and allow
     downloading of entities providing the necessary interface
     """
-    id = 'download'
+    __regid__ = 'download'
     __select__ = one_line_rset() & implements(IDownloadable)
 
     templatable = False
@@ -85,7 +85,7 @@
 
 class DownloadLinkView(EntityView):
     """view displaying a link to download the file"""
-    id = 'downloadlink'
+    __regid__ = 'downloadlink'
     __select__ = implements(IDownloadable)
     title = None # should not be listed in possible views
 
@@ -132,7 +132,7 @@
 
 
 class ImageView(EntityView):
-    id = 'image'
+    __regid__ = 'image'
     __select__ = implements(IDownloadable) & score_entity(is_image)
 
     title = _('image')
--- a/web/views/igeocodable.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/igeocodable.py	Wed Sep 23 09:54:25 2009 +0200
@@ -14,13 +14,13 @@
 from cubicweb.selectors import implements
 
 class GeocodingJsonView(EntityView):
-    id = 'geocoding-json'
+    __regid__ = 'geocoding-json'
+    __select__ = implements(IGeocodable)
+
     binary = True
     templatable = False
     content_type = 'application/json'
 
-    __select__ = implements(IGeocodable)
-
     def call(self):
         # remove entities that don't define latitude and longitude
         self.rset = self.rset.filtered_rset(lambda e: e.latitude and e.longitude)
@@ -57,8 +57,7 @@
 
 
 class GoogleMapBubbleView(EntityView):
-    id = 'gmap-bubble'
-
+    __regid__ = 'gmap-bubble'
     __select__ = implements(IGeocodable)
 
     def cell_call(self, row, col):
@@ -68,9 +67,9 @@
 
 
 class GoogleMapsView(EntityView):
-    id = 'gmap-view'
+    __regid__ = 'gmap-view'
+    __select__ = implements(IGeocodable)
 
-    __select__ = implements(IGeocodable)
     need_navigation = False
 
     def call(self, gmap_key, width=400, height=400, uselabel=True, urlparams=None):
@@ -91,7 +90,7 @@
 
 
 class GoogeMapsLegend(EntityView):
-    id = 'gmap-legend'
+    __regid__ = 'gmap-legend'
 
     def call(self):
         self.w(u'<ol>')
--- a/web/views/iprogress.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/iprogress.py	Wed Sep 23 09:54:25 2009 +0200
@@ -34,7 +34,7 @@
     header_for_COLNAME methods allow to customize header's label
     """
 
-    id = 'progress_table_view'
+    __regid__ = 'progress_table_view'
     title = _('task progression')
     __select__ = implements(IMileStone)
 
@@ -165,7 +165,7 @@
     """this views redirects to ``progress_table_view`` but removes
     the ``project`` column
     """
-    id = 'ic_progress_table_view'
+    __regid__ = 'ic_progress_table_view'
 
     def call(self, columns=None):
         view = self.vreg['views'].select('progress_table_view', self.req,
@@ -180,7 +180,7 @@
 
 class ProgressBarView(EntityView):
     """displays a progress bar"""
-    id = 'progressbar'
+    __regid__ = 'progressbar'
     title = _('progress bar')
     __select__ = implements(IProgress)
 
--- a/web/views/isioc.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/isioc.py	Wed Sep 23 09:54:25 2009 +0200
@@ -14,7 +14,7 @@
 from cubicweb.interfaces import ISiocItem, ISiocContainer
 
 class SIOCView(EntityView):
-    id = 'sioc'
+    __regid__ = 'sioc'
     __select__ = EntityView.__select__ & implements(ISiocItem, ISiocContainer)
     title = _('sioc')
     templatable = False
@@ -38,7 +38,7 @@
         self.wview('sioc_element', self.rset, row=row, col=col)
 
 class SIOCContainerView(EntityView):
-    id = 'sioc_element'
+    __regid__ = 'sioc_element'
     __select__ = EntityView.__select__ & implements(ISiocContainer)
     templatable = False
     content_type = 'text/xml'
@@ -59,7 +59,7 @@
 
 
 class SIOCItemView(EntityView):
-    id = 'sioc_element'
+    __regid__ = 'sioc_element'
     __select__ = EntityView.__select__ & implements(ISiocItem)
     templatable = False
     content_type = 'text/xml'
--- a/web/views/magicsearch.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/magicsearch.py	Wed Sep 23 09:54:25 2009 +0200
@@ -15,7 +15,7 @@
 from rql import RQLSyntaxError, BadRQLQuery, parse
 from rql.nodes import Relation
 
-from cubicweb import Unauthorized
+from cubicweb import Unauthorized, typed_eid
 from cubicweb.view import Component
 
 LOGGER = getLogger('cubicweb.magicsearch')
@@ -135,7 +135,7 @@
 
 class BaseQueryProcessor(Component):
     __abstract__ = True
-    id = 'magicsearch_processor'
+    __regid__ = 'magicsearch_processor'
     # set something if you want explicit component search facility for the
     # component
     name = None
@@ -239,7 +239,7 @@
         """
         # if this is an integer, then directly go to eid
         try:
-            eid = int(word)
+            eid = typed_eid(word)
             return 'Any X WHERE X eid %(x)s', {'x': eid}, 'x'
         except ValueError:
             etype = self._get_entity_type(word)
--- a/web/views/management.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/management.py	Wed Sep 23 09:54:25 2009 +0200
@@ -67,7 +67,7 @@
 
 class SecurityManagementView(EntityView, SecurityViewMixIn):
     """display security information for a given entity"""
-    id = 'security'
+    __regid__ = 'security'
     __select__ = EntityView.__select__ & authenticated_user()
 
     title = _('security')
@@ -191,7 +191,7 @@
 class ErrorView(AnyRsetView):
     """default view when no result has been found"""
     __select__ = yes()
-    id = 'error'
+    __regid__ = 'error'
 
     def page_title(self):
         """returns a title according to the result set - used for the
@@ -274,7 +274,7 @@
 
 
 class ProcessInformationView(StartupView):
-    id = 'info'
+    __regid__ = 'info'
     __select__ = none_rset() & match_user_groups('users', 'managers')
 
     title = _('server information')
--- a/web/views/massmailing.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/massmailing.py	Wed Sep 23 09:54:25 2009 +0200
@@ -22,7 +22,7 @@
 
 
 class SendEmailAction(Action):
-    id = 'sendemail'
+    __regid__ = 'sendemail'
     # XXX should check email is set as well
     __select__ = implements(IEmailable) & match_user_groups('managers', 'users')
 
@@ -38,7 +38,7 @@
 
 
 class MassMailingForm(forms.FieldsForm):
-    id = 'massmailing'
+    __regid__ = 'massmailing'
 
     sender = StringField(widget=TextInput({'disabled': 'disabled'}), label=_('From:'))
     recipient = StringField(widget=CheckBox(), label=_('Recipients:'))
@@ -82,7 +82,7 @@
 
 
 class MassMailingFormRenderer(formrenderers.FormRenderer):
-    id = 'massmailing'
+    __regid__ = 'massmailing'
     button_bar_class = u'toolbar'
 
     def _render_fields(self, fields, w, form):
@@ -118,7 +118,7 @@
         pass
 
 class MassMailingFormView(FormViewMixIn, EntityView):
-    id = 'massmailing'
+    __regid__ = 'massmailing'
     __select__ = implements(IEmailable) & match_user_groups('managers', 'users')
 
     def call(self):
--- a/web/views/navigation.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/navigation.py	Wed Sep 23 09:54:25 2009 +0200
@@ -177,7 +177,7 @@
 View.paginate = paginate
 
 class NextPrevNavigationComponent(EntityVComponent):
-    id = 'prevnext'
+    __regid__ = 'prevnext'
     # register msg not generated since no entity implements IPrevNext in cubicweb
     # itself
     title = _('contentnavigation_prevnext')
--- a/web/views/old_calendar.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/old_calendar.py	Wed Sep 23 09:54:25 2009 +0200
@@ -162,7 +162,7 @@
 
 
 class YearCalendarView(_CalendarView):
-    id = 'calendaryear'
+    __regid__ = 'calendaryear'
     title = _('calendar (year)')
 
     def call(self, year=None, month=None):
@@ -181,7 +181,7 @@
     """this view renders three semesters as three rows of six columns,
     one column per month
     """
-    id = 'calendarsemester'
+    __regid__ = 'calendarsemester'
     title = _('calendar (semester)')
 
     def call(self, year=None, month=None):
@@ -229,7 +229,7 @@
 
 class MonthCalendarView(_CalendarView):
     """this view renders a 3x1 calendars' table"""
-    id = 'calendarmonth'
+    __regid__ = 'calendarmonth'
     title = _('calendar (month)')
 
     def call(self, year=None, month=None):
@@ -246,7 +246,7 @@
 
 class WeekCalendarView(_CalendarView):
     """this view renders a calendar for week events"""
-    id = 'calendarweek'
+    __regid__ = 'calendarweek'
     title = _('calendar (week)')
 
     def call(self, year=None, week=None):
@@ -303,7 +303,7 @@
 
 
 class AMPMYearCalendarView(YearCalendarView):
-    id = 'ampmcalendaryear'
+    __regid__ = 'ampmcalendaryear'
     title = _('am/pm calendar (year)')
 
     def build_calendar(self, schedule, first_day):
@@ -357,7 +357,7 @@
 
 class AMPMSemesterCalendarView(SemesterCalendarView):
     """this view renders a 3x1 calendars' table"""
-    id = 'ampmcalendarsemester'
+    __regid__ = 'ampmcalendarsemester'
     title = _('am/pm calendar (semester)')
 
     def build_calendars(self, schedule, begin, end):
@@ -394,7 +394,7 @@
 
 class AMPMMonthCalendarView(MonthCalendarView):
     """this view renders a 3x1 calendars' table"""
-    id = 'ampmcalendarmonth'
+    __regid__ = 'ampmcalendarmonth'
     title = _('am/pm calendar (month)')
 
     def build_calendar(self, schedule, first_day):
@@ -450,7 +450,7 @@
 
 class AMPMWeekCalendarView(WeekCalendarView):
     """this view renders a 3x1 calendars' table"""
-    id = 'ampmcalendarweek'
+    __regid__ = 'ampmcalendarweek'
     title = _('am/pm calendar (week)')
 
     def build_calendar(self, schedule, weeks):
--- a/web/views/owl.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/owl.py	Wed Sep 23 09:54:25 2009 +0200
@@ -58,7 +58,7 @@
 
 class OWLView(StartupView):
     """This view export in owl format schema database. It is the TBOX"""
-    id = 'owl'
+    __regid__ = 'owl'
     title = _('owl')
     templatable = False
     content_type = 'application/xml' # 'text/xml'
@@ -145,7 +145,7 @@
 
 class OWLABOXView(EntityView):
     '''This view represents a part of the ABOX for a given entity.'''
-    id = 'owlabox'
+    __regid__ = 'owlabox'
     title = _('owlabox')
     templatable = False
     content_type = 'application/xml' # 'text/xml'
@@ -162,7 +162,7 @@
 
 class OWLABOXItemView(EntityView):
     '''This view represents a part of the ABOX for a given entity.'''
-    id = 'owlaboxitem'
+    __regid__ = 'owlaboxitem'
     templatable = False
     content_type = 'application/xml' # 'text/xml'
 
@@ -201,7 +201,7 @@
 
 
 class DownloadOWLSchemaAction(Action):
-    id = 'download_as_owl'
+    __regid__ = 'download_as_owl'
     __select__ = none_rset() & match_view('schema')
 
     category = 'mainactions'
--- a/web/views/primary.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/primary.py	Wed Sep 23 09:54:25 2009 +0200
@@ -20,7 +20,7 @@
 
 class PrimaryView(EntityView):
     """the full view of an non final entity"""
-    id = 'primary'
+    __regid__ = 'primary'
     title = _('primary')
     show_attr_label = True
     show_rel_label = True
@@ -204,7 +204,7 @@
 
 
 class RelatedView(EntityView):
-    id = 'autolimited'
+    __regid__ = 'autolimited'
     def call(self, title=None, **kwargs):
         # if not too many entities, show them all in a list
         maxrelated = self.req.property_value('navigation.related-limit')
--- a/web/views/pyviews.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/pyviews.py	Wed Sep 23 09:54:25 2009 +0200
@@ -11,7 +11,7 @@
 from cubicweb.selectors import match_kwargs
 
 class PyValTableView(View):
-    id = 'pyvaltable'
+    __regid__ = 'pyvaltable'
     __select__ = match_kwargs('pyvalue')
 
     def call(self, pyvalue, headers=None):
@@ -32,7 +32,7 @@
 
 
 class PyValListView(View):
-    id = 'pyvallist'
+    __regid__ = 'pyvallist'
     __select__ = match_kwargs('pyvalue')
 
     def call(self, pyvalue):
--- a/web/views/schema.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/schema.py	Wed Sep 23 09:54:25 2009 +0200
@@ -37,7 +37,7 @@
 # global schema view ###########################################################
 
 class SchemaView(tabs.TabsMixin, StartupView):
-    id = 'schema'
+    __regid__ = 'schema'
     title = _('instance schema')
     tabs = [_('schema-text'), _('schema-image')]
     default_tab = 'schema-text'
@@ -51,7 +51,7 @@
 
 
 class SchemaTabImageView(StartupView):
-    id = 'schema-image'
+    __regid__ = 'schema-image'
 
     def call(self):
         self.w(_(u'<div>This schema of the data model <em>excludes</em> the '
@@ -64,7 +64,7 @@
 
 
 class SchemaTabTextView(StartupView):
-    id = 'schema-text'
+    __regid__ = 'schema-text'
 
     def call(self):
         rset = self.req.execute('Any X ORDERBY N WHERE X is CWEType, X name N, '
@@ -73,7 +73,7 @@
 
 
 class ManagerSchemaPermissionsView(StartupView, management.SecurityViewMixIn):
-    id = 'schema-security'
+    __regid__ = 'schema-security'
     __select__ = StartupView.__select__ & match_user_groups('managers')
 
     def call(self, display_relations=True):
@@ -173,7 +173,7 @@
 
 
 class SchemaUreportsView(StartupView):
-    id = 'schema-block'
+    __regid__ = 'schema-block'
 
     def call(self):
         viewer = SchemaViewer(self.req)
@@ -224,7 +224,7 @@
 
 
 class CWETypeSTextView(EntityView):
-    id = 'cwetype-schema-text'
+    __regid__ = 'cwetype-schema-text'
     __select__ = EntityView.__select__ & implements('CWEType')
 
     def cell_call(self, row, col):
@@ -260,7 +260,7 @@
 
 
 class CWETypeSImageView(EntityView):
-    id = 'cwetype-schema-image'
+    __regid__ = 'cwetype-schema-image'
     __select__ = EntityView.__select__ & implements('CWEType')
 
     def cell_call(self, row, col):
@@ -272,7 +272,7 @@
 
 
 class CWETypeSPermView(EntityView):
-    id = 'cwetype-schema-permissions'
+    __regid__ = 'cwetype-schema-permissions'
     __select__ = EntityView.__select__ & implements('CWEType')
 
     def cell_call(self, row, col):
@@ -300,7 +300,7 @@
 
 
 class CWETypeSWorkflowView(EntityView):
-    id = 'cwetype-workflow'
+    __regid__ = 'cwetype-workflow'
     __select__ = (EntityView.__select__ & implements('CWEType') &
                   has_related_entities('workflow_of', 'object'))
 
@@ -372,7 +372,7 @@
 
 
 class SchemaImageView(TmpFileViewMixin, StartupView):
-    id = 'schemagraph'
+    __regid__ = 'schemagraph'
     content_type = 'image/png'
 
     def _generate(self, tmpfile):
@@ -384,7 +384,7 @@
 
 
 class CWETypeSchemaImageView(TmpFileViewMixin, EntityView):
-    id = 'schemagraph'
+    __regid__ = 'schemagraph'
     __select__ = implements('CWEType')
     content_type = 'image/png'
 
@@ -411,12 +411,12 @@
 # misc: facets, actions ########################################################
 
 class CWFinalFacet(facet.AttributeFacet):
-    id = 'cwfinal-facet'
+    __regid__ = 'cwfinal-facet'
     __select__ = facet.AttributeFacet.__select__ & implements('CWEType', 'CWRType')
     rtype = 'final'
 
 class ViewSchemaAction(action.Action):
-    id = 'schema'
+    __regid__ = 'schema'
     __select__ = yes()
 
     title = _("site schema")
--- a/web/views/sparql.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/sparql.py	Wed Sep 23 09:54:25 2009 +0200
@@ -23,7 +23,7 @@
     Sparql2rqlTranslator = None
 
 class SparqlForm(forms.FieldsForm):
-    id = 'sparql'
+    __regid__ = 'sparql'
     sparql = formfields.StringField(help=_('type here a sparql query'))
     resultvid = formfields.StringField(choices=((_('table'), 'table'),
                                                 (_('sparql xml'), 'sparqlxml')),
@@ -36,7 +36,7 @@
 
 
 class SparqlFormView(form.FormViewMixIn, StartupView):
-    id = 'sparql'
+    __regid__ = 'sparql'
     def call(self):
         form = self.vreg.select('forms', 'sparql', self.req)
         self.w(form.form_render())
@@ -81,7 +81,7 @@
 class SparqlResultXmlView(AnyRsetView):
     """The spec can be found here: http://www.w3.org/TR/rdf-sparql-XMLres/
     """
-    id = 'sparqlxml'
+    __regid__ = 'sparqlxml'
     content_type = 'application/sparql-results+xml'
     templatable = False
 
--- a/web/views/startup.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/startup.py	Wed Sep 23 09:54:25 2009 +0200
@@ -18,7 +18,7 @@
 from cubicweb.web import ajax_replace_url, uicfg, httpcache
 
 class ManageView(StartupView):
-    id = 'manage'
+    __regid__ = 'manage'
     title = _('manage')
     http_cache_manager = httpcache.EtagHTTPCacheManager
 
@@ -140,31 +140,9 @@
 
 
 class IndexView(ManageView):
-    id = 'index'
+    __regid__ = 'index'
     title = _('view_index')
 
     def display_folders(self):
         return 'Folder' in self.schema and self.req.execute('Any COUNT(X) WHERE X is Folder')[0][0]
 
-
-class RegistryView(StartupView):
-    id = 'registry'
-    title = _('registry')
-    __select__ = StartupView.__select__ & match_user_groups('managers')
-
-    def call(self, **kwargs):
-        """The default view representing the instance's management"""
-        self.w(u'<h1>%s</h1>' % _("Registry's content"))
-        keys = sorted(self.vreg)
-        self.w(u'<p>%s</p>\n' % ' - '.join('<a href="/_registry#%s">%s</a>' % (key, key) for key in keys))
-        for key in keys:
-            self.w(u'<h2><a name="%s">%s</a></h2>' % (key,key))
-            items = self.vreg[key].items()
-            if items:
-                self.w(u'<table><tbody>')
-                for key, value in sorted(items):
-                    self.w(u'<tr><td>%s</td><td>%s</td></tr>' % (key, xml_escape(repr(value))))
-                self.w(u'</tbody></table>\n')
-            else:
-                self.w(u'<p>Empty</p>\n')
-
--- a/web/views/tableview.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/tableview.py	Wed Sep 23 09:54:25 2009 +0200
@@ -22,7 +22,7 @@
 from cubicweb.web.facet import prepare_facets_rqlst, filter_hiddens
 
 class TableView(AnyRsetView):
-    id = 'table'
+    __regid__ = 'table'
     title = _('table')
     finalview = 'final'
 
@@ -247,16 +247,15 @@
 
 
 class EditableTableView(TableView):
-    id = 'editable-table'
+    __regid__ = 'editable-table'
     finalview = 'editable-final'
     title = _('editable-table')
 
 
 class CellView(EntityView):
+    __regid__ = 'cell'
     __select__ = nonempty_rset()
 
-    id = 'cell'
-
     def cell_call(self, row, col, cellvid=None):
         """
         :param row, col: indexes locating the cell value in view's result set
@@ -287,7 +286,7 @@
     * the actual query (`actualrql` form parameter) whose results will be
       displayed with default restrictions set
     """
-    id = 'initialtable'
+    __regid__ = 'initialtable'
     __select__ = nonempty_rset() & match_form_params('actualrql')
     # should not be displayed in possible view since it expects some specific
     # parameters
@@ -325,5 +324,5 @@
 
 
 class EditableInitialTableTableView(InitialTableView):
-    id = 'editable-initialtable'
+    __regid__ = 'editable-initialtable'
     finalview = 'editable-final'
--- a/web/views/timeline.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/timeline.py	Wed Sep 23 09:54:25 2009 +0200
@@ -24,7 +24,7 @@
     NOTE: work in progress (image_url, bubbleUrl and so on
     should be properties of entity classes or subviews)
     """
-    id = 'timeline-json'
+    __regid__ = 'timeline-json'
     binary = True
     templatable = False
     content_type = 'application/json'
@@ -102,7 +102,7 @@
 
 class TimelineView(TimelineViewMixIn, EntityView):
     """builds a cubicweb timeline widget node"""
-    id = 'timeline'
+    __regid__ = 'timeline'
     title = _('timeline')
     __select__ = implements(ICalendarable)
     need_navigation = False
@@ -117,7 +117,7 @@
     """similar to `TimelineView` but loads data from a static
     JSON file instead of one after a RQL query.
     """
-    id = 'static-timeline'
+    __regid__ = 'static-timeline'
 
     def call(self, loadurl, tlunit=None, wdgclass=None):
         self.widget_class = wdgclass or self.widget_class
--- a/web/views/timetable.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/timetable.py	Wed Sep 23 09:54:25 2009 +0200
@@ -24,7 +24,7 @@
 MIN_COLS = 3  # minimum number of task columns for a single user
 
 class TimeTableView(AnyRsetView):
-    id = 'timetable'
+    __regid__ = 'timetable'
     title = _('timetable')
     __select__ = implements(ITimetableViews)
     need_navigation = False
--- a/web/views/treeview.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/treeview.py	Wed Sep 23 09:54:25 2009 +0200
@@ -20,7 +20,7 @@
     return str('%s-treestate' % treeid)
 
 class TreeView(EntityView):
-    id = 'treeview'
+    __regid__ = 'treeview'
     itemvid = 'treeitemview'
     subvid = 'oneline'
     css_classes = 'treeview widget'
@@ -74,7 +74,7 @@
 class FileTreeView(TreeView):
     """specific version of the treeview to display file trees
     """
-    id = 'filetree'
+    __regid__ = 'filetree'
     css_classes = 'treeview widget filetree'
     title = _('file tree view')
 
@@ -88,7 +88,7 @@
     This view adds an enclosing <span> with some specific CSS classes
     around the oneline view. This is needed by the jquery treeview plugin.
     """
-    id = 'filetree-oneline'
+    __regid__ = 'filetree-oneline'
 
     def cell_call(self, row, col):
         entity = self.rset.get_entity(row, col)
@@ -101,7 +101,7 @@
 
 class DefaultTreeViewItemView(EntityView):
     """default treeitem view for entities which don't implement ITree"""
-    id = 'treeitemview'
+    __regid__ = 'treeitemview'
 
     def cell_call(self, row, col, vid='oneline', parentvid='treeview', treeid=None):
         assert treeid is not None
@@ -118,9 +118,9 @@
 
     (each item should be expandable if it's not a tree leaf)
     """
-    id = 'treeitemview'
+    __regid__ = 'treeitemview'
+    __select__ = EntityView.__select__ & implements(ITree)
     default_branch_state_is_open = False
-    __select__ = EntityView.__select__ & implements(ITree)
 
     def open_state(self, eeid, treeid):
         cookies = self.req.get_cookie()
--- a/web/views/urlpublishing.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/urlpublishing.py	Wed Sep 23 09:54:25 2009 +0200
@@ -49,7 +49,7 @@
     lower priority.  The first evaluator returning a result or raising
     something else than `PathDontMatch` will stop the handlers chain.
     """
-    id = 'urlpublisher'
+    __regid__ = 'urlpublisher'
     vreg = None # XXX necessary until property for deprecation warning is on appobject
 
     def __init__(self, vreg, default_method='view'):
@@ -101,7 +101,7 @@
 
 class URLPathEvaluator(component.Component):
     __abstract__ = True
-    id = 'urlpathevaluator'
+    __regid__ = 'urlpathevaluator'
     vreg = None # XXX necessary until property for deprecation warning is on appobject
 
     def __init__(self, urlpublisher):
--- a/web/views/urlrewrite.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/urlrewrite.py	Wed Sep 23 09:54:25 2009 +0200
@@ -67,7 +67,7 @@
 
     If the input uri is a regexp, group substitution is allowed
     """
-    id = 'simple'
+    __regid__ = 'simple'
 
     rules = [
         ('/_', dict(vid='manage')),
@@ -179,7 +179,7 @@
     """Here, the rules dict maps regexps or plain strings to
     callbacks that will be called with (input, uri, req, schema)
     """
-    id = 'schemabased'
+    __regid__ = 'schemabased'
     rules = [
         # rgxp : callback
         (rgx('/search/(.+)'), build_rset(rql=r'Any X WHERE X has_text %(text)s',
--- a/web/views/wdoc.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/wdoc.py	Wed Sep 23 09:54:25 2009 +0200
@@ -87,7 +87,7 @@
 
 class InlineHelpView(StartupView):
     __select__ = match_form_params('fid')
-    id = 'wdoc'
+    __regid__ = 'wdoc'
     title = _('site documentation')
 
     def call(self):
@@ -163,7 +163,7 @@
 
 
 class InlineHelpImageView(StartupView):
-    id = 'wdocimages'
+    __regid__ = 'wdocimages'
     __select__ = match_form_params('fid')
     binary = True
     templatable = False
@@ -183,7 +183,7 @@
 
 
 class ChangeLogView(StartupView):
-    id = 'changelog'
+    __regid__ = 'changelog'
     title = _('What\'s new?')
     maxentries = 25
 
--- a/web/views/workflow.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/workflow.py	Wed Sep 23 09:54:25 2009 +0200
@@ -42,7 +42,7 @@
 # IWorkflowable views #########################################################
 
 class ChangeStateForm(forms.CompositeEntityForm):
-    id = 'changestate'
+    __regid__ = 'changestate'
 
     form_renderer_id = 'base' # don't want EntityFormRenderer
     form_buttons = [fwdgs.SubmitButton(stdmsgs.YES),
@@ -50,7 +50,7 @@
 
 
 class ChangeStateFormView(form.FormViewMixIn, view.EntityView):
-    id = 'statuschange'
+    __regid__ = 'statuschange'
     title = _('status change')
     __select__ = (one_line_rset() & implements(IWorkflowable)
                   & match_form_params('treid'))
@@ -88,7 +88,7 @@
 
 
 class WFHistoryView(EntityView):
-    id = 'wfhistory'
+    __regid__ = 'wfhistory'
     __select__ = relation_possible('wf_info_for', role='object')
     title = _('Workflow history')
 
@@ -121,7 +121,7 @@
 
 class WFHistoryVComponent(component.EntityVComponent):
     """display the workflow history for entities supporting it"""
-    id = 'wfhistory'
+    __regid__ = 'wfhistory'
     __select__ = WFHistoryView.__select__ & component.EntityVComponent.__select__
     context = 'navcontentbottom'
     title = _('Workflow history')
@@ -134,7 +134,7 @@
 
 class WorkflowActions(action.Action):
     """fill 'workflow' sub-menu of the actions box"""
-    id = 'workflow'
+    __regid__ = 'workflow'
     __select__ = (action.Action.__select__ & one_line_rset() &
                   relation_possible('in_state'))
 
@@ -166,7 +166,7 @@
 # workflow entity types views ##################################################
 
 class CellView(view.EntityView):
-    id = 'cell'
+    __regid__ = 'cell'
     __select__ = implements('TrInfo')
 
     def cell_call(self, row, col, cellvid=None):
@@ -175,7 +175,7 @@
 
 class StateInContextView(view.EntityView):
     """convenience trick, State's incontext view should not be clickable"""
-    id = 'incontext'
+    __regid__ = 'incontext'
     __select__ = implements('State')
 
     def cell_call(self, row, col):
@@ -250,9 +250,9 @@
 
 
 class WorkflowImageView(TmpFileViewMixin, view.EntityView):
-    id = 'wfgraph'
+    __regid__ = 'wfgraph'
+    __select__ = implements('Workflow')
     content_type = 'image/png'
-    __select__ = implements('Workflow')
 
     def _generate(self, tmpfile):
         """display schema information for an entity"""
--- a/web/views/xbel.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/xbel.py	Wed Sep 23 09:54:25 2009 +0200
@@ -16,7 +16,7 @@
 
 
 class XbelView(XMLView):
-    id = 'xbel'
+    __regid__ = 'xbel'
     title = _('xbel')
     templatable = False
     content_type = 'text/xml' #application/xbel+xml
@@ -38,7 +38,7 @@
 
 
 class XbelItemView(EntityView):
-    id = 'xbelitem'
+    __regid__ = 'xbelitem'
 
     def cell_call(self, row, col):
         entity = self.complete_entity(row, col)
--- a/web/views/xmlrss.py	Wed Sep 23 09:54:01 2009 +0200
+++ b/web/views/xmlrss.py	Wed Sep 23 09:54:25 2009 +0200
@@ -22,7 +22,7 @@
 
 class XMLView(EntityView):
     """xml view for entities"""
-    id = 'xml'
+    __regid__ = 'xml'
     title = _('xml')
     templatable = False
     content_type = 'text/xml'
@@ -42,7 +42,7 @@
 
 
 class XMLItemView(EntityView):
-    id = 'xmlitem'
+    __regid__ = 'xmlitem'
 
     def cell_call(self, row, col):
         """ element as an item for an xml feed """
@@ -67,7 +67,7 @@
 
 class XMLRsetView(AnyRsetView):
     """dumps raw rset as xml"""
-    id = 'rsetxml'
+    __regid__ = 'rsetxml'
     title = _('xml export')
     templatable = False
     content_type = 'text/xml'
@@ -105,7 +105,7 @@
 # RSS stuff ###################################################################
 
 class RSSFeedURL(Component):
-    id = 'rss_feed_url'
+    __regid__ = 'rss_feed_url'
     __select__ = non_final_entity()
 
     def feed_url(self):
@@ -113,7 +113,7 @@
 
 
 class RSSEntityFeedURL(Component):
-    id = 'rss_feed_url'
+    __regid__ = 'rss_feed_url'
     __select__ = non_final_entity() & one_line_rset()
 
     def feed_url(self):
@@ -122,7 +122,7 @@
 
 class RSSIconBox(box.BoxTemplate):
     """just display the RSS icon on uniform result set"""
-    id = 'rss'
+    __regid__ = 'rss'
     __select__ = (box.BoxTemplate.__select__
                   & appobject_selectable('components', 'rss_feed_url'))
 
@@ -142,7 +142,7 @@
 
 
 class RSSView(XMLView):
-    id = 'rss'
+    __regid__ = 'rss'
     title = _('rss')
     templatable = False
     content_type = 'text/xml'
@@ -178,7 +178,7 @@
 
 
 class RSSItemView(EntityView):
-    id = 'rssitem'
+    __regid__ = 'rssitem'
     date_format = '%%Y-%%m-%%dT%%H:%%M%+03i:00' % (timezone / 3600)
     add_div_section = False