def _validate_pointer_def( self, schema: s_schema.Schema, context: sd.CommandContext, ) -> None: """Check that property definition is sound.""" super()._validate_pointer_def(schema, context) scls = self.scls if not scls.get_owned(schema): return if scls.is_special_pointer(schema): return if ( scls.is_link_property(schema) and not scls.is_pure_computable(schema) ): # link properties cannot be required or multi if self.get_attribute_value('required'): raise errors.InvalidPropertyDefinitionError( 'link properties cannot be required', context=self.source_context, ) if (self.get_attribute_value('cardinality') is qltypes.SchemaCardinality.Many): raise errors.InvalidPropertyDefinitionError( "multi properties aren't supported for links", context=self.source_context, ) target_type = scls.get_target(schema) if target_type is None: raise TypeError(f'missing target type in scls {scls}') if target_type.is_polymorphic(schema): srcctx = self.get_attribute_source_context('target') raise errors.InvalidPropertyTargetError( f'invalid property type: ' f'{target_type.get_verbosename(schema)} ' f'is a generic type', context=srcctx, ) if (target_type.is_object_type() or (isinstance(target_type, s_types.Collection) and target_type.contains_object(schema))): srcctx = self.get_attribute_source_context('target') raise errors.InvalidPropertyTargetError( f'invalid property type: expected a scalar type, ' f'or a scalar collection, got ' f'{target_type.get_verbosename(schema)}', context=srcctx, )
def _validate_pointer_def(self, schema, context): """Check that property definition is sound.""" super()._validate_pointer_def(schema, context) scls = self.scls if not scls.get_is_local(schema): return if scls.is_special_pointer(schema): return if scls.is_link_property(schema): # link properties cannot be required or multi if self.get_attribute_value('required'): raise errors.InvalidPropertyDefinitionError( 'link properties cannot be required', context=self.source_context, ) if (self.get_attribute_value('cardinality') is qltypes.Cardinality.MANY): raise errors.InvalidPropertyDefinitionError( "multi properties aren't supported for links", context=self.source_context, ) target_type = scls.get_target(schema) if target_type.is_polymorphic(schema): srcctx = self.get_attribute_source_context('target') raise errors.InvalidPropertyTargetError( f'invalid property type: ' f'{target_type.get_verbosename(schema)} ' f'is a generic type', context=srcctx, ) if (target_type.is_object_type() or (target_type.is_collection() and target_type.contains_object(schema))): srcctx = self.get_attribute_source_context('target') raise errors.InvalidPropertyTargetError( f'invalid property type: expected a scalar type, ' f'or a scalar collection, got ' f'{target_type.get_verbosename(schema)}', context=srcctx, ) if target_type.is_collection(): srcctx = self.get_attribute_source_context('target') sd.ensure_schema_collection( schema, target_type, self, src_context=srcctx, context=context, )