Allow redirecting to development installs of Blender Cloud
[blender-id.git] / blenderid / common_settings.py
1 """
2 Django settings for blenderid project.
3
4 Generated by 'django-admin startproject' using Django 1.9.10.
5
6 For more information on this file, see
7 https://docs.djangoproject.com/en/1.9/topics/settings/
8
9 For the full list of settings and their values, see
10 https://docs.djangoproject.com/en/1.9/ref/settings/
11 """
12
13 import datetime
14 import pathlib
15 import pytz
16 from django.urls import reverse_lazy
17
18 BASE_DIR = pathlib.Path(__file__).absolute().parent.parent
19
20 # Quick-start development settings - unsuitable for production
21 # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/
22
23 # SECURITY WARNING: keep the secret key used in production secret!
24 SECRET_KEY = '-secret-'
25
26 # SECURITY WARNING: don't run with debug turned on in production!
27 DEBUG = False
28
29 ALLOWED_HOSTS = []
30 SITE_ID = 1
31
32 # Application definition
33
34 INSTALLED_APPS = [
35     'django.contrib.admin',
36     'django.contrib.admindocs',
37     'django.contrib.auth',
38     'django.contrib.contenttypes',
39     'django.contrib.sessions',
40     'django.contrib.messages',
41     'django.contrib.staticfiles',
42     'django.contrib.sites',
43     'django.contrib.flatpages',
44     'debug_toolbar',
45     'oauth2_provider',
46     'django_gravatar',
47     'sorl.thumbnail',
48     'django_admin_select2',
49     'loginas',
50     'bid_main',
51     'bid_api',
52     'bid_addon_support',
53 ]
54
55 MIDDLEWARE = [
56     'django.middleware.security.SecurityMiddleware',
57     'django.contrib.sessions.middleware.SessionMiddleware',
58     'django.middleware.common.CommonMiddleware',
59     'django.middleware.csrf.CsrfViewMiddleware',
60     'django.contrib.auth.middleware.AuthenticationMiddleware',
61     'django.contrib.messages.middleware.MessageMiddleware',
62     'django.middleware.clickjacking.XFrameOptionsMiddleware',
63     'debug_toolbar.middleware.DebugToolbarMiddleware',
64     'oauth2_provider.middleware.OAuth2TokenMiddleware',
65 ]
66
67 AUTHENTICATION_BACKENDS = [
68     'oauth2_provider.backends.OAuth2Backend',
69     'django.contrib.auth.backends.ModelBackend',
70 ]
71
72 ROOT_URLCONF = 'blenderid.urls'
73
74 TEMPLATES = [
75     {
76         'BACKEND': 'django.template.backends.django.DjangoTemplates',
77         'DIRS': [BASE_DIR / 'templates'],
78         'APP_DIRS': True,
79         'OPTIONS': {
80             'context_processors': [
81                 'django.template.context_processors.debug',
82                 'django.template.context_processors.request',
83                 'django.contrib.auth.context_processors.auth',
84                 'django.contrib.messages.context_processors.messages',
85                 'bid_main.context_processors.settings',
86             ],
87         },
88     },
89 ]
90
91 WSGI_APPLICATION = 'blenderid.wsgi.application'
92
93 # Database
94 # https://docs.djangoproject.com/en/1.9/ref/settings/#databases
95 DATABASES = {
96     'default': {
97         'ENGINE': 'django.db.backends.mysql',
98         'NAME': 'database-name',
99         'USER': 'username',
100         'PASSWORD': 'password',
101         'HOST': 'mysql',
102         'PORT': '3306',
103     }
104 }
105
106 # Password validation
107 # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
108
109 AUTH_PASSWORD_VALIDATORS = [
110     {
111         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
112     },
113     {
114         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
115     },
116     {
117         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
118     },
119     {
120         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
121     },
122 ]
123
124 # Internationalization
125 # https://docs.djangoproject.com/en/1.9/topics/i18n/
126
127 LANGUAGE_CODE = 'en-us'
128
129 TIME_ZONE = 'CET'
130 DATE_FORMAT = 'd-b-Y (D)'
131 TIME_FORMAT = 'H:i:s'
132 DATETIME_FORMAT = f'd-b-Y, H:i'
133 SHORT_DATE_FORMAT = 'Y-m-d'
134 SHORT_DATETIME_FORMAT = f'{SHORT_DATE_FORMAT}, H:i'
135
136 USE_I18N = True
137
138 USE_L10N = False
139
140 USE_TZ = True
141
142 # Static files (CSS, JavaScript, Images)
143 # https://docs.djangoproject.com/en/1.10/howto/static-files/
144 STATIC_URL = '/static/'
145 STATICFILES_DIRS = [BASE_DIR / 'webstatic']
146 STATIC_ROOT = BASE_DIR / 'static'
147
148 # Uploaded files
149 # https://docs.djangoproject.com/en/2.0/ref/settings/#std:setting-MEDIA_ROOT
150 MEDIA_URL = '/media/'
151 MEDIA_ROOT = BASE_DIR / 'media'  # may not be inside STATIC_ROOT
152
153 BLENDER_ID_ADDON_CLIENT_ID = '-secret-'
154
155 # Defining one of those means you have to define them all.
156 OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL = 'bid_main.OAuth2AccessToken'
157 OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = 'bid_main.OAuth2RefreshToken'
158 OAUTH2_PROVIDER_APPLICATION_MODEL = 'bid_main.OAuth2Application'
159
160 OAUTH2_PROVIDER = {
161     'SCOPES': {
162         'email': 'Default scope',
163         'badge': "Read access to the user's badges",
164     },
165
166     'ALLOWED_REDIRECT_URI_SCHEMES': ['https'],
167     'REQUEST_APPROVAL_PROMPT': 'auto',
168     'ACCESS_TOKEN_EXPIRE_SECONDS': 3600 * 24 * 31,  # keep for a month
169     'REFRESH_TOKEN_EXPIRE_SECONDS': 3600 * 24 * 31,  # keep for a month
170     'ACCESS_TOKEN_MODEL': OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL,
171     'REFRESH_TOKEN_MODEL': OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL,
172     'APPLICATION_MODEL': OAUTH2_PROVIDER_APPLICATION_MODEL,
173 }
174
175 # This is required for compatibility with Blender Cloud, as it performs
176 # a POST request to /oauth/token.
177 APPEND_SLASH = False
178
179 # Read https://docs.djangoproject.com/en/1.9/topics/auth/passwords/#password-upgrading
180 # before removing any password hasher from this list.
181 PASSWORD_HASHERS = [
182     'bid_main.hashers.BlenderIdPasswordHasher',
183     'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
184     'django.contrib.auth.hashers.BCryptPasswordHasher',
185     'django.contrib.auth.hashers.PBKDF2PasswordHasher',
186     'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
187 ]
188
189 AUTH_USER_MODEL = 'bid_main.User'
190 LOGIN_URL = 'bid_main:login'
191 LOGIN_REDIRECT_URL = 'bid_main:index'
192 LOGOUT_URL = reverse_lazy('bid_main:logout')
193
194 # Hosts that we allow redirecting to with a next=xxx parameter on the /login and /switch
195 # endpoints. This is a limited set for security reasons.
196 NEXT_REDIR_AFTER_LOGIN_ALLOWED_HOSTS = {
197     'cloud.local:5000', 'cloud.local:5001',
198     'cloud.blender.org', 'blender.cloud',
199     'blender.community',
200 }
201
202 CSRF_FAILURE_VIEW = 'bid_main.views.errors.csrf_failure'
203
204
205 # Privacy Policy date; anyone who agreed to the privacy policy before this date
206 # (or never) will be presented with an agreement prompt and has to agree before
207 # being able to use the website.
208 PPDATE = datetime.datetime(2018, 5, 18, 0, 0, 0, tzinfo=pytz.utc)
209
210 BLENDER_MYDATA_BASE_URL = 'https://mydata.blender.org/'
211
212 # The cache is used by the thumbnailing system of sorl-thumbnail.
213 # Without it, every badge will be resized on every request.
214 # Using Redis or Memcached would be preferred, but requires more changes on
215 # the www.blender.org server than I (Sybren) want to make now.
216 CACHES = {
217     'default': {
218         'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
219         'LOCATION': 'cache',  # The table name.
220     }
221 }