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)
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 ''
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))
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))