You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by vi...@apache.org on 2020/10/28 08:30:54 UTC
[incubator-superset] branch 0.38 updated (248e914 -> c917e7d)
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a change to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git.
discard 248e914 fix: Disabling timezone of dataframe before passing Prophet (#11107)
discard cf49446 chore: update version
discard 0f089a9 fix(chart-data-api): ignore missing filters (#11112)
discard eba85d5 fix(presto): default unknown types to string type (#10753)
discard 8aceec3 fix: simply is_adhoc_metric (#10964)
discard e11888c fix(jinja): make context attrs private on SQL templates (#10934)
discard d879944 fix(legacy-druid): undefined filter key (#10931)
discard 18bd3ce refactor: ASF only dependencies on base.txt (#10875)
discard 9b53c55 chore: deprecate python 3.6 support (#10803)
discard d98a099 chore: bump pyarrow (#10733)
discard b6edf0c chore: ci Initial hive support (#10593)
discard 4f3fcfd fix(db_engine_specs): improve Presto column type matching (#10658)
discard f7e2dfa fix(sql-lab): relax column name restrictions (#10816)
discard d61ffb2 fix: ColorSchemeControl should not use CreatableSelect (#10814)
discard 3d9eab5 Fix: Include RLS filters for cache keys (#10805)
discard a30c02a fix: MVC show saved query (#10781)
discard c75823b security: disallow uuid package on jinja2 (#10794)
discard 67a8939 fix: can not type `0.05` in `TextControl` (#10778)
discard 4dc269f fix: pivot table timestamp grouping (#10774)
discard d410b8b More Label touchups (margins) (#10722)
discard 5fbe751 fix: dashboard extra filters (#10692)
discard cb5e650 feat(viz): add ECharts Timeseries chart (#10752)
discard 5e76d71 moving all @types to dev dependencies (#10750)
discard b6c1173 Fix: Rejiggering some dependencies, trying to get CI to pass (#10747)
discard 7291d89 fix(db-engine-spec): execute oracle DML statement bug in sqllab (#10706)
discard 4a6964f fix(jinja): extract form_data from json body (#10684)
discard 19db441 refactor(database): use SupersetResultSet on SqlaTable.get_df() (#10707)
discard 4cb9cfd fix: change public role like gamma procedure (#10674)
discard da2f907 fix: shorten url with extra request parameters (#10693)
discard 63ec3c2 feat(listview): set default view mode based on THUMBNAIL feature flag (#10691)
discard 163f3ac fix(filter-box): don't add empty filter to filtersChoices (#10687)
discard f189570 chore: Fix indentation issue (#10690)
discard b3c7740 refactor: useListViewResource hook for charts, dashboards, datasets (#10680)
discard f8bdf5e fix: SubMenu css (#10682)
discard b85b277 fix: layout flexiness (#10681)
discard 0034951 feat(row-level-security): add hook for customizing form dropdowns (#10683)
discard f66a412 fix: only call signal if executing on the main thread (#10677)
discard 5bf0ca4 Eslint error cleanup (#10657)
discard 59af29e fix(db_engine_specs): mysql longtext type should not be numeric (#10661)
discard e288fb8 Remove incorrect comment (#10652)
discard 25e4f4e fix: remove FAB rendered menu in favor of react based one (#10401)
discard c44ee37 feat: use shorten url in standalone iframe (#10651)
discard cfd8691 feat(listview): skeleton loading states for table and card collections (#10606)
discard 3e8249b feat: Getting fancier with Storybook (#10647)
discard 7d62a72 fix: dedup groupby in viz.py while preserving order (#10633)
discard 604ac57 feat: bump superset-ui for certified tag (#10650)
add cb1989a feat: bump superset-ui for certified tag (#10650)
add 82dda47 fix: dedup groupby in viz.py while preserving order (#10633)
add 878f06d feat: Getting fancier with Storybook (#10647)
add b86c0e5 feat(listview): skeleton loading states for table and card collections (#10606)
add aa8ff87 feat: use shorten url in standalone iframe (#10651)
add 45fee60 fix: remove FAB rendered menu in favor of react based one (#10401)
add 0f44d3e Fix add chart page frontend i18n issue (#9321)
add 52d7671 Remove incorrect comment (#10652)
add 0177c2f fix(db_engine_specs): mysql longtext type should not be numeric (#10661)
add 9461f9c fix(db_engine_specs): improve Presto column type matching (#10658)
add fdfb7cd Eslint error cleanup (#10657)
add 4b40d44 style: Fancier menus, more SIP-34-ish (#10423)
add fe574fd fix(sqllab): log exceptions caused by the user as debug and not error (#10676)
add 502f4db feature: Adding extra_filters to warm_up_cache (#10675)
add a6101f7 fix: only call signal if executing on the main thread (#10677)
add 4251b4e feat(row-level-security): add hook for customizing form dropdowns (#10683)
add a95e5c9 fix: layout flexiness (#10681)
add bc0fc4e fix: SubMenu css (#10682)
add 6ff96cf refactor: useListViewResource hook for charts, dashboards, datasets (#10680)
add 8581bda chore: Fix indentation issue (#10690)
add aaf04cc fix(filter-box): don't add empty filter to filtersChoices (#10687)
add bb92c1f feat: chart and dashboard card list view e2e cypress test (#10669)
add 81525c3 feat(listview): set default view mode based on THUMBNAIL feature flag (#10691)
add 19a9bcc chore: ci Initial hive support (#10593)
add 7fc227c fix: shorten url with extra request parameters (#10693)
add 8d94534 style: Move security/manage navigation tabs into a settings dropdown (#10439)
add 7abdf53 fix: card view failed cypress tests (#10699)
add 6ed3655 Use test name for the custom macros testing: (#10695)
add 937b868 style: add border between menu and submenu (#10698)
add c715cad feat: base tabbed modal for new database CRUD UI (#10668)
add 3e374da fix: change public role like gamma procedure (#10674)
add dd0bc47 refactor(database): use SupersetResultSet on SqlaTable.get_df() (#10707)
add 58b075b fix(jinja): extract form_data from json body (#10684)
add d3bdea3 fix: move menu reorg logic from crud app into Menu component (#10717)
add 4e01f39 chore: update samesite config documentation (#10720)
add 33fa9eb Covert celery tests to the pytest (#10704)
add 9fe30ab style: Pass at propagating (and enhancing) Button component throughout Superset (#10649)
add 3d8857e style: rename 'Source' top nav item to 'Data' (#10715)
add 234b6bb fix(db-engine-spec): execute oracle DML statement bug in sqllab (#10706)
add 4392c46 chore: bump pyarrow (#10733)
add cd144b6 style: Tabs now support AntD compound components (+ basic stories) (#10728)
add 807bd65 Fix: Rejiggering some dependencies, trying to get CI to pass (#10747)
add 4572ebb chore: log cache keys to the logs (#10678)
add b59f6b1 feat: refractored SQL-based alerting framework (#10605)
add 68d5a2b docs: Updated Docker local install instructions (#10511)
add 5a106eb moving all @types to dev dependencies (#10750)
add aeaee81 fix: local docker deployment (#10738)
add c1f2214 merge db migrations (#10758)
add e0ad993 chore: add logging for "dashboard" action (#10744)
add 8c564fb feat(viz): add ECharts Timeseries chart (#10752)
add b5aecaf docs: Update OAuth configuration in installation.rst (#10748)
add 77a3167 feat(database): POST, PUT, DELETE API endpoints (#10741)
add ff60e5c Fix precommit hook for docs/installation.rst (#10759)
add e0deaad chore: removing fsevents dependency (#10751)
add 5a43700 refactor: convert DatasetList schema filter to use new distinct api (#10746)
add 7bccb38 feat: SIP-34 table list view for databases (#10705)
add 45f4c68 fix: re-installing local superset in cache image (#10766)
add 1ee87cc fix: dashboard extra filters (#10692)
add 824cea2 More Label touchups (margins) (#10722)
add 54ae3b0 fix: add validator information to email/slack alerts (#10762)
add 70c6764 fix: pivot table timestamp grouping (#10774)
add 9bcb150 fix: can not type `0.05` in `TextControl` (#10778)
add 5962005 fix: disable domain sharding on explore view (#10787)
add 5199423 feat: CRUD REST API for saved queries (#10777)
add f685825 security: disallow uuid package on jinja2 (#10794)
add bc4f98e added creator column and adjusted order columns (#10789)
add c1ff1c5 fix: MVC show saved query (#10781)
add 92f2353 feat: filters for database list view (#10772)
add 702cfe9 Fix: Include RLS filters for cache keys (#10805)
add 1d76c59 docs: Add a note to contributing.md on reporting security vulnerabilities (#10796)
add 3ae80d3 test: add rls jinja extra cache key test (#10810)
add cda232b fix: ColorSchemeControl should not use CreatableSelect (#10814)
add 50672bb feat: database delete warning (#10800)
add 9a66971 chore: deprecate python 3.6 support (#10803)
add 782f678 fix: Database API missing allow none on fields (#10795)
add 3b4a992 fix: bump node version on Dockerfile to be on par with docker-compose (#10813)
add 9a59bdd refactor: merge/upgrade superset-ui packages (#10790)
add 8a3ac70 feat(databases): test connection api (#10723)
add e4ffaec Spanish translations (#10798)
add c2216e0 Revert "chore: add logging for "dashboard" action (#10744)" (#10822)
add e6a4808 fix(tests): export dataset tests fails with presto (#10818)
add 8a9ae81 fix(sql-lab): relax column name restrictions (#10816)
add dd7f3d5 build: split hive and presto tests to separate jobs (#10821)
add ac2937a fix: use nullpool in the celery workers (#10819)
add f0545bf fix(databases): test connection api endpoint (#10824)
add d80f406 build: optimize webpack code split (#10831)
add a3e2e65 fix: Making the database read-only (#10823)
add 136f90f feat: SavedQuery REST API for bulk delete and new API fields (#10793)
add 7c11c9c update all python version in the Dockerfile to 3.7 (#10841)
add 7b22004 fix(test): missing auth on tests (#10842)
add 7cd96ed feat: add/edit database modal form sections UI (#10745)
add 85a9160 docs(new docs site): removes old sphinx doc site with gatsby (#10784)
add 6cb6701 style: white toolbar for SQL Lab (#10851)
add 686c19a Fix test_connection POST body (#10846)
add 1f31e0e feat: server side dashboard css for less repaint (#10850)
add 8a774d5 Eslint dependencies versions updates (#10839)
add b4df053 Improvement contributing.md (#10859)
add a324fbd Adding editorconfig setting for IDE hints (#10855)
add c51168a Re-enable no-confusing-arrow rule (#10874)
add 352e8a1 Re-enable rule prefer-destructuring (only for objects) (#10867)
add 906a629 Re-enable rule no-unused-state (#10871)
add 7f10123 Re-enable no-useless-path-segments rule (#10860)
add 1908a94 ESLint: Re-enable rule no-restricted-globals (#10863)
add c5193ca Re-enable rule no-non-null-assertion (#10864)
add a75c362 Re-enable rule jsx-curly-brace-presence (#10869)
add d93b2b9 Re-enable rule sort-comp (#10872)
add 08ec509 docs(style): make more responsive for mobile (#10853)
add 76275ec Enable rule no-plusplus (#10876)
add 2d8f4e3 Re-enable rule no-else-return (#10861)
add 767044b ESLint: Re-enable rule control-has-associated-label (#10866)
add 91b8c8a Re-enable rule state-in-constructor (#10873)
add e28f3d6 Re-enable rule line-between-class-members (#10862)
add 01f9010 ESLint: Re-enable rule no-unused-vars (#10865)
add 4502690 chore: clean up aphrodite (#10883)
add 38edb69 Feat: Adding table comment and columns comment for SQLLab (#10844)
add 2a6bcbb Reviewed and repaired disabled pylint in dashboard file (#10877)
add 045335a fix(cypress): wait for filterValues request (#10884)
add 838a70e docs: fix ubuntu 20.04 installation instructions (#10888)
add 9c420d6 feat: implement cache invalidation api (#10761)
add b48dd4b chore: Using cache factory method (#10887)
add 5d529fd fixing broken links (#10885)
add 0129c42 feat: move ace-editor and mathjs to async modules (#10837)
add fe9f614 fix(cypress): prevent CI failure on codecov failure (#10892)
add c43992b feat: data menu routing (#10880)
add 4eeee4c chore: enable eslint-import-resolver-typescript (#10895)
add 1f73010 correcting 2 steps in docs deployment readme (#10899)
add 15fe04e docs: add changelog entries for 0.37.1 (#10893)
add 9246c9b refactor: ASF only dependencies on base.txt (#10875)
add 3b035d2 docs: redirect http -> https (#10900)
add d4291ed build: optimize eslint import resolver configs (#10901)
add 0870d3a docs: add back issue code links (#10903)
add f9cfb3e fix: spelling in docs homepage (#10912)
add 87fc425 Fixing docs site home screen mobile layout issues (#10886)
add d4ee073 simplifying/clarifying youtube video code/datastructures (#10882)
add c3f1720 fix: superset alerting misc fixes (#10891)
add 13cc1a3 fix: front end CI tests and test runner (#10897)
add d3e9c56 feat: use svg for checkbox component (#10799)
add 0d90bc9 chore: update port that cypress runs on for local vs test (#10847)
add 2a5946d docs: Client side redirects (one POC) (#10898)
add 281305e Enable anchor-has-content rule (#10908)
add d74044c Update FOSSA configuration for new requirements layout (#10848)
add 5099dbe fix: babel script broken by format string (#10902)
add a3519b4 fix lint errors (#10918)
add af75bee feat: adding dashboard toggle fullscreen button (#10840)
add cd77797 Removed disabled linting redefined-outer-name. Url parameters are renamed where url was already defined in class attributes (#10911)
add 5623cd6 feat: update saved query backend routing + add savedquery list (#10922)
add 6908100 fix(legacy-druid): undefined filter key (#10931)
add 8735a14 Removed global pylintrc rule: old-ne-operator. Which is not applicable in code anymore. (#10915)
add d6be977 fix: address all disabled pylint checks in charts/api.py (#10932)
add 213b772 chore: remove SIP_34_DATABASE_UI (#10926)
add ed9b50b chore: upgrade cypress to use retries (#10923)
add 141ef4a Updated `type: ignore` in model's helper: (#10906)
add e21a354 fix: update pylint disabled checks in common/query_context.py (#10941)
add e375ed4 fix(jinja): make context attrs private on SQL templates (#10934)
add 2003442 fix: several disabled pylint rules in models/helpers.py (#10909)
add ccfd293 ESLint: no-restricted-syntax (#10889)
add 4f60737 fix: typo in prefer typescript (#10959)
add d4f33cc Ignore '/docs' on some GH actions, give docs its own action (#10949)
add 4a4fdb1 docs: set up client-side redirects from previous era docs urls (#10921)
add 91fd06e ESLint: Remove ts-ignore (#10961)
add 557a303 ESLint: Enable rule no-named-as-default (#10879)
add 3d8f757 fix: simply is_adhoc_metric (#10964)
add 4835d3b ESLint: Re-enable rule no-access-state-in-setstate (#10870)
add fd0f6e1 fix: removed disabled lint rule `too-many-locals` in connectors/base/models.py (#10958)
add 9d7b353 fix: pylint disabled rules in dashboard/api.py (#10976)
add 88a6711 Pylint disabled rule `pointless-string-statement` is not raising warining anymore - removing (#10975)
add f01c488 fix: setting specific exceptions common/query_context.py (#10942)
add 74a2270 fix: re-enabling several globally disabled lint rules (#10957)
add 801fb40 Allow empty observations in alerting (#10939)
add 56d0018 fix: use nullpool even for user lookup in the celery (#10938)
add 4aa5324 fix: update the time filter for 'Last Year' option in explore (#10829)
add 41dfcd4 fix: changed disabled rules in datasets module (#10979)
add e4e78b6 style: fix checkbox color (#10970)
add a8f5029 ESLint: Remove ts-ignore comments (#10933)
add dc893fe chore: selectors refactor in SQLLab test suite (Cypress) (#10944)
add 193796c adding filters back that caused issues (#10989)
add 96a61e3 build: add PR lint action (#10990)
add 8e4a1c8 docs: add a "Gallery" page (#10968)
add 3be8bda docs: add gallery screenshot & link in README (#10988)
add 448a41a feat(row-level-security): add base filter type and filter grouping (#10946)
add bd140e0 fix(presto): default unknown types to string type (#10753)
add 95ba8e1 fix: deprecation warnings due to invalid escape sequences. (#10710)
add 0554c89 Enable subqueries in gsheetsdb (#10991)
add a9eab33 feat: add ECharts Pie chart (#10966)
add 9f01a7f ESLint: Re-enable rule default-props-match-prop-types (#10868)
add e93d92e Replace reactable with DataTable from superset-ui in QueryTable (#10981)
add a6f2587 fix: enable pylint rules in db_engine_specs module (#10998)
add a491b6db4 fix: unbreak ci (#11003)
add 220c410 build: add react-hooks linting (#11006)
add 0d1f611 feat(listview): feature flag config to set default viewing mode (#10986)
add d992c30 Bring back import menu (#11007)
add 02ab5cc fix: Add Item Overflow on Dataset Editor (#10983)
add 50852df chore: downgrade expected exception from error to info (#10994)
add ba009b7 fix: query search low privileged user search access denied (#11017)
add 345fe07 fix: menu shows a 0 when there are not settings (#11009)
add a26f29e fix: changes a pylint check in dashboard module (#10978)
add 26fcc08 Enabled pylint rules in `db_engines` module: (#11016)
add bade279 fix: reenable pylint rule `unused-import` in charts and connectors modules (#11014)
add fb6f14c fix: pylint checks in connectors/sqla/models.py (#10974)
add af1e8e8 fix: enable several pylint rules partially in db_engines_specs module (#11000)
add 7549dad fix: timer component, fixes #10849, closes #11002 (#11004)
add 0409393 fix: [dashboard] should not show edit button when user has no edit permit (#11024)
add 8b68378 docs: add security vulnerability GH issue template (#11023)
add dc76a26 style(explore): use tertiary button against gray background (#11011)
add 8e9b0b3 fix: dashboard edit button (again) (#11029)
add 6181994 chore: bump pandas to latest stable version (#11018)
add b2fdf12 Support jinja templates (#11008)
add eded51b feat(saved_queries): add custom api filter for all string & text fields (#11031)
add f99753a Revert "ESLint: Re-enable rule default-props-match-prop-types (#10868)" (#11050)
add 8bc05bd Changed variable name from capitals to lowercase and changed lint rule (#11044)
add 7ca4192 Enabled no-self-use pylint rule in security. Formatter (#11041)
add eba1aa8 Enabled argument-differ for bulk_delete (#11039)
add 6b318c4 Removed disable global pytlint rule `standarderror-builtin` which isn't appearing for Python3 (#11038)
add 63d0e80 chore: updated lint rules in models module (#11036)
add 92dd257 Changed `tags.py` and `helpers.py` in `models` module: removed disabled pylint rule `unused_import`, changed unused arguments to private and removed disabled rule `unused-argument. Removed redundant rules.` (#11037)
add ea105bc feat: add "created by" to dashboard CRUD view (#11030)
add 3467d2d Revert "style: fix checkbox color (#10970)" (#11051)
add 66e4980 fixed routes for customer in docs (#11052)
add d056e3d clickable labels have outlines, storybook shows them (#11034)
add 052d7a0 fix: sql lab autocomplete width (#11063)
add eeeb210 feat: adding all icons from the design system to the codebase (#11033)
add 374b06b fix: database list checkboxes (#11068)
add 8e6f7d6 style: remove unecessary padding (#11071)
add 8cba1c8 changing to the correct hex color (#11073)
add 23d62f3 removing unused component (#11072)
add 1493450 fix(jest): using UTC mock date (#11079)
add 7f1e4e4 fix: surface connection error messages on the client (#11077)
add cff034e chore: cleaning out unused code from utils (#11076)
add 497d3f3 fix: Adding timeout to flaky cypress test, to wait for animation to complete (#11074)
add 39cce71 docs: add changelog entries for 0.37.2 (#11086)
add 046bd02 style: improve "Datasource & Chart Type" <Label>s (#10971)
add 0f7e90f feat: improve presto query perf (#11069)
add a879622 refactor: Remove usages of reactable from AlteredSliceTag (#11012)
add f01b8a3 refactor: Remove usages of reactable from TimeTable (#11046)
add 2fd8fca chore: Clean up some console warnings (#11061)
add 1dc05d4 feat(charts): modify custom api filter to include more fields (#11054)
add e52a399 Reorganize steps (#11015)
add e337355 refactor: table selector on dataset editor (#10914)
add 690e27e chore: updated utils with pylint rules (#11062)
add 3a08fd0 chore: pylint fixes in files in project's root (#11064)
add 79de8f7 docs: Add Zeta to list of companies using Apache Superset (#11059)
add 8b458ac fix: double scroll bars on dataset editor (#11095)
add 80e3955 fix: echarts timeseries groupby (#11103)
add 5d08a42 fix(api): unable to delete virtual dataset, wrong permission name (#11019)
add 89bf765 Updated lint in schedules.py in tasks: unused_import, ungrouped_import and changed argument name to remove unused-argument (#11045)
add 6633409 feat: enable ETag header for dashboard GET requests (#10963)
add 4ccba30 chore: Remove Obsolete WARNING_MSG from config (#10972)
add b8d616a feat: saved query list view + sort/filters (#11005)
add 0409b12 style: fix secondary label border (#11100)
add 03eebd3 fix: fix table existence validation function (#11066)
add 94d4d55 Fix alembic migration (#11110)
add fa5dab8 feat: more specific presto error messages (#11099)
add ada66e3 fix(chart-data-api): ignore missing filters (#11112)
add 0bcc9d7 fix: Disabling timezone of dataframe before passing Prophet (#11107)
add 5b284e6 feat: add created by chart CRUD view (#11067)
add e7a4265 feat: saved query list actions (#11109)
add c4d96f6 fix: SpatialControl popover won't open (#11127)
add fdb26f6 feat: CRUD REST API for CSS Templates (#11114)
add 50d8040 fix: alembic migration error msg trying to delete constraint on tables (#11115)
add 7a72082 fix: Revert "Replace reactable with DataTable from superset-ui in QueryTable (#10981)" (#11125)
add 33906c6 fix: remove extra flash import (#11121)
add 2a906bc docs: use the Apache-Superset logo on README / pypi (#11132)
add 07716ff chore: refactor submenu's right nav to accept list of buttons (#11102)
add 4c85d33 feat: custom favorite filter for dashboards, charts and saved queries (#11083)
add 5f55d94 style: rename label 'table name'->'dataset name' (#11126)
add 017e5ac style(listview): dynamic card size and grid spacing (#11111)
add a4e1dc9 add info about case sensitive search (#11124)
add d578d81 docs: comply to ASF requirements (#11133)
add 2cb2a00 docs: docs site footer link tweak (#11140)
add e90c63f fix: Alembic migration 18532d70ab98 (#11136)
new 5db8682 fix(examples): missing expressions in birth_names (#11141)
new 922b8aa fix: disable jinja2 SQL templating
new 9aba607 chore(sql-lab): catch PyArrow deserialization error (#11201)
new 76f6e85 chore(sqla): assert query is single read-only statement (#11236)
new c2e8f98 feat(datasets): REST API bulk delete (#11237)
new f0cd671 fix(dataset): update user list endpoint (#11221)
new 44b7e8e fix(crud): set default extra value (#11262)
new c917e7d fix: Fix Time Column dropdown for date filter (#11149)
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (248e914)
\
N -- N -- N refs/heads/0.38 (c917e7d)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.asf.yaml | 2 +-
.editorconfig | 47 +
.fossa.yml | 10 +-
.github/ISSUE_TEMPLATE/security_vulnerability.md | 12 +
.github/prlint.json | 8 -
.github/workflows/bashlib.sh | 11 +-
.github/workflows/license-check.yml | 2 +-
.github/workflows/pr-lint.yml | 22 +
.github/workflows/prefer-typescript.yml | 48 +
.github/workflows/prefer_typescript.yml | 45 -
.github/workflows/superset-docker.yml | 22 -
.github/workflows/superset-docs.yml | 30 +
.github/workflows/superset-e2e.yml | 41 +-
.github/workflows/superset-frontend.yml | 11 +-
.github/workflows/superset-python.yml | 33 +-
.github/workflows/superset-translations.yml | 28 +-
.github/workflows/test-docker.yml | 22 +
.github/workflows/test-hive.yml | 67 +
.github/workflows/test-presto.yml | 70 +
.pre-commit-config.yaml | 2 +-
.pylintrc | 2 +-
.rat-excludes | 6 +-
CHANGELOG.md | 37 +
CONTRIBUTING.md | 101 +-
Dockerfile | 6 +-
Dockerfile-dev | 8 +-
INTHEWILD.md | 2 +
README.md | 16 +-
RELEASING/Dockerfile.make_docs | 2 +-
UPDATING.md | 6 +-
docker-compose.yml | 4 +-
docker/docker-init.sh | 26 +-
docs/.eslintrc.js | 48 +
docs/.gitignore | 3 +
docs/.htaccess | 23 +
{superset-frontend => docs}/.prettierrc | 0
docs/Makefile | 208 -
docs/README.md | 67 +
docs/_static/docs.css | 77 -
docs/_static/images | 1 -
docs/admintutorial.rst | 325 -
docs/build.sh | 22 -
docs/conf.py | 307 -
docs/doczrc.js | 35 +
docs/druid.rst | 64 -
docs/faq.rst | 346 -
docs/gallery.rst | 206 -
docs/gatsby-config.js | 76 +
docs/gatsby-node.js | 637 +
docs/import_export_datasources.rst | 124 -
docs/index.rst | 176 -
docs/installation.rst | 116 +-
docs/issue_code_reference.rst | 48 -
docs/misc.rst | 27 -
docs/package-lock.json | 24072 +++++++++++++++++++
docs/package.json | 74 +
docs/prettier.config.js | 21 +
tests/util/__init__.py => docs/requirements.txt | 0
docs/security.rst | 185 -
docs/src/components/AnchorNavigator.tsx | 62 +
docs/src/components/DbImage.tsx | 49 +
docs/src/components/DoczMenu.tsx | 57 +
docs/src/components/MainMenu.tsx | 152 +
docs/src/components/footer.tsx | 189 +
docs/src/components/image.tsx | 90 +
docs/src/components/layout.scss | 134 +
docs/src/components/layout.tsx | 200 +
docs/src/components/next.tsx | 42 +
docs/src/components/select.tsx | 47 +
docs/src/components/seo.js | 104 +
docs/src/gatsby-theme-docz/index.tsx | 58 +
.../src/images/apacheSupersetHoriz.png | Bin
docs/src/images/dashboard.png | Bin 0 -> 453151 bytes
docs/src/images/databases/apache-drill.png | Bin 0 -> 40173 bytes
docs/src/images/databases/apache-druid.jpeg | Bin 0 -> 214904 bytes
.../src/images/databases/apache-druid.png | Bin
docs/src/images/databases/apache-hive.svg | 69 +
docs/src/images/databases/apache-impala.png | Bin 0 -> 5216 bytes
.../src/images/databases}/apache-kylin.png | Bin
.../src/images/databases/aws-redshift.png | Bin
.../src/images/databases}/clickhouse.png | Bin
docs/src/images/databases/druid.png | Bin 0 -> 121985 bytes
.../src/images/databases}/exasol.png | Bin
.../src/images/databases}/firebird.png | Bin
.../src/images/databases/googleBQ.png | Bin
docs/src/images/databases/greenplum.jpeg | Bin 0 -> 7559 bytes
.../src/images/databases}/greenplum.png | Bin
docs/src/images/databases/ibmdb2.png | Bin 0 -> 14127 bytes
.../src/images/databases/monet.png | Bin
.../src/images/databases/msql.png | Bin
.../images => docs/src/images/databases}/mysql.png | Bin
docs/src/images/databases/oracle-logo.png | Bin 0 -> 10347 bytes
.../src/images/databases}/oracle.png | Bin
docs/src/images/databases/oraclelogo.png | Bin 0 -> 29864 bytes
docs/src/images/databases/postgresql.jpg | Bin 0 -> 19019 bytes
docs/src/images/databases/postsql.png | Bin 0 -> 44334 bytes
.../src/images/databases/presto-og.png | Bin
.../src/images/databases}/snowflake.png | Bin
docs/src/images/databases/sqllite.jpg | Bin 0 -> 13006 bytes
docs/src/images/databases/sqllite.png | Bin 0 -> 38063 bytes
.../src/images/databases}/vertica.png | Bin
docs/src/images/docker.png | Bin 0 -> 24928 bytes
docs/src/images/explorer.png | Bin 0 -> 641441 bytes
{superset-frontend => docs/src}/images/favicon.png | Bin
docs/src/images/gallery/bubble.png | Bin 0 -> 238904 bytes
docs/src/images/gallery/chord_diagram.png | Bin 0 -> 762878 bytes
docs/src/images/gallery/community.png | Bin 0 -> 609567 bytes
docs/src/images/gallery/dashboard_editor.png | Bin 0 -> 2255813 bytes
docs/src/images/gallery/dashboard_list.png | Bin 0 -> 197656 bytes
docs/src/images/gallery/dashboard_properties.png | Bin 0 -> 213069 bytes
docs/src/images/gallery/deck_arc.png | Bin 0 -> 1351973 bytes
docs/src/images/gallery/deck_hex.png | Bin 0 -> 1761791 bytes
docs/src/images/gallery/deck_path.png | Bin 0 -> 1229563 bytes
docs/src/images/gallery/deck_polygon.png | Bin 0 -> 1588761 bytes
docs/src/images/gallery/deck_scatter.png | Bin 0 -> 1815849 bytes
.../src/images/gallery}/deckgl_dash.png | Bin
docs/src/images/gallery/explore.png | Bin 0 -> 530390 bytes
docs/src/images/gallery/force_layout.png | Bin 0 -> 432443 bytes
docs/src/images/gallery/france.png | Bin 0 -> 431636 bytes
docs/src/images/gallery/girl_names.png | Bin 0 -> 276784 bytes
docs/src/images/gallery/heatmap.png | Bin 0 -> 629165 bytes
docs/src/images/gallery/pino_geo.png | Bin 0 -> 3385639 bytes
docs/src/images/gallery/sankey.png | Bin 0 -> 529762 bytes
docs/src/images/gallery/slack.png | Bin 0 -> 471736 bytes
docs/src/images/gallery/sqllab.png | Bin 0 -> 375108 bytes
docs/src/images/gallery/storm.png | Bin 0 -> 2287707 bytes
docs/src/images/gallery/stream.png | Bin 0 -> 557506 bytes
docs/src/images/gallery/table.png | Bin 0 -> 447295 bytes
docs/src/images/gallery/treemap.png | Bin 0 -> 456361 bytes
.../src/images/gallery}/visualizations.png | Bin
docs/src/images/gallery/worldbank_dashboard.png | Bin 0 -> 780010 bytes
docs/src/images/incubator.png | Bin 0 -> 17961 bytes
docs/src/images/preset.png | Bin 0 -> 39030 bytes
docs/src/images/preset.svg | 33 +
{superset-frontend => docs/src}/images/s.png | Bin
docs/src/images/stack_overflow.png | Bin 0 -> 30065 bytes
.../src/images}/superset-logo-horiz-apache.svg | 0
docs/src/images/superset-logo-horiz.svg | 45 +
docs/src/pages/404.jsx | 32 +
docs/src/pages/community.tsx | 145 +
.../pages/docs/Connecting to Databases/athena.mdx | 35 +
.../docs/Connecting to Databases/clickhouse.mdx | 18 +
.../docs/Connecting to Databases/cockroachdb.mdx | 18 +
.../Connecting to Databases/docker-add-drivers.mdx | 86 +
.../pages/docs/Connecting to Databases/dremio.mdx | 21 +
.../pages/docs/Connecting to Databases/drill.mdx | 48 +
.../pages/docs/Connecting to Databases/druid.mdx | 64 +
.../docs/Connecting to Databases/elasticsearch.mdx | 50 +
.../pages/docs/Connecting to Databases/exasol.mdx | 18 +
.../Connecting to Databases/extra-settings.mdx | 70 +
.../Connecting to Databases/google-bigquery.mdx | 57 +
.../docs/Connecting to Databases/google-sheets.mdx | 17 +
.../pages/docs/Connecting to Databases/hana.mdx | 17 +
.../pages/docs/Connecting to Databases/hive.mdx | 17 +
.../pages/docs/Connecting to Databases/ibm-db2.mdx | 18 +
.../pages/docs/Connecting to Databases/impala.mdx | 17 +
.../pages/docs/Connecting to Databases/index.mdx | 70 +
.../pages/docs/Connecting to Databases/kylin.mdx | 18 +
.../pages/docs/Connecting to Databases/mysql.mdx | 28 +
.../pages/docs/Connecting to Databases/oracle.mdx | 18 +
.../pages/docs/Connecting to Databases/pinot.mdx | 17 +
.../docs/Connecting to Databases/postgres.mdx | 40 +
.../pages/docs/Connecting to Databases/presto.mdx | 26 +
.../docs/Connecting to Databases/redshift.mdx | 26 +
.../docs/Connecting to Databases/snowflake.mdx | 32 +
.../docs/Connecting to Databases/spark-sql.mdx | 17 +
.../docs/Connecting to Databases/sql-server.mdx | 17 +
.../docs/Connecting to Databases/teradata.mdx | 29 +
.../pages/docs/Connecting to Databases/vertica.mdx | 32 +
.../exploring-data.mdx | 365 +
.../docs/Creating Charts and Dashboards/index.mdx | 277 +
.../docs/Miscellaneous/importing-exporting.mdx | 117 +
docs/src/pages/docs/Miscellaneous/index.mdx | 94 +
docs/src/pages/docs/Miscellaneous/issue_codes.mdx | 75 +
docs/src/pages/docs/contributing-page.mdx | 25 +
.../pages/docs/frequently-asked-questions-page.mdx | 289 +
.../docs/installation/async_queries_celery.mdx | 118 +
.../docs/installation/building-viz-plugins.mdx | 209 +
docs/src/pages/docs/installation/caching.mdx | 120 +
docs/src/pages/docs/installation/configuring.mdx | 282 +
docs/src/pages/docs/installation/email_reports.mdx | 174 +
.../pages/docs/installation/event-logging-page.mdx | 59 +
docs/src/pages/docs/installation/index.mdx | 89 +
.../pages/docs/installation/installing_scratch.mdx | 132 +
.../docs/installation/networking_settings.mdx | 45 +
.../src/pages/docs/installation/sql_templating.mdx | 89 +
.../pages/docs/installation/upgrading_superset.mdx | 44 +
docs/src/pages/docs/introduction.mdx | 49 +
docs/src/pages/docs/roadmap-page.mdx | 9 +
docs/src/pages/docs/security-page.mdx | 22 +
docs/src/pages/gallery.tsx | 110 +
docs/src/pages/index.tsx | 494 +
docs/src/pages/resources.tsx | 213 +
docs/src/resources/data.js | 218 +
docs/src/utils.js | 105 +
.../static/images}/add_new_chart.png | Bin
.../static/images}/advanced_analytics_base.png | Bin
.../static/images}/annotation.png | Bin
.../static/images}/annotation_settings.png | Bin
.../static/images}/average_aggregate_for_cost.png | Bin
.../static/images}/blue_bar_insert_component.png | Bin
.../static/images}/chose_a_datasource.png | Bin
.../images}/csv_to_database_configuration.png | Bin
docs/static/images/dashboard.png | Bin 0 -> 746595 bytes
docs/static/images/dashboard2.png | Bin 0 -> 704237 bytes
docs/static/images/dashboard3.png | Bin 0 -> 728491 bytes
docs/static/images/data-point.jpg | Bin 0 -> 1795832 bytes
.../static/images}/edit-record.png | Bin
.../static/images}/edit_annotation.png | Bin
docs/static/images/explorer.png | Bin 0 -> 641441 bytes
docs/static/images/explorer2.png | Bin 0 -> 938335 bytes
docs/static/images/explorer3.png | Bin 0 -> 5015944 bytes
docs/static/images/explorer4.png | Bin 0 -> 2672689 bytes
.../static/images}/filter_on_origin_country.png | Bin
docs/static/images/google-analytics.png | Bin 0 -> 689661 bytes
.../static/images}/markdown.png | Bin
.../static/images}/no_filter_on_time_filter.png | Bin
.../static/images}/parse_dates_column.png | Bin
docs/static/images/pie-chart.png | Bin 0 -> 1320888 bytes
docs/static/images/plugin-1-yeoman-select.png | Bin 0 -> 73428 bytes
docs/static/images/plugin-10-hello-thumbnail.png | Bin 0 -> 82000 bytes
docs/static/images/plugin-11-explore-view.png | Bin 0 -> 260757 bytes
docs/static/images/plugin-12-console-logs.png | Bin 0 -> 87031 bytes
.../static/images/plugin-2-yeoman-package-name.png | Bin 0 -> 22666 bytes
docs/static/images/plugin-3-yeoman-description.png | Bin 0 -> 29219 bytes
.../images/plugin-4-yeoman-component-type.png | Bin 0 -> 26113 bytes
docs/static/images/plugin-5-yeoman-timeseries.png | Bin 0 -> 21856 bytes
docs/static/images/plugin-6-yeoman-badges.png | Bin 0 -> 14572 bytes
docs/static/images/plugin-7-yeoman-files.png | Bin 0 -> 162570 bytes
docs/static/images/plugin-8-package-json.png | Bin 0 -> 52915 bytes
docs/static/images/plugin-9-mainpreset-import.png | Bin 0 -> 123027 bytes
.../static/images/plugin-9-mainpreset-register.png | Bin 0 -> 112575 bytes
.../static/images}/publish_dashboard.png | Bin
.../static/images}/resample.png | Bin
.../images}/resize_tutorial_table_on_dashboard.png | Bin
.../static/images}/rolling_mean.png | Bin
docs/static/images/root-cert-example.png | Bin 0 -> 41232 bytes
.../static/images}/save_tutorial_table.png | Bin
.../static/images}/select_dates_pivot_table.png | Bin
.../images}/select_table_visualization_type.png | Bin
docs/static/images/so-icon.svg | 19 +
docs/static/images/sqllab.png | Bin 0 -> 393766 bytes
docs/static/images/sqllab0.png | Bin 0 -> 641865 bytes
docs/static/images/sqllab1.png | Bin 0 -> 556582 bytes
docs/static/images/sqllab3.png | Bin 0 -> 529043 bytes
.../static/images}/sum_cost_column.png | Bin
.../time_comparison_absolute_difference.png | Bin
.../static/images}/time_comparison_two_series.png | Bin
.../images}/tutorial_01_sources_database.png | Bin
.../static/images}/tutorial_02_add_database.png | Bin
.../static/images}/tutorial_03_database_name.png | Bin
.../tutorial_04_sqlalchemy_connection_string.png | Bin
.../images}/tutorial_05_connection_popup.png | Bin
.../static/images}/tutorial_06_list_of_tables.png | Bin
.../static/images/tutorial_07_save_button (1).png | Bin
.../static/images}/tutorial_07_save_button.png | Bin
.../static/images}/tutorial_08_sources_tables.png | Bin
.../static/images}/tutorial_09_add_new_table.png | Bin
.../static/images}/tutorial_10_table_name.png | Bin
.../static/images}/tutorial_11_choose_db.png | Bin
.../tutorial_12_table_creation_success_msg.png | Bin
.../images}/tutorial_13_edit_table_config.png | Bin
.../static/images}/tutorial_14_field_config.png | Bin
.../images}/tutorial_15_click_table_name.png | Bin
.../images}/tutorial_16_datasource_chart_type.png | Bin
.../images}/tutorial_17_choose_time_range.png | Bin
.../static/images}/tutorial_18_choose_metric.png | Bin
.../static/images/tutorial_19_click_query (1).png | Bin
.../static/images}/tutorial_19_click_query.png | Bin
.../images}/tutorial_20_count_star_result.png | Bin
.../static/images}/tutorial_21_group_by.png | Bin
.../static/images}/tutorial_22_group_by_result.png | Bin
.../tutorial_23_group_by_more_dimensions.png | Bin
.../static/images}/tutorial_24_max_metric.png | Bin
.../static/images}/tutorial_25_max_temp_filter.png | Bin
.../static/images}/tutorial_26_row_limit.png | Bin
.../images}/tutorial_27_top_10_max_temps.png | Bin
.../static/images}/tutorial_28_bar_chart.png | Bin
.../tutorial_29_bar_chart_series_metrics.png | Bin
.../images}/tutorial_30_bar_chart_results.png | Bin
.../tutorial_31_save_slice_to_dashboard.png | Bin
.../tutorial_32_save_slice_confirmation.png | Bin
.../static/images}/tutorial_33_dashboard.png | Bin
.../images}/tutorial_34_weather_dashboard.png | Bin
.../images}/tutorial_35_slice_on_dashboard.png | Bin
.../images}/tutorial_36_adjust_dimensions.gif | Bin
.../static/images}/tutorial_line_chart.png | Bin
.../static/images}/tutorial_pivot_table.png | Bin
.../static/images}/tutorial_table.png | Bin
.../static/images}/upload_a_csv.png | Bin
docs/static/images/youtube.png | Bin 0 -> 20462 bytes
docs/tutorials.rst | 25 -
docs/usertutorial.rst | 507 -
docs/videos.rst | 22 -
docs/visualization.rst | 2016 --
package-lock.json | 3 +
requirements/base.in | 2 +
requirements/base.txt | 22 +-
requirements/development.txt | 7 +-
requirements/docker.txt | 6 +-
requirements/documentation.in | 19 -
requirements/documentation.txt | 24 -
requirements/integration.txt | 4 +-
requirements/testing.txt | 10 +-
scripts/fossa.sh | 4 +-
scripts/pypi_push.sh | 2 +-
setup.cfg | 10 +-
setup.py | 2 +-
superset-frontend/.eslintrc.js | 88 +-
superset-frontend/.storybook/main.js | 2 +-
superset-frontend/.storybook/preview.jsx | 2 +-
superset-frontend/cypress-base/.eslintrc | 21 +-
superset-frontend/cypress-base/cypress.json | 8 +-
.../integration/chart_list/card_view.test.ts | 107 +
.../integration/chart_list/chart_list.helper.ts | 19 +
.../cypress/integration/chart_list/filter.test.ts | 123 +
.../integration/chart_list/list_view.test.ts | 50 +
.../integration/dashboard/dashboard.helper.js | 23 -
.../integration/dashboard/dashboard.helper.ts | 47 +
.../integration/dashboard/edit_mode.test.js | 25 +-
.../cypress/integration/dashboard/load.test.js | 2 +-
.../cypress/integration/dashboard/markdown.test.ts | 64 +
.../cypress/integration/dashboard/save.test.js | 4 +-
.../integration/dashboard_list/card_view.test.ts | 111 +
.../dashboard_list/dashboard_list.helper.ts | 19 +
.../integration/dashboard_list/filter.test.ts | 99 +
.../integration/dashboard_list/list_view.test.ts | 53 +
.../integration/explore/AdhocFilters.test.ts | 57 +-
.../integration/explore/AdhocMetrics.test.ts | 14 +-
.../cypress/integration/explore/advanced.test.ts | 4 +-
.../cypress/integration/explore/chart.test.js | 2 +-
.../cypress/integration/explore/control.test.ts | 73 +-
.../explore/visualizations/big_number.test.js | 2 +-
.../explore/visualizations/line.test.ts | 9 +
.../integration/explore/visualizations/pie.test.js | 8 +-
.../cypress/integration/sqllab/query.test.js | 124 -
.../cypress/integration/sqllab/query.test.ts | 161 +
.../cypress/integration/sqllab/tabs.test.js | 43 +-
.../cypress-base/cypress/support/index.d.ts | 2 +-
superset-frontend/cypress-base/package-lock.json | 484 +-
superset-frontend/cypress-base/package.json | 2 +-
superset-frontend/cypress-base/tsconfig.json | 2 +-
superset-frontend/cypress_build.sh | 4 +-
superset-frontend/images/icons/alert.svg | 21 +
superset-frontend/images/icons/alert_solid.svg | 22 +
superset-frontend/images/icons/binoculars.svg | 21 +
superset-frontend/images/icons/bolt.svg | 21 +
superset-frontend/images/icons/bolt_small.svg | 21 +
superset-frontend/images/icons/bolt_small_run.svg | 21 +
superset-frontend/images/icons/calendar.svg | 21 +
superset-frontend/images/icons/cancel.svg | 21 +
superset-frontend/images/icons/cancel_solid.svg | 22 +
.../images/icons/{card-view.svg => card_view.svg} | 0
superset-frontend/images/icons/cards.svg | 21 +
superset-frontend/images/icons/cards_locked.svg | 22 +
superset-frontend/images/icons/caret_down.svg | 21 +
superset-frontend/images/icons/caret_left.svg | 21 +
superset-frontend/images/icons/caret_right.svg | 21 +
superset-frontend/images/icons/caret_up.svg | 21 +
superset-frontend/images/icons/checkbox-half.svg | 2 +-
superset-frontend/images/icons/checkbox-off.svg | 2 +-
superset-frontend/images/icons/checkbox-on.svg | 2 +-
superset-frontend/images/icons/circle-check.svg | 22 -
superset-frontend/images/icons/circle.svg | 21 +
superset-frontend/images/icons/circle_check.svg | 21 +
...rcle-check-solid.svg => circle_check_solid.svg} | 0
superset-frontend/images/icons/clock.svg | 21 +
superset-frontend/images/icons/code.svg | 21 +
superset-frontend/images/icons/cog.svg | 22 +
superset-frontend/images/icons/collapse.svg | 21 +
superset-frontend/images/icons/color_palette.svg | 21 +
superset-frontend/images/icons/components.svg | 22 +
superset-frontend/images/icons/copy.svg | 21 +
superset-frontend/images/icons/cursor_target.svg | 21 +
superset-frontend/images/icons/database.svg | 21 +
.../images/icons/dataset_virtual_greyscale.svg | 22 +
superset-frontend/images/icons/download.svg | 21 +
superset-frontend/images/icons/edit.svg | 21 +
.../images/icons/{pencil.svg => edit_alt.svg} | 0
superset-frontend/images/icons/email.svg | 21 +
superset-frontend/images/icons/error.svg | 33 +-
.../images/icons/{error.svg => error_solid.svg} | 0
.../images/icons/error_solid_small.svg | 22 +
superset-frontend/images/icons/expand.svg | 21 +
superset-frontend/images/icons/eye.svg | 21 +
superset-frontend/images/icons/eye_slash.svg | 21 +
.../images/icons/favorite-selected.svg | 4 +-
.../images/icons/favorite-unselected.svg | 4 +-
.../images/icons/favorite_small_selected.svg | 21 +
superset-frontend/images/icons/field_abc.svg | 21 +
superset-frontend/images/icons/field_boolean.svg | 21 +
superset-frontend/images/icons/field_date.svg | 21 +
superset-frontend/images/icons/field_derived.svg | 21 +
superset-frontend/images/icons/field_num.svg | 21 +
superset-frontend/images/icons/field_struct.svg | 21 +
superset-frontend/images/icons/file.svg | 21 +
superset-frontend/images/icons/filter.svg | 21 +
superset-frontend/images/icons/folder.svg | 21 +
superset-frontend/images/icons/full.svg | 21 +
superset-frontend/images/icons/gear.svg | 21 +
superset-frontend/images/icons/grid.svg | 21 +
superset-frontend/images/icons/image.svg | 21 +
superset-frontend/images/icons/info-solid.svg | 22 +
superset-frontend/images/icons/info.svg | 21 +
.../images/icons/info_solid_small.svg | 22 +
superset-frontend/images/icons/join.svg | 21 +
superset-frontend/images/icons/keyboard.svg | 21 +
superset-frontend/images/icons/layers.svg | 21 +
superset-frontend/images/icons/lightbulb.svg | 21 +
superset-frontend/images/icons/list.svg | 21 +
.../images/icons/{list-view.svg => list_view.svg} | 0
superset-frontend/images/icons/location.svg | 21 +
superset-frontend/images/icons/lock_locked.svg | 21 +
superset-frontend/images/icons/lock_unlocked.svg | 21 +
superset-frontend/images/icons/map.svg | 21 +
superset-frontend/images/icons/message.svg | 21 +
superset-frontend/images/icons/minus.svg | 21 +
superset-frontend/images/icons/minus_solid.svg | 22 +
.../images/icons/{more.svg => more_horiz.svg} | 0
superset-frontend/images/icons/move.svg | 21 +
superset-frontend/images/icons/nav_charts.svg | 22 +
superset-frontend/images/icons/nav_dashboard.svg | 21 +
superset-frontend/images/icons/nav_data.svg | 21 +
.../images/icons/{compass.svg => nav_explore.svg} | 0
superset-frontend/images/icons/nav_home.svg | 21 +
superset-frontend/images/icons/nav_lab.svg | 21 +
superset-frontend/images/icons/note.svg | 21 +
superset-frontend/images/icons/paperclip.svg | 21 +
superset-frontend/images/icons/placeholder.svg | 21 +
superset-frontend/images/icons/plus.svg | 21 +
superset-frontend/images/icons/plus_large.svg | 21 +
superset-frontend/images/icons/plus_small.svg | 21 +
superset-frontend/images/icons/plus_solid.svg | 22 +
superset-frontend/images/icons/refresh.svg | 21 +
superset-frontend/images/icons/server.svg | 21 +
.../images/icons/{sort-asc.svg => sort_asc.svg} | 0
.../images/icons/{sort-desc.svg => sort_desc.svg} | 0
superset-frontend/images/icons/sql.svg | 22 +
superset-frontend/images/icons/table.svg | 22 +
superset-frontend/images/icons/tag.svg | 21 +
superset-frontend/images/icons/triangle_change.svg | 21 +
superset-frontend/images/icons/triangle_down.svg | 21 +
superset-frontend/images/icons/triangle_up.svg | 21 +
superset-frontend/images/icons/up-level.svg | 21 +
superset-frontend/images/icons/user.svg | 21 +
superset-frontend/images/icons/warning.svg | 31 +-
.../icons/{warning.svg => warning_solid.svg} | 0
superset-frontend/images/icons/x-large.svg | 21 +
superset-frontend/images/icons/x-small.svg | 21 +
superset-frontend/images/screenshots/gallery.png | Bin 0 -> 3542967 bytes
superset-frontend/package-lock.json | 4174 ++--
superset-frontend/package.json | 117 +-
superset-frontend/prettier.config.js | 23 +
superset-frontend/spec/.eslintrc | 21 +-
.../spec/helpers/setupSupersetClient.js | 2 +-
superset-frontend/spec/helpers/shim.ts | 4 +-
superset-frontend/spec/helpers/theming.ts | 4 +-
.../spec/javascripts/CRUD/CollectionTable_spec.jsx | 2 +-
.../addSlice/AddSliceContainer_spec.tsx | 14 +-
.../spec/javascripts/chart/ChartRenderer_spec.jsx | 2 +-
.../spec/javascripts/chart/chartActions_spec.js | 2 +-
.../components/AlteredSliceTag_spec.jsx | 259 +-
.../spec/javascripts/components/Checkbox_spec.jsx | 55 -
.../components/ConfirmStatusChange_spec.jsx | 8 +-
.../components/ListView/ListView_spec.jsx | 13 +-
.../spec/javascripts/components/Menu_spec.jsx | 47 +-
.../spec/javascripts/components/SubMenu_spec.jsx | 108 +
.../javascripts/components/TableSelector_spec.jsx | 430 +-
.../components/fixtures/AlteredSliceTag.js | 166 +
.../spec/javascripts/dashboard/.eslintrc | 1 -
.../dashboard/actions/dashboardState_spec.js | 4 +-
.../dashboard/components/CodeModal_spec.jsx | 2 +-
.../dashboard/components/DashboardBuilder_spec.jsx | 2 +-
.../components/HeaderActionsDropdown_spec.jsx | 8 +-
.../dashboard/components/Header_spec.jsx | 2 +-
.../components/gridComponents/ChartHolder_spec.jsx | 2 +-
.../components/gridComponents/Markdown_spec.jsx | 14 +-
.../components/gridComponents/Tab_spec.jsx | 2 +-
.../resizable/ResizableContainer_spec.jsx | 2 +-
.../dashboard/fixtures/mockDashboardLayout.js | 2 +-
.../dashboard/reducers/dashboardFilters_spec.js | 2 +-
.../dashboard/util/getDashboardUrl_spec.js | 10 +
.../datasource/ChangeDatasourceModal_spec.jsx | 2 +-
.../datasource/DatasourceModal_spec.jsx | 17 +-
.../components/AdhocFilterEditPopover_spec.jsx | 7 +-
.../explore/components/AdhocFilterOption_spec.jsx | 4 +-
.../components/AdhocMetricEditPopover_spec.jsx | 7 +-
.../explore/components/AdhocMetricOption_spec.jsx | 4 +-
.../explore/components/ColorPickerControl_spec.jsx | 2 +-
.../explore/components/ColorScheme_spec.jsx | 2 +-
.../components/ControlPanelsContainer_spec.jsx | 3 +-
.../explore/components/ControlRow_spec.jsx | 2 +
.../explore/components/DatasourceControl_spec.jsx | 2 +-
.../explore/components/DateFilterControl_spec.jsx | 117 +-
.../components/ExploreViewContainer_spec.jsx | 4 +-
.../explore/components/QueryAndSaveBtns_spec.jsx | 2 +-
.../explore/components/SaveModal_spec.jsx | 12 +-
.../explore/components/TextArea_spec.jsx | 4 +-
.../explore/components/VizTypeControl_spec.jsx | 2 +-
.../spec/javascripts/explore/controlUtils_spec.jsx | 130 +-
.../spec/javascripts/explore/fixtures.jsx | 105 +
.../spec/javascripts/explore/store_spec.jsx | 2 +-
.../spec/javascripts/explore/utils_spec.jsx | 4 +-
.../spec/javascripts/messageToasts/.eslintrc | 1 -
.../spec/javascripts/middleware/logger_spec.js | 4 +-
.../spec/javascripts/modules/utils_spec.jsx | 18 +-
.../spec/javascripts/sqllab/QuerySearch_spec.jsx | 6 +-
.../spec/javascripts/sqllab/SouthPane_spec.jsx | 2 +-
.../spec/javascripts/sqllab/SqlEditor_spec.jsx | 10 +-
.../javascripts/sqllab/TabbedSqlEditors_spec.jsx | 2 +-
.../spec/javascripts/sqllab/Timer_spec.jsx | 10 +-
.../utils/getControlsForVizType_spec.js | 3 +-
.../views/CRUD/chart/ChartList_spec.jsx | 4 +-
.../views/CRUD/dashboard/DashboardList_spec.jsx | 6 +-
.../views/CRUD/data/database/DatabaseList_spec.jsx | 126 +
.../CRUD/data/database/DatabaseModal_spec.jsx | 82 +
.../views/CRUD/data/dataset/DatasetList_spec.jsx | 16 +-
.../CRUD/data/savedquery/SavedQueryList_spec.jsx | 176 +
.../views/CRUD/welcome/DashboardTable_spec.tsx | 2 +-
superset-frontend/src/CRUD/CollectionTable.tsx | 67 +-
superset-frontend/src/CRUD/Field.jsx | 4 +-
superset-frontend/src/CRUD/Fieldset.jsx | 6 +-
superset-frontend/src/SqlLab/App.jsx | 2 +-
superset-frontend/src/SqlLab/actions/sqlLab.js | 3 +-
.../src/SqlLab/components/AceEditorWrapper.tsx | 97 +-
superset-frontend/src/SqlLab/components/App.jsx | 12 +-
.../src/SqlLab/components/ColumnElement.tsx | 6 +-
.../SqlLab/components/EstimateQueryCostButton.jsx | 11 +-
.../SqlLab/components/ExploreCtasResultsButton.jsx | 10 +-
.../src/SqlLab/components/ExploreResultsButton.jsx | 23 +-
.../src/SqlLab/components/HighlightedSql.jsx | 16 +-
.../src/SqlLab/components/LimitControl.tsx | 25 +-
.../src/SqlLab/components/QueryAutoRefresh.jsx | 10 +-
.../src/SqlLab/components/QueryHistory.jsx | 2 +-
.../src/SqlLab/components/QuerySearch.jsx | 15 +-
.../src/SqlLab/components/QueryTable.jsx | 45 +-
.../src/SqlLab/components/ResultSet.tsx | 65 +-
.../src/SqlLab/components/RunQueryActionButton.tsx | 19 +-
.../src/SqlLab/components/SaveQuery.jsx | 22 +-
.../src/SqlLab/components/ScheduleQueryButton.jsx | 13 +-
.../src/SqlLab/components/ShareSqlLabQuery.jsx | 6 +-
.../src/SqlLab/components/ShowSQL.tsx | 13 +-
.../src/SqlLab/components/SouthPane.jsx | 8 +-
.../src/SqlLab/components/SqlEditor.jsx | 45 +-
.../src/SqlLab/components/SqlEditorLeftBar.jsx | 29 +-
.../src/SqlLab/components/TabbedSqlEditors.jsx | 44 +-
.../src/SqlLab/components/TableElement.jsx | 35 +-
.../src/SqlLab/components/TemplateParamsEditor.jsx | 25 +-
superset-frontend/src/SqlLab/main.less | 6 +-
.../src/SqlLab/reducers/getInitialState.js | 4 +-
superset-frontend/src/SqlLab/reducers/sqlLab.js | 15 +-
.../src/addSlice/AddSliceContainer.tsx | 51 +-
superset-frontend/src/addSlice/App.tsx | 4 +-
superset-frontend/src/addSlice/index.tsx | 2 +-
superset-frontend/src/chart/Chart.jsx | 3 +-
superset-frontend/src/chart/ChartRenderer.jsx | 3 +-
superset-frontend/src/chart/chartAction.js | 13 +-
superset-frontend/src/chart/chartReducer.js | 5 +-
superset-frontend/src/common/components/Modal.tsx | 128 +
superset-frontend/src/common/components/Tabs.tsx | 62 +
.../src/common/components/common.stories.tsx | 61 +
superset-frontend/src/common/components/index.ts | 2 +-
.../src/components/ActionMenuItem.jsx | 83 -
.../src/components/AlteredSliceTag.jsx | 144 +-
superset-frontend/src/components/AnchorLink.jsx | 2 +-
.../src/components/AsyncAceEditor.tsx | 215 +
.../src/components/AsyncEsmComponent.tsx | 132 +
superset-frontend/src/components/AsyncSelect.jsx | 3 +-
superset-frontend/src/components/AvatarIcon.tsx | 2 +-
.../src/components/Button/Button.stories.jsx | 163 +
.../src/components/Button/Button.test.tsx | 68 +
.../src/components/Button/button.stories.jsx | 165 -
superset-frontend/src/components/Button/index.tsx | 238 +-
superset-frontend/src/components/CachedLabel.jsx | 2 +-
.../src/components/CertifiedIconWithTooltip.tsx | 3 +-
superset-frontend/src/components/Checkbox.tsx | 47 -
.../src/components/Checkbox/Checkbox.stories.jsx | 63 +
.../src/components/Checkbox/Checkbox.test.tsx | 75 +
.../src/components/Checkbox/index.tsx | 54 +
superset-frontend/src/components/CheckboxIcons.tsx | 2 +-
.../src/components/ConfirmStatusChange.tsx | 17 +-
.../src/components/CopyToClipboard.jsx | 2 +-
.../src/components/DatabaseSelector.tsx | 283 +
superset-frontend/src/components/DeleteModal.tsx | 15 +-
superset-frontend/src/components/EditableTitle.tsx | 2 +-
superset-frontend/src/components/ErrorBoundary.jsx | 2 +-
.../ErrorMessage/DatabaseErrorMessage.tsx | 2 +-
.../src/components/ErrorMessage/ErrorAlert.tsx | 15 +-
.../ErrorMessage/ErrorMessageWithStackTrace.tsx | 2 +-
.../src/components/ErrorMessage/IssueCode.tsx | 2 +-
.../ErrorMessage/TimeoutErrorMessage.tsx | 2 +-
.../src/components/ErrorMessage/types.ts | 2 +
.../src/components/ExpandableList.tsx | 4 +-
superset-frontend/src/components/FaveStar.tsx | 4 +-
.../components/FilterableTable/FilterableTable.tsx | 71 +-
superset-frontend/src/components/FlashProvider.tsx | 1 +
superset-frontend/src/components/FormLabel.tsx | 2 +-
superset-frontend/src/components/Hotkeys.jsx | 2 +
.../src/components/Icon/icon.stories.jsx | 6 +-
superset-frontend/src/components/Icon/index.tsx | 318 +-
.../src/components/IndeterminateCheckbox.tsx | 2 +-
.../src/components/Label/Label.stories.tsx | 10 +-
superset-frontend/src/components/Label/index.tsx | 49 +-
superset-frontend/src/components/Link.tsx | 1 -
.../src/components/ListView/ActionsBar.tsx | 92 +
.../src/components/ListView/CardCollection.tsx | 5 +-
.../src/components/ListView/CardSortSelect.tsx | 2 +-
.../src/components/ListView/Filters.tsx | 20 +-
.../src/components/ListView/ListView.tsx | 78 +-
.../src/components/ListView/TableCollection.tsx | 14 +-
superset-frontend/src/components/ListView/types.ts | 8 +-
superset-frontend/src/components/ListView/utils.ts | 28 +-
.../components/ListViewCard/ImageLoader.test.jsx | 10 +-
.../src/components/ListViewCard/ImageLoader.tsx | 20 +-
.../ListViewCard/ListViewCard.stories.tsx | 6 +-
.../src/components/ListViewCard/index.tsx | 14 +-
superset-frontend/src/components/Loading.tsx | 2 +-
.../src/components/Menu/LanguagePicker.tsx | 3 +-
superset-frontend/src/components/Menu/Menu.less | 45 -
superset-frontend/src/components/Menu/Menu.tsx | 187 +-
.../src/components/Menu/MenuObject.tsx | 26 +-
superset-frontend/src/components/Menu/NewMenu.tsx | 15 +-
superset-frontend/src/components/Menu/SubMenu.tsx | 121 +-
superset-frontend/src/components/Menu/UserMenu.tsx | 15 +-
superset-frontend/src/components/Modal.tsx | 15 +-
superset-frontend/src/components/ModalTrigger.jsx | 12 +-
.../src/components/NavDropdown/index.tsx | 72 +
superset-frontend/src/components/OmniContainer.jsx | 5 +-
superset-frontend/src/components/Pagination.tsx | 6 +-
superset-frontend/src/components/Popover/index.tsx | 23 +
.../src/components/RefreshChartOverlay.tsx | 5 +-
superset-frontend/src/components/RefreshLabel.jsx | 1 +
superset-frontend/src/components/SearchInput.tsx | 13 +-
.../src/components/Select/SupersetStyledSelect.tsx | 18 +-
.../Select/WindowedSelect/WindowedMenuList.tsx | 26 +-
.../components/Select/WindowedSelect/windowed.tsx | 9 +-
superset-frontend/src/components/Select/styles.tsx | 28 +-
superset-frontend/src/components/TableLoader.jsx | 5 +-
superset-frontend/src/components/TableSelector.jsx | 445 -
superset-frontend/src/components/TableSelector.tsx | 379 +
superset-frontend/src/components/Timer.tsx | 67 +-
.../src/components/URLShortLinkButton.jsx | 2 +-
.../src/components/URLShortLinkModal.jsx | 2 +-
superset-frontend/src/dashboard/.eslintrc | 3 +-
superset-frontend/src/dashboard/App.jsx | 2 +-
.../src/dashboard/actions/dashboardLayout.js | 2 +-
.../src/dashboard/actions/dashboardState.js | 9 +-
.../src/dashboard/actions/datasources.js | 2 +-
.../src/dashboard/actions/sliceEntities.js | 11 +-
.../src/dashboard/components/AddSliceCard.jsx | 2 +-
.../dashboard/components/BuilderComponentPane.jsx | 5 +-
.../src/dashboard/components/CodeModal.jsx | 4 +-
.../components/ColorSchemeControlWrapper.jsx | 4 +-
.../src/dashboard/components/CssEditor.jsx | 20 +-
.../src/dashboard/components/Dashboard.jsx | 6 +-
.../dashboard/components/DeleteComponentModal.jsx | 6 +-
.../src/dashboard/components/FilterIndicator.jsx | 2 +-
.../dashboard/components/FilterIndicatorGroup.jsx | 2 +-
.../components/FilterIndicatorTooltip.jsx | 3 +-
.../components/FilterIndicatorsContainer.jsx | 3 +-
.../src/dashboard/components/Header.jsx | 56 +-
.../dashboard/components/HeaderActionsDropdown.jsx | 24 +-
.../src/dashboard/components/MissingChart.jsx | 2 +-
.../src/dashboard/components/PropertiesModal.jsx | 31 +-
.../src/dashboard/components/PublishedStatus.jsx | 27 +-
.../dashboard/components/RefreshIntervalModal.jsx | 9 +-
.../src/dashboard/components/SaveModal.jsx | 12 +-
.../src/dashboard/components/SliceAdder.jsx | 17 +-
.../src/dashboard/components/SliceHeader.jsx | 2 +-
.../dashboard/components/SliceHeaderControls.jsx | 8 +-
.../components/filterscope/FilterScopeSelector.jsx | 10 +-
.../dashboard/components/filterscope/treeIcons.jsx | 2 +-
.../components/gridComponents/ChartHolder.jsx | 2 +-
.../dashboard/components/gridComponents/Header.jsx | 2 +-
.../components/gridComponents/Markdown.jsx | 19 +-
.../dashboard/components/gridComponents/Tabs.jsx | 2 +-
.../components/gridComponents/new/NewColumn.jsx | 2 +-
.../components/gridComponents/new/NewDivider.jsx | 2 +-
.../components/gridComponents/new/NewHeader.jsx | 2 +-
.../components/gridComponents/new/NewRow.jsx | 2 +-
.../components/gridComponents/new/NewTabs.jsx | 2 +-
.../components/menu/MarkdownModeDropdown.jsx | 2 +-
.../components/resizable/ResizableContainer.jsx | 2 +-
.../src/dashboard/containers/FilterIndicators.jsx | 4 +-
.../src/dashboard/reducers/dashboardFilters.js | 9 +-
.../src/dashboard/reducers/dashboardState.js | 4 +-
.../src/dashboard/reducers/getInitialState.js | 18 +-
superset-frontend/src/dashboard/reducers/index.js | 2 +-
.../src/dashboard/reducers/sliceEntities.js | 2 +-
.../src/dashboard/stylesheets/buttons.less | 11 -
superset-frontend/src/dashboard/types.ts | 2 +-
.../src/dashboard/util/activeDashboardFilters.js | 2 +-
.../src/dashboard/util/backgroundStyleOptions.ts | 2 +-
.../util/charts/getEffectiveExtraFilters.ts | 2 +-
.../util/charts/getFormDataWithExtraFilters.ts | 6 +-
.../src/dashboard/util/findFirstParentContainer.js | 2 +-
.../dashboard/util/getComponentWidthFromDrop.js | 38 +-
.../src/dashboard/util/getDashboardUrl.js | 10 +-
.../src/dashboard/util/getEmptyLayout.js | 2 +-
.../src/dashboard/util/getFilterFieldNodesTree.js | 2 +-
.../src/dashboard/util/getFilterScopeNodesTree.js | 10 +-
.../src/dashboard/util/headerStyleOptions.ts | 2 +-
.../util/logging/findNonTabChildChartIds.js | 3 +-
.../src/dashboard/util/propShapes.jsx | 2 +-
.../src/datasource/ChangeDatasourceModal.tsx | 12 +-
.../src/datasource/DatasourceEditor.jsx | 364 +-
.../src/datasource/DatasourceModal.tsx | 59 +-
superset-frontend/src/explore/AdhocFilter.js | 5 +-
superset-frontend/src/explore/AdhocMetric.js | 6 +-
superset-frontend/src/explore/App.jsx | 2 +-
.../src/explore/actions/exploreActions.js | 3 +-
.../src/explore/actions/saveModalActions.js | 2 +-
.../explore/components/AdhocFilterEditPopover.jsx | 125 +-
.../AdhocFilterEditPopoverSimpleTabContent.jsx | 16 +-
.../AdhocFilterEditPopoverSqlTabContent.jsx | 60 +-
.../src/explore/components/AdhocFilterOption.jsx | 11 +-
.../explore/components/AdhocMetricEditPopover.jsx | 257 +-
.../src/explore/components/AdhocMetricOption.jsx | 9 +-
.../src/explore/components/Control.jsx | 3 +
.../src/explore/components/ControlHeader.jsx | 11 +-
.../src/explore/components/ControlPanelSection.jsx | 5 +-
.../explore/components/ControlPanelsContainer.jsx | 10 +-
.../src/explore/components/DisplayQueryButton.jsx | 58 +-
.../src/explore/components/EmbedCodeButton.jsx | 6 +-
.../explore/components/ExploreActionButtons.jsx | 8 +-
.../src/explore/components/ExploreChartHeader.jsx | 3 +-
.../src/explore/components/ExploreChartPanel.jsx | 6 +-
.../explore/components/ExploreViewContainer.jsx | 49 +-
.../explore/components/FilterDefinitionOption.jsx | 6 +-
.../explore/components/MetricDefinitionOption.jsx | 6 +-
.../src/explore/components/PropertiesModal.tsx | 71 +-
.../src/explore/components/QueryAndSaveBtns.jsx | 33 +-
.../src/explore/components/RowCountLabel.jsx | 3 +-
.../src/explore/components/SaveModal.jsx | 38 +-
.../components/controls/AdhocFilterControl.jsx | 6 +-
.../components/controls/AnnotationLayer.jsx | 49 +-
.../components/controls/AnnotationLayerControl.jsx | 25 +-
.../explore/components/controls/BoundsControl.jsx | 24 +-
.../components/controls/CheckboxControl.jsx | 2 +
.../components/controls/CollectionControl.jsx | 8 +-
.../components/controls/ColorMapControl.jsx | 2 +-
.../components/controls/ColorPickerControl.jsx | 5 +-
.../components/controls/ColorSchemeControl.jsx | 4 -
.../components/controls/DatasourceControl.jsx | 87 +-
.../components/controls/DatasourceControl.less | 19 +-
.../components/controls/DateFilterControl.jsx | 63 +-
.../components/controls/FilterBoxItemControl.jsx | 15 +-
.../components/controls/FixedOrMetricControl.jsx | 11 +-
.../explore/components/controls/MetricsControl.jsx | 22 +-
.../components/controls/SelectAsyncControl.jsx | 4 +-
.../explore/components/controls/SelectControl.jsx | 8 +-
.../explore/components/controls/SpatialControl.jsx | 153 +-
.../components/controls/TextAreaControl.jsx | 40 +-
.../explore/components/controls/TextControl.tsx | 48 +-
.../controls/TimeSeriesColumnControl.jsx | 18 +-
.../components/controls/ViewportControl.jsx | 5 +
.../explore/components/controls/VizTypeControl.jsx | 7 +-
.../components/controls/withVerification.jsx | 3 +-
superset-frontend/src/explore/constants.js | 2 +-
.../src/explore/controlPanels/DeckArc.js | 12 +-
.../src/explore/controlPanels/DeckGeojson.js | 10 +-
.../src/explore/controlPanels/DeckGrid.js | 3 +-
.../src/explore/controlPanels/DeckHex.js | 4 +-
.../src/explore/controlPanels/DeckMulti.js | 3 +-
.../src/explore/controlPanels/DeckPath.js | 2 +-
.../src/explore/controlPanels/DeckPolygon.js | 4 +-
.../src/explore/controlPanels/DeckScatter.js | 3 +-
.../src/explore/controlPanels/DeckScreengrid.js | 3 +-
.../src/explore/controlPanels/Separator.js | 5 +-
.../src/explore/controlPanels/Shared_DeckGL.jsx | 13 +-
.../src/explore/controlPanels/TimeTable.js | 3 +-
.../src/explore/controlPanels/sections.jsx | 4 +-
superset-frontend/src/explore/controlUtils.js | 38 +-
superset-frontend/src/explore/controls.jsx | 14 +-
superset-frontend/src/explore/dateFilterUtils.ts | 2 +-
superset-frontend/src/explore/exploreUtils.js | 14 +-
superset-frontend/src/explore/main.less | 1 -
.../src/explore/reducers/getInitialState.js | 2 +-
superset-frontend/src/explore/store.js | 4 +-
superset-frontend/src/featureFlags.ts | 5 +
.../src/messageToasts/components/Toast.tsx | 4 +-
.../messageToasts/components/ToastPresenter.tsx | 2 +-
.../src/middleware/loggerMiddleware.js | 4 +-
superset-frontend/src/modules/AnnotationTypes.js | 2 -
superset-frontend/src/modules/utils.js | 37 +-
superset-frontend/src/preamble.ts | 2 +-
superset-frontend/src/profile/App.tsx | 2 +-
superset-frontend/src/profile/components/App.tsx | 2 +-
.../src/profile/components/CreatedContent.tsx | 4 +-
.../src/profile/components/Favorites.tsx | 4 +-
.../src/profile/components/Security.tsx | 2 +-
.../src/profile/components/UserInfo.tsx | 2 +-
superset-frontend/src/reduxUtils.ts | 4 +-
superset-frontend/src/setup/setupApp.ts | 6 +-
superset-frontend/src/setup/setupClient.js | 3 +-
superset-frontend/src/setup/setupColors.js | 20 +-
superset-frontend/src/setup/setupErrorMessages.ts | 8 +
superset-frontend/src/setup/setupFormatters.js | 4 +-
superset-frontend/src/setup/setupPlugins.ts | 2 +-
superset-frontend/src/showSavedQuery/index.jsx | 2 +-
superset-frontend/src/types/brace.d.ts | 28 +
.../src/utils/DebouncedMessageQueue.js | 2 +
superset-frontend/src/utils/common.js | 29 +-
superset-frontend/src/utils/downloadAsImage.ts | 2 +-
.../src/utils/getClientErrorObject.ts | 3 +-
.../src/utils/getControlsForVizType.js | 4 +-
superset-frontend/src/utils/hostNamesConfig.js | 2 +-
superset-frontend/src/views/App.tsx | 24 +-
.../src/views/CRUD/chart/ChartList.tsx | 70 +-
.../src/views/CRUD/dashboard/DashboardList.tsx | 97 +-
superset-frontend/src/views/CRUD/data/common.ts | 8 +-
.../src/views/CRUD/data/database/DatabaseList.tsx | 348 +-
.../src/views/CRUD/data/database/DatabaseModal.tsx | 648 +
.../src/views/CRUD/data/database/types.ts | 54 +
.../views/CRUD/data/dataset/AddDatasetModal.tsx | 17 +-
.../src/views/CRUD/data/dataset/Button.tsx | 72 -
.../src/views/CRUD/data/dataset/DatasetList.tsx | 90 +-
.../views/CRUD/data/savedquery/SavedQueryList.tsx | 452 +
superset-frontend/src/views/CRUD/hooks.ts | 132 +-
superset-frontend/src/views/CRUD/utils.tsx | 13 +-
.../src/views/CRUD/welcome/DashboardTable.tsx | 42 +-
.../src/views/CRUD/welcome/Welcome.tsx | 32 +-
superset-frontend/src/views/menu.tsx | 2 +-
.../src/visualizations/FilterBox/FilterBox.jsx | 55 +-
.../FilterBox/FilterBoxChartPlugin.js | 3 +-
.../src/visualizations/FilterBox/controlPanel.jsx | 2 +-
.../visualizations/TimeTable/FormattedNumber.jsx | 2 +-
.../src/visualizations/TimeTable/SparklineCell.jsx | 3 +-
.../src/visualizations/TimeTable/TimeTable.jsx | 219 +-
.../TimeTable/TimeTableChartPlugin.js | 3 +-
.../src/visualizations/presets/MainPreset.js | 8 +-
.../stylesheets/less/cosmo/bootswatch.less | 2 +-
.../stylesheets/less/cosmo/cosmoTheme.js | 59 +-
superset-frontend/stylesheets/superset.less | 30 +-
superset-frontend/webpack.config.js | 78 +-
superset/__init__.py | 2 +-
superset/app.py | 63 +-
.../SqlLab/components/ExploreCtasResultsButton.jsx | 6 +-
{tests/util => superset/cachekeys}/__init__.py | 0
superset/cachekeys/api.py | 123 +
superset/cachekeys/schemas.py | 45 +
superset/charts/api.py | 62 +-
superset/charts/dao.py | 1 -
superset/charts/filters.py | 22 +-
superset/charts/schemas.py | 19 +-
superset/cli.py | 12 +-
superset/common/query_context.py | 31 +-
superset/config.py | 21 +-
superset/connectors/base/models.py | 2 +-
superset/connectors/base/views.py | 15 +
superset/connectors/connector_registry.py | 1 -
superset/connectors/druid/views.py | 17 +-
superset/connectors/sqla/models.py | 39 +-
superset/connectors/sqla/views.py | 66 +-
{tests/util => superset/css_templates}/__init__.py | 0
superset/css_templates/api.py | 133 +
.../css_templates/commands}/__init__.py | 0
superset/css_templates/commands/bulk_delete.py | 53 +
superset/css_templates/commands/exceptions.py | 27 +
superset/css_templates/dao.py | 45 +
superset/css_templates/filters.py | 40 +
superset/css_templates/schemas.py | 33 +
superset/dao/base.py | 4 +-
superset/dashboards/api.py | 52 +-
superset/dashboards/dao.py | 2 +-
superset/dashboards/filters.py | 13 +
superset/databases/api.py | 514 +-
.../databases/commands}/__init__.py | 0
superset/databases/commands/create.py | 84 +
superset/databases/commands/delete.py | 58 +
superset/databases/commands/exceptions.py | 116 +
superset/databases/commands/test_connection.py | 66 +
superset/databases/commands/update.py | 87 +
superset/databases/dao.py | 90 +
superset/{views/database => databases}/filters.py | 0
superset/databases/schemas.py | 324 +
superset/databases/utils.py | 103 +
superset/datasets/api.py | 83 +-
superset/datasets/commands/bulk_delete.py | 88 +
superset/datasets/commands/create.py | 4 +-
superset/datasets/commands/delete.py | 31 +-
superset/datasets/commands/exceptions.py | 4 +
superset/datasets/dao.py | 38 +-
superset/datasets/schemas.py | 1 +
superset/db_engine_specs/athena.py | 3 +-
superset/db_engine_specs/base.py | 30 +-
superset/db_engine_specs/bigquery.py | 1 -
superset/db_engine_specs/drill.py | 3 +-
superset/db_engine_specs/druid.py | 6 +-
superset/db_engine_specs/gsheets.py | 2 +-
superset/db_engine_specs/hana.py | 3 +-
superset/db_engine_specs/hive.py | 9 +-
superset/db_engine_specs/kylin.py | 3 +-
superset/db_engine_specs/mssql.py | 8 +-
superset/db_engine_specs/mysql.py | 7 +-
superset/db_engine_specs/oracle.py | 6 +-
superset/db_engine_specs/pinot.py | 4 +-
superset/db_engine_specs/postgres.py | 4 +-
superset/db_engine_specs/presto.py | 64 +-
superset/db_engine_specs/snowflake.py | 2 +-
superset/db_engine_specs/sqlite.py | 2 +-
superset/db_engines/hive.py | 10 +-
superset/errors.py | 32 +
superset/examples/birth_names.py | 2 +-
superset/exceptions.py | 4 +
superset/extensions.py | 4 +-
superset/jinja_context.py | 29 +-
.../versions/175ea3592453_cache_lookup.py | 53 +
...d70ab98_fix_table_unique_constraint_in_mysql.py | 50 +
.../versions/2e5a0ee25ed4_refractor_alerting.py | 125 +
...654_fix_data_access_permissions_for_virtual_.py | 224 +
superset/migrations/versions/ae19b4ee3692_.py | 35 +
...828ac4e_add_rls_filter_type_and_grouping_key.py | 58 +
superset/models/alerts.py | 142 +-
superset/models/cache.py | 32 +
superset/models/core.py | 19 +-
superset/models/dashboard.py | 50 +-
superset/models/datasource_access_request.py | 8 +-
superset/models/helpers.py | 64 +-
superset/models/slice.py | 8 +-
superset/models/sql_lab.py | 11 +-
superset/models/tags.py | 23 +-
.../queries/saved_queries}/__init__.py | 0
superset/queries/saved_queries/api.py | 181 +
.../queries/saved_queries/commands}/__init__.py | 0
.../queries/saved_queries/commands/bulk_delete.py | 53 +
.../queries/saved_queries/commands/exceptions.py | 27 +
superset/queries/saved_queries/dao.py | 47 +
superset/queries/saved_queries/filters.py | 70 +
superset/queries/saved_queries/schemas.py | 33 +
superset/security/manager.py | 50 +-
superset/sql_lab.py | 48 +-
superset/sql_validators/presto_db.py | 7 +-
superset/stats_logger.py | 1 -
superset/tasks/{ => alerts}/__init__.py | 0
superset/tasks/alerts/observer.py | 103 +
superset/tasks/alerts/validator.py | 111 +
superset/tasks/schedules.py | 403 +-
superset/templates/email/alert.txt | 6 +-
superset/templates/slack/alert.txt | 4 +-
superset/templates/slack/alert_no_screenshot.txt | 4 +-
superset/templates/superset/add_slice.html | 2 +-
superset/templates/superset/dashboard.html | 9 +
superset/templates/superset/import_dashboards.html | 3 +-
superset/templates/superset/models/rls/list.html | 96 +
superset/translations/babel.cfg | 2 +
superset/translations/es/LC_MESSAGES/messages.json | 2359 +-
superset/translations/es/LC_MESSAGES/messages.po | 7973 ++++--
superset/translations/messages.pot | 2172 +-
superset/utils/cache.py | 3 +-
superset/utils/cache_manager.py | 28 +-
superset/utils/celery.py | 57 +
superset/utils/core.py | 6 +-
superset/utils/decorators.py | 28 +-
superset/utils/log.py | 1 -
superset/utils/logging_configurator.py | 6 +-
superset/utils/machine_auth.py | 1 -
superset/utils/pandas_postprocessing.py | 13 +-
superset/utils/screenshots.py | 5 +-
superset/utils/webdriver.py | 1 -
superset/views/alerts.py | 225 +-
superset/views/base_api.py | 66 +-
superset/views/chart/views.py | 16 +-
superset/views/core.py | 136 +-
superset/views/database/mixins.py | 6 +-
superset/views/database/validators.py | 14 +-
superset/views/database/views.py | 6 +-
superset/views/sql_lab.py | 14 +-
superset/views/utils.py | 75 +-
superset/viz.py | 114 +-
superset/viz_sip38.py | 24 +-
tests/alerts_tests.py | 375 +-
tests/base_api_tests.py | 1 +
tests/base_tests.py | 73 +-
tests/{util => cachekeys}/__init__.py | 0
tests/cachekeys/api_tests.py | 163 +
tests/celery_tests.py | 903 +-
tests/charts/api_tests.py | 135 +-
tests/core_tests.py | 102 +-
tests/{util => css_templates}/__init__.py | 0
tests/css_templates/api_tests.py | 356 +
tests/dashboards/api_tests.py | 151 +-
tests/database_api_tests.py | 268 -
tests/{util => databases}/__init__.py | 0
tests/databases/api_tests.py | 791 +
tests/datasets/api_tests.py | 186 +-
tests/pandas_postprocessing_tests.py | 28 +-
tests/{util => queries/saved_queries}/__init__.py | 0
tests/queries/saved_queries/api_tests.py | 630 +
tests/query_context_tests.py | 5 +-
tests/schedules_test.py | 6 +-
tests/security_tests.py | 190 +-
tests/sqla_models_tests.py | 54 +-
tests/sqllab_tests.py | 22 +
tests/superset_test_config.py | 16 +-
tests/superset_test_config_thumbnails.py | 23 +-
tests/superset_test_custom_template_processors.py | 2 +-
tests/utils_tests.py | 40 +-
tests/viz_tests.py | 57 -
tox.ini | 9 +-
1000 files changed, 62905 insertions(+), 17704 deletions(-)
create mode 100644 .editorconfig
create mode 100644 .github/ISSUE_TEMPLATE/security_vulnerability.md
delete mode 100644 .github/prlint.json
create mode 100644 .github/workflows/pr-lint.yml
create mode 100644 .github/workflows/prefer-typescript.yml
delete mode 100644 .github/workflows/prefer_typescript.yml
delete mode 100644 .github/workflows/superset-docker.yml
create mode 100644 .github/workflows/superset-docs.yml
create mode 100644 .github/workflows/test-docker.yml
create mode 100644 .github/workflows/test-hive.yml
create mode 100644 .github/workflows/test-presto.yml
create mode 100644 docs/.eslintrc.js
create mode 100644 docs/.gitignore
create mode 100644 docs/.htaccess
rename {superset-frontend => docs}/.prettierrc (100%)
delete mode 100644 docs/Makefile
create mode 100644 docs/README.md
delete mode 100644 docs/_static/docs.css
delete mode 120000 docs/_static/images
delete mode 100644 docs/admintutorial.rst
delete mode 100755 docs/build.sh
delete mode 100644 docs/conf.py
create mode 100644 docs/doczrc.js
delete mode 100644 docs/druid.rst
delete mode 100644 docs/faq.rst
delete mode 100644 docs/gallery.rst
create mode 100644 docs/gatsby-config.js
create mode 100644 docs/gatsby-node.js
delete mode 100644 docs/import_export_datasources.rst
delete mode 100644 docs/index.rst
delete mode 100644 docs/issue_code_reference.rst
delete mode 100644 docs/misc.rst
create mode 100644 docs/package-lock.json
create mode 100644 docs/package.json
create mode 100644 docs/prettier.config.js
copy tests/util/__init__.py => docs/requirements.txt (100%)
delete mode 100644 docs/security.rst
create mode 100644 docs/src/components/AnchorNavigator.tsx
create mode 100644 docs/src/components/DbImage.tsx
create mode 100644 docs/src/components/DoczMenu.tsx
create mode 100644 docs/src/components/MainMenu.tsx
create mode 100644 docs/src/components/footer.tsx
create mode 100644 docs/src/components/image.tsx
create mode 100644 docs/src/components/layout.scss
create mode 100644 docs/src/components/layout.tsx
create mode 100644 docs/src/components/next.tsx
create mode 100644 docs/src/components/select.tsx
create mode 100644 docs/src/components/seo.js
create mode 100644 docs/src/gatsby-theme-docz/index.tsx
copy superset-frontend/branding/superset-logo-horiz-apache.png => docs/src/images/apacheSupersetHoriz.png (100%)
create mode 100644 docs/src/images/dashboard.png
create mode 100644 docs/src/images/databases/apache-drill.png
create mode 100644 docs/src/images/databases/apache-druid.jpeg
copy superset-frontend/images/druid.png => docs/src/images/databases/apache-druid.png (100%)
create mode 100644 docs/src/images/databases/apache-hive.svg
create mode 100644 docs/src/images/databases/apache-impala.png
copy {superset-frontend/images => docs/src/images/databases}/apache-kylin.png (100%)
copy superset-frontend/images/redshift.png => docs/src/images/databases/aws-redshift.png (100%)
copy {superset-frontend/images => docs/src/images/databases}/clickhouse.png (100%)
create mode 100644 docs/src/images/databases/druid.png
copy {superset-frontend/images => docs/src/images/databases}/exasol.png (100%)
copy {superset-frontend/images => docs/src/images/databases}/firebird.png (100%)
copy superset-frontend/images/google-biquery.png => docs/src/images/databases/googleBQ.png (100%)
create mode 100644 docs/src/images/databases/greenplum.jpeg
copy {superset-frontend/images => docs/src/images/databases}/greenplum.png (100%)
create mode 100644 docs/src/images/databases/ibmdb2.png
copy superset-frontend/images/monet-db.png => docs/src/images/databases/monet.png (100%)
copy superset-frontend/images/mssql-server.png => docs/src/images/databases/msql.png (100%)
copy {superset-frontend/images => docs/src/images/databases}/mysql.png (100%)
create mode 100644 docs/src/images/databases/oracle-logo.png
copy {superset-frontend/images => docs/src/images/databases}/oracle.png (100%)
create mode 100644 docs/src/images/databases/oraclelogo.png
create mode 100644 docs/src/images/databases/postgresql.jpg
create mode 100644 docs/src/images/databases/postsql.png
copy superset-frontend/images/presto.png => docs/src/images/databases/presto-og.png (100%)
copy {superset-frontend/images => docs/src/images/databases}/snowflake.png (100%)
create mode 100644 docs/src/images/databases/sqllite.jpg
create mode 100644 docs/src/images/databases/sqllite.png
copy {superset-frontend/images => docs/src/images/databases}/vertica.png (100%)
create mode 100644 docs/src/images/docker.png
create mode 100644 docs/src/images/explorer.png
copy {superset-frontend => docs/src}/images/favicon.png (100%)
create mode 100644 docs/src/images/gallery/bubble.png
create mode 100644 docs/src/images/gallery/chord_diagram.png
create mode 100644 docs/src/images/gallery/community.png
create mode 100644 docs/src/images/gallery/dashboard_editor.png
create mode 100644 docs/src/images/gallery/dashboard_list.png
create mode 100644 docs/src/images/gallery/dashboard_properties.png
create mode 100644 docs/src/images/gallery/deck_arc.png
create mode 100644 docs/src/images/gallery/deck_hex.png
create mode 100644 docs/src/images/gallery/deck_path.png
create mode 100644 docs/src/images/gallery/deck_polygon.png
create mode 100644 docs/src/images/gallery/deck_scatter.png
copy {superset-frontend/images/screenshots => docs/src/images/gallery}/deckgl_dash.png (100%)
create mode 100644 docs/src/images/gallery/explore.png
create mode 100644 docs/src/images/gallery/force_layout.png
create mode 100644 docs/src/images/gallery/france.png
create mode 100644 docs/src/images/gallery/girl_names.png
create mode 100644 docs/src/images/gallery/heatmap.png
create mode 100644 docs/src/images/gallery/pino_geo.png
create mode 100644 docs/src/images/gallery/sankey.png
create mode 100644 docs/src/images/gallery/slack.png
create mode 100644 docs/src/images/gallery/sqllab.png
create mode 100644 docs/src/images/gallery/storm.png
create mode 100644 docs/src/images/gallery/stream.png
create mode 100644 docs/src/images/gallery/table.png
create mode 100644 docs/src/images/gallery/treemap.png
copy {superset-frontend/images/screenshots => docs/src/images/gallery}/visualizations.png (100%)
create mode 100644 docs/src/images/gallery/worldbank_dashboard.png
create mode 100644 docs/src/images/incubator.png
create mode 100644 docs/src/images/preset.png
create mode 100644 docs/src/images/preset.svg
copy {superset-frontend => docs/src}/images/s.png (100%)
create mode 100644 docs/src/images/stack_overflow.png
copy {superset-frontend/branding => docs/src/images}/superset-logo-horiz-apache.svg (100%)
create mode 100644 docs/src/images/superset-logo-horiz.svg
create mode 100644 docs/src/pages/404.jsx
create mode 100644 docs/src/pages/community.tsx
create mode 100644 docs/src/pages/docs/Connecting to Databases/athena.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/clickhouse.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/cockroachdb.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/docker-add-drivers.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/dremio.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/drill.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/druid.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/elasticsearch.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/exasol.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/extra-settings.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/google-bigquery.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/google-sheets.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/hana.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/hive.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/ibm-db2.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/impala.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/index.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/kylin.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/mysql.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/oracle.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/pinot.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/postgres.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/presto.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/redshift.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/snowflake.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/spark-sql.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/sql-server.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/teradata.mdx
create mode 100644 docs/src/pages/docs/Connecting to Databases/vertica.mdx
create mode 100644 docs/src/pages/docs/Creating Charts and Dashboards/exploring-data.mdx
create mode 100644 docs/src/pages/docs/Creating Charts and Dashboards/index.mdx
create mode 100644 docs/src/pages/docs/Miscellaneous/importing-exporting.mdx
create mode 100644 docs/src/pages/docs/Miscellaneous/index.mdx
create mode 100644 docs/src/pages/docs/Miscellaneous/issue_codes.mdx
create mode 100644 docs/src/pages/docs/contributing-page.mdx
create mode 100644 docs/src/pages/docs/frequently-asked-questions-page.mdx
create mode 100644 docs/src/pages/docs/installation/async_queries_celery.mdx
create mode 100644 docs/src/pages/docs/installation/building-viz-plugins.mdx
create mode 100644 docs/src/pages/docs/installation/caching.mdx
create mode 100644 docs/src/pages/docs/installation/configuring.mdx
create mode 100644 docs/src/pages/docs/installation/email_reports.mdx
create mode 100644 docs/src/pages/docs/installation/event-logging-page.mdx
create mode 100644 docs/src/pages/docs/installation/index.mdx
create mode 100644 docs/src/pages/docs/installation/installing_scratch.mdx
create mode 100644 docs/src/pages/docs/installation/networking_settings.mdx
create mode 100644 docs/src/pages/docs/installation/sql_templating.mdx
create mode 100644 docs/src/pages/docs/installation/upgrading_superset.mdx
create mode 100644 docs/src/pages/docs/introduction.mdx
create mode 100644 docs/src/pages/docs/roadmap-page.mdx
create mode 100644 docs/src/pages/docs/security-page.mdx
create mode 100644 docs/src/pages/gallery.tsx
create mode 100644 docs/src/pages/index.tsx
create mode 100644 docs/src/pages/resources.tsx
create mode 100644 docs/src/resources/data.js
create mode 100644 docs/src/utils.js
copy {superset-frontend/images/usertutorial => docs/static/images}/add_new_chart.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/advanced_analytics_base.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/annotation.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/annotation_settings.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/average_aggregate_for_cost.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/blue_bar_insert_component.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/chose_a_datasource.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/csv_to_database_configuration.png (100%)
create mode 100644 docs/static/images/dashboard.png
create mode 100644 docs/static/images/dashboard2.png
create mode 100644 docs/static/images/dashboard3.png
create mode 100644 docs/static/images/data-point.jpg
copy {superset-frontend/images/usertutorial => docs/static/images}/edit-record.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/edit_annotation.png (100%)
create mode 100644 docs/static/images/explorer.png
create mode 100644 docs/static/images/explorer2.png
create mode 100644 docs/static/images/explorer3.png
create mode 100644 docs/static/images/explorer4.png
copy {superset-frontend/images/usertutorial => docs/static/images}/filter_on_origin_country.png (100%)
create mode 100644 docs/static/images/google-analytics.png
copy {superset-frontend/images/usertutorial => docs/static/images}/markdown.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/no_filter_on_time_filter.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/parse_dates_column.png (100%)
create mode 100644 docs/static/images/pie-chart.png
create mode 100644 docs/static/images/plugin-1-yeoman-select.png
create mode 100644 docs/static/images/plugin-10-hello-thumbnail.png
create mode 100644 docs/static/images/plugin-11-explore-view.png
create mode 100644 docs/static/images/plugin-12-console-logs.png
create mode 100644 docs/static/images/plugin-2-yeoman-package-name.png
create mode 100644 docs/static/images/plugin-3-yeoman-description.png
create mode 100644 docs/static/images/plugin-4-yeoman-component-type.png
create mode 100644 docs/static/images/plugin-5-yeoman-timeseries.png
create mode 100644 docs/static/images/plugin-6-yeoman-badges.png
create mode 100644 docs/static/images/plugin-7-yeoman-files.png
create mode 100644 docs/static/images/plugin-8-package-json.png
create mode 100644 docs/static/images/plugin-9-mainpreset-import.png
create mode 100644 docs/static/images/plugin-9-mainpreset-register.png
copy {superset-frontend/images/usertutorial => docs/static/images}/publish_dashboard.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/resample.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/resize_tutorial_table_on_dashboard.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/rolling_mean.png (100%)
create mode 100644 docs/static/images/root-cert-example.png
copy {superset-frontend/images/usertutorial => docs/static/images}/save_tutorial_table.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/select_dates_pivot_table.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/select_table_visualization_type.png (100%)
create mode 100644 docs/static/images/so-icon.svg
create mode 100644 docs/static/images/sqllab.png
create mode 100644 docs/static/images/sqllab0.png
create mode 100644 docs/static/images/sqllab1.png
create mode 100644 docs/static/images/sqllab3.png
copy {superset-frontend/images/usertutorial => docs/static/images}/sum_cost_column.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/time_comparison_absolute_difference.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/time_comparison_two_series.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_01_sources_database.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_02_add_database.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_03_database_name.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_04_sqlalchemy_connection_string.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_05_connection_popup.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_06_list_of_tables.png (100%)
copy superset-frontend/images/tutorial/tutorial_07_save_button.png => docs/static/images/tutorial_07_save_button (1).png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_07_save_button.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_08_sources_tables.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_09_add_new_table.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_10_table_name.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_11_choose_db.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_12_table_creation_success_msg.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_13_edit_table_config.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_14_field_config.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_15_click_table_name.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_16_datasource_chart_type.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_17_choose_time_range.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_18_choose_metric.png (100%)
copy superset-frontend/images/tutorial/tutorial_19_click_query.png => docs/static/images/tutorial_19_click_query (1).png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_19_click_query.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_20_count_star_result.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_21_group_by.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_22_group_by_result.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_23_group_by_more_dimensions.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_24_max_metric.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_25_max_temp_filter.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_26_row_limit.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_27_top_10_max_temps.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_28_bar_chart.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_29_bar_chart_series_metrics.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_30_bar_chart_results.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_31_save_slice_to_dashboard.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_32_save_slice_confirmation.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_33_dashboard.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_34_weather_dashboard.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_35_slice_on_dashboard.png (100%)
copy {superset-frontend/images/tutorial => docs/static/images}/tutorial_36_adjust_dimensions.gif (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/tutorial_line_chart.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/tutorial_pivot_table.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/tutorial_table.png (100%)
copy {superset-frontend/images/usertutorial => docs/static/images}/upload_a_csv.png (100%)
create mode 100644 docs/static/images/youtube.png
delete mode 100644 docs/tutorials.rst
delete mode 100644 docs/usertutorial.rst
delete mode 100644 docs/videos.rst
delete mode 100644 docs/visualization.rst
create mode 100644 package-lock.json
delete mode 100644 requirements/documentation.in
delete mode 100644 requirements/documentation.txt
create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/card_view.test.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/chart_list.helper.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/filter.test.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/chart_list/list_view.test.ts
delete mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.js
create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/dashboard.helper.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard/markdown.test.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/card_view.test.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/dashboard_list.helper.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/filter.test.ts
create mode 100644 superset-frontend/cypress-base/cypress/integration/dashboard_list/list_view.test.ts
delete mode 100644 superset-frontend/cypress-base/cypress/integration/sqllab/query.test.js
create mode 100644 superset-frontend/cypress-base/cypress/integration/sqllab/query.test.ts
create mode 100644 superset-frontend/images/icons/alert.svg
create mode 100644 superset-frontend/images/icons/alert_solid.svg
create mode 100644 superset-frontend/images/icons/binoculars.svg
create mode 100644 superset-frontend/images/icons/bolt.svg
create mode 100644 superset-frontend/images/icons/bolt_small.svg
create mode 100644 superset-frontend/images/icons/bolt_small_run.svg
create mode 100644 superset-frontend/images/icons/calendar.svg
create mode 100644 superset-frontend/images/icons/cancel.svg
create mode 100644 superset-frontend/images/icons/cancel_solid.svg
rename superset-frontend/images/icons/{card-view.svg => card_view.svg} (100%)
create mode 100644 superset-frontend/images/icons/cards.svg
create mode 100644 superset-frontend/images/icons/cards_locked.svg
create mode 100644 superset-frontend/images/icons/caret_down.svg
create mode 100644 superset-frontend/images/icons/caret_left.svg
create mode 100644 superset-frontend/images/icons/caret_right.svg
create mode 100644 superset-frontend/images/icons/caret_up.svg
delete mode 100644 superset-frontend/images/icons/circle-check.svg
create mode 100644 superset-frontend/images/icons/circle.svg
create mode 100644 superset-frontend/images/icons/circle_check.svg
rename superset-frontend/images/icons/{circle-check-solid.svg => circle_check_solid.svg} (100%)
create mode 100644 superset-frontend/images/icons/clock.svg
create mode 100644 superset-frontend/images/icons/code.svg
create mode 100644 superset-frontend/images/icons/cog.svg
create mode 100644 superset-frontend/images/icons/collapse.svg
create mode 100644 superset-frontend/images/icons/color_palette.svg
create mode 100644 superset-frontend/images/icons/components.svg
create mode 100644 superset-frontend/images/icons/copy.svg
create mode 100644 superset-frontend/images/icons/cursor_target.svg
create mode 100644 superset-frontend/images/icons/database.svg
create mode 100644 superset-frontend/images/icons/dataset_virtual_greyscale.svg
create mode 100644 superset-frontend/images/icons/download.svg
create mode 100644 superset-frontend/images/icons/edit.svg
rename superset-frontend/images/icons/{pencil.svg => edit_alt.svg} (100%)
create mode 100644 superset-frontend/images/icons/email.svg
copy superset-frontend/images/icons/{error.svg => error_solid.svg} (100%)
create mode 100644 superset-frontend/images/icons/error_solid_small.svg
create mode 100644 superset-frontend/images/icons/expand.svg
create mode 100644 superset-frontend/images/icons/eye.svg
create mode 100644 superset-frontend/images/icons/eye_slash.svg
create mode 100644 superset-frontend/images/icons/favorite_small_selected.svg
create mode 100644 superset-frontend/images/icons/field_abc.svg
create mode 100644 superset-frontend/images/icons/field_boolean.svg
create mode 100644 superset-frontend/images/icons/field_date.svg
create mode 100644 superset-frontend/images/icons/field_derived.svg
create mode 100644 superset-frontend/images/icons/field_num.svg
create mode 100644 superset-frontend/images/icons/field_struct.svg
create mode 100644 superset-frontend/images/icons/file.svg
create mode 100644 superset-frontend/images/icons/filter.svg
create mode 100644 superset-frontend/images/icons/folder.svg
create mode 100644 superset-frontend/images/icons/full.svg
create mode 100644 superset-frontend/images/icons/gear.svg
create mode 100644 superset-frontend/images/icons/grid.svg
create mode 100644 superset-frontend/images/icons/image.svg
create mode 100644 superset-frontend/images/icons/info-solid.svg
create mode 100644 superset-frontend/images/icons/info.svg
create mode 100644 superset-frontend/images/icons/info_solid_small.svg
create mode 100644 superset-frontend/images/icons/join.svg
create mode 100644 superset-frontend/images/icons/keyboard.svg
create mode 100644 superset-frontend/images/icons/layers.svg
create mode 100644 superset-frontend/images/icons/lightbulb.svg
create mode 100644 superset-frontend/images/icons/list.svg
rename superset-frontend/images/icons/{list-view.svg => list_view.svg} (100%)
create mode 100644 superset-frontend/images/icons/location.svg
create mode 100644 superset-frontend/images/icons/lock_locked.svg
create mode 100644 superset-frontend/images/icons/lock_unlocked.svg
create mode 100644 superset-frontend/images/icons/map.svg
create mode 100644 superset-frontend/images/icons/message.svg
create mode 100644 superset-frontend/images/icons/minus.svg
create mode 100644 superset-frontend/images/icons/minus_solid.svg
rename superset-frontend/images/icons/{more.svg => more_horiz.svg} (100%)
create mode 100644 superset-frontend/images/icons/move.svg
create mode 100644 superset-frontend/images/icons/nav_charts.svg
create mode 100644 superset-frontend/images/icons/nav_dashboard.svg
create mode 100644 superset-frontend/images/icons/nav_data.svg
rename superset-frontend/images/icons/{compass.svg => nav_explore.svg} (100%)
create mode 100644 superset-frontend/images/icons/nav_home.svg
create mode 100644 superset-frontend/images/icons/nav_lab.svg
create mode 100644 superset-frontend/images/icons/note.svg
create mode 100644 superset-frontend/images/icons/paperclip.svg
create mode 100644 superset-frontend/images/icons/placeholder.svg
create mode 100644 superset-frontend/images/icons/plus.svg
create mode 100644 superset-frontend/images/icons/plus_large.svg
create mode 100644 superset-frontend/images/icons/plus_small.svg
create mode 100644 superset-frontend/images/icons/plus_solid.svg
create mode 100644 superset-frontend/images/icons/refresh.svg
create mode 100644 superset-frontend/images/icons/server.svg
rename superset-frontend/images/icons/{sort-asc.svg => sort_asc.svg} (100%)
rename superset-frontend/images/icons/{sort-desc.svg => sort_desc.svg} (100%)
create mode 100644 superset-frontend/images/icons/sql.svg
create mode 100644 superset-frontend/images/icons/table.svg
create mode 100644 superset-frontend/images/icons/tag.svg
create mode 100644 superset-frontend/images/icons/triangle_change.svg
create mode 100644 superset-frontend/images/icons/triangle_down.svg
create mode 100644 superset-frontend/images/icons/triangle_up.svg
create mode 100644 superset-frontend/images/icons/up-level.svg
create mode 100644 superset-frontend/images/icons/user.svg
copy superset-frontend/images/icons/{warning.svg => warning_solid.svg} (100%)
create mode 100644 superset-frontend/images/icons/x-large.svg
create mode 100644 superset-frontend/images/icons/x-small.svg
create mode 100644 superset-frontend/images/screenshots/gallery.png
create mode 100644 superset-frontend/prettier.config.js
delete mode 100644 superset-frontend/spec/javascripts/components/Checkbox_spec.jsx
create mode 100644 superset-frontend/spec/javascripts/components/SubMenu_spec.jsx
create mode 100644 superset-frontend/spec/javascripts/components/fixtures/AlteredSliceTag.js
create mode 100644 superset-frontend/spec/javascripts/explore/fixtures.jsx
create mode 100644 superset-frontend/spec/javascripts/views/CRUD/data/database/DatabaseModal_spec.jsx
create mode 100644 superset-frontend/spec/javascripts/views/CRUD/data/savedquery/SavedQueryList_spec.jsx
create mode 100644 superset-frontend/src/common/components/Modal.tsx
create mode 100644 superset-frontend/src/common/components/Tabs.tsx
create mode 100644 superset-frontend/src/common/components/common.stories.tsx
delete mode 100644 superset-frontend/src/components/ActionMenuItem.jsx
create mode 100644 superset-frontend/src/components/AsyncAceEditor.tsx
create mode 100644 superset-frontend/src/components/AsyncEsmComponent.tsx
create mode 100644 superset-frontend/src/components/Button/Button.stories.jsx
create mode 100644 superset-frontend/src/components/Button/Button.test.tsx
delete mode 100644 superset-frontend/src/components/Button/button.stories.jsx
delete mode 100644 superset-frontend/src/components/Checkbox.tsx
create mode 100644 superset-frontend/src/components/Checkbox/Checkbox.stories.jsx
create mode 100644 superset-frontend/src/components/Checkbox/Checkbox.test.tsx
create mode 100644 superset-frontend/src/components/Checkbox/index.tsx
create mode 100644 superset-frontend/src/components/DatabaseSelector.tsx
create mode 100644 superset-frontend/src/components/ListView/ActionsBar.tsx
delete mode 100644 superset-frontend/src/components/Menu/Menu.less
create mode 100644 superset-frontend/src/components/NavDropdown/index.tsx
create mode 100644 superset-frontend/src/components/Popover/index.tsx
delete mode 100644 superset-frontend/src/components/TableSelector.jsx
create mode 100644 superset-frontend/src/components/TableSelector.tsx
create mode 100644 superset-frontend/src/types/brace.d.ts
create mode 100644 superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
create mode 100644 superset-frontend/src/views/CRUD/data/database/types.ts
delete mode 100644 superset-frontend/src/views/CRUD/data/dataset/Button.tsx
create mode 100644 superset-frontend/src/views/CRUD/data/savedquery/SavedQueryList.tsx
copy {tests/util => superset/cachekeys}/__init__.py (100%)
create mode 100644 superset/cachekeys/api.py
create mode 100644 superset/cachekeys/schemas.py
copy {tests/util => superset/css_templates}/__init__.py (100%)
create mode 100644 superset/css_templates/api.py
copy {tests/util => superset/css_templates/commands}/__init__.py (100%)
create mode 100644 superset/css_templates/commands/bulk_delete.py
create mode 100644 superset/css_templates/commands/exceptions.py
create mode 100644 superset/css_templates/dao.py
create mode 100644 superset/css_templates/filters.py
create mode 100644 superset/css_templates/schemas.py
copy {tests/util => superset/databases/commands}/__init__.py (100%)
create mode 100644 superset/databases/commands/create.py
create mode 100644 superset/databases/commands/delete.py
create mode 100644 superset/databases/commands/exceptions.py
create mode 100644 superset/databases/commands/test_connection.py
create mode 100644 superset/databases/commands/update.py
create mode 100644 superset/databases/dao.py
rename superset/{views/database => databases}/filters.py (100%)
create mode 100644 superset/databases/utils.py
create mode 100644 superset/datasets/commands/bulk_delete.py
create mode 100644 superset/migrations/versions/175ea3592453_cache_lookup.py
create mode 100644 superset/migrations/versions/18532d70ab98_fix_table_unique_constraint_in_mysql.py
create mode 100644 superset/migrations/versions/2e5a0ee25ed4_refractor_alerting.py
create mode 100644 superset/migrations/versions/3fbbc6e8d654_fix_data_access_permissions_for_virtual_.py
create mode 100644 superset/migrations/versions/ae19b4ee3692_.py
create mode 100644 superset/migrations/versions/e5ef6828ac4e_add_rls_filter_type_and_grouping_key.py
create mode 100755 superset/models/cache.py
copy {tests/util => superset/queries/saved_queries}/__init__.py (100%)
create mode 100644 superset/queries/saved_queries/api.py
copy {tests/util => superset/queries/saved_queries/commands}/__init__.py (100%)
create mode 100644 superset/queries/saved_queries/commands/bulk_delete.py
create mode 100644 superset/queries/saved_queries/commands/exceptions.py
create mode 100644 superset/queries/saved_queries/dao.py
create mode 100644 superset/queries/saved_queries/filters.py
create mode 100644 superset/queries/saved_queries/schemas.py
copy superset/tasks/{ => alerts}/__init__.py (100%)
create mode 100644 superset/tasks/alerts/observer.py
create mode 100644 superset/tasks/alerts/validator.py
create mode 100644 superset/templates/superset/models/rls/list.html
create mode 100644 superset/utils/celery.py
copy tests/{util => cachekeys}/__init__.py (100%)
create mode 100644 tests/cachekeys/api_tests.py
copy tests/{util => css_templates}/__init__.py (100%)
create mode 100644 tests/css_templates/api_tests.py
delete mode 100644 tests/database_api_tests.py
copy tests/{util => databases}/__init__.py (100%)
create mode 100644 tests/databases/api_tests.py
copy tests/{util => queries/saved_queries}/__init__.py (100%)
create mode 100644 tests/queries/saved_queries/api_tests.py
[incubator-superset] 04/08: chore(sqla): assert query is single
read-only statement (#11236)
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 76f6e85eb3e82bac7fc9e27c78ae37c0cec2ebb2
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon Oct 12 15:11:43 2020 +0300
chore(sqla): assert query is single read-only statement (#11236)
---
superset/connectors/sqla/models.py | 9 ++++++++
tests/sqla_models_tests.py | 42 ++++++++++++++++++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py
index df07cca..934da17 100644
--- a/superset/connectors/sqla/models.py
+++ b/superset/connectors/sqla/models.py
@@ -64,6 +64,7 @@ from superset.jinja_context import (
from superset.models.annotations import Annotation
from superset.models.core import Database
from superset.models.helpers import AuditMixinNullable, QueryResult
+from superset.sql_parse import ParsedQuery
from superset.typing import Metric, QueryObjectDict
from superset.utils import core as utils, import_datasource
@@ -755,6 +756,14 @@ class SqlaTable( # pylint: disable=too-many-public-methods,too-many-instance-at
)
from_sql = sqlparse.format(from_sql, strip_comments=True)
+ if len(sqlparse.split(from_sql)) > 1:
+ raise QueryObjectValidationError(
+ _("Virtual dataset query cannot consist of multiple statements")
+ )
+ if not ParsedQuery(from_sql).is_readonly():
+ raise QueryObjectValidationError(
+ _("Virtual dataset query must be read-only")
+ )
return TextAsFrom(sa.text(from_sql), []).alias("expr_qry")
return self.get_sqla_table()
diff --git a/tests/sqla_models_tests.py b/tests/sqla_models_tests.py
index 9e18845..de46e1c 100644
--- a/tests/sqla_models_tests.py
+++ b/tests/sqla_models_tests.py
@@ -187,3 +187,45 @@ class TestDatabaseModel(SupersetTestCase):
if get_example_database().backend != "presto":
with pytest.raises(QueryObjectValidationError):
table.get_sqla_query(**query_obj)
+
+ def test_multiple_sql_statements_raises_exception(self):
+ base_query_obj = {
+ "granularity": None,
+ "from_dttm": None,
+ "to_dttm": None,
+ "groupby": ["grp"],
+ "metrics": [],
+ "is_timeseries": False,
+ "filter": [],
+ }
+
+ table = SqlaTable(
+ table_name="test_has_extra_cache_keys_table",
+ sql="SELECT 'foo' as grp, 1 as num; SELECT 'bar' as grp, 2 as num",
+ database=get_example_database(),
+ )
+
+ query_obj = dict(**base_query_obj, extras={})
+ with pytest.raises(QueryObjectValidationError):
+ table.get_sqla_query(**query_obj)
+
+ def test_dml_statement_raises_exception(self):
+ base_query_obj = {
+ "granularity": None,
+ "from_dttm": None,
+ "to_dttm": None,
+ "groupby": ["grp"],
+ "metrics": [],
+ "is_timeseries": False,
+ "filter": [],
+ }
+
+ table = SqlaTable(
+ table_name="test_has_extra_cache_keys_table",
+ sql="DELETE FROM foo",
+ database=get_example_database(),
+ )
+
+ query_obj = dict(**base_query_obj, extras={})
+ with pytest.raises(QueryObjectValidationError):
+ table.get_sqla_query(**query_obj)
[incubator-superset] 05/08: feat(datasets): REST API bulk delete
(#11237)
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit c2e8f98854d81ca2639cb66ee50114d18540c0a8
Author: Daniel Vaz Gaspar <da...@gmail.com>
AuthorDate: Mon Oct 12 13:40:05 2020 +0100
feat(datasets): REST API bulk delete (#11237)
* feat(datasets): REST API bulk delete
* doc HTTP 400
---
superset/datasets/api.py | 64 +++++++++++++++++
superset/datasets/commands/bulk_delete.py | 88 +++++++++++++++++++++++
superset/datasets/commands/exceptions.py | 4 ++
superset/datasets/dao.py | 26 +++++++
superset/datasets/schemas.py | 1 +
tests/datasets/api_tests.py | 112 +++++++++++++++++++++++++++++-
6 files changed, 294 insertions(+), 1 deletion(-)
diff --git a/superset/datasets/api.py b/superset/datasets/api.py
index 40b8c5e..8c7f75e 100644
--- a/superset/datasets/api.py
+++ b/superset/datasets/api.py
@@ -21,14 +21,17 @@ import yaml
from flask import g, request, Response
from flask_appbuilder.api import expose, protect, rison, safe
from flask_appbuilder.models.sqla.interface import SQLAInterface
+from flask_babel import ngettext
from marshmallow import ValidationError
from superset.connectors.sqla.models import SqlaTable
from superset.constants import RouteMethod
from superset.databases.filters import DatabaseFilter
+from superset.datasets.commands.bulk_delete import BulkDeleteDatasetCommand
from superset.datasets.commands.create import CreateDatasetCommand
from superset.datasets.commands.delete import DeleteDatasetCommand
from superset.datasets.commands.exceptions import (
+ DatasetBulkDeleteFailedError,
DatasetCreateFailedError,
DatasetDeleteFailedError,
DatasetForbiddenError,
@@ -44,6 +47,7 @@ from superset.datasets.schemas import (
DatasetPostSchema,
DatasetPutSchema,
DatasetRelatedObjectsResponse,
+ get_delete_ids_schema,
get_export_ids_schema,
)
from superset.views.base import DatasourceFilter, generate_download_headers
@@ -68,6 +72,7 @@ class DatasetRestApi(BaseSupersetModelRestApi):
RouteMethod.EXPORT,
RouteMethod.RELATED,
RouteMethod.DISTINCT,
+ "bulk_delete",
"refresh",
"related_objects",
}
@@ -489,3 +494,62 @@ class DatasetRestApi(BaseSupersetModelRestApi):
charts={"count": len(charts), "result": charts},
dashboards={"count": len(dashboards), "result": dashboards},
)
+
+ @expose("/", methods=["DELETE"])
+ @protect()
+ @safe
+ @statsd_metrics
+ @rison(get_delete_ids_schema)
+ def bulk_delete(self, **kwargs: Any) -> Response:
+ """Delete bulk Datasets
+ ---
+ delete:
+ description: >-
+ Deletes multiple Datasets in a bulk operation.
+ parameters:
+ - in: query
+ name: q
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/get_delete_ids_schema'
+ responses:
+ 200:
+ description: Dataset bulk delete
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ message:
+ type: string
+ 400:
+ $ref: '#/components/responses/400'
+ 401:
+ $ref: '#/components/responses/401'
+ 403:
+ $ref: '#/components/responses/403'
+ 404:
+ $ref: '#/components/responses/404'
+ 422:
+ $ref: '#/components/responses/422'
+ 500:
+ $ref: '#/components/responses/500'
+ """
+ item_ids = kwargs["rison"]
+ try:
+ BulkDeleteDatasetCommand(g.user, item_ids).run()
+ return self.response(
+ 200,
+ message=ngettext(
+ "Deleted %(num)d dataset",
+ "Deleted %(num)d datasets",
+ num=len(item_ids),
+ ),
+ )
+ except DatasetNotFoundError:
+ return self.response_404()
+ except DatasetForbiddenError:
+ return self.response_403()
+ except DatasetBulkDeleteFailedError as ex:
+ return self.response_422(message=str(ex))
diff --git a/superset/datasets/commands/bulk_delete.py b/superset/datasets/commands/bulk_delete.py
new file mode 100644
index 0000000..49ad5e4
--- /dev/null
+++ b/superset/datasets/commands/bulk_delete.py
@@ -0,0 +1,88 @@
+# 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.
+import logging
+from typing import List, Optional
+
+from flask_appbuilder.security.sqla.models import User
+
+from superset.commands.base import BaseCommand
+from superset.commands.exceptions import DeleteFailedError
+from superset.connectors.sqla.models import SqlaTable
+from superset.datasets.commands.exceptions import (
+ DatasetBulkDeleteFailedError,
+ DatasetForbiddenError,
+ DatasetNotFoundError,
+)
+from superset.datasets.dao import DatasetDAO
+from superset.exceptions import SupersetSecurityException
+from superset.extensions import db, security_manager
+from superset.views.base import check_ownership
+
+logger = logging.getLogger(__name__)
+
+
+class BulkDeleteDatasetCommand(BaseCommand):
+ def __init__(self, user: User, model_ids: List[int]):
+ self._actor = user
+ self._model_ids = model_ids
+ self._models: Optional[List[SqlaTable]] = None
+
+ def run(self) -> None:
+ self.validate()
+ if not self._models:
+ return None
+ try:
+ DatasetDAO.bulk_delete(self._models)
+ for model in self._models:
+ view_menu = (
+ security_manager.find_view_menu(model.get_perm()) if model else None
+ )
+
+ if view_menu:
+ permission_views = (
+ db.session.query(security_manager.permissionview_model)
+ .filter_by(view_menu=view_menu)
+ .all()
+ )
+
+ for permission_view in permission_views:
+ db.session.delete(permission_view)
+ if view_menu:
+ db.session.delete(view_menu)
+ else:
+ if not view_menu:
+ logger.error(
+ "Could not find the data access permission for the dataset"
+ )
+ db.session.commit()
+
+ return None
+ except DeleteFailedError as ex:
+ logger.exception(ex.exception)
+ raise DatasetBulkDeleteFailedError()
+
+ def validate(self) -> None:
+ # Validate/populate model exists
+ self._models = DatasetDAO.find_by_ids(self._model_ids)
+ if not self._models or len(self._models) != len(self._model_ids):
+ raise DatasetNotFoundError()
+ # Check ownership
+ for model in self._models:
+ try:
+ check_ownership(model)
+ except SupersetSecurityException:
+ raise DatasetForbiddenError()
diff --git a/superset/datasets/commands/exceptions.py b/superset/datasets/commands/exceptions.py
index b651b6f..ee9d781 100644
--- a/superset/datasets/commands/exceptions.py
+++ b/superset/datasets/commands/exceptions.py
@@ -160,6 +160,10 @@ class DatasetDeleteFailedError(DeleteFailedError):
message = _("Dataset could not be deleted.")
+class DatasetBulkDeleteFailedError(DeleteFailedError):
+ message = _("Dataset(s) could not be bulk deleted.")
+
+
class DatasetRefreshFailedError(UpdateFailedError):
message = _("Dataset could not be updated.")
diff --git a/superset/datasets/dao.py b/superset/datasets/dao.py
index b34b3ef..3b905f4 100644
--- a/superset/datasets/dao.py
+++ b/superset/datasets/dao.py
@@ -207,6 +207,32 @@ class DatasetDAO(BaseDAO):
"""
return DatasetMetricDAO.create(properties, commit=commit)
+ @staticmethod
+ def bulk_delete(models: Optional[List[SqlaTable]], commit: bool = True) -> None:
+ item_ids = [model.id for model in models] if models else []
+ # bulk delete, first delete related data
+ if models:
+ for model in models:
+ model.owners = []
+ db.session.merge(model)
+ db.session.query(SqlMetric).filter(SqlMetric.table_id.in_(item_ids)).delete(
+ synchronize_session="fetch"
+ )
+ db.session.query(TableColumn).filter(
+ TableColumn.table_id.in_(item_ids)
+ ).delete(synchronize_session="fetch")
+ # bulk delete itself
+ try:
+ db.session.query(SqlaTable).filter(SqlaTable.id.in_(item_ids)).delete(
+ synchronize_session="fetch"
+ )
+ if commit:
+ db.session.commit()
+ except SQLAlchemyError as ex:
+ if commit:
+ db.session.rollback()
+ raise ex
+
class DatasetColumnDAO(BaseDAO):
model_cls = TableColumn
diff --git a/superset/datasets/schemas.py b/superset/datasets/schemas.py
index 46618d7..d4f6b2f 100644
--- a/superset/datasets/schemas.py
+++ b/superset/datasets/schemas.py
@@ -20,6 +20,7 @@ from flask_babel import lazy_gettext as _
from marshmallow import fields, Schema, ValidationError
from marshmallow.validate import Length
+get_delete_ids_schema = {"type": "array", "items": {"type": "integer"}}
get_export_ids_schema = {"type": "array", "items": {"type": "integer"}}
diff --git a/tests/datasets/api_tests.py b/tests/datasets/api_tests.py
index d7d3471..f308c09 100644
--- a/tests/datasets/api_tests.py
+++ b/tests/datasets/api_tests.py
@@ -20,6 +20,7 @@ from typing import List
from unittest.mock import patch
import prison
+import pytest
import yaml
from sqlalchemy.sql import func
@@ -34,12 +35,14 @@ from superset.extensions import db, security_manager
from superset.models.core import Database
from superset.utils.core import backend, get_example_database, get_main_database
from superset.utils.dict_import_export import export_to_dict
-from superset.views.base import generate_download_headers
from tests.base_tests import SupersetTestCase
from tests.conftest import CTAS_SCHEMA_NAME
class TestDatasetApi(SupersetTestCase):
+
+ fixture_tables_names = ("ab_permission", "ab_permission_view", "ab_view_menu")
+
@staticmethod
def insert_dataset(
table_name: str, schema: str, owners: List[int], database: Database
@@ -61,6 +64,30 @@ class TestDatasetApi(SupersetTestCase):
"ab_permission", "", [self.get_user("admin").id], get_main_database()
)
+ def get_fixture_datasets(self) -> List[SqlaTable]:
+ return (
+ db.session.query(SqlaTable)
+ .filter(SqlaTable.table_name.in_(self.fixture_tables_names))
+ .all()
+ )
+
+ @pytest.fixture()
+ def create_datasets(self):
+ with self.create_app().app_context():
+ datasets = []
+ admin = self.get_user("admin")
+ main_db = get_main_database()
+ for tables_name in self.fixture_tables_names:
+ datasets.append(
+ self.insert_dataset(tables_name, "", [admin.id], main_db)
+ )
+ yield datasets
+
+ # rollback changes
+ for dataset in datasets:
+ db.session.delete(dataset)
+ db.session.commit()
+
@staticmethod
def get_energy_usage_dataset():
example_db = get_example_database()
@@ -789,6 +816,89 @@ class TestDatasetApi(SupersetTestCase):
db.session.delete(dataset)
db.session.commit()
+ @pytest.mark.usefixtures("create_datasets")
+ def test_bulk_delete_dataset_items(self):
+ """
+ Dataset API: Test bulk delete dataset items
+ """
+ datasets = self.get_fixture_datasets()
+ dataset_ids = [dataset.id for dataset in datasets]
+
+ view_menu_names = []
+ for dataset in datasets:
+ view_menu_names.append(dataset.get_perm())
+
+ self.login(username="admin")
+ uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+ rv = self.delete_assert_metric(uri, "bulk_delete")
+ data = json.loads(rv.data.decode("utf-8"))
+ assert rv.status_code == 200
+ expected_response = {"message": f"Deleted {len(datasets)} datasets"}
+ assert data == expected_response
+ datasets = (
+ db.session.query(SqlaTable)
+ .filter(SqlaTable.table_name.in_(self.fixture_tables_names))
+ .all()
+ )
+ assert datasets == []
+ # Assert permissions get cleaned
+ for view_menu_name in view_menu_names:
+ assert security_manager.find_view_menu(view_menu_name) is None
+
+ @pytest.mark.usefixtures("create_datasets")
+ def test_bulk_delete_item_dataset_not_owned(self):
+ """
+ Dataset API: Test bulk delete item not owned
+ """
+ datasets = self.get_fixture_datasets()
+ dataset_ids = [dataset.id for dataset in datasets]
+
+ self.login(username="alpha")
+ uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+ rv = self.delete_assert_metric(uri, "bulk_delete")
+ assert rv.status_code == 403
+
+ @pytest.mark.usefixtures("create_datasets")
+ def test_bulk_delete_item_not_found(self):
+ """
+ Dataset API: Test bulk delete item not found
+ """
+ datasets = self.get_fixture_datasets()
+ dataset_ids = [dataset.id for dataset in datasets]
+ dataset_ids.append(db.session.query(func.max(SqlaTable.id)).scalar())
+
+ self.login(username="admin")
+ uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+ rv = self.delete_assert_metric(uri, "bulk_delete")
+ assert rv.status_code == 404
+
+ @pytest.mark.usefixtures("create_datasets")
+ def test_bulk_delete_dataset_item_not_authorized(self):
+ """
+ Dataset API: Test bulk delete item not authorized
+ """
+ datasets = self.get_fixture_datasets()
+ dataset_ids = [dataset.id for dataset in datasets]
+
+ self.login(username="gamma")
+ uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+ rv = self.client.delete(uri)
+ assert rv.status_code == 401
+
+ @pytest.mark.usefixtures("create_datasets")
+ def test_bulk_delete_dataset_item_incorrect(self):
+ """
+ Dataset API: Test bulk delete item incorrect request
+ """
+ datasets = self.get_fixture_datasets()
+ dataset_ids = [dataset.id for dataset in datasets]
+ dataset_ids.append("Wrong")
+
+ self.login(username="admin")
+ uri = f"api/v1/dataset/?q={prison.dumps(dataset_ids)}"
+ rv = self.client.delete(uri)
+ assert rv.status_code == 400
+
def test_dataset_item_refresh(self):
"""
Dataset API: Test item refresh
[incubator-superset] 06/08: fix(dataset): update user list endpoint
(#11221)
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit f0cd671f4c4e6ddc7f0ba69ea77af00abd2d0322
Author: Lily Kuang <li...@preset.io>
AuthorDate: Mon Oct 12 09:11:00 2020 -0700
fix(dataset): update user list endpoint (#11221)
---
superset-frontend/src/datasource/DatasourceEditor.jsx | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/superset-frontend/src/datasource/DatasourceEditor.jsx b/superset-frontend/src/datasource/DatasourceEditor.jsx
index dd7cd72..88b68e0 100644
--- a/superset-frontend/src/datasource/DatasourceEditor.jsx
+++ b/superset-frontend/src/datasource/DatasourceEditor.jsx
@@ -527,12 +527,12 @@ class DatasourceEditor extends React.PureComponent {
description={t('Owners of the datasource')}
control={
<SelectAsyncControl
- dataEndpoint="/users/api/read"
+ dataEndpoint="api/v1/dataset/related/owners"
multi
mutator={data =>
- data.pks.map((pk, i) => ({
- value: pk,
- label: `${data.result[i].first_name} ${data.result[i].last_name}`,
+ data.result.map(pk => ({
+ value: pk.value,
+ label: `${pk.text}`,
}))
}
/>
[incubator-superset] 08/08: fix: Fix Time Column dropdown for date
filter (#11149)
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit c917e7d102ec38ab225d67aea0c5e719298bef62
Author: Grace Guo <gr...@airbnb.com>
AuthorDate: Tue Oct 6 11:51:10 2020 -0700
fix: Fix Time Column dropdown for date filter (#11149)
---
superset-frontend/spec/javascripts/explore/fixtures.jsx | 3 ++-
superset-frontend/src/explore/controls.jsx | 3 +--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/superset-frontend/spec/javascripts/explore/fixtures.jsx b/superset-frontend/spec/javascripts/explore/fixtures.jsx
index a434085..420b73f 100644
--- a/superset-frontend/spec/javascripts/explore/fixtures.jsx
+++ b/superset-frontend/spec/javascripts/explore/fixtures.jsx
@@ -18,7 +18,8 @@
*/
import React from 'react';
-import { ColumnOption, t } from '@superset-ui/core';
+import { t } from '@superset-ui/core';
+import { ColumnOption } from '@superset-ui/chart-controls';
export const controlPanelSectionsChartOptions = [
{
diff --git a/superset-frontend/src/explore/controls.jsx b/superset-frontend/src/explore/controls.jsx
index 145c326..0358161 100644
--- a/superset-frontend/src/explore/controls.jsx
+++ b/superset-frontend/src/explore/controls.jsx
@@ -63,9 +63,8 @@ import {
getSequentialSchemeRegistry,
legacyValidateInteger,
validateNonEmpty,
- ColumnOption,
} from '@superset-ui/core';
-
+import { ColumnOption } from '@superset-ui/chart-controls';
import { formatSelectOptions, mainMetric } from 'src/modules/utils';
import { TIME_FILTER_LABELS } from './constants';
[incubator-superset] 01/08: fix(examples): missing expressions in
birth_names (#11141)
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 5db86822dff0196a834bf2b1e2292b24b5fcd824
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Fri Oct 2 23:47:38 2020 +0300
fix(examples): missing expressions in birth_names (#11141)
* fix(examples): missing expressions in birth_names
* disable flaky tests
---
.../cypress-base/cypress/integration/explore/AdhocMetrics.test.ts | 6 +++---
superset/examples/birth_names.py | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts b/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts
index 5dfd741..b422673 100644
--- a/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts
+++ b/superset-frontend/cypress-base/cypress/integration/explore/AdhocMetrics.test.ts
@@ -56,7 +56,7 @@ describe('AdhocMetrics', () => {
});
});
- it('Switch from simple to custom sql', () => {
+ xit('Switch from simple to custom sql', () => {
cy.visitChartByName('Num Births Trend');
cy.verifySliceSuccess({ waitAlias: '@postJson' });
@@ -87,7 +87,7 @@ describe('AdhocMetrics', () => {
});
});
- it('Switch from custom sql tabs to simple', () => {
+ xit('Switch from custom sql tabs to simple', () => {
cy.get('[data-test=metrics]').within(() => {
cy.get('.Select__dropdown-indicator').click();
cy.get('input[type=text]').type('sum_girls{enter}');
@@ -113,7 +113,7 @@ describe('AdhocMetrics', () => {
});
});
- it('Typing starts with aggregate function name', () => {
+ xit('Typing starts with aggregate function name', () => {
// select column "num"
cy.get('[data-test=metrics]').within(() => {
cy.get('.Select__dropdown-indicator').click();
diff --git a/superset/examples/birth_names.py b/superset/examples/birth_names.py
index 9120fe8..e5c9360 100644
--- a/superset/examples/birth_names.py
+++ b/superset/examples/birth_names.py
@@ -101,6 +101,7 @@ def load_birth_names(
obj.main_dttm_col = "ds"
obj.database = database
obj.filter_select_enabled = True
+ obj.fetch_metadata()
if not any(col.column_name == "num_california" for col in obj.columns):
col_state = str(column("state").compile(db.engine))
@@ -117,7 +118,6 @@ def load_birth_names(
obj.metrics.append(SqlMetric(metric_name="sum__num", expression=f"SUM({col})"))
db.session.commit()
- obj.fetch_metadata()
tbl = obj
metrics = [
[incubator-superset] 02/08: fix: disable jinja2 SQL templating
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 922b8aa7c9f541fd93943af0f3ed7e8186134bf0
Author: Daniel Gaspar <da...@gmail.com>
AuthorDate: Thu Sep 17 16:13:47 2020 +0100
fix: disable jinja2 SQL templating
# Conflicts:
# superset/config.py
---
superset/config.py | 1 +
superset/jinja_context.py | 21 +++++++++++++++++----
tests/superset_test_config.py | 7 ++++++-
3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/superset/config.py b/superset/config.py
index 71c1e99..52566af 100644
--- a/superset/config.py
+++ b/superset/config.py
@@ -298,6 +298,7 @@ DEFAULT_FEATURE_FLAGS: Dict[str, bool] = {
"CLIENT_CACHE": False,
"ENABLE_EXPLORE_JSON_CSRF_PROTECTION": False,
"ENABLE_DASHBOARD_ETAG_HEADER": False,
+ "ENABLE_TEMPLATE_PROCESSING": False,
"KV_STORE": False,
"PRESTO_EXPAND_DATA": False,
# Exposes API endpoint to compute thumbnails
diff --git a/superset/jinja_context.py b/superset/jinja_context.py
index bc35dbe..988aea8 100644
--- a/superset/jinja_context.py
+++ b/superset/jinja_context.py
@@ -23,7 +23,7 @@ from flask import g, request
from jinja2.sandbox import SandboxedEnvironment
from superset import jinja_base_context
-from superset.extensions import jinja_context_manager
+from superset.extensions import feature_flag_manager, jinja_context_manager
from superset.utils.core import convert_legacy_filters_into_adhoc, merge_extra_filters
if TYPE_CHECKING:
@@ -247,6 +247,16 @@ class BaseTemplateProcessor: # pylint: disable=too-few-public-methods
return template.render(kwargs)
+class NoOpTemplateProcessor(
+ BaseTemplateProcessor
+): # pylint: disable=too-few-public-methods
+ def process_template(self, sql: str, **kwargs: Any) -> str:
+ """
+ Makes processing a template a noop
+ """
+ return sql
+
+
class PrestoTemplateProcessor(BaseTemplateProcessor):
"""Presto Jinja context
@@ -324,7 +334,10 @@ def get_template_processor(
query: Optional["Query"] = None,
**kwargs: Any,
) -> BaseTemplateProcessor:
- template_processor = template_processors.get(
- database.backend, BaseTemplateProcessor
- )
+ if feature_flag_manager.is_feature_enabled("ENABLE_TEMPLATE_PROCESSING"):
+ template_processor = template_processors.get(
+ database.backend, BaseTemplateProcessor
+ )
+ else:
+ template_processor = NoOpTemplateProcessor
return template_processor(database=database, table=table, query=query, **kwargs)
diff --git a/tests/superset_test_config.py b/tests/superset_test_config.py
index 513d3d9..8d03115 100644
--- a/tests/superset_test_config.py
+++ b/tests/superset_test_config.py
@@ -49,7 +49,12 @@ HIVE_POLL_INTERVAL = 0.1
SQL_MAX_ROW = 666
SQLLAB_CTAS_NO_LIMIT = True # SQL_MAX_ROW will not take affect for the CTA queries
-FEATURE_FLAGS = {"foo": "bar", "KV_STORE": True, "SHARE_QUERIES_VIA_KV_STORE": True}
+FEATURE_FLAGS = {
+ "foo": "bar",
+ "KV_STORE": True,
+ "SHARE_QUERIES_VIA_KV_STORE": True,
+ "ENABLE_TEMPLATE_PROCESSING": True,
+}
def GET_FEATURE_FLAGS_FUNC(ff):
[incubator-superset] 03/08: chore(sql-lab): catch PyArrow
deserialization error (#11201)
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 9aba60714917fcbf714f9c71f26ce9e3ffad881d
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Mon Oct 12 10:16:00 2020 +0300
chore(sql-lab): catch PyArrow deserialization error (#11201)
---
superset/exceptions.py | 4 ++++
superset/views/core.py | 17 +++++++++++++----
superset/views/utils.py | 11 +++++++++--
3 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/superset/exceptions.py b/superset/exceptions.py
index 3dca1de..c0d55f8 100644
--- a/superset/exceptions.py
+++ b/superset/exceptions.py
@@ -93,3 +93,7 @@ class QueryObjectValidationError(SupersetException):
class DashboardImportException(SupersetException):
pass
+
+
+class SerializationError(SupersetException):
+ pass
diff --git a/superset/views/core.py b/superset/views/core.py
index 36668cf..7296017 100755
--- a/superset/views/core.py
+++ b/superset/views/core.py
@@ -82,6 +82,7 @@ from superset.databases.filters import DatabaseFilter
from superset.exceptions import (
CertificateException,
DatabaseNotFound,
+ SerializationError,
SupersetException,
SupersetSecurityException,
SupersetTimeoutException,
@@ -1959,7 +1960,9 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods
return self.results_exec(key)
@staticmethod
- def results_exec(key: str) -> FlaskResponse:
+ def results_exec( # pylint: disable=too-many-return-statements
+ key: str,
+ ) -> FlaskResponse:
"""Serves a key off of the results backend
It is possible to pass the `rows` query argument to limit the number
@@ -1993,9 +1996,15 @@ class Superset(BaseSupersetView): # pylint: disable=too-many-public-methods
return json_errors_response([ex.error], status=403)
payload = utils.zlib_decompress(blob, decode=not results_backend_use_msgpack)
- obj = _deserialize_results_payload(
- payload, query, cast(bool, results_backend_use_msgpack)
- )
+ try:
+ obj = _deserialize_results_payload(
+ payload, query, cast(bool, results_backend_use_msgpack)
+ )
+ except SerializationError:
+ return json_error_response(
+ __("Data could not be deserialized. You may want to re-run the query."),
+ status=404,
+ )
if "rows" in request.args:
try:
diff --git a/superset/views/utils.py b/superset/views/utils.py
index dc16494..226d9ef 100644
--- a/superset/views/utils.py
+++ b/superset/views/utils.py
@@ -39,7 +39,11 @@ from superset import (
)
from superset.connectors.connector_registry import ConnectorRegistry
from superset.errors import ErrorLevel, SupersetError, SupersetErrorType
-from superset.exceptions import SupersetException, SupersetSecurityException
+from superset.exceptions import (
+ SerializationError,
+ SupersetException,
+ SupersetSecurityException,
+)
from superset.legacy import update_time_range
from superset.models.core import Database
from superset.models.dashboard import Dashboard
@@ -559,7 +563,10 @@ def _deserialize_results_payload(
ds_payload = msgpack.loads(payload, raw=False)
with stats_timing("sqllab.query.results_backend_pa_deserialize", stats_logger):
- pa_table = pa.deserialize(ds_payload["data"])
+ try:
+ pa_table = pa.deserialize(ds_payload["data"])
+ except pa.ArrowSerializationError:
+ raise SerializationError("Unable to deserialize table")
df = result_set.SupersetResultSet.convert_table_to_df(pa_table)
ds_payload["data"] = dataframe.df_to_records(df) or []
[incubator-superset] 07/08: fix(crud): set default extra value
(#11262)
Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
villebro pushed a commit to branch 0.38
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit 44b7e8e6e8335f42c6c11e74f6b28e9603488f71
Author: Ville Brofeldt <33...@users.noreply.github.com>
AuthorDate: Wed Oct 14 19:05:20 2020 +0300
fix(crud): set default extra value (#11262)
---
superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
index f0e2c6c..0c7ecfd 100644
--- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
+++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal.tsx
@@ -126,6 +126,9 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({
const [isHidden, setIsHidden] = useState<boolean>(true);
const isEditMode = database !== null;
+ const defaultExtra =
+ '{\n "metadata_params": {},\n "engine_params": {},' +
+ '\n "metadata_cache_timeout": {},\n "schemas_allowed_for_csv_upload": [] \n}';
// Database fetch logic
const {
@@ -589,11 +592,7 @@ const DatabaseModal: FunctionComponent<DatabaseModalProps> = ({
<div className="input-container">
<textarea
name="extra"
- value={db ? db.extra || '' : ''}
- placeholder={
- '{\n "metadata_params": {},\n "engine_params": {},' +
- '\n "metadata_cache_timeout": {},\n "schemas_allowed_for_csv_upload": [] \n}'
- }
+ value={(db && db.extra) ?? defaultExtra}
onChange={onTextChange}
/>
</div>