87 lines
3.2 KiB
Python
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)
|