[API] don't encode query string
[mygpo.git] / mygpo / settings.py
bloba69c482259f5a0a320e87a977b25efffd19e6489
1 # Django settings for mygpo project.
3 # This file is part of my.gpodder.org.
5 # my.gpodder.org is free software: you can redistribute it and/or modify it
6 # under the terms of the GNU Affero General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or (at your
8 # option) any later version.
10 # my.gpodder.org is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
13 # License for more details.
15 # You should have received a copy of the GNU Affero General Public License
16 # along with my.gpodder.org. If not, see <http://www.gnu.org/licenses/>.
19 import sys
20 import os.path
21 import dj_database_url
23 BASE_DIR = os.path.dirname(os.path.abspath(__file__))
25 # http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges#ChangedthewayURLpathsaredetermined
26 FORCE_SCRIPT_NAME=""
28 DEBUG = True
29 TEMPLATE_DEBUG = DEBUG
31 ADMINS = ()
33 MANAGERS = ADMINS
35 DATABASES = {
36 'default': dj_database_url.config(
37 default='postgres://mygpo:mygpo@localhost/mygpo'),
40 # Local time zone for this installation. Choices can be found here:
41 # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
42 # although not all choices may be available on all operating systems.
43 # If running in a Windows environment this must be set to the same as your
44 # system time zone.
45 TIME_ZONE = 'UTC'
47 # Language code for this installation. All choices can be found here:
48 # http://www.i18nguy.com/unicode/language-identifiers.html
49 LANGUAGE_CODE = 'en-us'
51 SITE_ID = 1
53 # If you set this to False, Django will make some optimizations so as not
54 # to load the internationalization machinery.
55 USE_I18N = True
57 STATIC_ROOT = 'staticfiles'
58 STATIC_URL = '/media/'
60 STATICFILES_DIRS = (
61 os.path.abspath(os.path.join(BASE_DIR, '..', 'htdocs', 'media')),
64 # List of callables that know how to import templates from various sources.
65 TEMPLATE_LOADERS = (
66 'django.template.loaders.app_directories.Loader',
69 MIDDLEWARE_CLASSES = (
70 'django.middleware.cache.UpdateCacheMiddleware',
71 'django.middleware.common.CommonMiddleware',
72 'django.middleware.csrf.CsrfViewMiddleware',
73 'django.middleware.cache.FetchFromCacheMiddleware',
74 'django.contrib.sessions.middleware.SessionMiddleware',
75 'django.contrib.auth.middleware.AuthenticationMiddleware',
76 'django.middleware.locale.LocaleMiddleware',
77 'django.contrib.messages.middleware.MessageMiddleware',
80 ROOT_URLCONF = 'mygpo.urls'
82 TEMPLATE_DIRS = ()
84 INSTALLED_APPS = (
85 'django.contrib.contenttypes',
86 'django.contrib.messages',
87 'django.contrib.admin',
88 'django.contrib.humanize',
89 'django.contrib.auth',
90 'django.contrib.sessions',
91 'django.contrib.staticfiles',
92 'djcelery',
93 'mygpo.core',
94 'mygpo.podcasts',
95 'mygpo.chapters',
96 'mygpo.search',
97 'mygpo.users',
98 'mygpo.api',
99 'mygpo.web',
100 'mygpo.publisher',
101 'mygpo.subscriptions',
102 'mygpo.history',
103 'mygpo.favorites',
104 'mygpo.usersettings',
105 'mygpo.data',
106 'mygpo.userfeeds',
107 'mygpo.suggestions',
108 'mygpo.directory',
109 'mygpo.categories',
110 'mygpo.episodestates',
111 'mygpo.maintenance',
112 'mygpo.share',
113 'mygpo.administration',
114 'mygpo.pubsub',
115 'mygpo.podcastlists',
116 'mygpo.votes',
119 try:
120 import debug_toolbar
121 INSTALLED_APPS += ('debug_toolbar', )
123 except ImportError:
124 print('Could not load django-debug-toolbar', file=sys.stderr)
127 try:
128 import opbeat
129 INSTALLED_APPS += ('opbeat.contrib.django', )
131 except ImportError:
132 pass
135 TEST_RUNNER = 'django.test.runner.DiscoverRunner'
137 ACCOUNT_ACTIVATION_DAYS = 7
139 AUTHENTICATION_BACKENDS = (
140 'django.contrib.auth.backends.ModelBackend',
141 'mygpo.web.auth.EmailAuthenticationBackend',
144 SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
146 # TODO: use (default) JSON serializer for security
147 # this would currently fail as we're (de)serializing datetime objects
148 # https://docs.djangoproject.com/en/1.5/topics/http/sessions/#session-serialization
149 SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
152 from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
154 TEMPLATE_CONTEXT_PROCESSORS += (
155 "mygpo.web.google.analytics",
156 "mygpo.web.google.adsense",
158 # make the debug variable available in templates
159 # https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-debug
160 "django.core.context_processors.debug",
162 # required so that the request obj can be accessed from templates.
163 # this is used to direct users to previous page after login
164 'django.core.context_processors.request',
167 MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
169 USER_CLASS = 'mygpo.users.models.User'
171 LOGIN_URL = '/login/'
173 CSRF_FAILURE_VIEW='mygpo.web.views.security.csrf_failure'
176 # The following entries should be set in settings_prod.py
177 DEFAULT_FROM_EMAIL = ''
178 SECRET_KEY = os.getenv('SECRET_KEY', '')
179 GOOGLE_ANALYTICS_PROPERTY_ID=''
180 DIRECTORY_EXCLUDED_TAGS = ()
181 FLICKR_API_KEY = ''
183 MAINTENANCE = os.path.exists(os.path.join(BASE_DIR, 'MAINTENANCE'))
186 LOGGING = {
187 'version': 1,
188 'disable_existing_loggers': True,
189 'formatters': {
190 'verbose': {
191 'format': '%(asctime)s %(name)s %(levelname)s %(message)s',
194 'filters': {
195 'require_debug_false': {
196 '()': 'django.utils.log.RequireDebugFalse'
199 'handlers': {
200 'console':{
201 'level': 'DEBUG',
202 'class': 'logging.StreamHandler',
203 'formatter': 'verbose'
205 'mail_admins': {
206 'level': 'ERROR',
207 'filters': ['require_debug_false'],
208 'class': 'django.utils.log.AdminEmailHandler'
211 'loggers': {
212 'django': {
213 'handlers': ['console'],
214 'propagate': True,
215 'level': 'WARN',
217 'mygpo': {
218 'handlers': ['console'],
219 'level': 'INFO',
221 'celery': {
222 'handlers': ['console'],
223 'level': 'DEBUG',
228 # minimum number of subscribers a podcast must have to be assigned a slug
229 PODCAST_SLUG_SUBSCRIBER_LIMIT = 10
231 # minimum number of subscribers that a podcast needs to "push" one of its
232 # categories to the top
233 MIN_SUBSCRIBERS_CATEGORY=10
235 # maximum number of episode actions that the API processes immediatelly before
236 # returning the response. Larger requests will be handled in background.
237 # Handler can be set to None to disable
238 API_ACTIONS_MAX_NONBG=100
239 API_ACTIONS_BG_HANDLER='mygpo.api.tasks.episode_actions_celery_handler'
242 ADSENSE_CLIENT = ''
243 ADSENSE_SLOT_BOTTOM = ''
245 # enabled access to staff-only areas with ?staff=<STAFF_TOKEN>
246 STAFF_TOKEN = None
248 # Flattr settings -- available after you register your app
249 FLATTR_KEY = ''
250 FLATTR_SECRET = ''
252 # Flattr thing of the webservice. Will be flattr'd when a user sets the "Auto-Flattr gpodder.net" option
253 FLATTR_MYGPO_THING='https://flattr.com/submit/auto?user_id=stefankoegl&url=http://gpodder.net'
255 # The User-Agent string used for outgoing HTTP requests
256 USER_AGENT = 'gpodder.net (+https://github.com/gpodder/mygpo)'
258 # Base URL of the website that is used if the actually used parameters is not
259 # available. Request handlers, for example, can access the requested domain.
260 # Code that runs in background can not do this, and therefore requires a
261 # default value. This should be set to something like 'http://example.com'
262 DEFAULT_BASE_URL = ''
265 ### Celery
267 BROKER_URL='redis://localhost'
268 CELERY_RESULT_BACKEND='redis://localhost'
270 #CELERY_SEND_TASK_ERROR_EMAILS = True
271 SERVER_EMAIL = "no-reply@example.com"
274 ### Google API
276 GOOGLE_CLIENT_ID=''
277 GOOGLE_CLIENT_SECRET=''
279 # URL where users of the site can get support
280 SUPPORT_URL=''
283 FEEDSERVICE_URL = os.getenv('FEEDSERVICE_URL', 'http://feeds.gpodder.net/')
285 # Elasticsearch settings
287 ELASTICSEARCH_SERVER = os.getenv('ELASTICSEARCH_SERVER', '127.0.0.1:9200')
288 ELASTICSEARCH_INDEX = os.getenv('ELASTICSEARCH_INDEX', 'mygpo')
289 ELASTICSEARCH_TIMEOUT = float(os.getenv('ELASTICSEARCH_TIMEOUT', '2'))
291 # time for how long an activation is valid; after that, an unactivated user
292 # will be deleted
293 ACTIVATION_VALID_DAYS = int(os.getenv('ACTIVATION_VALID_DAYS', 10))
295 import sys
296 if 'test' in sys.argv:
297 SECRET_KEY = 'test'
300 INTERNAL_IPS = os.getenv('INTERNAL_IPS', '').split()
302 try:
303 from .settings_prod import *
304 except ImportError as e:
305 import sys
306 print('create settings_prod.py with your customized settings', file=sys.stderr)