Разбил файлик models.py на отдельные файлы моделей

This commit is contained in:
2025-12-15 15:51:54 +03:00
parent 46dc79b93f
commit 480bb60855
14 changed files with 1723 additions and 1654 deletions

View File

@@ -0,0 +1,103 @@
"""
Модели пользователей и разрешений.
"""
from django.contrib.auth.models import User
from django.db import models
class UserPermission(models.Model):
"""
Модель разрешения пользователя.
Хранит гранулярные разрешения для конкретных действий в системе.
"""
code = models.CharField(
max_length=50,
verbose_name="Код разрешения",
db_index=True,
help_text="Уникальный код разрешения",
)
def __str__(self):
from ..permissions import PERMISSION_CHOICES
choices_dict = dict(PERMISSION_CHOICES)
return choices_dict.get(self.code, self.code)
class Meta:
verbose_name = "Разрешение"
verbose_name_plural = "Разрешения"
ordering = ["code"]
class CustomUser(models.Model):
"""
Расширенная модель пользователя с ролями.
Добавляет систему ролей к стандартной модели User Django.
"""
ROLE_CHOICES = [
("admin", "Администратор"),
("moderator", "Модератор"),
("user", "Пользователь"),
]
# Связи
user = models.OneToOneField(
User,
on_delete=models.CASCADE,
verbose_name="Пользователь",
help_text="Связанный пользователь Django",
)
# Основные поля
role = models.CharField(
max_length=20,
choices=ROLE_CHOICES,
default="user",
verbose_name="Роль пользователя",
db_index=True,
help_text="Роль пользователя в системе",
)
# Индивидуальные разрешения (если пусто - используются права роли по умолчанию)
user_permissions = models.ManyToManyField(
UserPermission,
related_name="users",
verbose_name="Индивидуальные разрешения",
blank=True,
help_text="Если указаны - используются вместо прав роли по умолчанию",
)
# Флаг использования индивидуальных разрешений
use_custom_permissions = models.BooleanField(
default=False,
verbose_name="Использовать индивидуальные разрешения",
help_text="Если включено - используются индивидуальные разрешения вместо прав роли",
)
def __str__(self):
return (
f"{self.user.first_name} {self.user.last_name}"
if self.user.first_name and self.user.last_name
else self.user.username
)
def has_perm(self, permission_code):
"""
Проверяет наличие разрешения у пользователя.
Args:
permission_code: Код разрешения
Returns:
bool: True если пользователь имеет разрешение
"""
from ..permissions import has_permission
return has_permission(self.user, permission_code)
class Meta:
verbose_name = "Пользователь"
verbose_name_plural = "Пользователи"
ordering = ["user__username"]