feat(auth): согласие на обработку персональных данных при регистрации
Отключаемый модуль (instance_settings.consent_policy): галочка + ссылка на публичную страницу регламента на форме регистрации, редактируемый в админке текст с типовым шаблоном по умолчанию (плейсхолдеры под организацию, не проходил юридическую проверку), версия текста растёт при каждой правке. Факт согласия хранится в users (consent_version, consent_given_at) — второй эшелон проверки на сервере, как и для отключаемых модулей ранее. Дефолт (выключено) сохраняет поведение существующих инсталляций, у уже зарегистрированных пользователей согласие не запрашивается.
This commit is contained in:
@@ -3,7 +3,17 @@
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import Boolean, CheckConstraint, DateTime, ForeignKey, String, Text, func, text
|
||||
from sqlalchemy import (
|
||||
Boolean,
|
||||
CheckConstraint,
|
||||
DateTime,
|
||||
ForeignKey,
|
||||
Integer,
|
||||
String,
|
||||
Text,
|
||||
func,
|
||||
text,
|
||||
)
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
@@ -35,6 +45,13 @@ class User(Base):
|
||||
# Путь к загруженному аватару (относительно `MEDIA_ROOT`):
|
||||
# `avatars/{user_id}.{ext}`; `NULL` — заглушка с инициалами на фронте.
|
||||
avatar_path: Mapped[str | None] = mapped_column(String(512), nullable=True)
|
||||
# Согласие на обработку персональных данных при регистрации: редакция
|
||||
# регламента (`instance_settings.consent_policy.version` на момент
|
||||
# согласия) и время. `NULL` у обоих — согласие не запрашивалось (модуль
|
||||
# был выключен либо пользователь зарегистрирован до появления этой
|
||||
# настройки); вход таким пользователям не блокируется.
|
||||
consent_version: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
consent_given_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)
|
||||
created_at: Mapped[datetime] = mapped_column(
|
||||
DateTime(timezone=True), nullable=False, server_default=func.now()
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user