Add JWT auth with per-user data isolation and account settings.

Users can register, log in, and manage profile/password in a personal account page; server data is scoped by owner across contacts, maps, tags, and import.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-28 21:10:16 +03:00
co-authored by Cursor
parent 85b8b2e9b8
commit 4eb4c145b6
40 changed files with 2301 additions and 117 deletions
+33
View File
@@ -1,3 +1,4 @@
from django.conf import settings
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
@@ -10,6 +11,14 @@ from core.choices import (
class Contact(models.Model):
"""Контакт в социальном графе."""
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='contacts',
null=True,
blank=True,
verbose_name='Владелец',
)
name = models.CharField(max_length=255, verbose_name='Имя')
email = models.EmailField(blank=True, verbose_name='Email')
phone = models.CharField(max_length=50, blank=True, verbose_name='Телефон')
@@ -31,6 +40,14 @@ class Contact(models.Model):
class NetworkMapType(models.Model):
"""Тип карты сети: настраиваемые секторы и концентрические круги."""
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='network_map_types',
null=True,
blank=True,
verbose_name='Владелец',
)
name = models.CharField(max_length=255, verbose_name='Название типа')
sectors = models.JSONField(default=list, verbose_name='Секторы')
circles = models.JSONField(default=list, verbose_name='Круги')
@@ -54,6 +71,14 @@ class NetworkMapType(models.Model):
class NetworkMap(models.Model):
"""Карта сети — отдельный контекст для визуализации подмножества контактов."""
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='network_maps',
null=True,
blank=True,
verbose_name='Владелец',
)
name = models.CharField(max_length=255, verbose_name='Название')
description = models.TextField(blank=True, verbose_name='Описание')
map_type = models.ForeignKey(
@@ -136,6 +161,14 @@ class NetworkMapMembership(models.Model):
class Relation(models.Model):
"""Связь между двумя контактами."""
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='relations',
null=True,
blank=True,
verbose_name='Владелец',
)
source = models.ForeignKey(
Contact,
on_delete=models.CASCADE,