addons-server/settings.py

1077 строки
35 KiB
Python
Исходник Обычный вид История

2010-01-15 05:10:59 +03:00
# -*- coding: utf-8 -*-
2009-10-21 03:29:27 +04:00
# Django settings for zamboni project.
2009-10-21 06:19:17 +04:00
import os
2009-12-16 02:53:21 +03:00
import logging
import socket
2009-12-16 02:53:21 +03:00
from django.utils.functional import lazy
try:
# If we have build ids available, we'll grab them here and add them to our
# CACHE_PREFIX. This will let us not have to flush memcache during updates
# and it will let us preload data into it before a production push.
from build import BUILD_ID_CSS, BUILD_ID_JS
build_id = "%s%s" % (BUILD_ID_CSS[:2], BUILD_ID_JS[:2])
except ImportError:
build_id = ""
2009-12-16 02:53:21 +03:00
# Make filepaths relative to settings.
2009-10-21 06:19:17 +04:00
ROOT = os.path.dirname(os.path.abspath(__file__))
path = lambda *a: os.path.join(ROOT, *a)
# We need to track this because hudson can't just call its checkout "zamboni".
# It puts it in a dir called "workspace". Way to be, hudson.
ROOT_PACKAGE = os.path.basename(ROOT)
2009-10-21 03:29:27 +04:00
DEBUG = True
TEMPLATE_DEBUG = DEBUG
DEBUG_PROPAGATE_EXCEPTIONS = True
2009-10-21 03:29:27 +04:00
2011-06-18 01:49:03 +04:00
# Skip indexing ES to speed things up?
SKIP_SEARCH_INDEX = False
2011-04-11 21:49:58 +04:00
# LESS CSS OPTIONS (Debug only)
LESS_PREPROCESS = False # Compile LESS with Node, rather than client-side JS?
LESS_LIVE_REFRESH = False # Refresh the CSS on save?
LESS_BIN = 'lessc'
2009-10-21 03:29:27 +04:00
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
2010-10-13 01:08:26 +04:00
FLIGTAR = 'amo-admins@mozilla.org'
EDITORS_EMAIL = 'amo-editors@mozilla.org'
SENIOR_EDITORS_EMAIL = 'amo-admin-reviews@mozilla.org'
2010-10-13 01:08:26 +04:00
2010-01-08 03:49:46 +03:00
DATABASES = {
'default': {
2010-01-09 01:29:16 +03:00
'NAME': 'zamboni',
2010-01-08 03:49:46 +03:00
'ENGINE': 'django.db.backends.mysql',
'HOST': '',
'PORT': '',
'USER': '',
'PASSWORD': '',
'OPTIONS': {'init_command': 'SET storage_engine=InnoDB'},
'TEST_CHARSET': 'utf8',
'TEST_COLLATION': 'utf8_general_ci',
2010-01-08 03:49:46 +03:00
},
}
2011-02-25 04:11:56 +03:00
# A database to be used by the services scripts, which does not use Django.
# The settings can be copied from DATABASES, but since its not a full Django
# database connection, only some values are supported.
SERVICES_DATABASE = {
'NAME': 'zamboni',
'USER': '',
'PASSWORD': '',
'HOST': '',
}
DATABASE_ROUTERS = ('multidb.PinningMasterSlaveRouter',)
2010-01-26 07:49:23 +03:00
2010-01-08 03:49:46 +03:00
# Put the aliases for your slave databases in this list.
SLAVE_DATABASES = []
2009-10-21 03:29:27 +04: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.
# If running in a Windows environment this must be set to the same as your
# system time zone.
2009-10-21 06:19:39 +04:00
TIME_ZONE = 'America/Los_Angeles'
2009-10-21 03:29:27 +04:00
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-US'
# Accepted locales
AMO_LANGUAGES = (
2010-07-15 21:21:38 +04:00
'af', 'ar', 'bg', 'ca', 'cs', 'da', 'de', 'el', 'en-US', 'es-ES',
2010-06-10 19:56:00 +04:00
'eu', 'fa', 'fi', 'fr', 'ga-IE', 'he', 'hu', 'id', 'it', 'ja', 'ko', 'mn',
2011-06-13 23:28:04 +04:00
'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sl', 'sq', 'sv-SE',
2011-06-06 21:43:17 +04:00
'tr', 'uk', 'vi', 'zh-CN', 'zh-TW',
)
2011-08-02 02:01:30 +04:00
def lazy_langs():
from product_details import product_details
if not product_details.languages:
return {}
return dict([(i.lower(), product_details.languages[i]['native'])
for i in AMO_LANGUAGES])
# Where product details are stored see django-mozilla-product-details
PROD_DETAILS_DIR = path('lib/product_json')
# Override Django's built-in with our native names
LANGUAGES = lazy(lazy_langs, dict)()
RTL_LANGUAGES = ('ar', 'fa', 'fa-IR', 'he')
2009-10-21 03:29:27 +04:00
LANGUAGE_URL_MAP = dict([(i.lower(), i) for i in AMO_LANGUAGES])
2009-10-21 03:29:27 +04:00
2011-02-08 04:03:29 +03:00
# Tower / L10n
2011-05-25 21:41:36 +04:00
LOCALE_PATHS = (path('locale'),)
2010-12-23 01:32:03 +03:00
TEXT_DOMAIN = 'messages'
2011-02-08 04:03:29 +03:00
STANDALONE_DOMAINS = [TEXT_DOMAIN, 'javascript']
TOWER_KEYWORDS = {
'_lazy': None,
}
2011-05-25 21:41:36 +04:00
TOWER_ADD_HEADERS = True
2009-10-21 03:29:27 +04:00
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# The host currently running the site. Only use this in code for good reason;
# the site is designed to run on a cluster and should continue to support that
HOSTNAME = socket.gethostname()
2010-03-18 00:23:48 +03:00
# The front end domain of the site. If you're not running on a cluster this
# might be the same as HOSTNAME but don't depend on that. Use this when you
# need the real domain.
DOMAIN = HOSTNAME
# Full base URL for your main site including protocol. No trailing slash.
# Example: https://addons.mozilla.org
2010-03-18 00:23:48 +03:00
SITE_URL = 'http://%s' % DOMAIN
# Domain of the services site. This is where your API, and in-product pages
# live.
SERVICES_DOMAIN = 'services.%s' % DOMAIN
# Full URL to your API service. No trailing slash.
# Example: https://services.addons.mozilla.org
SERVICES_URL = 'http://%s' % SERVICES_DOMAIN
# When True, the addon API should include performance data.
API_SHOW_PERF_DATA = True
# The domain of the mobile site.
MOBILE_DOMAIN = 'm.%s' % DOMAIN
# The full url of the mobile site.
MOBILE_SITE_URL = 'http://%s' % MOBILE_DOMAIN
2010-08-27 21:07:16 +04:00
OAUTH_CALLBACK_VIEW = 'api.views.request_token_ready'
2009-10-21 03:29:27 +04:00
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
2009-10-21 06:19:39 +04:00
MEDIA_ROOT = path('media')
2009-10-21 03:29:27 +04:00
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = '/media/'
2009-10-21 03:29:27 +04:00
# Absolute path to a temporary storage area
TMP_PATH = path('tmp')
# Absolute path to a writable directory shared by all servers. No trailing
2010-09-15 00:22:33 +04:00
# slash. Example: /data/
NETAPP_STORAGE = TMP_PATH
2010-09-14 21:09:07 +04:00
2010-09-15 00:22:33 +04:00
# File path for storing XPI/JAR files (or any files associated with an
# add-on). Example: /mnt/netapp_amo/addons.mozilla.org-remora/files
ADDONS_PATH = NETAPP_STORAGE + '/addons'
2010-09-14 21:09:07 +04:00
2011-01-27 05:20:40 +03:00
# Like ADDONS_PATH but protected by the app. Used for storing files that should
# not be publicly accessible (like disabled add-ons).
GUARDED_ADDONS_PATH = NETAPP_STORAGE + '/guarded-addons'
2010-06-17 00:53:24 +04:00
# Absolute path to a writable directory shared by all servers. No trailing
# slash.
# Example: /data/uploads
UPLOADS_PATH = NETAPP_STORAGE + '/uploads'
# File path for add-on files that get rsynced to mirrors.
# /mnt/netapp_amo/addons.mozilla.org-remora/public-staging
MIRROR_STAGE_PATH = NETAPP_STORAGE + '/public-staging'
2009-10-21 03:29:27 +04:00
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
2009-10-21 06:19:39 +04:00
ADMIN_MEDIA_PREFIX = '/admin-media/'
2009-10-21 03:29:27 +04:00
# paths that don't require an app prefix
2010-07-15 21:21:38 +04:00
SUPPORTED_NONAPPS = ('admin', 'developers', 'editors', 'img',
2010-10-22 02:54:23 +04:00
'jsi18n', 'localizers', 'media', 'robots.txt',
2011-02-23 03:53:24 +03:00
'statistics', 'services', 'blocklist')
DEFAULT_APP = 'firefox'
# paths that don't require a locale prefix
2010-11-23 03:34:59 +03:00
SUPPORTED_NONLOCALES = ('img', 'media', 'robots.txt', 'services', 'downloads',
2011-02-23 03:53:24 +03:00
'blocklist')
2009-10-21 03:29:27 +04:00
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'r#%9w^o_80)7f%!_ir5zx$tu3mupw9u%&s!)-_q%gy7i+fhx#)'
# Templates
2009-10-21 03:29:27 +04:00
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
2010-11-17 03:45:22 +03:00
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
2009-10-21 03:29:27 +04:00
)
TEMPLATE_CONTEXT_PROCESSORS = (
2010-11-17 03:45:22 +03:00
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.media',
'django.core.context_processors.request',
'session_csrf.context_processor',
'django.contrib.messages.context_processors.messages',
'amo.context_processors.app',
'amo.context_processors.i18n',
'amo.context_processors.global_settings',
2011-05-03 20:48:25 +04:00
'amo.context_processors.static_url',
2011-07-30 02:39:44 +04:00
'webapps.context_processors.is_webapps',
2010-05-14 04:26:15 +04:00
'jingo_minify.helpers.build_ids',
)
TEMPLATE_DIRS = (
path('templates'),
)
def JINJA_CONFIG():
import jinja2
from django.conf import settings
2011-03-01 07:55:21 +03:00
from django.core.cache import cache
config = {'extensions': ['tower.template.i18n', 'amo.ext.cache',
'jinja2.ext.do',
'jinja2.ext.with_', 'jinja2.ext.loopcontrols'],
'finalize': lambda x: x if x is not None else ''}
2011-03-01 08:21:22 +03:00
if False and not settings.DEBUG:
# We're passing the _cache object directly to jinja because
# Django can't store binary directly; it enforces unicode on it.
# Details: http://jinja.pocoo.org/2/documentation/api#bytecode-cache
# and in the errors you get when you try it the other way.
bc = jinja2.MemcachedBytecodeCache(cache._cache,
"%sj2:" % settings.CACHE_PREFIX)
config['cache_size'] = -1 # Never clear the cache
config['bytecode_cache'] = bc
return config
2009-10-21 03:29:27 +04:00
MIDDLEWARE_CLASSES = (
# AMO URL middleware comes first so everyone else sees nice URLs.
2010-07-02 02:00:17 +04:00
'amo.middleware.TimingMiddleware',
2011-06-15 01:17:24 +04:00
'commonware.response.middleware.GraphiteRequestTimingMiddleware',
'commonware.response.middleware.GraphiteMiddleware',
'amo.middleware.LocaleAndAppURLMiddleware',
# Mobile detection should happen in Zeus.
2011-02-04 01:10:03 +03:00
'mobility.middleware.DetectMobileMiddleware',
'mobility.middleware.XMobileMiddleware',
'amo.middleware.RemoveSlashMiddleware',
# Munging REMOTE_ADDR must come before ThreadRequest.
'commonware.middleware.SetRemoteAddrFromForwardedFor',
2010-09-14 03:01:12 +04:00
2010-09-23 03:00:36 +04:00
'commonware.middleware.FrameOptionsHeader',
2011-05-18 09:21:38 +04:00
'commonware.middleware.StrictTransportMiddleware',
'multidb.middleware.PinningRouterMiddleware',
2010-10-01 21:11:07 +04:00
'csp.middleware.CSPMiddleware',
2010-09-23 00:42:49 +04:00
'amo.middleware.CommonMiddleware',
'amo.middleware.NoVarySessionMiddleware',
2011-06-07 22:00:45 +04:00
'cake.middleware.CakeCookieMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
2011-02-23 03:53:24 +03:00
'django.contrib.auth.middleware.AuthenticationMiddleware',
'commonware.log.ThreadRequestMiddleware',
'session_csrf.CsrfMiddleware',
'cake.middleware.CookieCleaningMiddleware',
2010-01-29 08:00:13 +03:00
# This should come after authentication middleware
'access.middleware.ACLMiddleware',
2010-09-11 02:28:57 +04:00
'commonware.middleware.HidePasswordOnException',
2009-10-21 03:29:27 +04:00
)
# Auth
AUTHENTICATION_BACKENDS = (
'users.backends.AmoUserBackend',
'cake.backends.SessionBackend',
)
AUTH_PROFILE_MODULE = 'users.UserProfile'
ROOT_URLCONF = '%s.urls' % ROOT_PACKAGE
2009-10-21 03:29:27 +04:00
INSTALLED_APPS = (
2010-04-21 07:08:27 +04:00
'amo', # amo comes first so it always takes precedence.
2010-01-04 00:05:32 +03:00
'access',
2009-10-23 02:42:48 +04:00
'addons',
'api',
2010-01-04 22:04:22 +03:00
'applications',
2010-01-16 05:52:56 +03:00
'bandwagon',
2010-01-27 01:23:25 +03:00
'blocklist',
2010-02-06 01:06:16 +03:00
'browse',
'compat',
2010-02-18 00:14:50 +03:00
'cronjobs',
2010-09-23 00:42:49 +04:00
'csp',
2010-01-05 23:12:04 +03:00
'devhub',
2010-04-21 07:08:27 +04:00
'discovery',
2010-01-05 01:23:05 +03:00
'editors',
'extras',
'files',
2010-05-14 04:26:15 +04:00
'jingo_minify',
'pages',
2010-11-19 02:19:07 +03:00
'perf',
'product_details',
2009-10-23 02:42:48 +04:00
'reviews',
'search',
'sharing',
'stats',
2010-01-05 04:46:55 +03:00
'tags',
'tower', # for ./manage.py extract
2009-12-11 00:21:51 +03:00
'translations',
2009-10-23 02:42:48 +04:00
'users',
'versions',
2011-07-15 10:04:37 +04:00
'webapps',
2010-04-21 07:08:27 +04:00
'zadmin',
2009-12-31 01:26:56 +03:00
# We need this so the jsi18n view will pick up our locale directory.
ROOT_PACKAGE,
'cake',
2010-08-27 21:07:16 +04:00
# Third party apps
2010-08-17 01:30:46 +04:00
'djcelery',
2011-08-03 01:37:31 +04:00
'django_extensions',
2009-12-05 01:55:29 +03:00
'django_nose',
2011-04-12 02:55:02 +04:00
'gunicorn',
2010-08-27 21:07:16 +04:00
'piston',
2011-04-13 19:42:52 +04:00
'waffle',
2009-12-31 01:26:56 +03:00
2010-08-27 21:07:16 +04:00
# Django contrib apps
2009-12-31 01:26:56 +03:00
'django.contrib.admin',
2009-10-21 03:29:27 +04:00
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.messages',
2009-10-21 03:29:27 +04:00
'django.contrib.sessions',
)
2009-12-05 01:55:29 +03:00
# These apps will be removed from INSTALLED_APPS in a production environment.
DEV_APPS = (
'django_nose',
)
# Tests
TEST_RUNNER = 'test_utils.runner.RadicalTestSuiteRunner'
2009-12-16 02:53:21 +03:00
# If you want to run Selenium tests, you'll need to have a server running.
# Then give this a dictionary of settings. Something like:
# 'HOST': 'localhost',
# 'PORT': 4444,
# 'BROWSER': '*firefox', # Alternative: *safari
SELENIUM_CONFIG = {}
# Tells the extract script what files to look for l10n in and what function
# handles the extraction. The Tower library expects this.
DOMAIN_METHODS = {
'messages': [
('apps/**.py',
'tower.management.commands.extract.extract_tower_python'),
('apps/**/templates/**.html',
'tower.management.commands.extract.extract_tower_template'),
('templates/**.html',
'tower.management.commands.extract.extract_tower_template'),
],
'lhtml': [
('**/templates/**.lhtml',
'tower.management.commands.extract.extract_tower_template'),
],
'javascript': [
# We can't say **.js because that would dive into mochikit and timeplot
# and all the other baggage we're carrying. Timeplot, in particular,
# crashes the extractor with bad unicode data.
('media/js/*.js', 'javascript'),
('media/js/amo2009/**.js', 'javascript'),
('media/js/zamboni/**.js', 'javascript'),
],
}
# Bundles is a dictionary of two dictionaries, css and js, which list css files
# and js files that can be bundled together by the minify app.
MINIFY_BUNDLES = {
'css': {
# CSS files common to the entire site.
2010-12-14 20:30:53 +03:00
'zamboni/css': (
'css/legacy/main.css',
'css/legacy/main-mozilla.css',
'css/legacy/jquery-lightbox.css',
'css/legacy/autocomplete.css',
'css/zamboni/zamboni.css',
'css/global/headerfooter.css',
'css/zamboni/amo_headerfooter.css',
'css/zamboni/tags.css',
'css/zamboni/tabs.css',
),
'zamboni/impala': (
'css/impala/base.css',
2011-05-05 02:01:16 +04:00
'css/legacy/jquery-lightbox.css',
'css/impala/site.less',
'css/impala/typography.less',
'css/global/headerfooter.css',
'css/impala/forms.less',
2011-05-05 02:01:16 +04:00
'css/impala/header.less',
'css/impala/footer.less',
'css/impala/moz-tab.css',
'css/impala/hovercards.less',
'css/impala/toplist.less',
'css/impala/carousel.less',
'css/impala/reviews.less',
2011-05-05 02:01:16 +04:00
'css/impala/buttons.less',
'css/impala/promos.less',
2011-05-05 02:01:16 +04:00
'css/impala/addon_details.less',
2011-07-29 22:53:01 +04:00
'css/impala/policy.less',
2011-05-25 05:11:10 +04:00
'css/impala/expando.less',
'css/impala/popups.less',
2011-07-19 02:49:15 +04:00
'css/impala/l10n.less',
2011-05-26 05:10:20 +04:00
'css/impala/contributions.less',
'css/impala/lightbox.less',
2011-07-19 21:47:01 +04:00
'css/impala/prose.less',
2011-05-28 05:30:41 +04:00
'css/impala/sharing.less',
'css/impala/abuse.less',
2011-07-13 22:18:57 +04:00
'css/impala/paginator.less',
'css/impala/listing.less',
2011-07-21 02:34:09 +04:00
'css/impala/users.less',
2011-07-15 01:50:10 +04:00
'css/impala/collections.less',
'css/impala/tooltips.less',
2011-07-21 11:58:29 +04:00
'css/impala/search.less',
),
2010-04-21 07:08:27 +04:00
'zamboni/discovery-pane': (
'css/zamboni/discovery-pane.css',
'css/impala/promos.less',
'css/legacy/jquery-lightbox.css',
),
'zamboni/devhub': (
'css/zamboni/developers.css',
'css/zamboni/docs.less',
),
'zamboni/devhub_impala': (
'css/impala/developers.less',
),
'zamboni/editors': (
'css/zamboni/editors.css',
),
'zamboni/files': (
'css/lib/syntaxhighlighter/shCoreDefault.css',
'css/zamboni/files.css',
),
'zamboni/mobile': (
'css/zamboni/mobile.css',
),
},
'js': {
# JS files common to the entire site.
'common': (
'js/lib/jquery-1.4.2.min.js',
'js/lib/jquery-ui/custom-1.8.5.min.js',
'js/lib/underscore-min.js',
'js/zamboni/browser.js',
'js/amo2009/addons.js',
'js/zamboni/init.js',
'js/zamboni/format.js',
2010-03-09 22:50:01 +03:00
'js/zamboni/buttons.js',
2010-04-10 08:02:46 +04:00
'js/zamboni/tabs.js',
'js/lib/jquery.cookie.js',
'js/zamboni/storage.js',
'js/zamboni/global.js',
'js/amo2009/global.js',
'js/impala/ratingwidget.js',
'js/lib/jquery-ui/jqModal.js',
'js/amo2009/home.js',
2010-11-01 21:39:45 +03:00
'js/zamboni/l10n.js',
'js/zamboni/debouncer.js',
2010-08-25 20:32:46 +04:00
# Homepage
'js/zamboni/homepage.js',
# Add-ons details page
'js/lib/jquery-ui/ui.lightbox.js',
'js/get-satisfaction-v2.js',
'js/zamboni/contributions.js',
'js/zamboni/addon_details.js',
'js/impala/abuse.js',
'js/zamboni/reviews.js',
# Personas
'js/lib/jquery.hoverIntent.min.js',
'js/zamboni/personas_core.js',
'js/zamboni/personas.js',
# Collections
'js/zamboni/collections.js',
# Performance
'js/zamboni/perf.js',
# Users
'js/zamboni/users.js',
# Fix-up outgoing links
'js/zamboni/outgoing_links.js',
# Hover delay for global header
'js/global/menu.js',
2011-05-28 04:56:06 +04:00
# Password length and strength
'js/zamboni/password-strength.js'
),
'impala': (
2011-05-05 02:01:16 +04:00
'js/lib/jquery-1.6.min.js',
'js/lib/jquery-ui/custom-1.8.5.min.js',
'js/lib/underscore-min.js',
2011-05-05 02:01:16 +04:00
'js/impala/carousel.js',
'js/zamboni/browser.js',
'js/amo2009/addons.js',
'js/zamboni/init.js',
'js/zamboni/format.js',
'js/zamboni/buttons.js',
'js/lib/jquery.cookie.js',
'js/zamboni/storage.js',
'js/zamboni/truncation.js',
'js/zamboni/global.js',
2011-05-17 00:37:08 +04:00
'js/impala/global.js',
'js/impala/ratingwidget.js',
'js/lib/jquery-ui/jqModal.js',
'js/zamboni/l10n.js',
# Homepage
'js/impala/homepage.js',
# Add-ons details page
'js/lib/jquery-ui/ui.lightbox.js',
'js/get-satisfaction-v2.js',
'js/zamboni/contributions.js',
2011-05-05 02:01:16 +04:00
'js/impala/addon_details.js',
'js/impala/abuse.js',
2011-07-20 08:26:38 +04:00
'js/impala/reviews.js',
# Personas
'js/lib/jquery.hoverIntent.min.js',
'js/zamboni/personas_core.js',
'js/zamboni/personas.js',
# Collections
'js/zamboni/collections.js',
2011-07-15 01:50:10 +04:00
'js/impala/collections.js',
2010-08-19 22:51:32 +04:00
# Performance
'js/zamboni/perf.js',
2010-08-19 22:51:32 +04:00
# Users
'js/zamboni/users.js',
2011-07-21 21:06:44 +04:00
'js/impala/users.js',
# Fix-up outgoing links
'js/zamboni/outgoing_links.js',
),
'zamboni/discovery': (
'js/lib/jquery-1.4.2.min.js',
'js/lib/underscore-min.js',
'js/zamboni/browser.js',
'js/zamboni/init.js',
'js/zamboni/format.js',
2011-05-05 02:01:16 +04:00
'js/impala/carousel.js',
# Add-ons details
'js/zamboni/buttons.js',
'js/lib/jquery-ui/ui.lightbox.js',
# Personas
'js/lib/jquery.hoverIntent.min.js',
'js/zamboni/personas_core.js',
'js/zamboni/personas.js',
'js/zamboni/debouncer.js',
2010-12-31 22:36:35 +03:00
'js/zamboni/truncation.js',
'js/lib/jquery.cookie.js',
'js/zamboni/storage.js',
'js/zamboni/discovery_addons.js',
'js/zamboni/discovery_pane.js',
),
'zamboni/devhub': (
2010-10-28 03:45:43 +04:00
'js/zamboni/truncation.js',
2011-03-05 03:44:32 +03:00
'js/zamboni/upload.js',
'js/zamboni/devhub.js',
'js/zamboni/validator.js',
2011-05-26 03:44:34 +04:00
'js/zamboni/packager.js',
),
'zamboni/editors': (
'js/zamboni/editors.js',
'js/lib/highcharts.src.js'
),
'zamboni/files': (
'js/lib/diff_match_patch_uncompressed.js',
'js/lib/syntaxhighlighter/xregexp-min.js',
'js/lib/syntaxhighlighter/shCore.js',
'js/lib/syntaxhighlighter/shLegacy.js',
'js/lib/syntaxhighlighter/shBrushAppleScript.js',
'js/lib/syntaxhighlighter/shBrushAS3.js',
'js/lib/syntaxhighlighter/shBrushBash.js',
'js/lib/syntaxhighlighter/shBrushCpp.js',
'js/lib/syntaxhighlighter/shBrushCSharp.js',
'js/lib/syntaxhighlighter/shBrushCss.js',
'js/lib/syntaxhighlighter/shBrushDiff.js',
'js/lib/syntaxhighlighter/shBrushJava.js',
'js/lib/syntaxhighlighter/shBrushJScript.js',
'js/lib/syntaxhighlighter/shBrushPhp.js',
'js/lib/syntaxhighlighter/shBrushPlain.js',
'js/lib/syntaxhighlighter/shBrushPython.js',
'js/lib/syntaxhighlighter/shBrushSass.js',
'js/lib/syntaxhighlighter/shBrushSql.js',
'js/lib/syntaxhighlighter/shBrushVb.js',
'js/lib/syntaxhighlighter/shBrushXml.js',
'js/zamboni/files.js',
),
'zamboni/mobile': (
'js/lib/jquery-1.5.min.js',
'js/lib/jqmobile.js',
'js/lib/jquery.cookie.js',
2011-02-17 05:37:43 +03:00
'js/zamboni/browser.js',
2011-02-21 12:47:09 +03:00
'js/zamboni/init.js',
'js/zamboni/format.js',
'js/zamboni/mobile/buttons.js',
'js/zamboni/truncation.js',
'js/zamboni/personas_core.js',
'js/zamboni/mobile/personas.js',
'js/zamboni/mobile/general.js',
),
2011-04-30 03:50:51 +04:00
'zamboni/stats': (
'js/lib/jquery-datepicker.js',
'js/lib/highcharts.src.js',
'js/zamboni/stats/csv_keys.js',
'js/zamboni/stats/helpers.js',
'js/zamboni/stats/stats_manager.js',
'js/zamboni/stats/stats_tables.js',
'js/zamboni/stats/stats.js',
),
2011-04-11 21:49:58 +04:00
# This is included when DEBUG is True. Bundle in <head>.
'debug': (
'js/debug/less_setup.js',
'js/lib/less-1.0.41.js',
'js/debug/less_live.js',
),
}
}
# Caching
# Prefix for cache keys (will prevent collisions when running parallel copies)
CACHE_PREFIX = 'amo:%s:' % build_id
FETCH_BY_ID = True
# Number of seconds a count() query should be cached. Keep it short because
# it's not possible to invalidate these queries.
CACHE_COUNT_TIMEOUT = 60
# External tools.
SPHINX_INDEXER = 'indexer'
SPHINX_SEARCHD = 'searchd'
SPHINX_CONFIG_PATH = path('configs/sphinx/sphinx.conf')
SPHINX_CATALOG_PATH = TMP_PATH + '/data/sphinx'
SPHINX_LOG_PATH = TMP_PATH + '/log/searchd'
SPHINX_HOST = '127.0.0.1'
SPHINX_PORT = 3312
SPHINXQL_PORT = 3307
TEST_SPHINX_PORT = 3412
TEST_SPHINXQL_PORT = 3407
TEST_SPHINX_CATALOG_PATH = TMP_PATH + '/test/data/sphinx'
TEST_SPHINX_LOG_PATH = TMP_PATH + '/test/log/searchd'
SPHINX_TIMEOUT = 1
JAVA_BIN = '/usr/bin/java'
2010-08-26 19:50:05 +04:00
# Add-on download settings.
MIRROR_DELAY = 30 # Minutes before we serve downloads from mirrors.
MIRROR_URL = 'http://releases.mozilla.org/pub/mozilla.org/addons'
LOCAL_MIRROR_URL = 'https://static.addons.mozilla.net/_files'
PRIVATE_MIRROR_URL = '/_privatefiles'
2010-08-26 19:50:05 +04:00
# File paths
2010-08-14 08:31:30 +04:00
ADDON_ICONS_PATH = UPLOADS_PATH + '/addon_icons'
COLLECTIONS_ICON_PATH = UPLOADS_PATH + '/collection_icons'
PREVIEWS_PATH = UPLOADS_PATH + '/previews'
USERPICS_PATH = UPLOADS_PATH + '/userpics'
2011-05-26 03:44:34 +04:00
PACKAGER_PATH = os.path.join(TMP_PATH, 'packager')
ADDON_ICONS_DEFAULT_PATH = os.path.join(MEDIA_ROOT, 'img/addon-icons')
2011-07-22 22:41:43 +04:00
2010-12-31 04:02:31 +03:00
PREVIEW_THUMBNAIL_PATH = (PREVIEWS_PATH + '/thumbs/%s/%d.png')
PREVIEW_FULL_PATH = (PREVIEWS_PATH + '/full/%s/%d.png')
# URL paths
# paths for images, e.g. mozcdn.com/amo or '/static'
STATIC_URL = SITE_URL
2010-11-12 03:39:18 +03:00
ADDON_ICONS_DEFAULT_URL = MEDIA_URL + '/img/addon-icons'
ADDON_ICON_BASE_URL = MEDIA_URL + 'img/icons/'
ADDON_ICON_URL = ('%s/images/addon_icon/%%d-%%d.png?modified=%%s' %
STATIC_URL)
PREVIEW_THUMBNAIL_URL = (STATIC_URL +
'/img/uploads/previews/thumbs/%s/%d.png?modified=%d')
PREVIEW_FULL_URL = (STATIC_URL +
'/img/uploads/previews/full/%s/%d.png?modified=%d')
2010-08-21 00:45:53 +04:00
USERPICS_URL = STATIC_URL + '/img/uploads/userpics/%s/%s/%s.png?modified=%d'
# paths for uploaded extensions
COLLECTION_ICON_URL = ('%s/images/collection_icon/%%s.png?modified=%%s' %
STATIC_URL)
PERSONAS_IMAGE_URL = ('http://www.getpersonas.com/static/'
'%(tens)d/%(units)d/%(id)d/%(file)s')
PERSONAS_IMAGE_URL_SSL = ('https://www.getpersonas.com/static/'
'%(tens)d/%(units)d/%(id)d/%(file)s')
PERSONAS_USER_ROOT = 'http://www.getpersonas.com/gallery/designer/%s'
PERSONAS_UPDATE_URL = 'https://www.getpersonas.com/update_check/%d'
2010-03-02 18:43:39 +03:00
# Outgoing URL bouncer
2010-03-30 03:01:24 +04:00
REDIRECT_URL = 'http://outgoing.mozilla.org/v1/'
REDIRECT_SECRET_KEY = ''
# Default to short expiration; check "remember me" to override
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_COOKIE_AGE = 1209600
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True
2010-11-11 06:20:05 +03:00
SESSION_COOKIE_DOMAIN = ".%s" % DOMAIN # bug 608797
2010-09-02 19:51:35 +04:00
MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
# These should have app+locale at the start to avoid redirects
LOGIN_URL = "/users/login"
LOGOUT_URL = "/users/logout"
LOGIN_REDIRECT_URL = "/"
LOGOUT_REDIRECT_URL = "/"
2010-03-02 18:43:39 +03:00
# Legacy Settings
# used by old-style CSRF token
CAKE_SESSION_TIMEOUT = 8640
# PayPal Settings
2010-10-11 21:44:34 +04:00
PAYPAL_API_URL = 'https://api-3t.paypal.com/nvp'
PAYPAL_API_VERSION = '50'
2011-01-26 20:06:45 +03:00
PAYPAL_APP_ID = ''
PAYPAL_BN = ''
2010-10-11 21:44:34 +04:00
PAYPAL_CGI_URL = 'https://www.paypal.com/cgi-bin/webscr'
PAYPAL_CGI_AUTH = {'USER': '', 'PASSWORD': '', 'SIGNATURE': ''}
PAYPAL_PAY_URL = 'https://svcs.paypal.com/AdaptivePayments/Pay'
2011-01-26 20:06:45 +03:00
PAYPAL_FLOW_URL = 'https://paypal.com/webapps/adaptivepayment/flow/pay'
PAYPAL_JS_URL = 'https://www.paypalobjects.com/js/external/dg.js'
PAYPAL_EMBEDDED_AUTH = {'USER': '', 'PASSWORD': '', 'SIGNATURE': ''}
2011-01-26 20:06:45 +03:00
PAYPAL_EMAIL = ''
2010-10-11 21:44:34 +04:00
# Paypal is an awful place that doesn't understand locales. Instead they have
# country codes. This maps our locales to their codes.
PAYPAL_COUNTRYMAP = {
'af': 'ZA', 'ar': 'EG', 'ca': 'ES', 'cs': 'CZ', 'cy': 'GB', 'da': 'DK',
'de': 'DE', 'de-AT': 'AT', 'de-CH': 'CH', 'el': 'GR', 'en-GB': 'GB',
'eu': 'BS', 'fa': 'IR', 'fi': 'FI', 'fr': 'FR', 'he': 'IL', 'hu': 'HU',
'id': 'ID', 'it': 'IT', 'ja': 'JP', 'ko': 'KR', 'mn': 'MN', 'nl': 'NL',
2011-01-06 01:18:42 +03:00
'pl': 'PL', 'ro': 'RO', 'ru': 'RU', 'sk': 'SK', 'sl': 'SI', 'sq': 'AL',
'sr': 'CS', 'tr': 'TR', 'uk': 'UA', 'vi': 'VI',
2010-10-11 21:44:34 +04:00
}
# Contribution limit, one time and monthly
MAX_CONTRIBUTION = 1000
# Email settings
2010-04-10 07:49:36 +04:00
DEFAULT_FROM_EMAIL = "Mozilla Add-ons <nobody@mozilla.org>"
# Email goes to the console by default. s/console/smtp/ for regular delivery
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# Please use all lowercase for the blacklist.
EMAIL_BLACKLIST = (
'nobody@mozilla.org',
)
2010-04-24 03:20:48 +04:00
## Celery
BROKER_HOST = 'localhost'
BROKER_PORT = 5672
BROKER_USER = 'zamboni'
BROKER_PASSWORD = 'zamboni'
BROKER_VHOST = 'zamboni'
BROKER_CONNECTION_TIMEOUT = 0.1
2010-04-24 03:20:48 +04:00
CELERY_RESULT_BACKEND = 'amqp'
CELERY_IGNORE_RESULT = True
2011-04-30 03:23:44 +04:00
CELERY_IMPORTS = ('django_arecibo.tasks',)
# We have separate celeryds for processing devhub & images as fast as possible
# Some notes:
# - always add routes here instead of @task(queue=<name>)
# - when adding a queue, be sure to update deploy.py so that it gets restarted
CELERY_ROUTES = {
'devhub.tasks.validator': {'queue': 'devhub'},
'devhub.tasks.compatibility_check': {'queue': 'devhub'},
'devhub.tasks.file_validator': {'queue': 'devhub'},
2011-05-26 03:44:34 +04:00
'devhub.tasks.packager': {'queue': 'devhub'},
2010-11-18 05:01:19 +03:00
'bandwagon.tasks.resize_icon': {'queue': 'images'},
'users.tasks.resize_photo': {'queue': 'images'},
'users.tasks.delete_photo': {'queue': 'images'},
'devhub.tasks.resize_icon': {'queue': 'images'},
'devhub.tasks.resize_preview': {'queue': 'images'},
2011-05-27 23:54:05 +04:00
'zadmin.tasks.bulk_validate_file': {'queue': 'bulk'},
'devhub.tasks.flag_binary': {'queue': 'bulk'},
}
# When testing, we always want tasks to raise exceptions. Good for sanity.
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True
2010-05-19 01:23:37 +04:00
## Fixture Magic
CUSTOM_DUMPS = {
'addon': { # ./manage.py custom_dump addon id
'primary': 'addons.addon', # This is our reference model.
'dependents': [ # These are items we wish to dump.
# Magic turns this into current_version.files.all()[0].
'current_version.files.all.0',
'current_version.apps.all.0',
'addonuser_set.all.0',
2010-05-19 01:23:37 +04:00
],
'order': ('applications.application', 'translations.translation',
'addons.addontype', 'files.platform', 'addons.addon',
'versions.license', 'versions.version', 'files.file'),
'excludes': {
2010-06-26 02:21:17 +04:00
'addons.addon': ('_current_version',),
}
2010-05-19 01:23:37 +04:00
}
}
## Hera (http://github.com/clouserw/hera)
2010-08-10 21:40:50 +04:00
HERA = [{'USERNAME': '',
'PASSWORD': '',
'LOCATION': '',
2010-08-10 21:40:50 +04:00
}]
2010-06-30 02:28:40 +04:00
# Logging
LOG_LEVEL = logging.DEBUG
HAS_SYSLOG = True # syslog is used if HAS_SYSLOG and NOT DEBUG.
SYSLOG_TAG = "http_app_addons"
SYSLOG_TAG2 = "http_app_addons2"
2011-02-25 01:30:56 +03:00
SYSLOG_CSP = "http_app_addons_csp"
2010-11-17 03:45:22 +03:00
# See PEP 391 and log_settings.py for formatting help. Each section of
# LOGGING will get merged into the corresponding section of
# log_settings.py. Handlers and log levels are set up automatically based
# on LOG_LEVEL and DEBUG unless you set them here. Messages will not
# propagate through a logger unless propagate: True is set.
LOGGING_CONFIG = None
LOGGING = {
'loggers': {
'amqplib': {'handlers': ['null']},
'caching.invalidation': {'handlers': ['null']},
2011-07-21 01:19:14 +04:00
'caching': {'level': logging.WARNING},
2011-05-19 03:32:57 +04:00
'pyes': {'handlers': ['null']},
'rdflib': {'handlers': ['null']},
2010-06-30 02:28:40 +04:00
'suds': {'handlers': ['null']},
2010-06-03 07:08:09 +04:00
'z.sphinx': {'level': logging.INFO},
2010-06-05 02:29:48 +04:00
'z.task': {'level': logging.INFO},
},
}
2010-09-23 00:42:49 +04:00
# CSP Settings
CSP_REPORT_URI = '/services/csp/report'
2011-05-11 03:26:30 +04:00
CSP_POLICY_URI = '/services/csp/policy?build=%s' % build_id
2010-09-23 00:42:49 +04:00
CSP_REPORT_ONLY = True
CSP_ALLOW = ("'self'",)
CSP_IMG_SRC = ("'self'", STATIC_URL,
2010-10-13 01:08:26 +04:00
"https://www.google.com", # Recaptcha comes from google
"https://statse.webtrendslive.com",
"https://www.getpersonas.com",
"https://s3.amazonaws.com", # getsatisfaction
)
2010-10-05 23:32:19 +04:00
CSP_SCRIPT_SRC = ("'self'", STATIC_URL,
2010-10-13 01:08:26 +04:00
"https://www.google.com", # Recaptcha
"https://www.paypalobjects.com",
2010-10-05 23:32:19 +04:00
)
2010-09-23 00:42:49 +04:00
CSP_STYLE_SRC = ("'self'", STATIC_URL,)
CSP_OBJECT_SRC = ("'none'",)
CSP_MEDIA_SRC = ("'none'",)
CSP_FRAME_SRC = ("https://s3.amazonaws.com", # getsatisfaction
"https://getsatisfaction.com", # getsatisfaction
)
2010-12-23 03:07:16 +03:00
CSP_FONT_SRC = ("'self'", "fonts.mozilla.com", "www.mozilla.com", )
2011-01-26 20:06:45 +03:00
# self is needed for paypal which sends x-frame-options:allow when needed.
# x-frame-options:DENY is sent the rest of the time.
CSP_FRAME_ANCESTORS = ("'self'",)
2010-09-23 00:42:49 +04:00
2010-10-16 01:50:46 +04:00
# Should robots.txt deny everything or disallow a calculated list of URLs we
# don't want to be crawled? Default is false, disallow everything.
2011-01-31 20:03:43 +03:00
# Also see http://www.google.com/support/webmasters/bin/answer.py?answer=93710
2010-10-16 01:50:46 +04:00
ENGAGE_ROBOTS = False
# Read-only mode setup.
READ_ONLY = False
# Turn on read-only mode in settings_local.py by putting this line
# at the VERY BOTTOM: read_only_mode(globals())
def read_only_mode(env):
env['READ_ONLY'] = True
# Replace the default (master) db with a slave connection.
if not env.get('SLAVE_DATABASES'):
raise Exception("We need at least one slave database.")
slave = env['SLAVE_DATABASES'][0]
env['DATABASES']['default'] = env['DATABASES'][slave]
# No sessions without the database, so disable auth.
env['AUTHENTICATION_BACKENDS'] = ('users.backends.NoAuthForYou',)
# Add in the read-only middleware before csrf middleware.
extra = 'amo.middleware.ReadOnlyMiddleware'
before = 'session_csrf.CsrfMiddleware'
m = list(env['MIDDLEWARE_CLASSES'])
m.insert(m.index(before), extra)
env['MIDDLEWARE_CLASSES'] = tuple(m)
2010-07-27 22:35:26 +04:00
# Uploaded file limits
MAX_ICON_UPLOAD_SIZE = 4 * 1024 * 1024
2010-08-21 00:45:53 +04:00
MAX_PHOTO_UPLOAD_SIZE = MAX_ICON_UPLOAD_SIZE
2010-07-27 22:35:26 +04:00
2010-08-19 22:51:32 +04:00
# RECAPTCHA - copy all three statements to settings_local.py
2010-08-24 21:38:15 +04:00
RECAPTCHA_PUBLIC_KEY = ''
RECAPTCHA_PRIVATE_KEY = ''
2011-04-28 20:52:57 +04:00
RECAPTCHA_URL = ('https://www.google.com/recaptcha/api/challenge?k=%s' %
2010-08-19 22:51:32 +04:00
RECAPTCHA_PUBLIC_KEY)
# Send Django signals asynchronously on a background thread.
ASYNC_SIGNALS = True
2010-10-06 03:32:54 +04:00
# Performance notes on add-ons
PERFORMANCE_NOTES = False
2010-11-04 01:49:17 +03:00
# Used to flag slow addons.
# If slowness of addon is THRESHOLD percent slower, show a warning.
2011-04-07 10:08:58 +04:00
PERF_THRESHOLD = 25
2010-11-17 01:32:14 +03:00
REDIS_BACKENDS = {'master': 'redis://localhost:6379?socket_timeout=0.5'}
# Directory of JavaScript test files for django_qunit to run
QUNIT_TEST_DIRECTORY = os.path.join(MEDIA_ROOT, 'js', 'zamboni', 'tests')
# Full path or executable path (relative to $PATH) of the spidermonkey js
# binary. It must be a version compatible with amo-validator
SPIDERMONKEY = None
2010-12-28 21:33:12 +03:00
VALIDATE_ADDONS = True
# When True include full tracebacks in JSON. This is useful for QA on preview.
EXPOSE_VALIDATOR_TRACEBACKS = False
# Feature flags
SEARCH_EXCLUDE_PERSONAS = True
2011-01-12 00:37:33 +03:00
UNLINK_SITE_STATS = True
# Use the new featured add-ons system which makes use of featured collections.
2011-06-18 04:13:17 +04:00
NEW_FEATURES = False
2011-07-26 23:28:31 +04:00
# Impala flags.
IMPALA_BROWSE = False
2011-07-20 08:26:38 +04:00
IMPALA_REVIEWS = False
2011-07-26 23:28:31 +04:00
IMPALA_MEET = False # Meet the Developer page.
2011-06-18 02:13:21 +04:00
# Set to True if we're allowed to use X-SENDFILE.
XSENDFILE = True
2011-02-02 07:32:42 +03:00
MOBILE_COOKIE = 'mamo'
2011-02-02 21:50:42 +03:00
# If the users's Firefox has a version number greater than this we consider it
# a beta.
MIN_BETA_VERSION = '3.7'
2011-01-26 20:06:45 +03:00
DEFAULT_SUGGESTED_CONTRIBUTION = 5
# Path to `ps`.
PS_BIN = '/bin/ps'
2011-02-19 03:27:02 +03:00
BLOCKLIST_COOKIE = 'BLOCKLIST_v1'
# Responsys id used for newsletter subscribing
RESPONSYS_ID = ''
# The maximum file size that is shown inside the file viewer.
FILE_VIEWER_SIZE_LIMIT = 1048576
# The maximum file size that you can have inside a zip file.
2011-06-02 04:19:14 +04:00
FILE_UNZIP_SIZE_LIMIT = 104857600
# How long to delay modify updates to cope with alleged NFS slowness.
MODIFIED_DELAY = 3
# This is a list of dictionaries that we should generate compat info for.
# app: should match amo.FIREFOX.id.
# main: the app version we're generating compat info for.
# versions: version numbers to show in comparisons.
# previous: the major version before :main.
COMPAT = (
2011-08-02 02:01:30 +04:00
dict(app=1, main='8.0', versions=('8.0', '8.0a2', '8.0a1'),
previous='7.0'),
dict(app=1, main='7.0', versions=('7.0', '7.0a2', '7.0a1'),
previous='6.0'),
dict(app=1, main='6.0', versions=('6.0', '6.0a2', '6.0a1'),
previous='5.0'),
dict(app=1, main='5.0', versions=('5.0', '5.0a2', '5.0a1'),
previous='4.0'),
dict(app=1, main='4.0', versions=('4.0', '4.0a1', '3.7a'),
previous='3.6'),
)
2011-04-30 03:23:44 +04:00
# URL for reporting arecibo errors too. If not set, won't be sent.
ARECIBO_SERVER_URL = ""
# A whitelist of domains that the authentication script will redirect to upon
# successfully logging in or out.
VALID_LOGIN_REDIRECTS = {
'builder': 'https://builder.addons.mozilla.org',
'builderstage': 'https://builder-addons-next.allizom.org',
'buildertrunk': 'https://builder-addons.allizom.org',
}
2011-05-18 23:08:59 +04:00
# Secret key we send to builder so we can trust responses from the builder.
BUILDER_SECRET_KEY = 'love will tear us apart'
# The builder URL we hit to upgrade jetpacks.
BUILDER_UPGRADE_URL = 'https://addons.mozilla.org/services/builder'
2011-05-18 01:39:08 +04:00
## Elastic Search
ES_HOSTS = ['127.0.0.1:9200']
ES_INDEX = 'amo'
USE_ELASTIC = True
# Default AMO user id to use for tasks.
TASK_USER_ID = 4757633
# If this is False, tasks and other jobs that send non-critical emails should
# use a fake email backend.
SEND_REAL_EMAIL = False
2011-05-27 19:55:04 +04:00
STATSD_HOST = 'localhost'
STATSD_PORT = 8125
STATSD_PREFIX = 'amo'
2011-06-14 01:48:07 +04:00
GRAPHITE_HOST = 'localhost'
GRAPHITE_PORT = 2003
GRAPHITE_PREFIX = 'amo'
GRAPHITE_TIMEOUT = 1
# URL to the service that triggers addon performance tests. See devhub.perf.
PERF_TEST_URL = 'http://areweperftestingyet.com/trigger.cgi'
2011-06-15 03:19:24 +04:00
# IP addresses of servers we use as proxies.
KNOWN_PROXIES = []
# Blog URL
DEVELOPER_BLOG_URL = 'http://blog.mozilla.com/addons/feed/'
LOGIN_RATELIMIT_USER = 5
LOGIN_RATELIMIT_ALL_USERS = '15/m'