schemas/bootstrap.py
changeset 0 b97547f5f1fa
child 627 36ade1128af7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schemas/bootstrap.py	Wed Nov 05 15:52:50 2008 +0100
@@ -0,0 +1,245 @@
+"""core CubicWeb schema necessary for bootstrapping the actual application's schema
+
+:organization: Logilab
+:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
+"""
+
+from cubicweb.schema import format_constraint
+
+
+# not restricted since as "is" is handled as other relations, guests need
+# access to this
+class EEType(MetaEntityType):
+    """define an entity type, used to build the application schema"""
+    name = String(required=True, indexed=True, internationalizable=True,
+                  unique=True, maxsize=64)
+    description_format = String(meta=True, internationalizable=True, maxsize=50,
+                                default='text/plain', constraints=[format_constraint])
+    description = String(internationalizable=True,
+                         description=_('semantic description of this entity type'))
+    meta = Boolean(description=_('is it an application entity type or not ?'))
+    # necessary to filter using RQL
+    final = Boolean(description=_('automatic'))
+
+
+class ERType(MetaEntityType):
+    """define a relation type, used to build the application schema"""
+    name = String(required=True, indexed=True, internationalizable=True,
+                  unique=True, maxsize=64)
+    description_format = String(meta=True, internationalizable=True, maxsize=50,
+                                default='text/plain', constraints=[format_constraint])
+    description = String(internationalizable=True,
+                         description=_('semantic description of this relation type'))
+    meta = Boolean(description=_('is it an application relation type or not ?'))
+    symetric = Boolean(description=_('is this relation equivalent in both direction ?'))
+    inlined = Boolean(description=_('is this relation physically inlined? you should know what you\'re doing if you are changing this!'))
+    fulltext_container = String(description=_('if full text content of subject/object entity '
+                                              'should be added to other side entity (the container).'),
+                                vocabulary=('', _('subject'), _('object')),
+                                maxsize=8, default=None)
+    final = Boolean(description=_('automatic'))
+
+
+class EFRDef(MetaEntityType):
+    """define a final relation: link a final relation type from a non final
+    entity to a final entity type. 
+
+    used to build the application schema
+    """
+    relation_type = SubjectRelation('ERType', cardinality='1*',
+                                    constraints=[RQLConstraint('O final TRUE')],
+                                    composite='object')
+    from_entity = SubjectRelation('EEType', cardinality='1*',
+                                  constraints=[RQLConstraint('O final FALSE')],
+                                  composite='object')
+    to_entity = SubjectRelation('EEType', cardinality='1*',
+                                constraints=[RQLConstraint('O final TRUE')],
+                                composite='object')
+    constrained_by = SubjectRelation('EConstraint', cardinality='*1', composite='subject')
+    
+    cardinality = String(maxsize=2, internationalizable=True,
+                         vocabulary=[_('?1'), _('11'), _('??'), _('1?')], 
+                         description=_('subject/object cardinality'))
+    ordernum = Int(description=('control subject entity\'s relations order'), default=0)
+    
+    indexed = Boolean(description=_('create an index for quick search on this attribute'))
+    fulltextindexed = Boolean(description=_('index this attribute\'s value in the plain text index'))
+    internationalizable = Boolean(description=_('is this attribute\'s value translatable'))
+    defaultval = String(maxsize=256)
+    
+    description_format = String(meta=True, internationalizable=True, maxsize=50,
+                                default='text/plain', constraints=[format_constraint])
+    description = String(internationalizable=True,
+                         description=_('semantic description of this attribute'))
+    
+
+CARDINALITY_VOCAB = [_('?*'), _('1*'), _('+*'), _('**'), 
+                     _('?+'), _('1+'), _('++'), _('*+'), 
+                     _('?1'), _('11'), _('+1'), _('*1'),
+                     _('??'), _('1?'), _('+?'), _('*?')]
+
+class ENFRDef(MetaEntityType):
+    """define a non final relation: link a non final relation type from a non
+    final entity to a non final entity type. 
+
+    used to build the application schema
+    """
+    relation_type = SubjectRelation('ERType', cardinality='1*',
+                                    constraints=[RQLConstraint('O final FALSE')],
+                                    composite='object')
+    from_entity = SubjectRelation('EEType', cardinality='1*',
+                                  constraints=[RQLConstraint('O final FALSE')],
+                                  composite='object')
+    to_entity = SubjectRelation('EEType', cardinality='1*',
+                                constraints=[RQLConstraint('O final FALSE')],
+                                composite='object')
+    constrained_by = SubjectRelation('EConstraint', cardinality='*1', composite='subject')
+    
+    cardinality = String(maxsize=2, internationalizable=True,
+                         vocabulary=CARDINALITY_VOCAB,
+                         description=_('subject/object cardinality'))
+    ordernum = Int(description=_('control subject entity\'s relations order'),
+                   default=0)
+    composite = String(description=_('is the subject/object entity of the relation '
+                                     'composed of the other ? This implies that when '
+                                     'the composite is deleted, composants are also '
+                                     'deleted.'),
+                       vocabulary=('', _('subject'), _('object')),
+                       maxsize=8, default=None)
+    
+    description_format = String(meta=True, internationalizable=True, maxsize=50,
+                                default='text/plain', constraints=[format_constraint])
+    description = String(internationalizable=True,
+                         description=_('semantic description of this relation'))
+    
+
+# not restricted since it has to be read when checking allowed transitions
+class RQLExpression(MetaEntityType):
+    """define a rql expression used to define permissions"""
+    exprtype = String(required=True, vocabulary=['ERQLExpression', 'RRQLExpression'])
+    mainvars = String(maxsize=8,
+                      description=_('name of the main variables which should be '
+                                    'used in the selection if necessary (comma '
+                                    'separated)'))
+    expression = String(required=True, 
+                        description=_('restriction part of a rql query. '
+                                      'For entity rql expression, X and U are '
+                                      'predefined respectivly to the current object and to '
+                                      'the request user. For relation rql expression, '
+                                      'S, O and U are predefined respectivly to the current '
+                                      'relation\'subject, object and to '
+                                      'the request user. '))
+
+    read_permission = ObjectRelation(('EEType', 'ERType'), cardinality='+?', composite='subject',
+                                      description=_('rql expression allowing to read entities/relations of this type'))
+    add_permission = ObjectRelation(('EEType', 'ERType'), cardinality='*?', composite='subject',
+                                     description=_('rql expression allowing to add entities/relations of this type'))
+    delete_permission = ObjectRelation(('EEType', 'ERType'), cardinality='*?', composite='subject',
+                                        description=_('rql expression allowing to delete entities/relations of this type'))
+    update_permission = ObjectRelation('EEType', cardinality='*?', composite='subject',
+                                        description=_('rql expression allowing to update entities of this type'))
+    
+
+class EConstraint(MetaEntityType):
+    """define a schema constraint"""
+    cstrtype = SubjectRelation('EConstraintType', cardinality='1*')
+    value = String(description=_('depends on the constraint type'))
+
+
+class EConstraintType(MetaEntityType):
+    """define a schema constraint type"""
+    name = String(required=True, indexed=True, internationalizable=True,
+                  unique=True, maxsize=64)
+
+
+# not restricted since it has to be read when checking allowed transitions
+class EGroup(MetaEntityType):
+    """define a CubicWeb users group"""
+    name = String(required=True, indexed=True, internationalizable=True,
+                  unique=True, maxsize=64)
+
+    read_permission = ObjectRelation(('EEType', 'ERType'), cardinality='+*',
+                                      description=_('groups allowed to read entities/relations of this type'))
+    add_permission = ObjectRelation(('EEType', 'ERType'),
+                                     description=_('groups allowed to add entities/relations of this type'))
+    delete_permission = ObjectRelation(('EEType', 'ERType'),
+                                        description=_('groups allowed to delete entities/relations of this type'))
+    update_permission = ObjectRelation('EEType',
+                                        description=_('groups allowed to update entities of this type'))
+    
+    
+    
+class relation_type(MetaRelationType):
+    """link a relation definition to its relation type"""
+    inlined = True
+class from_entity(MetaRelationType):
+    """link a relation definition to its subject entity type"""
+    inlined = True
+class to_entity(MetaRelationType):
+    """link a relation definition to its object entity type"""
+    inlined = True
+class constrained_by(MetaRelationType):
+    """constraints applying on this relation"""
+    
+class cstrtype(MetaRelationType):
+    """constraint factory"""
+    inlined = True
+
+class read_permission(MetaRelationType):
+    """core relation giving to a group the permission to read an entity or
+    relation type
+    """
+class add_permission(MetaRelationType):
+    """core relation giving to a group the permission to add an entity or
+    relation type
+    """
+class delete_permission(MetaRelationType):
+    """core relation giving to a group the permission to delete an entity or
+    relation type
+    """
+class update_permission(MetaRelationType):
+    """core relation giving to a group the permission to update an entity type
+    """
+
+
+class is_(MetaRelationType):
+    """core relation indicating the type of an entity
+    """
+    name = 'is'
+    # don't explicitly set composite here, this is handled anyway
+    #composite = 'object'
+    permissions = {
+        'read':   ('managers', 'users', 'guests'),
+        'add':    (),
+        'delete': (),
+        }
+    cardinality = '1*'
+    subject = '**'
+    object = 'EEType'
+
+class is_instance_of(MetaRelationType):
+    """core relation indicating the types (including specialized types)
+    of an entity
+    """
+    # don't explicitly set composite here, this is handled anyway
+    #composite = 'object'
+    permissions = {
+        'read':   ('managers', 'users', 'guests'),
+        'add':    (),
+        'delete': (),
+        }
+    cardinality = '+*'
+    subject = '**'
+    object = 'EEType'
+
+class specializes(MetaRelationType):
+    name = 'specializes'
+    permissions = {
+        'read':   ('managers', 'users', 'guests'),
+        'add':    ('managers',),
+        'delete': ('managers',),
+        }
+    cardinality = '?*'
+    subject = 'EEType'
+    object = 'EEType'