diff --git a/.env.example b/.env.example index e7edf14..c8b4abb 100644 --- a/.env.example +++ b/.env.example @@ -13,3 +13,5 @@ DJANGO_USE_SIMPLE_DATABASE=True DJANGO_DATABASE_NAME=database DJANGO_DATABASE_USER=webmaster DJANGO_DATABASE_PASSWORD=this_very_secret_password_for_database + +DJANGO_LOG_FILE_PATH=/path/to/log/file diff --git a/README.md b/README.md index d3882cb..c6a2d36 100644 --- a/README.md +++ b/README.md @@ -272,12 +272,26 @@ DJANGO_MAIL_PORT=2525 DJANGO_MAIL_USER=webmaster@localhost DJANGO_MAIL_PASSWORD=this_very_secret_password_for_smtp_mail DEFAULT_USER_IS_ACTIVE=False +DJANGO_USE_SIMPLE_DATABASE=True +DJANGO_LOG_FILE_PATH=/path/to/log/file ``` `DJANGO_SECRET_KEY`, `DJANGO_ALLOWED_HOSTS` замените на свои значения. `DJANGO_MAIL_HOST`, `DJANGO_MAIL_PORT`, `DJANGO_MAIL_USER`, `DJANGO_MAIL_PASSWORD` - настройки почтового сервиса, используйте свои. +`DJANGO_LOG_FILE_PATH` - путь, по которому приложение будет записывать все логи +(уровень логирования WARNING и выше) + +`DJANGO_USE_SIMPLE_DATABASE` - Если `True`, то приложение будет использовать в +качестве базы данных простой файл. +Если установлено значение `False`, то необходимо указать настройки для сложной +СУБД ([postgresql](https://www.postgresql.org/)): +`DJANGO_DATABASE_NAME` - название вашей БД, `DJANGO_DATABASE_USER` - имя +пользователя БД, `DJANGO_DATABASE_PASSWORD` - пароль пользователя БД. +Предполагается, что БД находиться там же, где и приложения и работает на порту +5432 + Настройка `DEFAULT_USER_IS_ACTIVE=False` - означает, что перед использованием сервиса обязательно требуется подтверждённая почта, установите `True`, если этого не нужно diff --git a/datanar/datanar/settings.py b/datanar/datanar/settings.py index 88d6970..b3b77fd 100644 --- a/datanar/datanar/settings.py +++ b/datanar/datanar/settings.py @@ -1,4 +1,5 @@ from pathlib import Path +import sys from decouple import config, strtobool from django.conf import settings @@ -6,7 +7,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent -VERSION = "1.5.9" +VERSION = "1.6.0" SECRET_KEY = config( "DJANGO_SECRET_KEY", @@ -16,6 +17,32 @@ DEBUG = bool(strtobool(config("DJANGO_DEBUG", "False"))) +NOT_TESTING = "test" not in sys.argv + +if "None" != config("DJANGO_LOG_FILE_PATH", default="None", cast=str): + LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "verbose": { + "format": "{levelname}\n{asctime}\n>>> {message}\n", + "style": "{", + }, + }, + "handlers": { + "file": { + "level": "WARNING", + "class": "logging.FileHandler", + "filename": config("DJANGO_LOG_FILE_PATH", cast=str), + "formatter": "verbose", + }, + }, + "root": { + "handlers": ["file"], + "level": "WARNING", + }, + } + ALLOWED_HOSTS = config( "DJANGO_ALLOWED_HOSTS", default="*", @@ -58,7 +85,7 @@ "tz_detect.middleware.TimezoneMiddleware", ] -if settings.DEBUG: +if settings.DEBUG and NOT_TESTING: INSTALLED_APPS.append("debug_toolbar") MIDDLEWARE.append("debug_toolbar.middleware.DebugToolbarMiddleware") INTERNAL_IPS = ["127.0.0.1"] diff --git a/datanar/datanar/urls.py b/datanar/datanar/urls.py index 9134a1b..58c10ab 100644 --- a/datanar/datanar/urls.py +++ b/datanar/datanar/urls.py @@ -16,7 +16,7 @@ path("", include("redirects.urls")), ] -if settings.DEBUG: +if settings.DEBUG and settings.NOT_TESTING: import debug_toolbar urlpatterns.append(path("__debug__/", include(debug_toolbar.urls))) diff --git a/datanar/redirects/forms.py b/datanar/redirects/forms.py index 4c90d79..5bb67fa 100644 --- a/datanar/redirects/forms.py +++ b/datanar/redirects/forms.py @@ -14,12 +14,16 @@ sqids = Sqids() +def _now_date(): + return timezone.now().date() + + class CustomDateField(forms.DateInput): input_type = "date" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.attrs["min"] = timezone.now().date() + self.attrs["min"] = _now_date() class RedirectForm(BootstrapFormMixin, forms.ModelForm): @@ -124,6 +128,7 @@ def __init__(self, *args, **kwargs): self.fields["links_file"].widget.attrs["class"] = "d-none" self.fields["links_file"].widget.attrs["accept"] = ".txt, .xlsx" + self.fields["date_validity_field"].widget.attrs["min"] = _now_date() def clean(self): if self.cleaned_data["date_validity_field"] is None: