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)