import os from pathlib import Path from datetime import timedelta BASE_DIR = Path(__file__).resolve().parent.parent.parent # --- SIGURNOST I OKRUŽENJE (Docker Environment Variables) --- # Ako varijabla nije definirana u Dockeru, koristi se fallback (razvojni ključ) SECRET_KEY = os.environ.get('SECRET_KEY', 'django-insecure-fk#ywtdyi8=t6^vdbo!=br8op0rdwf*ks#sji20&mp2+nwjs_5') # Docker prosljeđuje string 'True' ili 'False'. Pretvaramo ga u Python Boolean. DEBUG = os.environ.get('DEBUG', 'True') == 'True' INSTALLED_APPS = [ 'unfold', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'corsheaders', 'rest_framework', 'django_extensions', 'rest_framework_simplejwt', 'modules.invoicing', 'modules.task_management', 'core.users.apps.UsersConfig', 'modules.crm', 'modules.fleet' ] UNFOLD = { 'SITE_TITLE': 'ERP Admin', 'SITE_HEADER': 'ERP Administration', 'SITE_SYMBOL': 'dashboard', 'SHOW_HISTORY': True, } MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', # Mora biti prvi 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # Za statiku 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', ] ROOT_URLCONF = 'core.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 = 'core.wsgi.application' # --- VALIDACIJA LOZINKI --- 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'}, ] AUTH_USER_MODEL = 'users.CustomUser' # --- INTERNACIONALIZACIJA (Lokalizacija) --- LANGUAGE_CODE = 'hr' # Postavljeno na hrvatski jezik za ERP/Zadatke TIME_ZONE = 'Europe/Zagreb' # Sinkronizirano s našom vremenskom zonom USE_I18N = True USE_TZ = True CORS_ALLOW_CREDENTIALS = True # U bazi definiramo default, a u prod/dev override-amo CORS_ALLOWED_ORIGINS = os.environ.get('CORS_ALLOWED_ORIGINS', 'http://localhost:4321').split(',') CORS_ALLOW_METHODS = [ "DELETE", "GET", "OPTIONS", "PATCH", "POST", "PUT", ] CORS_ALLOW_HEADERS = [ 'accept', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', 'access-control-request-private-network', ] # Dopušta preflight zahtjeve unutar lokalne mreže (npr. s Docker mreže na tvoje računalo) CORS_ALLOW_PRIVATE_NETWORK = True CORS_PREFLIGHT_MAX_AGE = 86400 # Dopusti slanje Authorization zaglavlja (JWT Tokena) kroz mrežne zahtjeve CORS_ALLOW_CREDENTIALS = True # --- REST FRAMEWORK & JWT POSTAVKE --- REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', # 'rest_framework.permissions.AllowAny', ), } SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(days=1), 'REFRESH_TOKEN_LIFETIME': timedelta(days=7), 'ROTATE_REFRESH_TOKENS': True, 'BLACKLIST_AFTER_ROTATION': True, # Dodano 'AUTH_HEADER_TYPES': ('Bearer',), } WEBHOOK_SECRET = os.environ.get('WEBHOOK_SECRET', 'super-tajni-dugacki-kljuc-koji-ces-promijeniti') DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' # ============================================================================== # 🔥 CELERY & REDIS POSTAVKE (Lean Worker Model) # ============================================================================== # Čitamo REDIS_URL iz okruženja (Docker prosljeđuje 'redis://redis:6379/0'). # Ako pokrećeš izvan Dockera, koristi localhost kao fallback. REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0') CELERY_BROKER_URL = REDIS_URL CELERY_RESULT_BACKEND = REDIS_URL # Ako želiš koristiti Redis kao brzi cache sustav unutar Djanga (izvrsno za ERP performanse) # Za ovo ti je potreban paket 'django-redis' u requirements.txt CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': REDIS_URL, # Koristi isti Redis kontejner i bazu /0 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PARSER_KWARGS': {'decode_responses': True}, } } } CELERY_ACCEPT_CONTENT = ['json'] CELERY_TASK_SERIALIZER = 'json' # URL kojim će preglednik dohvaćati statiku STATIC_URL = '/static/' # Direktorij gdje će 'collectstatic' skupljati sve statičke datoteke (za produkciju) # STATIC_ROOT = BASE_DIR / '/app/staticfiles' # (Opcionalno, ali preporučeno za ERP) Ako koristiš i medije (dokumente) MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media' # ============================================================================== # 🔥 Paperless postavke # ============================================================================== PAPERLESS_BASE_URL = os.environ.get('PAPERLESS_BASE_URL', 'http://paperless:8000') # paperless na drugoj docker compose instanci PAPERLESS_API_TOKEN = os.environ.get('PAPERLESS_API_TOKEN', '144b62542009c1c1a5a296b16601b4ab488f6a01') # ============================================================================== # 🔥 Email postavke (Google) # ============================================================================== # SMTP Konfiguracija EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True # Čitanje iz .env varijabli EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER', 'tvoj.email@gmail.com') EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD', 'xxxx-xxxx-xxxx-xxxx') DEFAULT_FROM_EMAIL = os.environ.get('DEFAULT_FROM_EMAIL', 'tvoj.email@gmail.com') # ============================================================================== # 🔥 PUSHER CONFIGURATION # ============================================================================== # Pusher Configuration PUSHER_APP_ID = os.environ.get('PUSHER_APP_ID') PUSHER_KEY = os.environ.get('PUSHER_KEY') PUSHER_SECRET = os.environ.get('PUSHER_SECRET') PUSHER_CLUSTER = os.environ.get('PUSHER_CLUSTER', default='mt1') # Cache za fallback mehanizam CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.redis.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', } }