Files
backend/api/record/models.py

105 lines
3.9 KiB
Python

from django.db import models
import uuid
from api.organization.models import UsoAlmacenamiento
# Create your models here.
class Document(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
organizacion = models.ForeignKey('organization.Organizacion', on_delete=models.CASCADE, related_name='documents')
pedimento = models.ForeignKey('customs.Pedimento', on_delete=models.CASCADE, related_name='documents')
archivo = models.FileField(upload_to='documents/', max_length=400)
document_type = models.ForeignKey('DocumentType', on_delete=models.CASCADE, related_name='documents', blank=True, null=True)
extension = models.CharField(max_length=60, blank=True, null=True)
size = models.PositiveIntegerField()
fuente = models.ForeignKey('Fuente', on_delete=models.CASCADE, related_name='documents', blank=True, null=True)
vu = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def save(self, *args, **kwargs):
is_new = self._state.adding
# Calcular automáticamente el campo vu
if self.document_type_id:
# rango de IDs que indican documentos VU
self.vu = 13 <= self.document_type_id <= 26
else:
self.vu = False
# Usar get_or_create en lugar de get para manejar el caso cuando no existe
uso_almacenamiento, created = UsoAlmacenamiento.objects.get_or_create(
organizacion=self.organizacion,
defaults={'espacio_utilizado': 0}
)
almacenamiento_licencia_bytes = self.organizacion.licencia.almacenamiento * 1024 ** 3
if is_new:
if uso_almacenamiento.espacio_utilizado + self.size > almacenamiento_licencia_bytes:
raise ValueError("La organización no tiene suficiente espacio de almacenamiento disponible")
super().save(*args, **kwargs)
uso_almacenamiento.espacio_utilizado += self.size
uso_almacenamiento.save()
else:
old_file = Document.objects.get(pk=self.pk)
if old_file.size != self.size:
diferencia = self.size - old_file.size
if uso_almacenamiento.espacio_utilizado + diferencia > almacenamiento_licencia_bytes:
raise ValueError("No hay suficiente espacio para la actualización")
uso_almacenamiento.espacio_utilizado += diferencia
uso_almacenamiento.save()
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
# Usar get_or_create aquí también por si acaso
uso_almacenamiento, created = UsoAlmacenamiento.objects.get_or_create(
organizacion=self.organizacion,
defaults={'espacio_utilizado': 0}
)
uso_almacenamiento.espacio_utilizado -= self.size
uso_almacenamiento.save()
super().delete(*args, **kwargs)
def __str__(self):
return f"{self.archivo.name}"
class Meta:
verbose_name = "Document"
verbose_name_plural = "Documents"
db_table = 'document'
ordering = ['created_at']
class DocumentType(models.Model):
nombre = models.CharField(max_length=100, unique=True)
descripcion = models.TextField(blank=True, null=True)
def __str__(self):
return self.nombre
class Meta:
verbose_name = "Tipo de Documento"
verbose_name_plural = "Tipos de Documento"
db_table = 'document_type'
ordering = ['nombre']
class Fuente(models.Model):
nombre = models.CharField(max_length=100, unique=True)
descripcion = models.TextField(blank=True, null=True)
def __str__(self):
return self.nombre
class Meta:
verbose_name = "Fuente"
verbose_name_plural = "Fuentes"
db_table = 'fuente'
ordering = ['nombre']