converter
This commit is contained in:
@@ -17,18 +17,23 @@ from django.core.management.utils import get_random_secret_key
|
||||
from django.db import OperationalError, connections
|
||||
|
||||
from datetime import timedelta
|
||||
import json
|
||||
|
||||
from dotenv import load_dotenv
|
||||
load_dotenv() # Pouze načte proměnné lokálně, pokud nejsou dostupné
|
||||
|
||||
# Robust boolean parser and SSL flag
|
||||
def _env_bool(key: str, default: bool = False) -> bool:
|
||||
return os.getenv(key, str(default)).strip().lower() in ("true", "1", "yes", "on")
|
||||
|
||||
USE_SSL = _env_bool("SSL", False)
|
||||
|
||||
#---------------- ENV VARIABLES USECASE--------------
|
||||
# v jiné app si to importneš skrz: from django.conf import settings
|
||||
# a použiješ takto: settings.FRONTEND_URL
|
||||
|
||||
FRONTEND_URL = os.getenv("FRONTEND_URL", "http://localhost:3000")
|
||||
FRONTEND_URL_DEV = os.getenv("FRONTEND_URL_DEV", "http://localhost:5173")
|
||||
print(f"FRONTEND_URL: {FRONTEND_URL}\nFRONTEND_URL_DEV: {FRONTEND_URL_DEV}\n")
|
||||
|
||||
FRONTEND_URL = os.getenv("FRONTEND_URL", "http://localhost:9000")
|
||||
print(f"FRONTEND_URL: {FRONTEND_URL}\n")
|
||||
#-------------------------BASE ⚙️------------------------
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
@@ -153,62 +158,96 @@ AUTHENTICATION_BACKENDS = [
|
||||
|
||||
ALLOWED_HOSTS = ["*"]
|
||||
|
||||
from urllib.parse import urlparse
|
||||
parsed = urlparse(FRONTEND_URL)
|
||||
|
||||
CSRF_TRUSTED_ORIGINS = [
|
||||
'https://domena.cz',
|
||||
"https://www.domena.cz",
|
||||
"http://localhost:3000", #react docker
|
||||
"http://localhost:5173" #react dev
|
||||
f"{parsed.scheme}://{parsed.hostname}:{parsed.port or (443 if parsed.scheme=='https' else 80)}",
|
||||
|
||||
"http://192.168.67.98",
|
||||
"https://itsolutions.vontor.cz",
|
||||
"https://react.vontor.cz",
|
||||
|
||||
"http://localhost:5173",
|
||||
"http://localhost:3000",
|
||||
"http://localhost:9000",
|
||||
|
||||
"http://127.0.0.1:5173",
|
||||
"http://127.0.0.1:3000",
|
||||
"http://127.0.0.1:9000",
|
||||
|
||||
# server
|
||||
"http://192.168.67.98",
|
||||
"https://itsolutions.vontor.cz",
|
||||
"https://react.vontor.cz",
|
||||
|
||||
# nginx docker (local)
|
||||
"http://localhost",
|
||||
"http://localhost:80",
|
||||
"http://127.0.0.1",
|
||||
]
|
||||
|
||||
if DEBUG:
|
||||
CORS_ALLOWED_ORIGINS = [
|
||||
"http://localhost:5173",
|
||||
"http://localhost:3000",
|
||||
]
|
||||
CORS_ALLOWED_ORIGINS = [
|
||||
f"{parsed.scheme}://{parsed.hostname}:{parsed.port or (443 if parsed.scheme=='https' else 80)}",
|
||||
|
||||
"http://localhost:5173",
|
||||
"http://localhost:3000",
|
||||
"http://127.0.0.1:5173",
|
||||
"http://127.0.0.1:3000",
|
||||
"http://localhost:9000",
|
||||
"http://127.0.0.1:9000",
|
||||
|
||||
# server
|
||||
"http://192.168.67.98",
|
||||
"https://itsolutions.vontor.cz",
|
||||
"https://react.vontor.cz",
|
||||
|
||||
# nginx docker (local)
|
||||
"http://localhost",
|
||||
"http://localhost:80",
|
||||
"http://127.0.0.1",
|
||||
]
|
||||
else:
|
||||
CORS_ALLOWED_ORIGINS = [
|
||||
"https://www.domena.cz",
|
||||
]
|
||||
CORS_ALLOWED_ORIGINS = [
|
||||
"http://192.168.67.98",
|
||||
"https://itsolutions.vontor.cz",
|
||||
"https://react.vontor.cz",
|
||||
|
||||
"http://localhost:9000",
|
||||
"http://127.0.0.1:9000",
|
||||
]
|
||||
|
||||
CORS_ALLOW_CREDENTIALS = True
|
||||
CORS_ALLOW_ALL_ORIGINS = False # Tohle musí být false, když používáš credentials
|
||||
|
||||
# Use Lax for http (local), None only when HTTPS is enabled
|
||||
SESSION_COOKIE_SAMESITE = "None" if USE_SSL else "Lax"
|
||||
CSRF_COOKIE_SAMESITE = "None" if USE_SSL else "Lax"
|
||||
|
||||
print("CORS_ALLOWED_ORIGINS =", CORS_ALLOWED_ORIGINS)
|
||||
print("CSRF_TRUSTED_ORIGINS =", CSRF_TRUSTED_ORIGINS)
|
||||
print("ALLOWED_HOSTS =", ALLOWED_HOSTS)
|
||||
|
||||
|
||||
|
||||
#--------------------------------END CORS + HOSTs 🌐🔐---------------------------------
|
||||
|
||||
|
||||
#--------------------------------------SSL 🧾------------------------------------
|
||||
|
||||
if os.getenv("SSL", "") == "True":
|
||||
USE_SSL = True
|
||||
else:
|
||||
USE_SSL = False
|
||||
|
||||
|
||||
if USE_SSL is True:
|
||||
print("SSL turned on!")
|
||||
SESSION_COOKIE_SECURE = True
|
||||
CSRF_COOKIE_SECURE = True
|
||||
SECURE_SSL_REDIRECT = True
|
||||
SECURE_BROWSER_XSS_FILTER = True
|
||||
SECURE_CONTENT_TYPE_NOSNIFF = True
|
||||
USE_X_FORWARDED_HOST = True
|
||||
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||
print("SSL turned on!")
|
||||
SESSION_COOKIE_SECURE = True
|
||||
CSRF_COOKIE_SECURE = True
|
||||
SECURE_SSL_REDIRECT = True
|
||||
SECURE_BROWSER_XSS_FILTER = True
|
||||
SECURE_CONTENT_TYPE_NOSNIFF = True
|
||||
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||
else:
|
||||
SESSION_COOKIE_SECURE = False
|
||||
CSRF_COOKIE_SECURE = False
|
||||
SECURE_SSL_REDIRECT = False
|
||||
SECURE_BROWSER_XSS_FILTER = False
|
||||
SECURE_CONTENT_TYPE_NOSNIFF = False
|
||||
USE_X_FORWARDED_HOST = False
|
||||
|
||||
SESSION_COOKIE_SECURE = False
|
||||
CSRF_COOKIE_SECURE = False
|
||||
SECURE_SSL_REDIRECT = False
|
||||
SECURE_BROWSER_XSS_FILTER = False
|
||||
SECURE_CONTENT_TYPE_NOSNIFF = False
|
||||
print(f"\nUsing SSL: {USE_SSL}\n")
|
||||
|
||||
#--------------------------------END-SSL 🧾---------------------------------
|
||||
|
||||
|
||||
@@ -218,59 +257,67 @@ print(f"\nUsing SSL: {USE_SSL}\n")
|
||||
#-------------------------------------REST FRAMEWORK 🛠️------------------------------------
|
||||
|
||||
# ⬇️ Základní lifetime konfigurace
|
||||
ACCESS_TOKEN_LIFETIME = timedelta(minutes=15)
|
||||
REFRESH_TOKEN_LIFETIME = timedelta(days=1)
|
||||
ACCESS_TOKEN_LIFETIME = timedelta(minutes=60)
|
||||
REFRESH_TOKEN_LIFETIME = timedelta(days=5)
|
||||
|
||||
# ⬇️ Nastavení SIMPLE_JWT podle režimu
|
||||
if DEBUG:
|
||||
SIMPLE_JWT = {
|
||||
"ACCESS_TOKEN_LIFETIME": ACCESS_TOKEN_LIFETIME,
|
||||
"REFRESH_TOKEN_LIFETIME": REFRESH_TOKEN_LIFETIME,
|
||||
SIMPLE_JWT = {
|
||||
"ACCESS_TOKEN_LIFETIME": ACCESS_TOKEN_LIFETIME,
|
||||
"REFRESH_TOKEN_LIFETIME": REFRESH_TOKEN_LIFETIME,
|
||||
|
||||
"AUTH_COOKIE": "access_token",
|
||||
"AUTH_COOKIE_SECURE": False, # není HTTPS
|
||||
"AUTH_COOKIE_HTTP_ONLY": True,
|
||||
"AUTH_COOKIE_PATH": "/",
|
||||
"AUTH_COOKIE_SAMESITE": "Lax", # není cross-site
|
||||
"AUTH_COOKIE": "access_token",
|
||||
"AUTH_COOKIE_REFRESH": "refresh_token",
|
||||
|
||||
"ROTATE_REFRESH_TOKENS": True,
|
||||
"BLACKLIST_AFTER_ROTATION": True,
|
||||
}
|
||||
"AUTH_COOKIE_DOMAIN": None,
|
||||
"AUTH_COOKIE_SECURE": False,
|
||||
"AUTH_COOKIE_HTTP_ONLY": True,
|
||||
"AUTH_COOKIE_PATH": "/",
|
||||
"AUTH_COOKIE_SAMESITE": "Lax",
|
||||
|
||||
"ROTATE_REFRESH_TOKENS": False,
|
||||
"BLACKLIST_AFTER_ROTATION": False,
|
||||
}
|
||||
else:
|
||||
SIMPLE_JWT = {
|
||||
"ACCESS_TOKEN_LIFETIME": ACCESS_TOKEN_LIFETIME,
|
||||
"REFRESH_TOKEN_LIFETIME": REFRESH_TOKEN_LIFETIME,
|
||||
SIMPLE_JWT = {
|
||||
"ACCESS_TOKEN_LIFETIME": ACCESS_TOKEN_LIFETIME,
|
||||
"REFRESH_TOKEN_LIFETIME": REFRESH_TOKEN_LIFETIME,
|
||||
|
||||
"AUTH_COOKIE": "access_token",
|
||||
"AUTH_COOKIE_SECURE": True, # HTTPS only
|
||||
"AUTH_COOKIE_HTTP_ONLY": True,
|
||||
"AUTH_COOKIE_PATH": "/",
|
||||
"AUTH_COOKIE_SAMESITE": "None", # potřebné pro cross-origin
|
||||
"AUTH_COOKIE": "access_token",
|
||||
"AUTH_COOKIE_REFRESH": "refresh_token",
|
||||
"AUTH_COOKIE_DOMAIN": None,
|
||||
|
||||
"ROTATE_REFRESH_TOKENS": True,
|
||||
"BLACKLIST_AFTER_ROTATION": True,
|
||||
}
|
||||
# Secure/SameSite based on HTTPS availability
|
||||
"AUTH_COOKIE_SECURE": USE_SSL,
|
||||
"AUTH_COOKIE_HTTP_ONLY": True,
|
||||
"AUTH_COOKIE_PATH": "/",
|
||||
"AUTH_COOKIE_SAMESITE": "None" if USE_SSL else "Lax",
|
||||
|
||||
"ROTATE_REFRESH_TOKENS": True,
|
||||
"BLACKLIST_AFTER_ROTATION": True,
|
||||
}
|
||||
|
||||
REST_FRAMEWORK = {
|
||||
"DATETIME_FORMAT": "%Y-%m-%d %H:%M", # Pavel
|
||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||
'account.tokens.CookieJWTAuthentication',
|
||||
'rest_framework.authentication.SessionAuthentication',
|
||||
),
|
||||
'DEFAULT_PERMISSION_CLASSES': (
|
||||
'rest_framework.permissions.AllowAny',
|
||||
),
|
||||
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
|
||||
"DATETIME_FORMAT": "%Y-%m-%d %H:%M", # Pavel
|
||||
'DEFAULT_AUTHENTICATION_CLASSES': (
|
||||
# In DEBUG keep Session + JWT + your cookie class for convenience
|
||||
'rest_framework.authentication.SessionAuthentication',
|
||||
'rest_framework_simplejwt.authentication.JWTAuthentication',
|
||||
'account.tokens.CookieJWTAuthentication',
|
||||
) if DEBUG else (
|
||||
'account.tokens.CookieJWTAuthentication',
|
||||
),
|
||||
'DEFAULT_PERMISSION_CLASSES': (
|
||||
'rest_framework.permissions.AllowAny',
|
||||
),
|
||||
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
|
||||
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
|
||||
|
||||
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
|
||||
|
||||
'DEFAULT_THROTTLE_RATES': {
|
||||
'anon': '100/hour', # unauthenticated
|
||||
'user': '2000/hour', # authenticated
|
||||
}
|
||||
'DEFAULT_THROTTLE_RATES': {
|
||||
'anon': '100/hour', # unauthenticated
|
||||
'user': '2000/hour', # authenticated
|
||||
}
|
||||
}
|
||||
|
||||
#--------------------------------END REST FRAMEWORK 🛠️-------------------------------------
|
||||
|
||||
|
||||
@@ -340,23 +387,17 @@ INSTALLED_APPS = INSTALLED_APPS[:-1] + MY_CREATED_APPS + INSTALLED_APPS[-1:]
|
||||
# Middleware is a framework of hooks into Django's request/response processing.
|
||||
|
||||
MIDDLEWARE = [
|
||||
# Middleware that allows your backend to accept requests from other domains (CORS)
|
||||
"corsheaders.middleware.CorsMiddleware",
|
||||
"django.middleware.common.CommonMiddleware",
|
||||
"corsheaders.middleware.CorsMiddleware",
|
||||
"django.middleware.common.CommonMiddleware",
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
|
||||
'whitenoise.middleware.WhiteNoiseMiddleware',
|
||||
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
|
||||
#CUSTOM
|
||||
#'tools.middleware.CustomMaxUploadSizeMiddleware',
|
||||
|
||||
|
||||
'whitenoise.middleware.WhiteNoiseMiddleware',# díky tomu funguje načítaní static files
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
#--------------------------------END MIDDLEWARE 🧩---------------------------------
|
||||
@@ -410,56 +451,42 @@ else:
|
||||
#--------------------------------END CACHE + CHANNELS(ws) 📡🗄️---------------------------------
|
||||
|
||||
#-------------------------------------CELERY 📅------------------------------------
|
||||
|
||||
# CELERY_BROKER_URL = 'redis://localhost:6379/0'
|
||||
CELERY_BROKER_URL = os.getenv("CELERY_BROKER_URL")
|
||||
CELERY_RESULT_BACKEND = os.getenv("CELERY_RESULT_BACKEND")
|
||||
# Control via env; default False in DEBUG, True otherwise
|
||||
CELERY_ENABLED = _env_bool("CELERY_ENABLED", default=not DEBUG)
|
||||
|
||||
if DEBUG:
|
||||
CELERY_ENABLED = False
|
||||
|
||||
try:
|
||||
import redis
|
||||
# test connection
|
||||
r = redis.Redis(host='localhost', port=6379, db=0)
|
||||
r.ping()
|
||||
import redis
|
||||
r = redis.Redis(host='localhost', port=6379, db=0)
|
||||
r.ping()
|
||||
except Exception:
|
||||
CELERY_BROKER_URL = 'memory://'
|
||||
CELERY_BROKER_URL = 'memory://'
|
||||
CELERY_ENABLED = False
|
||||
|
||||
CELERY_ACCEPT_CONTENT = os.getenv("CELERY_ACCEPT_CONTENT")
|
||||
CELERY_TASK_SERIALIZER = os.getenv("CELERY_TASK_SERIALIZER")
|
||||
CELERY_TIMEZONE = os.getenv("CELERY_TIMEZONE")
|
||||
def _env_list(key: str, default: list[str]) -> list[str]:
|
||||
v = os.getenv(key)
|
||||
if not v:
|
||||
return default
|
||||
try:
|
||||
parsed = json.loads(v)
|
||||
if isinstance(parsed, (list, tuple)):
|
||||
return list(parsed)
|
||||
if isinstance(parsed, str):
|
||||
return [parsed]
|
||||
except Exception:
|
||||
pass
|
||||
return [s.strip(" '\"") for s in v.strip("[]()").split(",") if s.strip()]
|
||||
|
||||
CELERY_ACCEPT_CONTENT = _env_list("CELERY_ACCEPT_CONTENT", ["json"])
|
||||
CELERY_RESULT_ACCEPT_CONTENT = _env_list("CELERY_RESULT_ACCEPT_CONTENT", ["json"])
|
||||
CELERY_TASK_SERIALIZER = os.getenv("CELERY_TASK_SERIALIZER", "json")
|
||||
CELERY_RESULT_SERIALIZER = os.getenv("CELERY_RESULT_SERIALIZER", "json")
|
||||
CELERY_TIMEZONE = os.getenv("CELERY_TIMEZONE", TIME_ZONE)
|
||||
CELERY_BEAT_SCHEDULER = os.getenv("CELERY_BEAT_SCHEDULER")
|
||||
# if DEBUG:
|
||||
# CELERY_BROKER_URL = 'redis://localhost:6379/0'
|
||||
# try:
|
||||
# import redis
|
||||
# # test connection
|
||||
# r = redis.Redis(host='localhost', port=6379, db=0)
|
||||
# r.ping()
|
||||
# except Exception:
|
||||
# CELERY_BROKER_URL = 'memory://'
|
||||
|
||||
# CELERY_ACCEPT_CONTENT = ['json']
|
||||
# CELERY_TASK_SERIALIZER = 'json'
|
||||
# CELERY_TIMEZONE = 'Europe/Prague'
|
||||
|
||||
# CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
|
||||
|
||||
# from celery.schedules import crontab
|
||||
|
||||
# CELERY_BEAT_SCHEDULE = {
|
||||
# 'hard_delete_soft_deleted_monthly': {
|
||||
# 'task': 'vontor_cz.tasks.hard_delete_soft_deleted_records',
|
||||
# 'schedule': crontab(minute=0, hour=0, day_of_month=1), # každý první den v měsíci o půlnoci
|
||||
# },
|
||||
# 'delete_old_reservations_monthly': {
|
||||
# 'task': 'account.tasks.delete_old_reservations',
|
||||
# 'schedule': crontab(minute=0, hour=1, day_of_month=1), # každý první den v měsíci v 1:00 ráno
|
||||
# },
|
||||
# }
|
||||
# else:
|
||||
# # Nebo nastav dummy broker, aby se úlohy neodesílaly
|
||||
# CELERY_BROKER_URL = 'memory://' # broker v paměti, pro testování bez Redis
|
||||
|
||||
#-------------------------------------END CELERY 📅------------------------------------
|
||||
|
||||
|
||||
@@ -471,66 +498,57 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||
# říka že se úkladá do databáze, místo do cookie
|
||||
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
|
||||
|
||||
USE_PRODUCTION_DB = os.getenv("USE_PRODUCTION_DB", "False") == "True"
|
||||
USE_DOCKER_DB = os.getenv("USE_DOCKER_DB", "False") in ["True", "true", "1", True]
|
||||
|
||||
if USE_PRODUCTION_DB is False:
|
||||
# DEVELOPMENT
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3', # Database engine
|
||||
'NAME': BASE_DIR / 'db.sqlite3', # Path to the SQLite database file
|
||||
}
|
||||
}
|
||||
if USE_DOCKER_DB is False:
|
||||
# DEV
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': BASE_DIR / 'db.sqlite3',
|
||||
}
|
||||
}
|
||||
else:
|
||||
#PRODUCTION
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': os.getenv('DATABASE_ENGINE'),
|
||||
'NAME': os.getenv('DATABASE_NAME'),
|
||||
'USER': os.getenv('DATABASE_USER'),
|
||||
'PASSWORD': os.getenv('DATABASE_PASSWORD'),
|
||||
'HOST': os.getenv('DATABASE_HOST', "localhost"),
|
||||
'PORT': os.getenv('DATABASE_PORT'),
|
||||
}
|
||||
}
|
||||
# DOCKER/POSTGRES
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': os.getenv('DATABASE_ENGINE'),
|
||||
'NAME': os.getenv('POSTGRES_DB'),
|
||||
'USER': os.getenv('POSTGRES_USER'),
|
||||
'PASSWORD': os.getenv('POSTGRES_PASSWORD'),
|
||||
'HOST': os.getenv('DATABASE_HOST'),
|
||||
'PORT': os.getenv('DATABASE_PORT'),
|
||||
}
|
||||
}
|
||||
|
||||
print(f"\nUsing Docker DB: {USE_DOCKER_DB}\nDatabase settings: {DATABASES}\n")
|
||||
AUTH_USER_MODEL = 'account.CustomUser' #class CustomUser(AbstractUser) best practice to use AbstractUser
|
||||
|
||||
#--------------------------------END DATABASE 💾---------------------------------
|
||||
|
||||
#--------------------------------------PAGE SETTINGS -------------------------------------
|
||||
CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'
|
||||
|
||||
# Configuration for Constance(variables)
|
||||
CONSTANCE_CONFIG = {
|
||||
'BITCOIN_WALLET': ('', 'Public BTC wallet address'),
|
||||
'SUPPORT_EMAIL': ('admin@example.com', 'Support email'),
|
||||
}
|
||||
|
||||
#--------------------------------------EMAIL 📧--------------------------------------
|
||||
|
||||
if DEBUG:
|
||||
# DEVELOPMENT
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' # Use console backend for development
|
||||
# EMAILY SE BUDOU POSÍLAT DO KONZOLE!!!
|
||||
else:
|
||||
# PRODUCTION
|
||||
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
|
||||
EMAIL_BACKEND = os.getenv(
|
||||
"EMAIL_BACKEND",
|
||||
'django.core.mail.backends.console.EmailBackend' if DEBUG else 'django.core.mail.backends.smtp.EmailBackend'
|
||||
)
|
||||
|
||||
EMAIL_HOST = os.getenv("EMAIL_HOST_DEV")
|
||||
EMAIL_PORT = int(os.getenv("EMAIL_PORT_DEV", 465))
|
||||
EMAIL_USE_TLS = True # ❌ Keep this OFF when using SSL
|
||||
EMAIL_USE_SSL = False # ✅ Must be True for port 465
|
||||
EMAIL_HOST_USER = os.getenv("EMAIL_USER_DEV")
|
||||
EMAIL_HOST_PASSWORD = os.getenv("EMAIL_USER_PASSWORD_DEV")
|
||||
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
|
||||
EMAIL_TIMEOUT = 10
|
||||
|
||||
print("---------EMAIL----------\nEMAIL_HOST =", os.getenv("EMAIL_HOST_DEV"))
|
||||
print("EMAIL_PORT =", os.getenv("EMAIL_PORT_DEV"))
|
||||
print("EMAIL_USER =", os.getenv("EMAIL_USER_DEV"))
|
||||
print("EMAIL_USER_PASSWORD =", os.getenv("EMAIL_USER_PASSWORD_DEV"), "\n------------------------")
|
||||
EMAIL_HOST = os.getenv("EMAIL_HOST")
|
||||
EMAIL_PORT = int(os.getenv("EMAIL_PORT", 465))
|
||||
EMAIL_USE_TLS = os.getenv("EMAIL_USE_TLS", "False") in ["True", "true", "1", True]
|
||||
EMAIL_USE_SSL = os.getenv("EMAIL_USE_SSL", "True") in ["True", "true", "1", True]
|
||||
EMAIL_HOST_USER = os.getenv("EMAIL_USER")
|
||||
EMAIL_HOST_PASSWORD = os.getenv("EMAIL_USER_PASSWORD")
|
||||
DEFAULT_FROM_EMAIL = os.getenv("DEFAULT_FROM_EMAIL", EMAIL_HOST_USER)
|
||||
EMAIL_TIMEOUT = 30 # seconds
|
||||
|
||||
print("---------EMAIL----------")
|
||||
print("EMAIL_HOST =", EMAIL_HOST)
|
||||
print("EMAIL_PORT =", EMAIL_PORT)
|
||||
print("EMAIL_USE_TLS =", EMAIL_USE_TLS)
|
||||
print("EMAIL_USE_SSL =", EMAIL_USE_SSL)
|
||||
print("EMAIL_USER =", EMAIL_HOST_USER)
|
||||
print("------------------------")
|
||||
#----------------------------------EMAIL END 📧-------------------------------------
|
||||
|
||||
|
||||
@@ -579,66 +597,59 @@ else:
|
||||
print(f"\n-------------- USE_AWS: {USE_AWS} --------------")
|
||||
|
||||
if USE_AWS is False:
|
||||
# DEVELOPMENT
|
||||
# Development: Use local file system storage for static files
|
||||
STORAGES = {
|
||||
"default": {
|
||||
"BACKEND": "django.core.files.storage.FileSystemStorage",
|
||||
},
|
||||
"staticfiles": {
|
||||
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
|
||||
},
|
||||
}
|
||||
|
||||
# Media and Static URL for local dev
|
||||
MEDIA_URL = os.getenv("MEDIA_URL", "/media/")
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||
|
||||
# Development: Use local file system storage for static files
|
||||
STORAGES = {
|
||||
"default": {
|
||||
"BACKEND": "django.core.files.storage.FileSystemStorage",
|
||||
},
|
||||
"staticfiles": {
|
||||
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
|
||||
},
|
||||
}
|
||||
|
||||
# Media and Static URL for local dev
|
||||
MEDIA_URL = '/media/'
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# Local folder for collected static files
|
||||
STATIC_ROOT = BASE_DIR / 'collectedstaticfiles'
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
STATIC_ROOT = BASE_DIR / 'collectedstaticfiles'
|
||||
elif USE_AWS:
|
||||
# PRODUCTION
|
||||
# PRODUCTION
|
||||
|
||||
AWS_LOCATION = "static"
|
||||
AWS_LOCATION = "static"
|
||||
|
||||
# Production: Use S3 storage
|
||||
STORAGES = {
|
||||
"default": {
|
||||
"BACKEND" : "storages.backends.s3boto3.S3StaticStorage",
|
||||
},
|
||||
# Production: Use S3 storage
|
||||
STORAGES = {
|
||||
"default": {
|
||||
"BACKEND" : "storages.backends.s3boto3.S3StaticStorage",
|
||||
},
|
||||
|
||||
"staticfiles": {
|
||||
"BACKEND" : "storages.backends.s3boto3.S3StaticStorage",
|
||||
},
|
||||
}
|
||||
"staticfiles": {
|
||||
"BACKEND" : "storages.backends.s3boto3.S3StaticStorage",
|
||||
},
|
||||
}
|
||||
|
||||
# Media and Static URL for AWS S3
|
||||
MEDIA_URL = f'https://{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.amazonaws.com/media/'
|
||||
STATIC_URL = f'https://{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.amazonaws.com/static/'
|
||||
# Media and Static URL for AWS S3
|
||||
MEDIA_URL = f'https://{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.amazonaws.com/media/'
|
||||
STATIC_URL = f'https://{os.getenv("AWS_STORAGE_BUCKET_NAME")}.s3.amazonaws.com/static/'
|
||||
|
||||
CSRF_TRUSTED_ORIGINS.append(STATIC_URL)
|
||||
CSRF_TRUSTED_ORIGINS.append(STATIC_URL)
|
||||
|
||||
# Static files should be collected to a local directory and then uploaded to S3
|
||||
STATIC_ROOT = BASE_DIR / 'collectedstaticfiles'
|
||||
# Static files should be collected to a local directory and then uploaded to S3
|
||||
STATIC_ROOT = BASE_DIR / 'collectedstaticfiles'
|
||||
|
||||
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
|
||||
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
|
||||
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
|
||||
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME', 'us-east-1') # Default to 'us-east-1' if not set
|
||||
AWS_S3_SIGNATURE_VERSION = 's3v4' # Use AWS Signature Version 4
|
||||
AWS_S3_USE_SSL = True
|
||||
AWS_S3_FILE_OVERWRITE = True
|
||||
AWS_DEFAULT_ACL = None # Set to None to avoid setting a default ACL
|
||||
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
|
||||
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
|
||||
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
|
||||
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME', 'us-east-1') # Default to 'us-east-1' if not set
|
||||
AWS_S3_SIGNATURE_VERSION = 's3v4' # Use AWS Signature Version 4
|
||||
AWS_S3_USE_SSL = True
|
||||
AWS_S3_FILE_OVERWRITE = True
|
||||
AWS_DEFAULT_ACL = None # Set to None to avoid setting a default ACL
|
||||
|
||||
|
||||
|
||||
print(f"Static url: {STATIC_URL}\nStatic storage: {STORAGES}\n----------------------------")
|
||||
|
||||
#--------------------------------END: MEDIA + STATIC 🖼️, AWS ☁️---------------------------------
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user