""" Django settings for dnscms project. Generated by 'django-admin startproject' using Django 4.2.6. For more information on this file, see https://docs.djangoproject.com/en/4.2/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.2/ref/settings/ """ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os import re PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(PROJECT_DIR) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ # Application definition INSTALLED_APPS = [ "dnscms", # adding more cms apps? may want to add it to GRAPPLE as well "images", "generic", "contacts", "home", "associations", "events", "venues", "news", "openinghours", "sponsors", "studio", # end cms apps "grapple", "graphene_django", "wagtail_headless_preview", "wagtail.contrib.forms", "wagtail.contrib.redirects", "wagtail.contrib.settings", "wagtail.embeds", "wagtail.sites", "wagtail.users", "wagtail.snippets", "wagtail.documents", "wagtail.images", "wagtail.search", "wagtail.admin", "wagtail", "modelcluster", "taggit", "django_extensions", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.postgres", ] MIDDLEWARE = [ "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", "whitenoise.middleware.WhiteNoiseMiddleware", "wagtail.contrib.redirects.middleware.RedirectMiddleware", ] ROOT_URLCONF = "dnscms.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", ], }, }, ] WSGI_APPLICATION = "dnscms.wsgi.application" # Database # https://docs.djangoproject.com/en/4.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/4.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/4.2/topics/i18n/ LANGUAGE_CODE = "nb-no" TIME_ZONE = "Europe/Oslo" USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.2/howto/static-files/ STATICFILES_FINDERS = [ "django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder", ] STATICFILES_DIRS = [ os.path.join(PROJECT_DIR, "static"), ] # ManifestStaticFilesStorage is recommended in production, to prevent outdated # JavaScript / CSS assets being served from cache (e.g. after a Wagtail upgrade). # See https://docs.djangoproject.com/en/4.2/ref/contrib/staticfiles/#manifeststaticfilesstorage STATICFILES_STORAGE = "django.contrib.staticfiles.storage.ManifestStaticFilesStorage" STATIC_ROOT = os.path.join(BASE_DIR, "static") STATIC_URL = "/static/" MEDIA_ROOT = os.path.join(BASE_DIR, "media") MEDIA_URL = "/media/" # Wagtail settings WAGTAIL_SITE_NAME = "dnscms" WAGTAIL_ALLOW_UNICODE_SLUGS = False WAGTAILIMAGES_IMAGE_MODEL = "images.CustomImage" WAGTAILIMAGES_EXTENSIONS = ["avif", "gif", "jpg", "jpeg", "png", "webp", "svg"] # Search # https://docs.wagtail.org/en/stable/topics/search/backends.html WAGTAILSEARCH_BACKENDS = { "default": { "BACKEND": "wagtail.search.backends.database", } } # Base URL to use when referring to full URLs within the Wagtail admin backend - # e.g. in notification emails. Don't include '/admin' or a trailing slash. # Also used by wagtail-grapple to make image URLs absolute. WAGTAIL_BASE_URL = os.environ.get("WAGTAIL_BASE_URL", "http://127.0.0.1:8000").rstrip("/") WAGTAILADMIN_BASE_URL = WAGTAIL_BASE_URL BASE_URL = WAGTAIL_BASE_URL # Public URL of the Next.js frontend. Used to direct preview iframes and to # redirect "View Live" clicks on the CMS host over to the headless frontend. FRONTEND_BASE_URL = os.environ.get("FRONTEND_BASE_URL", "http://localhost:3000").rstrip("/") WAGTAIL_HEADLESS_PREVIEW = { "CLIENT_URLS": {"default": f"{FRONTEND_BASE_URL}/api/preview"}, "SERVE_BASE_URL": FRONTEND_BASE_URL, "ENFORCE_TRAILING_SLASH": False, "REDIRECT_ON_PREVIEW": False, } # https://docs.wagtail.org/en/latest/releases/6.4.html#data-upload-max-number-fields-update DATA_UPLOAD_MAX_NUMBER_FIELDS = 10_000 # GraphQL GRAPHENE = {"SCHEMA": "grapple.schema.schema"} GRAPPLE = { "APPS": [ "images", "generic", "contacts", "home", "associations", "events", "venues", "news", "openinghours", "sponsors", "studio", ], "EXPOSE_GRAPHIQL": True, "PAGE_SIZE": 100, "MAX_PAGE_SIZE": 5000, } # Wgtail WordPress import WAGTAIL_WORDPRESS_IMPORTER_SOURCE_DOMAIN = "https://studentersamfundet.no/" WAGTAIL_WORDPRESS_IMPORTER_CONVERT_HTML_TAGS_TO_BLOCKS = { # "h1": "wagtail_wordpress_import.block_builder_defaults.build_heading_block", "table": "wagtail_wordpress_import.block_builder_defaults.build_table_block", # "iframe": "wagtail_wordpress_import.block_builder_defaults.build_iframe_block", # "form": "wagtail_wordpress_import.block_builder_defaults.build_form_block", # "img": "wagtail_wordpress_import.block_builder_defaults.build_image_block", # "blockquote": "wagtail_wordpress_import.block_builder_defaults.build_block_quote_block", } WAGTAIL_WORDPRESS_IMPORTER_FALLBACK_BLOCK = ( "dnscms.wordpress.block_builder.build_richtext_block_content" ) WORDPRESS_IMPORT_HOOKS_ITEMS_TO_CACHE = { "attachment": { "DATA_TAG": "thumbnail_id", "FUNCTION": "dnscms.wordpress.import_hooks.header_image_processor", } } # WORDPRESS_IMPORT_HOOKS_TAGS_TO_CACHE = { # "wp:term": { # "DATA_TAG": "category", # "FUNCTION": "dnscms.wordpress.import_hooks.categories_processor", # } # } WAGTAIL_WORDPRESS_IMPORTER_PROMOTE_CHILD_TAGS = { "TAGS_TO_PROMOTE": [], "PARENTS_TO_REMOVE": ["p", "div", "span"], } WAGTAIL_WORDPRESS_IMPORT_PREFILTERS = [ { "FUNCTION": "wagtail_wordpress_import.prefilters.linebreaks_wp", }, { "FUNCTION": "wagtail_wordpress_import.prefilters.transform_shortcodes", }, { "FUNCTION": "wagtail_wordpress_import.prefilters.transform_inline_styles", "OPTIONS": { "TRANSFORM_STYLES_MAPPING": [ ( re.compile(r"font-style:italic;font-weight:bold;", re.IGNORECASE), "wagtail_wordpress_import.prefilters.transform_styles_defaults.transform_style_bold_italic", ), ( re.compile(r"font-weight:bold;", re.IGNORECASE), "wagtail_wordpress_import.prefilters.transform_styles_defaults.transform_style_bold", ), ( re.compile(r"font-style:italic;", re.IGNORECASE), "wagtail_wordpress_import.prefilters.transform_styles_defaults.transform_style_italic", ), # ( # re.compile( # r"text-align:center;", # re.IGNORECASE, # ), # transform_style_center, # ), # (re.compile(r"text-align:left;", re.IGNORECASE), transform_style_left), # (re.compile(r"text-align:right;", re.IGNORECASE), transform_style_right), # (re.compile(r"float:left;", re.IGNORECASE), transform_float_left), # (re.compile(r"float:right;", re.IGNORECASE), transform_float_right), ], }, }, { "FUNCTION": "wagtail_wordpress_import.prefilters.bleach_clean", }, ]