111 lines
3.0 KiB
Python
111 lines
3.0 KiB
Python
import re
|
|
from datetime import datetime
|
|
|
|
from django.core.checks import Tags, Warning, register
|
|
|
|
from dbbackup import settings
|
|
|
|
W001 = Warning(
|
|
"Invalid HOSTNAME parameter",
|
|
hint="Set a non empty string to this settings.DBBACKUP_HOSTNAME",
|
|
id="dbbackup.W001",
|
|
)
|
|
W002 = Warning(
|
|
"Invalid STORAGE parameter",
|
|
hint="Set a valid path to a storage in settings.DBBACKUP_STORAGE",
|
|
id="dbbackup.W002",
|
|
)
|
|
W003 = Warning(
|
|
"Invalid FILENAME_TEMPLATE parameter",
|
|
hint="Include {datetime} to settings.DBBACKUP_FILENAME_TEMPLATE",
|
|
id="dbbackup.W003",
|
|
)
|
|
W004 = Warning(
|
|
"Invalid MEDIA_FILENAME_TEMPLATE parameter",
|
|
hint="Include {datetime} to settings.DBBACKUP_MEDIA_FILENAME_TEMPLATE",
|
|
id="dbbackup.W004",
|
|
)
|
|
W005 = Warning(
|
|
"Invalid DATE_FORMAT parameter",
|
|
hint="settings.DBBACKUP_DATE_FORMAT can contain only [A-Za-z0-9%_-]",
|
|
id="dbbackup.W005",
|
|
)
|
|
W006 = Warning(
|
|
"FAILURE_RECIPIENTS has been deprecated",
|
|
hint="settings.DBBACKUP_FAILURE_RECIPIENTS is replaced by "
|
|
"settings.DBBACKUP_ADMINS",
|
|
id="dbbackup.W006",
|
|
)
|
|
W007 = Warning(
|
|
"Invalid FILENAME_TEMPLATE parameter",
|
|
hint="settings.DBBACKUP_FILENAME_TEMPLATE must not contain slashes ('/'). "
|
|
"Did you mean to change the value for 'location'?",
|
|
id="dbbackup.W007",
|
|
)
|
|
W008 = Warning(
|
|
"Invalid MEDIA_FILENAME_TEMPLATE parameter",
|
|
hint="settings.DBBACKUP_MEDIA_FILENAME_TEMPLATE must not contain slashes ('/')"
|
|
"Did you mean to change the value for 'location'?",
|
|
id="dbbackup.W007",
|
|
)
|
|
|
|
|
|
def check_filename_templates():
|
|
return _check_filename_template(
|
|
settings.FILENAME_TEMPLATE,
|
|
W007,
|
|
"db",
|
|
) + _check_filename_template(
|
|
settings.MEDIA_FILENAME_TEMPLATE,
|
|
W008,
|
|
"media",
|
|
)
|
|
|
|
|
|
def _check_filename_template(filename_template, check_code, content_type) -> list:
|
|
if callable(filename_template):
|
|
params = {
|
|
"servername": "localhost",
|
|
"datetime": datetime.now().strftime(settings.DATE_FORMAT),
|
|
"databasename": "default",
|
|
"extension": "dump",
|
|
"content_type": content_type,
|
|
}
|
|
filename_template = filename_template(params)
|
|
|
|
if "/" in filename_template:
|
|
return [check_code]
|
|
return []
|
|
|
|
|
|
@register(Tags.compatibility)
|
|
def check_settings(app_configs, **kwargs):
|
|
errors = []
|
|
if not settings.HOSTNAME:
|
|
errors.append(W001)
|
|
|
|
if not settings.STORAGE or not isinstance(settings.STORAGE, str):
|
|
errors.append(W002)
|
|
|
|
if (
|
|
not callable(settings.FILENAME_TEMPLATE)
|
|
and "{datetime}" not in settings.FILENAME_TEMPLATE
|
|
):
|
|
errors.append(W003)
|
|
|
|
if (
|
|
not callable(settings.MEDIA_FILENAME_TEMPLATE)
|
|
and "{datetime}" not in settings.MEDIA_FILENAME_TEMPLATE
|
|
):
|
|
errors.append(W004)
|
|
|
|
if re.search(r"[^A-Za-z0-9%_-]", settings.DATE_FORMAT):
|
|
errors.append(W005)
|
|
|
|
if getattr(settings, "FAILURE_RECIPIENTS", None) is not None:
|
|
errors.append(W006)
|
|
|
|
errors += check_filename_templates()
|
|
|
|
return errors
|