Пользователи и роли
Модель User, пять системных ролей, связь с Supabase Auth, привязка Telegram.
Пользователи и роли
User
Префикс: acc_
Таблица: auth_user
Файл: garden/modules/account/models.py
User — это и Django-аутентификация (AbstractBaseUser + PermissionsMixin), и доменная модель (BaseModel).
| Поле | Тип | Описание |
|---|---|---|
id | KSUID, acc_* | Первичный ключ |
supabase_uid | CharField(unique) | UUID пользователя в Supabase Auth — связь с JWT sub |
email | EmailField(unique) | Основной идентификатор для входа |
phone | CharField(unique, nullable) | В международном формате (+7999...) |
first_name, last_name | CharField | Имя и фамилия |
full_name | GeneratedField | Конкатенация имени и фамилии (хранится в БД) |
preferred_language | CharField(2) | ru / en, default ru |
role | CharField(32) — UserRole | Доменная роль (см. ниже) |
is_active | BooleanField | Деактивация аккаунта |
is_staff | BooleanField | Доступ к Django Admin |
is_superuser | BooleanField | Полные права |
date_joined | DateTimeField | Дата регистрации |
USERNAME_FIELD = "email" — Django ищет пользователя по email при входе через стандартные механизмы (для Supabase JWT — другая ветка через supabase_uid).
Пять ролей (UserRole)
class UserRole(models.TextChoices):
ADMIN = "admin", _("Admin")
STAFF = "staff", _("Staff")
BRIGADIER = "brigadier", _("Brigadier")
WORKER = "worker", _("Worker")
CLIENT = "client", _("Client")| Роль | is_staff | is_superuser | Что делает |
|---|---|---|---|
admin | true | true | Полный контроль системы. Управление пользователями, шаблонами, справочниками, настройками. Доступ к Django Admin. |
staff | true | false | Бэк-офис. Утверждает/отклоняет отчёты, ведёт клиентскую базу, видит всё. Без суперпользовательских прав. Доступ к Django Admin. |
brigadier | false | false | Старший на объекте. Получает наряд от сотрудника, ведёт его статус (запуск → завершение), заполняет и подаёт отчёт. Видит только свои наряды (где он назначен бригадиром или участником). |
worker | false | false | Указывается бригадиром в отчёте. Используется как ссылка на физического исполнителя. Не используется для входа в дашборд. |
client | false | false | Заказчик работ. Видит отчёты по своим объектам через привязку ContactPerson.user. |
Роль worker создана для того, чтобы в отчёте можно было указать конкретного исполнителя по имени и часам. Большинство работников не входят в платформу — они просто числятся как User(role=worker, is_active=True) для целей отчётности. Эндпоинт /api/workers/ возвращает их для выбора в SurveyJS.
Связь с Supabase Auth
User.supabase_uid уникален и проиндексирован — это единственная привязка между двумя системами. Любой запрос к Django проходит через SupabaseAuthentication, которая по sub из JWT находит соответствующего User.
Роль (User.role) дублируется в app_metadata.role в Supabase Auth через Edge Function set-role — фронту удобно читать её прямо из JWT, не дёргая бэкенд.
TelegramLink
Префикс: tglnk_
Файл: garden/modules/communication/models.py
Связь пользователя с его Telegram-аккаунтом. Создаётся, когда пользователь нажимает «Старт» на боте, перейдя по deep-link с приглашением.
| Поле | Тип | Описание |
|---|---|---|
id | KSUID, tglnk_* | Первичный ключ |
user | FK → User | На кого ссылается |
telegram_id | BigIntegerField | Telegram user_id |
username | CharField(nullable) | @username (если есть) |
first_name, last_name | CharField | Из Telegram-профиля |
blocked_at | DateTimeField(nullable) | Когда пользователь заблокировал бота |
Канал telegram в NotificationPreference доступен подписчику только если у него есть активная (blocked_at IS NULL) TelegramLink с telegram_id.
ChatwootContact
Файл: garden/modules/communication/models.py (ChatwootContact)
Связь пользователя с его контактной записью в Chatwoot. Один User может иметь несколько ChatwootContact — например, один для Telegram-источника, другой для веб-источника.
| Поле | Описание |
|---|---|
user | FK → User |
chatwoot_contact_id | ID контакта в Chatwoot |
source | ChatwootSource: telegram / web / other |
Используется при пересылке входящих сообщений из Telegram в Chatwoot.
Менеджер UserManager
garden/modules/account/managers.py содержит UserManager с методами create_user / create_superuser. Они применяются при создании пользователей через Django Admin или management-команды.
При создании пользователя signal post_save автоматически создаёт записи NotificationPreference по ролевым умолчаниям (для ролей admin, staff, brigadier).