from django.db import models from django.contrib.auth.models import User from Sistemas.models import Sistema from rest_framework.authtoken.models import Token from django.utils import timezone import re class ClientesA24(models.Model): RFC = models.CharField(max_length=13, unique=True) Nombre = models.CharField(max_length=100) Activo = models.BooleanField(default=False) fecha_baja = models.DateField(blank=True,null=True) class Meta: ordering = ('-Activo','RFC',) def __str__(self): return self.Nombre class Sistemas_por_cliente_A24(models.Model): id_sistema= models.ForeignKey(Sistema, related_name='sistema_spc_IMMEX', on_delete=models.CASCADE) cliente = models.ForeignKey(ClientesA24, related_name='cliente_spc_IMMEX', on_delete=models.CASCADE) num_licencias= models.IntegerField(default=1) def __str__(self): return f'{self.cliente.Nombre}, {self.id_sistema.nombre_sistema} ' class Meta: ordering= ('-cliente','id_sistema') unique_together = ('id_sistema', 'cliente') class DeviceA24(models.Model): clienteA24 = models.ForeignKey(ClientesA24,on_delete=models.CASCADE) deviceName = models.CharField(max_length=255) deviceOS = models.CharField(max_length=255) deviceIP = models.GenericIPAddressField() token = models.ForeignKey(Token, on_delete=models.CASCADE, max_length=40, blank=True,null=True) username = models.ForeignKey(User, on_delete=models.CASCADE) sistema = models.ForeignKey(Sistema, on_delete=models.CASCADE) MAC = models.CharField(max_length=30, blank=True, null=True) dataBase = models.CharField(max_length=40, blank=True,null=True) timestamp = models.DateTimeField(auto_now_add=True) class Meta: ordering = ('username',) #abstract=True def generate_username(self,client, device_name, mac_address): """""" username_ = f"IMMEX_{client.RFC}_{device_name}_{mac_address}" username_ = re.sub(r'\W+', '', username_) if User.objects.filter(username=username_).exists(): return User.objects.get(username=username_) return User.objects.create_user(username=username_) def save(self,*args, **kwargs): """Overrides save method""" if not self.pk: obj = self.generate_username(self.clienteA24, self.deviceName, self.MAC) self.username=obj token, created = Token.objects.get_or_create(user=obj) self.token = token super().save(*args, **kwargs) def __str__(self): return f'{self.username}' class ActiveTokenSession(models.Model): token = models.ForeignKey(Token, on_delete=models.CASCADE, db_index=True) start_time = models.DateTimeField(default=timezone.now) last_time = models.DateTimeField(default=timezone.now) has_expired = models.BooleanField(default=False) def is_expired(self, expiration_minutes): expiration_time = self.start_time + timezone.timedelta(minutes=expiration_minutes) return expiration_time < timezone.now() ##--------------------------PERMISOS class Permisos_A24(models.Model): nombre= models.CharField(max_length=100) def __str__(self) -> str: return f'{self.nombre}' class Modulo(models.Model): nombre = models.CharField(max_length=100) #sistema_cliente = models.ForeignKey(Sistemas_por_cliente_A24, on_delete=models.CASCADE) permisos = models.ManyToManyField(Permisos_A24) def __str__(self) -> str: return f'{self.nombre}' class Suspension_Modulos_Permisos_Cliente(models.Model): sistema_cliente = models.ForeignKey(Sistemas_por_cliente_A24, on_delete=models.CASCADE) def __str__(self) -> str: return f'{self.sistema_cliente} {self.sistema_cliente.id_sistema.nombre_sistema}' class SuspensionModulo(models.Model): supension_modPerm_id = models.ForeignKey(Suspension_Modulos_Permisos_Cliente, on_delete=models.CASCADE) modulo = models.ForeignKey(Modulo, on_delete=models.CASCADE) suspendido = models.BooleanField(default=False) def __str__(self) -> str: return f'{self.modulo}' class SuspensionPermiso(models.Model): supension_modPermP = models.ForeignKey(Suspension_Modulos_Permisos_Cliente, on_delete=models.CASCADE) suspension_modulo = models.ForeignKey(Modulo, on_delete=models.CASCADE,blank=True,null=True) permiso = models.ForeignKey(Permisos_A24, on_delete=models.CASCADE) suspendido = models.BooleanField(default=False) def __str__(self) -> str: return f'{self.permiso}' class Meta: ordering=['suspension_modulo']