Source code for src.module.tenant.infrastructure.managers
"""Tenant Context custom managers and querysets.
These replace abstract repositories — they encapsulate complex business queries
and are compatible with Django's ORM features (select_related, prefetch_related, etc.).
"""
from __future__ import annotations
import uuid
from django.db import models
[docs]
class TenantQuerySet(models.QuerySet):
"""Custom QuerySet for Tenant with business query methods."""
[docs]
def active(self) -> TenantQuerySet:
"""Filter to active tenants only."""
return self.filter(status="active")
[docs]
def by_slug(self, slug: str) -> TenantQuerySet:
"""Filter by slug."""
return self.filter(slug=slug)
[docs]
def by_status(self, status: str) -> TenantQuerySet:
"""Filter by status."""
return self.filter(status=status)
[docs]
def for_user(self, user_id: uuid.UUID) -> TenantQuerySet:
"""Filter tenants where the user has an active membership."""
return self.filter(
memberships__user_id=user_id,
memberships__status="active",
).distinct()
[docs]
class TenantManager(models.Manager):
"""Custom manager for Tenant model."""
def get_queryset(self) -> TenantQuerySet:
return TenantQuerySet(self.model, using=self._db)
def active(self) -> TenantQuerySet:
return self.get_queryset().active()
def by_slug(self, slug: str) -> TenantQuerySet:
return self.get_queryset().by_slug(slug)
def for_user(self, user_id: uuid.UUID) -> TenantQuerySet:
return self.get_queryset().for_user(user_id)
[docs]
class MembershipQuerySet(models.QuerySet):
"""Custom QuerySet for TenantMembership with business query methods."""
[docs]
def active(self) -> MembershipQuerySet:
"""Filter to active memberships only."""
return self.filter(status="active")
[docs]
def for_tenant(self, tenant_id: uuid.UUID) -> MembershipQuerySet:
"""Filter by tenant."""
return self.filter(tenant_id=tenant_id)
[docs]
def for_user(self, user_id: uuid.UUID) -> MembershipQuerySet:
"""Filter by user."""
return self.filter(user_id=user_id)
def with_role(self, role: str) -> MembershipQuerySet:
"""Filter memberships that contain a specific role."""
return self.filter(roles__contains=[role])
def with_related(self) -> MembershipQuerySet:
"""Eagerly load related user and tenant objects."""
return self.select_related("user", "tenant")
[docs]
class MembershipManager(models.Manager):
"""Custom manager for TenantMembership model."""
def get_queryset(self) -> MembershipQuerySet:
return MembershipQuerySet(self.model, using=self._db)
def active(self) -> MembershipQuerySet:
return self.get_queryset().active()
def for_tenant(self, tenant_id: uuid.UUID) -> MembershipQuerySet:
return self.get_queryset().for_tenant(tenant_id)
def for_user(self, user_id: uuid.UUID) -> MembershipQuerySet:
return self.get_queryset().for_user(user_id)