Skip to content

Commit

Permalink
chore: Simplify views/base (apache#25948)
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianliebscher authored Nov 12, 2023
1 parent bae6636 commit f1896c2
Showing 1 changed file with 24 additions and 32 deletions.
56 changes: 24 additions & 32 deletions superset/views/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,16 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from __future__ import annotations

import dataclasses
import functools
import logging
import os
import traceback
from datetime import datetime
from importlib.resources import files
from typing import Any, Callable, cast, Optional, Union
from typing import Any, Callable, cast

import simplejson as json
import yaml
Expand Down Expand Up @@ -139,15 +141,11 @@ def get_error_msg() -> str:


def json_error_response(
msg: Optional[str] = None,
msg: str | None = None,
status: int = 500,
payload: Optional[dict[str, Any]] = None,
link: Optional[str] = None,
payload: dict[str, Any] | None = None,
) -> FlaskResponse:
if not payload:
payload = {"error": f"{msg}"}
if link:
payload["link"] = link
payload = payload or {"error": f"{msg}"}

return Response(
json.dumps(payload, default=utils.json_iso_dttm_ser, ignore_nan=True),
Expand All @@ -159,10 +157,9 @@ def json_error_response(
def json_errors_response(
errors: list[SupersetError],
status: int = 500,
payload: Optional[dict[str, Any]] = None,
payload: dict[str, Any] | None = None,
) -> FlaskResponse:
if not payload:
payload = {}
payload = payload or {}

payload["errors"] = [dataclasses.asdict(error) for error in errors]
return Response(
Expand All @@ -182,7 +179,7 @@ def data_payload_response(payload_json: str, has_error: bool = False) -> FlaskRe


def generate_download_headers(
extension: str, filename: Optional[str] = None
extension: str, filename: str | None = None
) -> dict[str, Any]:
filename = filename if filename else datetime.now().strftime("%Y%m%d_%H%M%S")
content_disp = f"attachment; filename={filename}.{extension}"
Expand All @@ -192,15 +189,15 @@ def generate_download_headers(

def deprecated(
eol_version: str = "4.0.0",
new_target: Optional[str] = None,
new_target: str | None = None,
) -> Callable[[Callable[..., FlaskResponse]], Callable[..., FlaskResponse]]:
"""
A decorator to set an API endpoint from SupersetView has deprecated.
Issues a log warning
"""

def _deprecated(f: Callable[..., FlaskResponse]) -> Callable[..., FlaskResponse]:
def wraps(self: "BaseSupersetView", *args: Any, **kwargs: Any) -> FlaskResponse:
def wraps(self: BaseSupersetView, *args: Any, **kwargs: Any) -> FlaskResponse:
message = (
"%s.%s "
"This API endpoint is deprecated and will be removed in version %s"
Expand All @@ -227,7 +224,7 @@ def api(f: Callable[..., FlaskResponse]) -> Callable[..., FlaskResponse]:
return the response in the JSON format
"""

def wraps(self: "BaseSupersetView", *args: Any, **kwargs: Any) -> FlaskResponse:
def wraps(self: BaseSupersetView, *args: Any, **kwargs: Any) -> FlaskResponse:
try:
return f(self, *args, **kwargs)
except NoAuthorizationError:
Expand All @@ -249,7 +246,7 @@ def handle_api_exception(
exceptions.
"""

def wraps(self: "BaseSupersetView", *args: Any, **kwargs: Any) -> FlaskResponse:
def wraps(self: BaseSupersetView, *args: Any, **kwargs: Any) -> FlaskResponse:
try:
return f(self, *args, **kwargs)
except SupersetSecurityException as ex:
Expand Down Expand Up @@ -294,7 +291,7 @@ def json_response(obj: Any, status: int = 200) -> FlaskResponse:
)

def render_app_template(
self, extra_bootstrap_data: Optional[dict[str, Any]] = None
self, extra_bootstrap_data: dict[str, Any] | None = None
) -> FlaskResponse:
payload = {
"user": bootstrap_user_data(g.user, include_perms=True),
Expand Down Expand Up @@ -335,21 +332,16 @@ def get_environment_tag() -> dict[str, Any]:


def menu_data(user: User) -> dict[str, Any]:
menu = appbuilder.menu.get_data()
languages = {
lang: {**appbuilder.languages[lang], "url": appbuilder.get_url_for_locale(lang)}
for lang in appbuilder.languages
}

languages = {}
for lang in appbuilder.languages:
languages[lang] = {
**appbuilder.languages[lang],
"url": appbuilder.get_url_for_locale(lang),
}
brand_text = appbuilder.app.config["LOGO_RIGHT_TEXT"]
if callable(brand_text):
if callable(brand_text := appbuilder.app.config["LOGO_RIGHT_TEXT"]):
brand_text = brand_text()
build_number = appbuilder.app.config["BUILD_NUMBER"]

return {
"menu": menu,
"menu": appbuilder.menu.get_data(),
"brand": {
"path": appbuilder.app.config["LOGO_TARGET_PATH"] or "/superset/welcome/",
"icon": appbuilder.app_icon,
Expand All @@ -369,9 +361,9 @@ def menu_data(user: User) -> dict[str, Any]:
"documentation_text": appbuilder.app.config["DOCUMENTATION_TEXT"],
"version_string": appbuilder.app.config["VERSION_STRING"],
"version_sha": appbuilder.app.config["VERSION_SHA"],
"build_number": build_number,
"build_number": appbuilder.app.config["BUILD_NUMBER"],
"languages": languages,
"show_language_picker": len(languages.keys()) > 1,
"show_language_picker": len(languages) > 1,
"user_is_anonymous": user.is_anonymous,
"user_info_url": None
if is_feature_enabled("MENU_HIDE_USER_INFO")
Expand Down Expand Up @@ -595,11 +587,11 @@ class YamlExportMixin: # pylint: disable=too-few-public-methods
Used on DatabaseView for cli compatibility
"""

yaml_dict_key: Optional[str] = None
yaml_dict_key: str | None = None

@action("yaml_export", __("Export to YAML"), __("Export to YAML?"), "fa-download")
def yaml_export(
self, items: Union[ImportExportMixin, list[ImportExportMixin]]
self, items: ImportExportMixin | list[ImportExportMixin]
) -> FlaskResponse:
if not isinstance(items, list):
items = [items]
Expand Down

0 comments on commit f1896c2

Please sign in to comment.