def test_splitSchemaName(self): self.assertEqual(('prefix', 'type', 'schema',), utils.splitSchemaName('prefix_0_type_0_schema')) self.assertEqual(('prefix', 'type', '',), utils.splitSchemaName('prefix_0_type')) self.assertEqual(('prefix', 'type one.two', '',), utils.splitSchemaName('prefix_0_type_1_one_2_two'))
def serializeSchema(schema): """ Finds the FTI and model associated with a schema, and synchronizes the schema to the FTI model_source attribute. This method only works for schemas that were created from an FTI's model_source property BBB - deprecated """ # determine portal_type try: prefix, portal_type, schemaName = splitSchemaName(schema.__name__) except ValueError: # not a dexterity schema return # find the FTI and model fti = queryUtility(IDexterityFTI, name=portal_type) if fti.model_source: model = fti.lookupModel() # synchronize changes to the model syncSchema(schema, model.schemata[schemaName], overwrite=True) fti.model_source = serializeModel(model) else: raise TypeError("Changes to non-dynamic schemata not yet supported.")
def __call__(self, name, module): """Someone tried to load a dynamic interface that has not yet been created yet. We will attempt to load it from the FTI if we can. If the FTI doesn't exist, create a temporary marker interface that we can fill later. The goal here is to ensure that we create exactly one interface instance for each name. If we can't find an FTI, we'll cache the interface so that we don't get a new one with a different id later. This cache is global, so we synchronise the method with a thread lock. Once we have a properly populated interface, we set it onto the module using setattr(). This means that the factory will not be invoked again. """ try: prefix, portal_type, schemaName = utils.splitSchemaName(name) except ValueError: return None if name in self._transient_SCHEMA_CACHE: schema = self._transient_SCHEMA_CACHE[name] else: bases = () is_default_schema = not schemaName if is_default_schema: bases += (IDexteritySchema, ) schema = InterfaceClass(name, bases, __module__=module.__name__) if is_default_schema: alsoProvides(schema, IContentType) fti = queryUtility(IDexterityFTI, name=portal_type) if fti is None and name not in self._transient_SCHEMA_CACHE: self._transient_SCHEMA_CACHE[name] = schema elif fti is not None: model = fti.lookupModel() syncSchema(model.schemata[schemaName], schema, sync_bases=True) # Save this schema in the module - this factory will not be # called again for this name if name in self._transient_SCHEMA_CACHE: del self._transient_SCHEMA_CACHE[name] setattr(module, name, schema) return schema
def __call__(self, name, module): """Someone tried to load a dynamic interface that has not yet been created yet. We will attempt to load it from the FTI if we can. If the FTI doesn't exist, create a temporary marker interface that we can fill later. The goal here is to ensure that we create exactly one interface instance for each name. If we can't find an FTI, we'll cache the interface so that we don't get a new one with a different id later. This cache is global, so we synchronise the method with a thread lock. Once we have a properly populated interface, we set it onto the module using setattr(). This means that the factory will not be invoked again. """ try: prefix, portal_type, schemaName = utils.splitSchemaName(name) except ValueError: return None if name in self._transient_SCHEMA_CACHE: schema = self._transient_SCHEMA_CACHE[name] else: bases = () is_default_schema = not schemaName if is_default_schema: bases += (IDexteritySchema,) schema = InterfaceClass(name, bases, __module__=module.__name__) if is_default_schema: alsoProvides(schema, IContentType) fti = queryUtility(IDexterityFTI, name=portal_type) if fti is None and name not in self._transient_SCHEMA_CACHE: self._transient_SCHEMA_CACHE[name] = schema elif fti is not None: model = fti.lookupModel() syncSchema(model.schemata[schemaName], schema, sync_bases=True) # Save this schema in the module - this factory will not be # called again for this name if name in self._transient_SCHEMA_CACHE: del self._transient_SCHEMA_CACHE[name] setattr(module, name, schema) return schema