# HG changeset patch # User Julien Cristau # Date 1438073664 -7200 # Node ID c9321aedfbf91b71e58e634b1c3506041be01915 # Parent f585add0fed9f289bfe990aa0807bab6dad0a549 [schema] add CubicWebRelationDefinitionSchema Stop monkeypatching yams, inherit from RelationDefinitionSchema instead. diff -r f585add0fed9 -r c9321aedfbf9 schema.py --- a/schema.py Wed Apr 22 11:39:13 2015 +0200 +++ b/schema.py Tue Jul 28 10:54:24 2015 +0200 @@ -412,13 +412,35 @@ return self._check(_cw, x=eid, **kwargs) return self._check(_cw, **kwargs) -def constraint_by_eid(self, eid): - for cstr in self.constraints: - if cstr.eid == eid: - return cstr - raise ValueError('No constraint with eid %d' % eid) -RelationDefinitionSchema.constraint_by_eid = constraint_by_eid + +class CubicWebRelationDefinitionSchema(RelationDefinitionSchema): + def constraint_by_eid(self, eid): + for cstr in self.constraints: + if cstr.eid == eid: + return cstr + raise ValueError('No constraint with eid %d' % eid) + + def rql_expression(self, expression, mainvars=None, eid=None): + """rql expression factory""" + if self.rtype.final: + return ERQLExpression(expression, mainvars, eid) + return RRQLExpression(expression, mainvars, eid) + def check_permission_definitions(self): + super(CubicWebRelationDefinitionSchema, self).check_permission_definitions() + schema = self.subject.schema + for action, groups in self.permissions.items(): + for group_or_rqlexpr in groups: + if action == 'read' and \ + isinstance(group_or_rqlexpr, RQLExpression): + msg = "can't use rql expression for read permission of %s" + raise BadSchemaDefinition(msg % self) + if self.final and isinstance(group_or_rqlexpr, RRQLExpression): + msg = "can't use RRQLExpression on %s, use an ERQLExpression" + raise BadSchemaDefinition(msg % self) + if not self.final and isinstance(group_or_rqlexpr, ERQLExpression): + msg = "can't use ERQLExpression on %s, use a RRQLExpression" + raise BadSchemaDefinition(msg % self) def vargraph(rqlst): """ builds an adjacency graph of variables from the rql syntax tree, e.g: @@ -703,35 +725,10 @@ PermissionMixIn.check_perm = check_perm -RelationDefinitionSchema._RPROPERTIES['eid'] = None +CubicWebRelationDefinitionSchema._RPROPERTIES['eid'] = None # remember rproperties defined at this point. Others will have to be serialized in # CWAttribute.extra_props -KNOWN_RPROPERTIES = RelationDefinitionSchema.ALL_PROPERTIES() - -def rql_expression(self, expression, mainvars=None, eid=None): - """rql expression factory""" - if self.rtype.final: - return ERQLExpression(expression, mainvars, eid) - return RRQLExpression(expression, mainvars, eid) -RelationDefinitionSchema.rql_expression = rql_expression - -orig_check_permission_definitions = RelationDefinitionSchema.check_permission_definitions -def check_permission_definitions(self): - orig_check_permission_definitions(self) - schema = self.subject.schema - for action, groups in self.permissions.items(): - for group_or_rqlexpr in groups: - if action == 'read' and \ - isinstance(group_or_rqlexpr, RQLExpression): - msg = "can't use rql expression for read permission of %s" - raise BadSchemaDefinition(msg % self) - if self.final and isinstance(group_or_rqlexpr, RRQLExpression): - msg = "can't use RRQLExpression on %s, use an ERQLExpression" - raise BadSchemaDefinition(msg % self) - if not self.final and isinstance(group_or_rqlexpr, ERQLExpression): - msg = "can't use ERQLExpression on %s, use a RRQLExpression" - raise BadSchemaDefinition(msg % self) -RelationDefinitionSchema.check_permission_definitions = check_permission_definitions +KNOWN_RPROPERTIES = CubicWebRelationDefinitionSchema.ALL_PROPERTIES() class CubicWebEntitySchema(EntitySchema): @@ -882,6 +879,7 @@ class CubicWebRelationSchema(PermissionMixIn, RelationSchema): permissions = {} ACTIONS = () + rdef_class = CubicWebRelationDefinitionSchema def __init__(self, schema=None, rdef=None, eid=None, **kwargs): if rdef is not None: