Skip to content
Snippets Groups Projects
base.py 8.88 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',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        'opentech.apply.activity',
    
        '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.review',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        '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.search_promotions',
        'wagtail.contrib.forms',
        'wagtail.contrib.redirects',
        'wagtail.embeds',
        'wagtail.sites',
        'wagtail.users',
        'wagtail.snippets',
        'wagtail.documents',
        'wagtail.images',
        'wagtail.search',
        'wagtail.admin',
        'wagtail.core',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
    
        'modelcluster',
        'taggit',
        'django_extensions',
    
        'tinymce',
    
        '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.postgres',
    
    Todd Dembrey's avatar
    Todd Dembrey committed
        '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',
    
        'wagtail.core.middleware.SiteMiddleware',
        'wagtail.contrib.redirects.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'
    
    WAGTAIL_USER_EDIT_FORM = 'opentech.apply.users.forms.CustomUserEditForm'
    WAGTAIL_USER_CREATION_FORM = 'opentech.apply.users.forms.CustomUserCreationForm'
    WAGTAIL_USER_CUSTOM_FIELDS = ['full_name']
    
    
    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.admin.rich_text.DraftailRichTextArea',
    
            # fixed in wagtail 2.0.1: https://github.com/wagtail/wagtail/commit/09f8a4f38a95f2760f38ab2f142443df93b5d8c6
    
            # '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',
    
    Dan Braghis's avatar
    Dan Braghis committed
    BLEACH_ALLOWED_TAGS = ['h2', 'h3', 'p', 'b', 'i', 'em', 'strong', 'a', 'ul', 'ol', 'li', 'br']
    
    
    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