diff -r 000000000000 -r b97547f5f1fa schemas/bootstrap.py --- /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'