<p dir="auto">Make sure these boxes are checked before submitting your issue - thank you!</p>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have checked the superset logs for python stacktraces and included it here as text if any</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have reproduced the issue with at least the latest released version of superset</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have checked the issue tracker for the same issue and I haven't found one similar</li>
</ul>
<h3 dir="auto">Superset version</h3>
<h3 dir="auto">Expected results</h3>
<p dir="auto">New tab should create a blank tab</p>
<h3 dir="auto">Actual results</h3>
<p dir="auto">New tab creates a duplicate of the original tab. (ok, can live with this) But then once you start editing the new tab (ie. removing a chart), it makes the same edit to the original tab.</p>
<h3 dir="auto">Steps to reproduce</h3>
<p dir="auto">(1) Convert existing dashboard to V2 dash<br>
(2) Edit dashboard<br>
(3) Click on + for new tab<br>
(4) Remove a chart from new tab</p>
<p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/19161243/106393809-0b901100-6434-11eb-91ed-d954de344355.png"><img src="https://user-images.githubusercontent.com/19161243/106393809-0b901100-6434-11eb-91ed-d954de344355.png" alt="123456" style="max-width: 100%;"></a></p>
<p dir="auto">how should i configue it</p>
<p dir="auto">###############</p>
<p dir="auto">"""The main config file for Superset<br>
All configuration in this file can be overridden by providing a superset_config<br>
in your PYTHONPATH as there is a <code class="notranslate">from superset_config import *</code><br>
at the end of this file.<br>
"""<br>
import imp<br>
import importlib.util<br>
import json<br>
import logging<br>
import os<br>
import sys<br>
from collections import OrderedDict<br>
from datetime import date<br>
from typing import Any, Callable, Dict, List, Optional, Type, TYPE_CHECKING<br>
from cachelib.base import BaseCache<br>
from celery.schedules import crontab<br>
from dateutil import tz<br>
from flask import Blueprint<br>
from flask_appbuilder.security.manager import AUTH_DB<br>
from pandas.io.parsers import STR_NA_VALUES<br>
BaseTemplateProcessor,<br>
)<br>
from superset.stats_logger import DummyStatsLogger<br>
from superset.typing import CacheConfig<br>
from superset.utils.core import is_test<br>
from superset.utils.log import DBEventLogger<br>
from superset.utils.logging_configurator import DefaultLoggingConfigurator<br>
logger = logging.getLogger(<strong>name</strong>)<br>
if TYPE_CHECKING:<br>
STATS_LOGGER = DummyStatsLogger()<br>
EVENT_LOGGER = DBEventLogger()<br>
SUPERSET_LOG_VIEW = True<br>
BASE_DIR = os.path.abspath(os.path.dirname(<strong>file</strong>))<br>
if "SUPERSET_HOME" in os.environ:<br>
DATA_DIR = os.environ["SUPERSET_HOME"]<br>
else:<br>
DATA_DIR = os.path.join(os.path.expanduser("~"), ".superset")<br>
VERSION_INFO_FILE = os.path.join(BASE_DIR, "static", "version_info.json")<br>
PACKAGE_JSON_FILE = os.path.join(BASE_DIR, "static", "assets", "package.json")<br>
FAVICONS = [{"href": "/static/assets/images/favicon.png"}]<br>
def _try_json_readversion(filepath: str) -&gt; Optional[str]:<br>
try:<br>
with open(filepath, "r") as f:<br>
return json.load(f).get("version")<br>
return None<br>
filepath: str, length: int<br>
) -&gt; Optional[str]:<br>
try:<br>
with open(filepath, "r") as f:<br>
return json.load(f).get("GIT_SHA")[:length]<br>
return None<br>
VERSION_STRING = _try_json_readversion(VERSION_INFO_FILE) or _try_json_readversion(<br>
PACKAGE_JSON_FILE<br>
)<br>
VERSION_SHA_LENGTH = 8<br>
VERSION_SHA = _try_json_readsha(VERSION_INFO_FILE, VERSION_SHA_LENGTH)<br>
ROW_LIMIT = 50000<br>
VIZ_ROW_LIMIT = 10000<br>
SAMPLES_ROW_LIMIT = 1000<br>
FILTER_SELECT_ROW_LIMIT = 10000<br>
SUPERSET_WEBSERVER_PROTOCOL = "http"<br>
SUPERSET_WEBSERVER_ADDRESS = "0.0.0.0"<br>
SUPERSET_WEBSERVER_PORT = 8088<br>
SUPERSET_WEBSERVER_TIMEOUT = 60<br>
SUPERSET_DASHBOARD_PERIODICAL_REFRESH_LIMIT = 0<br>
SUPERSET_DASHBOARD_PERIODICAL_REFRESH_WARNING_MESSAGE = None<br>
SUPERSET_DASHBOARD_POSITION_DATA_LIMIT = 65535<br>
CUSTOM_SECURITY_MANAGER = None<br>
SQLALCHEMY_TRACK_MODIFICATIONS = False<br>
SECRET_KEY = "\2\1thisismyscretkey\1\2\e\y\y\h"<br>
SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(DATA_DIR, "superset.db")<br>
SQLALCHEMY_CUSTOM_PASSWORD_STORE = None<br>
QUERY_SEARCH_LIMIT = 1000<br>
WTF_CSRF_ENABLED = True<br>
WTF_CSRF_EXEMPT_LIST = ["superset.views.core.log", "superset.charts.api.data"]<br>
DEBUG = os.environ.get("FLASK_ENV") == "development"<br>
FLASK_USE_RELOAD = True<br>
SHOW_STACKTRACE = True<br>
ENABLE_PROXY_FIX = False<br>
PROXY_FIX_CONFIG = {"x_for": 1, "x_proto": 1, "x_host": 1, "x_port": 1, "x_prefix": 1}<br>
APP_NAME = "Superset"<br>
APP_ICON = "/static/assets/images/superset-logo-horiz.png"<br>
APP_ICON_WIDTH = 126<br>
LOGO_TARGET_PATH = None<br>
FAB_API_SWAGGER_UI = True<br>
DRUID_TZ = tz.tzutc()<br>
DRUID_ANALYSIS_TYPES = ["cardinality"]<br>
DRUID_IS_ACTIVE = False<br>
DRUID_METADATA_LINKS_ENABLED = True<br>
AUTH_TYPE = AUTH_DB<br>
PUBLIC_ROLE_LIKE: Optional[str] = None<br>
BABEL_DEFAULT_LOCALE = "en"<br>
BABEL_DEFAULT_FOLDER = "superset/translations"<br>
LANGUAGES = {<br>
"en": {"flag": "us", "name": "English"},<br>
"es": {"flag": "es", "name": "Spanish"},<br>
"it": {"flag": "it", "name": "Italian"},<br>
"fr": {"flag": "fr", "name": "French"},<br>
"zh": {"flag": "cn", "name": "Chinese"},<br>
"ja": {"flag": "jp", "name": "Japanese"},<br>
"de": {"flag": "de", "name": "German"},<br>
"pt": {"flag": "pt", "name": "Portuguese"},<br>
"pt_BR": {"flag": "br", "name": "Brazilian Portuguese"},<br>
"ru": {"flag": "ru", "name": "Russian"},<br>
"ko": {"flag": "kr", "name": "Korean"},<br>
}<br>
LANGUAGES = {}<br>
DEFAULT_FEATURE_FLAGS: Dict[str, bool] = {<br>
"ALLOW_DASHBOARD_DOMAIN_SHARDING": True,<br>
"CLIENT_CACHE": False,<br>
"DISABLE_DATASET_SOURCE_EDIT": False,<br>
"DYNAMIC_PLUGINS": False,<br>
"ENABLE_EXPLORE_JSON_CSRF_PROTECTION": False,<br>
"ENABLE_TEMPLATE_PROCESSING": False,<br>
"KV_STORE": False,<br>
"PRESTO_EXPAND_DATA": False,<br>
"THUMBNAILS": False,<br>
"DASHBOARD_CACHE": False,<br>
"REMOVE_SLICE_LEVEL_LABEL_COLORS": False,<br>
"SHARE_QUERIES_VIA_KV_STORE": False,<br>
"SIP_38_VIZ_REARCHITECTURE": False,<br>
"TAGGING_SYSTEM": False,<br>
"SQLLAB_BACKEND_PERSISTENCE": False,<br>
"LISTVIEWS_DEFAULT_CARD_VIEW": False,<br>
"ENABLE_REACT_CRUD_VIEWS": True,<br>
"DISPLAY_MARKDOWN_HTML": True,<br>
"ESCAPE_MARKDOWN_HTML": False,<br>
"DASHBOARD_NATIVE_FILTERS": False,<br>
"GLOBAL_ASYNC_QUERIES": False,<br>
"VERSIONED_EXPORT": False,<br>
"ROW_LEVEL_SECURITY": False,<br>
"ALERT_REPORTS": False,<br>
"OMNIBAR": False,<br>
}<br>
if DEFAULT_FEATURE_FLAGS["THUMBNAILS"]:<br>
DEFAULT_FEATURE_FLAGS["LISTVIEWS_DEFAULT_CARD_VIEW"] = True<br>
FEATURE_FLAGS: Dict[str, bool] = {}<br>
GET_FEATURE_FLAGS_FUNC: Optional[Callable[[Dict[str, bool]], Dict[str, bool]]] = None<br>
EXTRA_CATEGORICAL_COLOR_SCHEMES: List[Dict[str, Any]] = []<br>
EXTRA_SEQUENTIAL_COLOR_SCHEMES: List[Dict[str, Any]] = []<br>
THUMBNAIL_SELENIUM_USER = "admin"<br>
THUMBNAIL_CACHE_CONFIG: CacheConfig = {<br>
"CACHE_TYPE": "null",<br>
"CACHE_NO_NULL_WARNING": True,<br>
}<br>
SCREENSHOT_LOCATE_WAIT = 10<br>
SCREENSHOT_LOAD_WAIT = 60<br>
UPLOAD_FOLDER = BASE_DIR + "/app/static/uploads/"<br>
UPLOAD_CHUNK_SIZE = 4096<br>
IMG_UPLOAD_FOLDER = BASE_DIR + "/app/static/uploads/"<br>
IMG_UPLOAD_URL = "/static/uploads/"<br>
CACHE_CONFIG: CacheConfig = {"CACHE_TYPE": "null"}<br>
DATA_CACHE_CONFIG: CacheConfig = {"CACHE_TYPE": "null"}<br>
STORE_CACHE_KEYS_IN_METADATA_DB = False<br>
ENABLE_CORS = False<br>
CORS_OPTIONS: Dict[Any, Any] = {}<br>
SUPERSET_WEBSERVER_DOMAINS = None<br>
EXCEL_EXTENSIONS = {"xlsx", "xls"}<br>
CSV_EXTENSIONS = {"csv", "tsv", "txt"}<br>
ALLOWED_EXTENSIONS = {*EXCEL_EXTENSIONS, <em>CSV_EXTENSIONS}<br>
CSV_EXPORT = {"encoding": "utf-8"}<br>
TIME_GRAIN_DENYLIST: List[str] = []<br>
TIME_GRAIN_ADDONS: Dict[str, str] = {}<br>
TIME_GRAIN_ADDON_EXPRESSIONS: Dict[str, Dict[str, str]] = {}<br>
VIZ_TYPE_DENYLIST: List[str] = []<br>
DRUID_DATA_SOURCE_DENYLIST: List[str] = []<br>
DEFAULT_MODULE_DS_MAP = OrderedDict(<br>
[<br>
("superset.connectors.sqla.models", ["SqlaTable"]),<br>
("superset.connectors.druid.models", ["DruidDatasource"]),<br>
]<br>
)<br>
ADDITIONAL_MODULE_DS_MAP: Dict[str, List[str]] = {}<br>
ADDITIONAL_MIDDLEWARE: List[Callable[..., Any]] = []<br>
LOGGING_CONFIGURATOR = DefaultLoggingConfigurator()<br>
LOG_FORMAT = "%(asctime)s:%(levelname)s:%(name)s:%(message)s"<br>
LOG_LEVEL = "DEBUG"<br>
ENABLE_TIME_ROTATE = False<br>
TIME_ROTATE_LOG_LEVEL = "DEBUG"<br>
FILENAME = os.path.join(DATA_DIR, "superset.log")<br>
ROLLOVER = "midnight"<br>
INTERVAL = 1<br>
BACKUP_COUNT = 30<br>
QUERY_LOGGER = None<br>
MAPBOX_API_KEY = os.environ.get("MAPBOX_API_KEY", "")<br>
SQL_MAX_ROW = 100000<br>
DISPLAY_MAX_ROW = 10000<br>
DEFAULT_SQLLAB_LIMIT = 1000<br>
MAX_TABLE_NAMES = 3000<br>
SQLLAB_SAVE_WARNING_MESSAGE = None<br>
SQLLAB_SCHEDULE_WARNING_MESSAGE = None<br>
BROKER_URL = "sqla+sqlite:///celerydb.sqlite"<br>
CELERY_IMPORTS = ("superset.sql_lab", "superset.tasks")<br>
CELERY_RESULT_BACKEND = "db+sqlite:///celery_results.sqlite"<br>
CELERYD_LOG_LEVEL = "DEBUG"<br>
CELERYD_PREFETCH_MULTIPLIER = 1<br>
CELERY_ACKS_LATE = False<br>
CELERY_ANNOTATIONS = {<br>
"sql_lab.get_sql_results": {"rate_limit": "100/s"},<br>
"email_reports.send": {<br>
"rate_limit": "1/s",<br>
"time_limit": 120,<br>
"soft_time_limit": 150,<br>
"ignore_result": True,<br>
},<br>
}<br>
CELERYBEAT_SCHEDULE = {<br>
"email_reports.schedule_hourly": {<br>
"task": "email_reports.schedule_hourly",<br>
"schedule": crontab(minute=1, hour="</em>"),<br>
}<br>
}<br>
DEFAULT_HTTP_HEADERS: Dict[str, Any] = {}<br>
OVERRIDE_HTTP_HEADERS: Dict[str, Any] = {}<br>
HTTP_HEADERS: Dict[str, Any] = {}<br>
DEFAULT_DB_ID = None<br>
SQLLAB_TIMEOUT = 30<br>
SQLLAB_VALIDATION_TIMEOUT = 10<br>
SQLLAB_DEFAULT_DBID = None<br>
SQLLAB_ASYNC_TIME_LIMIT_SEC = 60 * 60 * 6<br>
ESTIMATE_QUERY_COST = False<br>
SQLLAB_CTAS_NO_LIMIT = False<br>
SQLLAB_CTAS_SCHEMA_NAME_FUNC: Optional[<br>
Callable[["Database", "models.User", str, str], str]<br>
] = None<br>
RESULTS_BACKEND: Optional[BaseCache] = None<br>
RESULTS_BACKEND_USE_MSGPACK = True<br>
CSV_TO_HIVE_UPLOAD_S3_BUCKET = None<br>
CSV_TO_HIVE_UPLOAD_DIRECTORY = "EXTERNAL_HIVE_TABLES/"<br>
CSV_TO_HIVE_UPLOAD_DIRECTORY_FUNC: Callable[<br>
["Database", "models.User", str], Optional[str]<br>
] = lambda database, user, schema: CSV_TO_HIVE_UPLOAD_DIRECTORY<br>
UPLOADED_CSV_HIVE_NAMESPACE: Optional[str] = None<br>
ALLOWED_USER_CSV_SCHEMA_FUNC: Callable[["Database", "models.User"], List[str]] = (<br>
lambda database, user: [UPLOADED_CSV_HIVE_NAMESPACE]<br>
if UPLOADED_CSV_HIVE_NAMESPACE<br>
else []<br>
)<br>
CSV_DEFAULT_NA_NAMES = list(STR_NA_VALUES)<br>
JINJA_CONTEXT_ADDONS: Dict[str, Callable[..., Any]] = {}<br>
CUSTOM_TEMPLATE_PROCESSORS: Dict[str, Type[BaseTemplateProcessor]] = {}<br>
ROBOT_PERMISSION_ROLES = ["Public", "Gamma", "Alpha", "Admin", "sql_lab"]<br>
CONFIG_PATH_ENV_VAR = "SUPERSET_CONFIG_PATH"<br>
FLASK_APP_MUTATOR = None<br>
ENABLE_ACCESS_REQUEST = False<br>
SMTP_HOST = "localhost"<br>
SMTP_STARTTLS = True<br>
SMTP_SSL = False<br>
SMTP_USER = "superset"<br>
SMTP_PORT = 25<br>
SMTP_PASSWORD = "superset"<br>
SMTP_MAIL_FROM = "<a href="mailto:superset@superset.com">superset@superset.com</a>"<br>
ENABLE_CHUNK_ENCODING = False<br>
SILENCE_FAB = True<br>
FAB_ADD_SECURITY_VIEWS = True<br>
FAB_ADD_SECURITY_PERMISSION_VIEW = False<br>
FAB_ADD_SECURITY_VIEW_MENU_VIEW = False<br>
FAB_ADD_SECURITY_PERMISSION_VIEWS_VIEW = False<br>
TROUBLESHOOTING_LINK = ""<br>
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 7<br>
PERMISSION_INSTRUCTIONS_LINK = ""<br>
BLUEPRINTS: List[Blueprint] = []<br>
TRACKING_URL_TRANSFORMER = lambda x: x<br>
HIVE_POLL_INTERVAL = 5<br>
PRESTO_POLL_INTERVAL = 1<br>
ENABLE_JAVASCRIPT_CONTROLS = False<br>
DASHBOARD_TEMPLATE_ID = None<br>
DB_CONNECTION_MUTATOR = None<br>
SQL_QUERY_MUTATOR = None<br>
ENABLE_SCHEDULED_EMAIL_REPORTS = False<br>
ENABLE_ALERTS = False<br>
ALERT_REPORTS_CRON_WINDOW_SIZE = 59<br>
SLACK_API_TOKEN = None<br>
SLACK_PROXY = None<br>
SCHEDULED_EMAIL_DEBUG_MODE = False<br>
MACHINE_AUTH_PROVIDER_CLASS = "superset.utils.machine_auth.MachineAuthProvider"<br>
EMAIL_REPORTS_CRON_RESOLUTION = 15<br>
EMAIL_ASYNC_TIME_LIMIT_SEC = 300<br>
EMAIL_REPORT_FROM_ADDRESS = "<a href="mailto:reports@superset.org">reports@superset.org</a>"<br>
EMAIL_REPORT_BCC_ADDRESS = None<br>
EMAIL_REPORTS_USER = "admin"<br>
EMAIL_REPORTS_SUBJECT_PREFIX = "[Report] "<br>
WEBDRIVER_TYPE = "firefox"<br>
WEBDRIVER_WINDOW = {"dashboard": (1600, 2000), "slice": (3000, 1200)}<br>
WEBDRIVER_AUTH_FUNC = None<br>
WEBDRIVER_CONFIGURATION: Dict[Any, Any] = {}<br>
WEBDRIVER_OPTION_ARGS = [<br>
"--force-device-scale-factor=2.0",<br>
"--high-dpi-support=2.0",<br>
"--headless",<br>
]<br>
WEBDRIVER_BASEURL = "<a href="http://0.0.0.0:8080/" rel="nofollow">http://0.0.0.0:8080/</a>"<br>
WEBDRIVER_BASEURL_USER_FRIENDLY = WEBDRIVER_BASEURL<br>
EMAIL_PAGE_RENDER_WAIT = 30<br>
BUG_REPORT_URL = None<br>
DOCUMENTATION_URL = None<br>
DOCUMENTATION_TEXT = "Documentation"<br>
DEFAULT_RELATIVE_START_TIME = "today"<br>
DEFAULT_RELATIVE_END_TIME = "today"<br>
SQL_VALIDATORS_BY_ENGINE = {<br>
"presto": "PrestoDBSQLValidator",<br>
"postgresql": "PostgreSQLValidator",<br>
}<br>
TALISMAN_ENABLED = False<br>
TALISMAN_CONFIG = {<br>
"content_security_policy": None,<br>
"force_https": True,<br>
"force_https_permanent": False,<br>
}<br>
RLS_FORM_QUERY_REL_FIELDS: Optional[Dict[str, List[List[Any]]]] = None<br>
SQLALCHEMY_EXAMPLES_URI = None<br>
PREVENT_UNSAFE_DB_CONNECTIONS = True<br>
SSL_CERT_PATH: Optional[str] = None<br>
SIP_15_ENABLED = True<br>
SIP_15_DEFAULT_TIME_RANGE_ENDPOINTS = ["unknown", "inclusive"]<br>
SIP_15_TOAST_MESSAGE = (<br>
"Action Required: Preview then save your chart using the "<br>
'new time range endpoints &lt;a target="_blank" href="{url}" '<br>
'class="alert-link"&gt;here.'<br>
)<br>
SQLA_TABLE_MUTATOR = lambda table: table<br>
GLOBAL_ASYNC_QUERIES_REDIS_CONFIG = {<br>
"port": 6379,<br>
"host": "127.0.0.1",<br>
"password": "",<br>
"db": 0,<br>
}<br>
GLOBAL_ASYNC_QUERIES_REDIS_STREAM_PREFIX = "async-events-"<br>
GLOBAL_ASYNC_QUERIES_REDIS_STREAM_LIMIT = 1000<br>
GLOBAL_ASYNC_QUERIES_REDIS_STREAM_LIMIT_FIREHOSE = 1000000<br>
GLOBAL_ASYNC_QUERIES_JWT_COOKIE_NAME = "async-token"<br>
GLOBAL_ASYNC_QUERIES_JWT_COOKIE_SECURE = False<br>
GLOBAL_ASYNC_QUERIES_JWT_SECRET = "test-secret-change-me"<br>
GLOBAL_ASYNC_QUERIES_TRANSPORT = "polling"<br>
GLOBAL_ASYNC_QUERIES_POLLING_DELAY = 500<br>
if CONFIG_PATH_ENV_VAR in os.environ:<br>
try:<br>
cfg_path = os.environ[CONFIG_PATH_ENV_VAR]<br>
module = sys.modules[<strong>name</strong>]<br>
override_conf = imp.load_source("superset_config", cfg_path)<br>
for key in dir(override_conf):<br>
if key.isupper():<br>
setattr(module, key, getattr(override_conf, key))<br>
print(f"Loaded your LOCAL configuration at [{cfg_path}]")<br>
except Exception:<br>
logger.exception(<br>
"Failed to import config for %s=%s", CONFIG_PATH_ENV_VAR, cfg_path<br>
)<br>
raise<br>
elif importlib.util.find_spec("superset_config") and not is_test():<br>
try:<br>
print(f"Loaded your LOCAL configuration at [{superset_config.<strong>file</strong>}]")<br>
except Exception:<br>
logger.exception("Found but failed to import local superset_config")<br>
raise<br>
DATASET_HEALTH_CHECK = None</p>