Skip to content

Commit

Permalink
Changes the parameters to use dataclass
Browse files Browse the repository at this point in the history
  • Loading branch information
michael-s-molina committed Jan 10, 2022
1 parent 203fb6d commit 07e06e5
Show file tree
Hide file tree
Showing 16 changed files with 92 additions and 93 deletions.
6 changes: 2 additions & 4 deletions superset/charts/form_data/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,7 @@ def post(self, pk: int) -> Response:
content:
application/json:
schema:
type: object
$ref: '#/components/schemas/KeyValuePostSchema'
$ref: '#/components/schemas/KeyValuePostSchema'
responses:
201:
description: The value was stored successfully.
Expand Down Expand Up @@ -126,8 +125,7 @@ def put(self, pk: int, key: str) -> Response:
content:
application/json:
schema:
type: object
$ref: '#/components/schemas/KeyValuePutSchema'
$ref: '#/components/schemas/KeyValuePutSchema'
responses:
200:
description: The value was stored successfully.
Expand Down
18 changes: 10 additions & 8 deletions superset/charts/form_data/commands/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@

class CreateFormDataCommand(CreateKeyValueCommand):
def create(self, cmd_params: CommandParameters) -> bool:
resource_id = cmd_params["resource_id"]
actor = cmd_params["actor"]
key = cmd_params["key"]
value = cmd_params["value"]
entry: Entry = {"owner": actor.get_user_id(), "value": value}
resource_id = cmd_params.resource_id
actor = cmd_params.actor
key = cmd_params.key
value = cmd_params.value
check_access(cmd_params)
return cache_manager.chart_form_data_cache.set(
cache_key(resource_id, key), entry
)
if value:
entry: Entry = {"owner": actor.get_user_id(), "value": value}
return cache_manager.chart_form_data_cache.set(
cache_key(resource_id, key), entry
)
return False
6 changes: 3 additions & 3 deletions superset/charts/form_data/commands/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@

class DeleteFormDataCommand(DeleteKeyValueCommand):
def delete(self, cmd_params: CommandParameters) -> bool:
resource_id = cmd_params["resource_id"]
actor = cmd_params["actor"]
key = cmd_params["key"]
resource_id = cmd_params.resource_id
actor = cmd_params.actor
key = cmd_params.key
check_access(cmd_params)
entry: Entry = cache_manager.chart_form_data_cache.get(
cache_key(resource_id, key)
Expand Down
13 changes: 8 additions & 5 deletions superset/charts/form_data/commands/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,20 @@


class GetFormDataCommand(GetKeyValueCommand):
def get(self, cmd_params: CommandParameters) -> Optional[str]:
resource_id = cmd_params["resource_id"]
key = cmd_params["key"]
def __init__(self, cmd_params: CommandParameters) -> None:
super().__init__(cmd_params)
config = app.config["CHART_FORM_DATA_CACHE_CONFIG"]
refresh_timeout = config.get("REFRESH_TIMEOUT_ON_RETRIEVAL")
self._refresh_timeout = config.get("REFRESH_TIMEOUT_ON_RETRIEVAL")

def get(self, cmd_params: CommandParameters) -> Optional[str]:
resource_id = cmd_params.resource_id
key = cmd_params.key
check_access(cmd_params)
entry: Entry = cache_manager.chart_form_data_cache.get(
cache_key(resource_id, key)
)
if entry:
if refresh_timeout:
if self._refresh_timeout:
cache_manager.chart_form_data_cache.set(key, entry)
return entry["value"]
return None
10 changes: 5 additions & 5 deletions superset/charts/form_data/commands/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@

class UpdateFormDataCommand(UpdateKeyValueCommand):
def update(self, cmd_params: CommandParameters) -> bool:
resource_id = cmd_params["resource_id"]
actor = cmd_params["actor"]
key = cmd_params["key"]
value = cmd_params["value"]
resource_id = cmd_params.resource_id
actor = cmd_params.actor
key = cmd_params.key
value = cmd_params.value
check_access(cmd_params)
entry: Entry = cache_manager.chart_form_data_cache.get(
cache_key(resource_id, key)
)
if entry:
if entry and value:
user_id = actor.get_user_id()
if entry["owner"] != user_id:
raise KeyValueAccessDeniedError()
Expand Down
6 changes: 3 additions & 3 deletions superset/charts/form_data/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@


def check_access(parameters: CommandParameters) -> Optional[bool]:
resource_id = parameters["resource_id"]
actor = parameters["actor"]
query_params = parameters["query_params"]
resource_id = parameters.resource_id
actor = parameters.actor
query_params = parameters.query_params
if resource_id == 0:
if parameters:
dataset_id = query_params.get("dataset_id")
Expand Down
10 changes: 5 additions & 5 deletions superset/dashboards/filter_state/commands/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@

class CreateFilterStateCommand(CreateKeyValueCommand):
def create(self, cmd_params: CommandParameters) -> bool:
resource_id = cmd_params["resource_id"]
actor = cmd_params["actor"]
key = cmd_params["key"]
value = cmd_params["value"]
resource_id = cmd_params.resource_id
actor = cmd_params.actor
key = cmd_params.key
value = cmd_params.value
dashboard = DashboardDAO.get_by_id_or_slug(str(resource_id))
if dashboard:
if dashboard and value:
entry: Entry = {"owner": actor.get_user_id(), "value": value}
return cache_manager.filter_state_cache.set(
cache_key(resource_id, key), entry
Expand Down
6 changes: 3 additions & 3 deletions superset/dashboards/filter_state/commands/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@

class DeleteFilterStateCommand(DeleteKeyValueCommand):
def delete(self, cmd_params: CommandParameters) -> bool:
resource_id = cmd_params["resource_id"]
actor = cmd_params["actor"]
key = cmd_params["key"]
resource_id = cmd_params.resource_id
actor = cmd_params.actor
key = cmd_params.key
dashboard = DashboardDAO.get_by_id_or_slug(str(resource_id))
if dashboard:
entry: Entry = cache_manager.filter_state_cache.get(
Expand Down
19 changes: 8 additions & 11 deletions superset/dashboards/filter_state/commands/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,6 @@
# under the License.
from typing import Optional


from superset.dashboards.dao import DashboardDAO
from superset.extensions import cache_manager

from superset.dashboards.dao import DashboardDAO
from superset.extensions import cache_manager
from flask import current_app as app

from superset.dashboards.dao import DashboardDAO
Expand All @@ -32,13 +26,16 @@


class GetFilterStateCommand(GetKeyValueCommand):
def get(self, cmd_params: CommandParameters) -> Optional[str]:
resource_id = cmd_params["resource_id"]
key = cmd_params["key"]
def __init__(self, cmd_params: CommandParameters) -> None:
super().__init__(cmd_params)
config = app.config["FILTER_STATE_CACHE_CONFIG"]
refresh_timeout = config.get("REFRESH_TIMEOUT_ON_RETRIEVAL")
self._refresh_timeout = config.get("REFRESH_TIMEOUT_ON_RETRIEVAL")

def get(self, cmd_params: CommandParameters) -> Optional[str]:
resource_id = cmd_params.resource_id
key = cmd_params.key
DashboardDAO.get_by_id_or_slug(str(resource_id))
entry = cache_manager.filter_state_cache.get(cache_key(resource_id, key)) or {}
if entry and refresh_timeout:
if entry and self._refresh_timeout:
cache_manager.filter_state_cache.set(key, entry)
return entry.get("value")
10 changes: 5 additions & 5 deletions superset/dashboards/filter_state/commands/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@

class UpdateFilterStateCommand(UpdateKeyValueCommand):
def update(self, cmd_params: CommandParameters) -> bool:
resource_id = cmd_params["resource_id"]
actor = cmd_params["actor"]
key = cmd_params["key"]
value = cmd_params["value"]
resource_id = cmd_params.resource_id
actor = cmd_params.actor
key = cmd_params.key
value = cmd_params.value
dashboard = DashboardDAO.get_by_id_or_slug(str(resource_id))
if dashboard:
if dashboard and value:
entry: Entry = cache_manager.filter_state_cache.get(
cache_key(resource_id, key)
)
Expand Down
44 changes: 19 additions & 25 deletions superset/key_value/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,12 @@ def post(self, pk: int) -> Response:
raise InvalidPayloadFormatError("Request is not JSON")
try:
item = self.add_model_schema.load(request.json)
args: CommandParameters = {
"actor": g.user,
"resource_id": pk,
"value": item["value"],
"query_params": request.args,
}
args = CommandParameters(
actor=g.user,
resource_id=pk,
value=item["value"],
query_params=request.args,
)
key = self.get_create_command()(args).run()
return self.response(201, key=key)
except ValidationError as ex:
Expand All @@ -99,13 +99,13 @@ def put(self, pk: int, key: str) -> Response:
raise InvalidPayloadFormatError("Request is not JSON")
try:
item = self.edit_model_schema.load(request.json)
args: CommandParameters = {
"actor": g.user,
"resource_id": pk,
"key": key,
"value": item["value"],
"query_params": request.args,
}
args = CommandParameters(
actor=g.user,
resource_id=pk,
key=key,
value=item["value"],
query_params=request.args,
)
result = self.get_update_command()(args).run()
if not result:
return self.response_404()
Expand All @@ -124,12 +124,9 @@ def put(self, pk: int, key: str) -> Response:

def get(self, pk: int, key: str) -> Response:
try:
args: CommandParameters = {
"actor": g.user,
"resource_id": pk,
"key": key,
"query_params": request.args,
}
args = CommandParameters(
actor=g.user, resource_id=pk, key=key, query_params=request.args
)
value = self.get_get_command()(args).run()
if not value:
return self.response_404()
Expand All @@ -146,12 +143,9 @@ def get(self, pk: int, key: str) -> Response:

def delete(self, pk: int, key: str) -> Response:
try:
args: CommandParameters = {
"actor": g.user,
"resource_id": pk,
"key": key,
"query_params": request.args,
}
args = CommandParameters(
actor=g.user, resource_id=pk, key=key, query_params=request.args
)
result = self.get_delete_command()(args).run()
if not result:
return self.response_404()
Expand Down
6 changes: 3 additions & 3 deletions superset/key_value/commands/create.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@

class CreateKeyValueCommand(BaseCommand, ABC):
def __init__(self, cmd_params: CommandParameters):
self._parameters = cmd_params
self._cmd_params = cmd_params

def run(self) -> str:
try:
key = token_urlsafe(48)
self._parameters["key"] = key
self.create(self._parameters)
self._cmd_params.key = key
self.create(self._cmd_params)
return key
except SQLAlchemyError as ex:
logger.exception("Error running create command")
Expand Down
4 changes: 2 additions & 2 deletions superset/key_value/commands/delete.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@

class DeleteKeyValueCommand(BaseCommand, ABC):
def __init__(self, cmd_params: CommandParameters):
self._parameters = cmd_params
self._cmd_params = cmd_params

def run(self) -> bool:
try:
return self.delete(self._parameters)
return self.delete(self._cmd_params)
except SQLAlchemyError as ex:
logger.exception("Error running delete command")
raise KeyValueDeleteFailedError() from ex
Expand Down
4 changes: 2 additions & 2 deletions superset/key_value/commands/get.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@

class GetKeyValueCommand(BaseCommand, ABC):
def __init__(self, cmd_params: CommandParameters):
self._parameters = cmd_params
self._cmd_params = cmd_params

def run(self) -> Optional[str]:
try:
return self.get(self._parameters)
return self.get(self._cmd_params)
except SQLAlchemyError as ex:
logger.exception("Error running get command")
raise KeyValueGetFailedError() from ex
Expand Down
11 changes: 6 additions & 5 deletions superset/key_value/commands/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,16 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from typing import Dict
from dataclasses import dataclass
from typing import Dict, Optional

from flask_appbuilder.security.sqla.models import User
from typing_extensions import TypedDict


class CommandParameters(TypedDict, total=False):
@dataclass
class CommandParameters:
actor: User
resource_id: int
key: str
value: str
query_params: Dict[str, str]
key: Optional[str] = None
value: Optional[str] = None
12 changes: 8 additions & 4 deletions tests/integration_tests/charts/form_data/api_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,11 @@ def test_delete_access_denied(client, chart_id: int):
assert resp.status_code == 404


def test_delete_not_owner(client, chart_id: int):
login(client, "gamma")
resp = client.delete(f"api/v1/chart/{chart_id}/form_data/{key}/")
assert resp.status_code == 404
def test_delete_not_owner(client, chart_id: int, admin_id: int):
another_key = "another_key"
another_owner = admin_id + 1
entry: Entry = {"owner": another_owner, "value": value}
cache_manager.chart_form_data_cache.set(cache_key(chart_id, another_key), entry)
login(client, "admin")
resp = client.delete(f"api/v1/chart/{chart_id}/form_data/{another_key}/")
assert resp.status_code == 403

0 comments on commit 07e06e5

Please sign in to comment.