fix: Add user filtering to changed_by. Fixes #27986 (#29287)

Co-authored-by: Markus Eriksson <markus.eriksson@sinch.com>
This commit is contained in:
Markus Eriksson 2024-07-25 23:23:00 +02:00 committed by GitHub
parent 3de2b7c989
commit 922128f6e0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 49 additions and 3 deletions

View File

@ -269,10 +269,12 @@ class ChartRestApi(BaseSupersetModelRestApi):
base_related_field_filters = { base_related_field_filters = {
"owners": [["id", BaseFilterRelatedUsers, lambda: []]], "owners": [["id", BaseFilterRelatedUsers, lambda: []]],
"created_by": [["id", BaseFilterRelatedUsers, lambda: []]], "created_by": [["id", BaseFilterRelatedUsers, lambda: []]],
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
} }
related_field_filters = { related_field_filters = {
"owners": RelatedFieldFilter("first_name", FilterRelatedOwners), "owners": RelatedFieldFilter("first_name", FilterRelatedOwners),
"created_by": RelatedFieldFilter("first_name", FilterRelatedOwners), "created_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
} }
allowed_rel_fields = {"owners", "created_by", "changed_by"} allowed_rel_fields = {"owners", "created_by", "changed_by"}

View File

@ -35,7 +35,12 @@ from superset.css_templates.schemas import (
) )
from superset.extensions import event_logger from superset.extensions import event_logger
from superset.models.core import CssTemplate from superset.models.core import CssTemplate
from superset.views.base_api import BaseSupersetModelRestApi, statsd_metrics from superset.views.base_api import (
BaseSupersetModelRestApi,
RelatedFieldFilter,
statsd_metrics,
)
from superset.views.filters import BaseFilterRelatedUsers, FilterRelatedOwners
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -91,6 +96,13 @@ class CssTemplateRestApi(BaseSupersetModelRestApi):
openapi_spec_tag = "CSS Templates" openapi_spec_tag = "CSS Templates"
openapi_spec_methods = openapi_spec_methods_override openapi_spec_methods = openapi_spec_methods_override
related_field_filters = {
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
}
base_related_field_filters = {
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
}
@expose("/", methods=("DELETE",)) @expose("/", methods=("DELETE",))
@protect() @protect()
@safe @safe

View File

@ -271,6 +271,7 @@ class DashboardRestApi(BaseSupersetModelRestApi):
base_related_field_filters = { base_related_field_filters = {
"owners": [["id", BaseFilterRelatedUsers, lambda: []]], "owners": [["id", BaseFilterRelatedUsers, lambda: []]],
"created_by": [["id", BaseFilterRelatedUsers, lambda: []]], "created_by": [["id", BaseFilterRelatedUsers, lambda: []]],
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
"roles": [["id", BaseFilterRelatedRoles, lambda: []]], "roles": [["id", BaseFilterRelatedRoles, lambda: []]],
} }
@ -278,6 +279,7 @@ class DashboardRestApi(BaseSupersetModelRestApi):
"owners": RelatedFieldFilter("first_name", FilterRelatedOwners), "owners": RelatedFieldFilter("first_name", FilterRelatedOwners),
"roles": RelatedFieldFilter("name", FilterRelatedRoles), "roles": RelatedFieldFilter("name", FilterRelatedRoles),
"created_by": RelatedFieldFilter("first_name", FilterRelatedOwners), "created_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
} }
allowed_rel_fields = {"owners", "roles", "created_by", "changed_by"} allowed_rel_fields = {"owners", "roles", "created_by", "changed_by"}

View File

@ -125,11 +125,13 @@ from superset.utils.oauth2 import decode_oauth2_state
from superset.utils.ssh_tunnel import mask_password_info from superset.utils.ssh_tunnel import mask_password_info
from superset.views.base_api import ( from superset.views.base_api import (
BaseSupersetModelRestApi, BaseSupersetModelRestApi,
RelatedFieldFilter,
requires_form_data, requires_form_data,
requires_json, requires_json,
statsd_metrics, statsd_metrics,
) )
from superset.views.error_handling import json_error_response from superset.views.error_handling import json_error_response
from superset.views.filters import BaseFilterRelatedUsers, FilterRelatedOwners
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -304,6 +306,13 @@ class DatabaseRestApi(BaseSupersetModelRestApi):
openapi_spec_methods = openapi_spec_methods_override openapi_spec_methods = openapi_spec_methods_override
""" Overrides GET methods OpenApi descriptions """ """ Overrides GET methods OpenApi descriptions """
related_field_filters = {
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
}
base_related_field_filters = {
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
}
@expose("/<int:pk>/connection", methods=("GET",)) @expose("/<int:pk>/connection", methods=("GET",))
@protect() @protect()
@safe @safe

View File

@ -242,10 +242,12 @@ class DatasetRestApi(BaseSupersetModelRestApi):
base_related_field_filters = { base_related_field_filters = {
"owners": [["id", BaseFilterRelatedUsers, lambda: []]], "owners": [["id", BaseFilterRelatedUsers, lambda: []]],
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
"database": [["id", DatabaseFilter, lambda: []]], "database": [["id", DatabaseFilter, lambda: []]],
} }
related_field_filters = { related_field_filters = {
"owners": RelatedFieldFilter("first_name", FilterRelatedOwners), "owners": RelatedFieldFilter("first_name", FilterRelatedOwners),
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
"database": "database_name", "database": "database_name",
} }
search_filters = { search_filters = {

View File

@ -144,11 +144,13 @@ class QueryRestApi(BaseSupersetModelRestApi):
] ]
base_related_field_filters = { base_related_field_filters = {
"created_by": [["id", BaseFilterRelatedUsers, lambda: []]], "created_by": [["id", BaseFilterRelatedUsers, lambda: []]],
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
"user": [["id", BaseFilterRelatedUsers, lambda: []]], "user": [["id", BaseFilterRelatedUsers, lambda: []]],
"database": [["id", DatabaseFilter, lambda: []]], "database": [["id", DatabaseFilter, lambda: []]],
} }
related_field_filters = { related_field_filters = {
"created_by": RelatedFieldFilter("first_name", FilterRelatedOwners), "created_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
"user": RelatedFieldFilter("first_name", FilterRelatedOwners), "user": RelatedFieldFilter("first_name", FilterRelatedOwners),
} }

View File

@ -56,9 +56,11 @@ from superset.queries.saved_queries.schemas import (
from superset.utils import json from superset.utils import json
from superset.views.base_api import ( from superset.views.base_api import (
BaseSupersetModelRestApi, BaseSupersetModelRestApi,
RelatedFieldFilter,
requires_form_data, requires_form_data,
statsd_metrics, statsd_metrics,
) )
from superset.views.filters import BaseFilterRelatedUsers, FilterRelatedOwners
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -179,8 +181,12 @@ class SavedQueryRestApi(BaseSupersetModelRestApi):
related_field_filters = { related_field_filters = {
"database": "database_name", "database": "database_name",
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
}
base_related_field_filters = {
"database": [["id", DatabaseFilter, lambda: []]],
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
} }
base_related_field_filters = {"database": [["id", DatabaseFilter, lambda: []]]}
allowed_rel_fields = {"database", "changed_by", "created_by"} allowed_rel_fields = {"database", "changed_by", "created_by"}
allowed_distinct_fields = {"catalog", "schema"} allowed_distinct_fields = {"catalog", "schema"}

View File

@ -228,6 +228,7 @@ class ReportScheduleRestApi(BaseSupersetModelRestApi):
"database": [["id", DatabaseFilter, lambda: []]], "database": [["id", DatabaseFilter, lambda: []]],
"owners": [["id", BaseFilterRelatedUsers, lambda: []]], "owners": [["id", BaseFilterRelatedUsers, lambda: []]],
"created_by": [["id", BaseFilterRelatedUsers, lambda: []]], "created_by": [["id", BaseFilterRelatedUsers, lambda: []]],
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
} }
text_field_rel_fields = { text_field_rel_fields = {
"dashboard": "dashboard_title", "dashboard": "dashboard_title",
@ -239,6 +240,7 @@ class ReportScheduleRestApi(BaseSupersetModelRestApi):
"chart": "slice_name", "chart": "slice_name",
"database": "database_name", "database": "database_name",
"created_by": RelatedFieldFilter("first_name", FilterRelatedOwners), "created_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
"owners": RelatedFieldFilter("first_name", FilterRelatedOwners), "owners": RelatedFieldFilter("first_name", FilterRelatedOwners),
} }

View File

@ -47,10 +47,15 @@ from superset.row_level_security.schemas import (
from superset.views.base import DatasourceFilter from superset.views.base import DatasourceFilter
from superset.views.base_api import ( from superset.views.base_api import (
BaseSupersetModelRestApi, BaseSupersetModelRestApi,
RelatedFieldFilter,
requires_json, requires_json,
statsd_metrics, statsd_metrics,
) )
from superset.views.filters import BaseFilterRelatedRoles from superset.views.filters import (
BaseFilterRelatedRoles,
BaseFilterRelatedUsers,
FilterRelatedOwners,
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -129,9 +134,13 @@ class RLSRestApi(BaseSupersetModelRestApi):
edit_model_schema = RLSPutSchema() edit_model_schema = RLSPutSchema()
allowed_rel_fields = {"tables", "roles", "created_by", "changed_by"} allowed_rel_fields = {"tables", "roles", "created_by", "changed_by"}
related_field_filters = {
"changed_by": RelatedFieldFilter("first_name", FilterRelatedOwners),
}
base_related_field_filters = { base_related_field_filters = {
"tables": [["id", DatasourceFilter, lambda: []]], "tables": [["id", DatasourceFilter, lambda: []]],
"roles": [["id", BaseFilterRelatedRoles, lambda: []]], "roles": [["id", BaseFilterRelatedRoles, lambda: []]],
"changed_by": [["id", BaseFilterRelatedUsers, lambda: []]],
} }
openapi_spec_methods = openapi_spec_methods_override openapi_spec_methods = openapi_spec_methods_override