def file_handle(self): # Add done function to the BinaryFile file object def done(self): # BinaryFiles need to exist indefinitely. Nothing to do here pass # if we haven't written the file locally yet if not self.local_path: self.local_path = os.path.join(LOCAL_CACHE_DIR, self.hash) # if the file does not exist locally if not os.path.exists(self.local_path): logger.info("Writing %s %s " % (self.hash, self.local_path)) # write it out with open(self.local_path, 'wb') as f: self.the_file.open('rb') f.write(self.the_file.read()) self.the_file.close() # return a reference to the local copy f = File(open(self.local_path, 'rb')) f.done = types.MethodType(done, f) return f