def test_tile_creation(self):
        tile = TestTile(
            url='http://nohost/plone/test-document/@@my.tile/firstTile',
            id='firstTile',
            context=self.document,
            request=self.request)
        self.assertEqual(getattr(self.document, 'tiles_list', None), None)
        notify(ObjectAddedEvent(tile, self.document, tile.id))
        resStructure = {
            'defaultManager': [
                {
                    'tile_type': 'my.tile',
                    'tile_id': 'firstTile',
                    'tile_hidden': False,
                    'tile_style': '',
                },
            ],
        }
        self.assertEqual(self.document.tiles_list, resStructure)

        tile2 = TestTile(
            url='http://nohost/plone/test-document/@@alt.tile/secondTile',
            id='secondTile',
            context=self.document,
            request=self.request)
        notify(ObjectAddedEvent(tile2, self.document, tile2.id))
        resStructure['defaultManager'].append({
            'tile_type': 'alt.tile',
            'tile_id': 'secondTile',
            'tile_hidden': False,
            'tile_style': '',
        })
        self.assertEqual(self.document.tiles_list, resStructure)
Exemplo n.º 2
0
    def setUp(self):
        """Custom shared utility setup for tests."""
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        self.installer = api.portal.get_tool('portal_quickinstaller')
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        api.user.create(
            username='******',
            email='*****@*****.**',
            password='******',
        )
        api.user.create(
            username='******',
            email='*****@*****.**',
            password='******',
        )
        setRoles(self.portal, 'editor', ['Editor', 'Contributor'])
        setRoles(self.portal, 'member', ['Member'])

        self.document = api.content.create(type='Document',
                                           title='Test document',
                                           container=self.portal)
        # create two tiles
        tile = TestTile(
            url='http://nohost/plone/test-document/@@my.tile/firstTile',
            id='firstTile',
            context=self.document,
            request=self.request)
        tile2 = TestTile(
            url='http://nohost/plone/test-document/@@alt.tile/secondTile',
            id='secondTile',
            context=self.document,
            request=self.request)
        notify(ObjectAddedEvent(tile, self.document, 'firstTile'))
        notify(ObjectAddedEvent(tile2, self.document, 'secondTile'))
Exemplo n.º 3
0
def create_task(parent, **kwargs):
    createContent('opengever.task.task')
    task = createContent('opengever.task.task', **kwargs)
    notify(ObjectCreatedEvent(task))
    task = addContentToContainer(parent, task, checkConstraints=False)
    notify(ObjectAddedEvent(task))
    return task
Exemplo n.º 4
0
 def add(self, item):
     if not IResponse.providedBy(item):
         raise ValueError("IResponse interface not provided.")
     self.append(item)
     id = str(len(self))
     event = ObjectAddedEvent(item, newParent=self.context, newName=id)
     notify(event)
Exemplo n.º 5
0
 def test_multilanguage_indexer(self):
     portal_catalog = api.portal.get_tool("portal_catalog")
     utility = queryUtility(ITaxonomy, name="collective.taxonomy.test")
     taxonomy = utility.data
     taxonomy_test = schema.Set(
         title=u"taxonomy_test",
         description=u"taxonomy description schema",
         required=False,
         value_type=schema.Choice(
             vocabulary=u"collective.taxonomy.taxonomies"),
     )
     portal_types = api.portal.get_tool("portal_types")
     fti = portal_types.get("Document")
     document_schema = fti.lookupSchema()
     schemaeditor = IEditableSchema(document_schema)
     schemaeditor.addField(taxonomy_test, name="taxonomy_test")
     notify(ObjectAddedEvent(taxonomy_test, document_schema))
     notify(FieldAddedEvent(fti, taxonomy_test))
     query = {}
     query["taxonomy_test"] = "5"
     taxo_val = taxonomy["en"][u"\u241fInformation Science\u241fSport"]
     self.document.taxonomy_test = [taxo_val]
     self.document.reindexObject()
     self.assertEqual(len(portal_catalog(query)), 1)
     # clean up
     schemaeditor.removeField("taxonomy_test")
Exemplo n.º 6
0
def set_uid(obj, uid):

    if hasattr(aq_base(obj), '_setUID'):
        obj._setUID(uid)
    else:
        setattr(obj, plone.uuid.interfaces.ATTRIBUTE_NAME, uid)
        notify(ObjectAddedEvent(obj))
Exemplo n.º 7
0
 def _fire_event(self, context, event):
     if event == "modified":
         event = ObjectModifiedEvent(context)
     elif event == "added":
         event = ObjectAddedEvent(context)
     if event:
         zope.event.notify(event)
Exemplo n.º 8
0
 def add_document(self, data, properties, request=None):
     """Add new document"""
     if request is None:
         request = check_request()
     registry = request.registry
     # check required properties
     properties = properties.copy()
     title = properties.get('title')
     application_name = properties.get('application_name')
     if (not title) or (not application_name) or (data is None):
         raise HTTPBadRequest("Missing arguments")
     owner = properties.get('owner')
     if owner and not request.has_permission(
             CREATE_DOCUMENT_WITH_OWNER_PERMISSION, context=self):
         raise HTTPForbidden()
     if not owner:
         properties['owner'] = request.principal.id
     properties['creator'] = request.principal.id
     # check storage folders
     folder = self._get_folder(datetime.utcnow())
     # create document and first version
     document, version = self._create_document(registry, folder)
     # update document data and properties
     version.update(data, properties)
     # store document
     document.get_oid()
     folder[document.oid] = document
     registry.notify(ObjectAddedEvent(version, folder, document.oid))
     # return
     return version
Exemplo n.º 9
0
def create_testobject(parent, ptype, **kwargs):
    createContent(ptype)
    obj = createContent(ptype, **kwargs)
    notify(ObjectCreatedEvent(obj))
    obj = addContentToContainer(parent, obj, checkConstraints=False)
    notify(ObjectAddedEvent(obj))
    return obj
Exemplo n.º 10
0
    def add(self, field):
        context = self.context
        schema = IEditableSchema(context.schema)

        # move it after the last field that is not in a fieldset
        # or at top if there is no field yet in "default" fieldset
        ordered_fields = [name for (name, f) in sortedFields(context.schema)]
        default_fields = non_fieldset_fields(context.schema)
        if len(default_fields) > 0:
            position = ordered_fields.index(default_fields[-1]) + 1
        else:
            position = 0

        try:
            schema.addField(field)
        except ValueError:
            raise WidgetActionExecutionError('__name__',
                Invalid(
                    u'Please select a field name that is not already used.'
                ))

        schema.moveField(field.__name__, position)
        notify(ObjectAddedEvent(field, context.schema))
        notify(FieldAddedEvent(context, field))
        IStatusMessage(self.request).addStatusMessage(
            _(u"Field added successfully."), type='info')
Exemplo n.º 11
0
    def _createFolderStructure(self, folder, structure='ymd', date=None):
        """ Create a folder structure and then return our innermost folder
        """
        if not date:
            date = DateTime()

        dateFormat = structure

        date = date.strftime(dateFormat)

        folderStructure = [str(p) for p in date.split('/')]

        container = self.element.container
        language = folder.Language()
        # We run IRuleExecutor here to make sure other rules will be
        # executed for the newly created folders
        executor = IRuleExecutor(self.context, None)
        for fId in folderStructure:
            if not fId in folder.objectIds():
                _createObjectByType(container,
                                    folder,
                                    id=fId,
                                    title=fId,
                                    description=fId)
                folder = folder[fId]
                # this makes happy multilang sites
                folder.setLanguage(language)
                event = ObjectAddedEvent(folder, aq_parent(folder), fId)
                if executor is not None:
                    executor(event)
            else:
                folder = folder[fId]
        return folder
Exemplo n.º 12
0
    def handleAdd(self, action):

        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        typeName = self.tileType.__name__

        generator = getUtility(IUUIDGenerator)
        tileId = generator()

        # Traverse to a new tile in the context, with no data
        tile = self.context.restrictedTraverse('@@%s/%s' % (
            typeName,
            tileId,
        ))

        dataManager = ITileDataManager(tile)
        dataManager.set(data)

        # Look up the URL - we need to do this after we've set the data to
        # correctly account for transient tiles
        tileURL = absoluteURL(tile, self.request)

        notify(ObjectCreatedEvent(tile))
        notify(ObjectAddedEvent(tile, self.context, tileId))

        self.request.response.redirect(tileURL)
Exemplo n.º 13
0
    def test_multilanguage_indexer(self):
        portal_catalog = api.portal.get_tool('portal_catalog')
        utility = queryUtility(ITaxonomy, name='collective.taxonomy.test')
        taxonomy = utility.data
        taxonomy_test = schema.Set(
            title=u"taxonomy_test",
            description=u"taxonomy description schema",
            required=False,
            value_type=schema.Choice(
                vocabulary=u"collective.taxonomy.taxonomies"),
        )
        portal_types = api.portal.get_tool('portal_types')
        fti = portal_types.get('Document')
        document_schema = fti.lookupSchema()
        schemaeditor = IEditableSchema(document_schema)
        schemaeditor.addField(taxonomy_test, name='taxonomy_test')
        notify(ObjectAddedEvent(taxonomy_test, document_schema))
        notify(FieldAddedEvent(fti, taxonomy_test))

        query = {}
        query['taxonomy_test'] = '5'

        simple_tax = [val for val in taxonomy['en'].values()]
        taxo_val = simple_tax[3]
        self.document.taxonomy_test = [taxo_val]
        self.document.reindexObject()
        self.assertEqual(len(portal_catalog(query)), 1)
    def testIgnoreAddedEvents(self):
        class Content(object):
            __parent__ = None
            __name__ = None

        handlers.modified(ObjectAddedEvent(Content()))
        self.assertFalse(self.called)
Exemplo n.º 15
0
    def __call__(self, filename, title, description, content_type, data,
                 portal_type):

        if filename.lower().endswith('msg'):
            # its a outlook msg file
            # needs to be converted by the Msg2MimeTransform
            data = Msg2MimeTransform()(data)
            filename = filename.replace('msg', 'eml')

        portal_type = self.get_portal_type(filename)

        obj = createContentInContainer(self.context, portal_type)

        named_file = self.create_file(filename, data, obj)
        self.set_default_values(obj, named_file)

        # initalize digitaly available
        notify(ObjectCreatedEvent(obj))
        # start pdf conversion
        notify(ObjectAddedEvent(obj))
        # rest of initialization
        notify(ObjectModifiedEvent(obj))

        obj.reindexObject()

        result = {}
        result['success'] = obj

        return result
Exemplo n.º 16
0
    def handleAdd(self, action):

        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        typeName = self.tileType.__name__

        context = self.context

        # Look up if our context supports tiles, if not
        # pick default view instead
        if not ILayoutAware(context, None):
            default_page_view = getMultiAdapter((context, self.request),
                                                name='default_page')
            default_page = default_page_view.getDefaultPage()
            context = default_page and context[default_page] or context
            context = ILayoutAware(context, None)

        # Traverse to a new tile in the context, with no data
        tile = context.restrictedTraverse(
            '@@%s/%s' % (typeName, self.tileId,))

        dataManager = ITileDataManager(tile)
        dataManager.set(data)

        # Look up the URL - we need to do this after we've set the data to
        # correctly account for transient tiles
        tileURL = absoluteURL(tile, self.request)
        contextURL = absoluteURL(tile.context, self.request)
        tileRelativeURL = tileURL

        if tileURL.startswith(contextURL):
            tileRelativeURL = '.' + tileURL[len(contextURL):]

        notify(ObjectCreatedEvent(tile))
        notify(ObjectAddedEvent(tile, self.context, self.tileId))

        IStatusMessage(self.request).addStatusMessage(
                _(u"Tile created at ${url}",
                  mapping={'url': tileURL}),
                type=u'info',
            )

        # Calculate the edit URL and append some data in a JSON structure,
        # to help the UI know what to do.

        url = getEditTileURL(tile, self.request)

        tileDataJson = {}
        tileDataJson['action'] = "save"
        tileDataJson['mode'] = "add"
        tileDataJson['url'] = tileRelativeURL
        tileDataJson['tile_type'] = typeName
        tileDataJson['id'] = tile.id

        url = appendJSONData(url, 'tiledata', tileDataJson)
        self.request.response.redirect(url)
Exemplo n.º 17
0
def indexLinks(event):
    iids = getUtility(IIntIds)
    for link in event.getLinks():
        link = removeSecurityProxy(link)
        addIntIdSubscriber(link, ObjectAddedEvent(link))
        lid = iids.getId(link)
        getLinkCatalog().index_doc(lid, link)
        link.__parent__._lids.add(lid)
    def test_gets_fired_on_mail_added(self):
        self.login(self.regular_user)

        register_event_recorder(IObjectTouchedEvent)
        notify(ObjectAddedEvent(self.mail_eml))

        event = get_last_recorded_event()
        self.assertTrue(IObjectTouchedEvent.providedBy(event))
Exemplo n.º 19
0
 def test_no_marker(self):
     context = FauxContext(FauxContainer(), 'new')
     
     notify(ObjectModifiedEvent(context))
     notify(ObjectAddedEvent(context))
     notify(ObjectRemovedEvent(context))
     
     self.assertEquals(0, len(self.handler.invocations))
Exemplo n.º 20
0
    def test_not_purged(self):
        context = FauxNonContent('new').__of__(FauxContent())

        notify(ObjectModifiedEvent(context))
        notify(ObjectAddedEvent(context))
        notify(ObjectRemovedEvent(context))

        self.assertEqual(0, len(self.handler.invocations))
Exemplo n.º 21
0
def getGroupContainer(sy):
    addIntIdSubscriber(sy, ObjectAddedEvent(sy))
    int_ids = getUtility(IIntIds)
    sy_id = str(int_ids.getId(sy))
    app = ISchoolToolApplication(None)
    gc = app['schooltool.group'].get(sy_id, None)
    if gc is None:
        gc = app['schooltool.group'][sy_id] = GroupContainer()
    return gc
Exemplo n.º 22
0
 def test_CategoriesUpToDateWithEvents(self):
     from quotationtool.categorization.category import Category
     cat1 = Category()
     cat1.__name__ = u"cat1"
     from zope.lifecycleevent import ObjectAddedEvent, ObjectRemovedEvent
     zope.event.notify(ObjectAddedEvent(cat1))
     self.assertTrue(self.categories.getCategory(u'cat1') is cat1)
     zope.event.notify(ObjectRemovedEvent(cat1))
     self.assertTrue(self.categories.getCategory(u'cat1') == None)
Exemplo n.º 23
0
    def test_integration_object_events(self):
        """ Trigger every event of a objec at least one times
        and check the journalentries.
        """

        dossier1 = create(Builder('dossier'))
        dossier2 = create(Builder('dossier'))

        document = create(
            Builder('document').within(dossier1).titled(u'Document'))
        document2 = create(
            Builder('document').within(dossier2).titled(u'Document'))

        notify(
            ObjectMovedEvent(
                document,
                dossier1,
                'oldName',
                dossier2,
                'newName',
            ))
        self.check_annotation(
            dossier1,
            action_type='Object moved',
            action_title='Object moved: %s' % document.title_or_id(),
        )

        # Test that a normal ObjectAddedEvent does not result in an object
        # moved journal entry.
        notify(ObjectAddedEvent(document2))
        entry1 = get_journal_entry(dossier2, entry=-1)
        entry2 = get_journal_entry(dossier2, entry=-2)
        self.assertTrue(entry1.get('action').get('type') != 'Object moved')
        self.assertTrue(entry2.get('action').get('type') != 'Object moved')

        notify(
            ObjectWillBeMovedEvent(
                document,
                dossier1,
                'oldName',
                dossier2,
                'newName',
            ))
        self.check_annotation(dossier1,
                              action_type='Object cut',
                              action_title='Object cut: %s' %
                              document.title_or_id())

        # Here we don't have a journal-entry
        length = get_journal_length(dossier1)
        notify(ObjectWillBeAddedEvent(
            document,
            dossier2,
            'newName',
        ))
        self.assertTrue(length == get_journal_length(dossier1))
Exemplo n.º 24
0
    def _createFolderStructure(self, folder, structure='ymd', date=None):
        """ Create a folder structure and then return our innermost folder
        """
        if not date:
            date = DateTime()

        dateFormat = structure

        if '%B' in dateFormat:
            translation = getToolByName(self.context, 'translation_service')
            PLMF = MessageFactory('plonelocales')
            dateFormat = dateFormat.replace('%B', '%m')
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]
            index = dateFormat.split('/').index('%m')
            month_msgid = PLMF(translation.month_msgid(folderStructure[index]))
            try:
                target_language = i18n.negotiate(self.context.REQUEST)
            except:
                target_language = None
            transale_month = translate(month_msgid,
                                       target_language=target_language)
            folderStructure[index] = transale_month
        else:
            date = date.strftime(dateFormat)
            folderStructure = [str(p) for p in date.split('/')]

        container = self.element.container
        language = folder.Language()
        normalizer = getUtility(IIDNormalizer)

        portal_workflow = getToolByName(self.context, 'portal_workflow')
        pw = portal_workflow.doActionFor

        # We run IRuleExecutor here to make sure other rules will be
        # executed for the newly created folders
        executor = IRuleExecutor(self.context, None)
        for fId in folderStructure:
            fTitle = fId
            fId = normalizer.normalize(fId)
            if not fId in folder.objectIds():
                _createObjectByType(container,
                                    folder,
                                    id=normalizer.normalize(fId),
                                    title=fTitle,
                                    description=fTitle)
                folder = folder[fId]
                pw(folder, 'publish')
                # this makes happy multilang sites
                folder.setLanguage(language)
                event = ObjectAddedEvent(folder, aq_parent(folder), fId)
                if executor is not None:
                    executor(event)
            else:
                folder = folder[fId]
        return folder
Exemplo n.º 25
0
    def add(self, link):
        if link.__parent__ == self:
            raise ValueError("You are adding same link twice.")

        i = 1
        while "%s" % i in self._links:
            i += 1
        link.__name__ = "%s" % i
        self._links[link.__name__] = link
        link.__parent__ = self
        notify(ObjectAddedEvent(link, self._links, link.__name__))
Exemplo n.º 26
0
    def bootstrapSchoolTool(self, db):
        """Bootstrap SchoolTool database."""
        connection = db.open()
        root = connection.root()
        app_obj = root.get(ZopePublication.root_name)
        if app_obj is None:
            app = SchoolToolApplication()

            # Run school specific initialization code
            initializationUtility = getUtility(
                ISchoolToolInitializationUtility)
            initializationUtility.initializeApplication(app)

            directlyProvides(app, directlyProvidedBy(app) + IContainmentRoot)
            root[ZopePublication.root_name] = app
            # savepoint to make sure that the app object has
            # a _p_jar. This is needed to make things like
            # KeyReference work, which in turn is needed to
            # make the catalog work. We make this savepoint
            # optimistic because it will then work with any registered
            # data managers that do not support this feature.
            transaction.savepoint(optimistic=True)

            # set up the site so that local utility setups and catalog
            # indexing would work properly
            if not ISite.providedBy(app):
                app.setSiteManager(LocalSiteManager(app))

            setSite(app)

            # We must set up the int ids utility before setting up any
            # of the plugin specific catalogs, as catalogs rely on
            # IntIds being present
            setUpUtilities(app, [UtilitySpecification(IntIds, IIntIds)])

            # tell plugins to initialize their catalogs, must be done
            # before initializing plugins themselves or else all the
            # initial groups, persons, resources will not get indexed
            notify(CatalogSetUpEvent(app))
            notify(CatalogStartUpEvent(app))

            # initialize plugins themselves
            notify(ApplicationInitializationEvent(app))

            notify(ObjectAddedEvent(app))

            # unset the site so we would not confuse other
            # bootstraping code
            setSite(None)

            self.restoreManagerUser(app, MANAGER_PASSWORD)
            self.initializePreferences(app)
        transaction.commit()
        connection.close()
Exemplo n.º 27
0
    def render(self):
        data = self.request.get('data', None)
        assert data is not None, 'Bad request: no delivery data found'
        data = json.loads(data)

        if self.is_already_delivered(data):
            # Set correct content type for text response
            self.request.response.setHeader("Content-type", "tex/plain")
            return 'OK'

        mtool = getToolByName(self.context, 'portal_membership')
        member = mtool.getAuthenticatedMember()

        if not member.checkPermission('Add portal content', self.context):
            raise Unauthorized()

        # Set the "X-CREATING-SUCCESSOR" flag for preventing the event
        # handler from creating additional responses per added document.
        self.request.set('X-CREATING-SUCCESSOR', True)

        # Create the delivered documents:
        transporter = getUtility(ITransporter)
        documents = []

        message = _(u'version_message_resolved_task',
                    default=u'Document copied from task (task resolved)')

        if data.get('transition'
                    ) == 'task-transition-in-progress-tested-and-closed':
            message = _(u'version_message_closed_task',
                        default=u'Document copied from task (task closed)')

        with CustomInitialVersionMessage(message, self.context.REQUEST):
            for item in encode_after_json(data['documents']):
                doc = transporter._create_object(self.context, item)

                # append `RE:` prefix to the document title
                doc.title = '%s: %s' % (translate(
                    _(u'answer_prefix', default=u'RE'),
                    context=self.context.REQUEST), doc.title)

                documents.append(doc)
                notify(ObjectAddedEvent(doc))

        # Change workflow state of predecessor task:
        util.change_task_workflow_state(self.context,
                                        data['transition'],
                                        text=data['text'],
                                        added_object=documents)

        # Set correct content type for text response
        self.request.response.setHeader("Content-type", "tex/plain")
        return 'OK'
Exemplo n.º 28
0
    def test(self):
        from schooltool.app.security import authSetUpSubscriber
        self.assertRaises(ComponentLookupError, self.app.getSiteManager)
        event = ObjectAddedEvent(self.app)
        authSetUpSubscriber(self.app, event)
        auth = traverse(self.app, '++etc++site/default/SchoolToolAuth')
        auth1 = getUtility(IAuthentication, context=self.app)
        self.assert_(auth is auth1)

        # If we fire the event again, it does not fail.  Such events
        # are fired when the object is copied and pasted.
        authSetUpSubscriber(self.app, event)
Exemplo n.º 29
0
    def __call__(self):
        data = self.request.get('data', None)
        assert data is not None, 'Bad request: no delivery data found'
        data = json.loads(data)

        if self.is_already_delivered(data):
            return ok_response()

        mtool = getToolByName(self.context, 'portal_membership')
        member = mtool.getAuthenticatedMember()

        if not member.checkPermission('Add portal content', self.context):
            raise Unauthorized()

        # Set the "X-CREATING-SUCCESSOR" flag for preventing the event
        # handler from creating additional responses per added document.
        self.request.set('X-CREATING-SUCCESSOR', True)

        # Create the delivered documents:
        transporter = Transporter()
        documents = []

        message = _(
            u'version_message_resolved_task',
            default=u'Document copied from task (task resolved)')

        if data.get(
            'transition') == 'task-transition-in-progress-tested-and-closed':
            message = _(
                u'version_message_closed_task',
                default=u'Document copied from task (task closed)')

        for item in data['documents']:
            doc = transporter.create(item, self.context)
            Versioner(doc).set_custom_initial_version_comment(message)

            # append `RE:` prefix to the document title
            doc.title = '%s: %s' % (
                translate(
                    _(u'answer_prefix', default=u'RE'),
                    context=self.context.REQUEST),
                doc.title)

            documents.append(doc)
            notify(ObjectAddedEvent(doc))

        # Change workflow state of predecessor task:
        util.change_task_workflow_state(
            self.context, data['transition'], text=data['text'],
            added_object=documents)

        return ok_response()
Exemplo n.º 30
0
def getBoundContact(context):
    person = IBasicPerson(removeSecurityProxy(context))
    annotations = IAnnotations(person)
    contact = annotations.get(PERSON_CONTACT_KEY, None)
    if contact is None:
        contact = BoundContact()
        annotations[PERSON_CONTACT_KEY] = contact
        contact.__name__ = 'contact'
        contact.__parent__ = person
        dependable = IDependable(contact)
        dependable.addDependent("")
        notify(ObjectAddedEvent(contact, contact.__parent__, contact.__name__))
    return contact