backport stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 04 Mar 2010 09:57:40 +0100
changeset 4787 dc07678c4935
parent 4777 7e37cb866e97 (current diff)
parent 4786 df2a12bfbab6 (diff)
child 4790 52c81aef0b61
backport stable
doc/book/en/B000-development.en.txt
doc/book/en/B0015-define-permissions.en.txt
doc/book/en/B4040-rss-xml.en.txt
doc/book/en/D060-modules-stdlib.en.txt
doc/book/en/D070-modules-cbw-api.en.txt
doc/book/en/Z010-beginners.en.txt
doc/book/en/Z012-create-instance.en.txt
server/test/unittest_querier.py
server/test/unittest_security.py
--- a/doc/book/en/B000-development.en.txt	Wed Mar 03 19:20:03 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-=====================
-Part II - Development
-=====================
-
-This part is about developing web applications with the *CubicWeb* framework.
-
-.. toctree::
-   :maxdepth: 1
-
-   B0-data-model.en.txt
-   B1-web-interface.en.txt
-   B2-repository-customization.en.txt
-   B3-test.en.txt
-   B4-advanced.en.txt
-
-
-
--- a/doc/book/en/B0015-define-permissions.en.txt	Wed Mar 03 19:20:03 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,208 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-The security model
-------------------
-
-The security model of `cubicWeb` is based on `Access Control List`.
-The main principles are:
-
-* users and groups of users
-* a user belongs to at least one group of user
-* permissions (read, update, create, delete)
-* permissions are assigned to groups (and not to users)
-
-For *CubicWeb* in particular:
-
-* we associate rights at the enttities/relations schema level
-* for each entity, we distinguish four kind of permissions: read,
-  add, update and delete
-* for each relation, we distinguish three king of permissions: read,
-  add and delete (we can not modify a relation)
-* the basic groups are: Administrators, Users and Guests
-* by default, users belongs to the group Users
-* there is a virtual group called `Owners users` to which we
-  can associate only deletion and update permissions
-* we can not add users to the `Owners users` group, they are
-  implicetely added to it according to the context of the objects
-  they own
-* the permissions of this group are only be checked on update/deletion
-  actions if all the other groups the user belongs does not provide
-  those permissions
-
-
-Permissions definition
-``````````````````````
-
-Setting permissions is done with the attribute `permissions` of entities and
-relation types. It defines a dictionary where the keys are the access types
-(action), and the values are the authorized groups or expressions.
-
-For an entity type, the possible actions are `read`, `add`, `update` and
-`delete`.
-
-For a relation type, the possible actions are `read`, `add`, and `delete`.
-
-For each access type, a tuple indicates the name of the authorized groups and/or
-one or multiple RQL expressions to satisfy to grant access. The access is
-provided once the user is in the listed groups or one of the RQL condition is
-satisfied.
-
-The standard groups are :
-
-* `guests`
-
-* `users`
-
-* `managers`
-
-* `owners` : virtual group corresponding to the entity's owner.
-  This can only be used for the actions `update` and `delete` of an entity
-  type.
-
-It is also possible to use specific groups if they are defined in the precreate
-of the cube (``migration/precreate.py``).
-
-
-Use of RQL expression for writing rights
-````````````````````````````````````````
-
-It is possible to define RQL expression to provide update permission
-(`add`, `delete` and `update`) on relation and entity types.
-
-RQL expression for entity type permission :
-
-* you have to use the class `ERQLExpression`
-
-* the used expression corresponds to the WHERE statement of an RQL query
-
-* in this expression, the variables X and U are pre-defined references
-  respectively on the current entity (on which the action is verified) and
-  on the user who send the request
-
-* it is possible to use, in this expression, a special relation
-  "has_<ACTION>_permission" where the subject is the user and the
-  object is a any variable, meaning that the user needs to have
-  permission to execute the action <ACTION> on the entities related
-  to this variable
-
-For RQL expressions on a relation type, the principles are the same except
-for the following :
-
-* you have to use the class `RRQLExpression` in the case of a non-final relation
-
-* in the expression, the variables S, O and U are pre-defined references
-  to respectively the subject and the object of the current relation (on
-  which the action is being verified) and the user who executed the query
-
-* we can also define rights on attributes of an entity (non-final
-  relation), knowing that :
-
-  - to define RQL expression, we have to use the class
-    `ERQLExpression` in which X represents the entity the attribute
-    belongs to
-
-  - the permissions `add` and `delete` are equivalent. Only `add`/`read`
-    are actually taken in consideration.
-
-In addition to that the entity type `EPermission` from the standard library
-allows to build very complex and dynamic security architecture. The schema of
-this entity type is as follow : ::
-
-    class CWPermission(EntityType):
-	"""entity type that may be used to construct some advanced security configuration
-	"""
-        permissions = META_ETYPE_PERMS
-
-        name = String(required=True, indexed=True, internationalizable=True, maxsize=100,
-                      description=_('name or identifier of the permission'))
-        label = String(required=True, internationalizable=True, maxsize=100,
-                       description=_('distinct label to distinguate between other permission entity of the same name'))
-        require_group = SubjectRelation('CWGroup',
-                                        description=_('groups to which the permission is granted'))
-
-    # explicitly add X require_permission CWPermission for each entity that should have
-    # configurable security
-    class require_permission(RelationType):
-        """link a permission to the entity. This permission should be used in the
-        security definition of the entity's type to be useful.
-        """
-        permissions = {
-            'read':   ('managers', 'users', 'guests'),
-            'add':    ('managers',),
-            'delete': ('managers',),
-            }
-
-    class require_group(RelationType):
-        """used to grant a permission to a group"""
-        permissions = {
-            'read':   ('managers', 'users', 'guests'),
-            'add':    ('managers',),
-            'delete': ('managers',),
-            }
-
-
-Example of configuration ::
-
-
-    ...
-
-    class Version(EntityType):
-	"""a version is defining the content of a particular project's release"""
-
-	permissions = {'read':   ('managers', 'users', 'guests',),
-		       'update': ('managers', 'logilab', 'owners',),
-		       'delete': ('managers', ),
-		       'add':    ('managers', 'logilab',
-				  ERQLExpression('X version_of PROJ, U in_group G,'
-						 'PROJ require_permission P, P name "add_version",'
-						 'P require_group G'),)}
-
-    ...
-
-    class version_of(RelationType):
-	"""link a version to its project. A version is necessarily linked to one and only one project.
-	"""
-	permissions = {'read':   ('managers', 'users', 'guests',),
-		       'delete': ('managers', ),
-		       'add':    ('managers', 'logilab',
-				  RRQLExpression('O require_permission P, P name "add_version",'
-						 'U in_group G, P require_group G'),)
-		       }
-	inlined = True
-
-This configuration indicates that an entity `CWPermission` named
-"add_version" can be associated to a project and provides rights to create
-new versions on this project to specific groups. It is important to notice that :
-
-* in such case, we have to protect both the entity type "Version" and the relation
-  associating a version to a project ("version_of")
-
-* because of the genericity of the entity type `CWPermission`, we have to execute
-  a unification with the groups and/or the states if necessary in the expression
-  ("U in_group G, P require_group G" in the above example)
-
-Use of RQL expression for reading rights
-````````````````````````````````````````
-
-The principles are the same but with the following restrictions :
-
-* we can not use `RRQLExpression` on relation types for reading
-
-* special relations "has_<ACTION>_permission" can not be used
-
-
-Note on the use of RQL expression for `add` permission
-``````````````````````````````````````````````````````
-Potentially, the use of an RQL expression to add an entity or a relation
-can cause problems for the user interface, because if the expression uses
-the entity or the relation to create, then we are not able to verify the
-permissions before we actually add the entity (please note that this is
-not a problem for the RQL server at all, because the permissions checks are
-done after the creation). In such case, the permission check methods
-(check_perm, has_perm) can indicate that the user is not allowed to create
-this entity but can obtain the permission.
-
-To compensate this problem, it is usually necessary, for such case,
-to use an action that reflects the schema permissions but which enables
-to check properly the permissions so that it would show up if necessary.
-
--- a/doc/book/en/B4040-rss-xml.en.txt	Wed Mar 03 19:20:03 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-.. _rss:
-
-RSS Channel
------------
-
-Assuming you have several blog entries, click on the title of the
-search box in the left column. A larger search box should appear. Enter::
-
-   Any X ORDERBY D WHERE X is BlogEntry, X creation_date D
-
-and you get a list of blog entries.
-
-Click on your login at the top right corner. Chose "user preferences",
-then "boxes", then "possible views box" and check "visible = yes"
-before validating your changes.
-
-Enter the same query in the search box and you will see the same list,
-plus a box titled "possible views" in the left column. Click on
-"entityview", then "RSS". 
-
-You just applied the "RSS" view to the RQL selection you requested.
-
-That's it, you have a RSS channel for your blog.
-
-Try again with::
-
-    Any X ORDERBY D WHERE X is BlogEntry, X creation_date D, 
-    X entry_of B, B title "MyLife"
-
-Another RSS channel, but a bit more focused.
-
-A last one for the road::
-
-    Any C ORDERBY D WHERE C is Comment, C creation_date D LIMIT 15
-    
-displayed with the RSS view, that's a channel for the last fifteen
-comments posted.
-
-[WRITE ME]
-
-* show that the RSS view can be used to display an ordered selection
-  of blog entries, thus providing a RSS channel
-
-* show that a different selection (by category) means a different channel
-
-
--- a/doc/book/en/D060-modules-stdlib.en.txt	Wed Mar 03 19:20:03 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,158 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-================
-Standard library
-================
-
-:mod:`cubes.addressbook` 
-========================
-
-.. automodule:: cubes.addressbook
-   :members:
-
-:mod:`cubes.basket` 
-========================
-
-.. automodule:: cubes.basket
-   :members:
-
-:mod:`cubes.blog` 
-========================
-
-.. automodule:: cubes.blog
-   :members:
-
-:mod:`cubes.book` 
-========================
-
-.. automodule:: cubes.book
-   :members:
-
-:mod:`cubes.comment` 
-========================
-
-.. automodule:: cubes.comment
-   :members:
-
-:mod:`cubes.company` 
-========================
-
-.. automodule:: cubes.company
-   :members:
-
-
-:mod:`cubes.conference` 
-========================
-
-.. automodule:: cubes.conference
-   :members:
-
-:mod:`cubes.email` 
-========================
-
-.. automodule:: cubes.email
-   :members:
-
-:mod:`cubes.event` 
-========================
-
-.. automodule:: cubes.event
-   :members:
-
-:mod:`cubes.expense` 
-========================
-
-.. automodule:: cubes.expense
-   :members:
-
-
-:mod:`cubes.file` 
-========================
-
-.. automodule:: cubes.file
-   :members:
-
-:mod:`cubes.folder` 
-========================
-
-.. automodule:: cubes.folder
-   :members:
-
-:mod:`cubes.i18ncontent` 
-========================
-
-.. automodule:: cubes.i18ncontent
-   :members:
-
-:mod:`cubes.invoice` 
-========================
-
-.. automodule:: cubes.invoice
-   :members:
-
-:mod:`cubes.keyword` 
-========================
-
-.. automodule:: cubes.keyword
-   :members:
-
-:mod:`cubes.link` 
-========================
-
-.. automodule:: cubes.link
-   :members:
-
-:mod:`cubes.mailinglist` 
-========================
-
-.. automodule:: cubes.mailinglist
-   :members:
-
-:mod:`cubes.person` 
-========================
-
-.. automodule:: cubes.person
-   :members:
-
-:mod:`cubes.shopcart` 
-========================
-
-.. automodule:: cubes.shopcart
-   :members:
-
-:mod:`cubes.skillmat` 
-========================
-
-.. automodule:: cubes.skillmat
-   :members:
-
-:mod:`cubes.tag` 
-========================
-
-.. automodule:: cubes.tag
-   :members:
-
-:mod:`cubes.task` 
-========================
-
-.. automodule:: cubes.task
-   :members:
-
-:mod:`cubes.workcase` 
-========================
-
-.. automodule:: cubes.workcase
-   :members:
-
-:mod:`cubes.workorder` 
-========================
-
-.. automodule:: cubes.workorder
-   :members:
-
-:mod:`cubes.zone` 
-========================
-
-.. automodule:: cubes.zone
-   :members:
-
--- a/doc/book/en/D070-modules-cbw-api.en.txt	Wed Mar 03 19:20:03 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1961 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-============
-CubicWeb API
-============
-
-:mod:`cubicweb.hercule`
-=======================
-
-.. automodule:: cubicweb.hercule
-   :members:
-
-:mod:`cubicweb.cwctl`
-=====================
-
-.. automodule:: cubicweb.cwctl
-   :members:
-
-:mod:`cubicweb.schema`
-======================
-
-.. automodule:: cubicweb.schema
-   :members:
-
-:mod:`cubicweb.cwconfig`
-========================
-
-.. automodule:: cubicweb.cwconfig
-   :members:
-
-:mod:`cubicweb.schemaviewer`
-============================
-
-.. automodule:: cubicweb.schemaviewer
-   :members:
-
-:mod:`cubicweb._exceptions`
-===========================
-
-.. automodule:: cubicweb._exceptions
-   :members:
-
-:mod:`cubicweb.dbapi`
-=====================
-
-.. automodule:: cubicweb.dbapi
-   :members:
-
-:mod:`cubicweb.toolsutils`
-==========================
-
-.. automodule:: cubicweb.toolsutils
-   :members:
-
-:mod:`cubicweb.cwvreg`
-======================
-
-.. automodule:: cubicweb.cwvreg
-   :members:
-
-:mod:`cubicweb.md5crypt`
-========================
-
-.. automodule:: cubicweb.md5crypt
-   :members:
-
-:mod:`cubicweb.rset`
-====================
-
-.. automodule:: cubicweb.rset
-   :members:
-
-:mod:`cubicweb`
-===============
-
-.. automodule:: cubicweb
-   :members:
-
-:mod:`cubicweb.setup`
-=====================
-
-.. automodule:: cubicweb.setup
-   :members:
-
-:mod:`cubicweb.gettext`
-=======================
-
-.. automodule:: cubicweb.gettext
-   :members:
-
-:mod:`cubicweb.interfaces`
-==========================
-
-.. automodule:: cubicweb.interfaces
-   :members:
-
-:mod:`cubicweb.vregistry`
-=========================
-
-.. automodule:: cubicweb.vregistry
-   :members:
-
-:mod:`cubicweb.web.httpcache`
-=============================
-
-.. automodule:: cubicweb.web.httpcache
-   :members:
-
-:mod:`cubicweb.web.webconfig`
-=============================
-
-.. automodule:: cubicweb.web.webconfig
-   :members:
-
-:mod:`cubicweb.web.request`
-===========================
-
-.. automodule:: cubicweb.web.request
-   :members:
-
-:mod:`cubicweb.web._exceptions`
-===============================
-
-.. automodule:: cubicweb.web._exceptions
-   :members:
-
-:mod:`cubicweb.web.webctl`
-==========================
-
-.. automodule:: cubicweb.web.webctl
-   :members:
-
-:mod:`cubicweb.web.application`
-===============================
-
-.. automodule:: cubicweb.web.application
-   :members:
-
-:mod:`cubicweb.web.controller`
-==============================
-
-.. automodule:: cubicweb.web.controller
-   :members:
-
-:mod:`cubicweb.web.widgets`
-===========================
-
-.. automodule:: cubicweb.web.widgets
-   :members:
-
-:mod:`cubicweb.web.htmlwidgets`
-===============================
-
-.. automodule:: cubicweb.web.htmlwidgets
-   :members:
-
-:mod:`cubicweb.web`
-===================
-
-.. automodule:: cubicweb.web
-   :members:
-
-:mod:`cubicweb.web.form`
-========================
-
-.. automodule:: cubicweb.web.form
-   :members:
-
-:mod:`cubicweb.web.box`
-=======================
-
-.. automodule:: cubicweb.web.box
-   :members:
-
-:mod:`cubicweb.web.component`
-=============================
-
-.. automodule:: cubicweb.web.component
-   :members:
-
-:mod:`cubicweb.web.action`
-==========================
-
-.. automodule:: cubicweb.web.action
-   :members:
-
-:mod:`cubicweb.web.facet`
-=========================
-
-.. automodule:: cubicweb.web.facet
-   :members:
-
-:mod:`cubicweb.web.views.plots`
-===============================
-
-.. automodule:: cubicweb.web.views.plots
-   :members:
-
-:mod:`cubicweb.web.views.error`
-===============================
-
-.. automodule:: cubicweb.web.views.error
-   :members:
-
-:mod:`cubicweb.web.views.magicsearch`
-=====================================
-
-.. automodule:: cubicweb.web.views.magicsearch
-   :members:
-
-:mod:`cubicweb.web.views.basetemplates`
-=======================================
-
-.. automodule:: cubicweb.web.views.basetemplates
-   :members:
-
-:mod:`cubicweb.web.views.idownloadable`
-=======================================
-
-.. automodule:: cubicweb.web.views.idownloadable
-   :members:
-
-:mod:`cubicweb.web.views.ajaxedit`
-==================================
-
-.. automodule:: cubicweb.web.views.ajaxedit
-   :members:
-
-:mod:`cubicweb.web.views.wfentities`
-====================================
-
-.. automodule:: cubicweb.web.views.wfentities
-   :members:
-
-:mod:`cubicweb.web.views.navigation`
-====================================
-
-.. automodule:: cubicweb.web.views.navigation
-   :members:
-
-:mod:`cubicweb.web.views.schemaentities`
-========================================
-
-.. automodule:: cubicweb.web.views.schemaentities
-   :members:
-
-:mod:`cubicweb.web.views.treeview`
-==================================
-
-.. automodule:: cubicweb.web.views.treeview
-   :members:
-
-:mod:`cubicweb.web.views.startup`
-=================================
-
-.. automodule:: cubicweb.web.views.startup
-   :members:
-
-:mod:`cubicweb.web.views.iprogress`
-===================================
-
-.. automodule:: cubicweb.web.views.iprogress
-   :members:
-
-:mod:`cubicweb.web.views.euser`
-===============================
-
-.. automodule:: cubicweb.web.views.euser
-   :members:
-
-:mod:`cubicweb.web.views.facets`
-================================
-
-.. automodule:: cubicweb.web.views.facets
-   :members:
-
-:mod:`cubicweb.web.views.emailaddress`
-======================================
-
-.. automodule:: cubicweb.web.views.emailaddress
-   :members:
-
-:mod:`cubicweb.web.views.sessions`
-==================================
-
-.. automodule:: cubicweb.web.views.sessions
-   :members:
-
-:mod:`cubicweb.web.views.timetable`
-===================================
-
-.. automodule:: cubicweb.web.views.timetable
-   :members:
-
-:mod:`cubicweb.web.views.timeline`
-==================================
-
-.. automodule:: cubicweb.web.views.timeline
-   :members:
-
-:mod:`cubicweb.web.views.baseviews`
-===================================
-
-.. automodule:: cubicweb.web.views.baseviews
-   :members:
-
-:mod:`cubicweb.web.views.boxes`
-===============================
-
-.. automodule:: cubicweb.web.views.boxes
-   :members:
-
-:mod:`cubicweb.web.views.old_calendar`
-======================================
-
-.. automodule:: cubicweb.web.views.old_calendar
-   :members:
-
-:mod:`cubicweb.web.views.card`
-==============================
-
-.. automodule:: cubicweb.web.views.card
-   :members:
-
-:mod:`cubicweb.web.views.ibreadcrumbs`
-======================================
-
-.. automodule:: cubicweb.web.views.ibreadcrumbs
-   :members:
-
-:mod:`cubicweb.web.views.basecontrollers`
-=========================================
-
-.. automodule:: cubicweb.web.views.basecontrollers
-   :members:
-
-:mod:`cubicweb.web.views.embedding`
-===================================
-
-.. automodule:: cubicweb.web.views.embedding
-   :members:
-
-:mod:`cubicweb.web.views.actions`
-=================================
-
-.. automodule:: cubicweb.web.views.actions
-   :members:
-
-:mod:`cubicweb.web.views.editcontroller`
-========================================
-
-.. automodule:: cubicweb.web.views.editcontroller
-   :members:
-
-:mod:`cubicweb.web.views.debug`
-===============================
-
-.. automodule:: cubicweb.web.views.debug
-   :members:
-
-:mod:`cubicweb.web.views.urlpublishing`
-=======================================
-
-.. automodule:: cubicweb.web.views.urlpublishing
-   :members:
-
-:mod:`cubicweb.web.views.baseforms`
-===================================
-
-.. automodule:: cubicweb.web.views.baseforms
-   :members:
-
-:mod:`cubicweb.web.views.urlrewrite`
-====================================
-
-.. automodule:: cubicweb.web.views.urlrewrite
-   :members:
-
-:mod:`cubicweb.web.views.massmailing`
-=====================================
-
-.. automodule:: cubicweb.web.views.massmailing
-   :members:
-
-:mod:`cubicweb.web.views`
-=========================
-
-.. automodule:: cubicweb.web.views
-   :members:
-
-:mod:`cubicweb.web.views.eproperties`
-=====================================
-
-.. automodule:: cubicweb.web.views.eproperties
-   :members:
-
-:mod:`cubicweb.web.views.tabs`
-==============================
-
-.. automodule:: cubicweb.web.views.tabs
-   :members:
-
-:mod:`cubicweb.web.views.vcard`
-===============================
-
-.. automodule:: cubicweb.web.views.vcard
-   :members:
-
-:mod:`cubicweb.web.views.wdoc`
-==============================
-
-.. automodule:: cubicweb.web.views.wdoc
-   :members:
-
-:mod:`cubicweb.web.views.authentication`
-========================================
-
-.. automodule:: cubicweb.web.views.authentication
-   :members:
-
-:mod:`cubicweb.web.views.tableview`
-===================================
-
-.. automodule:: cubicweb.web.views.tableview
-   :members:
-
-:mod:`cubicweb.web.views.management`
-====================================
-
-.. automodule:: cubicweb.web.views.management
-   :members:
-
-:mod:`cubicweb.web.views.igeocodable`
-=====================================
-
-.. automodule:: cubicweb.web.views.igeocodable
-   :members:
-
-:mod:`cubicweb.web.views.xbel`
-==============================
-
-.. automodule:: cubicweb.web.views.xbel
-   :members:
-
-:mod:`cubicweb.web.views.bookmark`
-==================================
-
-.. automodule:: cubicweb.web.views.bookmark
-   :members:
-
-:mod:`cubicweb.web.views.apacherewrite`
-=======================================
-
-.. automodule:: cubicweb.web.views.apacherewrite
-   :members:
-
-:mod:`cubicweb.web.views.dynimages`
-===================================
-
-.. automodule:: cubicweb.web.views.dynimages
-   :members:
-
-:mod:`cubicweb.web.views.searchrestriction`
-===========================================
-
-.. automodule:: cubicweb.web.views.searchrestriction
-   :members:
-
-:mod:`cubicweb.web.views.basecomponents`
-========================================
-
-.. automodule:: cubicweb.web.views.basecomponents
-   :members:
-
-:mod:`cubicweb.web.views.calendar`
-==================================
-
-.. automodule:: cubicweb.web.views.calendar
-   :members:
-
-:mod:`cubicweb.sobjects.supervising`
-====================================
-
-.. automodule:: cubicweb.sobjects.supervising
-   :members:
-
-:mod:`cubicweb.sobjects.hooks`
-==============================
-
-.. automodule:: cubicweb.sobjects.hooks
-   :members:
-
-:mod:`cubicweb.sobjects.email`
-==============================
-
-.. automodule:: cubicweb.sobjects.email
-   :members:
-
-:mod:`cubicweb.sobjects`
-========================
-
-.. automodule:: cubicweb.sobjects
-   :members:
-
-:mod:`cubicweb.sobjects.notification`
-=====================================
-
-.. automodule:: cubicweb.sobjects.notification
-   :members:
-
-:mod:`cubicweb.wsgi.request`
-============================
-
-.. automodule:: cubicweb.wsgi.request
-   :members:
-
-:mod:`cubicweb.wsgi`
-====================
-
-.. automodule:: cubicweb.wsgi
-   :members:
-
-:mod:`cubicweb.wsgi.handler`
-============================
-
-.. automodule:: cubicweb.wsgi.handler
-   :members:
-
-:mod:`cubicweb.etwist.server`
-=============================
-
-.. automodule:: cubicweb.etwist.server
-   :members:
-
-:mod:`cubicweb.etwist.request`
-==============================
-
-.. automodule:: cubicweb.etwist.request
-   :members:
-
-:mod:`cubicweb.etwist.twconfig`
-===============================
-
-.. automodule:: cubicweb.etwist.twconfig
-   :members:
-
-:mod:`cubicweb.etwist`
-======================
-
-.. automodule:: cubicweb.etwist
-   :members:
-
-:mod:`cubicweb.etwist.twctl`
-============================
-
-.. automodule:: cubicweb.etwist.twctl
-   :members:
-
-:mod:`cubicweb.goa.goaconfig`
-=============================
-
-.. automodule:: cubicweb.goa.goaconfig
-   :members:
-
-:mod:`cubicweb.goa.rqlinterpreter`
-==================================
-
-.. automodule:: cubicweb.goa.rqlinterpreter
-   :members:
-
-:mod:`cubicweb.goa.dbmyams`
-===========================
-
-.. automodule:: cubicweb.goa.dbmyams
-   :members:
-
-:mod:`cubicweb.goa.db`
-======================
-
-.. automodule:: cubicweb.goa.db
-   :members:
-
-:mod:`cubicweb.goa.goactl`
-==========================
-
-.. automodule:: cubicweb.goa.goactl
-   :members:
-
-:mod:`cubicweb.goa.goavreg`
-===========================
-
-.. automodule:: cubicweb.goa.goavreg
-   :members:
-
-:mod:`cubicweb.goa`
-===================
-
-.. automodule:: cubicweb.goa
-   :members:
-
-:mod:`cubicweb.goa.gaesource`
-=============================
-
-.. automodule:: cubicweb.goa.gaesource
-   :members:
-
-:mod:`cubicweb.goa.dbinit`
-==========================
-
-.. automodule:: cubicweb.goa.dbinit
-   :members:
-
-:mod:`cubicweb.goa.testlib`
-===========================
-
-.. automodule:: cubicweb.goa.testlib
-   :members:
-
-:mod:`cubicweb.goa.appobjects.dbmgmt`
-=====================================
-
-.. automodule:: cubicweb.goa.appobjects.dbmgmt
-   :members:
-
-:mod:`cubicweb.goa.appobjects.gauthservice`
-===========================================
-
-.. automodule:: cubicweb.goa.appobjects.gauthservice
-   :members:
-
-:mod:`cubicweb.goa.appobjects.sessions`
-=======================================
-
-.. automodule:: cubicweb.goa.appobjects.sessions
-   :members:
-
-:mod:`cubicweb.goa.appobjects`
-==============================
-
-.. automodule:: cubicweb.goa.appobjects
-   :members:
-
-:mod:`cubicweb.goa.appobjects.components`
-=========================================
-
-.. automodule:: cubicweb.goa.appobjects.components
-   :members:
-
-:mod:`cubicweb.goa.tools.laxctl`
-================================
-
-.. automodule:: cubicweb.goa.tools.laxctl
-   :members:
-
-:mod:`cubicweb.goa.tools.generate_schema_img`
-=============================================
-
-.. automodule:: cubicweb.goa.tools.generate_schema_img
-   :members:
-
-:mod:`cubicweb.goa.tools`
-=========================
-
-.. automodule:: cubicweb.goa.tools
-   :members:
-
-:mod:`cubicweb.goa.tools.i18n`
-==============================
-
-.. automodule:: cubicweb.goa.tools.i18n
-   :members:
-
-:mod:`cubicweb.goa.overrides.mttransforms`
-==========================================
-
-.. automodule:: cubicweb.goa.overrides.mttransforms
-   :members:
-
-:mod:`cubicweb.goa.overrides.rqlannotation`
-===========================================
-
-.. automodule:: cubicweb.goa.overrides.rqlannotation
-   :members:
-
-:mod:`cubicweb.goa.overrides.toolsutils`
-========================================
-
-.. automodule:: cubicweb.goa.overrides.toolsutils
-   :members:
-
-:mod:`cubicweb.goa.overrides`
-=============================
-
-.. automodule:: cubicweb.goa.overrides
-   :members:
-
-:mod:`cubicweb.goa.overrides.server__init__`
-============================================
-
-.. automodule:: cubicweb.goa.overrides.server__init__
-   :members:
-
-:mod:`cubicweb.goa.overrides.server_utils`
-==========================================
-
-.. automodule:: cubicweb.goa.overrides.server_utils
-   :members:
-
-:mod:`cubicweb.common.mttransforms`
-===================================
-
-.. automodule:: cubicweb.common.mttransforms
-   :members:
-
-:mod:`cubicweb.common.utils`
-============================
-
-.. automodule:: cubicweb.common.utils
-   :members:
-
-:mod:`cubicweb.common.schema`
-=============================
-
-.. automodule:: cubicweb.common.schema
-   :members:
-
-:mod:`cubicweb.common.tal`
-==========================
-
-.. automodule:: cubicweb.common.tal
-   :members:
-
-:mod:`cubicweb.common.appobject`
-================================
-
-.. automodule:: cubicweb.common.appobject
-   :members:
-
-:mod:`cubicweb.common.migration`
-================================
-
-.. automodule:: cubicweb.common.migration
-   :members:
-
-:mod:`cubicweb.common.rest`
-===========================
-
-.. automodule:: cubicweb.common.rest
-   :members:
-
-:mod:`cubicweb.common.html4zope`
-================================
-
-.. automodule:: cubicweb.common.html4zope
-   :members:
-
-:mod:`cubicweb.common.view`
-===========================
-
-.. automodule:: cubicweb.common.view
-   :members:
-
-:mod:`cubicweb.common.selectors`
-================================
-
-.. automodule:: cubicweb.common.selectors
-   :members:
-
-:mod:`cubicweb.common.entity`
-=============================
-
-.. automodule:: cubicweb.common.entity
-   :members:
-
-:mod:`cubicweb.common.mail`
-===========================
-
-.. automodule:: cubicweb.common.mail
-   :members:
-
-:mod:`cubicweb.common.mixins`
-=============================
-
-.. automodule:: cubicweb.common.mixins
-   :members:
-
-:mod:`cubicweb.common`
-======================
-
-.. automodule:: cubicweb.common
-   :members:
-
-:mod:`cubicweb.common.uilib`
-============================
-
-.. automodule:: cubicweb.common.uilib
-   :members:
-
-:mod:`cubicweb.common.registerers`
-==================================
-
-.. automodule:: cubicweb.common.registerers
-   :members:
-
-:mod:`cubicweb.common.i18n`
-===========================
-
-.. automodule:: cubicweb.common.i18n
-   :members:
-
-:mod:`cubicweb.entities.schemaobjs`
-===================================
-
-.. automodule:: cubicweb.entities.schemaobjs
-   :members:
-
-:mod:`cubicweb.entities.wfobjs`
-===============================
-
-.. automodule:: cubicweb.entities.wfobjs
-   :members:
-
-:mod:`cubicweb.entities`
-========================
-
-.. automodule:: cubicweb.entities
-   :members:
-
-:mod:`cubicweb.entities.authobjs`
-=================================
-
-.. automodule:: cubicweb.entities.authobjs
-   :members:
-
-:mod:`cubicweb.entities.lib`
-============================
-
-.. automodule:: cubicweb.entities.lib
-   :members:
-
-:mod:`cubicweb.server.server`
-=============================
-
-.. automodule:: cubicweb.server.server
-   :members:
-
-:mod:`cubicweb.server.utils`
-============================
-
-.. automodule:: cubicweb.server.utils
-   :members:
-
-:mod:`cubicweb.server.checkintegrity`
-=====================================
-
-.. automodule:: cubicweb.server.checkintegrity
-   :members:
-
-:mod:`cubicweb.server.rqlrewrite`
-=================================
-
-.. automodule:: cubicweb.server.rqlrewrite
-   :members:
-
-:mod:`cubicweb.server.rqlannotation`
-====================================
-
-.. automodule:: cubicweb.server.rqlannotation
-   :members:
-
-:mod:`cubicweb.server.hooks`
-============================
-
-.. automodule:: cubicweb.server.hooks
-   :members:
-
-:mod:`cubicweb.server.hooksmanager`
-===================================
-
-.. automodule:: cubicweb.server.hooksmanager
-   :members:
-
-:mod:`cubicweb.server.securityhooks`
-====================================
-
-.. automodule:: cubicweb.server.securityhooks
-   :members:
-
-:mod:`cubicweb.server.schemahooks`
-==================================
-
-.. automodule:: cubicweb.server.schemahooks
-   :members:
-
-:mod:`cubicweb.server.session`
-==============================
-
-.. automodule:: cubicweb.server.session
-   :members:
-
-:mod:`cubicweb.server.serverctl`
-================================
-
-.. automodule:: cubicweb.server.serverctl
-   :members:
-
-:mod:`cubicweb.server.serverconfig`
-===================================
-
-.. automodule:: cubicweb.server.serverconfig
-   :members:
-
-:mod:`cubicweb.server.pool`
-===========================
-
-.. automodule:: cubicweb.server.pool
-   :members:
-
-:mod:`cubicweb.server.mssteps`
-==============================
-
-.. automodule:: cubicweb.server.mssteps
-   :members:
-
-:mod:`cubicweb.server.hookhelper`
-=================================
-
-.. automodule:: cubicweb.server.hookhelper
-   :members:
-
-:mod:`cubicweb.server`
-======================
-
-.. automodule:: cubicweb.server
-   :members:
-
-:mod:`cubicweb.server.sqlutils`
-===============================
-
-.. automodule:: cubicweb.server.sqlutils
-   :members:
-
-:mod:`cubicweb.server.schemaserial`
-===================================
-
-.. automodule:: cubicweb.server.schemaserial
-   :members:
-
-:mod:`cubicweb.server.repository`
-=================================
-
-.. automodule:: cubicweb.server.repository
-   :members:
-
-:mod:`cubicweb.server.ssplanner`
-================================
-
-.. automodule:: cubicweb.server.ssplanner
-   :members:
-
-:mod:`cubicweb.server.msplanner`
-================================
-
-.. automodule:: cubicweb.server.msplanner
-   :members:
-
-:mod:`cubicweb.server.querier`
-==============================
-
-.. automodule:: cubicweb.server.querier
-   :members:
-
-:mod:`cubicweb.server.migractions`
-==================================
-
-.. automodule:: cubicweb.server.migractions
-   :members:
-
-:mod:`cubicweb.server.sources.rql2sql`
-======================================
-
-.. automodule:: cubicweb.server.sources.rql2sql
-   :members:
-
-:mod:`cubicweb.server.sources.ldapuser`
-=======================================
-
-.. automodule:: cubicweb.server.sources.ldapuser
-   :members:
-
-:mod:`cubicweb.server.sources`
-==============================
-
-.. automodule:: cubicweb.server.sources
-   :members:
-
-:mod:`cubicweb.server.sources.pyrorql`
-======================================
-
-.. automodule:: cubicweb.server.sources.pyrorql
-   :members:
-
-:mod:`cubicweb.server.sources.native`
-=====================================
-
-.. automodule:: cubicweb.server.sources.native
-   :members:
-
-:mod:`cubicweb.server.sources.extlite`
-======================================
-
-.. automodule:: cubicweb.server.sources.extlite
-   :members:
-
-:mod:`cubicweb.devtools.devctl`
-===============================
-
-.. automodule:: cubicweb.devtools.devctl
-   :members:
-
-:mod:`cubicweb.devtools.pkginfo`
-================================
-
-.. automodule:: cubicweb.devtools.pkginfo
-   :members:
-
-:mod:`cubicweb.devtools.migrtest`
-=================================
-
-.. automodule:: cubicweb.devtools.migrtest
-   :members:
-
-:mod:`cubicweb.devtools.htmlparser`
-===================================
-
-.. automodule:: cubicweb.devtools.htmlparser
-   :members:
-
-:mod:`cubicweb.devtools`
-========================
-
-.. automodule:: cubicweb.devtools
-   :members:
-
-:mod:`cubicweb.devtools.fill`
-=============================
-
-.. automodule:: cubicweb.devtools.fill
-   :members:
-
-:mod:`cubicweb.devtools._apptest`
-=================================
-
-.. automodule:: cubicweb.devtools._apptest
-   :members:
-
-:mod:`cubicweb.devtools.stresstester`
-=====================================
-
-.. automodule:: cubicweb.devtools.stresstester
-   :members:
-
-:mod:`cubicweb.devtools.fake`
-=============================
-
-.. automodule:: cubicweb.devtools.fake
-   :members:
-
-:mod:`cubicweb.devtools.apptest`
-================================
-
-.. automodule:: cubicweb.devtools.apptest
-   :members:
-
-:mod:`cubicweb.devtools.livetest`
-=================================
-
-.. automodule:: cubicweb.devtools.livetest
-   :members:
-
-:mod:`cubicweb.devtools.testlib`
-================================
-
-.. automodule:: cubicweb.devtools.testlib
-   :members:
-
-:mod:`cubicweb.devtools.repotest`
-=================================
-
-.. automodule:: cubicweb.devtools.repotest
-   :members:
-
-:mod:`cubicweb.devtools.cwtwill`
-================================
-
-.. automodule:: cubicweb.devtools.cwtwill
-   :members:
-
-:mod:`cubicweb.misc.cwdesklets.rqlsensor`
-=========================================
-
-.. automodule:: cubicweb.misc.cwdesklets.rqlsensor
-   :members:
-
-:mod:`cubicweb.embedded.mx`
-===========================
-
-.. automodule:: cubicweb.embedded.mx
-   :members:
-
-:mod:`cubicweb.embedded.mx.DateTime.mxDateTime_python`
-======================================================
-
-.. automodule:: cubicweb.embedded.mx.DateTime.mxDateTime_python
-   :members:
-
-:mod:`cubicweb.embedded.mx.DateTime.ARPA`
-=========================================
-
-.. automodule:: cubicweb.embedded.mx.DateTime.ARPA
-   :members:
-
-:mod:`cubicweb.embedded.mx.DateTime.ISO`
-========================================
-
-.. automodule:: cubicweb.embedded.mx.DateTime.ISO
-   :members:
-
-:mod:`cubicweb.embedded.mx.DateTime.Parser`
-===========================================
-
-.. automodule:: cubicweb.embedded.mx.DateTime.Parser
-   :members:
-
-:mod:`cubicweb.embedded.mx.DateTime`
-====================================
-
-.. automodule:: cubicweb.embedded.mx.DateTime
-   :members:
-
-:mod:`cubicweb.embedded.mx.DateTime.Timezone`
-=============================================
-
-.. automodule:: cubicweb.embedded.mx.DateTime.Timezone
-   :members:
-
-:mod:`cubicweb.embedded.mx.DateTime.DateTime`
-=============================================
-
-.. automodule:: cubicweb.embedded.mx.DateTime.DateTime
-   :members:
-
-:mod:`indexer`
-==============
-
-.. automodule:: indexer
-   :members:
-
-:mod:`indexer.indexable_objects`
-================================
-
-.. automodule:: indexer.indexable_objects
-   :members:
-
-:mod:`indexer.search`
-=====================
-
-.. automodule:: indexer.search
-   :members:
-
-:mod:`indexer.query_objects`
-============================
-
-.. automodule:: indexer.query_objects
-   :members:
-
-:mod:`indexer._exceptions`
-==========================
-
-.. automodule:: indexer._exceptions
-   :members:
-
-:mod:`indexer.setup`
-====================
-
-.. automodule:: indexer.setup
-   :members:
-
-:mod:`indexer.query`
-====================
-
-.. automodule:: indexer.query
-   :members:
-
-:mod:`logilab`
-==============
-
-.. automodule:: logilab
-   :members:
-
-:mod:`logilab.constraint.propagation`
-=====================================
-
-.. automodule:: logilab.constraint.propagation
-   :members:
-
-:mod:`logilab.constraint.psyco_wrapper`
-=======================================
-
-.. automodule:: logilab.constraint.psyco_wrapper
-   :members:
-
-:mod:`logilab.constraint.fd`
-============================
-
-.. automodule:: logilab.constraint.fd
-   :members:
-
-:mod:`logilab.constraint.fi`
-============================
-
-.. automodule:: logilab.constraint.fi
-   :members:
-
-:mod:`logilab.constraint`
-=========================
-
-.. automodule:: logilab.constraint
-   :members:
-
-:mod:`logilab.constraint.setup`
-===============================
-
-.. automodule:: logilab.constraint.setup
-   :members:
-
-:mod:`logilab.constraint.interfaces`
-====================================
-
-.. automodule:: logilab.constraint.interfaces
-   :members:
-
-:mod:`logilab.constraint.distributors`
-======================================
-
-.. automodule:: logilab.constraint.distributors
-   :members:
-
-:mod:`logilab.common.clcommands`
-================================
-
-.. automodule:: logilab.common.clcommands
-   :members:
-
-:mod:`logilab.common.table`
-===========================
-
-.. automodule:: logilab.common.table
-   :members:
-
-:mod:`logilab.common.interface`
-===============================
-
-.. automodule:: logilab.common.interface
-   :members:
-
-:mod:`logilab.common.logger`
-============================
-
-.. automodule:: logilab.common.logger
-   :members:
-
-:mod:`logilab.common.cli`
-=========================
-
-.. automodule:: logilab.common.cli
-   :members:
-
-:mod:`logilab.common.xmlrpcutils`
-=================================
-
-.. automodule:: logilab.common.xmlrpcutils
-   :members:
-
-:mod:`logilab.common.corbautils`
-================================
-
-.. automodule:: logilab.common.corbautils
-   :members:
-
-:mod:`logilab.common.cache`
-===========================
-
-.. automodule:: logilab.common.cache
-   :members:
-
-:mod:`logilab.common.astutils`
-==============================
-
-.. automodule:: logilab.common.astutils
-   :members:
-
-:mod:`logilab.common.daemon`
-============================
-
-.. automodule:: logilab.common.daemon
-   :members:
-
-:mod:`logilab.common.tree`
-==========================
-
-.. automodule:: logilab.common.tree
-   :members:
-
-:mod:`logilab.common.textutils`
-===============================
-
-.. automodule:: logilab.common.textutils
-   :members:
-
-:mod:`logilab.common.modutils`
-==============================
-
-.. automodule:: logilab.common.modutils
-   :members:
-
-:mod:`logilab.common.fileutils`
-===============================
-
-.. automodule:: logilab.common.fileutils
-   :members:
-
-:mod:`logilab.common.patricia`
-==============================
-
-.. automodule:: logilab.common.patricia
-   :members:
-
-:mod:`logilab.common.date`
-==========================
-
-.. automodule:: logilab.common.date
-   :members:
-
-:mod:`logilab.common.optparser`
-===============================
-
-.. automodule:: logilab.common.optparser
-   :members:
-
-:mod:`logilab.common.twisted_distutils`
-=======================================
-
-.. automodule:: logilab.common.twisted_distutils
-   :members:
-
-:mod:`logilab.common.decorators`
-================================
-
-.. automodule:: logilab.common.decorators
-   :members:
-
-:mod:`logilab.common.db`
-========================
-
-.. automodule:: logilab.common.db
-   :members:
-
-:mod:`logilab.common.deprecation`
-=================================
-
-.. automodule:: logilab.common.deprecation
-   :members:
-
-:mod:`logilab.common.tasksqueue`
-================================
-
-.. automodule:: logilab.common.tasksqueue
-   :members:
-
-:mod:`logilab.common.changelog`
-===============================
-
-.. automodule:: logilab.common.changelog
-   :members:
-
-:mod:`logilab.common.shellutils`
-================================
-
-.. automodule:: logilab.common.shellutils
-   :members:
-
-:mod:`logilab.common.sqlgen`
-============================
-
-.. automodule:: logilab.common.sqlgen
-   :members:
-
-:mod:`logilab.common.optik_ext`
-===============================
-
-.. automodule:: logilab.common.optik_ext
-   :members:
-
-:mod:`logilab.common.configuration`
-===================================
-
-.. automodule:: logilab.common.configuration
-   :members:
-
-:mod:`logilab.common.visitor`
-=============================
-
-.. automodule:: logilab.common.visitor
-   :members:
-
-:mod:`logilab.common.pytest`
-============================
-
-.. automodule:: logilab.common.pytest
-   :members:
-
-:mod:`logilab.common`
-=====================
-
-.. automodule:: logilab.common
-   :members:
-
-:mod:`logilab.common.setup`
-===========================
-
-.. automodule:: logilab.common.setup
-   :members:
-
-:mod:`logilab.common.logservice`
-================================
-
-.. automodule:: logilab.common.logservice
-   :members:
-
-:mod:`logilab.common.debugger`
-==============================
-
-.. automodule:: logilab.common.debugger
-   :members:
-
-:mod:`logilab.common.html`
-==========================
-
-.. automodule:: logilab.common.html
-   :members:
-
-:mod:`logilab.common.vcgutils`
-==============================
-
-.. automodule:: logilab.common.vcgutils
-   :members:
-
-:mod:`logilab.common.compat`
-============================
-
-.. automodule:: logilab.common.compat
-   :members:
-
-:mod:`logilab.common.logging_ext`
-=================================
-
-.. automodule:: logilab.common.logging_ext
-   :members:
-
-:mod:`logilab.common.umessage`
-==============================
-
-.. automodule:: logilab.common.umessage
-   :members:
-
-:mod:`logilab.common.proc`
-==========================
-
-.. automodule:: logilab.common.proc
-   :members:
-
-:mod:`logilab.common.monclient`
-===============================
-
-.. automodule:: logilab.common.monclient
-   :members:
-
-:mod:`logilab.common.bind`
-==========================
-
-.. automodule:: logilab.common.bind
-   :members:
-
-:mod:`logilab.common.graph`
-===========================
-
-.. automodule:: logilab.common.graph
-   :members:
-
-:mod:`logilab.common.testlib`
-=============================
-
-.. automodule:: logilab.common.testlib
-   :members:
-
-:mod:`logilab.common.contexts`
-==============================
-
-.. automodule:: logilab.common.contexts
-   :members:
-
-:mod:`logilab.common.adbh`
-==========================
-
-.. automodule:: logilab.common.adbh
-   :members:
-
-:mod:`logilab.common.pdf_ext`
-=============================
-
-.. automodule:: logilab.common.pdf_ext
-   :members:
-
-:mod:`logilab.common.monserver`
-===============================
-
-.. automodule:: logilab.common.monserver
-   :members:
-
-:mod:`logilab.common.ureports.nodes`
-====================================
-
-.. automodule:: logilab.common.ureports.nodes
-   :members:
-
-:mod:`logilab.common.ureports`
-==============================
-
-.. automodule:: logilab.common.ureports
-   :members:
-
-:mod:`logilab.common.ureports.html_writer`
-==========================================
-
-.. automodule:: logilab.common.ureports.html_writer
-   :members:
-
-:mod:`logilab.common.ureports.text_writer`
-==========================================
-
-.. automodule:: logilab.common.ureports.text_writer
-   :members:
-
-:mod:`logilab.common.ureports.docbook_writer`
-=============================================
-
-.. automodule:: logilab.common.ureports.docbook_writer
-   :members:
-
-:mod:`logilab.mtconverter.engine`
-=================================
-
-.. automodule:: logilab.mtconverter.engine
-   :members:
-
-:mod:`logilab.mtconverter.transform`
-====================================
-
-.. automodule:: logilab.mtconverter.transform
-   :members:
-
-:mod:`logilab.mtconverter`
-==========================
-
-.. automodule:: logilab.mtconverter
-   :members:
-
-:mod:`logilab.mtconverter.setup`
-================================
-
-.. automodule:: logilab.mtconverter.setup
-   :members:
-
-:mod:`logilab.mtconverter.transforms.html2text`
-===============================================
-
-.. automodule:: logilab.mtconverter.transforms.html2text
-   :members:
-
-:mod:`logilab.mtconverter.transforms.cmdtransforms`
-===================================================
-
-.. automodule:: logilab.mtconverter.transforms.cmdtransforms
-   :members:
-
-:mod:`logilab.mtconverter.transforms.python`
-============================================
-
-.. automodule:: logilab.mtconverter.transforms.python
-   :members:
-
-:mod:`logilab.mtconverter.transforms.pygmentstransforms`
-========================================================
-
-.. automodule:: logilab.mtconverter.transforms.pygmentstransforms
-   :members:
-
-:mod:`logilab.mtconverter.transforms`
-=====================================
-
-.. automodule:: logilab.mtconverter.transforms
-   :members:
-
-:mod:`logilab.mtconverter.transforms.piltransforms`
-===================================================
-
-.. automodule:: logilab.mtconverter.transforms.piltransforms
-   :members:
-
-:mod:`logilab.devtools.cvstatus`
-================================
-
-.. automodule:: logilab.devtools.cvstatus
-   :members:
-
-:mod:`logilab.devtools.changelog`
-=================================
-
-.. automodule:: logilab.devtools.changelog
-   :members:
-
-:mod:`logilab.devtools`
-=======================
-
-.. automodule:: logilab.devtools
-   :members:
-
-:mod:`logilab.devtools.setup`
-=============================
-
-.. automodule:: logilab.devtools.setup
-   :members:
-
-:mod:`logilab.devtools.cvslog`
-==============================
-
-.. automodule:: logilab.devtools.cvslog
-   :members:
-
-:mod:`logilab.devtools.lgp.utils`
-=================================
-
-.. automodule:: logilab.devtools.lgp.utils
-   :members:
-
-:mod:`logilab.devtools.lgp.tag`
-===============================
-
-.. automodule:: logilab.devtools.lgp.tag
-   :members:
-
-:mod:`logilab.devtools.lgp.setupinfo`
-=====================================
-
-.. automodule:: logilab.devtools.lgp.setupinfo
-   :members:
-
-:mod:`logilab.devtools.lgp.changelog`
-=====================================
-
-.. automodule:: logilab.devtools.lgp.changelog
-   :members:
-
-:mod:`logilab.devtools.lgp.preparedist`
-=======================================
-
-.. automodule:: logilab.devtools.lgp.preparedist
-   :members:
-
-:mod:`logilab.devtools.lgp.build`
-=================================
-
-.. automodule:: logilab.devtools.lgp.build
-   :members:
-
-:mod:`logilab.devtools.lgp.clean`
-=================================
-
-.. automodule:: logilab.devtools.lgp.clean
-   :members:
-
-:mod:`logilab.devtools.lgp`
-===========================
-
-.. automodule:: logilab.devtools.lgp
-   :members:
-
-:mod:`logilab.devtools.lgp.setup`
-=================================
-
-.. automodule:: logilab.devtools.lgp.setup
-   :members:
-
-:mod:`logilab.devtools.lgp.check`
-=================================
-
-.. automodule:: logilab.devtools.lgp.check
-   :members:
-
-:mod:`logilab.devtools.lgp.exceptions`
-======================================
-
-.. automodule:: logilab.devtools.lgp.exceptions
-   :members:
-
-:mod:`logilab.devtools.templates`
-=================================
-
-.. automodule:: logilab.devtools.templates
-   :members:
-
-:mod:`logilab.devtools.templates.setup`
-=======================================
-
-.. automodule:: logilab.devtools.templates.setup
-   :members:
-
-:mod:`logilab.devtools.lib.coverage`
-====================================
-
-.. automodule:: logilab.devtools.lib.coverage
-   :members:
-
-:mod:`logilab.devtools.lib.manifest`
-====================================
-
-.. automodule:: logilab.devtools.lib.manifest
-   :members:
-
-:mod:`logilab.devtools.lib.pkginfo`
-===================================
-
-.. automodule:: logilab.devtools.lib.pkginfo
-   :members:
-
-:mod:`logilab.devtools.lib`
-===========================
-
-.. automodule:: logilab.devtools.lib
-   :members:
-
-:mod:`logilab.devtools.vcslib.cvsparse`
-=======================================
-
-.. automodule:: logilab.devtools.vcslib.cvsparse
-   :members:
-
-:mod:`logilab.devtools.vcslib.svn`
-==================================
-
-.. automodule:: logilab.devtools.vcslib.svn
-   :members:
-
-:mod:`logilab.devtools.vcslib.node`
-===================================
-
-.. automodule:: logilab.devtools.vcslib.node
-   :members:
-
-:mod:`logilab.devtools.vcslib`
-==============================
-
-.. automodule:: logilab.devtools.vcslib
-   :members:
-
-:mod:`logilab.devtools.vcslib.interfaces`
-=========================================
-
-.. automodule:: logilab.devtools.vcslib.interfaces
-   :members:
-
-:mod:`logilab.devtools.vcslib.cvs`
-==================================
-
-.. automodule:: logilab.devtools.vcslib.cvs
-   :members:
-
-:mod:`logilab.devtools.vcslib.hg`
-=================================
-
-.. automodule:: logilab.devtools.vcslib.hg
-   :members:
-
-:mod:`rql.nodes`
-================
-
-.. automodule:: rql.nodes
-   :members:
-
-:mod:`rql.undo`
-===============
-
-.. automodule:: rql.undo
-   :members:
-
-:mod:`rql.utils`
-================
-
-.. automodule:: rql.utils
-   :members:
-
-:mod:`rql.base`
-===============
-
-.. automodule:: rql.base
-   :members:
-
-:mod:`rql.analyze`
-==================
-
-.. automodule:: rql.analyze
-   :members:
-
-:mod:`rql._exceptions`
-======================
-
-.. automodule:: rql._exceptions
-   :members:
-
-:mod:`rql.compare`
-==================
-
-.. automodule:: rql.compare
-   :members:
-
-:mod:`rql.stmts`
-================
-
-.. automodule:: rql.stmts
-   :members:
-
-:mod:`rql.parser_main`
-======================
-
-.. automodule:: rql.parser_main
-   :members:
-
-:mod:`rql.stcheck`
-==================
-
-.. automodule:: rql.stcheck
-   :members:
-
-:mod:`rql.parser`
-=================
-
-.. automodule:: rql.parser
-   :members:
-
-:mod:`rql`
-==========
-
-.. automodule:: rql
-   :members:
-
-:mod:`rql.setup`
-================
-
-.. automodule:: rql.setup
-   :members:
-
-:mod:`rql.interfaces`
-=====================
-
-.. automodule:: rql.interfaces
-   :members:
-
-:mod:`rql.editextensions`
-=========================
-
-.. automodule:: rql.editextensions
-   :members:
-
-:mod:`rql.fol`
-==============
-
-.. automodule:: rql.fol
-   :members:
-
-:mod:`rqlgen`
-=============
-
-.. automodule:: rqlgen
-   :members:
-
-:mod:`yams.schema`
-==================
-
-.. automodule:: yams.schema
-   :members:
-
-:mod:`yams.reader`
-==================
-
-.. automodule:: yams.reader
-   :members:
-
-:mod:`yams.schema2sql`
-======================
-
-.. automodule:: yams.schema2sql
-   :members:
-
-:mod:`yams._exceptions`
-=======================
-
-.. automodule:: yams._exceptions
-   :members:
-
-:mod:`yams.sqlreader`
-=====================
-
-.. automodule:: yams.sqlreader
-   :members:
-
-:mod:`yams.schema2dot`
-======================
-
-.. automodule:: yams.schema2dot
-   :members:
-
-:mod:`yams`
-===========
-
-.. automodule:: yams
-   :members:
-
-:mod:`yams.setup`
-=================
-
-.. automodule:: yams.setup
-   :members:
-
-:mod:`yams.interfaces`
-======================
-
-.. automodule:: yams.interfaces
-   :members:
-
-:mod:`yams.buildobjs`
-=====================
-
-.. automodule:: yams.buildobjs
-   :members:
-
-:mod:`yams.constraints`
-=======================
-
-.. automodule:: yams.constraints
-   :members:
--- a/doc/book/en/Z010-beginners.en.txt	Wed Mar 03 19:20:03 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-.. _QuickInstall:
-
-Quick Installation of a *CubicWeb* instance
-===========================================
-
-.. include:: C010-setup.en.txt
-.. include:: Z012-create-instance.en.txt
-
-
--- a/doc/book/en/Z012-create-instance.en.txt	Wed Mar 03 19:20:03 2010 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-.. -*- coding: utf-8 -*-
-
-===============================
-Creation of your first instance
-===============================
-
-What is an instance?
---------------------
-
-A *CubicWeb* instance is a container that
-refers to cubes and configuration parameters for your web instance.
-Each instance is stored as a directory in ``~/etc/cubicweb.d`` which enables 
-us to run your instance.
-
-What is a cube?
----------------
-
-Cubes represent data and basic building bricks of your web instances :
-blogs, person, date, addressbook and a lot more.
-
-.. XXX They related to each other by a 'Schema' which is also the PostGres representation.
-
-Each cube defines entities, their views, their schemas and workflows
-in an independant directory located in ``/path/to/forest/cubicweb/cubes/``
-for a Mercurial installation or in ``/usr/share/cubicweb/cubes`` for
-a debian package installation. For example, the 'blog' cube defines the entities 
-blogs and blogentries.
-
-When an *CubicWeb* instance is created, you list the cubes that you want to use. 
-Using a cube means having the entities defined in your cube's schema
-available in your instance as well as their views and workflows.
-
-
-Creating a basic *CubicWeb* Instance 
-------------------------------------
-
-We can create an instance to view our
-instance in a web browser. ::
-
-  cubicweb-ctl create blog myblog
-
-.. XXX or ::
-  
-.. XXX cubicweb-ctl create forge myforge
-
-
-.. note::
-   The commands used below are more detailled in the section dedicated to 
-   :ref:`cubicweb-ctl`.
-
-A series of questions will be prompted to you, the default answer is usually
-sufficient. You can allways modify the parameters later by editing
-configuration files. When a user/psswd is requested to access the database
-please use the login you create at the time you configured the database
-(:ref:`ConfigurationPostgresql`).
-
-It is important to distinguish here the user used to access the database and
-the user used to login to the cubicweb instance. When a *CubicWeb* instance
-starts, it uses the login/psswd for the database to get the schema and handle
-low level transaction. But, when ``cubicweb-ctl create`` asks for
-a manager login/psswd of *CubicWeb*, it refers to an instance user
-to administrate your web instance. 
-The configuration files are stored in *~/etc/cubicweb.d/myblog/*. 
-
-To launch the web instance, you just type ::
-
-  cubicweb-ctl start myblog
-
-You can see how it looks by
-visiting the URL `http://localhost:8080`. 
-To login, please use the cubicweb administrator login/psswd you 
-defined when you created the instance.
-
-To shutdown the instance ::
-
-  cubicweb-ctl stop myinstance
-
-.. XXX something like `cubicweb-ctl live-server intra` would be nice
-
-
--- a/doc/book/en/admin/additional-tips.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/admin/additional-tips.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -28,7 +28,7 @@
 
 Simply use the pg_dump in a cron ::
 
-    pg_dump -Fc --username=cubicweb --no-owner --file=/var/lib/cubicweb/backup/<instance>-$(date '+%Y-%m-%d_%H:%M:%S').dump
+    su -c "pg_dump -Fc --username=cubicweb --no-owner" postgres > <your-instance>-$(date '+%Y-%m-%d_%H:%M:%S').dump
 
 **CubicWeb way**
 
--- a/doc/book/en/admin/index.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/admin/index.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -19,6 +19,7 @@
    site-config
    multisources
    ldap
+   pyro
    gae
    additional-tips
 
--- a/doc/book/en/admin/instance-config.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/admin/instance-config.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -12,7 +12,8 @@
 
     /etc/cubicweb.d/myblog/all-in-one.conf
 
-It is a simple text file format INI. In the following description,
+It is a simple text file in the INI format
+(http://en.wikipedia.org/wiki/INI_file). In the following description,
 each option name is prefixed with its own section and followed by its
 default value if necessary, e.g. "`<section>.<option>` [value]."
 
@@ -64,8 +65,8 @@
      base-url = http://localhost/demo
      https-url = `https://localhost/demo`
 
-Setting up the web
-------------------
+Setting up the web client
+-------------------------
 :`web.embed-allowed`:
     regular expression matching sites which could be "embedded" in
     the site (controllers 'embed')
@@ -92,22 +93,26 @@
 -----------------------------------
 Web server side:
 
-:`pyro-client.pyro-instance-id`:
+:`pyro.pyro-instance-id`:
     pyro identifier of RQL server (e.g. the instance name)
 
 RQL server side:
 
-:`pyro-server.pyro-port`:
-    pyro port number. If none is specified, a port is assigned
+:`main.pyro-server`:
+    boolean to switch on/off pyro server-side
+
+:`pyro.pyro-host`:
+    pyro host:port number. If no port is specified, it is assigned
     automatically.
 
 RQL and web servers side:
 
-:`pyro-name-server.pyro-ns-host`:
+:`pyro.pyro-ns-host`:
     hostname hosting pyro server name. If no value is
     specified, it is located by a request from broadcast
-:`pyro-name-server.pyro-ns-group` [cubicweb]:
-    pyro group in which to save the instance
+
+:`pyro.pyro-ns-group`:
+    pyro group in which to save the instance (will default to 'cubicweb')
 
 
 Configuring e-mail
--- a/doc/book/en/admin/ldap.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/admin/ldap.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -47,6 +47,10 @@
 * data-cnx-password, password to use to open data connection to the
   ldap (eg used to respond to rql queries)
 
+If the LDAP server accepts anonymous binds, then it is possible to
+leave data-cnx-dn and data-cnx-password empty. This is, however, quite
+unlikely in practice.
+
 LDAP schema mapping:
 
 * user-base-dn, base DN to lookup for users
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/book/en/admin/pyro.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -0,0 +1,39 @@
+Working with a distributed client (using Pyro)
+==============================================
+
+In some circumstances, it is practical to split the repository and
+web-client parts of the application, for load-balancing reasons. Or
+one wants to access the repository from independant scripts to consult
+or update the database.
+
+For this to work, several steps have to be taken in order.
+
+You must first ensure that the apropriate software is installed and
+running (see ref:`setup`)::
+
+  pyro-nsd -x -p 6969
+
+Then you have to set appropriate options in your configuration. For
+instance::
+
+  pyro-server=yes
+  pyro-ns-host=localhost:6969
+
+  pyro-instance-id=myinstancename
+
+Finally, the client (for instance in the case of a script) must
+connect specifically, as in the following example code:
+
+.. sourcecode:: python
+
+    from cubicweb import dbapi
+
+    def pyro_connect(instname, login, password, pyro_ns_host):
+        cnx = dbapi.connect(instname, login, password, pyro_ns_host)
+        cnx.load_appobjects()
+        return cnx
+
+The 'cnx.load_appobjects()' line is optional. Without it you will get
+data through the connection roughly as you would from a DBAPI
+connection. With it, provided the cubicweb-client part is installed
+and accessible, you get the ORM goodies.
--- a/doc/book/en/admin/setup.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/admin/setup.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -132,7 +132,7 @@
 Please be careful to select the right python (2.5) and postgres (8.4)
 versions.
 
-Pyro enable remote access to cubicweb repository instances. Get it
+Pyro enables remote access to cubicweb repository instances. Get it
 there::
 
   http://sourceforge.net/projects/pyro/files/
@@ -373,7 +373,7 @@
 ```````````````````
 Yout must add the following lines in ``/etc/mysql/my.cnf`` file::
 
-    transaction-isolation = READ-COMMITTED
+    transaction-isolation=READ-COMMITTED
     default-storage-engine=INNODB
     default-character-set=utf8
     max_allowed_packet = 128M
@@ -382,6 +382,26 @@
     It is unclear whether mysql supports indexed string of arbitrary lenght or
     not.
 
+SQLServer configuration
+-----------------------
+
+As of this writing, sqlserver support is in progress. You should be
+able to connect, create a database and go quite far, but some of the
+generated SQL is still currently not accepted by the backend.
+
+The `source` configuration file may look like this (specific parts
+only are shown)::
+
+  [system]
+  db-driver=sqlserver2005
+  db-user=someuser
+  # database password not needed
+  #db-password=toto123
+  #db-create/init may ask for a pwd: just say anything
+  db-extra-arguments=Trusted_Connection
+  db-encoding=utf8
+
+
 Pyro configuration
 ------------------
 
--- a/doc/book/en/annexes/cubicweb-ctl.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/annexes/cubicweb-ctl.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -22,45 +22,71 @@
 
   cubicweb-ctl <command> --help
 
-Command to create a cube
-------------------------
+Listing available cubes and instance
+-------------------------------------
 
-* ``newcube``, create a new cube on the file system based on the name
-  given in the parameters. This command create a cube from a skeleton
-  that includes default files required for debian packaging.
+* ``list``, provides a list of the available configuration, cubes
+  and instances.
 
 
-Command to create an instance
------------------------------
-* ``create``, creates the files for the instance configuration
+Creation of a new cube
+-----------------------
+
+Create your new cube cube ::
+
+   cubicweb-ctl newcube
+
+This will create a new cube in
+``/path/to/forest/cubicweb/cubes/<mycube>`` for a Mercurial forest
+installation, or in ``/usr/share/cubicweb/cubes`` for a debian
+packages installation.
+
+Create an instance
+-------------------
+
+You must ensure `~/cubicweb.d/` exists prior to this. On windows, the
+'~' part will probably expand to 'Documents and Settings/user'.
+
+To create an instance from an existing cube, execute the following
+command ::
+
+   cubicweb-ctl create <cube_name> <instance_name>
+
+This command will create the configuration files of an instance in
+``~/etc/cubicweb.d/<instance_name>``.
+
+The tool ``cubicweb-ctl`` executes the command ``db-create`` and
+``db-init`` when you run ``create`` so that you can complete an
+instance creation in a single command. But of course it is possible
+to issue these separate commands separately, at a later stage.
+
+Command to create/initialize an instance database
+-------------------------------------------------
+
 * ``db-create``, creates the system database of an instance (tables and
   extensions only)
 * ``db-init``, initializes the system database of an instance
   (schema, groups, users, workflows...)
 
-By default, those three commandes are encapsulated in ``create`` so
-that they can be executed consecutively.
-
-Command to create an instance for Google AppEngine datastore source
--------------------------------------------------------------------
-* ``newgapp``, creates the configuration files for an instance
-
-This command needs to be followed by the commands responsible for
-the database initialization. As those are specific to the `datastore`,
-specific Google AppEgine database, they are not available for now
-in cubicweb-ctl, but they are available in the instance created.
-
-For more details, please see :ref:`gaecontents` .
-
 Commands to control instances
 -----------------------------
+
 * ``start``, starts one or more or all instances
+
+of special interest::
+
+  start -D
+
+will start in debug mode (under windows, starting without -D will not
+work; you need instead to setup your instance as a service).
+
 * ``stop``, stops one or more or all instances
 * ``restart``, restarts one or more or all instances
-* ``status``, returns the status of the instance
+* ``status``, returns the status of the instance(s)
 
 Commands to maintain instances
 ------------------------------
+
 * ``upgrade``, launches the existing instances migration when a new version
   of *CubicWeb* or the cubes installed is available
 * ``shell``, opens a migration shell for manual maintenance of the instance
@@ -82,41 +108,15 @@
 
 Other commands
 --------------
-* ``list``, provides a list of the available configuration, cubes
-  and instances.
 * ``delete``, deletes an instance (configuration files and database)
 
-
-Create an instance from an existing cube
-````````````````````````````````````````
-
-To create an instance from an existing cube, execute the following
-command ::
-
-   cubicweb-ctl create <cube_name> <instance_name>
-
-This command will create the configuration files of an instance in
-``~/etc/cubicweb.d/<instance_name>``.
-The tool ``cubicweb-ctl`` allows you to execute the command ``db-create``
-and ``db-init`` when you run ``create`` so that you can complete an
-instance creation in a single command.
+Command to create an instance for Google AppEngine datastore source
+-------------------------------------------------------------------
+* ``newgapp``, creates the configuration files for an instance
 
-If you decide not to execut those commands while ``cubicweb-ctl create``,
-then you will have to execute them seperately(``cubicweb-ctl db-create``,
-``cubicweb-ctl db-init`` ) otherwise your installation will not be complete
-and you will not be able to launch your instance.
-
-
-Creation of an instance from a new cube
-```````````````````````````````````````
+This command needs to be followed by the commands responsible for
+the database initialization. As those are specific to the `datastore`,
+specific Google AppEgine database, they are not available for now
+in cubicweb-ctl, but they are available in the instance created.
 
-Create first your new cube cube ::
-
-   cubicweb-ctl newcube <mycube>
-
-This will create a new cube in ``/path/to/forest/cubicweb/cubes/<mycube>``
-for a Mercurial forest installation, or in ``/usr/share/cubicweb/cubes``
-for a debian packages installation, and then create an instance as
-explained just above.
-
-
+For more details, please see :ref:`gaecontents` .
--- a/doc/book/en/annexes/faq.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/annexes/faq.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -44,6 +44,10 @@
 learning a new dialect. By using Python, we use standard OOP techniques and
 this is a key factor in a robust application.
 
+The `cwtags` (http://www.cubicweb.org/project/cwtags) package can be
+used in cubes to help generate html from Python with more comfort than
+raw strings.
+
 Why do you use the LGPL license to prevent me from doing X ?
 ------------------------------------------------------------
 
@@ -88,19 +92,22 @@
    component). Google App Engine is yet another supported target for
    RQL.
 
-[copy answer from forum, explain why similar to sparql and why better
-  than django and SQL]
-
-which ajax library is CubicWeb using ?
+Which ajax library is CubicWeb using ?
 --------------------------------------
 
-[CubicWeb uses jQuery and adds a thin layer on top of that]
+CubicWeb uses jQuery and provides a few helpers on top of
+that. Additionally, some jQuery plugins are provided (some are
+provided in specific cubes).
 
 
 How is security implemented ?
 ------------------------------
 
-This is an example of how it works in our framework:
+The basis for security is a mapping from operations to groups or
+arbitrary RQL expressions. These mappings are scoped to entities and
+relations.
+
+This is an example for an Entity Type definition:
 
 .. sourcecode:: python
 
@@ -108,36 +115,43 @@
         """a version is defining the content of a particular project's
         release"""
         # definition of attributes is voluntarily missing
-        permissions = {'read': ('managers', 'users', 'guests',),
-                       'update': ('managers', 'logilab', 'owners',),
-                       'delete': ('managers', ),
-                       'add': ('managers', 'logilab',
-                               ERQLExpression('X version_of PROJ, U in_group G, '
-                                              'PROJ require_permission P, '
-                                              'P name "add_version", P require_group G'),)}
+        __permissions__ = {'read': ('managers', 'users', 'guests',),
+                           'update': ('managers', 'logilab', 'owners'),
+                           'delete': ('managers',),
+                           'add': ('managers', 'logilab',
+                                   ERQLExpression('X version_of PROJ, U in_group G, '
+                                                  'PROJ require_permission P, '
+                                                  'P name "add_version", P require_group G'),)}
 
 The above means that permission to read a Version is granted to any
 user that is part of one of the groups 'managers', 'users', 'guests'.
 The 'add' permission is granted to users in group 'managers' or
-'logilab' and to users in group G, if G is linked by a permission
+'logilab' or to users in group G, if G is linked by a permission
 entity named "add_version" to the version's project.
 
+An example for a Relation Definition (RelationType both defines a
+relation type and implicitly one relation definition, on which the
+permissions actually apply):
+
 .. sourcecode:: python
 
     class version_of(RelationType):
         """link a version to its project. A version is necessarily linked
         to one and only one project. """
         # some lines voluntarily missing
-        permissions = {'read': ('managers', 'users', 'guests',),
-                       'delete': ('managers', ),
-                       'add': ('managers', 'logilab',
-                               RRQLExpression('O require_permission P, P name "add_version", '
-                               'U in_group G, P require_group G'),) }
+        __permissions__ = {'read': ('managers', 'users', 'guests',),
+                           'delete': ('managers', ),
+                           'add': ('managers', 'logilab',
+                                   RRQLExpression('O require_permission P, P name "add_version", '
+                                                  'U in_group G, P require_group G'),) }
+
+The main difference lies in the basic available operations (there is
+no 'update' operation) and the usage of an RRQLExpression (rql
+expression for a relation) instead of an ERQLExpression (rql
+expression for an entity).
 
 You can find additional information in the section :ref:`security`.
 
-[XXX what does the second example means in addition to the first one?]
-
 
 What is `Error while publishing rest text ...` ?
 ------------------------------------------------
@@ -270,6 +284,8 @@
 Any change applied to configuration file requires to restart your
 instance.
 
+You can find additional information in the section :ref:`LDAP`.
+
 I get NoSelectableObject exceptions, how do I debug selectors ?
 ---------------------------------------------------------------
 
--- a/doc/book/en/conf.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/conf.py	Thu Mar 04 09:57:40 2010 +0100
@@ -61,7 +61,7 @@
 today_fmt = '%B %d, %Y'
 
 # List of documents that shouldn't be included in the build.
-unused_docs = ['D070-modules-cbw-api.en',]
+unused_docs = []
 
 # List of directories, relative to source directories, that shouldn't be searched
 # for source files.
--- a/doc/book/en/development/datamodel/definition.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/datamodel/definition.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -266,8 +266,11 @@
   This can only be used for the actions `update` and `delete` of an entity
   type.
 
-It is also possible to use specific groups if they are defined in the precreate
-of the cube (``migration/precreate.py``).
+It is also possible to use specific groups if they are defined in the
+precreate of the cube (``migration/precreate.py``). Defining groups in
+postcreate or even later makes them NOT available for security
+purposes (in this case, an `sync_schema_props_perms` command have to
+be issued in a CubicWeb shell).
 
 
 Use of RQL expression for write permissions
--- a/doc/book/en/development/devweb/controllers.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/devweb/controllers.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -22,7 +22,7 @@
 
 * the JSon controller (web/views/basecontrollers.py) provides services
   for Ajax calls, typically using JSON as a serialization format for
-  input, and sometimes using either JSON or XML for output; 
+  input, and sometimes using either JSON or XML for output;
 
 * the Login/Logout controllers (web/views/basecontrollers.py) make
   effective user login or logout requests
--- a/doc/book/en/development/devweb/facets.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/devweb/facets.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -23,10 +23,10 @@
 The two other entity types defined in the schema are `Visit` and `Agency` but we
 can also guess from the above that this application uses the two cubes
 `comment`_ and
-`addressbook`_ (remember, cubicweb is only a game where you assemble cubes !). 
+`addressbook`_ (remember, cubicweb is only a game where you assemble cubes !).
 
 While we know that just defining the schema in enough to have a full, usable,
-(testable !) application, we also know that every application needs to be 
+(testable !) application, we also know that every application needs to be
 customized to fulfill the needs it was built for. So in this case, what we
 needed most was some custom filters that would let us restrict searches
 according
@@ -36,9 +36,9 @@
 
 .. sourcecode:: python
 
-  class PostalCodeFacet(RelationFacet): 
-      id = 'postalcode-facet'             # every registered class must have an id
-      __select__ = implements('Office')   # this facet should only be selected when 
+  class PostalCodeFacet(RelationFacet):
+      __regid__ = 'postalcode-facet'             # every registered class must have an id
+      __select__ = implements('Office')   # this facet should only be selected when
                                           # visualizing offices
       rtype = 'has_address'               # this facet is a filter on the entity linked to
                                           # the office thrhough the relation
@@ -57,18 +57,18 @@
 .. sourcecode:: python
 
   class SurfaceFacet(AttributeFacet):
-      id = 'surface-facet'              # every registered class must have an id
-      __select__ = implements('Office') # this facet should only be selected when 
+      __regid__ = 'surface-facet'              # every registered class must have an id
+      __select__ = implements('Office') # this facet should only be selected when
                                         # visualizing offices
-      rtype = 'surface'                 # the filter's key is the attribute "surface" 
-      comparator = '>='                 # override the default value of operator since 
+      rtype = 'surface'                 # the filter's key is the attribute "surface"
+      comparator = '>='                 # override the default value of operator since
                                         # we want to filter according to a
-                                        # minimal 
+                                        # minimal
                                         # value, not an exact one
 
       def rset_vocabulary(self, ___):
           """override the default vocabulary method since we want to hard-code
-          our threshold values. 
+          our threshold values.
           Not overriding would generate a filter box with all existing surfaces
           defined in the database.
           """
@@ -93,7 +93,7 @@
 We've just added two new kind of facets in CubicWeb :
 
 - The **RangeFacet** which displays a slider using `jquery`_
-  to choose a lower bound and an upper bound. The **RangeWidget** 
+  to choose a lower bound and an upper bound. The **RangeWidget**
   works with either numerical values or date values
 
 - The **HasRelationFacet** which displays a simple checkbox and
@@ -103,7 +103,7 @@
 .. image :: http://www.cubicweb.org/Image/343498?vid=download
 
 
-Here's an example of code that defines a facet to filter 
+Here's an example of code that defines a facet to filter
 musical works according to their composition date:
 
 .. sourcecode:: python
@@ -112,7 +112,7 @@
         # 1. make sure this facet is displayed only on Track selection
         __select__ = DateRangeFacet.__select__ & implements('Track')
         # 2. give the facet an id required by CubicWeb)
-        id = 'compdate-facet'
+        __regid__ = 'compdate-facet'
         # 3. specify the attribute name that actually stores the date in the DB
         rtype = 'composition_date'
 
--- a/doc/book/en/development/devweb/form.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/devweb/form.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -1,19 +1,22 @@
 Form construction
 ------------------
-CubicWeb provides usual form/field/widget/renderer abstraction to provde
-some generic building blocks which will greatly help you in building forms
-properly integrated with |cubicweb| (coherent display, error handling, etc...)
+
+CubicWeb provides usual form/field/widget/renderer abstraction to
+provde some generic building blocks which will greatly help you in
+building forms properly integrated with CubicWeb (coherent display,
+error handling, etc...).
 
-A form basically only hold a set of fields, and is bound to a renderer that is
-responsible to layout them. Each field is bound to a widget that will be used
-to fill in value(s) for that field.
+A form basically only holds a set of fields, and has te be bound to a
+renderer which is responsible to layout them. Each field is bound to a
+widget that will be used to fill in value(s) for that field (at form
+generation time) and 'decode' (fetch and give a proper Python type to)
+values sent back by the browser.
 
 The Field class and basic fields
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. autoclass:: cubicweb.web.formfields.Field
 
-
 Existing field types are:
 
 .. autoclass:: cubicweb.web.formfields.StringField
@@ -28,7 +31,6 @@
 .. autoclass:: cubicweb.web.formfields.DateTimeField
 .. autoclass:: cubicweb.web.formfields.TimeField
 .. autoclass:: cubicweb.web.formfields.RelationField
-.. XXX still necessary?
 .. autoclass:: cubicweb.web.formfields.CompoundField
 
 
@@ -57,9 +59,7 @@
 .. autoclass:: cubicweb.web.formwidgets.AutoCompletionWidget
 .. autoclass:: cubicweb.web.formwidgets.EditableURLWidget
 
-.. XXX StaticFileAutoCompletionWidget, RestrictedAutoCompletionWidget, AddComboBoxWidget, IntervalWidget, HorizontalLayoutWidget
-
-The following classes, which are not proper widget (they are not associated to
+Other classes in this module, which are not proper widget (they are not associated to
 field) but are used as form controls, may also be useful: Button, SubmitButton,
 ResetButton, ImgButton,
 
@@ -68,4 +68,10 @@
 
 Renderers
 ~~~~~~~~~
-XXX feed me
+
+.. autoclass:: cubicweb.web.views.formrenderers.BaseFormRenderer
+.. autoclass:: cubicweb.web.views.formrenderers.HTableFormRenderer
+.. autoclass:: cubicweb.web.views.formrenderers.EntityCompositeFormRenderer
+.. autoclass:: cubicweb.web.views.formrenderers.EntityFormRenderer
+.. autoclass:: cubicweb.web.views.formrenderers.EntityInlinedFormRenderer
+
--- a/doc/book/en/development/devweb/internationalization.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/devweb/internationalization.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -30,7 +30,7 @@
 
      class PrimaryView(EntityView):
          """the full view of an non final entity"""
-         id = 'primary'
+         __regid__ = 'primary'
          title = _('primary')
 
   OR
@@ -39,7 +39,7 @@
 
      class NoResultView(EmptyRsetView):
          """default view when no result has been found"""
-         id = 'noresult'
+         __regid__ = 'noresult'
 
          def call(self, **kwargs):
              self.w(u'<div class="searchMessage"><strong>%s</strong></div>\n'
--- a/doc/book/en/development/devweb/views.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/devweb/views.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -88,7 +88,7 @@
 .. sourcecode:: python
 
     class RSSView(XMLView):
-        id = 'rss'
+        __regid__ = 'rss'
         title = _('rss')
         templatable = False
         content_type = 'text/xml'
@@ -104,7 +104,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'
         title = _('search for association')
         __select__ = one_line_rset() & match_search_state('linksearch') & implements('Any')
 
@@ -152,7 +152,7 @@
  from cubicweb.web.views.primary import Primaryview
 
  class BlogPrimaryView(PrimaryView):
-     id = 'primary'
+     __regid__ = 'primary'
      __select__ = PrimaryView.__select__ & implements('Blog')
      rql = 'Any BE ORDERBY D DESC WHERE BE entry_of B, BE publish_date D, B eid %(b)s'
 
@@ -162,7 +162,7 @@
              self.w(u'<p>%s</p>' % entry.view('inblogcontext'))
 
  class BlogEntryInBlogView(EntityView):
-     id = 'inblogcontext'
+     __regid__ = 'inblogcontext'
      __select__ = implements('BlogEntry')
 
      def cell_call(self, row, col):
--- a/doc/book/en/development/entityclasses/interfaces.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/entityclasses/interfaces.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -3,18 +3,61 @@
 
 Same thing as object-oriented programming interfaces.
 
-XXX how to define a cw interface
+Definition of an interface is quite trivial. An example from cubicweb
+itself (found in cubicweb/interfaces.py):
+
+.. sourcecode:: python
+
+    class ITree(Interface):
+
+        def parent(self):
+            """returns the parent entity"""
+
+        def children(self):
+            """returns the item's children"""
+
+        def children_rql(self):
+            """XXX returns RQL to get children"""
+
+        def iterchildren(self):
+            """iterates over the item's children"""
+
+        def is_leaf(self):
+            """returns true if this node as no child"""
+
+        def is_root(self):
+            """returns true if this node has no parent"""
+
+        def root(self):
+            """returns the root object"""
+
 
 Declaration of interfaces implemented by a class
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-XXX __implements__
+.. sourcecode:: python
 
+  from cubicweb.interfaces import ITree
+  from cubicweb.mixins import TreeMixIn
+
+  class MyEntity(TreeMixIn, AnyEntity):
+      __regid__ = 'MyEntity'
+      __implements__ = AnyEntity.__implements__ + ('ITree',)
 
-Interfaces defined in the library
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+      tree_attribute = 'filed_under'
+
+The TreeMixIn here provides a default implementation for the
+interface. The tree_attribute class attribute is actually used by this
+implementation to help implement correct behaviour.
+
+Interfaces (and some implementations as mixins) defined in the library
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 .. automodule:: cubicweb.interface
    :members:
 
+.. automodule:: cubicweb.mixins
+   :members:
 
+
+
--- a/doc/book/en/development/entityclasses/load-sort.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/entityclasses/load-sort.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -24,6 +24,7 @@
   on the name attribute): ::
 
    class MyEntity(AnyEntity):
+       __regid__ = 'MyEntity'
        fetch_attrs = ('modification_date', 'name')
 
        @classmethod
@@ -45,7 +46,7 @@
 
   class Transition(AnyEntity):
     """..."""
-    id = 'Transition'
+    __regid__ = 'Transition'
     fetch_attrs, fetch_order = fetch_config(['name'])
 
 Indicates that for the entity type "Transition", you have to pre-load
--- a/doc/book/en/development/webstdlib/basetemplates.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/webstdlib/basetemplates.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -130,7 +130,7 @@
                                                     view=view, context=context))
         if boxes:
             for box in boxes:
-                if box.id == 'search_box':
+                if box.__regid__ == 'search_box':
                     box.dispatch(w=self.w, view=view)
 
 
@@ -159,7 +159,7 @@
 .. _TheMainTemplate:
 
 TheMainTemplate is responsible for the general layout of the entire application.
-It defines the template of ``id = main`` that is used by the instance.
+It defines the template of ``__regid__ = main`` that is used by the instance.
 
 The default main template (`cubicweb.web.views.basetemplates.TheMainTemplate`)
 builds the page based on the following pattern:
--- a/doc/book/en/development/webstdlib/primary.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/webstdlib/primary.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -27,7 +27,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
--- a/doc/book/en/development/webstdlib/xmlrss.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/development/webstdlib/xmlrss.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -3,6 +3,9 @@
 XML and RSS views (:mod:`cubicweb.web.views.xmlrss`)
 ----------------------------------------------------
 
+Overview
++++++++++
+
 *rss*
     Creates a RSS/XML view and call the view `rssitem` for each entity of
     the result set.
@@ -10,3 +13,50 @@
 *rssitem*
     Create a RSS/XML view for each entity based on the results of the dublin core
     methods of the entity (`dc_*`)
+
+
+RSS Channel Example
+++++++++++++++++++++
+
+Assuming you have several blog entries, click on the title of the
+search box in the left column. A larger search box should appear. Enter::
+
+   Any X ORDERBY D WHERE X is BlogEntry, X creation_date D
+
+and you get a list of blog entries.
+
+Click on your login at the top right corner. Chose "user preferences",
+then "boxes", then "possible views box" and check "visible = yes"
+before validating your changes.
+
+Enter the same query in the search box and you will see the same list,
+plus a box titled "possible views" in the left column. Click on
+"entityview", then "RSS".
+
+You just applied the "RSS" view to the RQL selection you requested.
+
+That's it, you have a RSS channel for your blog.
+
+Try again with::
+
+    Any X ORDERBY D WHERE X is BlogEntry, X creation_date D,
+    X entry_of B, B title "MyLife"
+
+Another RSS channel, but a bit more focused.
+
+A last one for the road::
+
+    Any C ORDERBY D WHERE C is Comment, C creation_date D LIMIT 15
+
+displayed with the RSS view, that's a channel for the last fifteen
+comments posted.
+
+[WRITE ME]
+
+* show that the RSS view can be used to display an ordered selection
+  of blog entries, thus providing a RSS channel
+
+* show that a different selection (by category) means a different channel
+
+
+
--- a/doc/book/en/intro/tutorial/maintemplate.rst	Wed Mar 03 19:20:03 2010 +0100
+++ b/doc/book/en/intro/tutorial/maintemplate.rst	Thu Mar 04 09:57:40 2010 +0100
@@ -116,7 +116,7 @@
 our application.
 
 TheMainTemplate is responsible for the general layout of the entire application.
-It defines the template of ``id = main`` that is used by the application. Is
+It defines the template of ``__regid__ = main`` that is used by the application. Is
 also defined in ``cubicweb/web/views/basetemplates.py`` another template that can
 be used based on TheMainTemplate called SimpleMainTemplate which does not have
 a top section.
--- a/server/test/unittest_querier.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/server/test/unittest_querier.py	Thu Mar 04 09:57:40 2010 +0100
@@ -867,6 +867,14 @@
         self.assert_(rset.rows)
         self.assertEquals(rset.description, [('Personne', 'Societe',)])
 
+    def test_insert_5bis(self):
+        peid = self.execute("INSERT Personne X: X nom 'bidule'")[0][0]
+        self.execute("INSERT Societe Y: Y nom 'toto', X travaille Y WHERE X eid %(x)s",
+                     {'x': peid}, 'x')
+        rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y')
+        self.assert_(rset.rows)
+        self.assertEquals(rset.description, [('Personne', 'Societe',)])
+
     def test_insert_6(self):
         self.execute("INSERT Personne X, Societe Y: X nom 'bidule', Y nom 'toto', X travaille Y")
         rset = self.execute('Any X, Y WHERE X nom "bidule", Y nom "toto", X travaille Y')
--- a/server/test/unittest_security.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/server/test/unittest_security.py	Thu Mar 04 09:57:40 2010 +0100
@@ -257,6 +257,26 @@
         self.assertEquals(rset.rows, [[aff2]])
         rset = cu.execute('Affaire X WHERE NOT X eid %(x)s', {'x': aff2}, 'x')
         self.assertEquals(rset.rows, [])
+        # test can't update an attribute of an entity that can't be readen
+        self.assertRaises(Unauthorized, cu.execute, 'SET X sujet "hacked" WHERE X eid %(x)s', {'x': eid}, 'x')
+
+
+    def test_entity_created_in_transaction(self):
+        affschema = self.schema['Affaire']
+        origperms = affschema.permissions['read']
+        affschema.set_action_permissions('read', affschema.permissions['add'])
+        try:
+            cnx = self.login('iaminusersgrouponly')
+            cu = cnx.cursor()
+            aff2 = cu.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
+            # entity created in transaction are readable *by eid*
+            self.failUnless(cu.execute('Any X WHERE X eid %(x)s', {'x':aff2}, 'x'))
+            # XXX would be nice if it worked
+            rset = cu.execute("Affaire X WHERE X sujet 'cool'")
+            self.assertEquals(len(rset), 0)
+        finally:
+            affschema.set_action_permissions('read', origperms)
+            cnx.close()
 
     def test_read_erqlexpr_has_text1(self):
         aff1 = self.execute("INSERT Affaire X: X sujet 'cool'")[0][0]
--- a/web/form.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/form.py	Thu Mar 04 09:57:40 2010 +0100
@@ -186,6 +186,11 @@
         # deleting validation errors here breaks form reloading (errors are
         # no more available), they have to be deleted by application's publish
         # method on successful commit
+        if hasattr(self, '_form_previous_values'):
+            # XXX behaviour changed in 3.6.1, warn
+            warn('[3.6.1] restore_previous_post already called, remove this call',
+                 DeprecationWarning, stacklevel=2)
+            return
         forminfo = self._cw.get_session_data(sessionkey, pop=True)
         if forminfo:
             self._form_previous_values = forminfo['values']
--- a/web/htmlwidgets.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/htmlwidgets.py	Thu Mar 04 09:57:40 2010 +0100
@@ -336,88 +336,3 @@
             yield column, self.model.sortvalue(rowindex, column.rset_sortcol)
 
 
-class ProgressBarWidget(HTMLWidget):
-    """display a progress bar widget"""
-    precision = 0.1
-    red_threshold = 1.1
-    orange_threshold = 1.05
-    yellow_threshold = 1
-
-    def __init__(self, done, todo, total):
-        self.done = done
-        self.todo = todo
-        self.budget = total
-
-    @property
-    def overrun(self):
-        """overrun = done + todo - """
-        if self.done + self.todo > self.budget:
-            overrun = self.done + self.todo - self.budget
-        else:
-            overrun = 0
-        if overrun < self.precision:
-            overrun = 0
-        return overrun
-
-    @property
-    def overrun_percentage(self):
-        """pourcentage overrun = overrun / budget"""
-        if self.budget == 0:
-            return 0
-        else:
-            return self.overrun * 100. / self.budget
-
-    def _render(self):
-        done = self.done
-        todo = self.todo
-        budget = self.budget
-        if budget == 0:
-            pourcent = 100
-        else:
-            pourcent = done*100./budget
-        if pourcent > 100.1:
-            color = 'red'
-        elif todo+done > self.red_threshold*budget:
-            color = 'red'
-        elif todo+done > self.orange_threshold*budget:
-            color = 'orange'
-        elif todo+done > self.yellow_threshold*budget:
-            color = 'yellow'
-        else:
-            color = 'green'
-        if pourcent < 0:
-            pourcent = 0
-
-        if floor(done) == done or done>100:
-            done_str = '%i' % done
-        else:
-            done_str = '%.1f' % done
-        if floor(budget) == budget or budget>100:
-            budget_str = '%i' % budget
-        else:
-            budget_str = '%.1f' % budget
-
-        title = u'%s/%s = %i%%' % (done_str, budget_str, pourcent)
-        short_title = title
-        if self.overrun_percentage:
-            title += u' overrun +%sj (+%i%%)' % (self.overrun,
-                                                 self.overrun_percentage)
-            overrun = self.overrun
-            if floor(overrun) == overrun or overrun>100:
-                overrun_str = '%i' % overrun
-            else:
-                overrun_str = '%.1f' % overrun
-            short_title += u' +%s' % overrun_str
-        # write bars
-        maxi = max(done+todo, budget)
-        if maxi == 0:
-            maxi = 1
-
-        cid = random.randint(0, 100000)
-        self.w(u'%s<br/>'
-               u'<canvas class="progressbar" id="canvas%i" width="100" height="10"></canvas>'
-               u'<script type="application/x-javascript">'
-               u'draw_progressbar("canvas%i", %i, %i, %i, "%s");</script>'
-               % (short_title.replace(' ','&nbsp;'), cid, cid,
-                  int(100.*done/maxi), int(100.*(done+todo)/maxi),
-                  int(100.*budget/maxi), color))
--- a/web/uicfg.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/uicfg.py	Thu Mar 04 09:57:40 2010 +0100
@@ -455,7 +455,7 @@
     """XXX for < 3.6 bw compat"""
     def tag_relation(self, key, tag):
         warn('autoform_is_inlined is deprecated, use autoform_section '
-             'with formtype="inlined", section="attributes" or section="hidden"',
+             'with formtype="main", section="inlined"',
              DeprecationWarning, stacklevel=3)
         section = tag and 'inlined' or 'hidden'
         autoform_section.tag_relation(key, 'main', section)
--- a/web/views/basetemplates.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/views/basetemplates.py	Thu Mar 04 09:57:40 2010 +0100
@@ -391,8 +391,9 @@
         self.w(u'<td id="lastcolumn">')
         self.w(u'</td>\n')
         self.w(u'</tr></table>\n')
-        self.wview('logform', rset=self.cw_rset, id='popupLoginBox', klass='hidden',
-                   title=False, showmessage=False)
+        if self._cw.cnx.anonymous_connection:
+            self.wview('logform', rset=self.cw_rset, id='popupLoginBox',
+                       klass='hidden', title=False, showmessage=False)
 
     def state_header(self):
         state = self._cw.search_state
--- a/web/views/formrenderers.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/views/formrenderers.py	Thu Mar 04 09:57:40 2010 +0100
@@ -44,6 +44,7 @@
     +--------------+--------------+
     | field1 label | field2 input |
     +--------------+--------------+
+
     +---------+
     | buttons |
     +---------+
@@ -131,9 +132,9 @@
             errors = form.remaining_errors()
             if errors:
                 if len(errors) > 1:
-                    templstr = '<li>%s</li>\n'
+                    templstr = u'<li>%s</li>\n'
                 else:
-                    templstr = '&#160;%s\n'
+                    templstr = u'&#160;%s\n'
                 for field, err in errors:
                     if field is None:
                         errormsg += templstr % err
@@ -168,7 +169,7 @@
         return tag + '>'
 
     def close_form(self, form, values):
-        """seem dump but important for consistency w/ close form, and necessary
+        """seems dumb but important for consistency w/ close form, and necessary
         for form renderers overriding open_form to use something else or more than
         and <form>
         """
--- a/web/views/iprogress.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/views/iprogress.py	Thu Mar 04 09:57:40 2010 +0100
@@ -8,13 +8,15 @@
 __docformat__ = "restructuredtext en"
 _ = unicode
 
+from math import floor
+
 from logilab.mtconverter import xml_escape
 
+from cubicweb.utils import make_uid
 from cubicweb.selectors import implements
 from cubicweb.interfaces import IProgress, IMileStone
 from cubicweb.schema import display_name
 from cubicweb.view import EntityView
-from cubicweb.web.htmlwidgets import ProgressBarWidget
 
 
 class ProgressTableView(EntityView):
@@ -182,11 +184,85 @@
     title = _('progress bar')
     __select__ = implements(IProgress)
 
+    precision = 0.1
+    red_threshold = 1.1
+    orange_threshold = 1.05
+    yellow_threshold = 1
+
+    @classmethod
+    def overrun(cls, entity):
+        """overrun = done + todo - """
+        if entity.done + entity.todo > entity.revised_cost:
+            overrun = entity.done + entity.todo - entity.revised_cost
+        else:
+            overrun = 0
+        if overrun < cls.precision:
+            overrun = 0
+        return overrun
+
+    @classmethod
+    def overrun_percentage(cls, entity):
+        """pourcentage overrun = overrun / budget"""
+        if entity.revised_cost == 0:
+            return 0
+        else:
+            return cls.overrun(entity) * 100. / entity.revised_cost
+
     def cell_call(self, row, col):
         self._cw.add_css('cubicweb.iprogress.css')
         self._cw.add_js('cubicweb.iprogress.js')
         entity = self.cw_rset.get_entity(row, col)
-        widget = ProgressBarWidget(entity.done, entity.todo,
-                                   entity.revised_cost)
-        self.w(widget.render())
+        done = entity.done
+        todo = entity.todo
+        budget = entity.revised_cost
+        if budget == 0:
+            pourcent = 100
+        else:
+            pourcent = done*100./budget
+        if pourcent > 100.1:
+            color = 'red'
+        elif todo+done > self.red_threshold*budget:
+            color = 'red'
+        elif todo+done > self.orange_threshold*budget:
+            color = 'orange'
+        elif todo+done > self.yellow_threshold*budget:
+            color = 'yellow'
+        else:
+            color = 'green'
+        if pourcent < 0:
+            pourcent = 0
 
+        if floor(done) == done or done>100:
+            done_str = '%i' % done
+        else:
+            done_str = '%.1f' % done
+        if floor(budget) == budget or budget>100:
+            budget_str = '%i' % budget
+        else:
+            budget_str = '%.1f' % budget
+
+        title = u'%s/%s = %i%%' % (done_str, budget_str, pourcent)
+        short_title = title
+        if self.overrun_percentage(entity):
+            title += u' overrun +%sj (+%i%%)' % (self.overrun(entity),
+                                                 self.overrun_percentage(entity))
+            overrun = self.overrun(entity)
+            if floor(overrun) == overrun or overrun>100:
+                overrun_str = '%i' % overrun
+            else:
+                overrun_str = '%.1f' % overrun
+            short_title += u' +%s' % overrun_str
+        # write bars
+        maxi = max(done+todo, budget)
+        if maxi == 0:
+            maxi = 1
+
+        cid = make_uid('progress_bar')
+        self._cw.html_headers.add_onload('draw_progressbar("canvas%s", %i, %i, %i, "%s");' %
+                                         (cid,
+                                          int(100.*done/maxi), int(100.*(done+todo)/maxi),
+                                          int(100.*budget/maxi), color),
+                                         jsoncall=self._cw.json_request)
+        self.w(u'%s<br/>'
+               u'<canvas class="progressbar" id="canvas%s" width="100" height="10"></canvas>'
+               % (short_title.replace(' ','&nbsp;'), cid))
--- a/web/views/workflow.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/views/workflow.py	Thu Mar 04 09:57:40 2010 +0100
@@ -67,7 +67,7 @@
         form = self.get_form(entity, transition)
         self.w(u'<h4>%s %s</h4>\n' % (self._cw._(transition.name),
                                       entity.view('oneline')))
-        msg = self.req._('status will change from %(st1)s to %(st2)s') % {
+        msg = self._cw._('status will change from %(st1)s to %(st2)s') % {
             'st1': entity.printable_state,
             'st2': self._cw._(transition.destination(entity).name)}
         self.w(u'<p>%s</p>\n' % msg)
--- a/web/views/xmlrss.py	Wed Mar 03 19:20:03 2010 +0100
+++ b/web/views/xmlrss.py	Thu Mar 04 09:57:40 2010 +0100
@@ -188,11 +188,14 @@
         self.w(u'<guid isPermaLink="true">%s</guid>\n'
                % xml_escape(entity.absolute_url()))
         self.render_title_link(entity)
-        self._marker('description', entity.dc_description(format='text/html'))
+        self.render_description(entity)
         self._marker('dc:date', entity.dc_date(self.date_format))
         self.render_entity_creator(entity)
         self.w(u'</item>\n')
 
+    def render_description(self, entity):
+        self._marker('description', entity.dc_description(format='text/html'))
+
     def render_title_link(self, entity):
         self._marker('title', entity.dc_long_title())
         self._marker('link', entity.absolute_url())