diff --git a/emmett/helpers.py b/emmett/helpers.py index 27d021ec..1603c8f5 100644 --- a/emmett/helpers.py +++ b/emmett/helpers.py @@ -9,50 +9,27 @@ :license: BSD-3-Clause """ -import os -import re from typing import Any, List, Optional, Tuple, Union +from emmett_core._internal import deprecated from emmett_core.http.helpers import abort as _abort -from emmett_core.http.response import HTTPFileResponse, HTTPIOResponse -from pydal.exceptions import NotAuthorizedException, NotFoundException from .ctx import current from .html import HtmlTag, tag -_re_dbstream = re.compile(r"(?P.*?)\.(?P.*?)\..*") - - def abort(code: int, body: str = ""): _abort(current, code, body) +@deprecated("stream_file", "Response.wrap_file") def stream_file(path: str): - full_path = os.path.join(current.app.root_path, path) - raise HTTPFileResponse(full_path, headers=current.response.headers, cookies=current.response.cookies) + raise current.response.wrap_file(path) +@deprecated("stream_dbfile", "Response.wrap_dbfile") def stream_dbfile(db: Any, name: str): - items = _re_dbstream.match(name) - if not items: - abort(404) - table_name, field_name = items.group("table"), items.group("field") - try: - field = db[table_name][field_name] - except AttributeError: - abort(404) - try: - filename, path_or_stream = field.retrieve(name, nameonly=True) - except NotAuthorizedException: - abort(403) - except NotFoundException: - abort(404) - except IOError: - abort(404) - if isinstance(path_or_stream, str): - raise HTTPFileResponse(path_or_stream, headers=current.response.headers, cookies=current.response.cookies) - raise HTTPIOResponse(path_or_stream, headers=current.response.headers, cookies=current.response.cookies) + raise current.response.wrap_dbfile(db, name) def flash(message: str, category: str = "message"): diff --git a/emmett/wrappers/response.py b/emmett/wrappers/response.py index 46fc1514..efc86cd4 100644 --- a/emmett/wrappers/response.py +++ b/emmett/wrappers/response.py @@ -9,16 +9,24 @@ :license: BSD-3-Clause """ +import os +import re from typing import Any +from emmett_core.http.response import HTTPFileResponse, HTTPResponse from emmett_core.http.wrappers.response import Response as _Response from emmett_core.utils import cachedprop +from pydal.exceptions import NotAuthorizedException, NotFoundException +from ..ctx import current from ..datastructures import sdict -from ..helpers import get_flashed_messages +from ..helpers import abort, get_flashed_messages from ..html import htmlescape +_re_dbstream = re.compile(r"(?P
.*?)\.(?P.*?)\..*") + + class Response(_Response): __slots__ = () @@ -38,3 +46,28 @@ def _meta_tmpl(self): def _meta_tmpl_prop(self): return [(key, htmlescape(val)) for key, val in self.meta_prop.items()] + + def wrap_file(self, path) -> HTTPFileResponse: + path = os.path.join(current.app.root_path, path) + return super().wrap_file(path) + + def wrap_dbfile(self, db, name: str) -> HTTPResponse: + items = _re_dbstream.match(name) + if not items: + abort(404) + table_name, field_name = items.group("table"), items.group("field") + try: + field = db[table_name][field_name] + except AttributeError: + abort(404) + try: + filename, path_or_stream = field.retrieve(name, nameonly=True) + except NotAuthorizedException: + abort(403) + except NotFoundException: + abort(404) + except IOError: + abort(404) + if isinstance(path_or_stream, str): + return self.wrap_file(path_or_stream) + return self.wrap_io(path_or_stream) diff --git a/pyproject.toml b/pyproject.toml index c5053a58..504776e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -149,4 +149,4 @@ dev-dependencies = [ ] [tool.uv.sources] -emmett-core = { git = "https://github.com/emmett-framework/core", rev = "ab79ed4" } +emmett-core = { git = "https://github.com/emmett-framework/core", rev = "a0f8ec8" }