def create_variant (self, value, scope, datatype=None): """Creates a `Variant` of this topic name with the specified string `value` and `scope`. If `datatype` is None, the newly created `Variant` will have the datatype xsd:string. The newly created `Variant` will contain all themes from the parent name and the themes specified in `scope`. :param value: the string value or locator which represents an IRI :type value: string or `Locator` :param scope: list of themes :type scope: list of `Topic`s :rtype: `Variant` """ if value is None: raise ModelConstraintException(self, 'The value may not be None') if not scope: raise ModelConstraintException(self, 'The scope may not be None') if type(scope) not in (type([]), type(())): scope = [scope] if scope == list(self.get_scope()): raise ModelConstraintException( self, 'The variant would be in the same scope as the parent') if datatype is None: if isinstance(value, Locator): datatype = Locator(XSD_ANY_URI) elif isinstance(value, str): datatype = Locator(XSD_STRING) if isinstance(value, Locator): value = value.to_external_form() variant = Variant(name=self, datatype=datatype.to_external_form(), value=value, topic_map=self.topic_map) variant.save() for theme in scope: variant.scope.add(theme) return variant