80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
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
|
|
|
|
|
|
|