from django.db import models from django.core.files.storage import FileSystemStorage from django.conf import settings import pathlib import uuid import time credentials_storage = FileSystemStorage(pathlib.Path(__file__).parent / 'credentials') class DBCredential(models.Model): # credentials = models.FileField(storage=credentials_storage) credentials = models.JSONField(default=dict) create_db_perm = models.BooleanField(default=False) user = models.ForeignKey("user.User", on_delete=models.CASCADE) class DB(models.Model): name = models.CharField(max_length=100) db_name = models.CharField(max_length=255) date_created = models.DateTimeField(auto_now_add=True) date_modified = models.DateTimeField(auto_now=True) credential = models.ForeignKey("DBCredential", on_delete=models.CASCADE) user = models.ForeignKey("user.User", on_delete=models.CASCADE) db_types = ( ("mysql", "MySQL/MariaDB"), ("postgres", "PostgreSQL"), ) db_type = models.CharField(max_length=100, choices=db_types) class DBBackup(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) date_created = models.DateTimeField(auto_now_add=True) date_modified = models.DateTimeField(auto_now=True) db = models.ForeignKey("DB", on_delete=models.CASCADE, related_name="backups") status_choices = [ ("waiting", "waiting"), ("running", "running"), ("ok", "Ok"), ("error", "Error"), ("expired", "Expired") ] status = models.CharField(max_length=20, default="waiting", choices=status_choices) task_id = models.CharField(max_length=100, null=True) rel_path = models.CharField(max_length=100) def save(self, *args, **kwargs): if not self.rel_path: self.rel_path = "{db_id}-{timestamp}-{rand_gen}.{db_type}.{ext}".format( db_id=self.db.id, timestamp=int(time.time()), rand_gen=uuid.uuid4().hex[:5], db_type=self.db.db_type, ext='sql.gz' ) return super().save(*args, **kwargs) def update_status(self, status): self.status = status self.save() def update_task_id(self, task_id): if task_id != self.task_id: self.task_id = task_id self.save() def set_expired(self): self.status = "expired" self.abs_path.unlink(True) self.save() @property def abs_path(self): return settings.BACKUPS_PATH / self.rel_path