Files
dbstorage/dbapp/mainapp/models/users.py

104 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Модели пользователей и разрешений.
"""
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"]