def PUT_factory(self, name, contentType, body):
     """Handle constructing a new object upon a PUT request by delegating
     to an IFileFactory adapter
     """
     factory = IFileFactory(self, None)
     if factory is None:
         return None
     return factory(name, contentType, body)
示例#2
0
文件: put.py 项目: bendavis78/zope
    def PUT(self):
        request = self.request

        body = request.bodyStream
        name = self.context.name
        container = self.context.container

        # Find the extension
        ext_start = name.rfind('.')
        if ext_start > 0:
            ext = name[ext_start:]
        else:
            ext = "."

        # Get a "directory" surrogate for the container
        # TODO: Argh. Why don't we have a unioned Interface for that?!?
        dir_write = IWriteDirectory(container)
        dir_read = IReadDirectory(container)

        # Now try to get a custom factory for he container
        factory = queryAdapter(container, IFileFactory, ext)

        # Fall back to a non-custom one
        if factory is None:
            factory = IFileFactory(container)

        # TODO: Need to add support for large files
        data = body.read()

        newfile = factory(name, request.getHeader('content-type', ''), data)
        notify(ObjectCreatedEvent(newfile))

        dir_write[name] = newfile
        # Ickyness with non-predictable support for containment:
        #   make sure we get a containment proxy
        newfile = dir_read[name]

        request.response.setStatus(201)
        request.response.setHeader(
            'Location', zope.traversing.browser.absoluteURL(newfile, request))
        return ''
示例#3
0
    def __call__(self):
        file_name = self.request.form.get("Filename", "")

        normalizer = IUserPreferredURLNormalizer(self.request)
        obj_id = normalizer.normalize(ploneutils.safe_unicode(file_name))
        if hasattr(self.context, obj_id):
            obj_id = self.context.generateUniqueId(obj_id)

        # ZPublisher.HTTPRequest.FileUpload instance
        file_data = self.request.form.get("Filedata", None)
        content_type = mimetypes.guess_type(file_name)[0] or ""

        # call all file mutator utilities
        for mutator in component.getAllUtilitiesRegisteredFor(IFileMutator):
            file_name, file_data, content_type = mutator(
                file_name, file_data, content_type)

        if not file_data:
            return

        logger.info("uploading file: filename=%s, content_type=%s" % \
                (obj_id, content_type))

        sp = getToolByName(self.context, "portal_properties").site_properties
        ul_content_field = sp.getProperty('ul_content_field', '')
        if not ul_content_field:
            factory = IFileFactory(self.context)
            f = factory(file_name, content_type, file_data, obj_id)
        else:
            fields = ul_content_field.split('.')
            param = {
                'type_name': fields[0],
                'id': obj_id,
                fields[1]: file_data,
            }
            self.context.invokeFactory(**param)
            f = self.context[obj_id]

        logger.info("file url: %s" % f.absolute_url())
        return f.absolute_url()
 def test_file_factory(self):
     self.folder.invokeFactory('collective.conferences.program', 'p1')
     p1 = self.folder['p1']
     fileFactory = IFileFactory(p1)
     newObject = fileFactory('new-track', 'text/plain', 'dummy')
     self.failUnless(ITrack.providedBy(newObject))
示例#5
0
 def test_file_factory(self):
     self.folder.invokeFactory('example.conference.program', 'p1')
     p1 = self.folder['p1']
     fileFactory = IFileFactory(p1)
     newObject = fileFactory('new-session', 'text/plain', 'dummy')
     self.failUnless(ISession.providedBy(newObject))