GitHub user dosubot[bot] added a comment to the discussion: Restrict charts

<!-- Answer -->
You need to resolve usernames to user IDs before filtering, because the 
Slice.owners relationship is based on user IDs, not usernames. Here’s how you 
can fix your filter:

```python
from superset.charts.filters import BaseFilter
from superset.models.slice import Slice
from superset.security import get_username, security_manager
from sqlalchemy.orm import Query

class ChartOwnedByUserOrAdminFilter(BaseFilter):
    name = "Owned by user or admin"
    arg_name = "chart_owned_by_user_or_admin"

    def apply(self, query: Query, value) -> Query:
        if security_manager.is_admin():
            return query  # Admins see all charts

        # Collect usernames you want to include
        current_user = get_username()
        usernames = ["admin", current_user]
        usernames = list(set(usernames))  # Remove duplicates

        # Resolve usernames to user IDs
        user_ids = []
        for username in usernames:
            user = security_manager.get_user_by_username(username)
            if user:
                user_ids.append(user.id)
        if not user_ids:
            # No valid users found, return empty query
            return query.filter(False)

        # Filter charts where any owner matches one of these user IDs
        return 
query.filter(Slice.owners.any(security_manager.user_model.id.in_(user_ids)))
```

This approach matches how Superset filters by ownership in chart filters—always 
by user ID, never by username directly 
([reference](https://github.com/apache/superset/blob/master/superset/charts/filters.py)).
 You can extend this to support emails by looking up users by email as well.

Make sure your filter is registered in `base_filters` in 
`superset/charts/api.py` so it’s always applied. Restart the server after 
making changes.


<!-- Dosu Comment Footer -->
*To reply, just mention [@dosu](https://go.dosu.dev/dosubot).*

---
<sup>How did I do? 
[Good](https://app.dosu.dev/response-feedback/ca8c4cec-d5d2-4629-b4cf-0e5a025c5d5c?feedback_type=great_response)
 | 
[Irrelevant](https://app.dosu.dev/response-feedback/ca8c4cec-d5d2-4629-b4cf-0e5a025c5d5c?feedback_type=irrelevant_answer)
 | 
[Incorrect](https://app.dosu.dev/response-feedback/ca8c4cec-d5d2-4629-b4cf-0e5a025c5d5c?feedback_type=incorrect_sources)
 | 
[Verbose](https://app.dosu.dev/response-feedback/ca8c4cec-d5d2-4629-b4cf-0e5a025c5d5c?feedback_type=too_verbose)
 | 
[Hallucination](https://app.dosu.dev/response-feedback/ca8c4cec-d5d2-4629-b4cf-0e5a025c5d5c?feedback_type=hallucination)
 | [Report 
🐛](https://app.dosu.dev/response-feedback/ca8c4cec-d5d2-4629-b4cf-0e5a025c5d5c?feedback_type=bug_report)
 | 
[Other](https://app.dosu.dev/response-feedback/ca8c4cec-d5d2-4629-b4cf-0e5a025c5d5c?feedback_type=other)</sup>

[![Chat with 
Dosu](https://dosu.dev/dosu-chat-badge.svg)](https://app.dosu.dev/a28d3c7e-a9d3-459e-9fb6-3a6f9ff4f357/ask?utm_source=github)&nbsp;[![Open
 in 
Cursor](https://dosu.dev/dosu-in-cursor.svg)](https://cursor.com/link/prompt?text=You%20need%20to%20resolve%20usernames%20to%20user%20IDs%20before%20filtering%2C%20because%20the%20Slice.owners%20relationship%20is%20based%20on%20user%20IDs%2C%20not%20usernames.%20Here%E2%80%99s%20how%20you%20can%20fix%20your%20filter%3A%0A%0A%60%60%60python%0Afrom%20superset.charts.filters%20import%20BaseFilter%0Afrom%20superset.models.slice%20import%20Slice%0Afrom%20superset.security%20import%20get_username%2C%20security_manager%0Afrom%20sqlalchemy.orm%20import%20Query%0A%0Aclass%20ChartOwnedByUserOrAdminFilter%28BaseFilter%29%3A%0A%20%20%20%20name%20%3D%20%22Owned%20by%20user%20or%20admin%22%0A%20%20%20%20arg_name%20%3D%20%22chart_owned_by_user_or_admin%22%0A%0A%20%20%20%20def%20apply%28self%2C%20query%3A%20Query%2C%20value%29%20-%3E%20Query%3A%0A
 
%20%20%20%20%20%20%20%20if%20security_manager.is_admin%28%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20query%20%20%23%20Admins%20see%20all%20charts%0A%0A%20%20%20%20%20%20%20%20%23%20Collect%20usernames%20you%20want%20to%20include%0A%20%20%20%20%20%20%20%20current_user%20%3D%20get_username%28%29%0A%20%20%20%20%20%20%20%20usernames%20%3D%20%5B%22admin%22%2C%20current_user%5D%0A%20%20%20%20%20%20%20%20usernames%20%3D%20list%28set%28usernames%29%29%20%20%23%20Remove%20duplicates%0A%0A%20%20%20%20%20%20%20%20%23%20Resolve%20usernames%20to%20user%20IDs%0A%20%20%20%20%20%20%20%20user_ids%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20username%20in%20usernames%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20user%20%3D%20security_manager.get_user_by_username%28username%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20user%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20user_ids.append%28user.id%29%0A%20%20%20%20%20%20%20%20if%20not%20user_ids%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%
 
20No%20valid%20users%20found%2C%20return%20empty%20query%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20query.filter%28False%29%0A%0A%20%20%20%20%20%20%20%20%23%20Filter%20charts%20where%20any%20owner%20matches%20one%20of%20these%20user%20IDs%0A%20%20%20%20%20%20%20%20return%20query.filter%28Slice.owners.any%28security_manager.user_model.id.in_%28user_ids%29%29%29%0A%60%60%60%0A%0AThis%20approach%20matches%20how%20Superset%20filters%20by%20ownership%20in%20chart%20filters%E2%80%94always%20by%20user%20ID%2C%20never%20by%20username%20directly%20%28%5Breference%5D%28https%3A//github.com/apache/superset/blob/master/superset/charts/filters.py%29%29.%20You%20can%20extend%20this%20to%20support%20emails%20by%20looking%20up%20users%20by%20email%20as%20well.%0A%0AMake%20sure%20your%20filter%20is%20registered%20in%20%60base_filters%60%20in%20%60superset/charts/api.py%60%20so%20it%E2%80%99s%20always%20applied.%20Restart%20the%20server%20after%20making%20changes.)&nbsp;[![Join
 Discord](https://i
 
mg.shields.io/badge/join-5865F2?logo=discord&logoColor=white&label=)](https://go.dosu.dev/discord-bot)&nbsp;[![Share
 on 
X](https://img.shields.io/badge/X-share-black)](https://twitter.com/intent/tweet?text=%40dosu_ai%20helped%20me%20solve%20this%20issue!&url=https%3A//github.com/apache/superset/discussions/36259)

GitHub link: 
https://github.com/apache/superset/discussions/36259#discussioncomment-15083601

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: 
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to