58 lines
2.1 KiB
Python
58 lines
2.1 KiB
Python
from django.conf import settings
|
|
from django.db import models
|
|
|
|
|
|
class ResourceGroup(models.Model):
|
|
"""Привязка к реальной группе AD (adminusergroup из пути URL)."""
|
|
|
|
ad_group_name = models.SlugField(
|
|
max_length=100,
|
|
unique=True,
|
|
help_text="Точное имя группы AD (cn), используется как сегмент пути в URL",
|
|
)
|
|
display_name = models.CharField(max_length=200)
|
|
|
|
class Meta:
|
|
verbose_name = "Группа ресурсов (AD-группа)"
|
|
verbose_name_plural = "Группы ресурсов (AD-группы)"
|
|
|
|
def __str__(self):
|
|
return self.display_name
|
|
|
|
|
|
class Resource(models.Model):
|
|
"""Конкретный административный ресурс внутри группы."""
|
|
|
|
group = models.ForeignKey(ResourceGroup, on_delete=models.CASCADE, related_name="resources")
|
|
slug = models.SlugField(max_length=100, help_text="Сегмент пути, например 'resource1'")
|
|
name = models.CharField(max_length=200)
|
|
description = models.TextField(blank=True)
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
class Meta:
|
|
unique_together = ("group", "slug")
|
|
verbose_name = "Ресурс"
|
|
verbose_name_plural = "Ресурсы"
|
|
|
|
def __str__(self):
|
|
return f"{self.group.ad_group_name}/{self.slug}"
|
|
|
|
@property
|
|
def path(self) -> str:
|
|
return f"/{self.group.ad_group_name}/{self.slug}/"
|
|
|
|
|
|
class AccessLog(models.Model):
|
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
|
|
resource = models.ForeignKey(Resource, on_delete=models.SET_NULL, null=True)
|
|
ip_address = models.GenericIPAddressField(null=True, blank=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
verbose_name = "Запись аудита доступа"
|
|
verbose_name_plural = "Аудит доступа"
|
|
ordering = ["-created_at"]
|
|
|
|
def __str__(self):
|
|
return f"{self.user} -> {self.resource} @ {self.created_at:%Y-%m-%d %H:%M}"
|