schon/evibes/settings/base.py
Egor fureunoir Gorbunov 3ec0991aa6 Add slug field to Product and update related functionalities
Introduce a unique, auto-generated slug field to the Product model, populated from category, brand, and name. Update core filters, serializers, sitemaps, and GraphQL object types to support the new slug functionality. Also, enforce HTTP-only cookies for session, CSRF, and language for improved security.
2025-04-30 16:31:54 +03:00

306 lines
7.6 KiB
Python

from os import getenv
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent.parent
SECRET_KEY = getenv("SECRET_KEY")
DEBUG = bool(int(getenv("DEBUG")))
ALLOWED_HOSTS = ["*"] if DEBUG else getenv("ALLOWED_HOSTS").split(" ")
CSRF_TRUSTED_ORIGINS = getenv("CSRF_TRUSTED_ORIGINS").split(" ")
if DEBUG:
CORS_ALLOW_ALL_ORIGINS = True
else:
CORS_ALLOWED_ORIGINS = getenv("CORS_ALLOWED_ORIGINS").split(" ")
CORS_ALLOW_METHODS = (
"DELETE",
"GET",
"OPTIONS",
"PATCH",
"POST",
"PUT",
)
CORS_ALLOW_HEADERS = [
"accept",
"accept-encoding",
"accept-language",
"content-type",
"connection",
"user-agent",
"authorization",
"host",
"x-csrftoken",
"x-requested-with",
"x-evibes-auth",
"baggage",
"sentry-trace",
"dnt",
"sec-fetch-dest",
"sec-fetch-mode",
"sec-fetch-site",
"sec-gpc",
"origin",
"referer",
]
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
X_FRAME_OPTIONS = "SAMEORIGIN"
UNSAFE_CACHE_KEYS = []
SITE_ID = 1
INSTALLED_APPS = [
"django_daisy",
"modeltranslation",
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.sitemaps",
"django.contrib.gis",
"django.contrib.humanize",
"django_hosts",
"django_celery_beat",
"django_extensions",
"django_redis",
"widget_tweaks",
"constance",
"mptt",
"rest_framework",
"rest_framework_simplejwt",
"rest_framework_simplejwt.token_blacklist",
"drf_spectacular",
"drf_spectacular_sidecar",
"django_json_widget",
"django_elasticsearch_dsl",
"corsheaders",
"constance.backends.database",
"django_mailbox",
"graphene_django",
"cacheops",
"core",
"geo",
"payments",
"vibes_auth",
"blog",
]
MIDDLEWARE = [
"evibes.middleware.BlockInvalidHostMiddleware",
"django_hosts.middleware.HostsRequestMiddleware",
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"corsheaders.middleware.CorsMiddleware",
"evibes.middleware.CustomCommonMiddleware",
"evibes.middleware.CustomLocaleCommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"django.middleware.locale.LocaleMiddleware",
"django_hosts.middleware.HostsResponseMiddleware",
"djangorestframework_camel_case.middleware.CamelCaseMiddleWare",
]
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [
BASE_DIR / "vibes_auth/templates",
BASE_DIR / "core/templates",
BASE_DIR / "geo/templates",
BASE_DIR / "payments/templates",
],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
LANGUAGES = (
("en-GB", "English (British)"),
("ar-AR", "العربية"),
("cs-CZ", "Česky"),
("da-DK", "Dansk"),
("de-DE", "Deutsch"),
("en-US", "English (American)"),
("es-ES", "Español"),
("fr-FR", "Français"),
("hi-IN", "हिंदी"),
("it-IT", "Italiano"),
("ja-JP", "日本語"),
("kk-KZ", "Қазақ"),
("nl-NL", "Nederlands"),
("pl-PL", "Polska"),
("pt-BR", "Português"),
("ro-RO", "Română"),
("ru-RU", "Русский"),
("zh-hans", "简体中文"),
)
LANGUAGE_CODE = "en-GB"
CURRENCIES = (
("en-GB", "EUR"),
("ar-AR", "AED"),
("cs-CZ", "CZK"),
("da-DK", "EUR"),
("de-DE", "EUR"),
("en-US", "USD"),
("es-ES", "EUR"),
("fr-FR", "EUR"),
("hi-IN", "INR"),
("it-IT", "EUR"),
("ja-JP", "JPY"),
("kk-KZ", "KZT"),
("nl-NL", "EUR"),
("pl-PL", "PLN"),
("pt-BR", "EUR"),
("ro-RO", "RON"),
("ru-RU", "RUB"),
("zh-hans", "CNY"),
)
CURRENCY_CODE = dict(CURRENCIES).get(LANGUAGE_CODE)
MODELTRANSLATION_FALLBACK_LANGUAGES = (LANGUAGE_CODE, "en-US", "de-DE")
ROOT_URLCONF = "evibes.urls"
WSGI_APPLICATION = "evibes.wsgi.application"
ASGI_APPLICATION = "evibes.asgi.application"
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
TIME_ZONE = getenv("TIME_ZONE", "Europe/London")
STATIC_URL = f"https://api.{getenv('BASE_DOMAIN')}/static/"
STATIC_ROOT = BASE_DIR / "static"
MEDIA_URL = f"https://api.{getenv('BASE_DOMAIN')}/media/"
MEDIA_ROOT = BASE_DIR / "media"
AUTH_USER_MODEL = "vibes_auth.User"
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
APPEND_SLASH = True
ROOT_HOSTCONF = "evibes.hosts"
DEFAULT_HOST = "api"
REDIS_PASSWORD = getenv("REDIS_PASSWORD", default="")
INTERNAL_IPS = [
"127.0.0.1",
]
DAISY_SETTINGS = {
"SITE_LOGO": "/static/favicon.ico",
"EXTRA_STYLES": [],
"EXTRA_SCRIPTS": [],
"LOAD_FULL_STYLES": True,
"SHOW_CHANGELIST_FILTER": True,
"DONT_SUPPORT_ME": True,
"SIDEBAR_FOOTNOTE": "eVibes by Wiseless",
"APPS_REORDER": {
"django_celery_beat": {
"icon": "fa fa-solid fa-timeline",
"hide": False,
"app": "django_celery_beat",
"priority": 0,
"apps": "",
},
"django_mailbox": {
"icon": "fa fa-solid fa-envelope",
"hide": False,
"app": "django_mailbox",
"priority": 1,
"apps": "",
},
"geo": {
"icon": "fa fa-solid fa-globe",
"hide": False,
"app": "geo",
"priority": 2,
"apps": "",
},
"payments": {
"icon": "fa fa-solid fa-wallet",
"hide": False,
"app": "payments",
"priority": 3,
"apps": "",
},
"blog": {
"icon": "fa fa-solid fa-book",
"hide": False,
"app": "blog",
"priority": 4,
"apps": "",
},
"core": {
"icon": "fa fa-solid fa-house",
"hide": False,
"app": "core",
"priority": 5,
"apps": "",
},
"vibes_auth": {
"icon": "fa fa-solid fa-user",
"hide": False,
"app": "vibes_auth",
"priority": 6,
"apps": "",
},
},
}
if getenv("SENTRY_DSN"):
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
sentry_sdk.init(
dsn=getenv("SENTRY_DSN"),
traces_sample_rate=1.0,
profiles_sample_rate=1.0,
integrations=[DjangoIntegration()],
debug=False,
ignore_errors=[
"flower.views.error.NotFoundErrorHandler.get",
"django.http.response.Http404",
],
)
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True
LANGUAGE_COOKIE_HTTPONLY = True
DATA_UPLOAD_MAX_NUMBER_FIELDS = 8888