def test_old_factory_not_unregistered_if_not_created_by_dexterity(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = self.mocker.proxy(PersistentComponents(bases=(getGlobalSiteManager(),))) getSiteManager_mock = self.mocker.replace('zope.app.component.hooks.getSiteManager') self.expect(getSiteManager_mock(dummy_site)).result(site_manager_mock).count(1,None) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = None self.expect(site_manager_mock.registeredUtilities()).result([reg1]) # This should not be removed, since we didn't create it self.expect(site_manager_mock.unregisterUtility(provided=IFactory, name='old-factory')).count(0) # A new one may still be created, however self.expect(site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x.portal_type == portal_type), IFactory, 'new-factory', info='plone.dexterity.dynamic')).passthrough() self.replay() fti.factory = 'new-factory' ftiModified(fti, ObjectModifiedEvent(fti, DexterityFTIModificationDescription('factory', 'old-factory')))
def test_concrete_schema_not_refreshed_on_modify_schema(self): portal_type = u"testtype" fti = self.mocker.proxy(DexterityFTI(portal_type)) class IBlank(Interface): pass class INew(Interface): title = zope.schema.TextLine(title=u"title") model_dummy = Model({u"": INew}) self.expect(fti.lookupModel()).result(model_dummy).count(0, None) self.create_dummy() site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid")) self.mock_utility(site_dummy, ISiteRoot) self.replay() # Set schema to something so that hasDynamicSchema is false fti.schema = IBlank.__identifier__ assert not fti.hasDynamicSchema # Set source for dynamic FTI - should not be used schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync should not happen now ftiModified(fti, ObjectModifiedEvent(fti, DexterityFTIModificationDescription("schema", ""))) self.failIf("title" in IBlank)
def test_dynamic_schema_refreshed_on_modify_model_source(self): portal_type = u"testtype" fti = self.mocker.proxy(DexterityFTI(portal_type)) class INew(Interface): title = zope.schema.TextLine(title=u"title") model_dummy = Model({u"": INew}) self.expect(fti.lookupModel()).result(model_dummy) self.create_dummy() site_dummy = self.create_dummy(getPhysicalPath=lambda: ("", "siteid")) self.mock_utility(site_dummy, ISiteRoot) class IBlank(Interface): pass self.replay() # Set source interface schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync this with schema ftiModified(fti, ObjectModifiedEvent(fti, DexterityFTIModificationDescription("model_source", ""))) self.failUnless("title" in IBlank) self.failUnless(IBlank["title"].title == u"title")
def test_new_factory_not_registered_after_name_changed_if_exists(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = self.mocker.proxy(PersistentComponents(bases=(getGlobalSiteManager(),))) getSiteManager_mock = self.mocker.replace("zope.component.hooks.getSiteManager") self.expect(getSiteManager_mock(dummy_site)).result(site_manager_mock).count(1, None) # Create a global default for the new name self.mock_utility(DexterityFactory(portal_type), IFactory, name="new-factory") # Factory should not be registered again self.expect( site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x.portal_type == portal_type), IFactory, "new-factory", info="plone.dexterity.dynamic", ) ).passthrough().count(0) self.replay() fti.factory = "new-factory" ftiModified(fti, ObjectModifiedEvent(fti, DexterityFTIModificationDescription("factory", "old-factory")))
def test_new_factory_not_registered_after_name_changed_if_exists(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = Mock( wraps=PersistentComponents(bases=(getGlobalSiteManager(),))) from zope.component.hooks import getSiteManager self.patch_global(getSiteManager, return_value=site_manager_mock) # Create a global default for the new name self.mock_utility( DexterityFactory(portal_type), IFactory, name='new-factory' ) fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory') ) ) # Factory should not be registered again self.assertFalse(site_manager_mock.registerUtility.called)
def test_dynamic_schema_refreshed_on_modify_model_source(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) class INew(Interface): title = zope.schema.TextLine(title=u"title") model_dummy = Model({u"": INew}) fti.lookupModel = Mock(return_value=model_dummy) self.create_dummy() site_dummy = self.create_dummy( getPhysicalPath=lambda: ('', 'siteid') ) self.mock_utility(site_dummy, ISiteRoot) class IBlank(Interface): pass # Set source interface schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync this with schema ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('model_source', '') ) ) self.assertTrue('title' in IBlank) self.assertTrue(IBlank['title'].title == u"title")
def test_new_factory_not_registered_after_name_changed_if_exists(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = Mock(wraps=PersistentComponents( bases=(getGlobalSiteManager(), ))) from zope.component.hooks import getSiteManager self.patch_global(getSiteManager, return_value=site_manager_mock) # Create a global default for the new name self.mock_utility(DexterityFactory(portal_type), IFactory, name='new-factory') fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory'))) # Factory should not be registered again self.assertFalse(site_manager_mock.registerUtility.called)
def test_old_factory_not_unregistered_if_not_created_by_dexterity(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = Mock(wraps=PersistentComponents( bases=(getGlobalSiteManager(), ))) from zope.component.hooks import getSiteManager self.patch_global(getSiteManager, return_value=site_manager_mock) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = None site_manager_mock.registeredUtilities = Mock(return_value=[reg1]) fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory'))) # This should not be removed, since we didn't create it self.assertFalse(site_manager_mock.unregisterUtility.called) # A new one may still be created, however self.assertEqual(site_manager_mock.registerUtility.call_args[0][2], 'new-factory')
def test_dynamic_schema_refreshed_on_modify_model_source(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) class INew(Interface): title = zope.schema.TextLine(title=u"title") model_dummy = Model({u"": INew}) fti.lookupModel = Mock(return_value=model_dummy) self.create_dummy() site_dummy = self.create_dummy(getPhysicalPath=lambda: ('', 'siteid')) self.mock_utility(site_dummy, ISiteRoot) class IBlank(Interface): pass # Set source interface schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync this with schema ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('model_source', ''))) self.assertTrue('title' in IBlank) self.assertTrue(IBlank['title'].title == u"title")
def test_old_factory_unregistered_after_name_changed_if_dynamic(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = Mock(wraps=PersistentComponents( bases=(getGlobalSiteManager(), ))) from zope.component.hooks import getSiteManager self.patch_global(getSiteManager, return_value=site_manager_mock) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = 'plone.dexterity.dynamic' site_manager_mock.registeredUtilities = Mock(return_value=[reg1]) fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory'))) # Expect this to get removed site_manager_mock.unregisterUtility.assert_called_once_with( provided=IFactory, name='old-factory') # And a new one to be created with the new factory name self.assertEqual(site_manager_mock.registerUtility.call_args[0][2], 'new-factory')
def test_dynamic_schema_refreshed_on_modify_model_source(self): portal_type = 'testtype' fti = self.mocker.proxy(DexterityFTI(portal_type)) class INew(Interface): title = zope.schema.TextLine(title='title') model_dummy = Model({'': INew}) self.expect(fti.lookupModel()).result(model_dummy) self.create_dummy() site_dummy = self.create_dummy(getPhysicalPath=lambda: ('', 'siteid')) self.mock_utility(site_dummy, Interface) class IBlank(Interface): pass self.replay() # Set source interface schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync this with schema ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('model_source', ''))) self.assertTrue('title' in IBlank) self.assertTrue(IBlank['title'].title == 'title')
def test_concrete_schema_not_refreshed_on_modify_schema(self): portal_type = 'testtype' fti = self.mocker.proxy(DexterityFTI(portal_type)) class IBlank(Interface): pass class INew(Interface): title = zope.schema.TextLine(title='title') model_dummy = Model({'': INew}) self.expect(fti.lookupModel()).result(model_dummy).count(0, None) self.create_dummy() site_dummy = self.create_dummy(getPhysicalPath=lambda: ('', 'siteid')) self.mock_utility(site_dummy, Interface) self.replay() # Set schema to something so that hasDynamicSchema is false fti.schema = IBlank.__identifier__ assert not fti.hasDynamicSchema # Set source for dynamic FTI - should not be used schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync should not happen now ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('schema', ''))) self.assertFalse('title' in IBlank)
def test_renamed_factory_not_unregistered_if_not_unique(self): portal_type = u"testtype" fti = DexterityFTI(portal_type, factory='common-factory') portal_type2 = u"testtype2" fti2 = DexterityFTI(portal_type2, factory='common-factory') # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = self.mocker.proxy(PersistentComponents(bases=(getGlobalSiteManager(),))) getSiteManager_mock = self.mocker.replace('zope.app.component.hooks.getSiteManager') self.expect(getSiteManager_mock(dummy_site)).result(site_manager_mock).count(1,None) # Pretend two FTIs are registered, both using common-factory self.expect(site_manager_mock.registeredUtilities()).result([ self.create_dummy(provided=IFactory, name='common-factory', info='plone.dexterity.dynamic'), self.create_dummy(component=fti, provided=IDexterityFTI, name='testtype', info='plone.dexterity.dynamic'), self.create_dummy(component=fti2, provided=IDexterityFTI, name='testtype2', info='plone.dexterity.dynamic'), ]) # We shouldn't remove this since fti2 still uses it self.expect(site_manager_mock.unregisterUtility(provided=IFactory, name='common-factory')).count(0) # And a new one to be created with the new factory name self.expect(site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x.portal_type == portal_type), IFactory, 'new-factory', info='plone.dexterity.dynamic')).passthrough() self.replay() fti.factory = 'new-factory' ftiModified(fti, ObjectModifiedEvent(fti, DexterityFTIModificationDescription('factory', 'common-factory')))
def test_old_factory_unregistered_after_name_changed_if_dynamic(self): portal_type = 'testtype' fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, Interface) site_manager_mock = self.mocker.proxy( PersistentComponents(bases=(getGlobalSiteManager(),)) ) getSiteManager_mock = self.mocker.replace( 'zope.component.hooks.getSiteManager' ) self.expect( getSiteManager_mock(dummy_site) ).result(site_manager_mock).count(1, None) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = 'plone.dexterity.dynamic' self.expect(site_manager_mock.registeredUtilities()).result([reg1]) # Expect this to get removed self.expect( site_manager_mock.unregisterUtility( provided=IFactory, name='old-factory' ) ) # And a new one to be created with the new factory name self.expect( site_manager_mock.registerUtility( mocker.MATCH( lambda x: isinstance(x, DexterityFactory) and x.portal_type == portal_type ), IFactory, 'new-factory', info='plone.dexterity.dynamic' ) ).passthrough() self.replay() fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory') ) )
def test_renamed_factory_not_unregistered_if_not_unique(self): portal_type = 'testtype' fti = DexterityFTI(portal_type, factory='common-factory') portal_type2 = 'testtype2' fti2 = DexterityFTI(portal_type2, factory='common-factory') # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, Interface) site_manager_mock = self.mocker.proxy( PersistentComponents(bases=(getGlobalSiteManager(), ))) getSiteManager_mock = self.mocker.replace( 'zope.component.hooks.getSiteManager') self.expect( getSiteManager_mock(dummy_site)).result(site_manager_mock).count( 1, None) # Pretend two FTIs are registered, both using common-factory self.expect(site_manager_mock.registeredUtilities()).result([ self.create_dummy(provided=IFactory, name='common-factory', info='plone.dexterity.dynamic'), self.create_dummy(component=fti, provided=IDexterityFTI, name='testtype', info='plone.dexterity.dynamic'), self.create_dummy(component=fti2, provided=IDexterityFTI, name='testtype2', info='plone.dexterity.dynamic'), ]) # We shouldn't remove this since fti2 still uses it self.expect( site_manager_mock.unregisterUtility( provided=IFactory, name='common-factory')).count(0) # And a new one to be created with the new factory name self.expect( site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x. portal_type == portal_type), IFactory, 'new-factory', info='plone.dexterity.dynamic')).passthrough() self.replay() fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'common-factory')))
def test_renamed_factory_not_unregistered_if_not_unique(self): portal_type = u"testtype" fti = DexterityFTI(portal_type, factory='common-factory') portal_type2 = u"testtype2" fti2 = DexterityFTI(portal_type2, factory='common-factory') # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = Mock( wraps=PersistentComponents(bases=(getGlobalSiteManager(),))) from zope.component.hooks import getSiteManager self.patch_global(getSiteManager, return_value=site_manager_mock) # Pretend two FTIs are registered, both using common-factory site_manager_mock.registeredUtilities = Mock(return_value=[ self.create_dummy( provided=IFactory, name='common-factory', info='plone.dexterity.dynamic' ), self.create_dummy( component=fti, provided=IDexterityFTI, name='testtype', info='plone.dexterity.dynamic' ), self.create_dummy( component=fti2, provided=IDexterityFTI, name='testtype2', info='plone.dexterity.dynamic' ), ]) fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription( 'factory', 'common-factory' ) ) ) # We shouldn't remove this since fti2 still uses it self.assertFalse(site_manager_mock.unregisterUtility.called) # A new one may still be created, however self.assertEqual( site_manager_mock.registerUtility.call_args[0][2], 'new-factory')
def test_dynamic_schema_refreshed_on_modify_schema_policy(self): portal_type = u"testtype" fti = self.mocker.proxy(DexterityFTI(portal_type)) class INew(Interface): title = zope.schema.TextLine(title=u"title") class IBlank(Interface): pass class TestSchemaPolicy(DexteritySchemaPolicy): def bases(self, schemaName, tree): return (INew,) gsm = getGlobalSiteManager() policy = TestSchemaPolicy() gsm.registerUtility( policy, plone.supermodel.interfaces.ISchemaPolicy, name=u"test" ) self.expect(fti.schema_policy).passthrough().count(0, None) site_dummy = self.create_dummy( getPhysicalPath=lambda: ('', 'siteid') ) self.mock_utility(site_dummy, ISiteRoot) self.replay() # Set source interface schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) original = getattr(plone.dexterity.schema.generated, schemaName) self.assertNotIn(INew, original.__bases__) self.assertNotIn('title', original) # Set new schema_policy fti.schema_policy = "test" # Sync this with schema ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('schema_policy', '') ) ) updated = getattr(plone.dexterity.schema.generated, schemaName) self.assertIn('title', updated) self.assertIn(INew, updated.__bases__)
def test_dynamic_schema_refreshed_on_modify_schema_policy(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) class INew(Interface): title = zope.schema.TextLine(title=u"title") class IBlank3(Interface): pass class TestSchemaPolicy(DexteritySchemaPolicy): def bases(self, schemaName, tree): return (INew,) gsm = getGlobalSiteManager() policy = TestSchemaPolicy() gsm.registerUtility( policy, plone.supermodel.interfaces.ISchemaPolicy, name=u"test" ) site_dummy = self.create_dummy( getPhysicalPath=lambda: ('', 'siteid') ) self.mock_utility(site_dummy, ISiteRoot) # Set source interface schemaName = portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank3) original = getattr(plone.dexterity.schema.generated, schemaName) self.assertNotIn(INew, original.__bases__) self.assertNotIn('title', original) # Set new schema_policy fti.schema_policy = "test" # Sync this with schema ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('schema_policy', '') ) ) updated = getattr(plone.dexterity.schema.generated, schemaName) self.assertIn('title', updated) self.assertIn(INew, updated.__bases__)
def test_old_factory_not_unregistered_if_not_created_by_dexterity(self): portal_type = 'testtype' fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, Interface) site_manager_mock = self.mocker.proxy( PersistentComponents(bases=(getGlobalSiteManager(), ))) getSiteManager_mock = self.mocker.replace( 'zope.component.hooks.getSiteManager') self.expect( getSiteManager_mock(dummy_site)).result(site_manager_mock).count( 1, None) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = None self.expect(site_manager_mock.registeredUtilities()).result([reg1]) # This should not be removed, since we didn't create it self.expect( site_manager_mock.unregisterUtility(provided=IFactory, name='old-factory')).count(0) # A new one may still be created, however self.expect( site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x. portal_type == portal_type), IFactory, 'new-factory', info='plone.dexterity.dynamic')).passthrough() self.replay() fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory')))
def test_old_factory_unregistered_after_name_changed_if_dynamic(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = self.mocker.proxy( PersistentComponents(bases=(getGlobalSiteManager(), ))) getSiteManager_mock = self.mocker.replace( 'zope.component.hooks.getSiteManager') self.expect( getSiteManager_mock(dummy_site)).result(site_manager_mock).count( 1, None) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = 'plone.dexterity.dynamic' self.expect(site_manager_mock.registeredUtilities()).result([reg1]) # Expect this to get removed self.expect( site_manager_mock.unregisterUtility(provided=IFactory, name='old-factory')) # And a new one to be created with the new factory name self.expect( site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x. portal_type == portal_type), IFactory, 'new-factory', info='plone.dexterity.dynamic')).passthrough() self.replay() fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory')))
def test_dynamic_schema_refreshed_on_modify_model_source(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) class INew(Interface): title = zope.schema.TextLine(title=u"title") model_dummy = Model({u"": INew}) fti.lookupModel = Mock(return_value=model_dummy) self.create_dummy() site_dummy = self.create_dummy( getPhysicalPath=lambda: ('', 'siteid') ) self.mock_utility(site_dummy, ISiteRoot) # b/c of zope.interface does not support hashing of the same class multiple times # we need to postfix with a unique number # see https://github.com/zopefoundation/zope.interface/issues/216#issuecomment-701332380 class IBlank2(Interface): pass # Set source interface schemaName = portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank2) # Sync this with schema ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('model_source', '') ) ) self.assertTrue('title' in IBlank2) self.assertTrue(IBlank2['title'].title == u"title")
def test_new_factory_not_registered_after_name_changed_if_exists(self): portal_type = 'testtype' fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, Interface) site_manager_mock = self.mocker.proxy( PersistentComponents(bases=(getGlobalSiteManager(), ))) getSiteManager_mock = self.mocker.replace( 'zope.component.hooks.getSiteManager') self.expect( getSiteManager_mock(dummy_site)).result(site_manager_mock).count( 1, None) # Create a global default for the new name self.mock_utility(DexterityFactory(portal_type), IFactory, name='new-factory') # Factory should not be registered again self.expect( site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x. portal_type == portal_type), IFactory, 'new-factory', info='plone.dexterity.dynamic')).passthrough().count(0) self.replay() fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory')))
def test_concrete_schema_not_refreshed_on_modify_schema(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) class IBlank4(Interface): pass class INew(Interface): title = zope.schema.TextLine(title=u"title") model_dummy = Model({u"": INew}) fti.lookupModel = Mock(return_value=model_dummy) site_dummy = self.create_dummy( getPhysicalPath=lambda: ('', 'siteid') ) self.mock_utility(site_dummy, ISiteRoot) # Set schema to something so that hasDynamicSchema is false fti.schema = IBlank4.__identifier__ assert not fti.hasDynamicSchema # Set source for dynamic FTI - should not be used schemaName = portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank4) # Sync should not happen now ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('schema', '') ) ) self.assertFalse('title' in IBlank4)
def test_concrete_schema_not_refreshed_on_modify_schema(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) class IBlank(Interface): pass class INew(Interface): title = zope.schema.TextLine(title=u"title") model_dummy = Model({u"": INew}) fti.lookupModel = Mock(return_value=model_dummy) site_dummy = self.create_dummy( getPhysicalPath=lambda: ('', 'siteid') ) self.mock_utility(site_dummy, ISiteRoot) # Set schema to something so that hasDynamicSchema is false fti.schema = IBlank.__identifier__ assert not fti.hasDynamicSchema # Set source for dynamic FTI - should not be used schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync should not happen now ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('schema', '') ) ) self.assertFalse('title' in IBlank)
def test_dynamic_schema_refreshed_on_modify_model_source(self): portal_type = 'testtype' fti = self.mocker.proxy(DexterityFTI(portal_type)) class INew(Interface): title = zope.schema.TextLine(title='title') model_dummy = Model({'': INew}) self.expect(fti.lookupModel()).result(model_dummy) self.create_dummy() site_dummy = self.create_dummy( getPhysicalPath=lambda: ('', 'siteid') ) self.mock_utility(site_dummy, Interface) class IBlank(Interface): pass self.replay() # Set source interface schemaName = utils.portalTypeToSchemaName(fti.getId()) setattr(plone.dexterity.schema.generated, schemaName, IBlank) # Sync this with schema ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('model_source', '') ) ) self.assertTrue('title' in IBlank) self.assertTrue(IBlank['title'].title == 'title')
def test_old_factory_unregistered_after_name_changed_if_dynamic(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = Mock( wraps=PersistentComponents(bases=(getGlobalSiteManager(),))) from zope.component.hooks import getSiteManager self.patch_global(getSiteManager, return_value=site_manager_mock) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = 'plone.dexterity.dynamic' site_manager_mock.registeredUtilities = Mock(return_value=[reg1]) fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory') ) ) # Expect this to get removed site_manager_mock.unregisterUtility.assert_called_once_with( provided=IFactory, name='old-factory') # And a new one to be created with the new factory name self.assertEqual( site_manager_mock.registerUtility.call_args[0][2], 'new-factory')
def test_old_factory_not_unregistered_if_not_created_by_dexterity(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) # Mock the lookup of the site and the site manager at the site root dummy_site = self.create_dummy() self.mock_utility(dummy_site, ISiteRoot) site_manager_mock = Mock( wraps=PersistentComponents(bases=(getGlobalSiteManager(),))) from zope.component.hooks import getSiteManager self.patch_global(getSiteManager, return_value=site_manager_mock) # Pretend like we have a utility registered reg1 = self.create_dummy() reg1.provided = IFactory reg1.name = 'old-factory' reg1.info = None site_manager_mock.registeredUtilities = Mock(return_value=[reg1]) fti.factory = 'new-factory' ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('factory', 'old-factory') ) ) # This should not be removed, since we didn't create it self.assertFalse(site_manager_mock.unregisterUtility.called) # A new one may still be created, however self.assertEqual( site_manager_mock.registerUtility.call_args[0][2], 'new-factory')
def configure_group_encoder(portal_types, contacts_part=False): """ Used to configure a creating function and group for some internal organizations. Update portal_type to add behavior, configure localroles field """ # function functions = get_registry_functions() if CREATING_GROUP_SUFFIX not in [fct['fct_id'] for fct in functions]: functions.append({ 'fct_title': u'Indicateur du service', 'fct_id': CREATING_GROUP_SUFFIX, 'fct_orgs': [], 'fct_management': False, 'enabled': True }) set_registry_functions(functions) if contacts_part and CONTACTS_PART_SUFFIX not in [ fct['fct_id'] for fct in functions ]: functions.append({ 'fct_title': u'Contacts par défaut', 'fct_id': CONTACTS_PART_SUFFIX, 'fct_orgs': [], 'fct_management': False, 'enabled': True }) set_registry_functions(functions) # role and permission portal = api.portal.get() # existing_roles = list(portal.valid_roles()) # if CREATING_FIELD_ROLE not in existing_roles: # existing_roles.append(CREATING_FIELD_ROLE) # portal.__ac_roles__ = tuple(existing_roles) # portal.manage_permission('imio.dms.mail: Write creating group field', # ('Manager', 'Site Administrator', CREATING_FIELD_ROLE), acquire=0) # local roles config config = { 'dmsincomingmail': { # i_e ok 'created': { CREATING_GROUP_SUFFIX: { 'roles': [ 'Contributor', 'Editor', 'DmsFile Contributor', 'Base Field Writer', 'Treating Group Writer' ] } }, # CREATING_FIELD_ROLE]}}, 'proposed_to_manager': { CREATING_GROUP_SUFFIX: { 'roles': ['Base Field Writer', 'Reader'] } }, 'proposed_to_agent': { CREATING_GROUP_SUFFIX: { 'roles': ['Reader'] } }, 'in_treatment': { CREATING_GROUP_SUFFIX: { 'roles': ['Reader'] } }, 'closed': { CREATING_GROUP_SUFFIX: { 'roles': ['Reader'] } } }, 'dmsincoming_email': { 'created': { CREATING_GROUP_SUFFIX: { 'roles': [ 'Contributor', 'Editor', 'DmsFile Contributor', 'Base Field Writer', 'Treating Group Writer' ] } }, # CREATING_FIELD_ROLE]}}, 'proposed_to_manager': { CREATING_GROUP_SUFFIX: { 'roles': ['Base Field Writer', 'Reader'] } }, 'proposed_to_agent': { CREATING_GROUP_SUFFIX: { 'roles': ['Reader'] } }, 'in_treatment': { CREATING_GROUP_SUFFIX: { 'roles': ['Reader'] } }, 'closed': { CREATING_GROUP_SUFFIX: { 'roles': ['Reader'] } } }, 'dmsoutgoingmail': { 'to_be_signed': { CREATING_GROUP_SUFFIX: { 'roles': ['Editor', 'Reviewer'] } }, 'sent': { CREATING_GROUP_SUFFIX: { 'roles': ['Reader', 'Reviewer'] } }, 'scanned': { CREATING_GROUP_SUFFIX: { 'roles': [ 'Contributor', 'Editor', 'Reviewer', 'DmsFile Contributor', 'Base Field Writer', 'Treating Group Writer' ] } }, }, # 'dmsoutgoing_email': { # 'to_be_signed': {CREATING_GROUP_SUFFIX: {'roles': ['Editor', 'Reviewer']}}, # 'sent': {CREATING_GROUP_SUFFIX: {'roles': ['Reader', 'Reviewer']}}, # 'scanned': {CREATING_GROUP_SUFFIX: {'roles': ['Contributor', 'Editor', 'Reviewer', 'DmsFile Contributor', # 'Base Field Writer', 'Treating Group Writer']}}, # }, } # add localroles for possible proposed_to_n_plus_ states # only incoming mails if 'dmsincomingmail' in portal_types: # i_e ok for typ in ('dmsincomingmail', 'dmsincoming_email'): states = list_wf_states(portal, typ) for st_id, st_tit in states: if st_id.startswith('proposed_to_n_plus_'): config[typ][st_id] = { CREATING_GROUP_SUFFIX: { 'roles': ['Reader'] } } # criterias config criterias = { 'dmsincomingmail': ('incoming-mail', 'mail-searches', 'all_mails'), # i_e ok 'dmsoutgoingmail': ('outgoing-mail', 'mail-searches', 'all_mails'), 'organization': ('contacts', 'orgs-searches', 'all_orgs'), 'person': ('contacts', 'persons-searches', 'all_persons'), 'held_position': ('contacts', 'hps-searches', 'all_hps'), 'contact_list': ('contacts', 'cls-searches', 'all_cls'), } for portal_type in portal_types: # behaviors fti = getUtility(IDexterityFTI, name=portal_type) # try: # fti = getUtility(IDexterityFTI, name=portal_type) # except ComponentLookupError: # continue if 'imio.dms.mail.content.behaviors.IDmsMailCreatingGroup' not in fti.behaviors: old_bav = tuple(fti.behaviors) fti.behaviors = tuple( list(fti.behaviors) + ['imio.dms.mail.content.behaviors.IDmsMailCreatingGroup']) ftiModified( fti, ObjectModifiedEvent( fti, DexterityFTIModificationDescription('behaviors', old_bav))) # local roles if config.get(portal_type): msg = add_fti_configuration(portal_type, config[portal_type], keyname='creating_group') if msg: logger.warn(msg) # criterias folder_id, category_id, default_id = criterias.get( portal_type, ('', '', '')) if folder_id: reimport_faceted_config( portal[folder_id][category_id], xml='mail-searches-group-encoder.xml', default_UID=portal[folder_id][category_id][default_id].UID()) # display added field for im and om if not contacts_part: config = {'dmsincomingmail': 'imail', 'dmsoutgoingmail': 'omail'} key = 'imio.dms.mail.browser.settings.IImioDmsMailConfig.{}_fields'.format( config[portal_types[0]]) fields = api.portal.get_registry_record(key) if 'IDmsMailCreatingGroup.creating_group' not in [ f['field_name'] for f in fields ]: fields.append({ 'field_name': 'IDmsMailCreatingGroup.creating_group', 'read_tal_condition': u'', 'write_tal_condition': u'' }) api.portal.set_registry_record(key, fields)