Skip to content
Snippets Groups Projects
base.py 8.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • Todd Dembrey's avatar
    Todd Dembrey committed
    """
    Django settings for opentech project.
    """
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    import os
    
    PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    BASE_DIR = os.path.dirname(PROJECT_DIR)
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'opentech.images',
    
        'opentech.apply.categories',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'opentech.apply.funds',
    
        'opentech.apply.dashboard',
    
        'opentech.apply.home',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'opentech.apply.users',
        'opentech.apply.stream_forms',
    
        'opentech.public.esi',
    
        'opentech.public.funds',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'opentech.public.home',
        'opentech.public.navigation',
        'opentech.public.news',
        'opentech.public.people',
    
        'opentech.public.projects',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'opentech.public.search',
        'opentech.public.standardpages',
        'opentech.public.utils',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    
        'social_django',
    
    
        'wagtail.contrib.modeladmin',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'wagtail.contrib.postgres_search',
        'wagtail.contrib.settings',
        'wagtail.contrib.wagtailsearchpromotions',
        'wagtail.wagtailforms',
        'wagtail.wagtailredirects',
        'wagtail.wagtailembeds',
        'wagtail.wagtailsites',
        'wagtail.wagtailusers',
        'wagtail.wagtailsnippets',
        'wagtail.wagtaildocs',
        'wagtail.wagtailimages',
        'wagtail.wagtailsearch',
        'wagtail.wagtailadmin',
        'wagtail.wagtailcore',
    
        'modelcluster',
        'taggit',
        'django_extensions',
        'captcha',
    
        'tinymce',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'wagtailcaptcha',
    
        'django_tables2',
    
        'django_select2',
    
        'addressfield',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'django.contrib.sitemaps',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        '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',
    
    
        'opentech.apply.users.middleware.SocialAuthExceptionMiddleware',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'wagtail.wagtailcore.middleware.SiteMiddleware',
        'wagtail.wagtailredirects.middleware.RedirectMiddleware',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'opentech.public.esi.middleware.ESIMiddleware',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    ]
    
    ROOT_URLCONF = 'opentech.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [
                os.path.join(PROJECT_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',
                    'wagtail.contrib.settings.context_processors.settings',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
                    'opentech.public.utils.context_processors.global_vars',
    
                    'social_django.context_processors.backends',
                    'social_django.context_processors.login_redirect',
    
    FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'
    
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    WSGI_APPLICATION = 'opentech.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/stable/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'opentech',
        }
    }
    
    
    # Cache
    # Use database cache as the cache backend
    
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
            'LOCATION': 'database_cache',
        }
    }
    
    
    # Search
    
    WAGTAILSEARCH_BACKENDS = {
        'default': {
            'BACKEND': 'wagtail.contrib.postgres_search.backend',
        },
    }
    
    
    # Password validation
    # https://docs.djangoproject.com/en/stable/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/stable/topics/i18n/
    
    LANGUAGE_CODE = 'en-gb'
    
    TIME_ZONE = 'Europe/London'
    
    USE_I18N = True
    
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    USE_TZ = True
    
    
    DATE_FORMAT = 'Y-m-d'
    
    DATETIME_FORMAT = 'Y-m-d\TH:i:s'
    
    SHORT_DATE_FORMAT = 'Y-m-d'
    
    SHORT_DATETIME_FORMAT = 'Y-m-d\TH:i:s'
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/stable/howto/static-files/
    
    STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
    
    STATICFILES_DIRS = [
    
        os.path.join(PROJECT_DIR, 'static_compiled'),
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    ]
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    STATIC_URL = '/static/'
    
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    MEDIA_URL = '/media/'
    
    
    Dan Braghis's avatar
    Dan Braghis committed
    AUTH_USER_MODEL = 'users.User'
    
    LOGIN_URL = 'users:login'
    
    LOGIN_REDIRECT_URL = 'dashboard:dashboard'
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    
    AUTHENTICATION_BACKENDS = (
        'social_core.backends.google.GoogleOAuth2',
        'django.contrib.auth.backends.ModelBackend',
    )
    
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    # Logging
    
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'mail_admins': {
                'level': 'ERROR',
                'class': 'django.utils.log.AdminEmailHandler',
                'formatter': 'verbose',
            },
            'console': {
                'level': 'ERROR',
                'class': 'logging.StreamHandler',
                'formatter': 'verbose',
            }
        },
        'formatters': {
            'verbose': {
                'format': '[%(asctime)s] (%(process)d/%(thread)d) %(name)s %(levelname)s: %(message)s'
            }
        },
        'loggers': {
            'opentech': {
                'handlers': [],
                'level': 'INFO',
                'propagate': False,
            },
            'wagtail': {
                'handlers': [],
                'level': 'INFO',
                'propagate': False,
            },
            'django.request': {
                'handlers': ['mail_admins', 'console'],
                'level': 'ERROR',
                'propagate': False,
            },
            'django.security': {
                'handlers': ['mail_admins'],
                'level': 'ERROR',
                'propagate': False,
            },
        },
    }
    
    
    # Wagtail settings
    
    
    WAGTAIL_SITE_NAME = "opentech"
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
    WAGTAILIMAGES_IMAGE_MODEL = "images.CustomImage"
    WAGTAILIMAGES_FEATURE_DETECTION_ENABLED = False
    
    
    WAGTAILADMIN_RICH_TEXT_EDITORS = {
        'default': {
            'WIDGET': 'wagtail.wagtailadmin.rich_text.HalloRichTextArea',
            'OPTIONS': {
                'features': [
                    'bold', 'italic',
                    'h3', 'h4', 'h5',
                    'ol', 'ul',
                    'link'
                ]
            }
        },
    }
    
    
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    PASSWORD_REQUIRED_TEMPLATE = 'password_required.html'
    
    DEFAULT_PER_PAGE = 20
    
    ESI_ENABLED = False
    
    # Custom settings
    
    ENABLE_STYLEGUIDE = False
    
    
    # Social Auth
    SOCIAL_AUTH_URL_NAMESPACE = 'social'
    
    # Set the Google OAuth2 credentials in ENV variables or local.py
    # To create a new set of credentials, go to https://console.developers.google.com/apis/credentials
    # Make sure the Google+ API is enabled for your API project
    
    STAFF_EMAIL_DOMAINS = ['opentechfund.org']
    SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = STAFF_EMAIL_DOMAINS
    
    SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ''
    SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ''
    
    Dan Braghis's avatar
    Dan Braghis committed
    
    SOCIAL_AUTH_LOGIN_ERROR_URL = 'users:account'
    SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = 'users:account'
    
    # For pipelines, see http://python-social-auth.readthedocs.io/en/latest/pipeline.html?highlight=pipelines#authentication-pipeline
    # Create / associate accounts (including by email)
    SOCIAL_AUTH_PIPELINE = (
        'social_core.pipeline.social_auth.social_details',
        'social_core.pipeline.social_auth.social_uid',
        'social_core.pipeline.social_auth.auth_allowed',
        'social_core.pipeline.social_auth.social_user',
        'social_core.pipeline.user.get_username',
    
    Dan Braghis's avatar
    Dan Braghis committed
        'social_core.pipeline.social_auth.associate_by_email',
    
    Dan Braghis's avatar
    Dan Braghis committed
        'social_core.pipeline.user.create_user',
        'social_core.pipeline.social_auth.associate_user',
        'social_core.pipeline.social_auth.load_extra_data',
        'social_core.pipeline.user.user_details',
    
        'opentech.apply.users.pipeline.make_otf_staff',
    
    
    # Bleach Settings
    BLEACH_ALLOWED_TAGS = ['h2', 'h3', 'p', 'b', 'i', 'em', 'strong', 'a', 'ul', 'ol', 'li']
    
    BLEACH_ALLOWED_ATTRIBUTES = ['href', 'title', 'style']
    
    BLEACH_ALLOWED_STYLES = ['font-family', 'font-weight', 'text-decoration', 'font-variant']
    
    BLEACH_STRIP_TAGS = True
    
    BLEACH_STRIP_COMMENTS = True