schemas/bootstrap.py
author Laure Bourgois <Laure.Bourgois@logilab.fr>
Fri, 27 Feb 2009 17:32:44 +0100
changeset 990 5f1ff5b6907a
parent 0 b97547f5f1fa
child 627 36ade1128af7
permissions -rw-r--r--
ISiocItem is an interface that is implemented by 'post' entities (in sioc specification) i.e blogentry, mail ... IsiocContainer is an interface that is implemented by 'container' entities (see sioc specification) i.e blog, mailthread ...

"""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'