Skip to content

Commit

Permalink
[dashboards] Fix, API update slug uniqueness refusing empty string (#…
Browse files Browse the repository at this point in the history
…9417)

* [dashboards] Fix, API update slug uniqueness refusing empty string

* [dashboards] tests
  • Loading branch information
dpgaspar committed Mar 30, 2020
1 parent ec795a4 commit 752de8f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 8 deletions.
2 changes: 1 addition & 1 deletion superset/dashboards/commands/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def run(self):
def validate(self) -> None:
exceptions: List[ValidationError] = []
owner_ids: Optional[List[int]] = self._properties.get("owners")
slug: str = self._properties.get("slug", "")
slug: Optional[str] = self._properties.get("slug")

# Validate/populate model exists
self._model = DashboardDAO.find_by_id(self._model_id)
Expand Down
14 changes: 8 additions & 6 deletions superset/dashboards/dao.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
import logging
from typing import List
from typing import List, Optional

from sqlalchemy.exc import SQLAlchemyError

Expand All @@ -39,11 +39,13 @@ def validate_slug_uniqueness(slug: str) -> bool:
return not db.session.query(dashboard_query.exists()).scalar()

@staticmethod
def validate_update_slug_uniqueness(dashboard_id: int, slug: str) -> bool:
dashboard_query = db.session.query(Dashboard).filter(
Dashboard.slug == slug, Dashboard.id != dashboard_id
)
return not db.session.query(dashboard_query.exists()).scalar()
def validate_update_slug_uniqueness(dashboard_id: int, slug: Optional[str]) -> bool:
if slug is not None:
dashboard_query = db.session.query(Dashboard).filter(
Dashboard.slug == slug, Dashboard.id != dashboard_id
)
return not db.session.query(dashboard_query.exists()).scalar()
return True

@staticmethod
def bulk_delete(models: List[Dashboard], commit=True):
Expand Down
15 changes: 14 additions & 1 deletion tests/dashboards/api_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def __init__(self, *args, **kwargs):
def insert_dashboard(
self,
dashboard_title: str,
slug: str,
slug: Optional[str],
owners: List[int],
slices: Optional[List[Slice]] = None,
position_json: str = "",
Expand Down Expand Up @@ -647,6 +647,19 @@ def test_update_dashboard_validate_slug(self):
db.session.delete(dashboard2)
db.session.commit()

dashboard1 = self.insert_dashboard("title1", None, [admin_id])
dashboard2 = self.insert_dashboard("title2", None, [admin_id])
self.login(username="admin")
# Accept empty slugs and don't validate them has unique
dashboard_data = {"dashboard_title": "title2_changed", "slug": ""}
uri = f"api/v1/dashboard/{dashboard2.id}"
rv = self.client.put(uri, json=dashboard_data)
self.assertEqual(rv.status_code, 200)

db.session.delete(dashboard1)
db.session.delete(dashboard2)
db.session.commit()

def test_update_published(self):
"""
Dashboard API: Test update published patch
Expand Down

0 comments on commit 752de8f

Please sign in to comment.