def send_file(self, path, mimetype=None): """Send a local file to the browser. This method includes the "Last-Modified", "Content-Type" and "Content-Length" headers in the response, corresponding to the file attributes. It also checks the last modification time of the local file against the "If-Modified-Since" provided by the user agent, and sends a "304 Not Modified" response if it matches. """ if not os.path.isfile(path): raise HTTPNotFound(_("File %(path)s not found", path=path)) stat = os.stat(path) mtime = datetime.fromtimestamp(stat.st_mtime, localtz) last_modified = http_date(mtime) if last_modified == self.get_header("If-Modified-Since"): self.send_response(304) self.send_header("Content-Length", 0) self.end_headers() raise RequestDone if not mimetype: mimetype = mimetypes.guess_type(path)[0] or "application/octet-stream" self.send_response(200) self.send_header("Content-Type", mimetype) self.send_header("Content-Length", stat.st_size) self.send_header("Last-Modified", last_modified) self.end_headers() if self.method != "HEAD": fileobj = file(path, "rb") file_wrapper = self.environ.get("wsgi.file_wrapper", _FileWrapper) self._response = file_wrapper(fileobj, 4096) raise RequestDone
def path_info(self): """Path inside the application""" path_info = self.environ.get("PATH_INFO", "") try: return unicode(path_info, "utf-8") except UnicodeDecodeError: raise HTTPNotFound(_("Invalid URL encoding (was %(path_info)r)", path_info=path_info))
def pretty_size(size, format='%.1f'): if size is None: return '' jump = 1024 if size < jump: return _('%(size)s bytes', size=size) units = ['KB', 'MB', 'GB', 'TB'] i = 0 while size >= jump and i < len(units): i += 1 size /= 1024. return (format + ' %s') % (size, units[i - 1])
def get_resource_description(env, resource, format='default', **kwargs): """Retrieve a standardized description for the given resource. This function delegates the work to the resource manager for that resource if it implements a `get_resource_description` method, otherwise reverts to simple presentation of the realm and identifier information. :param env: the `Environment` where `IResourceManager` components live :param resource: the `Resource` object specifying the Trac resource :param format: which formats to use for the description Additional keyword arguments can be provided and will be propagated to resource manager that might make use of them (typically, a `context` parameter for creating context dependent output). >>> from trac.test import EnvironmentStub >>> env = EnvironmentStub() >>> main = Resource('generic', 'Main') >>> get_resource_description(env, main) u'generic:Main' >>> get_resource_description(env, main(version=3)) u'generic:Main' >>> get_resource_description(env, main(version=3), format='summary') u'generic:Main at version 3' """ manager = ResourceSystem(env).get_resource_manager(resource.realm) if manager and hasattr(manager, 'get_resource_description'): return manager.get_resource_description(resource, format, **kwargs) name = u'%s:%s' % (resource.realm, resource.id) if format == 'summary': name = _('%(name)s at version %(version)s', name=name, version=resource.version) return name