KNOTTA research & development

Пользователи и роли

Модель User, пять системных ролей, связь с Supabase Auth, привязка Telegram.

Пользователи и роли

User

Префикс: acc_ Таблица: auth_user Файл: garden/modules/account/models.py

User — это и Django-аутентификация (AbstractBaseUser + PermissionsMixin), и доменная модель (BaseModel).

ПолеТипОписание
idKSUID, acc_*Первичный ключ
supabase_uidCharField(unique)UUID пользователя в Supabase Auth — связь с JWT sub
emailEmailField(unique)Основной идентификатор для входа
phoneCharField(unique, nullable)В международном формате (+7999...)
first_name, last_nameCharFieldИмя и фамилия
full_nameGeneratedFieldКонкатенация имени и фамилии (хранится в БД)
preferred_languageCharField(2)ru / en, default ru
roleCharField(32)UserRoleДоменная роль (см. ниже)
is_activeBooleanFieldДеактивация аккаунта
is_staffBooleanFieldДоступ к Django Admin
is_superuserBooleanFieldПолные права
date_joinedDateTimeFieldДата регистрации

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_staffis_superuserЧто делает
admintruetrueПолный контроль системы. Управление пользователями, шаблонами, справочниками, настройками. Доступ к Django Admin.
stafftruefalseБэк-офис. Утверждает/отклоняет отчёты, ведёт клиентскую базу, видит всё. Без суперпользовательских прав. Доступ к Django Admin.
brigadierfalsefalseСтарший на объекте. Получает наряд от сотрудника, ведёт его статус (запуск → завершение), заполняет и подаёт отчёт. Видит только свои наряды (где он назначен бригадиром или участником).
workerfalsefalseУказывается бригадиром в отчёте. Используется как ссылка на физического исполнителя. Не используется для входа в дашборд.
clientfalsefalseЗаказчик работ. Видит отчёты по своим объектам через привязку ContactPerson.user.

Связь с Supabase Auth

Загрузка диаграммы…

User.supabase_uid уникален и проиндексирован — это единственная привязка между двумя системами. Любой запрос к Django проходит через SupabaseAuthentication, которая по sub из JWT находит соответствующего User.

Роль (User.role) дублируется в app_metadata.role в Supabase Auth через Edge Function set-role — фронту удобно читать её прямо из JWT, не дёргая бэкенд.

Префикс: tglnk_ Файл: garden/modules/communication/models.py

Связь пользователя с его Telegram-аккаунтом. Создаётся, когда пользователь нажимает «Старт» на боте, перейдя по deep-link с приглашением.

ПолеТипОписание
idKSUID, tglnk_*Первичный ключ
userFK → UserНа кого ссылается
telegram_idBigIntegerFieldTelegram user_id
usernameCharField(nullable)@username (если есть)
first_name, last_nameCharFieldИз Telegram-профиля
blocked_atDateTimeField(nullable)Когда пользователь заблокировал бота

Канал telegram в NotificationPreference доступен подписчику только если у него есть активная (blocked_at IS NULL) TelegramLink с telegram_id.

ChatwootContact

Файл: garden/modules/communication/models.py (ChatwootContact)

Связь пользователя с его контактной записью в Chatwoot. Один User может иметь несколько ChatwootContact — например, один для Telegram-источника, другой для веб-источника.

ПолеОписание
userFK → User
chatwoot_contact_idID контакта в Chatwoot
sourceChatwootSource: 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).

На странице