Per-User Domain-Ausschlüsse + Grundquellen-Schutz

- Neue Tabelle user_excluded_domains für benutzerspezifische Ausschlüsse
- Domain-Ausschlüsse wirken nur für den jeweiligen User, nicht org-weit
- user_id wird durch die gesamte Pipeline geschleust (Orchestrator → Researcher → RSS-Parser)
- Grundquellen (is_global) können nicht mehr bearbeitet/gelöscht werden im Frontend
- Grundquelle-Badge bei globalen Quellen statt Edit/Delete-Buttons
- Filter Von mir ausgeschlossen im Quellen-Modal

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-03-08 14:30:21 +01:00
Ursprung 18954cf70e
Commit 5e19736a25
13 geänderte Dateien mit 149 neuen und 108 gelöschten Zeilen

Datei anzeigen

@@ -26,7 +26,7 @@ class RSSParser:
cleaned = [w for w in words if not w.isdigit()]
return cleaned if cleaned else words
async def search_feeds(self, search_term: str, international: bool = True, tenant_id: int = None, keywords: list[str] | None = None) -> list[dict]:
async def search_feeds(self, search_term: str, international: bool = True, tenant_id: int = None, keywords: list[str] | None = None, user_id: int = None) -> list[dict]:
"""Durchsucht RSS-Feeds nach einem Suchbegriff.
Args:
@@ -50,6 +50,19 @@ class RSSParser:
rss_feeds = await self._get_rss_feeds(tenant_id=tenant_id)
# User-spezifische Ausschluesse anwenden
if user_id:
try:
from source_rules import get_user_excluded_domains
user_excluded = await get_user_excluded_domains(user_id)
if user_excluded:
for cat in rss_feeds:
rss_feeds[cat] = [f for f in rss_feeds[cat]
if not any(excl in (f.get("url", "") + f.get("name", "")).lower()
for excl in user_excluded)]
except Exception as e:
logger.warning(f"User-Ausschluesse konnten nicht geladen werden: {e}")
# Feed-Kategorien filtern
if international:
categories = rss_feeds.keys()