Files
Refactored-App/backend/apps/accounts/models.py
2026-04-01 03:20:54 +02:00

87 lines
3.2 KiB
Python

from django.contrib.auth.models import AbstractUser
from django.db import models
class Role(models.Model):
name = models.CharField(max_length=100, unique=True)
description = models.TextField(blank=True)
is_system = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self) -> str:
return self.name
class DomainPermission(models.Model):
key = models.CharField(max_length=120, unique=True)
label = models.CharField(max_length=200)
group = models.CharField(max_length=120)
def __str__(self) -> str:
return self.key
class RolePermission(models.Model):
role = models.ForeignKey(Role, on_delete=models.CASCADE, related_name="permission_links")
permission = models.ForeignKey(DomainPermission, on_delete=models.CASCADE, related_name="role_links")
class Meta:
unique_together = ("role", "permission")
class User(AbstractUser):
display_name = models.CharField(max_length=255, blank=True)
role = models.ForeignKey(Role, null=True, blank=True, on_delete=models.SET_NULL, related_name="users")
last_login_ip = models.GenericIPAddressField(null=True, blank=True)
def permission_keys(self) -> list[str]:
if not self.role_id:
return []
return list(
self.role.permission_links.select_related("permission")
.order_by("permission__group", "permission__key")
.values_list("permission__key", flat=True)
)
def has_domain_permission(self, key: str) -> bool:
return key in self.permission_keys()
class UserBusinessAccess(models.Model):
user = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="business_links")
business = models.ForeignKey("core.Business", on_delete=models.CASCADE, related_name="user_links")
class Meta:
unique_together = ("user", "business")
class UserDeviceLogin(models.Model):
user = models.ForeignKey("accounts.User", on_delete=models.CASCADE, related_name="device_logins")
ip_address = models.GenericIPAddressField()
last_login_at = models.DateTimeField()
class Meta:
unique_together = ("user", "ip_address")
class AllowedDevice(models.Model):
ip_address = models.GenericIPAddressField(unique=True)
label = models.CharField(max_length=255, blank=True)
user_agent = models.TextField(blank=True)
registered_at = models.DateTimeField(auto_now_add=True)
last_seen_at = models.DateTimeField(null=True, blank=True)
is_active = models.BooleanField(default=True)
ipv6_prefix = models.CharField(max_length=120, blank=True)
device_token = models.CharField(max_length=255, blank=True, unique=True)
known_ips = models.TextField(blank=True)
class DeviceRegistrationToken(models.Model):
token = models.CharField(max_length=255, unique=True)
label = models.CharField(max_length=255, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
expires_at = models.DateTimeField()
used_at = models.DateTimeField(null=True, blank=True)
used_by_ip = models.GenericIPAddressField(null=True, blank=True)
created_by = models.ForeignKey("accounts.User", null=True, blank=True, on_delete=models.SET_NULL)