/
sys-chan
/
max
Обзор
Документация
Войти
/
sys-chan
/
max
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
back/core/app/models.py
137 строк
5 KB
sys-chan
Исправлены ViewSet
05 май 2026, 10:03
05 май 2026, 10:03
c31dcba
Код
Авторство
О чём код?
from django.db import models from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from uuid import uuid4 import os def get_upload_path(instance, filename): sender_id = str(instance.sender.id) if instance.sender else "system" return os.path.join(sender_id, f"{uuid4().hex}_{filename}") class File(models.Model): class Type(models.TextChoices): PHOTO = "photo" DOCUMENT = "document" id = models.UUIDField(primary_key=True, default=uuid4, editable=False) file = models.FileField(upload_to=get_upload_path) sender = models.ForeignKey("User", on_delete=models.CASCADE, related_name="files", null=True, blank=True) type = models.CharField(choices=Type.choices, default=Type.DOCUMENT, max_length=10) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return str(self.id) class UserManager(BaseUserManager): def create_user(self, email, password=None, **kwargs): if not email: raise ValueError("Email is required") email = self.normalize_email(email) user = self.model(email=email, **kwargs) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password=None, **kwargs): kwargs.setdefault("role", "admin") kwargs.setdefault("is_superuser", True) return self.create_user(email, password, **kwargs) class User(AbstractBaseUser, PermissionsMixin): class Role(models.TextChoices): USER = "user" ADMIN = "admin" class Status(models.TextChoices): ACTIVE = "active" BLOCKED = "blocked" id = models.UUIDField(primary_key=True, default=uuid4, editable=False) name = models.CharField(max_length=64) email = models.EmailField(unique=True, db_index=True) photo = models.ForeignKey(File, on_delete=models.SET_NULL, blank=True, null=True) role = models.CharField(max_length=10, choices=Role.choices, default=Role.USER) status = models.CharField(max_length=10, choices=Status.choices, default=Status.ACTIVE) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) objects = UserManager() USERNAME_FIELD = "email" REQUIRED_FIELDS = ["name"] @property def is_active(self): return self.status == self.Status.ACTIVE @property def is_staff(self): return self.role == self.Role.ADMIN def __str__(self): return str(self.id) class Chat(models.Model): class Type(models.TextChoices): PRIVATE = "private" GROUP = "group" CHANNEL = "channel" id = models.UUIDField(primary_key=True, default=uuid4, editable=False) title = models.CharField(max_length=128) photo = models.ForeignKey(File, on_delete=models.SET_NULL, blank=True, null=True) type = models.CharField(choices=Type.choices, default=Type.PRIVATE, max_length=10) owner = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return str(self.id) class Message(models.Model): id = models.UUIDField(primary_key=True, default=uuid4, editable=False) text = models.TextField(blank=True, null=True) file = models.ForeignKey(File, on_delete=models.SET_NULL, blank=True, null=True) chat = models.ForeignKey(Chat, on_delete=models.CASCADE, related_name="messages") sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name="messages") reply_to = models.ForeignKey("self", on_delete=models.SET_NULL, blank=True, null=True, related_name="replies") created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["created_at"] def __str__(self): return str(self.id) class ChatMember(models.Model): id = models.UUIDField(primary_key=True, default=uuid4, editable=False) chat = models.ForeignKey(Chat, on_delete=models.SET_NULL, blank=True, null=True, related_name="members") user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True, related_name="chats") recent = models.ForeignKey(Message, on_delete=models.SET_NULL, blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return str(self.id)