Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3.0 #2

Merged
merged 48 commits into from
Oct 23, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
807a027
fix: is_select with UNION (#25290)
betodealmeida Sep 14, 2023
2d1f1e3
fix: Add explicit ON DELETE CASCADE for dashboard_roles (#25320)
john-bodley Sep 18, 2023
8ca49d4
fix(chart): Supporting custom SQL as temporal x-axis column with filt…
Sep 18, 2023
61dcc70
fix: Use RLS clause instead of ID for cache key (#25229)
jfrag1 Sep 18, 2023
0d53446
fix: Improve the reliability of alerts & reports (#25239)
jfrag1 Sep 19, 2023
5390e2d
fix: DashboardRoles cascade operation (#25349)
michael-s-molina Sep 20, 2023
88e6f22
fix: datetime with timezone excel export (#25318)
betodealmeida Sep 21, 2023
c508a33
fix: Workaround for Cypress ECONNRESET error (#25399)
michael-s-molina Sep 25, 2023
721db8a
fix(sqllab): invalid persisted tab state (#25308) (#25398)
justinpark Sep 26, 2023
eacdbdd
fix: Rename on_delete parameter to ondelete (#25424)
john-bodley Sep 26, 2023
4a65d41
fix: preventing save button from flickering in SQL Lab (#25106)
fisjac Sep 26, 2023
1757ce4
fix: chart import (#25425)
betodealmeida Sep 27, 2023
0c6db23
fix: swagger UI CSP error (#25368)
dpgaspar Sep 27, 2023
8dfe95f
fix: smarter date formatter (#25404)
betodealmeida Sep 27, 2023
b83bd5d
fix(sqllab): invalid start date (#25437)
justinpark Sep 27, 2023
7b2b696
fix(nativeFilters): Speed up native filters by removing unnecessary r…
Always-prog Sep 28, 2023
731cd65
fix(SqlLab): make icon placement even (#25372)
CorbinBullard Sep 28, 2023
58778a7
fix: Duplicate items when pasting into Select (#25447)
michael-s-molina Sep 28, 2023
d8e87aa
fix: update the SQLAlchemy model definition at json column for Log ta…
cnabro Sep 29, 2023
f682dba
fix(helm chart): set chart appVersion to 3.0.0 (#25373)
celalettin1286 Sep 29, 2023
615d7f5
fix(mysql): handle string typed decimal results (#24241)
villebro Sep 29, 2023
0dd1a3b
fix: Styles not loading because of faulty CSP setting (#25468)
kgabryje Sep 29, 2023
455b3d8
fix(sqllab): error with lazy_gettext for tab titles (#25469)
nytai Sep 30, 2023
9d1ab46
fix: Address Mypy issue which is causing CI to fail (#25494)
john-bodley Oct 2, 2023
4ad2a05
chore: Adds 3.0.1 CHANGELOG
michael-s-molina Oct 3, 2023
ae700d1
fix: Unable to sync columns when database or dataset name contains `+…
mapledan Oct 3, 2023
1367d7b
fix(sqllab): Broken query containing 'children' (#25490)
justinpark Oct 4, 2023
220dc58
chore: Expand error detail on screencapture (#25519)
justinpark Oct 4, 2023
8b66603
fix: tags permissions error message (#25516)
Khrol Oct 4, 2023
dd769eb
fix: Apply normalization to all dttm columns (#25147)
kgabryje Oct 6, 2023
286c095
fix: REST API CSRF exempt list (#25590)
dpgaspar Oct 10, 2023
69c2378
fix(RLS): Fix Info Tooltip + Button Alignment on RLS Modal (#25400)
CorbinBullard Oct 10, 2023
53b84b9
fix: thubmnails loading - Talisman default config (#25486)
Khrol Oct 11, 2023
254cc36
fix(Presto): catch DatabaseError when testing Presto views (#25559)
zhaorui2022 Oct 11, 2023
732c5b1
fix(Charts): Set max row limit + removed the option to use an empty r…
CorbinBullard Oct 11, 2023
a0b2dc4
fix(window): unavailable localStorage and sessionStorage (#25599)
frassinier Oct 11, 2023
c44f1a3
fix: finestTemporalGrainFormatter (#25618)
betodealmeida Oct 11, 2023
cd1b7a4
fix: revert fix(sqllab): Force trino client async execution (#24859) …
villebro Oct 13, 2023
890bf59
chore: Updates 3.0.1 CHANGELOG
michael-s-molina Oct 13, 2023
d7cbdca
fix(sqllab): Mistitled for new tab after rename (#25523)
justinpark Oct 13, 2023
701ee30
fix(sqllab): template validation error within comments (#25626)
justinpark Oct 13, 2023
ec3bed7
fix: avoid 500 errors with SQLLAB_BACKEND_PERSISTENCE (#25553)
Khrol Oct 13, 2023
af1e713
fix(import): Make sure query context is overwritten for overwriting i…
jfrag1 Oct 16, 2023
236aef8
fix: permalink save/overwrites in explore (#25112)
hughhhh Oct 16, 2023
b95ff2d
fix(header navlinks): link navlinks to path prefix (#25495)
fisjac Oct 17, 2023
b0f229e
fix: improve upload ZIP file validation (#25658)
dpgaspar Oct 17, 2023
b380495
fix: warning of nth-child (#23638)
justinpark Oct 17, 2023
293568a
fix(dremio): Fixes issue with Dremio SQL generation for Charts with S…
OskarNS Oct 18, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ under the License.

## Change Log

- [3.0.1](#301-tue-oct-13-103221-2023--0700)
- [3.0.0](#300-thu-aug-24-133627-2023--0600)
- [2.1.1](#211-sun-apr-23-154421-2023-0100)
- [2.1.0](#210-thu-mar-16-211305-2023--0700)
Expand All @@ -31,6 +32,51 @@ under the License.
- [1.4.2](#142-sat-mar-19-000806-2022-0200)
- [1.4.1](#141)

### 3.0.1 (Tue Oct 13 10:32:21 2023 -0700)

**Database Migrations**

- [#25320](https://github.com/apache/superset/pull/25320) fix: Add explicit ON DELETE CASCADE for dashboard_roles (@john-bodley)

**Fixes**

- [#25541](https://github.com/apache/superset/pull/25541) fix: revert fix(sqllab): Force trino client async execution (#24859) (@villebro)
- [#25618](https://github.com/apache/superset/pull/25618) fix: finestTemporalGrainFormatter (@betodealmeida)
- [#25599](https://github.com/apache/superset/pull/25599) fix(window): unavailable localStorage and sessionStorage (@frassinier)
- [#25579](https://github.com/apache/superset/pull/25579) fix(Charts): Set max row limit + removed the option to use an empty row limit value (@CorbinBullard)
- [#25559](https://github.com/apache/superset/pull/25559) fix(Presto): catch DatabaseError when testing Presto views (@zhaorui2022)
- [#25486](https://github.com/apache/superset/pull/25486) fix: thubmnails loading - Talisman default config (@Khrol)
- [#25400](https://github.com/apache/superset/pull/25400) fix(RLS): Fix Info Tooltip + Button Alignment on RLS Modal (@CorbinBullard)
- [#25590](https://github.com/apache/superset/pull/25590) fix: REST API CSRF exempt list (@dpgaspar)
- [#25147](https://github.com/apache/superset/pull/25147) fix: Apply normalization to all dttm columns (@kgabryje)
- [#25516](https://github.com/apache/superset/pull/25516) fix: tags permissions error message (@Khrol)
- [#25519](https://github.com/apache/superset/pull/25519) fix: Expand error detail on screencapture (@justinpark)
- [#25490](https://github.com/apache/superset/pull/25490) fix(sqllab): Broken query containing 'children' (@justinpark)
- [#25390](https://github.com/apache/superset/pull/25390) fix: Unable to sync columns when database or dataset name contains `+` (@mapledan)
- [#25494](https://github.com/apache/superset/pull/25494) fix: Address Mypy issue which is causing CI to fail (@john-bodley)
- [#25469](https://github.com/apache/superset/pull/25469) fix(sqllab): error with lazy_gettext for tab titles (@nytai)
- [#25468](https://github.com/apache/superset/pull/25468) fix: Styles not loading because of faulty CSP setting (@kgabryje)
- [#24241](https://github.com/apache/superset/pull/24241) fix(mysql): handle string typed decimal results (@villebro)
- [#25373](https://github.com/apache/superset/pull/25373) fix(helm chart): set chart appVersion to 3.0.0 (@celalettin1286)
- [#25445](https://github.com/apache/superset/pull/25445) fix: update the SQLAlchemy model definition at json column for Log table (@cnabro)
- [#25447](https://github.com/apache/superset/pull/25447) fix: Duplicate items when pasting into Select (@michael-s-molina)
- [#25372](https://github.com/apache/superset/pull/25372) fix(SqlLab): make icon placement even (@CorbinBullard)
- [#25282](https://github.com/apache/superset/pull/25282) fix(nativeFilters): Speed up native filters by removing unnecessary rerenders (@Always-prog)
- [#25437](https://github.com/apache/superset/pull/25437) fix(sqllab): invalid start date (@justinpark)
- [#25404](https://github.com/apache/superset/pull/25404) fix: smarter date formatter (@betodealmeida)
- [#25368](https://github.com/apache/superset/pull/25368) fix: swagger UI CSP error (@dpgaspar)
- [#25425](https://github.com/apache/superset/pull/25425) fix: chart import (@betodealmeida)
- [#25106](https://github.com/apache/superset/pull/25106) fix: preventing save button from flickering in SQL Lab (@fisjac)
- [#25424](https://github.com/apache/superset/pull/25424) fix: Rename on_delete parameter to ondelete (@john-bodley)
- [#25398](https://github.com/apache/superset/pull/25398) fix(sqllab): invalid persisted tab state (#25308) (@justinpark)
- [#25399](https://github.com/apache/superset/pull/25399) fix: Workaround for Cypress ECONNRESET error (@michael-s-molina)
- [#25318](https://github.com/apache/superset/pull/25318) fix: datetime with timezone excel export (@betodealmeida)
- [#25349](https://github.com/apache/superset/pull/25349) fix: DashboardRoles cascade operation (@michael-s-molina)
- [#25239](https://github.com/apache/superset/pull/25239) fix: Improve the reliability of alerts & reports (@jfrag1)
- [#25229](https://github.com/apache/superset/pull/25229) fix: Use RLS clause instead of ID for cache key (@jfrag1)
- [#25126](https://github.com/apache/superset/pull/25126) fix(chart): Supporting custom SQL as temporal x-axis column with filter (@zephyring)
- [#25290](https://github.com/apache/superset/pull/25290) fix: is_select with UNION (@betodealmeida)

### 3.0.0 (Thu Aug 24 13:36:27 2023 -0600)

**Database Migrations**
Expand Down
4 changes: 2 additions & 2 deletions helm/superset/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# limitations under the License.
#
apiVersion: v2
appVersion: "2.1.0"
appVersion: "3.0.0"
description: Apache Superset is a modern, enterprise-ready business intelligence web application
name: superset
icon: https://artifacthub.io/image/68c1d717-0e97-491f-b046-754e46f46922@2x
Expand All @@ -29,7 +29,7 @@ maintainers:
- name: craig-rueda
email: craig@craigrueda.com
url: https://github.com/craig-rueda
version: 0.10.6
version: 0.10.9
dependencies:
- name: postgresql
version: 12.1.6
Expand Down
2 changes: 1 addition & 1 deletion helm/superset/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ NOTE: This file is generated by helm-docs: https://github.com/norwoodj/helm-docs

# superset

![Version: 0.10.6](https://img.shields.io/badge/Version-0.10.6-informational?style=flat-square)
![Version: 0.10.9](https://img.shields.io/badge/Version-0.10.9-informational?style=flat-square)

Apache Superset is a modern, enterprise-ready business intelligence web application

Expand Down
2 changes: 1 addition & 1 deletion requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ flask==2.2.5
# flask-migrate
# flask-sqlalchemy
# flask-wtf
flask-appbuilder==4.3.6
flask-appbuilder==4.3.7
# via apache-superset
flask-babel==1.0.0
# via flask-appbuilder
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def get_git_sha() -> str:
"cryptography>=39.0.1, <40",
"deprecation>=2.1.0, <2.2.0",
"flask>=2.2.5, <3.0.0",
"flask-appbuilder>=4.3.6, <5.0.0",
"flask-appbuilder>=4.3.7, <5.0.0",
"flask-caching>=1.11.1, <2.0",
"flask-compress>=1.13, <2.0",
"flask-talisman>=1.0.0, <2.0",
Expand Down
17 changes: 17 additions & 0 deletions superset-frontend/cypress-base/cypress.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,23 @@ export default defineConfig({
// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
setupNodeEvents(on, config) {
// ECONNRESET on Chrome/Chromium 117.0.5851.0 when using Cypress <12.15.0
// Check https://github.com/cypress-io/cypress/issues/27804 for context
// TODO: This workaround should be removed when upgrading Cypress
on('before:browser:launch', (browser, launchOptions) => {
if (browser.name === 'chrome' && browser.isHeadless) {
// eslint-disable-next-line no-param-reassign
launchOptions.args = launchOptions.args.map(arg => {
if (arg === '--headless') {
return '--headless=new';
}

return arg;
});
}
return launchOptions;
});

// eslint-disable-next-line global-require,import/extensions
return require('./cypress/plugins/index.js')(on, config);
},
Expand Down
3 changes: 3 additions & 0 deletions superset-frontend/jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
* under the License.
*/

// timezone for unit tests
process.env.TZ = 'America/New_York';

module.exports = {
testRegex:
'\\/superset-frontend\\/(spec|src|plugins|packages|tools)\\/.*(_spec|\\.test)\\.[jt]sx?$',
Expand Down
2 changes: 1 addition & 1 deletion superset-frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "superset",
"version": "3.0.0",
"version": "3.0.1",
"description": "Superset is a data exploration platform designed to be visual, intuitive, and interactive.",
"keywords": [
"big",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ import {
isDefined,
hasGenericChartAxes,
NO_TIME_RANGE,
validateNonEmpty,
validateMaxValue,
} from '@superset-ui/core';

import {
Expand Down Expand Up @@ -245,7 +247,12 @@ const row_limit: SharedControlConfig<'SelectControl'> = {
type: 'SelectControl',
freeForm: true,
label: t('Row limit'),
validators: [legacyValidateInteger],
clearable: false,
validators: [
validateNonEmpty,
legacyValidateInteger,
v => validateMaxValue(v, 100000),
],
default: 10000,
choices: formatSelectOptions(ROW_LIMIT_OPTIONS),
description: t('Limits the number of rows that get displayed.'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ export enum AppSection {
export type FilterState = { value?: any; [key: string]: any };

export type DataMask = {
__cache?: FilterState;
extraFormData?: ExtraFormData;
filterState?: FilterState;
ownState?: JsonObject;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*
* 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 finestTemporalGrain from './finestTemporalGrain';

test('finestTemporalGrain', () => {
const monthFormatter = finestTemporalGrain([
new Date('2003-01-01 00:00:00Z').getTime(),
new Date('2003-02-01 00:00:00Z').getTime(),
]);
expect(monthFormatter(new Date('2003-01-01 00:00:00Z').getTime())).toBe(
'2003-01-01',
);
expect(monthFormatter(new Date('2003-02-01 00:00:00Z').getTime())).toBe(
'2003-02-01',
);

const yearFormatter = finestTemporalGrain([
new Date('2003-01-01 00:00:00Z').getTime(),
new Date('2004-01-01 00:00:00Z').getTime(),
]);
expect(yearFormatter(new Date('2003-01-01 00:00:00Z').getTime())).toBe(
'2003',
);
expect(yearFormatter(new Date('2004-01-01 00:00:00Z').getTime())).toBe(
'2004',
);

const milliSecondFormatter = finestTemporalGrain([
new Date('2003-01-01 00:00:00Z').getTime(),
new Date('2003-04-05 06:07:08.123Z').getTime(),
]);
expect(milliSecondFormatter(new Date('2003-01-01 00:00:00Z').getTime())).toBe(
'2003-01-01 00:00:00.000',
);

const localTimeFormatter = finestTemporalGrain(
[
new Date('2003-01-01 00:00:00Z').getTime(),
new Date('2003-02-01 00:00:00Z').getTime(),
],
true,
);
expect(localTimeFormatter(new Date('2003-01-01 00:00:00Z').getTime())).toBe(
'2002-12-31 19:00',
);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* 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 { utcFormat, timeFormat } from 'd3-time-format';
import { utcUtils, localTimeUtils } from '../utils/d3Time';
import TimeFormatter from '../TimeFormatter';

/*
* A formatter that examines all the values, and uses the finest temporal grain.
*/
export default function finestTemporalGrain(
values: any[],
useLocalTime = false,
) {
const format = useLocalTime ? timeFormat : utcFormat;

const formatMillisecond = format('%Y-%m-%d %H:%M:%S.%L');
const formatSecond = format('%Y-%m-%d %H:%M:%S');
const formatMinute = format('%Y-%m-%d %H:%M');
const formatHour = format('%Y-%m-%d %H:%M');
const formatDay = format('%Y-%m-%d');
const formatMonth = format('%Y-%m-%d');
const formatYear = format('%Y');

const {
hasMillisecond,
hasSecond,
hasMinute,
hasHour,
isNotFirstDayOfMonth,
isNotFirstMonth,
} = useLocalTime ? localTimeUtils : utcUtils;

let formatFunc = formatYear;
values.forEach((value: any) => {
if (formatFunc === formatYear && isNotFirstMonth(value)) {
formatFunc = formatMonth;
}
if (formatFunc === formatMonth && isNotFirstDayOfMonth(value)) {
formatFunc = formatDay;
}
if (formatFunc === formatDay && hasHour(value)) {
formatFunc = formatHour;
}
if (formatFunc === formatHour && hasMinute(value)) {
formatFunc = formatMinute;
}
if (formatFunc === formatMinute && hasSecond(value)) {
formatFunc = formatSecond;
}
if (formatFunc === formatSecond && hasMillisecond(value)) {
formatFunc = formatMillisecond;
}
});

return new TimeFormatter({
description:
'Use the finest grain in an array of dates to format all dates in the array',
formatFunc,
id: 'finest_temporal_grain',
label: 'Format temporal columns with the finest grain',
useLocalTime,
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export { default as createMultiFormatter } from './factories/createMultiFormatte
export { default as smartDateFormatter } from './formatters/smartDate';
export { default as smartDateDetailedFormatter } from './formatters/smartDateDetailed';
export { default as smartDateVerboseFormatter } from './formatters/smartDateVerbose';
export { default as finestTemporalGrainFormatter } from './formatters/finestTemporalGrain';

export { default as normalizeTimestamp } from './utils/normalizeTimestamp';
export { default as denormalizeTimestamp } from './utils/denormalizeTimestamp';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ export { default as legacyValidateNumber } from './legacyValidateNumber';
export { default as validateInteger } from './validateInteger';
export { default as validateNumber } from './validateNumber';
export { default as validateNonEmpty } from './validateNonEmpty';
export { default as validateMaxValue } from './validateMaxValue';
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { t } from '../translation';

export default function validateMaxValue(v: unknown, max: Number) {
if (Number(v) > +max) {
return t('Value cannot exceed %s', max);
}
return false;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* 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 { validateMaxValue } from '@superset-ui/core';
import './setup';

describe('validateInteger()', () => {
it('returns the warning message if invalid', () => {
expect(validateMaxValue(10.1, 10)).toBeTruthy();
expect(validateMaxValue(1, 0)).toBeTruthy();
expect(validateMaxValue('2', 1)).toBeTruthy();
});
it('returns false if the input is valid', () => {
expect(validateMaxValue(0, 1)).toBeFalsy();
expect(validateMaxValue(10, 10)).toBeFalsy();
expect(validateMaxValue(undefined, 1)).toBeFalsy();
expect(validateMaxValue(NaN, NaN)).toBeFalsy();
expect(validateMaxValue(null, 1)).toBeFalsy();
expect(validateMaxValue('1', 1)).toBeFalsy();
expect(validateMaxValue('a', 1)).toBeFalsy();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ export default styled(ParallelCoordinates)`
height: 18px;
margin: 0px;
}
.parcoords .row:nth-child(odd) {
.parcoords .row:nth-of-type(odd) {
background: ${addAlpha(theme.colors.grayscale.dark2, 0.05)};
}
.parcoords .header {
Expand Down
Loading
Loading