diff --git a/client/config/develop_settings.py b/client/config/develop_settings.py index 1b67faf..9c81cf5 100644 --- a/client/config/develop_settings.py +++ b/client/config/develop_settings.py @@ -1,16 +1,19 @@ import os from dotenv import load_dotenv -load_dotenv() +load_dotenv() from .production_settings import * # noqa -from .production_settings import BASE_DIR +from .production_settings import BASE_DIR # noqa + + +MEDIA_ROOT = "." # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['*'] +ALLOWED_HOSTS = ["*"] AP_PREDICT_SQLITE = bool(int(os.environ.get("AP_PREDICT_SQLITE", "0"))) if AP_PREDICT_SQLITE: @@ -22,27 +25,27 @@ # 'timeout': 20, }, } -} + } TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates')], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'core.context_processors.common', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [os.path.join(BASE_DIR, "templates")], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "core.context_processors.common", ], }, }, ] LOGGING = { - "version": 1, + "version": 1, "disable_existing_loggers": False, "handlers": { "console": { @@ -54,5 +57,3 @@ "level": "DEBUG", }, } - - diff --git a/client/config/production_settings.py b/client/config/production_settings.py index 69eabc5..1820bb2 100644 --- a/client/config/production_settings.py +++ b/client/config/production_settings.py @@ -20,107 +20,112 @@ BASE_DIR = Path(__file__).resolve().parent.parent APPREDICT_LOOKUP_TABLE_MANIFEST = os.environ.get( - 'APPREDICT_LOOKUP_TABLE_MANIFEST', - 'https://cardiac.nottingham.ac.uk/lookup_tables/appredict_lookup_table_manifest.txt' + "APPREDICT_LOOKUP_TABLE_MANIFEST", + "https://cardiac.nottingham.ac.uk/lookup_tables/appredict_lookup_table_manifest.txt", ) # running in subfolder -subfolder = os.environ.get('subfolder', None) -FORCE_SCRIPT_NAME = '/%s/' % subfolder if subfolder else '' -AUTH_USER_MODEL = 'accounts.User' +subfolder = os.environ.get("subfolder", None) +FORCE_SCRIPT_NAME = "/%s/" % subfolder if subfolder else "" +AUTH_USER_MODEL = "accounts.User" LOGIN_REDIRECT_URL = FORCE_SCRIPT_NAME LOGOUT_REDIRECT_URL = FORCE_SCRIPT_NAME -LOGIN_URL = ('%s/accounts/login/' % FORCE_SCRIPT_NAME).replace('//', '/') +LOGIN_URL = ("%s/accounts/login/" % FORCE_SCRIPT_NAME).replace("//", "/") # email -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_HOST = os.environ.get('smtp_server', 'localhost') -SERVER_EMAIL = os.environ.get('django_email_from_addr', os.environ['DJANGO_SUPERUSER_EMAIL']) +EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" +EMAIL_HOST = os.environ.get("smtp_server", "localhost") +SERVER_EMAIL = os.environ.get( + "django_email_from_addr", os.environ["DJANGO_SUPERUSER_EMAIL"] +) DEFAULT_FROM_EMAIL = SERVER_EMAIL -WELCOME_SUBJECT = os.environ.get('WELCOME_SUBJECT', '[AP Portal] Welcome') +WELCOME_SUBJECT = os.environ.get("WELCOME_SUBJECT", "[AP Portal] Welcome") # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.environ['DJANGO_SECRET_KEY'] +SECRET_KEY = os.environ["DJANGO_SECRET_KEY"] # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False -ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '*').split(',') +ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "*").split(",") # Application definition DJANGO_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", ] LOCAL_APPS = [ - 'core', - 'accounts', - 'files', - 'simulations', + "core", + "accounts", + "files", + "simulations", ] INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - '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', + "django.middleware.security.SecurityMiddleware", + "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", ] -ROOT_URLCONF = 'config.urls' +ROOT_URLCONF = "config.urls" # Cache templates for production TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates')], - 'APP_DIRS': False, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'core.context_processors.common', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [os.path.join(BASE_DIR, "templates")], + "APP_DIRS": False, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + "core.context_processors.common", ], - 'loaders': [ - ('django.template.loaders.cached.Loader', [ - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - ]), + "loaders": [ + ( + "django.template.loaders.cached.Loader", + [ + "django.template.loaders.filesystem.Loader", + "django.template.loaders.app_directories.Loader", + ], + ), ], }, }, ] -WSGI_APPLICATION = 'config.wsgi.application' +WSGI_APPLICATION = "config.wsgi.application" # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': os.environ['PGDATABASE'], - 'USER': os.environ['PGUSER'], - 'PASSWORD': os.environ['PGPASSWORD'], - 'HOST': os.environ['PGHOST'], - 'PORT': os.environ['PGPORT'], + "default": { + "ENGINE": "django.db.backends.postgresql", + "NAME": os.environ["PGDATABASE"], + "USER": os.environ["PGUSER"], + "PASSWORD": os.environ["PGPASSWORD"], + "HOST": os.environ["PGHOST"], + "PORT": os.environ["PGPORT"], } } @@ -130,16 +135,16 @@ AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] @@ -147,9 +152,9 @@ # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = False @@ -159,43 +164,43 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/ -STATIC_URL = ('%s/static/' % FORCE_SCRIPT_NAME).replace('//', '/') -STATIC_ROOT = '/opt/django/staticfiles' +STATIC_URL = ("%s/static/" % FORCE_SCRIPT_NAME).replace("//", "/") +STATIC_ROOT = "/opt/django/staticfiles" STATICFILES_DIRS = [ - str(BASE_DIR / 'static'), + str(BASE_DIR / "static"), ] # Default primary key field type # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" # Use forwarded headers for anything that requires a hostname. USE_X_FORWARDED_HOST = True # Media files (Uploaded files) -MEDIA_URL = FORCE_SCRIPT_NAME + 'media/' -MEDIA_ROOT = '/opt/django/media/' +MEDIA_URL = FORCE_SCRIPT_NAME + "media/" +MEDIA_ROOT = "/opt/django/media/" # Force using temporary fiile for upload -FILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.TemporaryFileUploadHandler'] +FILE_UPLOAD_HANDLERS = ["django.core.files.uploadhandler.TemporaryFileUploadHandler"] # API location for AP manager -AP_PREDICT_ENDPOINT = os.environ.get('AP_PREDICT_ENDPOINT', 'http://path_to_ap_manager') -AP_PREDICT_STATUS_TIMEOUT = int(os.environ.get('AP_PREDICT_STATUS_TIMEOUT', 1000)) +AP_PREDICT_ENDPOINT = os.environ.get("AP_PREDICT_ENDPOINT", "http://path_to_ap_manager") +AP_PREDICT_STATUS_TIMEOUT = int(os.environ.get("AP_PREDICT_STATUS_TIMEOUT", 1000)) # Hosting information for the privacy policy -HOSTING_INFO = os.environ.get('HOSTING_INFO', '') +HOSTING_INFO = os.environ.get("HOSTING_INFO", "") # A brief statement that will be shown at the start of the privacy notice -PRIVACY_NOTICE = os.environ.get('PRIVACY_NOTICE', '').replace('\\n', '
') +PRIVACY_NOTICE = os.environ.get("PRIVACY_NOTICE", "").replace("\\n", "
") # Mailto link for contacting maintiners -CONTACT_MAILTO = os.environ.get('CONTACT_MAILTO', '') +CONTACT_MAILTO = os.environ.get("CONTACT_MAILTO", "") # Contact text for contacting maintiners -CONTACT_TEXT = os.environ.get('CONTACT_TEXT', '') +CONTACT_TEXT = os.environ.get("CONTACT_TEXT", "") # prevent unwated HTTP access CSRF_COOKIE_SECURE = True @@ -213,6 +218,7 @@ AUTH_LDAP_SERVER_URI = os.environ.get( "AUTH_LDAP_SERVER_URI", "ldap://ldap.forumsys.com:389" ) + AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn", "full_name": "cn"} user_group = os.environ.get("AUTH_LDAP_USER_GROUP", None) admin_group = os.environ.get("AUTH_LDAP_ADMIN_GROUP", None) @@ -245,7 +251,5 @@ for base_index in [2, 3, 4, 5]: search_base = os.environ.get(f"AUTH_LDAP_SEARCH_BASE{base_index}", None) if search_base is not None: - searches.append( - LDAPSearch(search_base, ldap.SCOPE_SUBTREE, search_filter) - ) - AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(*searches) \ No newline at end of file + searches.append(LDAPSearch(search_base, ldap.SCOPE_SUBTREE, search_filter)) + AUTH_LDAP_USER_SEARCH = LDAPSearchUnion(*searches) diff --git a/client/core/context_processors.py b/client/core/context_processors.py index a930d76..515469c 100644 --- a/client/core/context_processors.py +++ b/client/core/context_processors.py @@ -1,8 +1,9 @@ from django.contrib import messages from django.conf import settings + def common(request): return { - 'INFO_MESSAGES': messages.get_messages(request), - 'AP_PREDICT_LDAP': settings.AP_PREDICT_LDAP + "INFO_MESSAGES": messages.get_messages(request), + "AP_PREDICT_LDAP": settings.AP_PREDICT_LDAP, }