def test_components_unregistered_on_delete(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) container_dummy = self.create_dummy() # 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) # First add the components ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId())) # Then remove them again ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId())) site_dummy = self.create_dummy( getSiteManager=lambda: site_manager_mock) setSite(site_dummy) setHooks() self.assertEqual(None, queryUtility(IDexterityFTI, name=portal_type)) self.assertEqual(None, queryUtility(IFactory, name=portal_type))
def create_attachment(self, mail, part): ''' Create an attachment for this mail ''' cid = part['Content-Id'] file_name = part.get_filename() or cid content_type = part.get_content_type() payload = part.get_payload(decode=True) type_name = self.registry.findTypeName(file_name, content_type, payload) or 'File' obj = api.content.create( type=type_name, title=file_name, container=mail, ) if type_name == 'File': obj.file = NamedBlobFile(data=payload, filename=unicode(file_name)) elif type_name == 'Image': obj.image = NamedBlobImage(data=payload, filename=unicode(file_name)) else: primary = utils.get_primary_field(obj) if primary: primary[1].set(obj, payload) else: log.warning('Discarding paylod for %s', obj.UID()) obj.setSubject(self.mailin_keyworkds) event.notify(ObjectAddedEvent(obj)) return obj
def test_components_not_registered_on_add_if_exist(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) container_dummy = self.create_dummy() # 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) # Register FTI utility and factory utility self.mock_utility(fti, IDexterityFTI, name=portal_type) self.mock_utility(DexterityFactory(portal_type), IFactory, name=portal_type) # We expect that all components are registered, so do not expect any # registrations ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId())) self.assertFalse(site_manager_mock.registerUtility.called)
def test_components_registered_on_add(self): portal_type = u"testtype" fti = DexterityFTI(portal_type) container_dummy = self.create_dummy() # 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) ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId())) args1, kwargs1 = site_manager_mock.registerUtility.call_args_list[0] self.assertEqual(args1, (fti, IDexterityFTI, portal_type)) self.assertEqual(kwargs1, {'info': 'plone.dexterity.dynamic'}) args2, kwargs2 = site_manager_mock.registerUtility.call_args_list[1] self.assertIsInstance(args2[0], DexterityFactory) self.assertEqual(args2[0].portal_type, portal_type) self.assertEqual(args2[1:], (IFactory, portal_type)) self.assertEqual(kwargs2, {'info': 'plone.dexterity.dynamic'}) site_dummy = self.create_dummy( getSiteManager=lambda: site_manager_mock) setSite(site_dummy) setHooks() self.assertNotEquals(None, queryUtility(IDexterityFTI, name=portal_type)) self.assertNotEquals(None, queryUtility(IFactory, name=portal_type))
def add(container, obj, rename=True): """Add an object to a container.""" id_ = getattr(aq_base(obj), "id", None) # Archetypes objects are already created in a container thus we just fire # the notification events and rename the object if necessary. if base_hasattr(obj, "_at_rename_after_creation"): notify(ObjectAddedEvent(obj, container, id_)) notifyContainerModified(container) if obj._at_rename_after_creation and rename: obj._renameAfterCreation(check_auto_id=True) return obj else: if rename: chooser = INameChooser(container) # INameFromTitle adaptable objects should not get a name # suggestion. NameChooser would prefer the given name instead of # the one provided by the INameFromTitle adapter. suggestion = None name_from_title = INameFromTitle(obj, None) if name_from_title is None: suggestion = obj.Title() id_ = chooser.chooseName(suggestion, obj) obj.id = id_ new_id = container._setObject(id_, obj) # _setObject triggers ObjectAddedEvent which can end up triggering a # content rule to move the item to a different container. In this case # look up the object by UUID. try: return container._getOb(new_id) except AttributeError: uuid = IUUID(obj) return uuidToObject(uuid)
def add(self, item): if not IResponse.providedBy(item): raise UnaddableError(self, item, "IResponse interface not provided.") self.append(item) id = str(len(self)) event = ObjectAddedEvent(item, newParent=self.context, newName=id) notify(event)
def addRelation(self, obj): """Override base to run manage_afterAdd like ObjectManager""" if self._objects.has_key(obj.getId()): log.debug("obj %s already exists on %s", obj.getPrimaryId(), self.getPrimaryId()) notify(ObjectWillBeAddedEvent(obj, self, obj.getId())) ToManyRelationshipBase.addRelation(self, obj) obj = obj.__of__(self) o = self._getOb(obj.id) notify(ObjectAddedEvent(o, self, obj.getId()))
def _setObject(self, id, object, suppress_events=False): if not suppress_events: notify(ObjectWillBeAddedEvent(object, self, id)) self._setOb(id, object) object = self._getOb(id) if hasattr(aq_base(object), 'manage_afterAdd'): object.manage_afterAdd(object, self) if not suppress_events: notify(ObjectAddedEvent(object, self, id)) notifyContainerModified(self) return object
def test_components_registered_on_add(self): portal_type = 'testtype' fti = DexterityFTI(portal_type) container_dummy = self.create_dummy() # 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) # We expect that no components are registered , so look for all # registrations self.expect( site_manager_mock.registerUtility( fti, IDexterityFTI, portal_type, info='plone.dexterity.dynamic')).passthrough() self.expect( site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x. portal_type == portal_type), IFactory, portal_type, info='plone.dexterity.dynamic')).passthrough() self.replay() ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId())) site_dummy = self.create_dummy( getSiteManager=lambda: site_manager_mock) setSite(site_dummy) setHooks() self.assertNotEquals(None, queryUtility(IDexterityFTI, name=portal_type)) self.assertNotEquals(None, queryUtility(IFactory, name=portal_type))
def add(container, obj): """Add an object to a container.""" id_ = obj.getId() # Archetypes objects are already created in a container thus we just fire # the notification events. if aq_base(container) is aq_base(aq_parent(obj)): notify(ObjectAddedEvent(obj, container, id_)) notifyContainerModified(container) return obj else: new_id = container._setObject(id_, obj) # _setObject triggers ObjectAddedEvent which can end up triggering a # content rule to move the item to a different container. In this case # look up the object by UUID. try: return container._getOb(new_id) except AttributeError: uuid = IUUID(obj) return uuidToObject(uuid)
def test_components_unregistered_on_delete(self): portal_type = 'testtype' fti = DexterityFTI(portal_type) container_dummy = self.create_dummy() # 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) # We expect to always be able to unregister without error, even if the # components do not exists (as here) self.expect( site_manager_mock.unregisterUtility( provided=IDexterityFTI, name=portal_type)).passthrough() self.expect( site_manager_mock.unregisterUtility( provided=IFactory, name=portal_type)).passthrough() self.replay() # First add the components ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId())) # Then remove them again ftiRemoved(fti, ObjectRemovedEvent(fti, container_dummy, fti.getId())) site_dummy = self.create_dummy( getSiteManager=lambda: site_manager_mock) setSite(site_dummy) setHooks() self.assertEqual(None, queryUtility(IDexterityFTI, name=portal_type)) self.assertEqual(None, queryUtility(IFactory, name=portal_type))
def _constructInstance(self, container, id, *args, **kw): """Build a bare instance of the appropriate type. Does not do any security checks. """ constructor = self.restrictedTraverse(self.constructor_path) # make sure ownership is explicit before switching the context if not hasattr(aq_base(constructor), '_owner'): constructor._owner = aq_get(constructor, '_owner') # Rewrap to get into container's context. constructor = aq_base(constructor).__of__(container) id = str(id) obj = constructor(container, id, *args, **kw) if hasattr(obj, '_setPortalTypeName'): obj._setPortalTypeName(self.getId()) notify(ObjectAddedEvent(obj, container, obj.getId())) notifyContainerModified(container) return obj
def _constructInstance(self, container, id, *args, **kw): """Build a bare instance of the appropriate type. Does not do any security checks. """ id = str(id) if self.product: # oldstyle factory m = self._getFactoryMethod(container, check_security=0) if getattr(aq_base(m), 'isDocTemp', 0): kw['id'] = id request = aq_get(self, 'REQUEST', None) if request is None: request = getRequest() newid = m(m.aq_parent, request, *args, **kw) else: newid = m(id, *args, **kw) # allow factory to munge ID newid = newid or id obj = container._getOb(newid) if hasattr(obj, '_setPortalTypeName'): obj._setPortalTypeName(self.getId()) notify(ObjectCreatedEvent(obj)) notify(ObjectAddedEvent(obj, container, newid)) notifyContainerModified(container) else: # newstyle factory factory = getUtility(IFactory, self.factory) obj = factory(id, *args, **kw) if hasattr(obj, '_setPortalTypeName'): obj._setPortalTypeName(self.getId()) notify(ObjectCreatedEvent(obj)) rval = container._setObject(id, obj) newid = isinstance(rval, six.string_types) and rval or id obj = container._getOb(newid) return obj
def _constructInstance(self, container, id, *args, **kw): """Build a bare instance of the appropriate type. Does not do any security checks. """ # XXX: this method violates the rules for tools/utilities: # it depends on self.REQUEST id = str(id) if self.product: # oldstyle factory m = self._getFactoryMethod(container, check_security=0) if getattr(aq_base(m), 'isDocTemp', 0): kw['id'] = id newid = m(m.aq_parent, self.REQUEST, *args, **kw) else: newid = m(id, *args, **kw) # allow factory to munge ID newid = newid or id obj = container._getOb(newid) if hasattr(obj, '_setPortalTypeName'): obj._setPortalTypeName(self.getId()) notify(ObjectCreatedEvent(obj)) notify(ObjectAddedEvent(obj, container, newid)) notifyContainerModified(container) else: # newstyle factory factory = getUtility(IFactory, self.factory) obj = factory(id, *args, **kw) if hasattr(obj, '_setPortalTypeName'): obj._setPortalTypeName(self.getId()) notify(ObjectCreatedEvent(obj)) rval = container._setObject(id, obj) newid = isinstance(rval, basestring) and rval or id obj = container._getOb(newid) return obj
def test_components_not_registered_on_add_if_exist(self): portal_type = 'testtype' fti = DexterityFTI(portal_type) container_dummy = self.create_dummy() # 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) # Register FTI utility and factory utility self.mock_utility(fti, IDexterityFTI, name=portal_type) self.mock_utility(DexterityFactory(portal_type), IFactory, name=portal_type) # We expect that all components are registered, so do not expect any # registrations self.expect( site_manager_mock.registerUtility( fti, IDexterityFTI, portal_type)).passthrough().count(0) self.expect( site_manager_mock.registerUtility( mocker.MATCH(lambda x: isinstance(x, DexterityFactory) and x. portal_type == portal_type), IFactory, portal_type)).passthrough().count(0) self.replay() ftiAdded(fti, ObjectAddedEvent(fti, container_dummy, fti.getId()))
def add(self, item): self.append(item) id = str(len(self)) event = ObjectAddedEvent(item, newParent=self.context, newName=id) notify(event)
def _notify(self, status): event = ObjectAddedEvent(status, newParent=self, newName=status.id) notify(event)