fix: change the validation logic for python_date_format (#25510)

Co-authored-by: John Bodley <john.bodley@gmail.com>
This commit is contained in:
mapledan
2024-01-24 05:44:36 +08:00
committed by GitHub
parent 363a8e6b07
commit c2ab9bba29
7 changed files with 92 additions and 25 deletions

View File

@@ -17,12 +17,15 @@
from __future__ import annotations
import logging
from datetime import datetime
from typing import Any
import dateutil.parser
from sqlalchemy.exc import SQLAlchemyError
from superset.connectors.sqla.models import SqlaTable, SqlMetric, TableColumn
from superset.daos.base import BaseDAO
from superset.daos.exceptions import DAOUpdateFailedError
from superset.extensions import db
from superset.models.core import Database
from superset.models.dashboard import Dashboard
@@ -150,6 +153,17 @@ class DatasetDAO(BaseDAO[SqlaTable]):
).all()
return len(dataset_query) == 0
@staticmethod
def validate_python_date_format(dt_format: str) -> bool:
if dt_format in ("epoch_s", "epoch_ms"):
return True
try:
dt_str = datetime.now().strftime(dt_format)
dateutil.parser.isoparse(dt_str)
return True
except ValueError:
return False
@classmethod
def update(
cls,
@@ -193,6 +207,18 @@ class DatasetDAO(BaseDAO[SqlaTable]):
then we delete.
"""
for column in property_columns:
if (
"python_date_format" in column
and column["python_date_format"] is not None
):
if not DatasetDAO.validate_python_date_format(
column["python_date_format"]
):
raise DAOUpdateFailedError(
"python_date_format is an invalid date/timestamp format."
)
if override_columns:
db.session.query(TableColumn).filter(
TableColumn.table_id == model.id