"""Base class for all read-only query selectors.

Selectors are the *only* place business code should construct QuerySets for
reading data.  They never mutate state — that is the responsibility of
services.  Views and API handlers call selectors directly; services call
selectors to fetch the data they need before mutating it.

Conventions:
- Functions are plain module-level functions (not methods), grouped in a
  module named ``selectors.py`` inside each Django app.
- All parameters are keyword-only after the first positional "scope" argument
  so callers are self-documenting.
- Return a ``QuerySet`` (lazy, un-evaluated) unless a single object is needed;
  raise ``ObjectDoesNotExist`` (or its app-specific alias) when not found.
- Never call ``.all()`` on a TenantScopedModel from outside selectors; always
  filter by ``tenant_id`` at minimum.

Example usage::

    from simorgh.apps.accounts import selectors as account_sel

    qs = account_sel.list_users_for_tenant(tenant_id=tenant.pk)
    user = account_sel.get_user_by_mobile("+989123456789")
"""

from __future__ import annotations

__all__: list[str] = []
