diff --git a/backend/.env.local b/backend/.env.local index 657f88f..e0f9789 100644 --- a/backend/.env.local +++ b/backend/.env.local @@ -28,4 +28,6 @@ REFRESH_TOKEN_LIFETIME = 5000 SMS_API_KEY = '' -VAPID_PRIVATE_KEY = 'NajogmGTsGsZ_dfURrjUpgsm5fui-s5AzruBQgMh_I4' \ No newline at end of file +VAPID_PRIVATE_KEY = 'NajogmGTsGsZ_dfURrjUpgsm5fui-s5AzruBQgMh_I4' + +OPENAI_API_KEY = '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' \ No newline at end of file diff --git a/backend/core/settings/base.py b/backend/core/settings/base.py index f310b99..96b8693 100644 --- a/backend/core/settings/base.py +++ b/backend/core/settings/base.py @@ -1,5 +1,4 @@ from dotenv import load_dotenv -# from http.cookiejar import debug from pathlib import Path from datetime import timedelta import os @@ -7,15 +6,21 @@ from django.templatetags.static import static from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ +# Load environment variables load_dotenv(".env.local") +# ============================================================================== +# General Configuration +# ============================================================================== DOMAIN = os.getenv("DOMAIN") API_DOMAIN = os.getenv("API_DOMAIN") -OPENAI_API_KEY = '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' -# TODO update telegram bot token -TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") -# TODO update email bullshit +# API Keys and Tokens +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") +TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") +VAPID_PRIVATE_KEY = os.getenv("VAPID_PRIVATE_KEY") + +# Email Configuration EMAIL_BACKEND = os.getenv("EMAIL_BACKEND") EMAIL_HOST = os.getenv("EMAIL_HOST") EMAIL_PORT = 587 @@ -24,17 +29,16 @@ EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER") EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") DEFAULT_FROM_EMAIL = os.getenv("SECRET_KEY") +# Security and Debugging SECRET_KEY = os.getenv("SECRET_KEY") DEBUG = True BASE_DIR = Path(__file__).resolve().parent.parent.parent - -VAPID_PRIVATE_KEY = os.getenv('VAPID_PRIVATE_KEY') - -# Application definition - +# ============================================================================== +# Application Definition +# ============================================================================== INSTALLED_APPS = [ - # unfold theme + # Unfold Theme "unfold", "unfold.contrib.filters", "unfold.contrib.forms", @@ -42,37 +46,158 @@ INSTALLED_APPS = [ "unfold.contrib.import_export", "unfold.contrib.guardian", "unfold.contrib.simple_history", - # django - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - # thired party apps - 'corsheaders', - 'rest_framework', - 'drf_spectacular', - 'django_cleanup.apps.CleanupConfig', - 'django_filters', - 'rest_framework_simplejwt', - 'rest_framework_simplejwt.token_blacklist', - 'rest_framework.authtoken', - 'import_export', + # Django Core + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + # Third-Party Apps + "corsheaders", + "rest_framework", + "drf_spectacular", + "django_cleanup.apps.CleanupConfig", + "django_filters", + "rest_framework_simplejwt", + "rest_framework_simplejwt.token_blacklist", + "rest_framework.authtoken", + "import_export", "django_jalali", - # custom apps - 'product', - 'account', - 'ticket', - 'chat', - 'order', - 'home', - 'blog', - + # Custom Apps + "product", + "account", + "ticket", + "chat", + "order", + "home", + "blog", ] +# ============================================================================== +# Middleware Configuration +# ============================================================================== +MIDDLEWARE = [ + "django.middleware.security.SecurityMiddleware", + "whitenoise.middleware.WhiteNoiseMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "corsheaders.middleware.CorsMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", +] + +ROOT_URLCONF = "core.urls" + +# ============================================================================== +# Template Configuration +# ============================================================================== +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [BASE_DIR / "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", + ], + }, + }, +] + +WSGI_APPLICATION = "core.wsgi.application" + +# ============================================================================== +# Authentication and Password Validation +# ============================================================================== +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", + }, +] + +LANGUAGE_CODE = "fa" +TIME_ZONE = "UTC" +USE_I18N = True +USE_L10N = True +USE_TZ = True + +# ============================================================================== +# Static Files Configuration +# ============================================================================== +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, "custom_static"), + BASE_DIR / "core" / "static", +] + + + + +STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" + +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +AUTH_USER_MODEL = "account.User" + +# ============================================================================== +# REST Framework Configuration +# ============================================================================== +REST_FRAMEWORK = { + # "DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"], + "DEFAULT_RENDERER_CLASSES": [ + "rest_framework.renderers.JSONRenderer", + "rest_framework.renderers.BrowsableAPIRenderer", + ], + "DEFAULT_AUTHENTICATION_CLASSES": ( + "rest_framework_simplejwt.authentication.JWTAuthentication", + ), + "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", + # "DEFAULT_PERMISSION_CLASSES": [ + # "rest_framework.permissions.IsAuthenticated", + # ], +} + +# ============================================================================== +# Simple JWT Configuration +# ============================================================================== +SIMPLE_JWT = { + "ACCESS_TOKEN_LIFETIME": timedelta(days=1), + "REFRESH_TOKEN_LIFETIME": timedelta(days=7), + "ROTATE_REFRESH_TOKENS": True, + "BLACKLIST_AFTER_ROTATION": True, +} + +# ============================================================================== +# Spectacular (API Documentation) Configuration +# ============================================================================== +SPECTACULAR_SETTINGS = { + "TITLE": os.getenv("SITE_TITLE"), + "DESCRIPTION": os.getenv("SITE_TITLE"), + "VERSION": "2.0.0", + "SERVE_INCLUDE_SCHEMA": False, + "COMPONENT_SPLIT_REQUEST": True, + "SWAGGER_UI_SETTINGS": { + "persistAuthorization": True, + }, +} + +# ============================================================================== +# Persian Datetime Configuration +# ============================================================================== JALALI_SETTINGS = { - # JavaScript static files for the admin Jalali date widget "ADMIN_JS_STATIC_FILES": [ "admin/jquery.ui.datepicker.jalali/scripts/jquery-1.10.2.min.js", "admin/jquery.ui.datepicker.jalali/scripts/jquery.ui.core.js", @@ -81,126 +206,10 @@ JALALI_SETTINGS = { "admin/jquery.ui.datepicker.jalali/scripts/jquery.ui.datepicker-cc-fa.js", "admin/main.js", ], - # CSS static files for the admin Jalali date widget "ADMIN_CSS_STATIC_FILES": { "all": [ "admin/jquery.ui.datepicker.jalali/themes/base/jquery-ui.min.css", "admin/css/main.css", ] }, -} - - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - "whitenoise.middleware.WhiteNoiseMiddleware", - 'django.contrib.sessions.middleware.SessionMiddleware', - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'core.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [BASE_DIR / "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', - ], - }, - }, -] - -WSGI_APPLICATION = 'core.wsgi.application' - - -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', - }, -] - -LANGUAGE_CODE = 'fa' - -TIME_ZONE = 'UTC' - -USE_I18N = True -USE_L10N = True -USE_TZ = True - - - -STATICFILES_DIRS = [ - os.path.join(BASE_DIR, 'custom_static'), - BASE_DIR / "core" / "static" -] - -STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -AUTH_USER_MODEL = 'account.User' - - -REST_FRAMEWORK = { - # 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], - 'DEFAULT_RENDERER_CLASSES': [ - 'rest_framework.renderers.JSONRenderer', - 'rest_framework.renderers.BrowsableAPIRenderer', - - ], - 'DEFAULT_AUTHENTICATION_CLASSES': ( - - 'rest_framework_simplejwt.authentication.JWTAuthentication', - - ), - 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', - # 'DEFAULT_PERMISSION_CLASSES': [ - # 'rest_framework.permissions.IsAuthenticated', - # ], -} - -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': timedelta(days=1), - 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), - 'ROTATE_REFRESH_TOKENS': True, - 'BLACKLIST_AFTER_ROTATION': True, -} - -SPECTACULAR_SETTINGS = { - 'TITLE': os.getenv("SITE_TITLE"), - 'DESCRIPTION': os.getenv("SITE_TITLE"), - 'VERSION': '2.0.0', - 'SERVE_INCLUDE_SCHEMA': False, - 'COMPONENT_SPLIT_REQUEST': True, - "SWAGGER_UI_SETTINGS": { - "persistAuthorization": True - } -} - - - - -def environment_callback(request): - return ["نسخه ی توسعه", "success"] - - +} \ No newline at end of file diff --git a/backend/core/settings/production.py b/backend/core/settings/production.py index 4ce04ef..2a5497f 100644 --- a/backend/core/settings/production.py +++ b/backend/core/settings/production.py @@ -1,5 +1,7 @@ from .base import * from .unfold_conf import * + + ALLOWED_HOSTS = ['127.0.0.1', 'localhost', DOMAIN, API_DOMAIN] CSRF_TRUSTED_ORIGINS = [ f"https://{DOMAIN}", diff --git a/backend/core/settings/unfold_conf.py b/backend/core/settings/unfold_conf.py index a4ad30f..045106b 100644 --- a/backend/core/settings/unfold_conf.py +++ b/backend/core/settings/unfold_conf.py @@ -264,4 +264,7 @@ UNFOLD = { ], }, -} \ No newline at end of file +} + +def environment_callback(request): + return ["نسخه ی توسعه", "success"] \ No newline at end of file