2010-02-04 02:09:30 +03:00
|
|
|
# Django settings for kitsune project.
|
2011-01-04 02:05:04 +03:00
|
|
|
from datetime import date
|
2010-02-04 02:16:45 +03:00
|
|
|
import logging
|
2011-01-04 02:05:04 +03:00
|
|
|
import os
|
|
|
|
import platform
|
2010-02-04 02:09:30 +03:00
|
|
|
|
2010-04-16 07:09:48 +04:00
|
|
|
from sumo_locales import LOCALES
|
2010-04-01 23:45:15 +04:00
|
|
|
|
2010-02-04 02:09:30 +03:00
|
|
|
DEBUG = True
|
|
|
|
TEMPLATE_DEBUG = DEBUG
|
2010-12-09 01:43:23 +03:00
|
|
|
|
|
|
|
LOG_LEVEL = logging.INFO
|
|
|
|
SYSLOG_TAG = 'http_sumo_app'
|
2010-02-04 02:16:45 +03:00
|
|
|
|
|
|
|
ROOT = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
path = lambda *a: os.path.join(ROOT, *a)
|
2010-02-04 02:09:30 +03:00
|
|
|
|
2010-04-22 01:52:58 +04:00
|
|
|
ROOT_PACKAGE = os.path.basename(ROOT)
|
|
|
|
|
2010-02-04 02:09:30 +03:00
|
|
|
ADMINS = (
|
|
|
|
# ('Your Name', 'your_email@domain.com'),
|
|
|
|
)
|
|
|
|
|
|
|
|
MANAGERS = ADMINS
|
|
|
|
|
|
|
|
DATABASES = {
|
|
|
|
'default': {
|
2010-05-25 00:44:28 +04:00
|
|
|
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
|
|
|
|
'NAME': 'kitsune', # Or path to database file if using sqlite3.
|
|
|
|
'USER': '', # Not used with sqlite3.
|
|
|
|
'PASSWORD': '', # Not used with sqlite3.
|
|
|
|
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
|
|
|
|
'PORT': '', # Set to empty string for default. Not used with sqlite3.
|
2010-02-10 05:36:38 +03:00
|
|
|
'OPTIONS': {'init_command': 'SET storage_engine=InnoDB'},
|
2010-02-04 02:09:30 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-16 23:34:58 +04:00
|
|
|
DATABASE_ROUTERS = ('multidb.PinningMasterSlaveRouter',)
|
2010-02-09 22:01:37 +03:00
|
|
|
|
|
|
|
# Put the aliases for your slave databases in this list
|
|
|
|
SLAVE_DATABASES = []
|
|
|
|
|
2010-02-10 03:43:08 +03:00
|
|
|
# Cache Settings
|
2010-06-05 10:30:18 +04:00
|
|
|
#CACHE_BACKEND = 'caching.backends.memcached://localhost:11211'
|
2010-02-10 03:43:08 +03:00
|
|
|
#CACHE_PREFIX = 'sumo:'
|
|
|
|
|
2010-04-21 04:50:53 +04:00
|
|
|
# Addresses email comes from
|
|
|
|
DEFAULT_FROM_EMAIL = 'notifications@support.mozilla.com'
|
|
|
|
SERVER_EMAIL = 'server-error@support.mozilla.com'
|
2010-02-10 03:43:08 +03:00
|
|
|
|
2010-09-11 02:58:44 +04:00
|
|
|
PLATFORM_NAME = platform.node()
|
|
|
|
|
2010-02-04 02:09:30 +03: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.
|
2010-05-11 03:18:00 +04:00
|
|
|
TIME_ZONE = 'US/Pacific'
|
2010-02-04 02:09:30 +03:00
|
|
|
|
|
|
|
# Language code for this installation. All choices can be found here:
|
|
|
|
# http://www.i18nguy.com/unicode/language-identifiers.html
|
2010-04-01 23:45:15 +04:00
|
|
|
LANGUAGE_CODE = 'en-US'
|
|
|
|
|
|
|
|
# Supported languages
|
|
|
|
SUMO_LANGUAGES = (
|
2010-08-31 05:16:27 +04:00
|
|
|
'ak', 'ar', 'as', 'ast', 'bg', 'bn-BD', 'bn-IN', 'bs', 'ca', 'cs', 'da',
|
|
|
|
'de', 'el', 'en-US', 'eo', 'es', 'et', 'eu', 'fa', 'fi', 'fr', 'fur',
|
|
|
|
'fy-NL', 'ga-IE', 'gd', 'gl', 'gu-IN', 'he', 'hi-IN', 'hr', 'hu', 'hy-AM',
|
2010-11-23 00:09:42 +03:00
|
|
|
'id', 'ilo', 'is', 'it', 'ja', 'kk', 'kn', 'ko', 'lt', 'mai', 'mk', 'mn',
|
2011-01-10 22:46:50 +03:00
|
|
|
'mr', 'ms', 'my', 'nb-NO', 'nl', 'no', 'oc', 'pa-IN', 'pl', 'pt-BR',
|
|
|
|
'pt-PT', 'rm', 'ro', 'ru', 'rw', 'si', 'sk', 'sl', 'sq', 'sr-CYRL',
|
|
|
|
'sr-LATN', 'sv-SE', 'ta-LK', 'te', 'th', 'tr', 'uk', 'vi', 'zh-CN',
|
|
|
|
'zh-TW',
|
2010-04-01 23:45:15 +04:00
|
|
|
)
|
|
|
|
|
2010-09-02 05:00:30 +04:00
|
|
|
LANGUAGE_CHOICES = tuple([(i, LOCALES[i].native) for i in SUMO_LANGUAGES])
|
|
|
|
LANGUAGES = dict([(i.lower(), LOCALES[i].native) for i in SUMO_LANGUAGES])
|
2010-04-01 23:45:15 +04:00
|
|
|
|
|
|
|
LANGUAGE_URL_MAP = dict([(i.lower(), i) for i in SUMO_LANGUAGES])
|
|
|
|
|
2010-04-22 01:52:58 +04:00
|
|
|
TEXT_DOMAIN = 'messages'
|
2010-02-04 02:09:30 +03:00
|
|
|
|
|
|
|
SITE_ID = 1
|
2010-03-22 22:50:31 +03:00
|
|
|
|
2010-02-04 02:09:30 +03:00
|
|
|
|
|
|
|
# If you set this to False, Django will make some optimizations so as not
|
|
|
|
# to load the internationalization machinery.
|
|
|
|
USE_I18N = True
|
2010-04-01 23:45:15 +04:00
|
|
|
USE_L10N = True
|
2010-02-04 02:09:30 +03:00
|
|
|
|
2010-12-30 23:15:46 +03:00
|
|
|
# Use the real robots.txt?
|
|
|
|
ENGAGE_ROBOTS = False
|
|
|
|
|
2010-02-04 02:09:30 +03:00
|
|
|
# Absolute path to the directory that holds media.
|
|
|
|
# Example: "/home/media/media.lawrence.com/"
|
2010-02-04 02:16:45 +03:00
|
|
|
MEDIA_ROOT = path('media')
|
2010-02-04 02:09:30 +03: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/"
|
2010-02-04 02:16:45 +03:00
|
|
|
MEDIA_URL = '/media/'
|
2010-02-04 02:09:30 +03:00
|
|
|
|
|
|
|
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
|
|
|
|
# trailing slash.
|
|
|
|
# Examples: "http://foo.com/media/", "/media/".
|
2010-02-04 02:16:45 +03:00
|
|
|
ADMIN_MEDIA_PREFIX = '/admin-media/'
|
2010-02-04 02:09:30 +03:00
|
|
|
|
2010-04-01 23:45:15 +04:00
|
|
|
# Paths that don't require a locale prefix.
|
2011-03-03 04:11:30 +03:00
|
|
|
SUPPORTED_NONLOCALES = ('media', 'admin', 'robots.txt', 'services', '1',
|
|
|
|
'postcrash')
|
2010-04-01 23:45:15 +04:00
|
|
|
|
2010-02-04 02:09:30 +03:00
|
|
|
# Make this unique, and don't share it with anybody.
|
|
|
|
SECRET_KEY = '#%tc(zja8j01!r#h_y)=hy!^k)9az74k+-ib&ij&+**s3-e^_z'
|
|
|
|
|
|
|
|
# List of callables that know how to import templates from various sources.
|
|
|
|
TEMPLATE_LOADERS = (
|
|
|
|
'django.template.loaders.filesystem.Loader',
|
|
|
|
'django.template.loaders.app_directories.Loader',
|
|
|
|
# 'django.template.loaders.eggs.Loader',
|
|
|
|
)
|
|
|
|
|
2010-03-04 04:59:03 +03:00
|
|
|
TEMPLATE_CONTEXT_PROCESSORS = (
|
|
|
|
'django.core.context_processors.auth',
|
|
|
|
'django.core.context_processors.debug',
|
|
|
|
'django.core.context_processors.media',
|
|
|
|
'django.core.context_processors.request',
|
2010-03-22 22:50:31 +03:00
|
|
|
'django.contrib.messages.context_processors.messages',
|
2010-05-25 05:03:52 +04:00
|
|
|
|
|
|
|
'sumo.context_processors.global_settings',
|
2010-11-09 00:24:54 +03:00
|
|
|
'sumo.context_processors.for_data',
|
2010-09-01 20:00:03 +04:00
|
|
|
'jingo_minify.helpers.build_ids',
|
2010-03-04 04:59:03 +03:00
|
|
|
)
|
|
|
|
|
2010-02-04 02:09:30 +03:00
|
|
|
MIDDLEWARE_CLASSES = (
|
2010-06-16 23:34:58 +04:00
|
|
|
'multidb.middleware.PinningRouterMiddleware',
|
2010-09-29 22:18:14 +04:00
|
|
|
|
|
|
|
# This gives us atomic success or failure on multi-row writes. It does not
|
|
|
|
# give us a consistent per-transaction snapshot for reads; that would need
|
|
|
|
# the serializable isolation level (which InnoDB does support) and code to
|
|
|
|
# retry transactions that roll back due to serialization failures. It's a
|
|
|
|
# possibility for the future. Keep in mind that memcache defeats
|
|
|
|
# snapshotted reads where we don't explicitly use the "uncached" manager.
|
|
|
|
'django.middleware.transaction.TransactionMiddleware',
|
|
|
|
|
[590776] LocaleURLMiddleware's setting of a thread-local prefixer is now reversed when the request ends, removing one source of apparently random test failures. A short book follows:
* Make LocaleURLMiddleware clean up after itself: clear the thread-local prefixer variable that it sets before the request. Tests can now run in any order without the thread-local setting of one influencing the next. This also uncovers a lot of buggy tests which were mistakenly depending on the work of previous ones. Much of the rest of this changeset is toward fixing these.... A good test to compare before and after this commit is `test_json_callback_validation`. Run it alone, and LocaleMiddleware tosses us a 301 because we don't have a locale prefix set. Run it in concert with other tests, and somebody else sets the thread-local for it.
* Added `LocalizingClient`, which provides the functionality of django.test.client.Client but implicitly prepends a locale code to anything you request. This saves dodging the initial 301 that LocaleURLMiddleware returns in response to an un-prepended request. It also makes "priming" the middleware by doing an initial arbitrary request unnecessary (and ineffective, since the middleware no longer leaks state). Removed all instances of such priming.
* Switched many tests to use `LocalizingClient`. Some uses of plain `Client` remain, but those are correct, since they test things like the middleware's 301s.
* Renamed `set_url_prefix` and `get_url_prefix` to better reflect their purpose: they hold Prefixers, not prefixes.
* Added a `force_locale` kwarg to `sumo.urlresolvers.reverse()`, which forces the same default locale as would normally be used by the middleware to be prepended onto the result, even if there is no prefixer set. This is useful when you need to get a reversed URL against which to compare a 301's Location in a test.
* Moved `split_path()` out of `Prefixer`, since it needs no instance state and I needed it in `LocalizingClient`.
* `Prefixer` can now be instantiated without a request, in which case it defaults to a fairly blank one and returns results largely determined by `settings.LANGUAGE_CODE`.
* Stopped expecting locale prefixes in wiki parser tests: the parser is being run outside any request and so should return unlocalized URLs.
* Ripped `get_url` off the legacy `Forum` and `ForumThread` models and deleted its tests. This was a lot faster than trying to fix them, and the entire models are dying for 2.3 anyway.
* Fixed a gabillion other tests. I like to think I understood each one's intent before causing it to pass, but extra eyes are certainly welcome.
* Fixed some pyflakes violations: semicolons, whitespace, unused imports, etc.
2010-08-27 04:31:33 +04:00
|
|
|
# LocaleURLMiddleware must be before any middleware that uses
|
|
|
|
# sumo.urlresolvers.reverse() to add locale prefixes to URLs:
|
2010-04-01 23:45:15 +04:00
|
|
|
'sumo.middleware.LocaleURLMiddleware',
|
2011-02-08 01:23:43 +03:00
|
|
|
|
|
|
|
# Mobile detection should happen in Zeus.
|
|
|
|
'mobility.middleware.DetectMobileMiddleware',
|
|
|
|
'mobility.middleware.XMobileMiddleware',
|
|
|
|
|
2010-05-25 03:58:13 +04:00
|
|
|
'sumo.middleware.Forbidden403Middleware',
|
2010-02-04 02:09:30 +03:00
|
|
|
'django.middleware.common.CommonMiddleware',
|
2010-12-29 02:03:14 +03:00
|
|
|
'sumo.middleware.RemoveSlashMiddleware',
|
2011-01-13 23:24:21 +03:00
|
|
|
'inproduct.middleware.EuBuildMiddleware',
|
2010-08-06 18:53:25 +04:00
|
|
|
'sumo.middleware.NoCacheHttpsMiddleware',
|
2010-03-31 04:43:19 +04:00
|
|
|
'commonware.middleware.NoVarySessionMiddleware',
|
2010-10-01 19:13:24 +04:00
|
|
|
'commonware.middleware.FrameOptionsHeader',
|
2010-02-04 02:09:30 +03:00
|
|
|
'django.middleware.csrf.CsrfViewMiddleware',
|
|
|
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
|
|
|
'django.contrib.messages.middleware.MessageMiddleware',
|
2010-06-28 20:30:02 +04:00
|
|
|
'sumo.anonymous.AnonymousIdentityMiddleware',
|
2010-09-25 01:33:14 +04:00
|
|
|
'twitter.middleware.SessionMiddleware',
|
2010-10-28 00:00:32 +04:00
|
|
|
'sumo.middleware.PlusToSpaceMiddleware',
|
2010-11-29 22:01:35 +03:00
|
|
|
'commonware.middleware.HidePasswordOnException',
|
2010-03-31 04:43:19 +04:00
|
|
|
)
|
|
|
|
|
|
|
|
# Auth
|
|
|
|
AUTHENTICATION_BACKENDS = (
|
2010-11-22 23:55:15 +03:00
|
|
|
'users.backends.Sha256Backend',
|
2010-02-04 02:09:30 +03:00
|
|
|
)
|
2010-12-01 02:21:33 +03:00
|
|
|
AUTH_PROFILE_MODULE = 'users.Profile'
|
2010-12-03 03:38:17 +03:00
|
|
|
USER_AVATAR_PATH = 'uploads/avatars/'
|
2010-12-04 01:00:22 +03:00
|
|
|
DEFAULT_AVATAR = MEDIA_URL + 'img/avatar.png'
|
2010-12-07 05:40:06 +03:00
|
|
|
AVATAR_SIZE = 48 # in pixels
|
2010-12-02 18:32:32 +03:00
|
|
|
ACCOUNT_ACTIVATION_DAYS = 30
|
2010-12-07 05:40:06 +03:00
|
|
|
MAX_AVATAR_FILE_SIZE = 131072 # 100k, in bytes
|
2010-02-04 02:09:30 +03:00
|
|
|
|
2010-04-22 01:52:58 +04:00
|
|
|
ROOT_URLCONF = '%s.urls' % ROOT_PACKAGE
|
2010-02-04 02:09:30 +03:00
|
|
|
|
|
|
|
TEMPLATE_DIRS = (
|
2010-02-11 21:56:11 +03:00
|
|
|
# Put strings here, like "/home/html/django_templates"
|
2010-02-04 02:09:30 +03:00
|
|
|
# Always use forward slashes, even on Windows.
|
|
|
|
# Don't forget to use absolute paths, not relative paths.
|
2010-02-04 02:16:45 +03:00
|
|
|
path('templates'),
|
2010-02-04 02:09:30 +03:00
|
|
|
)
|
|
|
|
|
2010-06-23 22:43:24 +04:00
|
|
|
# TODO: Figure out why changing the order of apps (for example, moving taggit
|
|
|
|
# higher in the list) breaks tests.
|
2010-02-04 02:09:30 +03:00
|
|
|
INSTALLED_APPS = (
|
|
|
|
'django.contrib.auth',
|
|
|
|
'django.contrib.contenttypes',
|
|
|
|
'django.contrib.sessions',
|
|
|
|
'django.contrib.sites',
|
|
|
|
'django.contrib.messages',
|
2010-05-19 06:00:23 +04:00
|
|
|
'django.contrib.admin',
|
2010-11-22 23:55:15 +03:00
|
|
|
'users',
|
2010-04-06 22:01:47 +04:00
|
|
|
'tower',
|
2010-04-08 23:19:09 +04:00
|
|
|
'jingo_minify',
|
2010-04-22 01:52:58 +04:00
|
|
|
ROOT_PACKAGE,
|
2010-05-15 05:10:59 +04:00
|
|
|
'authority',
|
2010-12-01 02:21:33 +03:00
|
|
|
'timezones',
|
2011-03-05 01:35:10 +03:00
|
|
|
'waffle',
|
2010-06-02 03:35:09 +04:00
|
|
|
'access',
|
2010-02-11 04:32:02 +03:00
|
|
|
'sumo',
|
|
|
|
'search',
|
2010-04-24 01:08:50 +04:00
|
|
|
'forums',
|
2010-09-11 02:38:43 +04:00
|
|
|
'djcelery',
|
2010-06-30 22:23:32 +04:00
|
|
|
'cronjobs',
|
2010-05-27 03:36:01 +04:00
|
|
|
'notifications',
|
2011-03-07 22:39:41 +03:00
|
|
|
'activity',
|
2010-05-12 22:50:50 +04:00
|
|
|
'questions',
|
2011-03-04 04:05:11 +03:00
|
|
|
'adminplus',
|
2010-06-18 19:57:39 +04:00
|
|
|
'kadmin',
|
2010-06-23 22:43:24 +04:00
|
|
|
'taggit',
|
2010-07-20 01:15:39 +04:00
|
|
|
'flagit',
|
2010-07-15 05:54:41 +04:00
|
|
|
'upload',
|
2010-08-14 02:17:48 +04:00
|
|
|
'product_details',
|
2010-09-02 05:00:30 +04:00
|
|
|
'wiki',
|
2010-10-09 01:49:35 +04:00
|
|
|
'kbforums',
|
2010-10-19 05:20:02 +04:00
|
|
|
'dashboards',
|
2010-09-02 05:00:30 +04:00
|
|
|
'gallery',
|
2010-08-30 17:37:06 +04:00
|
|
|
'customercare',
|
2010-09-25 01:33:14 +04:00
|
|
|
'twitter',
|
2010-10-21 03:40:09 +04:00
|
|
|
'chat',
|
2011-01-13 21:17:32 +03:00
|
|
|
'inproduct',
|
2011-03-03 03:46:43 +03:00
|
|
|
'postcrash',
|
2011-03-04 17:23:46 +03:00
|
|
|
'landings',
|
2010-02-04 02:18:25 +03:00
|
|
|
|
2010-12-23 02:37:18 +03:00
|
|
|
# Extra apps for testing.
|
|
|
|
'django_nose',
|
|
|
|
'test_utils',
|
|
|
|
)
|
2010-04-08 03:43:51 +04:00
|
|
|
|
2010-02-11 03:36:35 +03:00
|
|
|
TEST_RUNNER = 'test_utils.runner.RadicalTestSuiteRunner'
|
2010-08-25 06:39:26 +04:00
|
|
|
TEST_UTILS_NO_TRUNCATE = ('django_content_type',)
|
2010-02-11 03:36:35 +03:00
|
|
|
|
2010-05-25 00:44:28 +04:00
|
|
|
|
2010-04-06 22:01:47 +04:00
|
|
|
def JINJA_CONFIG():
|
|
|
|
import jinja2
|
|
|
|
from django.conf import settings
|
|
|
|
from caching.base import cache
|
2010-09-22 19:08:56 +04:00
|
|
|
config = {'extensions': ['tower.template.i18n', 'caching.ext.cache',
|
|
|
|
'jinja2.ext.with_'],
|
2010-04-06 22:01:47 +04:00
|
|
|
'finalize': lambda x: x if x is not None else ''}
|
|
|
|
if 'memcached' in cache.scheme 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
|
|
|
|
|
2010-07-23 01:29:09 +04:00
|
|
|
# Let Tower know about our additional keywords.
|
|
|
|
# DO NOT import an ngettext variant as _lazy.
|
|
|
|
TOWER_KEYWORDS = {
|
|
|
|
'_lazy': None,
|
|
|
|
}
|
|
|
|
|
2010-04-06 22:01:47 +04:00
|
|
|
# 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': [
|
2010-11-16 00:52:50 +03:00
|
|
|
('vendor/**', 'ignore'),
|
2010-07-23 01:29:09 +04:00
|
|
|
('apps/forums/**', 'ignore'),
|
|
|
|
('apps/questions/**', 'ignore'),
|
2010-10-21 03:40:09 +04:00
|
|
|
('apps/chat/**', 'ignore'),
|
2010-04-06 22:01:47 +04:00
|
|
|
('apps/**.py',
|
|
|
|
'tower.management.commands.extract.extract_tower_python'),
|
|
|
|
('**/templates/**.html',
|
|
|
|
'tower.management.commands.extract.extract_tower_template'),
|
|
|
|
],
|
|
|
|
'lhtml': [
|
2010-07-23 01:29:09 +04:00
|
|
|
('apps/forums/**', 'ignore'),
|
|
|
|
('apps/questions/**', 'ignore'),
|
2010-04-06 22:01:47 +04:00
|
|
|
('**/templates/**.lhtml',
|
|
|
|
'tower.management.commands.extract.extract_tower_template'),
|
|
|
|
],
|
|
|
|
'javascript': [
|
|
|
|
# We can't say **.js because that would dive into any libraries.
|
|
|
|
('media/js/*.js', 'javascript'),
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
2010-07-01 02:24:01 +04:00
|
|
|
# These domains will not be merged into messages.pot and will use separate PO
|
|
|
|
# files. See the following URL for an example of how to set these domains
|
|
|
|
# in DOMAIN_METHODS.
|
|
|
|
# http://github.com/jbalogh/zamboni/blob/d4c64239c24aa2f1e91276909823d1d1b290f0ee/settings.py#L254
|
|
|
|
STANDALONE_DOMAINS = [
|
|
|
|
'javascript',
|
|
|
|
]
|
|
|
|
|
2010-04-06 22:01:47 +04:00
|
|
|
# If you have trouble extracting strings with Tower, try setting this
|
|
|
|
# to True
|
2010-05-13 06:25:56 +04:00
|
|
|
TOWER_ADD_HEADERS = True
|
2010-04-06 22:01:47 +04:00
|
|
|
|
2010-04-08 23:19:09 +04:00
|
|
|
# Bundles for JS/CSS Minification
|
|
|
|
MINIFY_BUNDLES = {
|
|
|
|
'css': {
|
|
|
|
'common': (
|
2010-12-08 03:10:35 +03:00
|
|
|
'css/reset.css',
|
|
|
|
'global/headerfooter.css',
|
2011-01-28 19:43:04 +03:00
|
|
|
'css/kbox.css',
|
2010-04-08 23:19:09 +04:00
|
|
|
'css/main.css',
|
2010-06-04 22:34:44 +04:00
|
|
|
),
|
2011-01-11 03:42:33 +03:00
|
|
|
# TODO: remove dependency on jquery ui CSS and use our own
|
2011-01-11 02:30:51 +03:00
|
|
|
'jqueryui/jqueryui': (
|
|
|
|
'css/jqueryui/jqueryui.css',
|
|
|
|
),
|
2010-06-04 22:34:44 +04:00
|
|
|
'forums': (
|
2010-05-06 21:40:21 +04:00
|
|
|
'css/forums.css',
|
2010-04-08 23:19:09 +04:00
|
|
|
),
|
2010-05-25 00:44:28 +04:00
|
|
|
'questions': (
|
2010-11-12 03:49:31 +03:00
|
|
|
'css/to-delete.css',
|
2010-05-25 00:44:28 +04:00
|
|
|
'css/questions.css',
|
2010-06-23 22:43:24 +04:00
|
|
|
'css/tags.css',
|
2010-05-25 00:44:28 +04:00
|
|
|
),
|
2010-04-08 23:19:09 +04:00
|
|
|
'search': (
|
|
|
|
'css/search.css',
|
|
|
|
),
|
2010-08-19 21:19:17 +04:00
|
|
|
'wiki': (
|
|
|
|
'css/wiki.css',
|
2011-02-16 04:31:17 +03:00
|
|
|
'css/wiki_syntax.css',
|
2010-10-21 04:38:52 +04:00
|
|
|
# The dashboard app uses the wiki bundle because only the wiki app
|
|
|
|
# has the new theme at the moment.
|
|
|
|
'css/dashboards.css',
|
2010-09-30 07:04:54 +04:00
|
|
|
'css/screencast.css',
|
2010-11-10 00:25:22 +03:00
|
|
|
'css/tags.css',
|
2010-08-19 21:19:17 +04:00
|
|
|
),
|
2010-10-19 05:20:02 +04:00
|
|
|
'home': (
|
|
|
|
'css/home.css',
|
|
|
|
),
|
2010-09-09 00:41:23 +04:00
|
|
|
'gallery': (
|
2010-11-12 03:49:31 +03:00
|
|
|
'css/to-delete.css',
|
2010-09-09 00:41:23 +04:00
|
|
|
'css/gallery.css',
|
|
|
|
),
|
2010-05-04 23:43:13 +04:00
|
|
|
'ie': (
|
|
|
|
'css/ie.css',
|
2011-02-23 02:20:40 +03:00
|
|
|
'css/ie8.css',
|
|
|
|
),
|
|
|
|
'ie8': ( # IE 8 needs some specific help.
|
|
|
|
'css/ie8.css',
|
2010-05-04 23:43:13 +04:00
|
|
|
),
|
2010-09-24 16:24:28 +04:00
|
|
|
'customercare': (
|
|
|
|
'css/customercare.css',
|
|
|
|
),
|
2010-10-21 03:40:09 +04:00
|
|
|
'chat': (
|
|
|
|
'css/chat.css',
|
|
|
|
),
|
2010-11-22 23:55:15 +03:00
|
|
|
'users': (
|
|
|
|
'css/users.css',
|
|
|
|
),
|
2010-12-11 03:15:34 +03:00
|
|
|
'monitor': (
|
|
|
|
'css/monitor.css',
|
|
|
|
),
|
2011-02-08 01:23:43 +03:00
|
|
|
'mobile': (
|
2011-02-09 04:32:20 +03:00
|
|
|
'global/mobile.css',
|
2011-02-08 01:23:43 +03:00
|
|
|
'css/mobile.css',
|
2011-02-23 00:54:44 +03:00
|
|
|
'css/wiki_syntax.css',
|
2011-02-08 01:23:43 +03:00
|
|
|
)
|
2010-04-08 23:19:09 +04:00
|
|
|
},
|
|
|
|
'js': {
|
|
|
|
'common': (
|
2011-02-25 22:37:47 +03:00
|
|
|
'js/i18n.js',
|
2010-05-25 00:44:28 +04:00
|
|
|
'js/libs/jquery.min.js',
|
2011-03-01 00:40:47 +03:00
|
|
|
'js/libs/modernizr-1.7.js',
|
2011-02-25 17:28:01 +03:00
|
|
|
'js/libs/jquery.cookie.js',
|
2011-01-28 19:43:04 +03:00
|
|
|
'js/kbox.js',
|
2010-12-08 03:10:35 +03:00
|
|
|
'global/menu.js',
|
2010-05-22 04:17:50 +04:00
|
|
|
'js/main.js',
|
2010-04-08 23:19:09 +04:00
|
|
|
),
|
2011-01-11 03:42:33 +03:00
|
|
|
'libs/jqueryui': (
|
2010-06-23 22:43:24 +04:00
|
|
|
'js/libs/jqueryui.min.js',
|
2011-01-11 03:42:33 +03:00
|
|
|
),
|
|
|
|
'questions': (
|
2010-07-15 05:54:41 +04:00
|
|
|
'js/markup.js',
|
2010-11-03 02:20:23 +03:00
|
|
|
'js/libs/jquery.ajaxupload.js',
|
2011-02-24 00:24:43 +03:00
|
|
|
'js/browserdetect.js',
|
|
|
|
'js/aaq.js',
|
2010-07-15 05:54:41 +04:00
|
|
|
'js/upload.js',
|
|
|
|
'js/questions.js',
|
2010-06-23 22:43:24 +04:00
|
|
|
'js/tags.js',
|
2010-05-25 00:44:28 +04:00
|
|
|
),
|
2010-04-08 23:19:09 +04:00
|
|
|
'search': (
|
|
|
|
'js/search.js',
|
|
|
|
),
|
2010-05-25 02:37:06 +04:00
|
|
|
'forums': (
|
|
|
|
'js/markup.js',
|
2010-10-05 20:31:28 +04:00
|
|
|
'js/forums.js',
|
2010-08-19 21:19:17 +04:00
|
|
|
),
|
2010-11-03 02:20:23 +03:00
|
|
|
'gallery': (
|
|
|
|
'js/libs/jquery.ajaxupload.js',
|
|
|
|
'js/gallery.js',
|
|
|
|
),
|
2010-08-19 21:19:17 +04:00
|
|
|
'wiki': (
|
2010-10-05 20:31:28 +04:00
|
|
|
'js/markup.js',
|
2010-09-01 04:24:39 +04:00
|
|
|
'js/libs/django/urlify.js',
|
|
|
|
'js/libs/django/prepopulate.js',
|
2010-09-21 01:01:15 +04:00
|
|
|
'js/browserdetect.js',
|
2010-09-30 07:04:54 +04:00
|
|
|
'js/libs/swfobject.js',
|
2010-11-02 00:16:11 +03:00
|
|
|
'js/libs/jquery.selectbox-1.2.js',
|
2010-11-20 02:09:31 +03:00
|
|
|
'js/screencast.js',
|
2011-02-08 02:56:21 +03:00
|
|
|
'js/showfor.js',
|
2011-02-16 18:30:32 +03:00
|
|
|
'js/wikivote.js',
|
2010-09-22 02:33:29 +04:00
|
|
|
'js/wiki.js',
|
2010-11-10 00:25:22 +03:00
|
|
|
'js/tags.js',
|
2011-01-11 02:06:29 +03:00
|
|
|
'js/dashboards.js',
|
2010-08-19 21:19:17 +04:00
|
|
|
),
|
2010-09-24 16:24:28 +04:00
|
|
|
'customercare': (
|
|
|
|
'js/libs/jquery.NobleCount.js',
|
2010-09-29 15:16:26 +04:00
|
|
|
'js/libs/jquery.cookie.js',
|
2010-10-29 03:28:48 +04:00
|
|
|
'js/libs/jquery.bullseye-1.0.min.js',
|
2010-09-24 16:24:28 +04:00
|
|
|
'js/customercare.js',
|
2011-01-15 03:22:33 +03:00
|
|
|
'js/users.js',
|
2010-09-24 16:24:28 +04:00
|
|
|
),
|
2010-10-21 03:40:09 +04:00
|
|
|
'chat': (
|
|
|
|
'js/chat.js',
|
|
|
|
),
|
2010-12-23 04:58:58 +03:00
|
|
|
'users': (
|
|
|
|
'js/users.js',
|
|
|
|
),
|
2011-02-08 01:23:43 +03:00
|
|
|
'mobile': (
|
2011-03-01 02:44:46 +03:00
|
|
|
'global/mobilefeatures.js',
|
2011-02-25 22:37:47 +03:00
|
|
|
'js/i18n.js',
|
2011-02-08 01:23:43 +03:00
|
|
|
'js/libs/jquery.min.js',
|
2011-02-09 04:32:20 +03:00
|
|
|
'js/libs/jquery.cookie.js',
|
2011-02-09 19:50:40 +03:00
|
|
|
'js/browserdetect.js',
|
|
|
|
'js/showfor.js',
|
2011-02-16 18:30:32 +03:00
|
|
|
'js/wikivote.js',
|
2011-02-24 00:24:43 +03:00
|
|
|
'js/aaq.js',
|
2011-02-08 01:23:43 +03:00
|
|
|
'js/mobile.js',
|
|
|
|
),
|
2010-04-08 23:19:09 +04:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
JAVA_BIN = '/usr/bin/java'
|
|
|
|
|
2010-05-21 20:56:05 +04:00
|
|
|
#
|
|
|
|
# Session cookies
|
|
|
|
SESSION_COOKIE_SECURE = True
|
|
|
|
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
|
|
|
|
|
2010-02-04 02:18:25 +03:00
|
|
|
#
|
|
|
|
# Connection information for Sphinx search
|
|
|
|
SPHINX_HOST = '127.0.0.1'
|
2010-05-08 04:34:06 +04:00
|
|
|
SPHINX_PORT = 3381
|
2010-10-04 20:15:49 +04:00
|
|
|
SPHINXQL_PORT = 3382
|
2010-02-06 04:04:33 +03:00
|
|
|
|
2010-04-08 03:43:51 +04:00
|
|
|
SPHINX_INDEXER = '/usr/bin/indexer'
|
|
|
|
SPHINX_SEARCHD = '/usr/bin/searchd'
|
2010-04-02 03:27:16 +04:00
|
|
|
SPHINX_CONFIG_PATH = path('configs/sphinx/sphinx.conf')
|
|
|
|
|
2010-10-04 20:15:49 +04:00
|
|
|
TEST_SPHINX_PATH = path('tmp/test/sphinx')
|
|
|
|
TEST_SPHINX_PORT = 3416
|
|
|
|
TEST_SPHINXQL_PORT = 3418
|
|
|
|
|
2010-02-11 21:56:11 +03:00
|
|
|
SEARCH_MAX_RESULTS = 1000
|
2010-02-10 00:11:20 +03:00
|
|
|
SEARCH_RESULTS_PER_PAGE = 10
|
|
|
|
|
|
|
|
# Search default settings
|
2010-07-27 20:39:07 +04:00
|
|
|
# comma-separated tuple of included category IDs. Negative IDs are excluded.
|
2010-11-10 22:28:40 +03:00
|
|
|
SEARCH_DEFAULT_CATEGORIES = (10, 20,)
|
2010-03-02 03:56:30 +03:00
|
|
|
SEARCH_SUMMARY_LENGTH = 275
|
2010-05-21 02:55:14 +04:00
|
|
|
|
|
|
|
# The length for which we would like the user to cache search forms and
|
|
|
|
# results, in minutes.
|
|
|
|
SEARCH_CACHE_PERIOD = 15
|
2010-05-15 05:10:59 +04:00
|
|
|
|
2010-10-16 06:40:10 +04:00
|
|
|
# Maximum length of the filename. Forms should use this and raise
|
|
|
|
# ValidationError if the length is exceeded.
|
|
|
|
# @see http://code.djangoproject.com/ticket/9893
|
|
|
|
# Columns are 250 but this leaves 50 chars for the upload_to prefix
|
|
|
|
MAX_FILENAME_LENGTH = 200
|
|
|
|
MAX_FILEPATH_LENGTH = 250
|
2010-12-17 02:13:51 +03:00
|
|
|
# Default storage engine - ours does not preserve filenames
|
|
|
|
DEFAULT_FILE_STORAGE = 'upload.storage.RenameFileStorage'
|
2010-10-16 06:40:10 +04:00
|
|
|
|
2010-05-15 05:10:59 +04:00
|
|
|
# Auth and permissions related constants
|
2010-11-22 23:55:15 +03:00
|
|
|
LOGIN_URL = '/users/login'
|
|
|
|
LOGOUT_URL = '/users/logout'
|
|
|
|
LOGIN_REDIRECT_URL = "/"
|
|
|
|
LOGOUT_REDIRECT_URL = "/"
|
|
|
|
REGISTER_URL = '/users/register'
|
2010-12-23 02:37:18 +03:00
|
|
|
|
|
|
|
# Video settings, hard coded here for now.
|
|
|
|
# TODO: figure out a way that doesn't need these values
|
2010-09-30 07:04:54 +04:00
|
|
|
WIKI_VIDEO_WIDTH = 640
|
|
|
|
WIKI_VIDEO_HEIGHT = 480
|
2010-05-27 03:36:01 +04:00
|
|
|
|
2010-07-30 00:33:54 +04:00
|
|
|
IMAGE_MAX_FILESIZE = 1048576 # 1 megabyte, in bytes
|
2010-07-23 12:44:37 +04:00
|
|
|
THUMBNAIL_SIZE = 120 # Thumbnail size, in pixels
|
|
|
|
THUMBNAIL_UPLOAD_PATH = 'uploads/images/thumbnails/'
|
|
|
|
IMAGE_UPLOAD_PATH = 'uploads/images/'
|
|
|
|
# A string listing image mime types to accept, comma separated.
|
|
|
|
# String must not contain double quotes!
|
|
|
|
IMAGE_ALLOWED_MIMETYPES = 'image/jpeg,image/png,image/gif'
|
2010-07-15 05:54:41 +04:00
|
|
|
|
2010-07-27 20:39:07 +04:00
|
|
|
# Max number of wiki pages or other questions to suggest might answer the
|
|
|
|
# question you're about to ask
|
|
|
|
QUESTIONS_MAX_SUGGESTIONS = 5
|
|
|
|
# Number of extra suggestion results to pull from Sphinx to make up for
|
|
|
|
# possibly deleted wiki pages or question. To be safe, set this to the number
|
|
|
|
# of things that could be deleted between indexer runs.
|
|
|
|
QUESTIONS_SUGGESTION_SLOP = 3
|
|
|
|
|
2010-05-27 03:36:01 +04:00
|
|
|
# Email
|
|
|
|
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
|
|
|
|
2010-10-08 21:34:44 +04:00
|
|
|
|
|
|
|
# Read-only mode setup.
|
|
|
|
READ_ONLY = False
|
|
|
|
|
2010-12-23 02:37:18 +03:00
|
|
|
|
2010-10-08 21:34:44 +04:00
|
|
|
# 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'] = ()
|
|
|
|
|
|
|
|
# Add in the read-only middleware before csrf middleware.
|
|
|
|
extra = 'sumo.middleware.ReadOnlyMiddleware'
|
|
|
|
before = 'django.middleware.csrf.CsrfViewMiddleware'
|
|
|
|
m = list(env['MIDDLEWARE_CLASSES'])
|
|
|
|
m.insert(m.index(before), extra)
|
|
|
|
env['MIDDLEWARE_CLASSES'] = tuple(m)
|
|
|
|
|
|
|
|
|
2010-05-27 03:36:01 +04:00
|
|
|
# Celery
|
2010-09-11 02:38:43 +04:00
|
|
|
import djcelery
|
|
|
|
djcelery.setup_loader()
|
|
|
|
|
2010-05-27 03:36:01 +04:00
|
|
|
BROKER_HOST = 'localhost'
|
|
|
|
BROKER_PORT = 5672
|
|
|
|
BROKER_USER = 'kitsune'
|
|
|
|
BROKER_PASSWORD = 'kitsune'
|
|
|
|
BROKER_VHOST = 'kitsune'
|
|
|
|
CELERY_RESULT_BACKEND = 'amqp'
|
|
|
|
CELERY_IGNORE_RESULT = True
|
2010-06-02 07:55:31 +04:00
|
|
|
CELERY_ALWAYS_EAGER = True # For tests. Set to False for use.
|
2010-12-11 00:09:28 +03:00
|
|
|
CELERY_SEND_TASK_ERROR_EMAILS = True
|
|
|
|
CELERYD_LOG_LEVEL = logging.INFO
|
|
|
|
CELERYD_CONCURRENCY = 4
|
2011-03-10 03:29:34 +03:00
|
|
|
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True # Explode loudly during tests.
|
2010-06-28 20:30:02 +04:00
|
|
|
|
2010-11-06 00:07:00 +03:00
|
|
|
# Wiki rebuild settings
|
|
|
|
WIKI_REBUILD_TOKEN = 'sumo:wiki:full-rebuild'
|
|
|
|
WIKI_REBUILD_ON_DEMAND = False
|
|
|
|
|
2010-06-28 20:30:02 +04:00
|
|
|
# Anonymous user cookie
|
|
|
|
ANONYMOUS_COOKIE_NAME = 'SUMO_ANONID'
|
|
|
|
ANONYMOUS_COOKIE_MAX_AGE = 30 * 86400 # Seconds
|
2010-07-02 18:18:15 +04:00
|
|
|
|
|
|
|
# Top contributors cache settings
|
|
|
|
TOP_CONTRIBUTORS_CACHE_KEY = 'sumo:TopContributors'
|
|
|
|
TOP_CONTRIBUTORS_CACHE_TIMEOUT = 60 * 60 * 12
|
2010-08-14 02:17:48 +04:00
|
|
|
|
2010-08-19 01:38:54 +04:00
|
|
|
# Do not change this without also deleting all wiki documents:
|
2010-08-14 02:17:48 +04:00
|
|
|
WIKI_DEFAULT_LANGUAGE = LANGUAGE_CODE
|
2010-09-02 05:00:30 +04:00
|
|
|
|
|
|
|
# Gallery settings
|
|
|
|
GALLERY_DEFAULT_LANGUAGE = WIKI_DEFAULT_LANGUAGE
|
|
|
|
GALLERY_IMAGE_PATH = 'uploads/gallery/images/'
|
|
|
|
GALLERY_IMAGE_THUMBNAIL_PATH = 'uploads/gallery/images/thumbnails/'
|
|
|
|
GALLERY_VIDEO_PATH = 'uploads/gallery/videos/'
|
2010-11-20 03:11:01 +03:00
|
|
|
GALLERY_VIDEO_URL = None
|
2010-09-02 05:00:30 +04:00
|
|
|
GALLERY_VIDEO_THUMBNAIL_PATH = 'uploads/gallery/videos/thumbnails/'
|
2010-11-17 00:34:11 +03:00
|
|
|
GALLERY_VIDEO_THUMBNAIL_PROGRESS_URL = MEDIA_URL + 'img/video-thumb.png'
|
2010-11-03 02:20:23 +03:00
|
|
|
THUMBNAIL_PROGRESS_WIDTH = 32 # width of the above image
|
|
|
|
THUMBNAIL_PROGRESS_HEIGHT = 32 # height of the above image
|
2010-09-08 02:23:09 +04:00
|
|
|
VIDEO_MAX_FILESIZE = 16777216 # 16 megabytes, in bytes
|
2010-08-30 17:37:06 +04:00
|
|
|
|
2010-12-02 02:48:53 +03:00
|
|
|
# Customer Care settings
|
|
|
|
CC_MAX_TWEETS = 500 # Max. no. of tweets in DB
|
|
|
|
CC_TWEETS_PERPAGE = 100 # How many tweets to collect in one go. Max: 100.
|
|
|
|
CC_SHOW_REPLIES = True # Show replies to tweets?
|
2011-02-18 01:29:21 +03:00
|
|
|
CC_ALLOW_REMOVE = True # Allow users to hide tweets?
|
2010-09-24 16:24:28 +04:00
|
|
|
|
2010-12-02 02:48:53 +03:00
|
|
|
CC_TWEET_ACTIVITY_URL = 'https://metrics.mozilla.com/stats/twitter/armyOfAwesomeKillRate.json' # Tweet activity stats
|
|
|
|
CC_TOP_CONTRIB_URL = 'https://metrics.mozilla.com/stats/twitter/armyOfAwesomeTopSoldiers.json' # Top contributor stats
|
|
|
|
CC_TWEET_ACTIVITY_CACHE_KEY = 'sumo-cc-tweet-stats'
|
|
|
|
CC_TOP_CONTRIB_CACHE_KEY = 'sumo-cc-top-contrib-stats'
|
|
|
|
CC_STATS_CACHE_TIMEOUT = 24 * 60 * 60 # 24 hours
|
2010-12-02 20:42:14 +03:00
|
|
|
CC_STATS_WARNING = 30 * 60 * 60 # Warn if JSON data is older than 30 hours
|
2010-12-23 02:37:18 +03:00
|
|
|
CC_IGNORE_USERS = ['fx4status'] # User names whose tweets to ignore.
|
2010-11-20 04:03:27 +03:00
|
|
|
|
2010-09-24 16:24:28 +04:00
|
|
|
TWITTER_CONSUMER_KEY = ''
|
|
|
|
TWITTER_CONSUMER_SECRET = ''
|
2010-09-28 19:19:12 +04:00
|
|
|
|
2010-12-02 02:48:53 +03:00
|
|
|
|
2010-09-28 19:19:12 +04:00
|
|
|
NOTIFICATIONS_FROM_ADDRESS = 'notifications@support.mozilla.com'
|
2011-02-03 09:52:28 +03:00
|
|
|
# Anonymous watches must be confirmed.
|
|
|
|
CONFIRM_ANONYMOUS_WATCHES = True
|
|
|
|
|
2010-10-21 03:40:09 +04:00
|
|
|
|
|
|
|
# URL of the chat server.
|
|
|
|
CHAT_SERVER = 'https://chat-support.mozilla.com:9091'
|
|
|
|
CHAT_CACHE_KEY = 'sumo-chat-queue-status'
|
2011-01-04 02:05:04 +03:00
|
|
|
|
2011-01-12 04:43:44 +03:00
|
|
|
WEBTRENDS_WIKI_REPORT_URL = 'https://example.com/see_production.rst'
|
|
|
|
WEBTRENDS_USER = r'someaccount\someusername'
|
|
|
|
WEBTRENDS_PASSWORD = 'password'
|
2011-01-04 02:05:04 +03:00
|
|
|
WEBTRENDS_EPOCH = date(2010, 8, 1) # When WebTrends started gathering stats on
|
|
|
|
# the KB
|
|
|
|
WEBTRENDS_REALM = 'Webtrends Basic Authentication'
|
2011-02-08 01:23:43 +03:00
|
|
|
|
2011-02-09 04:32:20 +03:00
|
|
|
MOBILE_COOKIE = 'msumo'
|
2011-02-12 01:19:46 +03:00
|
|
|
|
|
|
|
# Directory of JavaScript test files for django_qunit to run
|
|
|
|
QUNIT_TEST_DIRECTORY = os.path.join(MEDIA_ROOT, 'js', 'tests')
|