1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/weblate_ynh.git synced 2024-10-01 13:35:04 +02:00
weblate_ynh/conf/settings.py

860 lines
29 KiB
Python
Raw Normal View History

2019-08-22 22:29:05 +02:00
# -*- coding: utf-8 -*-
#
2020-10-28 12:02:15 +01:00
# Copyright © 2012 - 2020 Michal Čihař <michal@cihar.com>
2019-08-22 22:29:05 +02:00
#
# This file is part of Weblate <https://weblate.org/>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
from __future__ import unicode_literals
import os
import platform
from logging.handlers import SysLogHandler
#
# Django settings for Weblate project.
#
2019-08-22 22:30:09 +02:00
DEBUG = False
2019-08-22 22:29:05 +02:00
ADMINS = (
2019-08-22 22:31:15 +02:00
('__ADMIN__', '__ADMINMAIL__'),
2019-08-22 22:29:05 +02:00
)
MANAGERS = ADMINS
DATABASES = {
2020-10-28 12:02:15 +01:00
"default": {
2019-08-22 22:29:05 +02:00
# Use 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
2020-10-28 12:02:15 +01:00
"ENGINE": "django.db.backends.postgresql",
2019-08-22 22:29:05 +02:00
# Database name or path to database file if using sqlite3.
2020-10-28 12:02:15 +01:00
"NAME": "__NAME__",
2019-08-22 22:29:05 +02:00
# Database user, not used with sqlite3.
2020-10-28 12:02:15 +01:00
"USER": "__NAME__",
2019-08-22 22:29:05 +02:00
# Database password, not used with sqlite3.
2020-10-28 12:02:15 +01:00
"PASSWORD": "__DB_PWD__",
2019-08-22 22:29:05 +02:00
# Set to empty string for localhost. Not used with sqlite3.
2020-10-28 12:02:15 +01:00
"HOST": "127.0.0.1",
2019-08-22 22:29:05 +02:00
# Set to empty string for default. Not used with sqlite3.
2020-10-28 12:02:15 +01:00
"PORT": "",
2019-08-22 22:29:05 +02:00
# Customizations for databases
2020-10-28 12:02:15 +01:00
"OPTIONS": {
2019-08-22 22:29:05 +02:00
# In case of using an older MySQL server,
# which has MyISAM as a default storage
# 'init_command': 'SET storage_engine=INNODB',
# Uncomment for MySQL older than 5.7:
# 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
# Set emoji capable charset for MySQL:
# 'charset': 'utf8mb4',
2020-10-28 12:02:15 +01:00
# Change connection timeout in case you get MySQL gone away error:
# 'connect_timeout': 28800,
2019-08-22 22:29:05 +02:00
},
}
}
2020-10-28 12:02:15 +01:00
BASE_DIR = "__FINALPATH__"
2019-08-22 22:29:05 +02:00
# Data directory
2020-10-28 12:02:15 +01:00
DATA_DIR = os.path.join(BASE_DIR, "data")
2019-08-22 22:29:05 +02:00
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# In a Windows environment this must be set to your system time zone.
2020-10-28 12:02:15 +01:00
TIME_ZONE = "UTC"
2019-08-22 22:29:05 +02:00
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
2020-10-28 12:02:15 +01:00
LANGUAGE_CODE = "en-us"
2019-08-22 22:29:05 +02:00
LANGUAGES = (
2020-10-28 12:02:15 +01:00
("ar", "العربية"),
("az", "Azərbaycan"),
("be", "Беларуская"),
("be@latin", "Biełaruskaja"),
("bg", "Български"),
("br", "Brezhoneg"),
("ca", "Català"),
("cs", "Čeština"),
("da", "Dansk"),
("de", "Deutsch"),
("en", "English"),
("el", "Ελληνικά"),
("en-gb", "English (United Kingdom)"),
("es", "Español"),
("fi", "Suomi"),
("fr", "Français"),
("gl", "Galego"),
("he", "עברית"),
("hu", "Magyar"),
("hr", "Hrvatski"),
("id", "Indonesia"),
("it", "Italiano"),
("ja", "日本語"),
("kk", "Қазақ тілі"),
("ko", "한국어"),
("nb", "Norsk bokmål"),
("nl", "Nederlands"),
("pl", "Polski"),
("pt", "Português"),
("pt-br", "Português brasileiro"),
("ru", "Русский"),
("sk", "Slovenčina"),
("sl", "Slovenščina"),
("sq", "Shqip"),
("sr", "Српски"),
("sv", "Svenska"),
("tr", "Türkçe"),
("uk", "Українська"),
("zh-hans", "简体字"),
("zh-hant", "正體字"),
2019-08-22 22:29:05 +02:00
)
SITE_ID = 1
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale.
USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True
# URL prefix to use, please see documentation for more details
2020-10-28 12:02:15 +01:00
URL_PREFIX = "__PATHURL__"
2019-08-22 22:29:05 +02:00
# Absolute filesystem path to the directory that will hold user-uploaded files.
2020-10-28 12:02:15 +01:00
MEDIA_ROOT = os.path.join(DATA_DIR, "media")
2019-08-22 22:29:05 +02:00
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
2020-10-28 12:02:15 +01:00
MEDIA_URL = "{0}/media/".format(URL_PREFIX)
2019-08-22 22:29:05 +02:00
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
2020-10-28 12:02:15 +01:00
STATIC_ROOT = os.path.join(DATA_DIR, "static")
2019-08-22 22:29:05 +02:00
# URL prefix for static files.
2020-10-28 12:02:15 +01:00
STATIC_URL = "{0}/static/".format(URL_PREFIX)
2019-08-22 22:29:05 +02:00
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
2020-10-28 12:02:15 +01:00
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
"compressor.finders.CompressorFinder",
2019-08-22 22:29:05 +02:00
)
# Make this unique, and don't share it with anybody.
# You can generate it using weblate/examples/generate-secret-key
2020-10-28 12:02:15 +01:00
SECRET_KEY = "__KEY__" # noqa
2019-08-22 22:29:05 +02:00
2020-10-28 12:02:15 +01:00
_TEMPLATE_LOADERS = [
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
]
if not DEBUG:
_TEMPLATE_LOADERS = [("django.template.loaders.cached.Loader", _TEMPLATE_LOADERS)]
2019-08-22 22:29:05 +02:00
TEMPLATES = [
{
2020-10-28 12:02:15 +01:00
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [os.path.join(BASE_DIR, "weblate", "templates")],
"OPTIONS": {
"context_processors": [
"django.contrib.auth.context_processors.auth",
"django.template.context_processors.debug",
"django.template.context_processors.i18n",
"django.template.context_processors.request",
"django.template.context_processors.csrf",
"django.contrib.messages.context_processors.messages",
"weblate.trans.context_processors.weblate_context",
2019-08-22 22:29:05 +02:00
],
2020-10-28 12:02:15 +01:00
"loaders": _TEMPLATE_LOADERS,
2019-08-22 22:29:05 +02:00
},
2020-10-28 12:02:15 +01:00
}
2019-08-22 22:29:05 +02:00
]
# GitHub username for sending pull requests.
# Please see the documentation for more details.
GITHUB_USERNAME = "__GITHUBUSER__"
2020-10-28 12:02:15 +01:00
# GitLab username for sending merge requests.
# Please see the documentation for more details.
GITLAB_USERNAME = None
2019-08-22 22:29:05 +02:00
# Authentication configuration
AUTHENTICATION_BACKENDS = (
2020-10-28 12:02:15 +01:00
"social_core.backends.email.EmailAuth",
2019-08-22 22:29:05 +02:00
# 'social_core.backends.google.GoogleOAuth2',
# 'social_core.backends.github.GithubOAuth2',
# 'social_core.backends.bitbucket.BitbucketOAuth',
2020-10-28 12:02:15 +01:00
# 'social_core.backends.suse.OpenSUSEOpenId',
# 'social_core.backends.ubuntu.UbuntuOpenId',
# 'social_core.backends.fedora.FedoraOpenId',
2019-08-22 22:29:05 +02:00
# 'social_core.backends.facebook.FacebookOAuth2',
2020-10-28 12:02:15 +01:00
"weblate.accounts.auth.WeblateUserBackend",
2019-08-22 22:29:05 +02:00
)
# Custom user model
2020-10-28 12:02:15 +01:00
AUTH_USER_MODEL = "weblate_auth.User"
2019-08-22 22:29:05 +02:00
# Social auth backends setup
2020-10-28 12:02:15 +01:00
SOCIAL_AUTH_GITHUB_KEY = ""
SOCIAL_AUTH_GITHUB_SECRET = ""
SOCIAL_AUTH_GITHUB_SCOPE = ["user:email"]
2019-08-22 22:29:05 +02:00
2020-10-28 12:02:15 +01:00
SOCIAL_AUTH_BITBUCKET_KEY = ""
SOCIAL_AUTH_BITBUCKET_SECRET = ""
2019-08-22 22:29:05 +02:00
SOCIAL_AUTH_BITBUCKET_VERIFIED_EMAILS_ONLY = True
2020-10-28 12:02:15 +01:00
SOCIAL_AUTH_FACEBOOK_KEY = ""
SOCIAL_AUTH_FACEBOOK_SECRET = ""
SOCIAL_AUTH_FACEBOOK_SCOPE = ["email", "public_profile"]
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {"fields": "id,name,email"}
SOCIAL_AUTH_FACEBOOK_API_VERSION = "3.1"
2019-08-22 22:29:05 +02:00
2020-10-28 12:02:15 +01:00
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = ""
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = ""
2019-08-22 22:29:05 +02:00
# Social auth settings
SOCIAL_AUTH_PIPELINE = (
2020-10-28 12:02:15 +01:00
"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",
"weblate.accounts.pipeline.store_params",
"weblate.accounts.pipeline.verify_open",
"social_core.pipeline.user.get_username",
"weblate.accounts.pipeline.require_email",
"social_core.pipeline.mail.mail_validation",
"weblate.accounts.pipeline.revoke_mail_code",
"weblate.accounts.pipeline.ensure_valid",
"weblate.accounts.pipeline.remove_account",
"social_core.pipeline.social_auth.associate_by_email",
"weblate.accounts.pipeline.reauthenticate",
"weblate.accounts.pipeline.verify_username",
"social_core.pipeline.user.create_user",
"social_core.pipeline.social_auth.associate_user",
"social_core.pipeline.social_auth.load_extra_data",
"weblate.accounts.pipeline.cleanup_next",
"weblate.accounts.pipeline.user_full_name",
"weblate.accounts.pipeline.store_email",
"weblate.accounts.pipeline.notify_connect",
"weblate.accounts.pipeline.password_reset",
2019-08-22 22:29:05 +02:00
)
SOCIAL_AUTH_DISCONNECT_PIPELINE = (
2020-10-28 12:02:15 +01:00
"social_core.pipeline.disconnect.allowed_to_disconnect",
"social_core.pipeline.disconnect.get_entries",
"social_core.pipeline.disconnect.revoke_tokens",
"weblate.accounts.pipeline.cycle_session",
"weblate.accounts.pipeline.adjust_primary_mail",
"weblate.accounts.pipeline.notify_disconnect",
"social_core.pipeline.disconnect.disconnect",
"weblate.accounts.pipeline.cleanup_next",
2019-08-22 22:29:05 +02:00
)
# Custom authentication strategy
2020-10-28 12:02:15 +01:00
SOCIAL_AUTH_STRATEGY = "weblate.accounts.strategy.WeblateStrategy"
2019-08-22 22:29:05 +02:00
# Raise exceptions so that we can handle them later
SOCIAL_AUTH_RAISE_EXCEPTIONS = True
2020-10-28 12:02:15 +01:00
SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = "weblate.accounts.pipeline.send_validation"
SOCIAL_AUTH_EMAIL_VALIDATION_URL = "{0}/accounts/email-sent/".format(URL_PREFIX)
SOCIAL_AUTH_LOGIN_ERROR_URL = "{0}/accounts/login/".format(URL_PREFIX)
SOCIAL_AUTH_EMAIL_FORM_URL = "{0}/accounts/email/".format(URL_PREFIX)
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = "{0}/accounts/profile/#account".format(
URL_PREFIX
)
SOCIAL_AUTH_PROTECTED_USER_FIELDS = ("email",)
2019-08-22 22:29:05 +02:00
SOCIAL_AUTH_SLUGIFY_USERNAMES = True
2020-10-28 12:02:15 +01:00
SOCIAL_AUTH_SLUGIFY_FUNCTION = "weblate.accounts.pipeline.slugify_username"
2019-08-22 22:29:05 +02:00
# Password validation configuration
AUTH_PASSWORD_VALIDATORS = [
{
2020-10-28 12:02:15 +01:00
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator" # noqa: E501, pylint: disable=line-too-long
2019-08-22 22:29:05 +02:00
},
{
2020-10-28 12:02:15 +01:00
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
"OPTIONS": {"min_length": 6},
2019-08-22 22:29:05 +02:00
},
2020-10-28 12:02:15 +01:00
{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"},
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"},
{"NAME": "weblate.accounts.password_validation.CharsPasswordValidator"},
{"NAME": "weblate.accounts.password_validation.PastPasswordsValidator"},
2019-08-22 22:29:05 +02:00
# Optional password strength validation by django-zxcvbn-password
# {
# 'NAME': 'zxcvbn_password.ZXCVBNValidator',
# 'OPTIONS': {
# 'min_score': 3,
# 'user_attributes': ('username', 'email', 'full_name')
# }
# },
]
# Allow new user registrations
REGISTRATION_OPEN = True
# Middleware
MIDDLEWARE = [
2020-10-28 12:02:15 +01:00
"weblate.middleware.ProxyMiddleware",
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.locale.LocaleMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"weblate.accounts.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
"social_django.middleware.SocialAuthExceptionMiddleware",
"weblate.accounts.middleware.RequireLoginMiddleware",
"weblate.middleware.SecurityMiddleware",
2019-08-22 22:29:05 +02:00
]
2020-10-28 12:02:15 +01:00
ROOT_URLCONF = "weblate.urls"
2019-08-22 22:29:05 +02:00
# Django and Weblate apps
2020-10-28 12:02:15 +01:00
INSTALLED_APPS = [
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.sites",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.admin.apps.SimpleAdminConfig",
"django.contrib.admindocs",
"django.contrib.sitemaps",
"django.contrib.humanize",
"social_django",
"crispy_forms",
"compressor",
"rest_framework",
"rest_framework.authtoken",
"weblate.addons",
"weblate.auth",
"weblate.checks",
"weblate.formats",
"weblate.machinery",
"weblate.trans",
"weblate.lang",
"weblate.langdata",
"weblate.memory",
"weblate.screenshots",
"weblate.fonts",
"weblate.accounts",
"weblate.utils",
"weblate.vcs",
"weblate.wladmin",
"weblate",
2019-08-22 22:29:05 +02:00
# Optional: Git exporter
2020-10-28 12:02:15 +01:00
"weblate.gitexport",
]
2019-08-22 22:29:05 +02:00
# Path to locales
2020-10-28 12:02:15 +01:00
LOCALE_PATHS = (os.path.join(BASE_DIR, "weblate", "locale"),)
2019-08-22 22:29:05 +02:00
# Custom exception reporter to include some details
2020-10-28 12:02:15 +01:00
DEFAULT_EXCEPTION_REPORTER_FILTER = "weblate.trans.debug.WeblateExceptionReporterFilter"
2019-08-22 22:29:05 +02:00
# Default logging of Weblate messages
# - to syslog in production (if available)
# - otherwise to console
# - you can also choose 'logfile' to log into separate file
# after configuring it below
# Detect if we can connect to syslog
HAVE_SYSLOG = False
2020-10-28 12:02:15 +01:00
if platform.system() != "Windows":
2019-08-22 22:29:05 +02:00
try:
2020-10-28 12:02:15 +01:00
handler = SysLogHandler(address="/dev/log", facility=SysLogHandler.LOG_LOCAL2)
2019-08-22 22:29:05 +02:00
handler.close()
HAVE_SYSLOG = True
except IOError:
HAVE_SYSLOG = False
if DEBUG or not HAVE_SYSLOG:
2020-10-28 12:02:15 +01:00
DEFAULT_LOG = "console"
2019-08-22 22:29:05 +02:00
else:
2020-10-28 12:02:15 +01:00
DEFAULT_LOG = "syslog"
2019-08-22 22:29:05 +02:00
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/stable/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
2020-10-28 12:02:15 +01:00
"version": 1,
"disable_existing_loggers": True,
"filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}},
"formatters": {
"syslog": {"format": "weblate[%(process)d]: %(levelname)s %(message)s"},
"simple": {"format": "%(levelname)s %(message)s"},
"logfile": {"format": "%(asctime)s %(levelname)s %(message)s"},
"django.server": {
"()": "django.utils.log.ServerFormatter",
"format": "[%(server_time)s] %(message)s",
2019-08-22 22:29:05 +02:00
},
},
2020-10-28 12:02:15 +01:00
"handlers": {
"mail_admins": {
"level": "ERROR",
"filters": ["require_debug_false"],
"class": "django.utils.log.AdminEmailHandler",
"include_html": True,
2019-08-22 22:29:05 +02:00
},
2020-10-28 12:02:15 +01:00
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "simple",
2019-08-22 22:29:05 +02:00
},
2020-10-28 12:02:15 +01:00
"django.server": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "django.server",
2019-08-22 22:29:05 +02:00
},
2020-10-28 12:02:15 +01:00
"syslog": {
"level": "DEBUG",
"class": "logging.handlers.SysLogHandler",
"formatter": "syslog",
"address": "/dev/log",
"facility": SysLogHandler.LOG_LOCAL2,
2019-08-22 22:29:05 +02:00
},
# Logging to a file
# 'logfile': {
# 'level':'DEBUG',
# 'class':'logging.handlers.RotatingFileHandler',
# 'filename': "/var/log/weblate/weblate.log",
# 'maxBytes': 100000,
# 'backupCount': 3,
# 'formatter': 'logfile',
# },
},
2020-10-28 12:02:15 +01:00
"loggers": {
"django.request": {
"handlers": ["mail_admins", DEFAULT_LOG],
"level": "ERROR",
"propagate": True,
2019-08-22 22:29:05 +02:00
},
2020-10-28 12:02:15 +01:00
"django.server": {
"handlers": ["django.server"],
"level": "INFO",
"propagate": False,
2019-08-22 22:29:05 +02:00
},
# Logging database queries
# 'django.db.backends': {
# 'handlers': [DEFAULT_LOG],
# 'level': 'DEBUG',
# },
2020-10-28 12:02:15 +01:00
"weblate": {"handlers": [DEFAULT_LOG], "level": "DEBUG"},
2019-08-22 22:29:05 +02:00
# Logging search operations
2020-10-28 12:02:15 +01:00
"weblate.search": {"handlers": [DEFAULT_LOG], "level": "INFO"},
2019-08-22 22:29:05 +02:00
# Logging VCS operations
2020-10-28 12:02:15 +01:00
"weblate.vcs": {"handlers": [DEFAULT_LOG], "level": "WARNING"},
# Python Social Auth
"social": {"handlers": [DEFAULT_LOG], "level": "DEBUG" if DEBUG else "WARNING"},
# Django Authentication Using LDAP
"django_auth_ldap": {
"level": "DEBUG" if DEBUG else "WARNING",
"handlers": [DEFAULT_LOG],
2019-08-22 22:29:05 +02:00
},
2020-10-28 12:02:15 +01:00
},
2019-08-22 22:29:05 +02:00
}
# Remove syslog setup if it's not present
if not HAVE_SYSLOG:
2020-10-28 12:02:15 +01:00
del LOGGING["handlers"]["syslog"]
2019-08-22 22:29:05 +02:00
# List of machine translations
# MT_SERVICES = (
# 'weblate.machinery.apertium.ApertiumAPYTranslation',
# 'weblate.machinery.baidu.BaiduTranslation',
# 'weblate.machinery.deepl.DeepLTranslation',
# 'weblate.machinery.glosbe.GlosbeTranslation',
# 'weblate.machinery.google.GoogleTranslation',
# 'weblate.machinery.microsoft.MicrosoftCognitiveTranslation',
# 'weblate.machinery.microsoftterminology.MicrosoftTerminologyService',
# 'weblate.machinery.mymemory.MyMemoryTranslation',
# 'weblate.machinery.netease.NeteaseSightTranslation',
# 'weblate.machinery.tmserver.AmagamaTranslation',
# 'weblate.machinery.tmserver.TMServerTranslation',
# 'weblate.machinery.yandex.YandexTranslation',
# 'weblate.machinery.weblatetm.WeblateTranslation',
# 'weblate.machinery.saptranslationhub.SAPTranslationHub',
# 'weblate.machinery.youdao.YoudaoTranslation',
# 'weblate.memory.machine.WeblateMemory',
# )
# Machine translation API keys
# URL of the Apertium APy server
MT_APERTIUM_APY = None
# DeepL API key
MT_DEEPL_KEY = None
# Microsoft Cognitive Services Translator API, register at
# https://portal.azure.com/
MT_MICROSOFT_COGNITIVE_KEY = None
# MyMemory identification email, see
# https://mymemory.translated.net/doc/spec.php
MT_MYMEMORY_EMAIL = None
# Optional MyMemory credentials to access private translation memory
MT_MYMEMORY_USER = None
MT_MYMEMORY_KEY = None
# Google API key for Google Translate API
MT_GOOGLE_KEY = None
# Baidu app key and secret
MT_BAIDU_ID = None
MT_BAIDU_SECRET = None
# Youdao Zhiyun app key and secret
MT_YOUDAO_ID = None
MT_YOUDAO_SECRET = None
# Netease Sight (Jianwai) app key and secret
MT_NETEASE_KEY = None
MT_NETEASE_SECRET = None
# API key for Yandex Translate API
MT_YANDEX_KEY = None
# tmserver URL
MT_TMSERVER = None
# SAP Translation Hub
MT_SAP_BASE_URL = None
MT_SAP_SANDBOX_APIKEY = None
MT_SAP_USERNAME = None
MT_SAP_PASSWORD = None
MT_SAP_USE_MT = True
# Title of site to use
2020-10-28 12:02:15 +01:00
SITE_TITLE = "Weblate"
2019-08-22 22:29:05 +02:00
# Whether site uses https
ENABLE_HTTPS = True
# Use HTTPS when creating redirect URLs for social authentication, see
# documentation for more details:
# https://python-social-auth-docs.readthedocs.io/en/latest/configuration/settings.html#processing-redirects-and-urlopen
SOCIAL_AUTH_REDIRECT_IS_HTTPS = ENABLE_HTTPS
# Make CSRF cookie HttpOnly, see documentation for more details:
# https://docs.djangoproject.com/en/1.11/ref/settings/#csrf-cookie-httponly
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_SECURE = ENABLE_HTTPS
# Store CSRF token in session
CSRF_USE_SESSIONS = True
# Customize CSRF failure view
2020-10-28 12:02:15 +01:00
CSRF_FAILURE_VIEW = "weblate.trans.views.error.csrf_failure"
2019-08-22 22:29:05 +02:00
SESSION_COOKIE_SECURE = ENABLE_HTTPS
# SSL redirect
SECURE_SSL_REDIRECT = ENABLE_HTTPS
2020-10-28 12:02:15 +01:00
# Sent referrrer only for same origin links
SECURE_REFERRER_POLICY = "same-origin"
2019-08-22 22:29:05 +02:00
# SSL redirect URL exemption list
2020-10-28 12:02:15 +01:00
SECURE_REDIRECT_EXEMPT = (r"healthz/$",) # Allowing HTTP access to health check
2019-08-22 22:29:05 +02:00
# Session cookie age (in seconds)
SESSION_COOKIE_AGE = 1209600
2020-10-28 12:02:15 +01:00
# Increase allowed upload size
DATA_UPLOAD_MAX_MEMORY_SIZE = 50000000
2019-08-22 22:29:05 +02:00
# Some security headers
SECURE_BROWSER_XSS_FILTER = True
2020-10-28 12:02:15 +01:00
X_FRAME_OPTIONS = "DENY"
2019-08-22 22:29:05 +02:00
SECURE_CONTENT_TYPE_NOSNIFF = True
# Optionally enable HSTS
2020-10-28 12:02:15 +01:00
SECURE_HSTS_SECONDS = 0
SECURE_HSTS_PRELOAD = False
2019-08-22 22:29:05 +02:00
SECURE_HSTS_INCLUDE_SUBDOMAINS = False
# URL of login
2020-10-28 12:02:15 +01:00
LOGIN_URL = "{0}/accounts/login/".format(URL_PREFIX)
2019-08-22 22:29:05 +02:00
# URL of logout
2020-10-28 12:02:15 +01:00
LOGOUT_URL = "{0}/accounts/logout/".format(URL_PREFIX)
2019-08-22 22:29:05 +02:00
# Default location for login
2020-10-28 12:02:15 +01:00
LOGIN_REDIRECT_URL = "{0}/".format(URL_PREFIX)
2019-08-22 22:29:05 +02:00
# Anonymous user name
2020-10-28 12:02:15 +01:00
ANONYMOUS_USER_NAME = "anonymous"
2019-08-22 22:29:05 +02:00
# Reverse proxy settings
2020-10-28 12:02:15 +01:00
IP_PROXY_HEADER = "HTTP_X_FORWARDED_FOR"
2019-08-22 22:29:05 +02:00
IP_BEHIND_REVERSE_PROXY = False
IP_PROXY_OFFSET = 0
# Sending HTML in mails
EMAIL_SEND_HTML = True
# Subject of emails includes site title
2020-10-28 12:02:15 +01:00
EMAIL_SUBJECT_PREFIX = "[{0}] ".format(SITE_TITLE)
2019-08-22 22:29:05 +02:00
# Enable remote hooks
ENABLE_HOOKS = True
# Number of nearby messages to show in each direction
NEARBY_MESSAGES = 5
# By default the length of a given translation is limited to the length of
# the source string * 10 characters. Set this option to False to allow longer
# translations (up to 10.000 characters)
LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH = True
# Use simple language codes for default language/country combinations
SIMPLIFY_LANGUAGES = True
# Render forms using bootstrap
2020-10-28 12:02:15 +01:00
CRISPY_TEMPLATE_PACK = "bootstrap3"
2019-08-22 22:29:05 +02:00
# List of quality checks
# CHECK_LIST = (
# 'weblate.checks.same.SameCheck',
# 'weblate.checks.chars.BeginNewlineCheck',
# 'weblate.checks.chars.EndNewlineCheck',
# 'weblate.checks.chars.BeginSpaceCheck',
# 'weblate.checks.chars.EndSpaceCheck',
2020-10-28 12:02:15 +01:00
# 'weblate.checks.chars.DoubleSpaceCheck',
2019-08-22 22:29:05 +02:00
# 'weblate.checks.chars.EndStopCheck',
# 'weblate.checks.chars.EndColonCheck',
# 'weblate.checks.chars.EndQuestionCheck',
# 'weblate.checks.chars.EndExclamationCheck',
# 'weblate.checks.chars.EndEllipsisCheck',
# 'weblate.checks.chars.EndSemicolonCheck',
# 'weblate.checks.chars.MaxLengthCheck',
# 'weblate.checks.chars.KashidaCheck',
2020-10-28 12:02:15 +01:00
# 'weblate.checks.chars.PuctuationSpacingCheck',
2019-08-22 22:29:05 +02:00
# 'weblate.checks.format.PythonFormatCheck',
# 'weblate.checks.format.PythonBraceFormatCheck',
# 'weblate.checks.format.PHPFormatCheck',
# 'weblate.checks.format.CFormatCheck',
# 'weblate.checks.format.PerlFormatCheck',
# 'weblate.checks.format.JavaScriptFormatCheck',
# 'weblate.checks.format.CSharpFormatCheck',
# 'weblate.checks.format.JavaFormatCheck',
# 'weblate.checks.format.JavaMessageFormatCheck',
# 'weblate.checks.angularjs.AngularJSInterpolationCheck',
# 'weblate.checks.qt.QtFormatCheck',
# 'weblate.checks.qt.QtPluralCheck',
# 'weblate.checks.ruby.RubyFormatCheck',
# 'weblate.checks.consistency.PluralsCheck',
# 'weblate.checks.consistency.SamePluralsCheck',
# 'weblate.checks.consistency.ConsistencyCheck',
# 'weblate.checks.consistency.TranslatedCheck',
2020-10-28 12:02:15 +01:00
# 'weblate.checks.chars.EscapedNewlineCountingCheck',
# 'weblate.checks.chars.NewLineCountCheck',
2019-08-22 22:29:05 +02:00
# 'weblate.checks.markup.BBCodeCheck',
# 'weblate.checks.chars.ZeroWidthSpaceCheck',
# 'weblate.checks.render.MaxSizeCheck',
# 'weblate.checks.markup.XMLValidityCheck',
# 'weblate.checks.markup.XMLTagsCheck',
# 'weblate.checks.markup.MarkdownRefLinkCheck',
# 'weblate.checks.markup.MarkdownLinkCheck',
# 'weblate.checks.markup.MarkdownSyntaxCheck',
# 'weblate.checks.markup.URLCheck',
2020-10-28 12:02:15 +01:00
# 'weblate.checks.markup.SafeHTMLCheck',
# 'weblate.checks.placeholders.PlaceholderCheck',
# 'weblate.checks.placeholders.RegexCheck',
2019-08-22 22:29:05 +02:00
# 'weblate.checks.source.OptionalPluralCheck',
# 'weblate.checks.source.EllipsisCheck',
# 'weblate.checks.source.MultipleFailingCheck',
# )
# List of automatic fixups
# AUTOFIX_LIST = (
# 'weblate.trans.autofixes.whitespace.SameBookendingWhitespace',
# 'weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis',
# 'weblate.trans.autofixes.chars.RemoveZeroSpace',
# 'weblate.trans.autofixes.chars.RemoveControlChars',
# )
# List of enabled addons
# WEBLATE_ADDONS = (
# 'weblate.addons.gettext.GenerateMoAddon',
# 'weblate.addons.gettext.UpdateLinguasAddon',
# 'weblate.addons.gettext.UpdateConfigureAddon',
# 'weblate.addons.gettext.MsgmergeAddon',
# 'weblate.addons.gettext.GettextCustomizeAddon',
# 'weblate.addons.gettext.GettextAuthorComments',
# 'weblate.addons.cleanup.CleanupAddon',
# 'weblate.addons.consistency.LangaugeConsistencyAddon',
# 'weblate.addons.discovery.DiscoveryAddon',
# 'weblate.addons.flags.SourceEditAddon',
# 'weblate.addons.flags.TargetEditAddon',
# 'weblate.addons.flags.SameEditAddon',
2020-10-28 12:02:15 +01:00
# "weblate.addons.flags.BulkEditAddon",
2019-08-22 22:29:05 +02:00
# 'weblate.addons.generate.GenerateFileAddon',
# 'weblate.addons.json.JSONCustomizeAddon',
# 'weblate.addons.properties.PropertiesSortAddon',
# 'weblate.addons.git.GitSquashAddon',
# 'weblate.addons.removal.RemoveComments',
# 'weblate.addons.removal.RemoveSuggestions',
2020-10-28 12:02:15 +01:00
# 'weblate.addons.resx.ResxUpdateAddon',
# 'weblate.addons.yaml.YAMLCustomizeAddon',
# 'weblate.addons.autotranslate.AutoTranslateAddon',
2019-08-22 22:29:05 +02:00
# )
# E-mail address that error messages come from.
2020-10-28 12:02:15 +01:00
SERVER_EMAIL = "noreply@__DOMAIN__"
2019-08-22 22:29:05 +02:00
# Default email address to use for various automated correspondence from
# the site managers. Used for registration emails.
2020-10-28 12:02:15 +01:00
DEFAULT_FROM_EMAIL = "__ADMINMAIL__"
2019-08-22 22:29:05 +02:00
# List of URLs your site is supposed to serve
2020-10-28 12:02:15 +01:00
ALLOWED_HOSTS = ["__DOMAIN__"]
2019-08-22 22:29:05 +02:00
2020-10-28 12:02:15 +01:00
# Configuration for caching
2019-08-22 22:29:05 +02:00
CACHES = {
2020-10-28 12:02:15 +01:00
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/__REDIS_DB__",
# If redis is running on same host as Weblate, you might
# want to use unix sockets instead:
# 'LOCATION': 'unix:///var/run/redis/redis.sock?db=1',
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PARSER_CLASS": "redis.connection.HiredisParser",
"PASSWORD": None,
"CONNECTION_POOL_KWARGS": {},
},
"KEY_PREFIX": "weblate",
},
"avatar": {
"BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
"LOCATION": os.path.join(DATA_DIR, "avatar-cache"),
"TIMEOUT": 86400,
"OPTIONS": {"MAX_ENTRIES": 1000},
},
}
# Store sessions in cache
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
2019-08-22 22:29:05 +02:00
# REST framework settings for API
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
2020-10-28 12:02:15 +01:00
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticatedOrReadOnly"
# Use following with LOGIN_REQUIRED_URLS
# "rest_framework.permissions.IsAuthenticated"
2019-08-22 22:29:05 +02:00
],
2020-10-28 12:02:15 +01:00
"DEFAULT_AUTHENTICATION_CLASSES": (
"rest_framework.authentication.TokenAuthentication",
"weblate.api.authentication.BearerAuthentication",
"rest_framework.authentication.SessionAuthentication",
2019-08-22 22:29:05 +02:00
),
2020-10-28 12:02:15 +01:00
"DEFAULT_THROTTLE_CLASSES": (
"rest_framework.throttling.AnonRateThrottle",
"rest_framework.throttling.UserRateThrottle",
2019-08-22 22:29:05 +02:00
),
2020-10-28 12:02:15 +01:00
"DEFAULT_THROTTLE_RATES": {"anon": "100/day", "user": "5000/hour"},
"DEFAULT_PAGINATION_CLASS": ("rest_framework.pagination.PageNumberPagination"),
"PAGE_SIZE": 20,
"VIEW_DESCRIPTION_FUNCTION": "weblate.api.views.get_view_description",
"UNAUTHENTICATED_USER": "weblate.auth.models.get_anonymous",
2019-08-22 22:29:05 +02:00
}
# Example for restricting access to logged in users
# LOGIN_REQUIRED_URLS = (
# r'/(.*)$',
# )
# In such case you will want to include some of the exceptions
# LOGIN_REQUIRED_URLS_EXCEPTIONS = (
# r'/accounts/(.*)$', # Required for login
# r'/admin/login/(.*)$', # Required for admin login
# r'/static/(.*)$', # Required for development mode
# r'/widgets/(.*)$', # Allowing public access to widgets
# r'/data/(.*)$', # Allowing public access to data exports
# r'/hooks/(.*)$', # Allowing public access to notification hooks
# r'/healthz/$', # Allowing public access to health check
# r'/api/(.*)$', # Allowing access to API
# r'/js/i18n/$', # JavaScript localization
# r'/contact/$', # Optional for contact form
# r'/legal/(.*)$', # Optional for legal app
# )
# Silence some of the Django system checks
SILENCED_SYSTEM_CHECKS = [
# We have modified django.contrib.auth.middleware.AuthenticationMiddleware
# as weblate.accounts.middleware.AuthenticationMiddleware
2020-10-28 12:02:15 +01:00
"admin.E408"
2019-08-22 22:29:05 +02:00
]
# Celery worker configuration for testing
# CELERY_TASK_ALWAYS_EAGER = True
# CELERY_BROKER_URL = 'memory://'
# CELERY_TASK_EAGER_PROPAGATES = True
# Celery worker configuration for production
CELERY_TASK_ALWAYS_EAGER = False
2020-10-28 12:02:15 +01:00
CELERY_BROKER_URL = "redis://127.0.0.1:6379"
2019-08-22 22:29:05 +02:00
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
# Celery settings, it is not recommended to change these
CELERY_WORKER_MAX_MEMORY_PER_CHILD = 200000
2020-10-28 12:02:15 +01:00
CELERY_BEAT_SCHEDULE_FILENAME = os.path.join(DATA_DIR, "celery", "beat-schedule")
2019-08-22 22:29:05 +02:00
CELERY_TASK_ROUTES = {
2020-10-28 12:02:15 +01:00
"weblate.trans.search.*": {"queue": "search"},
"weblate.trans.tasks.optimize_fulltext": {"queue": "search"},
"weblate.trans.tasks.cleanup_fulltext": {"queue": "search"},
"weblate.trans.tasks.auto_translate": {"queue": "translate"},
"weblate.memory.tasks.*": {"queue": "memory"},
"weblate.accounts.tasks.notify_*": {"queue": "notify"},
"weblate.accounts.tasks.send_mails": {"queue": "notify"},
"weblate.memory.tasks.memory_backup": {"queue": "backup"},
"weblate.utils.tasks.settings_backup": {"queue": "backup"},
"weblate.utils.tasks.database_backup": {"queue": "backup"},
"weblate.wladmin.tasks.backup": {"queue": "backup"},
"weblate.wladmin.tasks.backup_service": {"queue": "backup"},
2019-08-22 22:29:05 +02:00
}
2020-10-28 12:02:15 +01:00
# Enable plain database backups
DATABASE_BACKUP = "plain"
# Enable auto updating
AUTO_UPDATE = False
# PGP commits signing
WEBLATE_GPG_IDENTITY = None
# Third party services integration
MATOMO_SITE_ID = None
MATOMO_URL = None
GOOGLE_ANALYTICS_ID = None
SENTRY_DSN = None
AKISMET_API_KEY = None