""" Django settings for Rasaddam_Backend project. Generated by 'django-admin startproject' using Django 5.2. For more information on this file, see https://docs.djangoproject.com/en/5.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.2/ref/settings/ """ import os.path from datetime import timedelta from pathlib import Path import sentry_sdk from django.conf import settings # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-@0apn-lk85pfw=z00x2ib$w9#rwz8%2v4i_n^^9jz-m9b+y55*' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True sentry_sdk.init( dsn="https://e8d8ff4f1bf729370af00b7775be441c@o4509597964697600.ingest.us.sentry.io/4509597966073856", # Add data like request headers and IP for users, # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info send_default_pii=True, # Set traces_sample_rate to 1.0 to capture 100% # of transactions for tracing. traces_sample_rate=1.0, # Set profile_session_sample_rate to 1.0 to profile 100% # of profile sessions. profile_session_sample_rate=1.0, # Set profile_lifecycle to "trace" to automatically # run the profiler on when there is an active transaction profile_lifecycle="trace", ) ALLOWED_HOSTS = [ 'localhost', '127.0.0.1', 'https://rasadyar.net/', 'https://localhost:9200', 'https://api.rasadyaar.net', 'https://api.dam.rasadyaar.net', 'https://dam.rasadyar.net' 'http://localhost:3000', 'http://192.168.88.130:3000', 'https://rasaddam-front.liara.run' ] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django_elasticsearch_dsl', 'django_elasticsearch_dsl_drf', 'rest_framework', "corsheaders", 'rest_framework_simplejwt', 'rest_framework_simplejwt.token_blacklist', 'apps.authentication.apps.AuthenticationConfig', 'apps.authorization.apps.AuthorizationConfig', 'apps.captcha_app.apps.CaptchaAppConfig', 'apps.core.apps.CoreConfig', 'apps.herd.apps.HerdAppConfig', 'apps.livestock.apps.LivestockConfig', 'apps.pos_device.apps.PosDeviceConfig', 'apps.tag.apps.TagConfig', 'apps.warehouse.apps.WarehouseConfig', 'apps.search.apps.SearchConfig', 'apps.log.apps.LogConfig', 'apps.product.apps.ProductConfig', 'rest_captcha', 'captcha', 'drf_yasg', "django_celery_results", "django_celery_beat", ] MIDDLEWARE = [ "corsheaders.middleware.CorsMiddleware", 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'apps.authentication.middlewares.BlockedTokenMiddleware', 'crum.CurrentRequestUserMiddleware', 'apps.log.middlewares.SaveLog' ] ROOT_URLCONF = 'Rasaddam_Backend.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'Rasaddam_Backend.wsgi.application' # Database # https://docs.djangoproject.com/en/5.2/ref/settings/#databases MONGODB_DATABASES = { "default": { "name": 'mongodb', "host": "", "tz_aware": True, # if you using timezones in django (USE_TZ = True) # noqa }, } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': "postgres", 'HOST': "monte-rosa.liara.cloud", 'USER': "root", 'PASSWORD': "aFC3hqbxxR0SeBPZ6TCZ37my", 'PORT': '32718' }, } AUTH_USER_MODEL = 'authentication.User' SWAGGER_SETTINGS = { 'SECURITY_DEFINITIONS': { "bearer": { "type": "apiKey", "name": "Authorization", "in": "header", "description": 'JWT Authorization header using the Bearer scheme. Example: "Authorization: Bearer "', }, 'basic': { # <<-- is for djagno authentication 'type': 'basic' }, }, 'USE_SESSION_AUTH': False, "DEFAULT_AUTO_SCHEMA_CLASS": "drf_yasg.inspectors.SwaggerAutoSchema" } CELERY_BROKER_URL = "redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0" # Requires Redis server accept_content = ["application/json"] result_serializer = "json" task_serializer = "json" timezone = "UTC" CELERY_RESULT_BACKEND = "redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0" CELERY_CACHE_BACKEND = 'default' # Celery Beat settings CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler" LOGIN_URL = 'rest_framework:login' LOGOUT_URL = 'rest_framework:logout' REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), 'DEFAULT_FILTER_BACKENDS': [ 'django_filters.rest_framework.DjangoFilterBackend', 'rest_framework.filters.SearchFilter', ], # 'EXCEPTION_HANDLER': 'apps.core.error_handler.custom_exception_handler', "DEFAULT_PAGINATION_CLASS": 'apps.core.pagination.CustomPageNumberPagination', "PAGE_SIZE": 20, 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema' } SIMPLE_JWT = { "ACCESS_TOKEN_LIFETIME": timedelta(days=1), "REFRESH_TOKEN_LIFETIME": timedelta(days=1), "ROTATE_REFRESH_TOKENS": False, "BLACKLIST_AFTER_ROTATION": False, "UPDATE_LAST_LOGIN": False, "ALGORITHM": "HS256", "SIGNING_KEY": 'django-insecure-@0apn-lk85pfw=z00x2ib$w9#rwz8%2v4i_n^^9jz-m9b+y55*', "VERIFYING_KEY": "", "AUDIENCE": None, "ISSUER": None, "JSON_ENCODER": None, "JWK_URL": None, "LEEWAY": 0, "AUTH_HEADER_TYPES": ("Bearer",), "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION", "USER_ID_FIELD": "id", "USER_ID_CLAIM": "user_id", "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule", "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",), "TOKEN_TYPE_CLAIM": "token_type", "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser", "JTI_CLAIM": "jti", "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp", "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5), "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1), "TOKEN_OBTAIN_SERIALIZER": 'apps.authentication.api.v1.jwt_serializer.CustomizedTokenObtainPairSerializer', "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer", "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer", "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer", "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer", "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer", } CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://:ydnW4hwzuDRYcTX3FWCHgQ1f@apo.liara.cloud:33740/0", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", }, "KEY_PREFIX": "You have successfully set up a key-value pair!" }, 'memcache': { "BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache", "LOCATION": "127.0.0.1:11211", } } REST_CAPTCHA = { 'CAPTCHA_CACHE': 'default', 'CAPTCHA_TIMEOUT': 300, # 5 minutes 'CAPTCHA_LENGTH': 6, 'CAPTCHA_FONT_SIZE': 35, 'CAPTCHA_IMAGE_SIZE': (90, 20), 'CAPTCHA_LETTER_ROTATION': (-35, 35), 'CAPTCHA_FOREGROUND_COLOR': '#000000', 'CAPTCHA_BACKGROUND_COLOR': '#ffffff', # 'CAPTCHA_FONT_PATH': 'CAPTCHA_CACHE_KEY': 'rest_captcha_{key}.{version}', 'FILTER_FUNCTION': 'rest_captcha.captcha.filter_default', 'NOISE_FUNCTION': 'apps.captcha_app.api.v1.serializers.noise_default' } ELASTICSEARCH_DSL = { # elastic HSA256 finger print f7d94c1da0668ba7874e5e09c3b1b91284fcdda97c361e0165401dc9375531b0 # noqa # liara elastic password uYkiQ860vLW8DIbWpNjqtz2B # noqa # local system password =z66+LCIebq4NQRR_+=R # noqa "default": { "hosts": "http://monte-rosa.liara.cloud:31157", "http_auth": ("elastic", "uYkiQ860vLW8DIbWpNjqtz2B"), } } # Password validation # https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators 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', }, ] # Internationalization # https://docs.djangoproject.com/en/5.2/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S' # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.2/howto/static-files/ STATIC_URL = 'static/' # Default primary key field type # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' DATA_UPLOAD_MAX_MEMORY_SIZE = 50242880 CORS_ORIGIN_ALLOW_ALL = False CORS_ALLOW_CREDENTIALS = True CORS_ALLOWED_ORIGINS = ( 'http://localhost:8080', 'http://127.0.0.1:8080', 'http://127.0.0.1:3000', 'http://localhost:3000', 'http://192.168.88.130:3000', 'https://rasadyar.net', 'https://rasaddam-front.liara.run', 'https://dam.rasadyar.net' ) SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') SECURE_SSL_REDIRECT = False SESSION_COOKIE_SECURE = False CSRF_COOKIE_SECURE = False