Skip to content

Commit

Permalink
Redash development history in a single commit (#2)
Browse files Browse the repository at this point in the history
* Fix CLI command for "status" (#4989)

* Fix CLI command for "status"

CLI command "status" can fail due to incorrect connection information to RQ.

This change matches the behavior from line 65 and solves the connection error.

* Move connection up to CLI entrypoint

* Some permissions fixes (#4994)

* Don't show New ... buttons on list pages if user doesn't have corresponding permissions

* Hide Create menu item if no create actions available

* Catch QueryResultError on widget load (#4991)

* Refactor Organization Settings and add extension points to it (#4995)

* Split OrganizationSettings page into components

* Update change handling: use objects instead of string keys, move some logic to more appropriate place

* Convert OrganizationSettings page to functional component and refine code a bit

* Add some extension points

* Improve onChange handler

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Refactor User Profile page and add extension points to it (#4996)

* Move components specific to UserProfile page to corresponding folder

* Split UserProfile page into components

* Rename components, refine code a bit

* Add some extension points

* Fix margin

* Allow unregistering settings tabs (#5000)

* Dynamically register frontend routes (#4998)

* Allow to override frontend routes

* Configure app before initializing ApplicationArea

* Refine code

* Avoid purging operational queues (#4973)

* avoid purging operational queues

* schema queues actually run queries, so they should be purged

* Fix org option in users create_root cli command (#5003)

Thanks @nason 👍

* Remove pace-progress (#4990)

* Delete locks for cancelled queries (#5006)

* delete locks for cancelled queries

* test that query cancellations do not prevent reenqueues

* Too large visualization cause filters block to collapse (#5007)

* Textbox: confirm close if text was changed (#5009)

* Textbox: confirm close if text was changed

* Update texting (with @gabrieldutra)

* Update texting

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Allow private addresses when enforcing is disabled (#4983)

* Custom primary/foreign key types (#5008)

* allow overriding the type of key used for primary/foreign keys of the different models

* rename key_types to singular key_type

* add some documentation for `database_key_definitions`

* Add "Last 12 months" option to dynamic date ranges (#5004)

* Fixed broken custom JS visualization settings (#5013)

* Python query runner fix (#4966)

* fixed print method

* fixed `.items()` error

* added extra builtins

* added guarded_unpack_sequence

* add a couple of missed custom key types hooks (#5014)

* Databricks custom Schema Browser (#5010)

* Allow GET from non-admins on data source resource (#4992)

* Handle React exception when a function is provided (#5016)

* Add plus between tags to clarify how they are used #4628 (#5017)

Co-authored-by: Levko Kravets <kravets-levko@users.noreply.github.com>

Co-authored-by: Levko Kravets <kravets-levko@users.noreply.github.com>

* Y-axis autoscale fails when min or max is set (#4904)

* getredash/redash#4784 Y-axis autoscale fails when min or max is set

* Update tests

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Fix Databricks Schema Browser scrollbar (#5023)

* Refactor: extract commonly used pattern into hook (#5022)

* Explicitly sort routes to reduce a chance of conflicts (#5020)

* Explicitly sort routes to reduce (avoid at all?) a chance of conflicts

* Sort routes by params count

* Fix: sorting queries by schedule was resulting in a wrong order (#4954)

* fix schedule sorting issue

* style change

* Update to meet code style.

* move the schedule sort to backend

* mod comment

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Query Source: Add Shift+Enter shortcut for query execution (#5037)

* Fix schema browser items height (#5024)

* Dynamic Form: Make default extra fields state a prop (#5039)

* purge_failed_jobs can take up to several minutes, so better have a proper timeout (#5033)

* Visualizations Library: Enhance docs (#4946)

* Allow to change order of legend items (#5021)

* Allow to change order of legend items

* Update tests

* Update Ace Editor version (#5041)

* getredash/redash#5031 Counter is too large on Query View/Source pages (#5044)

* Databricks Schema Browser: Allow eventlet worker instead of RQ (#5045)

* Add loading button in UI

* Handle databricks schema requests without RQ

* Don't use gevent worker

* Revert "Don't use gevent worker"

This reverts commit 9704c70a941a68c249db73e0450961e608fc0507.

* Use eventlet

* Use first column instead of 'namespace' one

* Revert "Add loading button in UI"

This reverts commit c0e4dfb966714a9f9e23977ab659e64afb5ce255.

* Remove databricks tasks

* Update eventlet

* Add libevent

* Display logs on failure

* Revert "Add libevent"

This reverts commit a00d067cb77b6f4f9919cf47f1d15c34d107a18c.

* Test updating gunicorn

* Don't set eventlet as the default for Redash

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Remove fetchDataFromJob usage

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Dashboard URL does not show new name when dashboard name is updated (#1009)

* on dashboard api calls - take the id from the beginning of the slug, unless there is no number in it - in that case, take the entire slug as id

* add dashboard id when showing links to dashboards

* change path to include new name when renaming dashboards

* move slug generation to backend

* redirect to new name after changing (this time with a proper promise)

* oh right, we already have a slug function

* add spec that makes sure that renamed dashboards are redirected to the
url which contains their new name

* use id-slug in all Cypress specs

* move dashboards from /dashboard/:slug to /dashboards/:id-:name_as_slug

* Update dashboard url as its name changes

* Update separator to be "/"

* Update missing dashboard urls

* Update api not to depend on int id

* Use '-' instead of '/' as separator and update Dashboard.get calls

* slug -> name_as_slug

* Keep slug urls on cypress

* Update route path

* Use legacy attr for GET

* Use getter for urlForDashboard

* Update dashboard url when loaded by slug

* Update Dashboard routes to use id instead of slug

* Update Dashboard handler tests

* Update Cypress tests

* Fix create new dashboard spec

* Use axios { params }

* Drop Ternary operator

* Send updated slug directly in 'slug' attr

* Update multiple urls Dashboard test name

* Update route names

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* Fix bundle-extensions script to work on recent importlib-resources. (#5050)

Also adds a test case for running the script.

* Add TypeScript support (#5027)

* TASK Add typescript dependencies to package.json

* TASK Add typescript to build process and npm scripts and TASK Move example components to typescript and add an example definition file.

* TASK Move back to ts-loader instead of babel typescript preset

* FIX Remove unnecessary changes

* FIX Explicitly mention tsconfig file in webpack.config.js to avoid `error while parsing tsconfig.json, The 'files' list in config file 'tsconfig.json' is empty`
See (https://github.com/TypeStrong/ts-loader/issues/405#issuecomment-330108362)

* FIX Move tsconfig to client subdirectory to make it accessible in docker container (only webpack.config.js is copied over from root folder in Dockerfile)

* TASK Move from ts-loader to babel to reduce compatibility issues between ES6/7 and typescript compilation.

* TASK Add types for classnames, hoist-non-react-statics and lodash. Fix default export of DashboardList and run prettier on eslintrc

* Run npm install

* Trigger tests

* Run npm install 2

* Trigger tests

* Eager load outdated queries (#5049)

* eager load outdated queries

* explicitly use .all() instead of list()

* Bump lodash from 4.17.15 to 4.17.19 in /viz-lib (#5051)

Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Fix wrong Y-axis range for stacked bar chart (#5029)

* getredash/redash#5026 Fix wrong Y-axis range for stacked bar chart

* Update tests

* Use Plotly's built-in algorinthm to compute Y-axis range

* Update tests

* Revert previous solution (yRange-related code)

* Revert other unrelated changes

* Revert other unrelated changes

* Move chart rendering to own file and ensure that rendering steps will occur in necessary order

* Reduce amount of plot updates by mergin separate updates into a sigle cumulative update

* Give better names for several functions

* Load extensions on db init (#5062)

* Only try to create tables and stamp DB if not tables exist already.

* load extensions when creating the database

* Add Column Type to Databricks schema browser (#5052)

* Add Column Type to Databricks schema browser

* Map schema columns to be an object

* Format pg with Black

* Add data_type for Postgres

* Add override mechanism for webpack config (#5057)

* loosen up some proptypes and backend casting to allow different primary key types (#5066)

* Move page size select to the Paginator component (#5064)

* Queries list: move "My Queries" above "Archived" (#5072)

* Introduce caching to the Databricks Schema Browser (#5038)

* Add refresh button in the bottom

* Add caching

* Drop allSettled

* Simplify refresh button

* Update error to return 500

* Load tables before loading columns

* Don't mutate schema

* Reset db name and schemas when changing data source

* Load both tables and columns

* Return error with code 200

* Code review updates

* Add expiration time to the cache Keys

* Back with RQ

* Make sure Policy is loaded for user session (#5081)

* Exposing setting for overriding template directory (#4324)

When using some of the customized login flows such as `REMOTE_USER` the deployed site breaks due to not finding template files. This change updated the app default to use the existing Flask templates directory rather than the compiled static assets directory which only contains an index.html file.

* fix: Compose version due to --build-arg (#5083)

Signed-off-by: koooge <koooooge@gmail.com>

* Add: periodic job to remove ghost locks. (#5087)

* Bar chart with second y axis overlaps data series (#4150)

* Add support for CSRF tokens (#5055)

* add flask-wtf

* add CSRF tokens to all static forms

* add CSRF tokens to all axios requests

* disable CSRF validation in unit tests

* support CSRF-protected requests in *most* cypress tests

* don't enfroce CSRF checks by default

* avoid CSRF enforcement in unit tests

* remove redundant spread

* some camel casing hiccups

* always yield the CSRF cookie, but avoid enforcing it if CSRF toggle is off

* Restyled by prettier (#5056)

Co-authored-by: Restyled.io <commits@restyled.io>

* set a CSRF header only if cookie is present

* enforce CSRF in CI

* install lodash directly for Cypress

* install request-cookies directly for Cypress. We should probably start loading package.json deps

* enable CSRF support when logout and login happen within the same spec

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>

* Make table visualization header fixed (#5103)

* add lock table header

* Move styling to a new class

* Update renderer.less

* Move class to table and fix top border

* Update renderer.less

* Update viz-lib/src/visualizations/table/renderer.less

Thanks, this change is good to me.

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* CSRF Exempts (#5108)

* if present, always convert CSRF cookies to headers

* exempt auth blueprints from CSRF protection

* respect CSRF exempts

* Update Organization Settings (#5114)

* Update Organization Settings

* Cypress: Update tab naming

* Make DataSourceListComponent a dynamic component (#5113)

* Use Skeleton as ItemsList loading state (#5079)

* Cypress touch-ups (#5109)

* allow non-sequential IDs for DataSources in Cypress tests

* refactor redash-api to a set of Cypress commands

* support mounting Redash endpoints in Cypress routes

* fix some parameter specs by waiting for schema to load

* extract baseUrl from cypress.json

* Restyled by prettier (#5110)

Co-authored-by: Restyled.io <commits@restyled.io>

Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>

* Remove content width limit on all pages (#5091)

* Remove content width limit on all pages

* Update client/app/assets/less/inc/base.less

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Remove content limit; limit sidebar width

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Keep widget loading when fetch request is replaced (#5118)

* Fix create link on data sources page (#5121)

* Fix create link on data sources page

* Cypress: Add test that the source dialog opens

* Add DynamicComponent to PermissionsControl flag (#5116)

* Misc changes to codebase back ported from internal fork (#5129)

* Set corejs version in .babelrc so Jest doesn't complain.

* Rewrite services/routes in TypeScript.

* Add TypeScript definitions for DialogComponent.

* Make image paths more portable

* Add current route context and hook.

* Make EmptyState more flexible by being able to pass in getSteps function.

* Rewrite ItemsList in TypeScript.

* Introduce the possibility to add custom sorters for a column.

* Rearrange props to be friendly to TypeScript.

* Type definitions for NotificationApi.

* Use Databricks query editor components for databricks_internal type of query runner.

* URL Escape password in Alembic configuration.

* Compare types in migrations.

* Misc changes to codebase back ported from internal fork - part 2 (#5130)

* Auth: make login url configurable.

* More portable image url.

* durationHumanize: support for milliseconds.

* Sorter: support for custom sort.

* Upgrade Ant Design to v4 (#5068)

* Introduce Link component (#5122)

* Introduce Link component

* Use Link component for external links as well

* Remove unused file (I hope it's really not needed)

* Use Link component in visualizations library

* Simplify Link component implementation

* CR1

* Trigger build

* CR2

* Support multiple queries in a single query box (#5058)

* Support multiple queries in a single query box

* Implement statement splitting function and add tests for it

* Add a test for databricks-specific syntax

* Split statements before running query

* Add toggle to disable public URLs (#5140)

* Add toggle to disable public URLs

* Add Cypress tests

* Antd v4: Fix CreateUserDialog (#5139)

* Antd v4: Update CreateUserDialog

* Add Cypress test for user creation

* Misc frontend changes from internal fork (#5143)

* Move CardsList to typescript (#5136)

* Refactor CardsList - pass a suffix for list item

Adding :id to an item to be used as a key suffix is redundant and the same
can be accomplished by using :index from the map function.

* Move CardsList to typescript

* Convert CardsList component to functional component

* CR1

* CR2

* Keep selected filters when switching visualizations (#5146)

* getredash/redash#4944 Query pages: keep selected filters when switching visualizations

* Pass current filters to expanded widget modal

* prevent assigning queries to view_only data sources (#5152)

* Add default limit (1000) to SQL queries (#5088)

* add default limit 1000

* Add frontend changes and connect to backend

* Fix query hash because of default limit

* fix CircleCI test

* adjust for comment

* Allow to clear selected tags on list pages (#5142)

* Convert TagsList to functional component

* Convert TagsList to typescript

* Allow to unselect all tags

* Add title to Tags block and explicit "clear filter" button

* Some tweaks

* Keep additional URL params when forking a query (#5184)

* Refresh CSRF tokens (#5177)

* expire CSRF tokens after 6 hours

* use axios' built-in cookie to header copy mechanism

* add axios-auth-refresh

* retry CSRF-related 400 errors by refreshing the cookie

* export the auth refresh interceptor to support ejecting it if neccessary

* reject the original request if it's unrelated to CSRF

* add 'cancelled' meta directive to all cancelled jobs (#5187)

* Ask user to log in when session expires (#5178)

* Ask user to log in when session expires

* Update implementation

* Update implementation

* Minor fix

* Update modal

* Do not intercept calls to api/session as Auth.requireSession() relies on it

* Refine code; adjust popup size and position

* Some Choropleth improvements/refactoring (#5186)

* Directly map query results column to GeoJSON property

* Use cache for geoJson requests

* Don't handle bounds changes while loading geoJson data

* Choropleth: fix map "jumping" on load; don't save bounds if user didn't edit them; refine code a bit

* Improve cache

* Optimize Japan Perfectures map (remove irrelevant GeoJson properties)

* Improve getOptions for Choropleth; remove unused code

* Fix test

* Add US states map

* Convert USA map to Albers projection

* Allow to specify user-friendly field names for maps

* Align Y axes at zero (#5053)

* Align Y axes as zero

* Fix typo (with @deecay)

* Add alignYAxesAtZero function

* Avoid 0 division

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Generate Code Coverage report for Cypress (#5137)

* Move Cypress to dev dependencies (#3991)

* Test Cypress on package list

* Skip Puppeteer Chromium as well

* Put back missing npm install on netlify.toml

* Netlify: move env vars to build.environment

* Remove cypress:install script

* Update Cypress dockerfile

* Copy package-lock.json to Cypress dockerfile

* ScheduleDialog: Filter empty interval groups (#5196)

* Share Embed Spec: Make sure query is executed (#5191)

* Updated Cypress to v5.3 and fixed e2e tests (#5199)

* Upgraded Cypress to v5.3 and fixed e2e tests

* Updated cypress image

* Fixed failing tests

* Updated NODE_VERSION in netlify

* Update client/cypress/integration/visualizations/choropleth_spec.js

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* fixed test in choropleth

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Extra actions on Queries and Dashboards pages (#5201)

* Extra actions for Query View and Query Source pages

* Convert Queries List page to functional component

* Convert Dashboards List page to functional component

* Extra actions for Query List page

* Extra actions for Dashboard List page

* Extra actions for Dashboard page

* Pass some extra data to Dashboard.HeaderExtra component

* CR1

* Remove build args from Cypress start script (#5203)

* Frontend updates from internal fork (#5209)

* Add horizontal bar chart (#5154)

* added bar chart boilerplate

* added x/y manipulation

* replaced x/y management to inner series preparer

* added tests

* moved axis inversion to all charts series

* removed line and area

* inverted labels ui

* removed normalizer check, simplified inverted axes check

* finished working hbar

* minor review

* added conditional title to YAxis

* generalized horizontal chart for line charts, resetted state on globalSeriesType change

* fixed updates

* fixed updates to layout

* fixed minor issues

* removed right Y axis when axes inverted

* ran prettier

* fixed updater function conflict and misuse of getOptions

* renamed inverted to swapped

* created mappingtypes for swapped columns

* removed unused import

* minor polishing

* improved series behaviour in h-bar

* minor fix

* added basic filter to ChartTypeSelect

* final setup of filtered chart types

* Update viz-lib/src/components/visualizations/editor/createTabbedEditor.jsx

* added proptypes and renamed ChartTypeSelect props

* Add missing import

* fixed import, moved result array to global scope

* merged import

* clearer naming in ChartTypeSelect

* better lodash map syntax

* fixed global modification

* moved result inside useMemo

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* Fix Home EmptyState help link (#5217)

* Static SAML configuration and assertion encryption (#5175)

* Change front-end and data model for SAML2 auth - static configuration

* Add changes to use inline metadata.

* add switch for static and dynamic SAML configurations

* Fixed config of backend static/dynamic to match UI

* add ability to encrypt/decrypt SAML assertions with pem and crt files. Upgraded to pysaml2 6.1.0 to mitigate signature mismatch during decryption

* remove print debug statement

* Use utility to find xmlsec binary for encryption, formatting saml_auth module

* format SAML Javascript, revert want_signed_response to pre-PR value

* pysaml2's entityid should point to the sp, not the idp

* add logging for entityid for validation

* use mustache_render instead of string formatting. put all static logic into static branch

* move mustache template for inline saml metadata to the global level

* Incorporate SAML type with Enabled setting

* Update client/app/pages/settings/components/AuthSettings/SAMLSettings.jsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Chad Chen <chad.chen@databricks.com>
Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Fix dashboard background grid (#5238)

* added required to Form.Item and Input for better UI (#5231)

* added required to Form.Item and Input for better UI

* removed required from input

* Revert "removed required from input"

This reverts commit b56cd76fa1b1eba4e337e55c2797b6a5d64f2699.

* Redo "removed required from input"

* removed typo

Co-authored-by: rafawendel2010@gmail.com <rafawendel>

* Fix annotation bug causing queries not to run - ORA-00933 (#5179)

* Fix for the typo button in ParameterMappingInput (#5244)

* extend the refresh_queries timeout from 3 minutes to 10 minutes (#5253)

* Multiselect dropdown slowness (fix) (#5221)

* created util to estimate reasonable width for dropdown

* removed unused import

* improved calculation of item percentile

* added getItemOfPercentileLength to relevant spots

* added getItemOfPercentileLength to relevant spots

* Added missing import

* created custom select element

* added check for property path

* removed uses of percentile util

* gave up on getting element reference

* finished testing Select component

* removed unused imports

* removed older uses of Option component

* added canvas calculation

* removed minWidth from Select

* improved calculation

* added fallbacks

* added estimated offset

* removed leftovers 😅

* replaced to percentiles to max value

* switched to memo and renamed component

* proper useMemo syntax

* Update client/app/components/Select.tsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* created custom restrictive types

* added quick const

* fixed style

* fixed generics

* added pos absolute to fix percy

* removed custom select from ParameterMappingInput

* applied prettier

* Revert "added pos absolute to fix percy"

This reverts commit 4daf1d4bef9edf93cd9bb1f404bd022472ff17a2.

* Pin Percy version to 0.24.3

* Update client/app/components/ParameterMappingInput.jsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* renamed Select.jsx to SelectWithVirtualScroll

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* bugfix: fix #5254 (#5255)

Co-authored-by: Jerry <jerry.yuan@webweye.com>

* Enable graceful shutdown of rq workers (#5214)

* Enable graceful shutdown of rq workers

* Use `exec` in the `worker` command of the entrypoint to propagate
  the `TERM` signal
* Allow rq processes managed by supervisor to exit without restart on
  expected status codes
* Allow supervisorctl to contact the running supervisor
* Add a `shutdown_worker` command that will send `TERM` to all running
  worker processes and then sleep. This allows orchestration systems
  to initiate a graceful shutdown before sending `SIGTERM` to
  supervisord

* Use Heroku worker as the BaseWorker

This implements a graceful shutdown on SIGTERM, which simplifies
external shutdown procedures.

* Fix imports based upon review

* Remove supervisorctl config

* Enable Boxplot to be horizontal (#5262)

* Frontend updates from internal fork (#5259)

* DynamicComponent for QuerySourceAlerts

* General Settings updates

* Dynamic Date[Range] updates

* EmptyState updates

* Query and SchemaBrowser updates

* Adjust page headers and add disablePublish

* Policy updates

* Separate Home FavoritesList component

* Update FormatQuery

* Autolimit frontend fixes

* Misc updates

* Keep registering of QuerySourceDropdown

* Undo changes in DynamicComponent

* Change sql-formatter package.json syntax

* Allow opening help trigger in new tab

* Don't run npm commands as root in Dockerfile

* Cypress: Remove extra execute query

* Correct cleanup_query_results comment (#5276)

Correct comment from QUERY_RESULTS_MAX_AGE
to QUERY_RESULTS_CLEANUP_MAX_AGE

* Remove unwanted props from Select component (#5277)

* Explicitly selected props so as to avoid errors from non-wanted props

* Simplified approach

* Ran prettier 😬

* Fixed minor issues

* Fix QuerySourceDropdown value type (#5284)

* Changed 'Delete Alert' into 'Delete' for consistency (#5287)

* Redesign desktop nav bar (#5294)

* Add React Fast Refresh + Hot Module Reloading (#5291)

* removed leftover console.log (#5303)

* Fix disabled hot reload flow (#5306)

* Sync date format from settings with clientConfig (#5299)

* added eslint no-console (#5305)

* added eslint no-console

* Update client/.eslintrc.js to allow warnings

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Convert viz-lib to TypeScript (#5310)

Co-authored-by: ts-migrate <>

* change item element in system status page (#5323)

* Obfuscate non-email alert destinations (#5318)

* Dropdown param search fix (#5304)

* fixed QueryBasedParamterInput optionFilterProp

* added optionFilterProp fallback for SelectWithVirtualScroll

* simplified syntax

* removed optionFilterProp from QueryBasedParameterInput.jsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* restricted SelectWithVirtualScroll props

* Added e2e test for parameter filters

* moved filter assertion to more suitable place

* created helper for option filter prop assertion

* moved option filter prop assertion to proper place, added result update assertion

* refactor openAndSearchAntdDropdown helper

* Fix parameter_spec

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Add Username and Password fields to MongoDB config (#5314)

* docs: fix simple typo, possbily -> possibly (#5329)

There is a small typo in redash/settings/__init__.py.

Should read `possibly` rather than `possbily`.

* Secret handling for Yandex, TreasureData, & Postgres/CockroachDB SSL (#5312)

* Bar chart e2e test (#5279)

* created bar-chart e2e test boilerplate

* refactored assertions

* added snapshots and dashboard

* refactored assertions to properly deal with async

* replaced loops with getters for proper workings of cypress

* added a couple other bar charts

* ran prettier

* added a better query for bar charts

* removed leftovers

* moved helpers to support folder

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Truncate large Databricks ODBC result sizes (#5290)

Truncates results sets that exceed a limit taken from an environment
variable called DATABRICKS_ROW_LIMIT.

* Add reorder to dashboard parameter widgets (#5267)

* added paramOrder prop

* minor refactor

* moved logic to widget

* Added paramOrder to widget API call

* Update client/app/components/dashboards/dashboard-widget/VisualizationWidget.jsx

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Merge branch 'master' into reorder-dashboard-parameters

* experimental removal of helper element

* cleaner comment

* Added dashboard global params logic

* Added backend logic for dashboard options

* Removed testing leftovers

* removed appending sortable to parent component behavior

* Revert "Added backend logic for dashboard options"

This reverts commit 41ae2ce4755a6fa03fd76d900819b11016919275.

* Re-structured backend options

* removed temporary edits

* Added dashboard/widget param reorder cypress tests

* Separated edit and sorting permission

* added options to public dashboard serializer

* Removed undesirable events from drag

* Bring back attaching sortable to its parent

This reverts commit 163fb6fef5ecf7ec9924d5ff2dddcb4d889caab8.

* Added prop to control draggable destination parent

* Removed paramOrder fallback

* WIP (for Netflify preview)

* fixup! Added prop to control draggable destination parent

* Better drag and drop styling and fix for the padding

* Revert "WIP (for Netflify preview)"

This reverts commit 433e11edc353b645410bac4bc162819ffd37d89a.

* Improved dashboard parameter Cypress test

* Standardized reorder styling

* Changed dashboard param reorder to edit mode only

* fixup! Improved dashboard parameter Cypress test

* fixup! Improved dashboard parameter Cypress test

* Fix for Cypress CI error

Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>

* Fix inconsistent Sankey behavior (#5286)

* added type casting to coerce number string into nuber

* Merge branch 'master' into fix-inconsistent=sankey-behavior

* typed map viz options

* Partially typed what was possible

* reworked data coercion

* improved MapOptionsType types

* readaqueted sankey rows so as to allow strings again

* Use legacy resolver in pip to fix broken build (#5309)

Fixes #5300 and fixes #5307 

There have been upstream (`python:37-slim` image) changes that
bring in `pip` version 20.3.1, which makes new `2020-resolver`
the default.  Due to that, un-resolvable dependency conflicts
in  `requirements_all_ds.txt` now cause the build to fail.

This is a workaround until the package versions can be updated
to work with the new pip resolver.

* Encrypt alert notification destinations (#5317)

* Remove unnecessary space in rq log (#5345)

* Fix: add a merge migration to solve multi head issue (#5364)

* Add unit test to test for multi-head migrations issue

* Add merge migration

* Fix for Cypress flakiness generated by param_spec (#5349)

* Bump dompurify from 2.0.8 to 2.0.17 in /viz-lib (#5326)

Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.0.8 to 2.0.17.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.0.8...2.0.17)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump bl from 1.2.2 to 1.2.3 in /viz-lib (#5257)

Bumps [bl](https://github.com/rvagg/bl) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v1.2.2...v1.2.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump axios from 0.19.0 to 0.21.1 (#5366)

Bumps [axios](https://github.com/axios/axios) from 0.19.0 to 0.21.1.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.19.0...v0.21.1)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Updated axios (#5371)

* Increased waiting time to avoid flakiness (#5370)

* Add My Dashboards filter option to the Dashboards list (#5375)

* Add My Dashboards filter option to the Dashboards list. Added API endpoint to get the list of a user's dashboards, similar to the My Queries feature.

* Update empty dashboard list state to show an invite to create a new dashboard, like My Queries

* Update to Levko's suggested approach. Clean up some of the formatting for consistency. Put the 'My Queries/Dashboards' item before the Favorites since that organization seems cleaner to me.

* Address Levko's comments

* extend sync_user_details expiry (#5330)

* Revert "Updated axios (#5371)" (#5385)

This reverts commit 49536de1ed8331928cb6139d5aac2a2ebe780fc7.

* Fix duplicate stylesheets (#5396)

* Upgrade RQ to v1.5 (#5207)

* upgrade RQ to v1.5

* set job's started_at

* update healthcheck to match string worker names

* delay worker healthcheck for 5 minutes from start to allow enough time to load in case many workers try to load simultaneously

* log when worker cannot be found

* Initial a11y improvements (#5408)

* Fixed jsx-a11y problems

* Changed tabIndex to type number

* Initial improvements to DesktopNavbar accessibility

* Added accessibility to favorites list

* Improved accessibility in Desktop Navbar

* Improvements in Desktop navbar semantics

* Added aria roles to tags list

* Fixed tabindex type

* Improved aria labels in query control dropdown

* Added tab for help trigger close button

* Fixed typo

* Improved accessibility in query selector

* Changed resizable role to separator

* Added label to empty state close button

* Removed redundant and mistaken roles

* Used semantic components

* Removed tabIndex from anchor tags

* Removed mistakenly set menuitem role from anchors

* Removed tabIndex from Link components

* Removed improper hidden aria label from icon

* Reverted button and link roles in anchors for minimal merge conflicts

* Replaced alt attr with aria-label for icons

* Removed redundant menu role

* Improved accessibility of CodeBlock

* Removed improper role from schema browser

* Reverted favorites list to div

* Removed improper presentation role in query snippets

* Tracked changes for further PR

* Revert "Improved accessibility of CodeBlock"

* Add aria-labelledby to the associated code labels

This reverts commit 00a1685b1b37ad1ad5770880f9653dbd06d2cf3f.

* Wrapped close icon into button

* Add plain button (#5419)

* Add plain button

* Minor syntax improvements

* Refactor of Link component (#5418)

* Refactor of link component

* Applied anchor-is-valid to Link component

* Fixed Eslint error

* Removed improper anchor uses

* Fixed TS errors

* Reset failure counter on adhoc success (#5394)

* reset failure counter when query completes successfully via adhoc

* Use "query_id" in metadata, but still allow "Query ID" for transition/legacy support

* Add setting to identify email block domain (#5377)

* Add setting to identify email block domain

ref: #5368

* rename

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* rename and add comment

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* Update redash/handlers/users.py

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* Update redash/handlers/users.py

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* Add more comment to settting

Co-authored-by: Levko Kravets <levko.ne@gmail.com>

* feat: support Trino data-source (#5411)

* feat: add trino logo

* feat: add trino

* Improve css and add focus styles (#5420)

* Add styles for focused ant menus

* Add disabled styles to clickable button

* Improved dashboard header syntax and added focus

* Improved CSS syntax

* Add interactive styles

* Improved anchor dependent styles

* Improved styles of widget (gray more/delete btns)

* Add interactive style for favorite star

* Improved style of delete btn

* Make table content fill all space

* Added focus and active styles

* Scoped query snippets list

* Fixed behavior for all major browsers

* Replaced button styles with plain button

* Scoped items list styles

* Added focus styles to ant table

* Add plain button (#5419)

* Minor syntax improvements

* Refactor of Link component (#5418)

* Improve icon a11y (#5424)

* Added screen reader CSS

* Added description to external links

* Added spinner icon accessibility

* Added accessibility to exclamation and big message

* Added question and exclamation accessibility

* Hide decorative icons

* Standardized link design

* Added a11y to refresh icons

* Added aria-label to anchors and buttons

* Added a11y to conditional icons

* Added applicable labels to Ant Icons

* Changed escape to interpolation

* Replaced external links with opens in new tab

* Improved Tooltip hosts

* Added aria live to temporary elements

* Removed mistakenly added redundant helper

* Undoes unnecessarily added interpolation

* Replaced empty label with hidden

* Improved full icon label

* Improved display of live regions

* Added note

* remove unused class

* Created unique id

* Remove TODOs

* Proper action label

* Improved feedback for autocomplete toggle

* feature: add id hook

* refactor: use id hook

* standardize white space

* Query Runner: eccenca Corporate Memory (SPARQL) - query RDF / Linked Data Knowledge Graphs with redash (#5415)

* add Corporate Memory Runner based on cmempy 21.2.3

* fix code style

* apply some code nice ups

* use extendedEnum, boolean and extra_options for schema description

* use lower case sorting for data source types list

This correctly orders data source names which starts with lower
chars (such as eccenca Corporate Memory)

* add missing dblogo

* Adds configuration for `<Tooltip>` trigger on focus (#5434)

* refactor: add tooltip

* refactor: replace imports

* feature: add focus trigger

* Add jsx/a11y eslint plugin (#5439)

* build: install eslint jsx/a11y

* chore: add ESlint rules for jsx/a11y

* bug: add exceptions

* Add live regions to tooltip (#5440)

* feature: add live regions to tooltip

* bug: treat null case

* Improve input fields a11y (#5427)

* Added labels to params

* Added aria-label to inputs

* Linked unsemantic label with input

* Replaced span with label

* refactor: improve labels for schema browsers

* refactor: component accepts aria label

* refactor: add labels to sidebar search inputs

* Embed "external" link type into `<Link>` component (#5432)

* feature: add external link

* refactor: split external link into own component

* refactor: added link with icon

* refactor: remove reduntant tab index

* refactor: simplify props

* refactor: fix types

* refactor: bring types and components together

* refactor: improve treatment of target

* Prepare viz-lib release with Antd v4 (#5443)

* Get the user's current groups from props instead of useEffect(). (#5450)

useEffect() doesn't run until _after_ the component renders. Before the
hook runs, the value of `groups` === []. And this is passed to
<DynamicForm>'s `initialValue` prop. The `initialValue` is not re-evaluated
after useEffect() completes. So the users groups are never updated.

This change pulls the user's current groups from `user` prop on the
page.

* Run prettier (#5436)

* run in /client

* run in /viz-lib

* bug: fix wrong line ts expect error

* bug: fixed search pattern for prettier

* Fix Ace editor keyboard trap (#5451)

* bug: fix a11y and add sr notification

* refactor: improvements to sr notification

* Fixes issue #5445: Scheduled query not working (#5448)

* use 'query_id' everywhere instead of 'Query ID'
* some black while we're at it

Co-authored-by: Omer Lachish <omer@rauchy.net>

* fix: rollback pip version to avoid legacy resolver problem (#5467)



Co-authored-by: Lingkai Kong <lingkai.kong@databricks.com>

* fix: treat possibly empty hrefs (#5468)

* Replace `<a>` and `<button>` with `<PlainButton>` (#5433)

* Add PlainButton

* refactor close icons

* reorder import

* refactor remaining anchors

* refactor: replace remaining <button> and TODOs

* refactor: changed applicable elements to type link

* fix: minor details

* bug: fix tooltip ternary

* refactor: improve interactivity and semantics of schema list item

* Replace hardcoded ids with hook (#5444)

* refactor: replace hardcoded ids with hook

* refactor: replace hard coded ids with lodash id (class)

* Query Runner: SPARQL Endpoint Data Source (#5469)

* Athena: skip tables with no StorageDescriptor (#5447)

* Adds rate limit to /forgot. (#5425)

Security vulnerability was disclosed by Sohail Ahmed <https://www.linkedin.com/in/sohail-ahmed-755776184/>

* use ptpython instead of standard python shell (#5483)

* Expire sessions after 6 hours of inactivity (#5159)

Configurable with environment variables

* SFS-001: Adding support for the optional host connection property (#5490)

* Fixing failure report rendering (#5492)

* Use the correct rq connection in `get_queues_status` (#5491)

* fix big_query.py google api import error (#5482)

* Refine Dockerfile caching (#5484)

* README.md: Add TiDB to the Supported Data Sources (#5477)

* remove redundant fields from slack alert destination (#5514)

* Excel & CSV query runner (#2478)

* Excel query runner

* Param handling for read_excel

* CSV query runner

* Fix wrong module name

* Use yaml as query language

* Use yaml as query language for CSV

* Added icon and required modules

* Local address filtering

* Fix syntax error

* Use Yarn instead of NPM (#5541)

* Fix: log message for bad auth token was malformed (#5557)

* Pin python3 image version (#5570)

* Fix: Edit Source button disappeared for users without CanEdit perms (#5568)

* Guard against empty totalProcessedBytes in BigQuery responses (#5592)

* Guard against empty totalProcessedBytes in BigQuery responses

This field will be empty on query responses for tables with
row level access controls enabled.

* Fix whitespace

* Update redash/query_runner/big_query.py

Co-authored-by: Jesse <jwhitehouse@airpost.net>

* Fix: Specify the protobuf version (#5608)

protobuf package with a dependency of google-api-python-client released a new version (3.18.0) on September 16, 2021. Since then, the Docker build is failing, and it is presumed that there is a conflict with other DataSource packages that use protobuf. (phoenixdb, pydgraph)

* Add support for Firebolt Database (#5606)

* Fixes issue #5622 (#5623)

* Fix: pagination is broken on the dashboard list page (#5612)

* Fix: pagination is broken on the dashboard list page (#5516)
* Add test that reproduces issue #5466
* Fix: Duplicate dashboard rows were returned by Dashboard.all() (#5466)
* Update changelog for V10
* Update changelog for #5516

* Bump master to 11.0.0-dev (#5631)

* Typo(#5636)

* Fix TypeScript warning: integet -> integer typo (#5637)

* Update Readme to reflect Firebolt data source (#5649)

* Speed up BigQuery schema fetching (#5632)

New method improves schema fetching by as much as 98% on larger schemas

* Merge pull request from GHSA-vhc7-w7r8-8m34

* WIP: break the flask_oauthlib behavior

* Refactor google-oauth to use cryptographic state.

* Clean up comments

* Fix: tests didn't pass because of the scope issues.

Moved outside the create_blueprint method because this does not depend
on the Authlib object.

* Apply Arik's fixes. Tests pass.

* Merge pull request from GHSA-g8xr-f424-h2rv

* Merge pull request from GHSA-fcpv-hgq6-87h7

* Update changelog to incorporate security fixes and #5632 & #5606 (#5654)

* Update changelog to incorporate security fixes and #5632 & #5606

* Added reference to sqlite fix

* Update CircleCI configs and move advocate to main requirements file (#5658)

Ported from the 10.0.x branch

* Improve BigQuery schema fetching when environment contains 50+ datasets (#5667)

* Fix"Unable to locate package msodbcsql17"on M1 (#5638)

If you run the docker-compose on a Mac with the new M1 chip, you will get the "Unable to locate package msodbcsql17" error. Because there are currently no msodbcsql17 packages for arm64 architecture. The solution was to change the base image in the Dockerfile to change the installation to the older AMD architecture. 

FROM --platform=linux/amd64 python:3.7-slim-buster

* Fix: make plotly charts have unbounded hoverlabel name length (#5661)

* SAML auth: allow custom service provider settings from environment variable (#5621)

* Python query runner: add function that transforms pandas dataframe to result format (#5629)

* Fix: auto limit breaks for Oracle queries  (#5181)

Moves auto limit primitives to the base SQL query runner

* JSON query runner: optionally skip certificate verification (#5690)

Add verify option to json datasource runner to allow query developers the option of skipping certificate verification


Co-authored-by: Kevin Chiang <kchiang@tesla.com>
Co-authored-by: kevinchiang <kevinchiang@outlook.com>

* Fix: don't accept password login requests if password auth is disabled (#5693)

* Firebolt Query Runner: now uses firebold-sdk python package (#5689)

* Added firebolt-sdk in place of firebolt-sqlalchemy
* fixed connection issue
* fixed connection issue
* final commit
* Moved firebolt-sdk's imports to try block

Co-authored-by: rajeshSigmoid <rajeshk@sigmoidanalytics.com>

* Fix: Test Connection button disabled after save (#5666)

Closes #5455

* Snowflake: add option to lowercase column names (#5657)

Ported from app.redash.io codebase.

* Add option to lowercase column names
* Black the file

* Multi-filters: show all results by default (#5676)

* Move user profile image url into the users.details field (#5697)

Makes the details field a JSONB field per pg doc recommendations.

Update model.all() method to work properly now that profile_image_url
is not an independent field.

Closes #4469

* Fix: Dashboard List page crashes when sorting by name (#5645)

Closes #5119

* List pages: move sidebar to the left (#5698)

This change took place in steps:

1. Change order of content and sidebar.

Sidebar appears first, then content.

2. Fix padding

* Before: content was jutted against the sidebar. The sidebar was double-
padded from the edge of the content area.

After: Content has 15px pad against the sidebar. Sidebar has the same pad
as the page title.

3. Don't pad the content on small screens.

Otherwise the content appears off-center and doesn't use all of the
available space.

4. Allow Create buttons to have varying width

This makes the Query, Dashboard, and Alert list pages share the same style

* Update Dockerfile CHOWN into COPY (#5660)

Its more efficient to chown while COPY for large stacks of files as per https://github.com/docker/for-linux/issues/388

* Update contributor guidelines and clarify PR review process (#5714)

* Fix hard-coding of amd64 platform, make ARM build work. (#5687)

* Fix hard-coding of amd64 platform and make amd64 package installation conditional
* Cleanup Dockerfile for best practices
* Enable BuildKit for docker building

* [Fix] Broken image included in emails (#5719)

* Disable auto limit for mssql query runner (#5777)

* Use correct names for Apache projects (#5776)

Apache's trademark policy says to use the full name for these products on their first mention, on a page.

* Fix: mongodb schema refresh failed when user had insufficient permissions (#5734)

Co-authored-by: ban-lee-seng <banleesengpaints.marketing@gmail.com>

* mysql: add more configuration options (#5280)

* Remove unused params in query result GET handler (#5346)

* Added clear button for query-based parameter inputs (#5710)

* Add unarchive button to dashboard (#4697)

Co-authored-by: Jesse Whitehouse <jesse@whitehouse.dev>

* New Query Runner: Arango query runner (#5124)

Co-authored-by: Hugo Gresse <hugo.gresse@gmail.com>

* Sort Python safe built-ins (#5781)

Co-authored-by: Jiajie Zhong <zhongjiajie955@hotmail.com>
Co-authored-by: Jiajie Zhong <zhongjiajie955@gmail.com>

* Feature: allow configuration / increase of gunicorn timeout (#5783)

* New Query Runner: Netezza Performance Server (#5771)

Co-authored-by: Jesse <jwhitehouse@airpost.net>

* Clickhouse: Multi-statements support (#5792)

ClickHouse query runner splits query into several and execute each query in turn. The result of the last execution is returned. Implementation uses ClickHouse sessions in the HTTP protocol. `session_id` is generated for the first query and then it is used with the subsequent queries (together with the `session_check` parameter).

If query runner gets a success response with empty body from ClickHouse (for example, in case of temporary table creation request) query runner returns empty response.

authored-by: Liubov Ulitina <ulitinalm@vl.ru>

* README: update list of supported data sources (#5790)

Co-authored-by: Jesse Whitehouse <jesse@whitehouse.dev>

* New ElasticSearch Query Runner (#5794)

- A runner supporting the newest versions of ES,
  aggregation, nested aggregations and nested fields.
- A runner for the SQL OpenDistro flavor
- A runner for the SQL X-Pack flavor

Co-authored-by: Nicolas Le Manchet <nicolas@lemanchet.fr>
Co-authored-by: wwl717195673 <717195673@qq.com>

* README: add MariaDB to supported data sources (#5808)

* Databricks ODBC Driver: follow redirects (#5814)

Use curl --location

* Fix typo in users.py (#5818)

seperated -> separated

* Adding Apache Pinot Query Runner (#5798)

* Adding Apache Pinot integration

* address comments

* Microsoft Teams Webhook alert destination (#5691)

* Microsoft Teams Webhook alert destination

* Text formatting and new image for Microsoft Teams Webhook

* Comment on how to build frontend

* Add title to clarify webhook URL

* Make the message into a configurable template.

* Improve visibility of error message during schema retrieval (#5879)

* handle query execution error in one place. increase ability to debug issues with schema retrieval

* split message and details for error reporting

Co-authored-by: Dmitriy Apollonin <dmitriy.apollonin@aspireiq.com>

* fix: Support importlib_metadata v5.0.0 (#5840)

* fix: Support importlib_metadata v5.0.0

importlib_metadata removed compatibility shims for deprecated entry point interfaces.
see: https://github.com/python/importlib_metadata/blob/main/CHANGES.rst#v500

Filter result of entry_points function by group parameter.
see: https://importlib-metadata.readthedocs.io/en/latest/api.html#importlib_metadata.entry_points

* fix: Enable to run in older python version

In circleci frontend-unit-tests, old node image is used and python 3.5 is used.
Support both old version and latest version by checking ijmportlib_metadata version

* bug fix SAML_LOGIN_ENABLED setting logic (#5784)

* fix word spell (#5859)

Co-authored-by: guyu <guyu@fordeal.com>

* Update references from Discourse to Discussions. (#5916)

* see https://discuss.redash.io/t/redash-datasource-connection-test-fails/9989 (#5898)

* Remove extensions mechanism (#5895)

* Remove extensions mechanism.

* Missing change.

* Add "set -e" to docker_build (#5896)

* feat: New support databend for redash (#5902)

* feat: New support databend for redash

* fix

* Update development workflow for Apple Silicon, Node version, default port, and maildev image (#5932)

* Update ngines definition to allow for newer versions of Node.

With Node version 19 I stumbled into some issues so for now bumped it to v16, until we get to updating the libraries we use.

* docker-compose.yml updates:

1. Switch to newer maildev docker image.
2. Update local port to 5001 as 5000 seems to be used by a system process now.

* Update pymssql and pyarrow. Also commented out ibm-db until we have a way to not install it only on ARM.

* Fix group not found message. (#5935)

* Fix/databend params (#5937)

* fix: databend params

* add databend logo

* fix log

* fix log

* Update redash/query_runner/databend.py

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

---------

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Add liveness check for workers (#5886)

* Add liveness check script for workers

closes #5885

* delete extra script

* Rename worker_healthcheck -> workers_healthcheck

---------

Co-authored-by: Arik Fraimovich <arik@arikfr.com>

* Bump mysqlclient from 1.3.14 to 2.1.1, memsql from 3.0.0 to 3.2.0, fixing MySQL multi statement support (#5957)

* Extracting front-end only: removed back-end code and scripts; removed CI/CD configs

---------

Signed-off-by: koooge <koooooge@gmail.com>
Co-authored-by: Jim Sparkman <jim.sparkman@houselogix.com>
Co-authored-by: Levko Kravets <levko.ne@gmail.com>
Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
Co-authored-by: Omer Lachish <omer@rauchy.net>
Co-authored-by: Mike Nason <nason@narrator.ai>
Co-authored-by: Daniel Lang <me@daniellang.net>
Co-authored-by: Vladislav Denisov <denisov@sports.ru>
Co-authored-by: Alex Kovar <ajkovar@gmail.com>
Co-authored-by: Levko Kravets <kravets-levko@users.noreply.github.com>
Co-authored-by: Lei Ni <65617553+leini-db@users.noreply.github.com>
Co-authored-by: Arik Fraimovich <arik@arikfr.com>
Co-authored-by: Jannis Leidel <jannis@leidel.info>
Co-authored-by: simonschneider-db <44668299+simonschneider-db@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ben Amor <43776482+benamorbe@users.noreply.github.com>
Co-authored-by: Tobias Macey <tmacey@boundlessnotions.com>
Co-authored-by: koooge <koooooge@gmail.com>
Co-authored-by: restyled-io[bot] <32688539+restyled-io[bot]@users.noreply.github.com>
Co-authored-by: Restyled.io <commits@restyled.io>
Co-authored-by: peterlee <yankeeguyu@gmail.com>
Co-authored-by: max-voronov <70445727+max-voronov@users.noreply.github.com>
Co-authored-by: Lingkai Kong <lingkai.kong@databricks.com>
Co-authored-by: Alexander Rusanov <alexander.rusanov@gmail.com>
Co-authored-by: Rafael Wendel <rafawendel2010@gmail.com>
Co-authored-by: Christopher Grant <chrisgrant@lavabit.com>
Co-authored-by: Chad Chen <chad.chen@databricks.com>
Co-authored-by: Jonathan Hult <jonathan@jonathanhult.com>
Co-authored-by: Jerry <610819267@qq.com>
Co-authored-by: Jerry <jerry.yuan@webweye.com>
Co-authored-by: Josh Bohde <josh@joshbohde.com>
Co-authored-by: deecay <deecay@users.noreply.github.com>
Co-authored-by: Jiajie Zhong <zhongjiajie955@hotmail.com>
Co-authored-by: Elad Ossadon <elado7@gmail.com>
Co-authored-by: Elad Ossadon <elad.ossadon@databricks.com>
Co-authored-by: Patrick Yang <patrick.yang@databricks.com>
Co-authored-by: Tim Gates <tim.gates@iress.com>
Co-authored-by: Christopher Grant <christopher.grant@protonmail.com>
Co-authored-by: Vipul Mathur <vipulmathur@users.noreply.github.com>
Co-authored-by: Justin Talbot <76974990+justint-db@users.noreply.github.com>
Co-authored-by: Đặng Minh Dũng <dungdm93@live.com>
Co-authored-by: Sebastian Tramp <mail@sebastian.tramp.name>
Co-authored-by: Jesse <jesse.whitehouse@databricks.com>
Co-authored-by: Nolan Nichols <nnichols@mazetx.com>
Co-authored-by: iwakiriK <balssearch0113@gmail.com>
Co-authored-by: Ben Herzberg <69909379+BenSatori@users.noreply.github.com>
Co-authored-by: adamzwakk <shamist@gmail.com>
Co-authored-by: Jawshua <Jawshua@users.noreply.github.com>
Co-authored-by: case-k-git <40357957+case-k-git@users.noreply.github.com>
Co-authored-by: Omer Lachish <289488+rauchy@users.noreply.github.com>
Co-authored-by: Shen Li <shenli3514@gmail.com>
Co-authored-by: Kyunghwan Ko <64265107+kyunghwan1207@users.noreply.github.com>
Co-authored-by: Tucker Leavitt <tucker.leavitt@gmail.com>
Co-authored-by: Jesse <jwhitehouse@airpost.net>
Co-authored-by: zoomdot <gninggoon@gmail.com>
Co-authored-by: rajeshSigmoid <89909168+rajeshSigmoid@users.noreply.github.com>
Co-authored-by: Aratrik Pal <44343120+AP2008@users.noreply.github.com>
Co-authored-by: Dan Goldin <dangoldin@gmail.com>
Co-authored-by: rajeshmauryasde <rajeshk@sigmoidanalytics.com>
Co-authored-by: Katsuya Shimabukuro <katsu.generation.888@gmail.com>
Co-authored-by: Katsuya Shimabukuro <katsuya-shimabukuro@freee.co.jp>
Co-authored-by: Robin Zheng <zhengr@msn.com>
Co-authored-by: Steven Hao <stevenhao@users.noreply.github.com>
Co-authored-by: be30c9 <92396435+be30c9@users.noreply.github.com>
Co-authored-by: Tin C <tim5go@gmail.com>
Co-authored-by: Kevin Chiang <kchiang@tesla.com>
Co-authored-by: kevinchiang <kevinchiang@outlook.com>
Co-authored-by: anshulhiran <89910231+anshulhiran@users.noreply.github.com>
Co-authored-by: JyothiGandi <JyothiGandi@users.noreply.github.com>
Co-authored-by: Bruno Agutoli <bruno@propelleraero.com.au>
Co-authored-by: adamzwakk <adam@adamzwakk.com>
Co-authored-by: Jesse <jesse@whitehouse.dev>
Co-authored-by: Gabriel A. Devenyi <gdevenyi@gmail.com>
Co-authored-by: Ian <68525743+decaffeinatedio@users.noreply.github.com>
Co-authored-by: Greg Stein <gstein@gmail.com>
Co-authored-by: Leandro Lorenzini <leandro@outlook.sg>
Co-authored-by: ban-lee-seng <banleesengpaints.marketing@gmail.com>
Co-authored-by: Bryan Yang <kenshin2004528@gmail.com>
Co-authored-by: Hugo Gresse <hugo.gresse@gmail.com>
Co-authored-by: Jiajie Zhong <zhongjiajie955@gmail.com>
Co-authored-by: Jacek Jabłoński <35669512+jacek-jablonski@users.noreply.github.com>
Co-authored-by: Aniket Kulkarni <aniket-s-kulkarni@users.noreply.github.com>
Co-authored-by: Nicolas Le Manchet <nicolas@lemanchet.fr>
Co-authored-by: wwl717195673 <717195673@qq.com>
Co-authored-by: luc-x41 <45362069+luc-x41@users.noreply.github.com>
Co-authored-by: trigremm <askhat.molkenov@gmail.com>
Co-authored-by: Ikko Ashimine <eltociear@gmail.com>
Co-authored-by: Xiang Fu <xiangfu.1024@gmail.com>
Co-authored-by: Dmitriy <apollonin@gmail.com>
Co-authored-by: Dmitriy Apollonin <dmitriy.apollonin@aspireiq.com>
Co-authored-by: tsbkw <s-tsubokawa@mercari.com>
Co-authored-by: Izumu KUSUNOKI <izumu.kusunoki@gmail.com>
Co-authored-by: guyu <guyu@fordeal.com>
Co-authored-by: Zach Liu <zachliu@users.noreply.github.com>
Co-authored-by: Genki Sugawara <sugawara@winebarrel.jp>
Co-authored-by: Jeremy <hantmac@outlook.com>
Co-authored-by: David Choi <themars@gmail.com>
Co-authored-by: Shubham Jain <shubhrjain7@gmail.com>
Co-authored-by: myonlylonely <myonlylonely@users.noreply.github.com>
  • Loading branch information
Show file tree
Hide file tree
Showing 951 changed files with 87,560 additions and 4,410 deletions.
15 changes: 15 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
client/.tmp/
client/dist/
node_modules/
viz-lib/node_modules/
.tmp/
.venv/
venv/
.git/
/.codeclimate.yml
/.coverage
/coverage.xml
/.circleci/
/.github/
/netlify.toml
/setup/
28 changes: 27 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,29 @@
.venv
venv/
.cache
.coverage.*
.coveralls.yml
.idea
*.pyc
rd_service/settings.py
.nyc_output
coverage
.coverage
coverage.xml
client/dist
.DS_Store
.#*
\#*#
*~
_build
.vscode
.env

dump.rdb

node_modules
.tmp
.sass-cache
npm-debug.log

client/cypress/screenshots
client/cypress/videos
1,615 changes: 1,615 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

101 changes: 101 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Contributing Guide

Thank you for taking the time to contribute! :tada::+1:

The following is a set of guidelines for contributing to Redash. These are guidelines, not rules, please use your best judgement and feel free to propose changes to this document in a pull request.

:star: If you're already here and love the project, please make sure to press the Star button. :star:
## Table of Contents

[How can I contribute?](#how-can-i-contribute)

- [Reporting Bugs](#reporting-bugs)
- [Suggesting Enhancements / Feature Requests](#suggesting-enhancements--feature-requests)
- [Pull Requests](#pull-requests)
- [Documentation](#documentation)
- Design?

[Additional Notes](#additional-notes)

- [Release Method](#release-method)
- [Code of Conduct](#code-of-conduct)

## Quick Links:

- [User Forum](https://github.com/getredash/redash/discussions)
- [Documentation](https://redash.io/help/)


---
## How can I contribute?

### Reporting Bugs

When creating a new bug report, please make sure to:

- Search for existing issues first. If you find a previous report of your issue, please update the existing issue with additional information instead of creating a new one.
- If you are not sure if your issue is really a bug or just some configuration/setup problem, please start a [Q&A discussion](https://github.com/getredash/redash/discussions/new?category=q-a) first. Unless you can provide clear steps to reproduce, it's probably better to start with a discussion and later to open an issue.
- If you still decide to open an issue, please review the template and guidelines and include as much details as possible.

### Suggesting Enhancements / Feature Requests

If you would like to suggest an enhancement or ask for a new feature:

- Please check [the Ideas discussions](https://github.com/getredash/redash/discussions/categories/ideas) for existing threads about what you want to suggest/ask. If there is, feel free to upvote it to signal interest or add your comments.
- If there is no open thread, you're welcome to start one to have a discussion about what you want to suggest. Try to provide as much details and context as possible and include information about *the problem you want to solve* rather only *your proposed solution*.

### Pull Requests

**Code contributions are welcomed**. For big changes or significant features, it's usually better to reach out first and discuss what you want to implement and how (we recommend reading: [Pull Request First](https://medium.com/practical-blend/pull-request-first-f6bb667a9b6#.ozlqxvj36)). This is to make sure that what you want to implement is aligned with our goals for the project and that no one else is already working on it.

#### Criteria for Review / Merging

When you open your pull request, please follow this repository’s PR template carefully:

- Indicate the type of change
- If you implement multiple unrelated features, bug fixes, or refactors please split them into individual pull requests.
- Describe the change
- If fixing a bug, please describe the bug or link to an existing github issue / forum discussion
- Include UI screenshots / GIFs whenever possible
- Please add [documentation](#documentation) for new features or changes in functionality along with the code.
- Please follow existing code style:
- Python: we use [Black](https://github.com/psf/black) to auto format the code.
- Javascript: we use [Prettier](https://github.com/prettier/prettier) to auto-format the code.

#### Initial Review (1 week)

During this phase, a team member will apply the “Team Review” label if a pull request meets our criteria or a “Needs More Information” label if not. If more information is required, the team member will comment which criteria have not been met.

If your pull request receives the “Needs More Information” label, please make the requested changes and then remove the label. This resets the 1 week timer for an initial review.

Stale pull requests that remain untouched in “Needs More Information” for more than 4 weeks will be closed.

If a team member closes your pull request, you may reopen it after you have made the changes requested during initial review. After you make these changes, remove the “Needs More Information” label. This again resets the timer for another initial review.

#### Full Review (2 weeks)

After the “Team Review” label is applied, a member of the core team will review the PR within 2 weeks.

Reviews will approve, request changes, or ask questions to discuss areas of uncertainty. After you’ve responded, a member of the team will re-review within one week.

#### Merging (1 week)

After your pull request has been approved, a member of the core team will merge the pull request within a week.

### Documentation

The project's documentation can be found at [https://redash.io/help/](https://redash.io/help/). The [documentation sources](https://github.com/getredash/website/tree/master/src/pages/kb) are hosted on GitHub. To contribute edits / new pages, you can use GitHub's interface. Click the "Edit on GitHub" link on the documentation page to quickly open the edit interface.

## Additional Notes

### Release Method

We publish a stable release every ~3-4 months, although the goal is to get to a stable release every month.

Every build of the master branch updates the *redash/redash:preview* Docker Image. These releases are usually stable, but might contain regressions and therefore recommended for "advanced users" only.

When we release a new stable release, we also update the *latest* Docker image tag, the EC2 AMIs and GCE images.

## Code of Conduct

This project adheres to the Contributor Covenant [code of conduct](https://redash.io/community/code_of_conduct). By participating, you are expected to uphold this code. Please report unacceptable behavior to team@redash.io.
108 changes: 108 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
FROM node:14.17 as frontend-builder

RUN npm install --global --force yarn@1.22.10

# Controls whether to build the frontend assets
ARG skip_frontend_build

ENV CYPRESS_INSTALL_BINARY=0
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1

RUN useradd -m -d /frontend redash
USER redash

WORKDIR /frontend
COPY --chown=redash package.json yarn.lock .yarnrc /frontend/
COPY --chown=redash viz-lib /frontend/viz-lib

# Controls whether to instrument code for coverage information
ARG code_coverage
ENV BABEL_ENV=${code_coverage:+test}

RUN if [ "x$skip_frontend_build" = "x" ] ; then yarn --frozen-lockfile --network-concurrency 1; fi

COPY --chown=redash client /frontend/client
COPY --chown=redash webpack.config.js /frontend/
RUN if [ "x$skip_frontend_build" = "x" ] ; then yarn build; else mkdir -p /frontend/client/dist && touch /frontend/client/dist/multi_org.html && touch /frontend/client/dist/index.html; fi

FROM python:3.7-slim-buster

EXPOSE 5000

# Controls whether to install extra dependencies needed for all data sources.
ARG skip_ds_deps
# Controls whether to install dev dependencies.
ARG skip_dev_deps

RUN useradd --create-home redash

# Ubuntu packages
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
gnupg \
build-essential \
pwgen \
libffi-dev \
sudo \
git-core \
# Postgres client
libpq-dev \
# ODBC support:
g++ unixodbc-dev \
# for SAML
xmlsec1 \
# Additional packages required for data sources:
libssl-dev \
default-libmysqlclient-dev \
freetds-dev \
libsasl2-dev \
unzip \
libsasl2-modules-gssapi-mit && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*


ARG TARGETPLATFORM
ARG databricks_odbc_driver_url=https://databricks.com/wp-content/uploads/2.6.10.1010-2/SimbaSparkODBC-2.6.10.1010-2-Debian-64bit.zip
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
&& curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql17 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& curl "$databricks_odbc_driver_url" --location --output /tmp/simba_odbc.zip \
&& chmod 600 /tmp/simba_odbc.zip \
&& unzip /tmp/simba_odbc.zip -d /tmp/ \
&& dpkg -i /tmp/SimbaSparkODBC-*/*.deb \
&& printf "[Simba]\nDriver = /opt/simba/spark/lib/64/libsparkodbc_sb64.so" >> /etc/odbcinst.ini \
&& rm /tmp/simba_odbc.zip \
&& rm -rf /tmp/SimbaSparkODBC*; fi

WORKDIR /app

# Disable PIP Cache and Version Check
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
ENV PIP_NO_CACHE_DIR=1

# rollback pip version to avoid legacy resolver problem
RUN pip install pip==20.2.4;

# We first copy only the requirements file, to avoid rebuilding on every file change.
COPY requirements_all_ds.txt ./
RUN if [ "x$skip_ds_deps" = "x" ] ; then pip install -r requirements_all_ds.txt ; else echo "Skipping pip install -r requirements_all_ds.txt" ; fi

COPY requirements_dev.txt ./
RUN if [ "x$skip_dev_deps" = "x" ] ; then pip install -r requirements_dev.txt ; fi

COPY requirements.txt ./
RUN pip install -r requirements.txt

COPY --chown=redash . /app
COPY --from=frontend-builder --chown=redash /frontend/client/dist /app/client/dist
RUN chown redash /app
USER redash

ENTRYPOINT ["/app/bin/docker-entrypoint"]
CMD ["server"]
23 changes: 23 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Copyright (c) 2013-2020, Arik Fraimovich.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
116 changes: 116 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
<p align="center">
<img title="Redash" src='https://redash.io/assets/images/logo.png' width="200px"/>
</p>

[![Documentation](https://img.shields.io/badge/docs-redash.io/help-brightgreen.svg)](https://redash.io/help/)
[![Datree](https://s3.amazonaws.com/catalog.static.datree.io/datree-badge-20px.svg)](https://datree.io/?src=badge)
[![Build Status](https://circleci.com/gh/getredash/redash.png?style=shield&circle-token=8a695aa5ec2cbfa89b48c275aea298318016f040)](https://circleci.com/gh/getredash/redash/tree/master)

Redash is designed to enable anyone, regardless of the level of technical sophistication, to harness the power of data big and small. SQL users leverage Redash to explore, query, visualize, and share data from any data sources. Their work in turn enables anybody in their organization to use the data. Every day, millions of users at thousands of organizations around the world use Redash to develop insights and make data-driven decisions.

Redash features:

1. **Browser-based**: Everything in your browser, with a shareable URL.
2. **Ease-of-use**: Become immediately productive with data without the need to master complex software.
3. **Query editor**: Quickly compose SQL and NoSQL queries with a schema browser and auto-complete.
4. **Visualization and dashboards**: Create [beautiful visualizations](https://redash.io/help/user-guide/visualizations/visualization-types) with drag and drop, and combine them into a single dashboard.
5. **Sharing**: Collaborate easily by sharing visualizations and their associated queries, enabling peer review of reports and queries.
6. **Schedule refreshes**: Automatically update your charts and dashboards at regular intervals you define.
7. **Alerts**: Define conditions and be alerted instantly when your data changes.
8. **REST API**: Everything that can be done in the UI is also available through REST API.
9. **Broad support for data sources**: Extensible data source API with native support for a long list of common databases and platforms.

<img src="https://github.com/getredash/website/8e820cd02c73a8ddf4f946a9d293c54fd3fb08b9/website/_assets/images/redash-anim.gif" width="80%"/>

## Getting Started

* [Setting up Redash instance](https://redash.io/help/open-source/setup) (includes links to ready-made AWS/GCE images).
* [Documentation](https://redash.io/help/).

## Supported Data Sources

Redash supports more than 35 SQL and NoSQL [data sources](https://redash.io/help/data-sources/supported-data-sources). It can also be extended to support more. Below is a list of built-in sources:

- Amazon Athena
- Amazon CloudWatch / Insights
- Amazon DynamoDB
- Amazon Redshift
- ArangoDB
- Axibase Time Series Database
- Apache Cassandra
- ClickHouse
- CockroachDB
- Couchbase
- CSV
- Databricks
- DB2 by IBM
- Dgraph
- Apache Drill
- Apache Druid
- Eccenca Corporate Memory
- Elasticsearch
- Exasol
- Microsoft Excel
- Firebolt
- Databend
- Google Analytics
- Google BigQuery
- Google Spreadsheets
- Graphite
- Greenplum
- Apache Hive
- Apache Impala
- InfluxDB
- IBM Netezza Performance Server
- JIRA (JQL)
- JSON
- Apache Kylin
- OmniSciDB (Formerly MapD)
- MariaDB
- MemSQL
- Microsoft Azure Data Warehouse / Synapse
- Microsoft Azure SQL Database
- Microsoft Azure Data Explorer / Kusto
- Microsoft SQL Server
- MongoDB
- MySQL
- Oracle
- Apache Phoenix
- Apache Pinot
- PostgreSQL
- Presto
- Prometheus
- Python
- Qubole
- Rockset
- Salesforce
- ScyllaDB
- Shell Scripts
- Snowflake
- SPARQL
- SQLite
- TiDB
- TreasureData
- Trino
- Uptycs
- Vertica
- Yandex AppMetrrica
- Yandex Metrica

## Getting Help

* Issues: https://github.com/getredash/redash/issues
* Discussion Forum: https://github.com/getredash/redash/discussions/

## Reporting Bugs and Contributing Code

* Want to report a bug or request a feature? Please open [an issue](https://github.com/getredash/redash/issues/new).
* Want to help us build **_Redash_**? Fork the project, edit in a [dev environment](https://redash.io/help-onpremise/dev/guide.html) and make a pull request. We need all the help we can get!

## Security

Please email security@redash.io to report any security vulnerabilities. We will acknowledge receipt of your vulnerability and strive to send you regular updates about our progress. If you're curious about the status of your disclosure please feel free to email us again. If you want to encrypt your disclosure email, you can use [this PGP key](https://keybase.io/arikfr/key.asc).

## License

BSD-2-Clause.
Loading

0 comments on commit 072df03

Please sign in to comment.