Coverage for waveqc/settings.py: 98%

59 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-26 15:42 +0000

1""" 

2Django settings for waveqc project. 

3 

4Generated by 'django-admin startproject' using Django stable.1. 

5 

6For more information on this file, see 

7https://docs.djangoproject.com/en/stable/topics/settings/ 

8 

9For the full list of settings and their values, see 

10https://docs.djangoproject.com/en/stable/ref/settings/ 

11""" 

12 

13from pathlib import Path 

14 

15import django_stubs_ext 

16import environ 

17import sentry_sdk 

18from sentry_sdk.integrations.celery import CeleryIntegration 

19 

20django_stubs_ext.monkeypatch() 

21 

22# Build paths inside the project like this: BASE_DIR / 'subdir'. 

23BASE_DIR = Path(__file__).resolve().parent.parent 

24 

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")) 

29 

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) 

41 

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") 

47 

48# Django Debug DebugToolbar 

49# See https://django-debug-toolbar.readthedocs.io/en/latest/installation.html 

50INTERNAL_IPS = [ 

51 "127.0.0.1", 

52] 

53 

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) 

66 

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] 

80 

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] 

92 

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") 

96 

97ROOT_URLCONF = "waveqc.urls" 

98 

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] 

114 

115STORAGES = { 

116 "staticfiles": { 

117 "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage", 

118 }, 

119} 

120 

121WSGI_APPLICATION = "waveqc.wsgi.application" 

122 

123 

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} 

138 

139 

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] 

156 

157 

158# Internationalization 

159# https://docs.djangoproject.com/en/stable/topics/i18n/ 

160LANGUAGE_CODE = "en-us" 

161TIME_ZONE = "UTC" 

162USE_I18N = True 

163USE_TZ = True 

164 

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") 

169 

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" 

173 

174# Shell_plus configuration 

175# https://django-extensions.readthedocs.io/en/latest/shell_plus.html#configuration 

176SHELL_PLUS = "ipython" 

177SHELL_PLUS_PRINT_SQL = True 

178 

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") 

184 

185RT_SERVER_URL = env.str("RT_SERVER_URL") 

186 

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 

198 

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")