Features: 1) Add db_table attribute for vibes_auth_user in authv.models; 2) Enhance DB backup configuration to support sftp and ftp storage in settings.

Fixes: 1) Add missing import for `ImproperlyConfigured` in `base.py`.

Extra: 1) Refactor and relocate DB backup configuration from `dbbackup.py` to `base.py`.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-11-08 05:06:58 +03:00
parent 33362d8340
commit 5e10f2eac7
3 changed files with 62 additions and 48 deletions

View file

@ -111,6 +111,7 @@ class User(AbstractUser, NiceModel): # type: ignore [django-manager-missing]
return self.email
class Meta:
db_table = "vibes_auth_user"
swappable = "AUTH_USER_MODEL"
verbose_name = _("user")
verbose_name_plural = _("users")

View file

@ -4,6 +4,8 @@ from os import getenv, name
from pathlib import Path
from typing import Any
from django.core.exceptions import ImproperlyConfigured
EVIBES_VERSION = "2025.4"
RELEASE_DATE = datetime(2025, 9, 13)
@ -407,10 +409,66 @@ STORAGES: dict[str, dict[str, str | int | bool | None]] = {
if DEBUG
else "whitenoise.storage.CompressedManifestStaticFilesStorage"
},
}
if getenv("DBBACKUP_HOST") and getenv("DBBACKUP_USER") and getenv("DBBACKUP_PASS"):
dbbackup_server_type = getenv("DBBACKUP_TYPE", "sftp")
project_name = getenv("EVIBES_PROJECT_NAME", "evibes_common").lower().replace(" ", "_")
raw_path = getenv("DBBACKUP_PATH", f"/backups/{project_name}/")
cleaned = raw_path.strip("/")
remote_dir = f"{cleaned}/"
match dbbackup_server_type:
case "sftp":
STORAGES.update(
{
"dbbackup": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
"BACKEND": "storages.backends.sftpstorage.SFTPStorage",
"OPTIONS": {
"host": getenv("DBBACKUP_HOST"),
"root_path": f"/{remote_dir}",
"params": {
"username": getenv("DBBACKUP_USER"),
"password": getenv("DBBACKUP_PASS"),
"allow_agent": False,
"look_for_keys": False,
},
"interactive": False,
"file_mode": 0o600,
"dir_mode": 0o700,
},
}
}
)
case "ftp":
STORAGES.update(
{
"dbbackup": {
"BACKEND": "evibes.ftpstorage.AbsoluteFTPStorage",
"OPTIONS": {
"location": (
f"ftp://{getenv('DBBACKUP_USER')}:{getenv('DBBACKUP_PASS')}@{getenv('DBBACKUP_HOST')}:21/{raw_path}"
),
},
}
}
)
case _:
raise ImproperlyConfigured(f"Invalid DBBACKUP_TYPE: {dbbackup_server_type}")
else:
STORAGES.update(
{
"dbbackup": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
"OPTIONS": {
"location": "/app/backups/",
},
}
}
)
if name == "nt":
GDAL_LIBRARY_PATH = r"C:\OSGeo4W\bin\gdal311.dll"

View file

@ -1,6 +1,3 @@
from os import getenv
from django.core.exceptions import ImproperlyConfigured
DBBACKUP_CONNECTORS = {
"default": {
"SINGLE_TRANSACTION": False,
@ -8,45 +5,3 @@ DBBACKUP_CONNECTORS = {
"RESTORE_SUFFIX": "--set ON_ERROR_STOP=off",
}
}
if getenv("DBBACKUP_HOST") and getenv("DBBACKUP_USER") and getenv("DBBACKUP_PASS"):
dbbackup_server_type = getenv("DBBACKUP_TYPE", "sftp")
project_name = getenv("EVIBES_PROJECT_NAME", "evibes_common").lower().replace(" ", "_")
raw_path = getenv("DBBACKUP_PATH", f"/backups/{project_name}/")
cleaned = raw_path.strip("/")
remote_dir = f"{cleaned}/"
match dbbackup_server_type:
case "sftp":
DBBACKUP_STORAGE = "storages.backends.sftpstorage.SFTPStorage"
DBBACKUP_STORAGE_OPTIONS = {
"host": getenv("DBBACKUP_HOST"),
"root_path": f"/{remote_dir}",
"params": {
"username": getenv("DBBACKUP_USER"),
"password": getenv("DBBACKUP_PASS"),
"allow_agent": False,
"look_for_keys": False,
},
"interactive": False,
"file_mode": 0o600,
"dir_mode": 0o700,
}
case "ftp":
DBBACKUP_STORAGE = "evibes.ftpstorage.AbsoluteFTPStorage"
DBBACKUP_STORAGE_OPTIONS = {
"location": (
f"ftp://{getenv('DBBACKUP_USER')}:{getenv('DBBACKUP_PASS')}@{getenv('DBBACKUP_HOST')}:21/{raw_path}"
),
}
case _:
raise ImproperlyConfigured(f"Invalid DBBACKUP_TYPE: {dbbackup_server_type}")
else:
DBBACKUP_STORAGE = "django.core.files.storage.FileSystemStorage"
DBBACKUP_STORAGE_OPTIONS = {
"location": "/app/backups/",
}