mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2026-02-05 15:35:17 -05:00
feat: add passkey authentication and enhance user preferences - Add passkey login security event type with fingerprint icon - Include request and site context in email confirmation for backend - Add user_id exact match filter to prevent incorrect user lookups - Enable PATCH method for updating user preferences via API - Add moderation_preferences support to user settings - Optimize ticket queries with select_related and prefetch_related This commit introduces passkey authentication tracking, improves user profile filtering accuracy, and extends the preferences API to support updates. Query optimizations reduce database hits for ticket listings.
220 lines
7.2 KiB
Python
220 lines
7.2 KiB
Python
"""
|
|
Local development settings for thrillwiki project.
|
|
|
|
This module extends base.py with development-specific configurations:
|
|
- Debug mode enabled
|
|
- Local memory cache (no Redis required)
|
|
- Console email backend option
|
|
- Development middleware (nplusone, debug toolbar)
|
|
- Enhanced logging for debugging
|
|
"""
|
|
|
|
import logging
|
|
|
|
from .base import * # noqa: F401,F403
|
|
|
|
# =============================================================================
|
|
# Development Settings
|
|
# =============================================================================
|
|
|
|
DEBUG = True
|
|
|
|
# For local development, allow all hosts
|
|
ALLOWED_HOSTS = ["*"]
|
|
|
|
# CSRF trusted origins for local development
|
|
CSRF_TRUSTED_ORIGINS = [
|
|
"http://localhost:8000",
|
|
"http://127.0.0.1:8000",
|
|
"https://beta.thrillwiki.com",
|
|
]
|
|
|
|
# =============================================================================
|
|
# GeoDjango Library Paths (macOS with Homebrew)
|
|
# =============================================================================
|
|
|
|
GDAL_LIBRARY_PATH = "/opt/homebrew/lib/libgdal.dylib"
|
|
GEOS_LIBRARY_PATH = "/opt/homebrew/lib/libgeos_c.dylib"
|
|
|
|
# =============================================================================
|
|
# Local Cache Configuration
|
|
# =============================================================================
|
|
# Use local memory cache for development (no Redis required)
|
|
|
|
LOC_MEM_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache"
|
|
|
|
CACHES = {
|
|
"default": {
|
|
"BACKEND": LOC_MEM_CACHE_BACKEND,
|
|
"LOCATION": "unique-snowflake",
|
|
"TIMEOUT": 300, # 5 minutes
|
|
"OPTIONS": {"MAX_ENTRIES": 1000},
|
|
},
|
|
"sessions": {
|
|
"BACKEND": LOC_MEM_CACHE_BACKEND,
|
|
"LOCATION": "sessions-cache",
|
|
"TIMEOUT": 86400, # 24 hours
|
|
"OPTIONS": {"MAX_ENTRIES": 5000},
|
|
},
|
|
"api": {
|
|
"BACKEND": LOC_MEM_CACHE_BACKEND,
|
|
"LOCATION": "api-cache",
|
|
"TIMEOUT": 300, # 5 minutes
|
|
"OPTIONS": {"MAX_ENTRIES": 2000},
|
|
},
|
|
}
|
|
|
|
# Development-friendly cache settings
|
|
CACHE_MIDDLEWARE_SECONDS = 1 # Very short cache for development
|
|
CACHE_MIDDLEWARE_KEY_PREFIX = "thrillwiki_dev"
|
|
|
|
# =============================================================================
|
|
# Email Backend
|
|
# =============================================================================
|
|
# Use ForwardEmail for actual sending, or console for debugging
|
|
|
|
# Console backend for debugging (recommended for local development):
|
|
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
|
|
|
|
# ForwardEmail backend for actual email sending (uncomment for production testing):
|
|
# EMAIL_BACKEND = "django_forwardemail.backends.ForwardEmailBackend"
|
|
|
|
# =============================================================================
|
|
# Security Settings (Relaxed for Development)
|
|
# =============================================================================
|
|
|
|
SECURE_SSL_REDIRECT = False
|
|
SESSION_COOKIE_SECURE = False
|
|
CSRF_COOKIE_SECURE = False
|
|
|
|
# Email verification - optional for local development to allow passkey login
|
|
ACCOUNT_EMAIL_VERIFICATION = "optional"
|
|
|
|
# =============================================================================
|
|
# Development Apps
|
|
# =============================================================================
|
|
|
|
DEVELOPMENT_APPS = [
|
|
# "silk", # Disabled for performance
|
|
"nplusone.ext.django",
|
|
"django_extensions",
|
|
"widget_tweaks",
|
|
]
|
|
|
|
# Add development apps if not already present
|
|
for app in DEVELOPMENT_APPS:
|
|
if app not in INSTALLED_APPS: # noqa: F405
|
|
INSTALLED_APPS.append(app) # noqa: F405
|
|
|
|
# =============================================================================
|
|
# Development Middleware
|
|
# =============================================================================
|
|
|
|
DEVELOPMENT_MIDDLEWARE = [
|
|
# "silk.middleware.SilkyMiddleware", # Disabled for performance
|
|
"nplusone.ext.django.NPlusOneMiddleware",
|
|
# Note: PerformanceMiddleware and QueryCountMiddleware are already in base.py MIDDLEWARE
|
|
"apps.core.middleware.nextjs.APIResponseMiddleware",
|
|
"apps.core.middleware.request_logging.RequestLoggingMiddleware",
|
|
]
|
|
|
|
# Add development middleware if not already present
|
|
for middleware in DEVELOPMENT_MIDDLEWARE:
|
|
if middleware not in MIDDLEWARE: # noqa: F405
|
|
MIDDLEWARE.insert(1, middleware) # noqa: F405
|
|
|
|
# =============================================================================
|
|
# Debug Toolbar Configuration
|
|
# =============================================================================
|
|
|
|
INTERNAL_IPS = ["127.0.0.1", "::1"]
|
|
|
|
# =============================================================================
|
|
# NPlusOne Configuration
|
|
# =============================================================================
|
|
# Detects N+1 query issues during development
|
|
|
|
NPLUSONE_LOGGER = logging.getLogger("nplusone")
|
|
NPLUSONE_LOG_LEVEL = logging.WARN
|
|
|
|
# =============================================================================
|
|
# Development Logging Configuration
|
|
# =============================================================================
|
|
# Extended logging for debugging with reduced noise
|
|
|
|
LOGGING = {
|
|
"version": 1,
|
|
"disable_existing_loggers": False,
|
|
"formatters": {
|
|
"verbose": {
|
|
"format": "{levelname} {asctime} {module} {process:d} {thread:d} {message}",
|
|
"style": "{",
|
|
},
|
|
"json": {
|
|
"()": "pythonjsonlogger.jsonlogger.JsonFormatter",
|
|
"format": ("%(levelname)s %(asctime)s %(module)s %(process)d " "%(thread)d %(message)s"),
|
|
},
|
|
},
|
|
"handlers": {
|
|
"console": {
|
|
"class": "logging.StreamHandler",
|
|
"formatter": "verbose",
|
|
},
|
|
"file": {
|
|
"class": "logging.handlers.RotatingFileHandler",
|
|
"filename": BASE_DIR / "logs" / "thrillwiki.log", # noqa: F405
|
|
"maxBytes": 1024 * 1024 * 10, # 10MB
|
|
"backupCount": 5,
|
|
"formatter": "json",
|
|
},
|
|
"performance": {
|
|
"class": "logging.handlers.RotatingFileHandler",
|
|
"filename": BASE_DIR / "logs" / "performance.log", # noqa: F405
|
|
"maxBytes": 1024 * 1024 * 10, # 10MB
|
|
"backupCount": 5,
|
|
"formatter": "json",
|
|
},
|
|
},
|
|
"root": {
|
|
"level": "INFO",
|
|
"handlers": ["console"],
|
|
},
|
|
"loggers": {
|
|
"django": {
|
|
"handlers": ["file"],
|
|
"level": "WARNING",
|
|
"propagate": False,
|
|
},
|
|
"django.db.backends": {
|
|
"handlers": ["console"],
|
|
"level": "WARNING",
|
|
"propagate": False,
|
|
},
|
|
"thrillwiki": {
|
|
"handlers": ["console", "file"],
|
|
"level": "INFO",
|
|
"propagate": False,
|
|
},
|
|
"performance": {
|
|
"handlers": ["performance"],
|
|
"level": "WARNING",
|
|
"propagate": False,
|
|
},
|
|
"query_optimization": {
|
|
"handlers": ["console", "file"],
|
|
"level": "WARNING",
|
|
"propagate": False,
|
|
},
|
|
"nplusone": {
|
|
"handlers": ["console"],
|
|
"level": "ERROR",
|
|
"propagate": False,
|
|
},
|
|
"request_logging": {
|
|
"handlers": ["console"],
|
|
"level": "INFO",
|
|
"propagate": False,
|
|
},
|
|
},
|
|
}
|