doc/book/en/tutorials/advanced/index.rst
author Aurelien Campeas <aurelien.campeas@logilab.fr>
Wed, 14 Apr 2010 17:02:07 +0200
branchstable
changeset 5259 61505346e28f
parent 5253 7ee07d18dc95
child 5350 49c065ae225e
permissions -rw-r--r--
[doc/book] add a ref from hooks to adv tutorial
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5253
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     1
.. _advanced_tutorial:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     2
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     3
Building a photo gallery with CubicWeb
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     4
======================================
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     5
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     6
Desired features
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     7
----------------
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     8
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
     9
* basically a photo gallery
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    10
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    11
* photo stored onto the fs and displayed dynamically through a web interface
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    12
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    13
* navigation through folder (album), tags, geographical zone, people on the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    14
  picture... using facets
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    15
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    16
* advanced security (eg not everyone can see everything). More on this later.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    17
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    18
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    19
Cube creation and schema definition
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    20
-----------------------------------
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    21
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    22
.. _adv_tuto_create_new_cube:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    23
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    24
Step 1: creating a new cube for my web site
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    25
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    26
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    27
One note about my development environment: I wanted to use packaged
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    28
version of CubicWeb and cubes while keeping my cube in my user
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    29
directory, let's say `~src/cubes`.  I achieve this by setting the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    30
following environment variables::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    31
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    32
  CW_CUBES_PATH=~/src/cubes
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    33
  CW_MODE=user
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    34
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    35
I can now create the cube which will hold custom code for this web
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    36
site using::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    37
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    38
  c-c newcube --directory=~/src/cubes sytweb
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    39
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    40
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    41
.. _adv_tuto_assemble_cubes:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    42
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    43
Step 2: pick building blocks into existing cubes
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    44
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    45
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    46
Almost everything I want represent in my web-site is somewhat already modelized in
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    47
some cube that I'll extend for my need. So I'll pick the following cubes:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    48
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    49
* `folder`, containing `Folder` entity type, which will be used as
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    50
  both 'album' and a way to map file system folders. Entities are
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    51
  added to a given folder using the `filed_under` relation.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    52
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    53
* `file`, containing `File` and `Image` entity types, gallery view,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    54
  and a file system import utility.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    55
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    56
* `zone`, containing the `Zone` entity type for hierarchical geographical
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    57
  zones. Entities (including sub-zones) are added to a given zone using the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    58
  `situated_in` relation.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    59
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    60
* `person`, containing the `Person` entity type plus some basic views.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    61
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    62
* `comment`, providing a full commenting system allowing one to comment entity types
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    63
  supporting the `comments` relation by adding a `Comment` entity.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    64
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    65
* `tag`, providing a full tagging system as a easy and powerful way to classify
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    66
  entities supporting the `tags` relation by linking the to `Tag` entities. This
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    67
  will allows navigation into a large number of picture.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    68
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    69
Ok, now I'll tell my cube requires all this by editing cubes/sytweb/__pkginfo__.py:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    70
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    71
  .. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    72
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    73
    __depends_cubes__ = {'file': '>= 1.2.0',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    74
			 'folder': '>= 1.1.0',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    75
			 'person': '>= 1.2.0',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    76
			 'comment': '>= 1.2.0',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    77
			 'tag': '>= 1.2.0',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    78
			 'zone': None,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    79
			 }
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    80
    __depends__ = {'cubicweb': '>= 3.5.10',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    81
		   }
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    82
    for key,value in __depends_cubes__.items():
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    83
	__depends__['cubicweb-'+key] = value
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    84
    __use__ = tuple(__depends_cubes__)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    85
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    86
Notice that you can express minimal version of the cube that should be used,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    87
`None` meaning whatever version available.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    88
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    89
Step 3: glue everything together in my cube's schema
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    90
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    91
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    92
.. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    93
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    94
    from yams.buildobjs import RelationDefinition
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    95
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    96
    class comments(RelationDefinition):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    97
	subject = 'Comment'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    98
	object = ('File', 'Image')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
    99
	cardinality = '1*'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   100
	composite = 'object'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   101
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   102
    class tags(RelationDefinition):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   103
	subject = 'Tag'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   104
	object = ('File', 'Image')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   105
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   106
    class filed_under(RelationDefinition):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   107
	subject = ('File', 'Image')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   108
	object = 'Folder'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   109
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   110
    class situated_in(RelationDefinition):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   111
	subject = 'Image'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   112
	object = 'Zone'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   113
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   114
    class displayed_on(RelationDefinition):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   115
	subject = 'Person'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   116
	object = 'Image'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   117
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   118
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   119
This schema:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   120
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   121
* allows to comment and tag on `File` and `Image` entity types by adding the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   122
  `comments` and `tags` relations. This should be all we've to do for this
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   123
  feature since the related cubes provide 'pluggable section' which are
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   124
  automatically displayed on the primary view of entity types supporting the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   125
  relation.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   126
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   127
* adds a `situated_in` relation definition so that image entities can be
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   128
  geolocalized.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   129
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   130
* add a new relation `displayed_on` relation telling who can be seen on a
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   131
  picture.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   132
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   133
This schema will probably have to evolve as time goes (for security handling at
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   134
least), but since the possibility to make schema evolving is one of CubicWeb
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   135
feature (and goal), we won't worry and see that later when needed.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   136
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   137
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   138
Step 4: creating the instance
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   139
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   140
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   141
Now that I've a schema, I want to create an instance so I can start To
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   142
create an instance using this new 'sytweb' cube, I run::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   143
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   144
  c-c create sytweb sytweb_instance
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   145
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   146
hint : if you get an error while the database is initialized, you can
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   147
avoid having to reanswer to questions by runing ::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   148
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   149
   c-c db-create sytweb_instance
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   150
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   151
This will use your already configured instance and start directly from the create
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   152
database step, thus skipping questions asked by the 'create' command.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   153
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   154
Once the instance and database are fully initialized, run ::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   155
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   156
  c-c start sytweb_instance
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   157
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   158
to start the instance, check you can connect on it, etc...
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   159
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   160
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   161
Security, testing and migration
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   162
-------------------------------
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   163
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   164
This post will cover various topics:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   165
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   166
* configuring security
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   167
* migrating existing instance
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   168
* writing some unit tests
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   169
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   170
Here is the ``read`` security model I want:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   171
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   172
* folders, files, images and comments should have one of the following visibility:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   173
  - ``public``, everyone can see it
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   174
  - ``authenticated``, only authenticated users can see it
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   175
  - ``restricted``, only a subset of authenticated users can see it
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   176
* managers (e.g. me) can see everything
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   177
* only authenticated user can see people
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   178
* everyone can  see classifier entities, eg tag and zone
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   179
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   180
Also, unless explicity specified, visibility of an image should be the same as
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   181
its parent folder, as well as visibility of a comment should be the same as the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   182
commented entity. If there is no parent entity, the default visibility is
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   183
``authenticated``.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   184
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   185
Regarding write security, that's much easier:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   186
* anonymous can't write anything
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   187
* authenticated users can only add comment
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   188
* managers will add the remaining stuff
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   189
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   190
Now, let's implement that!
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   191
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   192
Proper security in CubicWeb is done at the schema level, so you don't have to
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   193
bother with it in views: users will only see what they can see automatically.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   194
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   195
.. _adv_tuto_security:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   196
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   197
Step 1: configuring security into the schema
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   198
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   199
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   200
In schema, you can grant access according to groups, or to some RQL expressions:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   201
users get access it the expression return some results. To implements the read
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   202
security defined earlier, groups are not enough, we'll need RQL expression. Here
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   203
is the idea:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   204
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   205
* add a `visibility` attribute on folder, image and comment, which may be one of
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   206
  the value explained above
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   207
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   208
* add a `may_be_read_by` relation from folder, image and comment to users,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   209
  which will define who can see the entity
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   210
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   211
* security propagation will be done in hook.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   212
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   213
So the first thing to do is to modify my cube'schema.py to define those
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   214
relations:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   215
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   216
.. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   217
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   218
    from yams.constraints import StaticVocabularyConstraint
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   219
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   220
    class visibility(RelationDefinition):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   221
	subject = ('Folder', 'File', 'Image', 'Comment')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   222
	object = 'String'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   223
	constraints = [StaticVocabularyConstraint(('public', 'authenticated',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   224
						   'restricted', 'parent'))]
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   225
	default = 'parent'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   226
	cardinality = '11' # required
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   227
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   228
    class may_be_read_by(RelationDefinition):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   229
	subject = ('Folder', 'File', 'Image', 'Comment',)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   230
	object = 'CWUser'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   231
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   232
We can note the following points:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   233
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   234
* we've added a new `visibility` attribute to folder, file, image and comment
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   235
  using a `RelationDefinition`
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   236
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   237
* `cardinality = '11'` means this attribute is required. This is usually hidden
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   238
  under the `required` argument given to the `String` constructor, but we can
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   239
  rely on this here (same thing for StaticVocabularyConstraint, which is usually
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   240
  hidden by the `vocabulary` argument)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   241
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   242
* the `parent` possible value will be used for visibility propagation
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   243
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   244
Now, we should be able to define security rules in the schema, based on these new
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   245
attribute and relation. Here is the code to add to *schema.py*:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   246
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   247
.. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   248
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   249
    from cubicweb.schema import ERQLExpression
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   250
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   251
    VISIBILITY_PERMISSIONS = {
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   252
	'read':   ('managers',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   253
		   ERQLExpression('X visibility "public"'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   254
		   ERQLExpression('X may_be_read_by U')),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   255
	'add':    ('managers',),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   256
	'update': ('managers', 'owners',),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   257
	'delete': ('managers', 'owners'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   258
	}
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   259
    AUTH_ONLY_PERMISSIONS = {
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   260
	    'read':   ('managers', 'users'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   261
	    'add':    ('managers',),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   262
	    'update': ('managers', 'owners',),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   263
	    'delete': ('managers', 'owners'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   264
	    }
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   265
    CLASSIFIERS_PERMISSIONS = {
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   266
	    'read':   ('managers', 'users', 'guests'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   267
	    'add':    ('managers',),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   268
	    'update': ('managers', 'owners',),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   269
	    'delete': ('managers', 'owners'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   270
	    }
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   271
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   272
    from cubes.folder.schema import Folder
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   273
    from cubes.file.schema import File, Image
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   274
    from cubes.comment.schema import Comment
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   275
    from cubes.person.schema import Person
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   276
    from cubes.zone.schema import Zone
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   277
    from cubes.tag.schema import Tag
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   278
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   279
    Folder.__permissions__ = VISIBILITY_PERMISSIONS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   280
    File.__permissions__ = VISIBILITY_PERMISSIONS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   281
    Image.__permissions__ = VISIBILITY_PERMISSIONS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   282
    Comment.__permissions__ = VISIBILITY_PERMISSIONS.copy()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   283
    Comment.__permissions__['add'] = ('managers', 'users',)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   284
    Person.__permissions__ = AUTH_ONLY_PERMISSIONS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   285
    Zone.__permissions__ = CLASSIFIERS_PERMISSIONS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   286
    Tag.__permissions__ = CLASSIFIERS_PERMISSIONS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   287
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   288
What's important in there:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   289
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   290
* `VISIBILITY_PERMISSIONS` provides read access to managers group, if
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   291
  `visibility` attribute's value is 'public', or if user (designed by the 'U'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   292
  variable in the expression) is linked to the entity (the 'X' variable) through
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   293
  the `may_read` permission
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   294
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   295
* we modify permissions of the entity types we use by importing them and
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   296
  modifying their `__permissions__` attribute
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   297
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   298
* notice the `.copy()`: we only want to modify 'add' permission for `Comment`,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   299
  not for all entity types using `VISIBILITY_PERMISSIONS`!
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   300
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   301
* the remaining part of the security model is done using regular groups:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   302
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   303
  - `users` is the group to which all authenticated users will belong
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   304
  - `guests` is the group of anonymous users
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   305
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   306
5259
61505346e28f [doc/book] add a ref from hooks to adv tutorial
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 5253
diff changeset
   307
.. _adv_tuto_security_propagation:
5253
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   308
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   309
Step 2: security propagation in hooks
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   310
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   311
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   312
To fullfill the requirements, we have to implement::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   313
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   314
  Also, unless explicity specified, visibility of an image should be the same as
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   315
  its parent folder, as well as visibility of a comment should be the same as the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   316
  commented entity.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   317
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   318
This kind of `active` rule will be done using CubicWeb's hook
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   319
system. Hooks are triggered on database event such as addition of new
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   320
entity or relation.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   321
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   322
The trick part of the requirement is in *unless explicitly specified*, notably
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   323
because when the entity addition hook is added, we don't know yet its 'parent'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   324
entity (eg folder of an image, image commented by a comment). To handle such things,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   325
CubicWeb provides `Operation`, which allow to schedule things to do at commit time.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   326
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   327
In our case we will:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   328
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   329
* on entity creation, schedule an operation that will set default visibility
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   330
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   331
* when a "parent" relation is added, propagate parent's visibility unless the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   332
  child already has a visibility set
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   333
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   334
Here is the code in cube's *hooks.py*:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   335
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   336
.. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   337
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   338
    from cubicweb.selectors import implements
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   339
    from cubicweb.server import hook
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   340
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   341
    class SetVisibilityOp(hook.Operation):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   342
	def precommit_event(self):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   343
	    for eid in self.session.transaction_data.pop('pending_visibility'):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   344
		entity = self.session.entity_from_eid(eid)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   345
		if entity.visibility == 'parent':
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   346
		    entity.set_attributes(visibility=u'authenticated')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   347
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   348
    class SetVisibilityHook(hook.Hook):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   349
	__regid__ = 'sytweb.setvisibility'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   350
	__select__ = hook.Hook.__select__ & implements('Folder', 'File', 'Image', 'Comment')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   351
	events = ('after_add_entity',)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   352
	def __call__(self):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   353
	    hook.set_operation(self._cw, 'pending_visibility', self.entity.eid,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   354
			       SetVisibilityOp)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   355
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   356
    class SetParentVisibilityHook(hook.Hook):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   357
	__regid__ = 'sytweb.setparentvisibility'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   358
	__select__ = hook.Hook.__select__ & hook.match_rtype('filed_under', 'comments')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   359
	events = ('after_add_relation',)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   360
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   361
	def __call__(self):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   362
	    parent = self._cw.entity_from_eid(self.eidto)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   363
	    child = self._cw.entity_from_eid(self.eidfrom)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   364
	    if child.visibility == 'parent':
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   365
		child.set_attributes(visibility=parent.visibility)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   366
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   367
Notice:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   368
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   369
* hooks are application objects, hence have selectors that should match entity or
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   370
  relation types to which the hook applies. To match a relation type, we use the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   371
  hook specific `match_rtype` selector.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   372
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   373
* usage of `set_operation`: instead of adding an operation for each added entity,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   374
  set_operation allows to create a single one and to store entity's eids to be
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   375
  processed in session's transaction data. This is a good pratice to avoid heavy
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   376
  operations manipulation cost when creating a lot of entities in the same
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   377
  transaction.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   378
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   379
* the `precommit_event` method of the operation will be called at transaction's
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   380
  commit time.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   381
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   382
* in a hook, `self._cw` is the repository session, not a web request as usually
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   383
  in views
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   384
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   385
* according to hook's event, you have access to different attributes on the hook
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   386
  instance. Here:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   387
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   388
  - `self.entity` is the newly added entity on 'after_add_entity' events
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   389
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   390
  - `self.eidfrom` / `self.eidto` are the eid of the subject / object entity on
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   391
    'after_add_relatiohn' events (you may also get the relation type using
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   392
    `self.rtype`)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   393
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   394
The `parent` visibility value is used to tell "propagate using parent security"
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   395
because we want that attribute to be required, so we can't use None value else
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   396
we'll get an error before we get any chance to propagate...
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   397
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   398
Now, we also want to propagate the `may_be_read_by` relation. Fortunately,
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   399
CubicWeb provides some base hook classes for such things, so we only have to add
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   400
the following code to *hooks.py*:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   401
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   402
.. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   403
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   404
    # relations where the "parent" entity is the subject
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   405
    S_RELS = set()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   406
    # relations where the "parent" entity is the object
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   407
    O_RELS = set(('filed_under', 'comments',))
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   408
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   409
    class AddEntitySecurityPropagationHook(hook.PropagateSubjectRelationHook):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   410
	"""propagate permissions when new entity are added"""
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   411
	__regid__ = 'sytweb.addentity_security_propagation'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   412
	__select__ = (hook.PropagateSubjectRelationHook.__select__
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   413
		      & hook.match_rtype_sets(S_RELS, O_RELS))
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   414
	main_rtype = 'may_be_read_by'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   415
	subject_relations = S_RELS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   416
	object_relations = O_RELS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   417
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   418
    class AddPermissionSecurityPropagationHook(hook.PropagateSubjectRelationAddHook):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   419
	"""propagate permissions when new entity are added"""
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   420
	__regid__ = 'sytweb.addperm_security_propagation'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   421
	__select__ = (hook.PropagateSubjectRelationAddHook.__select__
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   422
		      & hook.match_rtype('may_be_read_by',))
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   423
	subject_relations = S_RELS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   424
	object_relations = O_RELS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   425
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   426
    class DelPermissionSecurityPropagationHook(hook.PropagateSubjectRelationDelHook):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   427
	__regid__ = 'sytweb.delperm_security_propagation'
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   428
	__select__ = (hook.PropagateSubjectRelationDelHook.__select__
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   429
		      & hook.match_rtype('may_be_read_by',))
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   430
	subject_relations = S_RELS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   431
	object_relations = O_RELS
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   432
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   433
* the `AddEntitySecurityPropagationHook` will propagate the relation
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   434
  when `filed_under` or `comments` relations are added
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   435
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   436
  - the `S_RELS` and `O_RELS` set as well as the `match_rtype_sets` selector are
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   437
    used here so that if my cube is used by another one, it'll be able to
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   438
    configure security propagation by simply adding relation to one of the two
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   439
    sets.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   440
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   441
* the two others will propagate permissions changes on parent entities to
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   442
  children entities
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   443
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   444
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   445
.. _adv_tuto_tesing_security:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   446
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   447
Step 3: testing our security
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   448
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   449
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   450
Security is tricky. Writing some tests for it is a very good idea. You should
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   451
even write them first, as Test Driven Development recommends!
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   452
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   453
Here is a small test case that will check the basis of our security
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   454
model, in *test/unittest_sytweb.py*:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   455
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   456
.. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   457
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   458
    from cubicweb.devtools.testlib import CubicWebTC
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   459
    from cubicweb import Binary
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   460
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   461
    class SecurityTC(CubicWebTC):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   462
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   463
	def test_visibility_propagation(self):
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   464
	    # create a user for later security checks
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   465
	    toto = self.create_user('toto')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   466
	    # init some data using the default manager connection
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   467
	    req = self.request()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   468
	    folder = req.create_entity('Folder',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   469
				       name=u'restricted',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   470
				       visibility=u'restricted')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   471
	    photo1 = req.create_entity('Image',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   472
				       data_name=u'photo1.jpg',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   473
				       data=Binary('xxx'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   474
				       filed_under=folder)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   475
	    self.commit()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   476
	    photo1.clear_all_caches() # good practice, avoid request cache effects
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   477
	    # visibility propagation
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   478
	    self.assertEquals(photo1.visibility, 'restricted')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   479
	    # unless explicitly specified
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   480
	    photo2 = req.create_entity('Image',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   481
				       data_name=u'photo2.jpg',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   482
				       data=Binary('xxx'),
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   483
				       visibility=u'public',
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   484
				       filed_under=folder)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   485
	    self.commit()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   486
	    self.assertEquals(photo2.visibility, 'public')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   487
	    # test security
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   488
	    self.login('toto')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   489
	    req = self.request()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   490
	    self.assertEquals(len(req.execute('Image X')), 1) # only the public one
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   491
	    self.assertEquals(len(req.execute('Folder X')), 0) # restricted...
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   492
	    # may_be_read_by propagation
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   493
	    self.restore_connection()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   494
	    folder.set_relations(may_be_read_by=toto)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   495
	    self.commit()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   496
	    photo1.clear_all_caches()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   497
	    self.failUnless(photo1.may_be_read_by)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   498
	    # test security with permissions
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   499
	    self.login('toto')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   500
	    req = self.request()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   501
	    self.assertEquals(len(req.execute('Image X')), 2) # now toto has access to photo2
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   502
	    self.assertEquals(len(req.execute('Folder X')), 1) # and to restricted folder
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   503
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   504
    if __name__ == '__main__':
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   505
	from logilab.common.testlib import unittest_main
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   506
	unittest_main()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   507
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   508
It's not complete, but show most things you'll want to do in tests: adding some
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   509
content, creating users and connecting as them in the test, etc...
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   510
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   511
To run it type: ::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   512
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   513
    [syt@scorpius test]$ pytest unittest_sytweb.py
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   514
    ========================  unittest_sytweb.py  ========================
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   515
    -> creating tables [....................]
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   516
    -> inserting default user and default groups.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   517
    -> storing the schema in the database [....................]
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   518
    -> database for instance data initialized.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   519
    .
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   520
    ----------------------------------------------------------------------
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   521
    Ran 1 test in 22.547s
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   522
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   523
    OK
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   524
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   525
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   526
The first execution is taking time, since it creates a sqlite database for the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   527
test instance. The second one will be much quicker: ::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   528
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   529
    [syt@scorpius test]$ pytest unittest_sytweb.py
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   530
    ========================  unittest_sytweb.py  ========================
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   531
    .
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   532
    ----------------------------------------------------------------------
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   533
    Ran 1 test in 2.662s
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   534
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   535
    OK
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   536
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   537
If you do some changes in your schema, you'll have to force regeneration of that
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   538
database. You do that by removing the tmpdb files before running the test: ::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   539
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   540
    [syt@scorpius test]$ rm tmpdb*
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   541
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   542
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   543
.. Note::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   544
  pytest is a very convenient utilities to control test execution, from the `logilab-common`_
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   545
  package
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   546
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   547
.. _`logilab-common`: http://www.logilab.org/project/logilab-common
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   548
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   549
.. _adv_tuto_migration_script:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   550
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   551
Step 4: writing the migration script and migrating the instance
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   552
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   553
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   554
Prior to those changes, Iv'e created an instance, feeded it with some data, so I
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   555
don't want to create a new one, but to migrate the existing one. Let's see how to
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   556
do that.
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   557
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   558
Migration commands should be put in the cube's *migration* directory, in a
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   559
file named file:`<X.Y.Z>_Any.py` ('Any' being there mostly for historical reason).
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   560
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   561
Here I'll create a *migration/0.2.0_Any.py* file containing the following
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   562
instructions:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   563
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   564
.. sourcecode:: python
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   565
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   566
  add_relation_type('may_be_read_by')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   567
  add_relation_type('visibility')
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   568
  sync_schema_props_perms()
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   569
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   570
Then I update the version number in cube's *__pkginfo__.py* to 0.2.0. And
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   571
that's it! Those instructions will:
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   572
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   573
* update the instance's schema by adding our two new relations and update the
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   574
  underlying database tables accordingly (the two first instructions)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   575
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   576
* update schema's permissions definition (the later instruction)
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   577
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   578
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   579
To migrate my instance I simply type::
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   580
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   581
   [syt@scorpius ~]$ cubicweb-ctl upgrade sytweb
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   582
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   583
I'll then be asked some questions to do the migration step by step. You should say
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   584
YES when it asks if a backup of your database should be done, so you can get back
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   585
to initial state if anything goes wrong...
7ee07d18dc95 [doc/book] include sylvain great advanced tutorial, move tutorials in one proper section
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
diff changeset
   586