# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. from abc import ABC, abstractmethod from typing import Any, List, Optional from flask_appbuilder.security.sqla.models import User from superset.commands.utils import populate_owners class BaseCommand(ABC): """ Base class for all Command like Superset Logic objects """ @abstractmethod def run(self) -> Any: """ Run executes the command. Can raise command exceptions :raises: CommandException """ @abstractmethod def validate(self) -> None: """ Validate is normally called by run to validate data. Will raise exception if validation fails :raises: CommandException """ class CreateMixin: # pylint: disable=too-few-public-methods @staticmethod def populate_owners( user: User, owner_ids: Optional[List[int]] = None ) -> List[User]: """ Populate list of owners, defaulting to the current user if `owner_ids` is undefined or empty. If current user is missing in `owner_ids`, current user is added unless belonging to the Admin role. :param user: current user :param owner_ids: list of owners by id's :raises OwnersNotFoundValidationError: if at least one owner can't be resolved :returns: Final list of owners """ return populate_owners(user, owner_ids, default_to_user=True) class UpdateMixin: # pylint: disable=too-few-public-methods @staticmethod def populate_owners( user: User, owner_ids: Optional[List[int]] = None ) -> List[User]: """ Populate list of owners. If current user is missing in `owner_ids`, current user is added unless belonging to the Admin role. :param user: current user :param owner_ids: list of owners by id's :raises OwnersNotFoundValidationError: if at least one owner can't be resolved :returns: Final list of owners """ return populate_owners(user, owner_ids, default_to_user=False)