""" Django settings for PyRIGS project. For more information on this file, see https://docs.djangoproject.com/en/1.7/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.7/ref/settings/ """ import datetime from pathlib import Path import sentry_sdk from sentry_sdk.integrations.django import DjangoIntegration from envparse import env # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve(strict=True).parent.parent # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = env("SECRET_KEY", default="gxhy(a#5mhp289_=6xx$7jh=eh$ymxg^ymc+di*0c*geiu3p_e") # SECURITY WARNING: don't run with debug turned on in production! DEBUG = env("DEBUG", cast=bool, default=True) STAGING = env("STAGING", cast=bool, default=False) CI = env("CI", cast=bool, default=False) # Commit the running image was built from (baked in at build time) GIT_SHA = env("GIT_SHA", default="unknown") ALLOWED_HOSTS = [ host.strip() for host in env("DJANGO_ALLOWED_HOSTS", default="rigs.nottinghamtec.co.uk").split(",") if host.strip() ] if DEBUG: CSRF_TRUSTED_ORIGINS = [f"http://{host}" for host in ALLOWED_HOSTS] CSRF_TRUSTED_ORIGINS.append("http://localhost:8000") CSRF_TRUSTED_ORIGINS.append("http://localhost:8001") ALLOWED_HOSTS = ["*"] else: # Django 4+ checks the Origin header on unsafe requests against this list, which # matters when TLS is terminated by a proxy in front of us. CSRF_TRUSTED_ORIGINS = [f"https://{host}" for host in ALLOWED_HOSTS] SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") if not DEBUG: SECURE_SSL_REDIRECT = True # Redirect all http requests to https SECURE_HSTS_SECONDS = 3600 SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_CONTENT_TYPE_NOSNIFF = True SESSION_COOKIE_SECURE = env("SESSION_COOKIE_SECURE_ENABLED", cast=bool, default=True) CSRF_COOKIE_SECURE = env("CSRF_COOKIE_SECURE_ENABLED", cast=bool, default=True) INTERNAL_IPS = ["127.0.0.1"] DOMAIN = env("DOMAIN", default="example.com") ADMINS = [("IT Manager", f"it@{DOMAIN}")] if DEBUG: ADMINS.append(("Testing Superuser", "superuser@example.com")) # Application definition INSTALLED_APPS = ( "whitenoise.runserver_nostatic", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.humanize", "versioning", "users", "RIGS", "assets", "training", "registration", "reversion", "widget_tweaks", "hcaptcha", "massadmin", ) MIDDLEWARE = ( "django.middleware.security.SecurityMiddleware", "whitenoise.middleware.WhiteNoiseMiddleware", "reversion.middleware.RevisionMiddleware", "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", "htmlmin.middleware.HtmlMinifyMiddleware", "htmlmin.middleware.MarkRequestMiddleware", ) ROOT_URLCONF = "PyRIGS.urls" WSGI_APPLICATION = "PyRIGS.wsgi.application" # Database DATABASES = { "default": { "ENGINE": "django.db.backends.{}".format(env("DATABASE_ENGINE", default="sqlite3")), "NAME": env("DATABASE_NAME", default="rigs"), "USER": env("DATABASE_USERNAME", default="rigs"), "PASSWORD": env("DATABASE_PASSWORD", default="rigs"), "HOST": env("DATABASE_HOST", default="127.0.0.1"), "PORT": env("DATABASE_PORT", 5432), } } # Logging LOGGING = { "version": 1, "disable_existing_loggers": False, "formatters": { "verbose": { "format": ( "%(asctime)s [%(process)d] [%(levelname)s] " + "pathname=%(pathname)s lineno=%(lineno)s " + "funcname=%(funcName)s %(message)s" ), "datefmt": "%Y-%m-%d %H:%M:%S", }, "simple": {"format": "%(levelname)s %(message)s"}, }, "handlers": { "null": { "level": "DEBUG", "class": "logging.NullHandler", }, "console": {"level": "DEBUG", "class": "logging.StreamHandler", "formatter": "verbose"}, "mail_admins": { "class": "django.utils.log.AdminEmailHandler", "level": "ERROR", # But the emails are plain text by default - HTML is nicer "include_html": True, }, }, "loggers": { # Again, default Django configuration to email unhandled exceptions "django.request": { "handlers": ["mail_admins"], "level": "ERROR", "propagate": True, }, # Might as well log any errors anywhere else in Django "django": { "handlers": ["console"], "level": "ERROR", "propagate": False, }, # Ignore dangling object references "pypdf": { "level": "ERROR", "propagate": False, }, }, } # Tests lock up SQLite otherwise if STAGING or CI: CACHES = {"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}} elif DEBUG: CACHES = {"default": {"BACKEND": "django.core.cache.backends.dummy.DummyCache"}} else: CACHES = { "default": { "BACKEND": "django.core.cache.backends.db.DatabaseCache", "LOCATION": "cache_table", } } # Error/performance monitoring sentry_sdk.init( dsn=env("SENTRY_DSN", default=""), integrations=[DjangoIntegration()], traces_sample_rate=1.0, ) # User system AUTH_USER_MODEL = "RIGS.Profile" LOGIN_REDIRECT_URL = "/" LOGIN_URL = "/user/login/" LOGOUT_URL = "/user/logout/" ACCOUNT_ACTIVATION_DAYS = 7 # CAPTCHA settings HCAPTCHA_SITEKEY = env("HCAPTCHA_SITEKEY", "10000000-ffff-ffff-ffff-000000000001") HCAPTCHA_SECRET = env("HCAPTCHA_SECRET", "0x0000000000000000000000000000000000000000") # Email EMAILER_TEST = False if not DEBUG or EMAILER_TEST: EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" EMAIL_HOST = env("EMAIL_HOST") EMAIL_PORT = env("EMAIL_PORT", cast=int, default=25) EMAIL_HOST_USER = env("EMAIL_HOST_USER") EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD") EMAIL_USE_TLS = env("EMAIL_USE_TLS", cast=bool, default=False) EMAIL_USE_SSL = env("EMAIL_USE_SSL", cast=bool, default=False) DEFAULT_FROM_EMAIL = env("EMAIL_FROM") else: EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" EMAIL_COOLDOWN = datetime.timedelta(minutes=15) # Internationalization # https://docs.djangoproject.com/en/1.7/topics/i18n/ LANGUAGE_CODE = "en-gb" TIME_ZONE = "Europe/London" FORMAT_MODULE_PATH = "PyRIGS.formats" USE_TZ = True USE_THOUSAND_SEPARATOR = False # Need to allow seconds as datetime-local input type spits out a time that has seconds DATETIME_INPUT_FORMATS = ("%Y-%m-%dT%H:%M", "%Y-%m-%dT%H:%M:%S") # Static files (CSS, JavaScript, Images) STORAGES = { "default": { "BACKEND": "django.core.files.storage.FileSystemStorage", }, "staticfiles": { "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage", }, } STATIC_URL = "/static/" STATIC_ROOT = str(BASE_DIR / "static/") STATICFILES_DIRS = [ str(BASE_DIR / "pipeline/built_assets"), ] TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [BASE_DIR / "templates"], "APP_DIRS": True, "OPTIONS": { "context_processors": [ "django.contrib.auth.context_processors.auth", "django.template.context_processors.debug", "django.template.context_processors.i18n", "django.template.context_processors.media", "django.template.context_processors.static", "django.template.context_processors.tz", "django.template.context_processors.request", "django.contrib.messages.context_processors.messages", "PyRIGS.views.ajax_context", "PyRIGS.views.version_context", ], "debug": DEBUG, }, }, ] USE_GRAVATAR = True TERMS_OF_HIRE_URL = "http://www.nottinghamtec.co.uk/terms.pdf" AUTHORISATION_NOTIFICATION_ADDRESS = "productions@nottinghamtec.co.uk" DEFAULT_AUTO_FIELD = "django.db.models.AutoField"