doc/book/devrepo/datamodel/definition.rst
author Denis Laxalde <denis.laxalde@logilab.fr>
Tue, 22 Dec 2015 09:23:00 +0100
changeset 11144 fd8bf29ed00e
parent 10496 e95b559a06a2
child 12879 7347715bf0ee
permissions -rw-r--r--
[tox] Generate test environments for Python 2.7 and 3.4 Test commands for each environment are written down explicitly since I could not find a way to extract the "package" name (e.g. "hooks") from the environment name (e.g. "py34-hooks"). For Python 3.4 interpreter, only environments (subpackages) that do not depend on cubes for their tests are listed since those test dependency cubes are not yet installable with Python 3.x. etwist is also not included since the Python 3 port is not complete at the moment. From local testing, py34 tests pass for the following subpackages: - dataimport - entities - ext - hooks - wsgi
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
     1
.. -*- coding: utf-8 -*-
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
     2
5953
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
     3
.. _datamodel_definition:
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
     4
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
     5
Yams *schema*
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
     6
-------------
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
     7
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
     8
The **schema** is the core piece of a *CubicWeb* instance as it
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
     9
defines and handles the data model. It is based on entity types that
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    10
are either already defined in `Yams`_ and the *CubicWeb* standard
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    11
library; or more specific types defined in cubes. The schema for a
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    12
cube is defined in a `schema` python module or package.
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    13
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    14
.. _`Yams`: http://www.logilab.org/project/yams
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    15
5953
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
    16
.. _datamodel_overview:
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
    17
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    18
Overview
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    19
~~~~~~~~
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    20
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    21
The core idea of the yams schema is not far from the classical
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    22
`Entity-relationship`_ model. But while an E/R model (or `logical
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    23
model`) traditionally has to be manually translated to a lower-level
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    24
data description language (such as the SQL `create table`
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    25
sublanguage), also often described as the `physical model`, no such
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    26
step is required with |yams| and |cubicweb|.
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    27
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    28
.. _`Entity-relationship`: http://en.wikipedia.org/wiki/Entity-relationship_model
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    29
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    30
This is because in addition to high-level, logical |yams| models, one
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    31
uses the |rql| data manipulation language to query, insert, update and
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    32
delete data. |rql| abstracts as much of the underlying SQL database as
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    33
a |yams| schema abstracts from the physical layout. The vagaries of
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    34
SQL are avoided.
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    35
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    36
As a bonus point, such abstraction make it quite comfortable to build
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    37
or use different backends to which |rql| queries apply.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    38
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    39
So, as in the E/R formalism, the building blocks are ``entities``
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    40
(:ref:`EntityType`), ``relationships`` (:ref:`RelationType`,
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    41
:ref:`RelationDefinition`) and ``attributes`` (handled like relation
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    42
with |yams|).
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    43
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    44
Let us detail a little the divergences between E/R and |yams|:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    45
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    46
* all relationship are binary which means that to represent a
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    47
  non-binary relationship, one has to use an entity,
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    48
* relationships do not support attributes (yet, see:
5349
023dbeb84cc2 [doc/book] fix wrong (https) url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5319
diff changeset
    49
  http://www.cubicweb.org/ticket/341318), hence the need to reify it
023dbeb84cc2 [doc/book] fix wrong (https) url
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5319
diff changeset
    50
  as an entity if need arises,
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    51
* all entities have an `eid` attribute (an integer) that is its
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    52
  primary key (but it is possible to declare uniqueness on other
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    53
  attributes)
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    54
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    55
Also |yams| supports the notions of:
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
    56
5400
b7ab099b128a [doc/book] various content fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5394
diff changeset
    57
* entity inheritance (quite experimental yet, and completely
b7ab099b128a [doc/book] various content fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5394
diff changeset
    58
  undocumented),
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    59
* relation type: that is, relationships can be established over a set
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    60
  of couple of entity types (henre the distinction made between
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    61
  `RelationType` and `RelationDefinition` below)
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    62
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    63
Finally |yams| has a few concepts of its own:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    64
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    65
* relationships being oriented and binary, we call the left hand
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    66
  entity type the `subject` and the right hand entity type the
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    67
  `object`
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    68
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    69
.. note::
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
    70
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    71
   The |yams| schema is available at run time through the .schema
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    72
   attribute of the `vregistry`.  It's an instance of
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    73
   :class:`cubicweb.schema.Schema`, which extends
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    74
   :class:`yams.schema.Schema`.
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
    75
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
    76
.. _EntityType:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    77
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    78
Entity type
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    79
~~~~~~~~~~~
5220
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
    80
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
    81
An entity type is an instance of :class:`yams.schema.EntitySchema`. Each entity type has
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
    82
a set of attributes and relations, and some permissions which define who can add, read,
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
    83
update or delete entities of this type.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
    84
6342
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    85
The following built-in types are available: ``String``,
10113
e1e8df594d58 [doc] Add BigInt to the list of built-in types
Christophe de Vienne <christophe@unlish.com>
parents: 9981
diff changeset
    86
``Int``, ``BigInt``, ``Float``, ``Decimal``, ``Boolean``,
6342
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    87
``Date``, ``Datetime``, ``Time``, ``Interval``, ``Byte`` and
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    88
``Password``. They can only be used as attributes of an other entity
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    89
type.
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    90
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    91
There is also a `RichString` kindof type:
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    92
10496
e95b559a06a2 [doc] more fixes of warnings/errors in doc build
David Douard <david.douard@logilab.fr>
parents: 10491
diff changeset
    93
.. autofunction:: yams.buildobjs.RichString
6342
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
    94
10093
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
    95
The ``__unique_together__`` class attribute is a list of tuples of names of
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
    96
attributes or inlined relations.  For each tuple, CubicWeb ensures the unicity
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
    97
of the combination.  For example:
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
    98
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
    99
.. sourcecode:: python
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   100
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   101
  class State(EntityType):
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   102
      __unique_together__ = [('name', 'state_of')]
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   103
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   104
      name = String(required=True)
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   105
      state_of = SubjectRelation('Workflow', cardinality='1*',
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   106
                                 composite='object', inlined=True)
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   107
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   108
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   109
You can find more base entity types in
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   110
:ref:`pre_defined_entity_types`.
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   111
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   112
.. XXX yams inheritance
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   113
5220
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   114
.. _RelationType:
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   115
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   116
Relation type
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   117
~~~~~~~~~~~~~
5220
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   118
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   119
A relation type is an instance of
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   120
:class:`yams.schema.RelationSchema`. A relation type is simply a
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   121
semantic definition of a kind of relationship that may occur in an
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   122
application.
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   123
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   124
It may be referenced by zero, one or more relation definitions.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   125
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   126
It is important to choose a good name, at least to avoid conflicts
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   127
with some semantically different relation defined in other cubes
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   128
(since there's only a shared name space for these names).
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   129
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   130
A relation type holds the following properties (which are hence shared
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   131
between all relation definitions of that type):
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   132
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   133
* `inlined`: boolean handling the physical optimization for archiving
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   134
  the relation in the subject entity table, instead of creating a specific
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   135
  table for the relation. This applies to relations where cardinality
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   136
  of subject->relation->object is 0..1 (`?`) or 1..1 (`1`) for *all* its relation
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   137
  definitions.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   138
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   139
* `symmetric`: boolean indicating that the relation is symmetrical, which
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   140
  means that `X relation Y` implies `Y relation X`.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   141
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   142
.. _RelationDefinition:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   143
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   144
Relation definition
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   145
~~~~~~~~~~~~~~~~~~~
5220
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   146
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   147
A relation definition is an instance of
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   148
:class:`yams.schema.RelationDefinition`. It is a complete triplet
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   149
"<subject entity type> <relation type> <object entity type>".
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   150
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   151
When creating a new instance of that class, the corresponding
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   152
:class:`RelationType` instance is created on the fly if necessary.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   153
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   154
Properties
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   155
``````````
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   156
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   157
The available properties for relation definitions are enumerated
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   158
here. There are several kind of properties, as some relation
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   159
definitions are actually attribute definitions, and other are not.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   160
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   161
Some properties may be completely optional, other may have a default
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   162
value.
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   163
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   164
Common properties for attributes and relations:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   165
10222
75d6096216d7 [docstrings] fix project-wide English language mistake
Dimitri Papadopoulos <dimitri.papadopoulos@cea.fr>
parents: 10168
diff changeset
   166
* `description`: a unicode string describing an attribute or a
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   167
  relation. By default this string will be used in the editing form of
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   168
  the entity, which means that it is supposed to help the end-user and
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   169
  should be flagged by the function `_` to be properly
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   170
  internationalized.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   171
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   172
* `constraints`: a list of conditions/constraints that the relation has to
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   173
  satisfy (c.f. `Constraints`_)
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   174
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   175
* `cardinality`: a two character string specifying the cardinality of
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   176
  the relation. The first character defines the cardinality of the
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   177
  relation on the subject, and the second on the object. When a
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   178
  relation can have multiple subjects or objects, the cardinality
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   179
  applies to all, not on a one-to-one basis (so it must be
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   180
  consistent...). Default value is '**'. The possible values are
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   181
  inspired from regular expression syntax:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   182
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   183
    * `1`: 1..1
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   184
    * `?`: 0..1
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   185
    * `+`: 1..n
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   186
    * `*`: 0..n
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   187
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   188
Attributes properties:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   189
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   190
* `unique`: boolean indicating if the value of the attribute has to be
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   191
  unique or not within all entities of the same type (false by
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   192
  default)
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   193
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   194
* `indexed`: boolean indicating if an index needs to be created for
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   195
  this attribute in the database (false by default). This is useful
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   196
  only if you know that you will have to run numerous searches on the
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   197
  value of this attribute.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   198
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   199
* `default`: default value of the attribute. In case of date types, the values
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   200
  which could be used correspond to the RQL keywords `TODAY` and `NOW`.
2172
cf8f9180e63e delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1714
diff changeset
   201
8125
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   202
* `metadata`: Is also accepted as an argument of the attribute contructor. It is
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   203
  not really an attribute property. see `Metadata`_ for details.
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   204
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   205
Properties for `String` attributes:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   206
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   207
* `fulltextindexed`: boolean indicating if the attribute is part of
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   208
  the full text index (false by default) (*applicable on the type
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   209
  `Byte` as well*)
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   210
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   211
* `internationalizable`: boolean indicating if the value of the
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   212
  attribute is internationalizable (false by default)
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   213
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   214
Relation properties:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   215
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   216
* `composite`: string indicating that the subject (composite ==
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   217
  'subject') is composed of the objects of the relations. For the
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   218
  opposite case (when the object is composed of the subjects of the
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   219
  relation), we just set 'object' as value. The composition implies
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   220
  that when the relation is deleted (so when the composite is deleted,
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   221
  at least), the composed are also deleted.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   222
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   223
* `fulltext_container`: string indicating if the value if the full
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   224
  text indexation of the entity on one end of the relation should be
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   225
  used to find the entity on the other end. The possible values are
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   226
  'subject' or 'object'. For instance the use_email relation has that
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   227
  property set to 'subject', since when performing a full text search
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   228
  people want to find the entity using an email address, and not the
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   229
  entity representing the email address.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   230
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   231
Constraints
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   232
```````````
4032
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   233
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   234
By default, the available constraint types are:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   235
4032
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   236
General Constraints
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   237
......................
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   238
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   239
* `SizeConstraint`: allows to specify a minimum and/or maximum size on
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   240
  string (generic case of `maxsize`)
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   241
9255
46f41c3e1443 remove 3.8 bw compat
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8125
diff changeset
   242
* `BoundaryConstraint`: allows to specify a minimum and/or maximum value
5220
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   243
  on numeric types and date
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   244
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   245
.. sourcecode:: python
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   246
10281
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   247
   from yams.constraints import BoundaryConstraint, TODAY, NOW, Attribute
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   248
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   249
   class DatedEntity(EntityType):
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   250
      start = Date(constraints=[BoundaryConstraint('>=', TODAY())])
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   251
      end = Date(constraints=[BoundaryConstraint('>=', Attribute('start'))])
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   252
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   253
   class Before(EntityType);
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   254
      last_time = DateTime(constraints=[BoundaryConstraint('<=', NOW())])
5220
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   255
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   256
* `IntervalBoundConstraint`: allows to specify an interval with
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   257
  included values
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   258
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   259
.. sourcecode:: python
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   260
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   261
     class Node(EntityType):
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   262
         latitude = Float(constraints=[IntervalBoundConstraint(-90, +90)])
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   263
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   264
* `UniqueConstraint`: identical to "unique=True"
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   265
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   266
* `StaticVocabularyConstraint`: identical to "vocabulary=(...)"
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   267
10281
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   268
Constraints can be dependent on a fixed value (90, Date(2015,3,23)) or a variable.
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   269
In this second case, yams can handle :
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   270
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   271
* `Attribute`: compare to the value of another attribute.
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   272
* `TODAY`: compare to the current Date.
cc9eb88377f4 [documentation] add note concerning Attribute, TODAY and NOW in yams documentation
Erica Marco <erica.marco@logilab.fr>
parents: 10168
diff changeset
   273
* `NOW`: compare to the current Datetime.
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   274
4032
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   275
RQL Based Constraints
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   276
......................
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   277
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   278
RQL based constraints may take three arguments. The first one is the ``WHERE``
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   279
clause of a RQL query used by the constraint. The second argument ``mainvars``
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   280
is the ``Any`` clause of the query. By default this include `S` reserved for the
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   281
subject of the relation and `O` for the object. Additional variables could be
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   282
specified using ``mainvars``. The argument expects a single string with all
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   283
variable's name separated by spaces. The last one, ``msg``, is the error message
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   284
displayed when the constraint fails. As RQLVocabularyConstraint never fails the
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   285
third argument is not available.
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   286
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   287
* `RQLConstraint`: allows to specify a RQL query that has to be satisfied
4032
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   288
  by the subject and/or the object of relation. In this query the variables
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   289
  `S` and `O` are reserved for the relation subject and object entities.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   290
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   291
* `RQLVocabularyConstraint`: similar to the previous type of constraint except
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   292
  that it does not express a "strong" constraint, which means it is only used to
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   293
  restrict the values listed in the drop-down menu of editing form, but it does
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   294
  not prevent another entity to be selected.
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   295
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   296
* `RQLUniqueConstraint`: allows to the specify a RQL query that ensure that an
4032
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   297
  attribute is unique in a specific context. The Query must **never** return more
c3a018efe7c9 Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 3811
diff changeset
   298
  than a single result to be satisfied. In this query the variables `S` is
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   299
  reserved for the relation subject entity. The other variables should be
10093
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   300
  specified with the second constructor argument (mainvars). This constraint type
516a44ae2cc9 [book] document __unique_together__, remove bad RQLUniqueConstraint example
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   301
  should be used when __unique_together__ doesn't fit.
4040
00e2f1ae625d Update generic RQL Based Constraints and RQLUniqueConstraint doc
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 4032
diff changeset
   302
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   303
.. XXX note about how to add new constraint
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   304
4936
a4b772a0d801 Fixed some of the documentation warnings when building the book with sphinx.
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4744
diff changeset
   305
.. _securitymodel:
a4b772a0d801 Fixed some of the documentation warnings when building the book with sphinx.
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4744
diff changeset
   306
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   307
The security model
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   308
~~~~~~~~~~~~~~~~~~
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   309
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   310
The security model of `CubicWeb` is based on `Access Control List`.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   311
The main principles are:
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   312
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   313
* users and groups of users
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   314
* a user belongs to at least one group of user
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   315
* permissions (`read`, `update`, `create`, `delete`)
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   316
* permissions are assigned to groups (and not to users)
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   317
2175
16d3c37c5d28 [doc] improvements
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2172
diff changeset
   318
For *CubicWeb* in particular:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   319
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   320
* we associate rights at the entities/relations schema level
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   321
6591
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   322
* the default groups are: `managers`, `users` and `guests`
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   323
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   324
* users belong to the `users` group
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   325
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   326
* there is a virtual group called `owners` to which we can associate only
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   327
  `delete` and `update` permissions
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   328
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   329
  * we can not add users to the `owners` group, they are implicitly added to it
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   330
    according to the context of the objects they own
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   331
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   332
  * the permissions of this group are only checked on `update`/`delete` actions
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   333
    if all the other groups the user belongs to do not provide those permissions
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   334
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   335
Setting permissions is done with the class attribute `__permissions__`
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   336
of entity types and relation definitions. The value of this attribute
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   337
is a dictionary where the keys are the access types (action), and the
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   338
values are the authorized groups or rql expressions.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   339
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   340
For an entity type, the possible actions are `read`, `add`, `update` and
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   341
`delete`.
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   342
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   343
For a relation, the possible actions are `read`, `add`, and `delete`.
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   344
9395
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9320
diff changeset
   345
For an attribute, the possible actions are `read`, `add` and `update`,
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9320
diff changeset
   346
and they are a refinement of an entity type permission.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   347
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   348
.. note::
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   349
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   350
   By default, the permissions of an entity type attributes are
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   351
   equivalent to the permissions of the entity type itself.
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   352
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   353
   It is possible to provide custom attribute permissions which are
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   354
   stronger than, or are more lenient than the entity type
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   355
   permissions.
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   356
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   357
   In a situation where all attributes were given custom permissions,
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   358
   the entity type permissions would not be checked, except for the
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   359
   `delete` action.
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   360
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   361
For each access type, a tuple indicates the name of the authorized groups and/or
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   362
one or multiple RQL expressions to satisfy to grant access. The access is
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   363
provided if the user is in one of the listed groups or if one of the RQL condition
4452
5d6dec2c4650 [doc] small fixes on security part
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3811
diff changeset
   364
is satisfied.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   365
6591
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   366
Default permissions
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   367
```````````````````
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   368
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   369
The default permissions for ``EntityType`` are:
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   370
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   371
.. sourcecode:: python
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   372
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   373
   __permissions__ = {
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   374
        'read': ('managers', 'users', 'guests',),
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   375
        'update': ('managers', 'owners',),
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   376
        'delete': ('managers', 'owners'),
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   377
        'add': ('managers', 'users',)
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   378
        }
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   379
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   380
The default permissions for relations are:
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   381
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   382
.. sourcecode:: python
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   383
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   384
   __permissions__ = {'read': ('managers', 'users', 'guests',),
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   385
                    'delete': ('managers', 'users'),
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   386
                    'add': ('managers', 'users',)}
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   387
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   388
The default permissions for attributes are:
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   389
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   390
.. sourcecode:: python
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   391
b5ed84c53b3f [book] complete datamodel definition section with default permissions
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6342
diff changeset
   392
   __permissions__ = {'read': ('managers', 'users', 'guests',),
9395
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9320
diff changeset
   393
                      'add': ('managers', ERQLExpression('U has_add_permission X'),
96dba2efd16d [hooks/security] provide attribute "add" permission
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9320
diff changeset
   394
                      'update': ('managers', ERQLExpression('U has_update_permission X')),}
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   395
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   396
.. note::
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   397
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   398
   The default permissions for attributes are not syntactically
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   399
   equivalent to the default permissions of the entity types, but the
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   400
   rql expressions work by delegating to the entity type permissions.
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   401
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   402
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   403
The standard user groups
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   404
````````````````````````
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   405
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   406
* `guests`
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   407
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   408
* `users`
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   409
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   410
* `managers`
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   411
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   412
* `owners`: virtual group corresponding to the entity's owner.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   413
  This can only be used for the actions `update` and `delete` of an entity
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   414
  type.
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   415
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   416
It is also possible to use specific groups if they are defined in the precreate
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   417
script of the cube (``migration/precreate.py``). Defining groups in postcreate
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   418
script or later makes them unavailable for security purposes (in this case, an
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   419
`sync_schema_props_perms` command has to be issued in a CubicWeb shell).
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   420
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   421
3283
4f53eb3f1331 more doc
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 3144
diff changeset
   422
Use of RQL expression for write permissions
4464
437cc57f7474 fix rest syntax error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4459
diff changeset
   423
```````````````````````````````````````````
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   424
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   425
It is possible to define RQL expression to provide update permission (`add`,
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   426
`delete` and `update`) on entity type / relation definitions. An rql expression
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   427
is a piece of query (corresponds to the WHERE statement of an RQL query), and the
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   428
expression will be considered as satisfied if it returns some results. They can
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   429
not be used in `read` permission.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   430
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   431
To use RQL expression in entity type permission:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   432
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   433
* you have to use the class :class:`~cubicweb.schema.ERQLExpression`
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   434
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   435
* in this expression, the variables `X` and `U` are pre-defined references
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   436
  respectively on the current entity (on which the action is verified) and on the
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   437
  user who send the request
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   438
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   439
For RQL expressions on a relation type, the principles are the same except for
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   440
the following:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   441
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   442
* you have to use the class :class:`~cubicweb.schema.RRQLExpression` instead of
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   443
  :class:`~cubicweb.schema.ERQLExpression`
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   444
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   445
* in the expression, the variables `S`, `O` and `U` are pre-defined references to
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   446
  respectively the subject and the object of the current relation (on which the
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   447
  action is being verified) and the user who executed the query
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   448
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   449
To define security for attributes of an entity (non-final relation), you have to
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   450
use the class :class:`~cubicweb.schema.ERQLExpression` in which `X` represents
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   451
the entity the attribute belongs to.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   452
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   453
It is possible to use in those expression a special relation
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   454
`has_<ACTION>_permission` where the subject is the user (eg 'U') and the object
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   455
is any variable representing an entity (usually 'X' in
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   456
:class:`~cubicweb.schema.ERQLExpression`, 'S' or 'O' in
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   457
:class:`~cubicweb.schema.RRQLExpression`), meaning that the user needs to have
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   458
permission to execute the action <ACTION> on the entities represented by this
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   459
variable. It's recommanded to use this feature whenever possible since it
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   460
simplify greatly complex security definition and upgrade.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   461
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   462
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   463
.. sourcecode:: python
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   464
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   465
  class my_relation(RelationDefinition):
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   466
    __permissions__ = {'read': ('managers', 'users'),
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   467
                       'add': ('managers', RRQLExpression('U has_update_permission S')),
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   468
                       'delete': ('managers', RRQLExpression('U has_update_permission S'))
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   469
		       }
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   470
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   471
In the above example, user will be allowed to add/delete `my_relation` if he has
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   472
the `update` permission on the subject of the relation.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   473
5351
ecf07370e6db [doc/book] a proper note (style)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5349
diff changeset
   474
.. note::
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   475
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   476
  Potentially, the `use of an RQL expression to add an entity or a relation` can
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   477
  cause problems for the user interface, because if the expression uses the
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   478
  entity or the relation to create, we are not able to verify the permissions
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   479
  before we actually added the entity (please note that this is not a problem for
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   480
  the RQL server at all, because the permissions checks are done after the
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   481
  creation). In such case, the permission check methods
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   482
  (CubicWebEntitySchema.check_perm and has_perm) can indicate that the user is
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   483
  not allowed to create this entity while it would obtain the permission.  To
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   484
  compensate this problem, it is usually necessary in such case to use an action
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   485
  that reflects the schema permissions but which check properly the permissions
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   486
  so that it would show up only if possible.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   487
2172
cf8f9180e63e delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1714
diff changeset
   488
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   489
Use of RQL expression for reading rights
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   490
````````````````````````````````````````
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   491
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   492
The principles are the same but with the following restrictions:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   493
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   494
* you can not use rql expression for the `read` permission of relations and
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   495
  attributes,
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   496
6148
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   497
* you can not use special `has_<ACTION>_permission` relation in the rql
59c446a813b5 [book] more about has_<action>_permission and enhance a bit security definition section
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6120
diff changeset
   498
  expression.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   499
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   500
6120
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   501
Important notes about write permissions checking
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   502
````````````````````````````````````````````````
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   503
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   504
Write permissions (e.g. 'add', 'update', 'delete') are checked in core hooks.
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   505
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   506
When a permission is checked slightly vary according to if it's an entity or
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   507
relation, and if the relation is an attribute relation or not). It's important to
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   508
understand that since according to when a permission is checked, values returned
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   509
by rql expressions may changes, hence the permission being granted or not.
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   510
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   511
Here are the current rules:
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   512
9320
15bd24f9b9e0 [doc/book/security] update description of entity update (Related to #2932033)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9255
diff changeset
   513
1. permission to add/update entity and its attributes are checked on
15bd24f9b9e0 [doc/book/security] update description of entity update (Related to #2932033)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9255
diff changeset
   514
   commit
6120
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   515
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   516
2. permission to delete an entity is checked in 'before_delete_entity' hook
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   517
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   518
3. permission to add a relation is checked either:
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   519
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   520
   - in 'before_add_relation' hook if the relation type is in the
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   521
     `BEFORE_ADD_RELATIONS` set
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   522
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   523
   - else at commit time if the relation type is in the `ON_COMMIT_ADD_RELATIONS`
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   524
     set
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   525
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   526
   - else in 'after_add_relation' hook (the default)
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   527
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   528
4. permission to delete a relation is checked in 'before_delete_relation' hook
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   529
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   530
Last but not least, remember queries issued from hooks and operation are by
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   531
default 'unsafe', eg there are no read or write security checks.
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   532
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   533
See :mod:`cubicweb.hooks.security` for more details.
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   534
c000e41316ec [book] some more documentation and cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5953
diff changeset
   535
5953
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
   536
.. _yams_example:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   537
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   538
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   539
Derived attributes and relations
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   540
--------------------------------
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   541
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   542
.. note:: **TODO** Check organisation of the whole chapter of the documentation
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   543
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   544
Cubicweb offers the possibility to *query* data using so called
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   545
*computed* relations and attributes. Those are *seen* by RQL requests
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   546
as normal attributes and relations but are actually derived from other
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   547
attributes and relations. In a first section we'll informally review
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   548
two typical use cases. Then we see how to use computed attributes and
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   549
relations in your schema. Last we will consider various significant
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   550
aspects of their implementation and the impact on their usage.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   551
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   552
Motivating use cases
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   553
~~~~~~~~~~~~~~~~~~~~
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   554
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   555
Computed (or reified) relations
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   556
```````````````````````````````
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   557
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   558
It often arises that one must represent a ternary relation, or a
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   559
family of relations. For example, in the context of an exhibition
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   560
catalog you might want to link all *contributors* to the *work* they
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   561
contributed to, but this contribution can be as *illustrator*,
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   562
*author*, *performer*, ...
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   563
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   564
The classical way to describe this kind of information within an
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   565
entity-relationship schema is to *reify* the relation, that is turn
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   566
the relation into a entity. In our example the schema will have a
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   567
*Contribution* entity type used to represent the family of the
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   568
contribution relations.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   569
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   570
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   571
.. sourcecode:: python
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   572
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   573
    class ArtWork(EntityType):
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   574
        name = String()
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   575
        ...
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   576
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   577
    class Person(EntityType):
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   578
        name = String()
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   579
        ...
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   580
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   581
    class Contribution(EntityType):
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   582
        contributor = SubjectRelation('Person', cardinality='1*', inlined=True)
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   583
        manifestation = SubjectRelation('ArtWork')
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   584
        role = SubjectRelation('Role')
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   585
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   586
    class Role(EntityType):
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   587
        name = String()
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   588
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   589
But then, in order to query the illustrator(s) ``I`` of a work ``W``,
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   590
one has to write::
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   591
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   592
    Any I, W WHERE C is Contribution, C contributor I, C manifestation W,
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   593
                   C role R, R name 'illustrator'
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   594
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   595
whereas we would like to be able to simply write::
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   596
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   597
    Any I, W WHERE I illustrator_of W
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   598
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   599
This is precisely what the computed relations allow.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   600
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   601
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   602
Computed (or synthesized) attribute
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   603
```````````````````````````````````
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   604
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   605
Assuming a trivial schema for describing employees in companies, one
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   606
can be interested in the total of salaries payed by a company for
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   607
all its employees. One has to write::
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   608
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   609
    Any C, SUM(SA) GROUPBY S WHERE E works_for C, E salary SA
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   610
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   611
whereas it would be most convenient to simply write::
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   612
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   613
    Any C, TS WHERE C total_salary TS
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   614
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   615
And this is again what computed attributes provide.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   616
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   617
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   618
Using computed attributes and relations
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   619
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   620
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   621
Computed (or reified) relations
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   622
```````````````````````````````
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   623
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   624
In the above case we would define the *computed relation*
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   625
``illustrator_of`` in the schema by:
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   626
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   627
.. sourcecode:: python
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   628
10168
136e6b655cdb [doc] Fix class name for ComputedRelation; fix code block about computed attributes
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10136
diff changeset
   629
    class illustrator_of(ComputedRelation):
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   630
        rule  = ('C is Contribution, C contributor S, C manifestation O,'
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   631
                 'C role R, R name "illustrator"')
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   632
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   633
You will note that:
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   634
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   635
* the ``S`` and ``O`` RQL variables implicitly identify the subject and
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   636
  object of the defined computed relation, akin to what happens in
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   637
  RRQLExpression
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   638
* the possible subject and object entity types are inferred from the rule;
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   639
* computed relation definitions always have empty *add* and *delete* permissions
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   640
* *read* permissions can be defined, permissions from the relations used in the
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   641
  rewrite rule **are not considered** ;
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   642
* nothing else may be defined on the `ComputedRelation` subclass beside
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   643
  description, permissions and rule (e.g. no cardinality, composite, etc.,).
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   644
  `BadSchemaDefinition` is raised on attempt to specify other attributes;
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   645
* computed relations can not be used in 'SET' and 'DELETE' rql queries
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   646
  (`BadQuery` exception raised).
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   647
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   648
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   649
NB: The fact that the *add* and *delete* permissions are *empty* even
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   650
for managers is expected to make the automatic UI not attempt to edit
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   651
them.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   652
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   653
Computed (or synthesized) attributes
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   654
````````````````````````````````````
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   655
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   656
In the above case we would define the *computed attribute*
10168
136e6b655cdb [doc] Fix class name for ComputedRelation; fix code block about computed attributes
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 10136
diff changeset
   657
``total_salary`` on the ``Company`` entity type in the schema by:
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   658
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   659
.. sourcecode:: python
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   660
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   661
    class Company(EntityType):
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   662
        name = String()
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   663
        total_salary = Int(formula='Any SUM(SA) GROUPBY E WHERE P works_for X, E salary SA')
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   664
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   665
* the ``X`` RQL variable implicitly identifies the entity holding the
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   666
  computed attribute, akin to what happens in ERQLExpression;
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   667
* the type inferred from the formula is checked against the declared type, and
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   668
  `BadSchemaDefinition` is raised if they don't match;
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   669
* the computed attributes always have empty *update* permissions
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   670
* `BadSchemaDefinition` is raised on attempt to set 'update' permissions;
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   671
* 'read' permissions can be defined, permissions regarding the formula
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   672
  **are not considered**;
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   673
* other attribute's property (inlined, ...) can be defined as for normal attributes;
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   674
* Similarly to computed relation, computed attribute can't be used in 'SET' and
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   675
  'DELETE' rql queries (`BadQuery` exception raised).
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   676
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   677
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   678
API and implementation
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   679
~~~~~~~~~~~~~~~~~~~~~~
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   680
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   681
Representation in the data backend
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   682
``````````````````````````````````
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   683
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   684
Computed relations have no direct representation at the SQL table
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   685
level.  Instead, each time a query is issued the query is rewritten to
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   686
replace the computed relation by its equivalent definition and the
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   687
resulting rewritten query is performed in the usual way.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   688
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   689
On the contrary, computed attributes are represented as a column in the
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   690
table for their host entity type, just like normal attributes. Their
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   691
value is kept up-to-date with respect to their defintion by a system
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   692
of hooks (also called triggers in most RDBMS) which recomputes them
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   693
when the relations and attributes they depend on are modified.
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   694
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   695
Yams API
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   696
````````
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   697
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   698
When accessing the schema through the *yams API* (not when defining a
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   699
schema in a ``schema.py`` file) the computed attributes and relations
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   700
are represented as follows:
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   701
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   702
relations
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   703
    The ``yams.RelationSchema`` class has a new ``rule`` attribute
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   704
    holding the rule as a string. If this attribute is set all others
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   705
    must not be set.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   706
attributes
9973
bbe05c74eb92 [doc] proofreading CWEP002 section
Julien Cristau <julien.cristau@logilab.fr>
parents: 9972
diff changeset
   707
    A new property ``formula`` is added on class
9972
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   708
    ``yams.RelationDefinitionSchema`` alomng with a new keyword
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   709
    argument ``formula`` on the initializer.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   710
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   711
Migration
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   712
`````````
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   713
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   714
The migrations are to be handled as summarized in the array below.
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   715
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   716
+------------+---------------------------------------------------+---------------------------------------+
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   717
|            | Computed rtype                                    | Computed attribute                    |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   718
+============+===================================================+=======================================+
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   719
| add        | * add_relation_type                               | * add_attribute                       |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   720
|            | * add_relation_definition should trigger an error | * add_relation_definition             |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   721
+------------+---------------------------------------------------+---------------------------------------+
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   722
| modify     | * sync_schema_prop_perms:                         | * sync_schema_prop_perms:             |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   723
|            |   checks the rule is                              |                                       |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   724
| (rule or   |   synchronized with the database                  |   - empty the cache,                  |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   725
| formula)   |                                                   |   - check formula,                    |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   726
|            |                                                   |   - make sure all the values get      |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   727
|            |                                                   |     updated                           |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   728
+------------+---------------------------------------------------+---------------------------------------+
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   729
| del        | * drop_relation_type                              | * drop_attribute                      |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   730
|            | * drop_relation_definition should trigger an error| * drop_relation_definition            |
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   731
+------------+---------------------------------------------------+---------------------------------------+
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   732
e210f0e082b0 [CWEP002] document computed relations and attributes
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 9395
diff changeset
   733
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   734
Defining your schema using yams
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   735
-------------------------------
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   736
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   737
Entity type definition
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   738
~~~~~~~~~~~~~~~~~~~~~~
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   739
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   740
An entity type is defined by a Python class which inherits from
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   741
:class:`yams.buildobjs.EntityType`.  The class definition contains the
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   742
description of attributes and relations for the defined entity type.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   743
The class name corresponds to the entity type name. It is expected to
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   744
be defined in the module ``mycube.schema``.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   745
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   746
:Note on schema definition:
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   747
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   748
 The code in ``mycube.schema`` is not meant to be executed. The class
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   749
 EntityType mentioned above is different from the EntitySchema class
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   750
 described in the previous chapter. EntityType is a helper class to
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   751
 make Entity definition easier. Yams will process EntityType classes
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   752
 and create EntitySchema instances from these class definitions. Similar
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   753
 manipulation happen for relations.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   754
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   755
When defining a schema using python files, you may use the following shortcuts:
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   756
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   757
- `required`: boolean indicating if the attribute is required, ed subject cardinality is '1'
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   758
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   759
- `vocabulary`: specify static possible values of an attribute
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   760
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   761
- `maxsize`: integer providing the maximum size of a string (no limit by default)
4437
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   762
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   763
For example:
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   764
21f2e01fdd6a update exemples using the 3.6 api and add/fix some sections (schema, vreg, talk about CW_MODE in concepts...). So much to do :'(
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4430
diff changeset
   765
.. sourcecode:: python
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   766
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   767
  class Person(EntityType):
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   768
    """A person with the properties and the relations necessary for my
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   769
    application"""
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   770
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   771
    last_name = String(required=True, fulltextindexed=True)
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   772
    first_name = String(required=True, fulltextindexed=True)
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   773
    title = String(vocabulary=('Mr', 'Mrs', 'Miss'))
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   774
    date_of_birth = Date()
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   775
    works_for = SubjectRelation('Company', cardinality='?*')
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   776
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   777
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   778
The entity described above defines three attributes of type String,
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   779
last_name, first_name and title, an attribute of type Date for the date of
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   780
birth and a relation that connects a `Person` to another entity of type
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   781
`Company` through the semantic `works_for`.
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   782
6342
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
   783
efd5ba519263 [book] Talk about RichString in 'Yams schema' section
Stephanie Marcu <stephanie.marcu@logilab.fr>
parents: 6150
diff changeset
   784
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   785
:Naming convention:
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   786
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   787
 Entity class names must start with an uppercase letter. The common
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   788
 usage is to use ``CamelCase`` names.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   789
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   790
 Attribute and relation names must start with a lowercase letter. The
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   791
 common usage is to use ``underscore_separated_words``. Attribute and
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   792
 relation names starting with a single underscore are permitted, to
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   793
 denote a somewhat "protected" or "private" attribute.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   794
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   795
 In any case, identifiers starting with "CW" or "cw" are reserved for
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   796
 internal use by the framework.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   797
8125
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   798
 .. _Metadata:
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   799
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   800
 Some attribute using the name of another attribute as prefix are considered
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   801
 metadata.  For example, if an EntityType have both a ``data`` and
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   802
 ``data_format`` attribute, ``data_format`` is view as the ``format`` metadata
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   803
 of ``data``. Later the :meth:`cw_attr_metadata` method will allow you to fetch
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   804
 metadata related to an attribute. There are only three valid metadata names:
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   805
 ``format``, ``encoding`` and ``name``.
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   806
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   807
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   808
The name of the Python attribute corresponds to the name of the attribute
2175
16d3c37c5d28 [doc] improvements
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2172
diff changeset
   809
or the relation in *CubicWeb* application.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   810
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   811
An attribute is defined in the schema as follows::
2172
cf8f9180e63e delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1714
diff changeset
   812
8125
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   813
    attr_name = AttrType(*properties, metadata={})
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   814
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   815
where
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   816
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   817
* `AttrType`: is one of the type listed in EntityType_,
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   818
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   819
* `properties`: is a list of the attribute needs to satisfy (see `Properties`_
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   820
  for more details),
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   821
8125
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   822
* `metadata`: is a dictionary of meta attributes related to ``attr_name``.
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   823
  Dictionary keys are the name of the meta attribute. Dictionary values
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   824
  attributes objects (like the content of ``AttrType``). For each entry of the
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   825
  metadata dictionary a ``<attr_name>_<key> = <value>`` attribute is
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   826
  automaticaly added to the EntityType.  see `Metadata`_ section for details
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   827
  about valid key.
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   828
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   829
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   830
 ---
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   831
7070250bf50d [schema] React to yams improvement of metadata attribute handling.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7797
diff changeset
   832
While building your schema
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   833
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   834
* it is possible to use the attribute `meta` to flag an entity type as a `meta`
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   835
  (e.g. used to describe/categorize other entities)
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   836
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   837
.. XXX the paragraph below needs clarification and / or moving out in
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   838
.. another place
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   839
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   840
*Note*: if you end up with an `if` in the definition of your entity, this probably
4430
0b6a069eb29e le patch added_tips a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4040
diff changeset
   841
means that you need two separate entities that implement the `ITree` interface and
0b6a069eb29e le patch added_tips a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4040
diff changeset
   842
get the result from `.children()` which ever entity is concerned.
0b6a069eb29e le patch added_tips a été importé
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4040
diff changeset
   843
5953
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
   844
.. Inheritance
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
   845
.. ```````````
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
   846
.. XXX feed me
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   847
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   848
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   849
Definition of relations
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   850
~~~~~~~~~~~~~~~~~~~~~~~
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   851
5953
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
   852
.. XXX add note about defining relation type / definition
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   853
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   854
A relation is defined by a Python class heriting `RelationType`. The name
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   855
of the class corresponds to the name of the type. The class then contains
2172
cf8f9180e63e delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1714
diff changeset
   856
a description of the properties of this type of relation, and could as well
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   857
contain a string for the subject and a string for the object. This allows to create
2172
cf8f9180e63e delete-trailing-whitespace
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 1714
diff changeset
   858
new definition of associated relations, (so that the class can have the
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   859
definition properties from the relation) for example ::
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   860
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   861
  class locked_by(RelationType):
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   862
    """relation on all entities indicating that they are locked"""
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   863
    inlined = True
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   864
    cardinality = '?*'
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   865
    subject = '*'
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   866
    object = 'CWUser'
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   867
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   868
If provided, the `subject` and `object` attributes denote the subject
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   869
and object of the various relation definitions related to the relation
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   870
type. Allowed values for these attributes are:
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   871
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   872
* a string corresponding to an entity type
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   873
* a tuple of string corresponding to multiple entity types
6150
98642a11aea3 remove some deprecated stuff about relation definition
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6148
diff changeset
   874
* the '*' special string, meaning all types of entities
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   875
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   876
When a relation is not inlined and not symmetrical, and it does not require
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   877
specific permissions, it can be defined using a `SubjectRelation`
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   878
attribute in the EntityType class. The first argument of `SubjectRelation` gives
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   879
the entity type for the object of the relation.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   880
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   881
:Naming convention:
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   882
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   883
 Although this way of defining relations uses a Python class, the
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   884
 naming convention defined earlier prevails over the PEP8 conventions
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   885
 used in the framework: relation type class names use
5220
42f854b6083d [doc/book] complete chapter on hooks & ops
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5145
diff changeset
   886
 ``underscore_separated_words``.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   887
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   888
:Historical note:
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   889
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   890
   It has been historically possible to use `ObjectRelation` which
5953
af48c527aea7 [doc/book] fix & enhance rql intro chapter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5400
diff changeset
   891
   defines a relation in the opposite direction. This feature is
5145
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   892
   deprecated and therefore should not be used in newly written code.
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   893
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   894
:Future deprecation note:
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   895
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   896
  In an even more remote future, it is quite possible that the
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   897
  SubjectRelation shortcut will become deprecated, in favor of the
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   898
  RelationType declaration which offers some advantages in the context
bfa4d775219f added information about the naming conventions in schema.py
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 4936
diff changeset
   899
  of reusable cubes.
1714
a721966779be new book layout, do not compile yet
sylvain.thenault@logilab.fr
parents:
diff changeset
   900
9981
7099bbd685aa [hooks/security] allow edition of attributes with permissive permissions
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9395
diff changeset
   901
5319
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   902
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   903
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   904
Handling schema changes
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   905
~~~~~~~~~~~~~~~~~~~~~~~
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   906
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   907
Also, it should be clear that to properly handle data migration, an
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   908
instance's schema is stored in the database, so the python schema file
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   909
used to defined it is only read when the instance is created or
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   910
upgraded.
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   911
9b1b7020d179 [doc/book] an introduction to yams, layout tweaks
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5220
diff changeset
   912
.. XXX complete me