* Add support for Google Hangouts Chat as alert destination
* Remove redundant imports
* Remove code used for debugging
* Fix pep8 warnings
* Update redash/destinations/hangoutschat.py
Add friendly name by separating type and description
Co-Authored-By: pieter-venter <pieterventer@geotab.com>
* Fix pep8 warnings. Rename image to match desitnation type.
* Show message for unknown alert state in default color
* Create React version for the EmailSettingsWarning
* Migrate the Create User Page
* Migrate UserProfile to React
* Add /users/me to the routes (Percy ftw)
* Fix UserShow test spec
* Remove Error Messages component
* Show invitation link if email server not setup (#3519)
* return invite link to client if e-mail server is not set up
* add a couple of tests to make sure invite links are only returned when neccessary
* show invite link when e-mail is not configured
* remove "an e-mail has been sent" when there's no e-mail configured
* return invite_url in re-invites as well. Also refactor to reuse the code.
* Use CreateUserDialog instead of Page
* Render invite link on Resend Invitation click
* Add email validation to DynamicForm
* Fix EmailWarning position + update user list with user creation success
* Fix console error on UserProfile
* Redirect from /users/new + rename createUser -> showCreateUserDialog
* Use alert instead of toastr for user creation errors
* Remove logic from CreateUserDialog
* CR
* Use Promise.reject instead of throw to avoid console error
* append slug to /verification_email endpoint when in MULTI_ORG mode
* Revert "append slug to /verification_email endpoint when in MULTI_ORG mode"
This reverts commit 817fb034c4.
* fix for /email_verification in MULTI_ORG setups
* Updated npm to support react hooks
* Added <QuerySelector />
* Changed selectQuery to also clear, completed 2->3 dots in msg, avoiding setSearching on stale rejection.
* Removed unused highlight lib
* use the textless endpoint (/api/queries/:id/results) for pristine
queriest
* reverse conditional. not not is making me the headaches.
* add ParameterizedQuery#is_safe with an inital naive implementation which
treats any query with a text parameter as not safe. This will be
remedied later when DB drivers will handle these parameters.
* allow getting new query results even if user has only view permissions
to the data source (given that the query is safe)
* fix lint error - getDerivedStateFromProps should be placed after state
* Revert "use the textless endpoint (/api/queries/:id/results) for pristine"
This reverts commit cd2cee7738.
* move execution preparation to a different function, which will be soon
reused
* go to textless /api/queries/:id/results by default
* let the query view decide if text or textless endpoint is needed
* allow safe queries to be executed in the UI even if the user has no
permission to execute and create new query results
* change `run_query`'s signature to accept a ParameterizedQuery instead of
constructing it inside
* use dict#get instead of a None guard
* use ParameterizedQuery in queries handler as well
* test that /queries/:id/results allows execution of safe queries even if
user has view_only permissions
* lint
* raise HTTP 400 when receiving invalid parameter values. Fixes#3394
* remove unused methods
* avoid cyclic imports by importing only when needed
* verify that a ParameterizedQuery without any parameters is considered
safe
* introduce query.parameter_schema
* encapsulate ParameterizedQuery creation inside Query
* Add check for repository url
* Use CIRCLE_REPOSITORY_URL directly
* Change percy waiting to be with resources instead of time
* Add data sources types resource to Edit Data Source + eslint fixes
* Separate Page Screenshots in different spec files
* Moved component from services->components
* Added help trigger to header
* Reverted tooltip-anchor swap
* Moved trigger location in html (to mirror saas)
* Removed white space
* Changed tooltip text to “Help”
* Update DynamicForm export
* Move UserShow to users folder
* Migrate User profile header and create DynamicForm for basic data
* Update UserShow to use UserProfile prop
* Add API Key input
* Add handler to regenerate API Key button
* Handle user profile save
* Add readOnly prop to DynamicForm and begin disabled user behavior
* Add Change Password Modal
* Remove action buttons for disabled users
* Add send password reset behavior
* Add minLength and password comparison to Password Modal
* Resend Invitation button
* Add Convert User Info
* Fix UserShow test
* Some code updates
* Add enable/disable user button
* Add UserPolicy as an idea
* Remove UserPolicy
* Create Edit Profile spec
* Move User profile screenshot to Edit Profile Spec
* Add tests for saving user and changing password errors
* CC is back :) - Fix trailing spaces
* Add test for succesful password update
* A few improvements from code review
* Remove Toggle User button when seeing your own profile
* Create InputWithCopy
* Fix possible errors when network is off and improve Email not sent alert
* Add default response object for $http possible errors
* Changes in UserEdit
- removed onClick from methods name
- regenerate API Key now uses InputWithCopy
- Password title added
* Update UserEdit render behavior and styling
- Password title changed to h5
- change rendering rules for actions
- Password modal is now closed when password is changed
- change DynamicForm readOnly to the fields and add hideSubmitButton
* Create ChangePasswordDialog and update UserEdit
* Fix possible console error
* Remove password match assertion from spec
* Fix typo
* stop testing `collect_query_parameters`, it's an implementation detail
* add tests for `missing_query_params`
* rename SQLQuery -> ParameterizedSqlQuery
* rename sql_query.py to parameterized_query.py
* split to parameterized queries and parameterized SQL queries, where
parameterized queries only do templating and parameterized SQL queries
add tree validation on top of it
* move missing parameter detection to ParameterizedQuery
* get rid of some old code
* fix tests
* set syntax to `custom`
* revert the max-age-related refactoring
* 👋 tree validations 😢
* BaseQueryRunner is no longer a factory for ParameterizedQuery, for now
* add an endpoint for running a query by its id and (optional) parameters
without having to provide the query text
* adds parameter schema to ParameterizedQuery
* adds parameter schema validation (currently for strings)
* validate number parameters
* validate date parameters
* validate parameters on POST /api/queries/<id>/results
* validate enum parameters
* validate date range parameters
* validate query-based dropdowns by preprocessing them at the handler
level and converting them to a populated enum
* change _is_date_range to be a tad more succinct
* a single assignment with a `map` is sufficiently explanatory
* Update redash/utils/parameterized_query.py
Co-Authored-By: rauchy <omer@rauchy.net>
* Update redash/utils/parameterized_query.py
Co-Authored-By: rauchy <omer@rauchy.net>
* Update redash/utils/parameterized_query.py
Co-Authored-By: rauchy <omer@rauchy.net>
* Update redash/utils/parameterized_query.py
Co-Authored-By: rauchy <omer@rauchy.net>
* Update redash/handlers/query_results.py
Co-Authored-By: rauchy <omer@rauchy.net>
* Update redash/utils/parameterized_query.py
Co-Authored-By: rauchy <omer@rauchy.net>
* build error message inside the error
* support all types of numbers as number parameters
* check for permissions when populating query-based dropdowns
* check for access to query before running it
* check for empty rows when populating query-based enums
* don't bother loading query results if user doesn't have access
* 💥 on unexpected parameter types
* parameter schema default is a list, not a dictionary
* fix a totally unrelated typo
* remove redundant null guards
* introduce /dropdown.json endpoint with dummy data
* wire frontend to /dropdown.json
* always return name/value combos from /dropdown.json
* load actual data into /dropdown.json
* pluck correct values for `name` and `value`
* reuse dropdwon plucking logic in QueryResultResource
* simplify _get_dropdown_values
* when doing parameter validation, we only care about the value and not
the display name
* rename dropdown to dropdownOptions
* move dropdown_values to utils/parameterized_query.py
* stop converting queries to enums and encapsulate the work inside
ParameterizedQuery (almost - /dropdown.json would still access the
dropdown_values method)
* re-order arguments by importance
* test query parameter validation
* tests for dropdown_values logic
* remove `.json` suffix to the dropdown endpoint
* allow `BaseResource` to handle JSON stuff
* move _pluck_name_and_value outside its containing method
* case-insensitive lookup when plucking name and value
* separate concerns and simplify test isolation for `dropdown_values`
* pick the default column according to the order specified in the query
result columns attribute
* use `current_org` instead of passing `org`
* test that user has access to the query when calling the /dropdown
endpoint