Skip to content
Snippets Groups Projects
Select Git revision
  • 2288c5f954d190e91f9f41a834f69d529d9aa443
  • main default protected
  • renovate/djangorestframework-3.x
  • renovate/django-5.x
  • renovate/django-bootstrap5-25.x
  • renovate/django-debug-toolbar-6.x
  • renovate/jsonschema-4.x
  • koma/feature/preference-polling-form
8 results

settings.py

Blame
  • Nadja Geisler's avatar
    Nadja Geisler authored and Benjamin Hättasch committed
    d9d66189
    History
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    settings.py 7.31 KiB
    """
    Django settings for AKPlanning project.
    
    Generated by 'django-admin startproject' using Django 2.2.6.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.2/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.2/ref/settings/
    """
    
    import decimal
    import os
    
    from csp.constants import SELF
    from django.utils.translation import gettext_lazy as _
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    from split_settings.tools import include, optional
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '+7#&=$grg7^x62m#3cuv)k$)tqx!xkj_o&y9sm)@@sgj7_7-!+'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    # Application definition
    
    INSTALLED_APPS = [
        'AKModel.apps.AkmodelConfig',
        'AKDashboard.apps.AkdashboardConfig',
        'AKSubmission.apps.AksubmissionConfig',
        'AKScheduling.apps.AkschedulingConfig',
        'AKPlan.apps.AkplanConfig',
        'AKOnline.apps.AkonlineConfig',
        'AKPreference.apps.AkpreferenceConfig',
        'AKSolverInterface.apps.AksolverinterfaceConfig',
        'AKModel.apps.AKAdminConfig',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'debug_toolbar',
        'django_bootstrap5',
        'fontawesomefree',
        'fontawesome_6',
        'timezone_field',
        'rest_framework',
        'simple_history',
        'registration',
        'django_tex',
        'compressor',
        'docs',
        "csp",
    ]
    
    MIDDLEWARE = [
        'django.middleware.gzip.GZipMiddleware',
        'debug_toolbar.middleware.DebugToolbarMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.locale.LocaleMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'csp.middleware.CSPMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'simple_history.middleware.HistoryRequestMiddleware',
    ]
    
    ROOT_URLCONF = 'AKPlanning.urls'
    
    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',
                ],
            },
        },
        {
            'NAME': 'tex',
            'BACKEND': 'django_tex.engine.TeXEngine',
            'APP_DIRS': True,
            'OPTIONS': {
                'environment': 'AKModel.environment.improved_tex_environment',
            },
        },
    ]
    
    WSGI_APPLICATION = 'AKPlanning.wsgi.application'
    
    DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
    
    # Database
    # https://docs.djangoproject.com/en/2.2/ref/settings/#databases
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    
    # Password validation
    # https://docs.djangoproject.com/en/2.2/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/2.2/topics/i18n/
    
    LANGUAGE_CODE = 'en-US'
    
    TIME_ZONE = 'UTC'
    
    USE_I18N = True
    
    USE_TZ = True
    
    LANGUAGES = [
        ('de', _('German')),
        ('en', _('English')),
    ]
    
    INTERNAL_IPS = ['127.0.0.1', '::1']
    
    LATEX_INTERPRETER = 'lualatex'
    LATEX_RUN_COUNT = 2
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.2/howto/static-files/
    
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    STATICFILES_DIRS = (
        'static_common',
    )
    
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
        'compressor.finders.CompressorFinder',
    )
    
    # Settings for Bootstrap
    BOOTSTRAP5 = {
        "javascript_url": {
            "url": STATIC_URL + "common/vendor/bootstrap/bootstrap-5.3.7.bundle.min.js",
        },
    }
    
    # Settings for FontAwesome
    FONTAWESOME_6_CSS_URL = STATIC_URL + "fontawesomefree/css/all.min.css"
    FONTAWESOME_6_PREFIX = "fa"
    
    # Compressor and minifier config
    COMPRESS_ENABLED = True
    COMPRESS_CSS_HASHING_METHOD = 'content'
    COMPRESS_PRECOMPILERS = (
        ('text/x-scss', 'django_libsass.SassCompiler'),
    )
    COMPRESS_FILTERS = {
        'css': [
            'compressor.filters.css_default.CssAbsoluteFilter',
            'compressor.filters.cssmin.rCSSMinFilter',
        ],
        'js': [
            'compressor.filters.jsmin.JSMinFilter',
        ]
    }
    
    # Treat wishes as seperate category in submission views?
    WISHES_AS_CATEGORY = True
    
    FOOTER_INFO = {
        "repo_url": "https://gitlab.fachschaften.org/kif/akplanning",
        "impress_text": "",
        "impress_url": ""
    }
    
    # How many AKs should be visible as next AKs
    PLAN_MAX_NEXT_AKS = 10
    # Specify range of plan for screen/projector view
    PLAN_WALL_HOURS_RETROSPECT = 3
    # Should the plan use a hierarchy of buildings and rooms?
    PLAN_SHOW_HIERARCHY = True
    # For which time (in seconds) should changes of akslots be highlighted in plan?
    PLAN_MAX_HIGHLIGHT_UPDATE_SECONDS = 2 * 60 * 60
    
    # Show feed of recent changes in dashboard
    DASHBOARD_SHOW_RECENT = True
    # How many entries max?
    DASHBOARD_RECENT_MAX = 25
    # How many events should be featured in the dashboard
    # (active events will always be featured, even if their number is higher than this threshold)
    DASHBOARD_MAX_FEATURED_EVENTS = 3
    
    # In the export to the solver we need to calculate the integer number
    # of discrete time slots covered by an AK. This is done by rounding
    # the 'exact' number up. To avoid 'overshooting' by 1
    # due to FLOP inaccuracies, we subtract this small epsilon before rounding.
    EXPORT_CEIL_OFFSET_EPS = decimal.Decimal(1e-4)
    
    # Registration/login behavior
    SIMPLE_BACKEND_REDIRECT_URL = "/user/"
    LOGIN_REDIRECT_URL = SIMPLE_BACKEND_REDIRECT_URL
    
    # Content Security Policy
    CONTENT_SECURITY_POLICY = {
        "EXCLUDE_URL_PREFIXES": ["/admin"],
        "DIRECTIVES": {
            "default-src": ("'self'",),
            "script-src": ("'self'", "'unsafe-inline'", "'unsafe-eval'"),
            "img-src": ("'self'", "data:"),
            "style-src": ("'self'", "'unsafe-inline'", "fonts.googleapis.com"),
            "font-src": ("'self'", "data:", "fonts.gstatic.com"),
            "frame-src": ("'self'",),
        },
    }
    
    # Emails
    SEND_MAILS = True
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
    
    # Documentation
    
    DOCS_ROOT = os.path.join(BASE_DIR, 'docs/_build/html')
    DOCS_ACCESS = 'public'
    
    include(optional("settings/*.py"))