Skip to content

Commit d79f7b2

Browse files
authored
feat: Update database permissions in async mode (#32231)
1 parent 84b52b2 commit d79f7b2

File tree

22 files changed

+1715
-425
lines changed

22 files changed

+1715
-425
lines changed

superset-frontend/src/pages/DatabaseList/index.tsx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ interface DatabaseDeleteObject extends DatabaseObject {
7171
interface DatabaseListProps {
7272
addDangerToast: (msg: string) => void;
7373
addSuccessToast: (msg: string) => void;
74+
addInfoToast: (msg: string) => void;
7475
user: {
7576
userId: string | number;
7677
firstName: string;
@@ -101,6 +102,7 @@ function BooleanDisplay({ value }: { value: Boolean }) {
101102

102103
function DatabaseList({
103104
addDangerToast,
105+
addInfoToast,
104106
addSuccessToast,
105107
user,
106108
}: DatabaseListProps) {
@@ -121,6 +123,9 @@ function DatabaseList({
121123
const fullUser = useSelector<any, UserWithPermissionsAndRoles>(
122124
state => state.user,
123125
);
126+
const shouldSyncPermsInAsyncMode = useSelector<any, boolean>(
127+
state => state.common?.conf.SYNC_DB_PERMISSIONS_IN_ASYNC_MODE,
128+
);
124129
const showDatabaseModal = getUrlParam(URL_PARAMS.showDatabaseModal);
125130

126131
const [query, setQuery] = useQueryParams({
@@ -335,6 +340,44 @@ function DatabaseList({
335340
setPreparingExport(true);
336341
}
337342

343+
function handleDatabasePermSync(database: DatabaseObject) {
344+
if (shouldSyncPermsInAsyncMode) {
345+
addInfoToast(t('Validating connectivity for %s', database.database_name));
346+
} else {
347+
addInfoToast(t('Syncing permissions for %s', database.database_name));
348+
}
349+
SupersetClient.post({
350+
endpoint: `/api/v1/database/${database.id}/sync_permissions/`,
351+
}).then(
352+
({ response }) => {
353+
// Sync request
354+
if (response.status === 200) {
355+
addSuccessToast(
356+
t('Permissions successfully synced for %s', database.database_name),
357+
);
358+
}
359+
// Async request
360+
else {
361+
addInfoToast(
362+
t(
363+
'Syncing permissions for %s in the background',
364+
database.database_name,
365+
),
366+
);
367+
}
368+
},
369+
createErrorHandler(errMsg =>
370+
addDangerToast(
371+
t(
372+
'An error occurred while syncing permissions for %s: %s',
373+
database.database_name,
374+
errMsg,
375+
),
376+
),
377+
),
378+
);
379+
}
380+
338381
const initialSort = [{ id: 'changed_on_delta_humanized', desc: true }];
339382

340383
const columns = useMemo(
@@ -426,6 +469,7 @@ function DatabaseList({
426469
handleDatabaseEditModal({ database: original, modalOpen: true });
427470
const handleDelete = () => openDatabaseDeleteModal(original);
428471
const handleExport = () => handleDatabaseExport(original);
472+
const handleSync = () => handleDatabasePermSync(original);
429473
if (!canEdit && !canDelete && !canExport) {
430474
return null;
431475
}
@@ -481,6 +525,23 @@ function DatabaseList({
481525
</span>
482526
</Tooltip>
483527
)}
528+
{canEdit && (
529+
<Tooltip
530+
id="sync-action-tooltip"
531+
title={t('Sync Permissions')}
532+
placement="bottom"
533+
>
534+
<span
535+
role="button"
536+
data-test="database-sync-perm"
537+
tabIndex={0}
538+
className="action-button"
539+
onClick={handleSync}
540+
>
541+
<Icons.Refresh />
542+
</span>
543+
</Tooltip>
544+
)}
484545
</Actions>
485546
);
486547
},

superset/commands/database/exceptions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,21 @@ def __init__(self, key: str = "") -> None:
8888
)
8989

9090

91+
class DatabaseConnectionSyncPermissionsError(CommandException):
92+
status = 500
93+
message = _("Unable to sync permissions for this database connection.")
94+
95+
9196
class DatabaseNotFoundError(CommandException):
9297
status = 404
9398
message = _("Database not found.")
9499

95100

101+
class UserNotFoundInSessionError(CommandException):
102+
status = 500
103+
message = _("Could not validate the user in the current session.")
104+
105+
96106
class DatabaseSchemaUploadNotAllowed(CommandException):
97107
status = 403
98108
message = _("Database schema is not allowed for csv uploads.")

0 commit comments

Comments
 (0)