Coverage for waveqc/settings.py: 98%
59 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-26 15:42 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-26 15:42 +0000
1"""
2Django settings for waveqc project.
4Generated by 'django-admin startproject' using Django stable.1.
6For more information on this file, see
7https://docs.djangoproject.com/en/stable/topics/settings/
9For the full list of settings and their values, see
10https://docs.djangoproject.com/en/stable/ref/settings/
11"""
13from pathlib import Path
15import django_stubs_ext
16import environ
17import sentry_sdk
18from sentry_sdk.integrations.celery import CeleryIntegration
20django_stubs_ext.monkeypatch()
22# Build paths inside the project like this: BASE_DIR / 'subdir'.
23BASE_DIR = Path(__file__).resolve().parent.parent
25# Take environment variables form system and from .env file
26# See https://django-environ.readthedocs.io/en/latest/quickstart.html
27env = environ.Env()
28environ.Env.read_env(Path(BASE_DIR / ".env"))
30# Initialize Sentry
31# See https://docs.sentry.io/platforms/python/integrations/django/
32sentry_sdk.init(
33 dsn=env.str("SENTRY_DSN"),
34 environment=env.str("SENTRY_ENVIRONMENT"),
35 traces_sample_rate=env.float("SENTRY_TRACES_SAMPLE_RATE"),
36 profiles_sample_rate=env.float("SENTRY_PROFILES_SAMPLE_RATE"),
37 integrations=[
38 CeleryIntegration(monitor_beat_tasks=True),
39 ],
40)
42# Quick-start development settings
43# See https://docs.djangoproject.com/en/stable/howto/deployment/checklist/
44SECRET_KEY = env.str("SECRET_KEY")
45DEBUG: bool = env.bool("DEBUG")
46ALLOWED_HOSTS = env.list("ALLOWED_HOSTS")
48# Django Debug DebugToolbar
49# See https://django-debug-toolbar.readthedocs.io/en/latest/installation.html
50INTERNAL_IPS = [
51 "127.0.0.1",
52]
54# Https related settings
55# See https://docs.djangoproject.com/en/stable/howto/deployment/checklist/#https
56CSRF_TRUSTED_ORIGINS = env.list("CSRF_TRUSTED_ORIGINS")
57CSRF_COOKIE_SECURE = env.bool("CSRF_COOKIE_SECURE")
58SESSION_COOKIE_SECURE = env.bool("SESSION_COOKIE_SECURE")
59# See https://docs.djangoproject.com/en/5.0/ref/middleware/#ssl-redirect
60SECURE_SSL_REDIRECT = env.bool("SECURE_SSL_REDIRECT")
61# See https://docs.djangoproject.com/en/5.0/ref/middleware/#http-strict-transport-security
62SECURE_HSTS_SECONDS = env.int("SECURE_HSTS_SECONDS")
63SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool("SECURE_HSTS_INCLUDE_SUBDOMAINS")
64SECURE_HSTS_PRELOAD = env.bool("SECURE_HSTS_PRELOAD")
65SECURE_PROXY_SSL_HEADER = env.tuple("SECURE_PROXY_SSL_HEADER", default=None)
67# Application definition
68INSTALLED_APPS = [
69 "whitenoise.runserver_nostatic",
70 "quality.apps.QualityConfig",
71 "django.contrib.admin",
72 "django.contrib.auth",
73 "django.contrib.contenttypes",
74 "django.contrib.humanize",
75 "django.contrib.sessions",
76 "django.contrib.messages",
77 "django.contrib.staticfiles",
78 "django_extensions",
79]
81MIDDLEWARE = [
82 "django.middleware.gzip.GZipMiddleware",
83 "django.middleware.security.SecurityMiddleware",
84 "whitenoise.middleware.WhiteNoiseMiddleware",
85 "django.contrib.sessions.middleware.SessionMiddleware",
86 "django.middleware.common.CommonMiddleware",
87 "django.middleware.csrf.CsrfViewMiddleware",
88 "django.contrib.auth.middleware.AuthenticationMiddleware",
89 "django.contrib.messages.middleware.MessageMiddleware",
90 "django.middleware.clickjacking.XFrameOptionsMiddleware",
91]
93if DEBUG: 93 ↛ 97line 93 didn't jump to line 97 because the condition on line 93 was always true
94 INSTALLED_APPS.append("debug_toolbar")
95 MIDDLEWARE.insert(1, "debug_toolbar.middleware.DebugToolbarMiddleware")
97ROOT_URLCONF = "waveqc.urls"
99TEMPLATES = [
100 {
101 "BACKEND": "django.template.backends.django.DjangoTemplates",
102 "DIRS": [BASE_DIR / "templates"],
103 "APP_DIRS": True,
104 "OPTIONS": {
105 "context_processors": [
106 "django.template.context_processors.debug",
107 "django.template.context_processors.request",
108 "django.contrib.auth.context_processors.auth",
109 "django.contrib.messages.context_processors.messages",
110 ],
111 },
112 },
113]
115STORAGES = {
116 "staticfiles": {
117 "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
118 },
119}
121WSGI_APPLICATION = "waveqc.wsgi.application"
124# Database
125# https://docs.djangoproject.com/en/stable/ref/settings/#databases
126DATABASES = {
127 "default": {
128 "ENGINE": env.str("DATABASE_ENGINE"),
129 "NAME": env.str("DATABASE_NAME"),
130 "USER": env.str("DATABASE_USER"),
131 "PASSWORD": env.str("DATABASE_PASSWORD"),
132 "HOST": env.str("DATABASE_HOST"),
133 "PORT": env.int("DATABASE_PORT"),
134 "CONN_MAX_AGE": env.int("DATABASE_CONN_MAX_AGE"),
135 "CONN_HEALTH_CHECKS": env.bool("DATABASE_CONN_HEALTH_CHECKS"),
136 }
137}
140# Password validation
141# https://docs.djangoproject.com/en/stable/ref/settings/#auth-password-validators
142AUTH_PASSWORD_VALIDATORS = [
143 {
144 "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", # noqa: E501
145 },
146 {
147 "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
148 },
149 {
150 "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
151 },
152 {
153 "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
154 },
155]
158# Internationalization
159# https://docs.djangoproject.com/en/stable/topics/i18n/
160LANGUAGE_CODE = "en-us"
161TIME_ZONE = "UTC"
162USE_I18N = True
163USE_TZ = True
165# Static files (CSS, JavaScript, Images)
166# https://docs.djangoproject.com/en/stable/howto/static-files/
167STATIC_URL = "static/"
168STATIC_ROOT = env.path("STATIC_ROOT")
170# Default primary key field type
171# https://docs.djangoproject.com/en/stable/ref/settings/#default-auto-field
172DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
174# Shell_plus configuration
175# https://django-extensions.readthedocs.io/en/latest/shell_plus.html#configuration
176SHELL_PLUS = "ipython"
177SHELL_PLUS_PRINT_SQL = True
179AMQP_USER = env.str("AMQP_USER")
180AMQP_PASSWORD = env.str("AMQP_PASSWORD")
181AMQP_URL = env.str("AMQP_URL")
182AMQP_PORT = env.int("AMQP_PORT")
183AMQP_VHOST = env.str("AMQP_VHOST")
185RT_SERVER_URL = env.str("RT_SERVER_URL")
187# Celery configuration
188# https://docs.celeryq.dev/en/stable/userguide/configuration.html#configuration
189CELERY_BROKER_URL = (
190 f"amqp://{AMQP_USER}:{AMQP_PASSWORD}@{AMQP_URL}:{AMQP_PORT}/{AMQP_VHOST}"
191)
192CELERY_RESULT_BACKEND = env.cache_url("CELERY_RESULT_BACKEND")
193CELERY_BEAT_SCHEDULE_FILENAME = env.path("CELERY_BEAT_SCHEDULE_FILENAME")
194CELERY_WORKER_MAX_TASKS_PER_CHILD = env.int("CELERY_WORKER_MAX_TASKS_PER_CHILD")
195CELERY_WORKER_PREFETCH_MULTIPLIER = env.int("CELERY_WORKER_PREFETCH_MULTIPLIER")
196CELERY_TASK_ACKS_LATE = True
197CELERY_TASK_REJECT_ON_WORKER_LOST = True
199# WaveQC specific configuration
200WAVEQC_FDSN_CLIENT = env.str("WAVEQC_FDSN_CLIENT")
201WAVEQC_STATIONXML_STORAGE_PATH = env.path("WAVEQC_STATIONXML_STORAGE_PATH")
202WAVEQC_MSEED_STORAGE_PATH = env.path("WAVEQC_MSEED_STORAGE_PATH")
203WAVEQC_SCHEDULE = env.str("WAVEQC_SCHEDULE")