changeset 499:1a09a7bea000

For #236, switch to a settings package scheme.
author Brian Neal <bgneal@gmail.com>
date Wed, 30 Nov 2011 02:41:18 +0000
parents b137a0966e4b
children 886cc99e8406
files gpp/apache/sg101.wsgi gpp/settings.py gpp/settings/__init__.py gpp/settings/base.py gpp/settings/local.py gpp/settings/production.py gpp/settings/test.py gpp/test_settings.py
diffstat 7 files changed, 482 insertions(+), 348 deletions(-) [+]
line wrap: on
line diff
--- a/gpp/apache/sg101.wsgi	Thu Nov 24 21:27:07 2011 +0000
+++ b/gpp/apache/sg101.wsgi	Wed Nov 30 02:41:18 2011 +0000
@@ -32,7 +32,7 @@
 
 
 if not OFFLINE:
-   os.environ['DJANGO_SETTINGS_MODULE'] = 'gpp.settings'
+   os.environ['DJANGO_SETTINGS_MODULE'] = 'gpp.settings.production'
    import django.core.handlers.wsgi
    application = django.core.handlers.wsgi.WSGIHandler()
 else:
--- a/gpp/settings.py	Thu Nov 24 21:27:07 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,330 +0,0 @@
-# Django settings for gpp project.
-
-import os
-import platform
-from decimal import Decimal
-
-from django.contrib.messages import constants as message_constants
-
-import local_settings
-
-project_path = os.path.abspath(os.path.split(__file__)[0])
-
-DEBUG = local_settings.DEBUG
-TEMPLATE_DEBUG = DEBUG
-
-ADMINS = (
-    ('Brian Neal', 'admin@surfguitar101.com'),
-)
-
-AUTH_PROFILE_MODULE = 'bio.userprofile'
-
-MANAGERS = ADMINS
-
-DATABASES = local_settings.DATABASES
-
-INTERNAL_IPS = local_settings.INTERNAL_IPS
-
-# 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.
-TIME_ZONE = local_settings.TIME_ZONE
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en-us'
-
-SITE_ID = local_settings.SITE_ID
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = False
-
-# Absolute path to the directory that holds media.
-# Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = local_settings.MEDIA_ROOT
-
-# 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 = local_settings.MEDIA_URL
-
-# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
-# trailing slash.
-# Examples: "http://foo.com/media/", "/media/".
-ADMIN_MEDIA_PREFIX = local_settings.ADMIN_MEDIA_PREFIX
-
-# Staticfiles settings:
-STATICFILES_DIRS = local_settings.STATICFILES_DIRS
-STATIC_ROOT = local_settings.STATIC_ROOT
-STATIC_URL = local_settings.STATIC_URL
-
-# Make this unique, and don't share it with anybody.
-SECRET_KEY = local_settings.SECRET_KEY
-
-# List of Loader classes that know how to import templates from various sources.
-
-if DEBUG:
-    TEMPLATE_LOADERS = (
-        'django.template.loaders.filesystem.Loader',
-        'django.template.loaders.app_directories.Loader',
-    )
-else:
-    TEMPLATE_LOADERS = (
-        ('django.template.loaders.cached.Loader', (
-            'django.template.loaders.filesystem.Loader',
-            'django.template.loaders.app_directories.Loader',
-        )),
-    )
-
-if DEBUG:
-    MIDDLEWARE_CLASSES = (
-        'django.middleware.common.CommonMiddleware',
-        'django.middleware.csrf.CsrfViewMiddleware',
-        'django.contrib.sessions.middleware.SessionMiddleware',
-        'django.contrib.messages.middleware.MessageMiddleware',
-        'debug_toolbar.middleware.DebugToolbarMiddleware',
-        'django.contrib.auth.middleware.AuthenticationMiddleware',
-        'gpp.core.middleware.InactiveUserMiddleware',
-        'gpp.core.middleware.WhosOnline',
-        'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
-    )
-else:
-    MIDDLEWARE_CLASSES = (
-        'django.middleware.common.CommonMiddleware',
-        'django.middleware.csrf.CsrfViewMiddleware',
-        'django.contrib.sessions.middleware.SessionMiddleware',
-        'django.contrib.messages.middleware.MessageMiddleware',
-        'django.contrib.auth.middleware.AuthenticationMiddleware',
-        'gpp.core.middleware.InactiveUserMiddleware',
-        'gpp.core.middleware.WhosOnline',
-        'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
-    )
-
-ROOT_URLCONF = 'gpp.urls'
-
-TEMPLATE_DIRS = (
-    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-    os.path.join(project_path, 'templates'),
-)
-
-TEMPLATE_CONTEXT_PROCESSORS = (
-    "django.contrib.auth.context_processors.auth",
-    "django.core.context_processors.debug",
-    "django.core.context_processors.request",
-    "django.core.context_processors.media",
-    "django.core.context_processors.static",
-    "django.contrib.messages.context_processors.messages",
-)
-
-INSTALLED_APPS = [
-    'django.contrib.admin',
-    'django.contrib.admindocs',
-    'django.contrib.auth',
-    'django.contrib.contenttypes',
-    'django.contrib.flatpages',
-    'django.contrib.humanize',
-    'django.contrib.markup',
-    'django.contrib.messages',
-    'django.contrib.sessions',
-    'django.contrib.sites',
-    'django.contrib.staticfiles',
-    'elsewhere',
-    'tagging',
-    'haystack',
-    'queued_search',
-    'accounts',
-    'antispam',
-    'bio',
-    'bulletins',
-    'comments',
-    'contact',
-    'core',
-    'donations',
-    'downloads',
-    'forums',
-    'gcalendar',
-    'irc',
-    'legacy',
-    'mailer',
-    'membermap',
-    'messages',
-    'news',
-    'oembed',
-    'podcast',
-    'polls',
-    'potd',
-    'shoutbox',
-    'smiley',
-    'weblinks',
-    'ygroup',
-]
-if DEBUG:
-    INSTALLED_APPS.append('debug_toolbar')
-
-LOGIN_URL = '/accounts/login/'
-LOGIN_REDIRECT_URL = '/profile/me/'
-LOGOUT_URL = '/accounts/logout/'
-
-FILE_UPLOAD_PERMISSIONS = 0644
-DEFAULT_FROM_EMAIL = ADMINS[0][1]
-
-#######################################################################
-# Messages
-#######################################################################
-MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
-MESSAGE_TAGS = {
-    message_constants.DEBUG: 'notice',
-    message_constants.INFO: 'info',
-    message_constants.SUCCESS: 'success',
-    message_constants.WARNING: 'alert',
-    message_constants.ERROR: 'error',
-}
-
-#######################################################################
-# Email
-#######################################################################
-EMAIL_HOST = local_settings.EMAIL_HOST
-EMAIL_PORT = local_settings.EMAIL_PORT
-
-#######################################################################
-# Caching
-#######################################################################
-if local_settings.USE_CACHE:
-    CACHES = local_settings.CACHES
-    CACHE_MIDDLEWARE_ANONYMOUS_ONLY = local_settings.CACHE_MIDDLEWARE_ANONYMOUS_ONLY
-    CACHE_MIDDLEWARE_SECONDS = local_settings.CACHE_MIDDLEWARE_SECONDS
-    CACHE_MIDDLEWARE_KEY_PREFIX = local_settings.CACHE_MIDDLEWARE_KEY_PREFIX
-
-#######################################################################
-# Sessions
-#######################################################################
-SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
-SESSION_COOKIE_AGE = 2 * 7 * 24 * 60 * 60   # 2 weeks in seconds
-SESSION_COOKIE_DOMAIN = None
-SESSION_COOKIE_NAME = 'sg101_sessionid'
-SESSION_COOKIE_PATH = '/'
-SESSION_COOKIE_SECURE = False
-SESSION_EXPIRE_AT_BROWSER_CLOSE = False
-SESSION_SAVE_EVERY_REQUEST = False
-
-#######################################################################
-# Tagging Specific Settings
-#######################################################################
-FORCE_LOWERCASE_TAGS = True
-MAX_TAG_LENGTH = 50
-
-#######################################################################
-# Haystack Search Settings
-#######################################################################
-HAYSTACK_SITECONF = 'gpp.search_sites'
-HAYSTACK_SEARCH_ENGINE = 'xapian'
-HAYSTACK_XAPIAN_PATH = os.path.join(project_path, 'xapian_index')
-
-
-#######################################################################
-# GPP Specific Settings
-#######################################################################
-GPP_LOG_LEVEL = 0
-GPP_SEND_EMAIL = local_settings.GPP_SEND_EMAIL  # see MAILER_ENQUEUE_MAIL
-GPP_NO_REPLY_EMAIL = 'no_reply'
-AVATAR_DIR = 'avatars'
-MAX_AVATAR_SIZE_BYTES = 2 * 1024 * 1024
-MAX_AVATAR_SIZE_PIXELS = 100
-AVATAR_DEFAULT_URL = MEDIA_URL + AVATAR_DIR + '/default.png'
-
-# Donations application settings:
-DONATIONS_DEBUG = local_settings.DONATIONS_DEBUG
-DONATIONS_ITEM_NAME = 'Donation for SurfGuitar101.com'
-DONATIONS_BUSINESS = 'brian@surfguitar101.com'
-DONATIONS_BUSINESS_DEBUG = local_settings.DONATIONS_BUSINESS_DEBUG
-DONATIONS_GOAL = Decimal('100.00')  # monthly goal
-DONATIONS_ANON_NAME = u'Anonymous'
-DONATIONS_ITEM_NUM = '500'          # donation w/name listed
-DONATIONS_ITEM_ANON_NUM = '501'     # donation listed as anonymous
-
-# If MAILER_ENQUEUE_MAIL is True, all emails will be stored in the
-# mailer application's mail queue (database table). It is then expected
-# that a daemon or cron job will actually send the mail out. If
-# MAILER_ENQUEUE_MAIL is False, then email will only be sent if
-# the setting GPP_SEND_EMAIL (above) is True. In any event, emails
-# will be logged via the Python logger if the Python logger filter
-# DEBUG is active.
-
-MAILER_ENQUEUE_MAIL = True
-
-# Oembed settings
-OEMBED_MAXWIDTH = 480
-OEMBED_MAXHEIGHT = 295
-
-# GCalendar settings
-GCAL_CALENDAR_ID = 'i81lu3fkh57sgqqenogefd9v78@group.calendar.google.com'
-
-# Google OAuth settings
-GOOGLE_OAUTH_CONSUMER_KEY = local_settings.GOOGLE_OAUTH_CONSUMER_KEY
-GOOGLE_OAUTH_PRIVATE_KEY_PATH = local_settings.GOOGLE_OAUTH_PRIVATE_KEY_PATH
-
-#######################################################################
-# Configure Logging
-#######################################################################
-
-LOGGING = local_settings.LOGGING
-
-#######################################################################
-# Django Debug Toolbar 
-#######################################################################
-
-if DEBUG:
-    DEBUG_TOOLBAR_CONFIG = local_settings.DEBUG_TOOLBAR_CONFIG
-
-#######################################################################
-# Asynchronous settings (queues, queued_search, redis, celery, etc)
-#######################################################################
-QUEUE_BACKEND = 'redisd'
-QUEUE_REDIS_CONNECTION = 'localhost:6379'
-QUEUE_REDIS_DB = 0
-
-#######################################################################
-# Open Graph Protocol related settings
-#######################################################################
-OGP_DEFAULT_IMAGE = 'http://surfguitar101.com/media/podcast/podcast_logo.jpg'
-OGP_FB_ID = '100001558124013'
-
-#######################################################################
-# URL's of 3rd party Javascript and CSS files.
-# These dictionaries are used by core/templatetags/script_tags, and
-# should also be used by developers when creating form media classes.
-GPP_THIRD_PARTY_JS = {
-    'jquery': [
-        'http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js',
-    ],
-    'jquery-jeditable': [
-        'js/jquery.jeditable.mini.js',
-    ],
-    'jquery-ui': [
-        'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js',
-    ],
-    'markitup': [
-        'js/markitup/jquery.markitup.pack.js',
-        'js/markitup/sets/markdown/set.js',
-    ],
-    'tiny_mce': [
-        'js/tiny_mce/tiny_mce.js',
-        'js/tiny_mce_init_std.js',
-    ],
-}
-
-GPP_THIRD_PARTY_CSS = {
-    'jquery-ui': [
-        'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/themes/redmond/jquery-ui.css',
-    ],
-    'markitup': [
-        'js/markitup/skins/markitup/style.css',
-        'js/markitup/sets/markdown/style.css',
-    ],
-}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/settings/base.py	Wed Nov 30 02:41:18 2011 +0000
@@ -0,0 +1,284 @@
+# Base Django settings for the gpp project.
+
+import os
+from decimal import Decimal
+
+import django.utils.simplejson as json
+from django.contrib.messages import constants as message_constants
+
+PROJECT_PATH = os.path.abspath(os.path.join(os.path.split(__file__)[0], '..'))
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    ('Brian Neal', 'admin@surfguitar101.com'),
+)
+
+MANAGERS = ADMINS
+
+AUTH_PROFILE_MODULE = 'bio.userprofile'
+
+INTERNAL_IPS = ['127.0.0.1']
+
+# 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.
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = False
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = os.path.abspath(os.path.join(PROJECT_PATH, '..', 'media'))
+
+# 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/'
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/static/admin/'
+
+# Staticfiles settings:
+STATICFILES_DIRS = [
+    os.path.abspath(os.path.join(PROJECT_PATH, '..', 'static')),
+]
+STATIC_ROOT = '/tmp/test_static_root'
+STATIC_URL = '/static/'
+
+# Make this unique, and don't share it with anybody.
+SECRETS = json.load(open(os.path.join(PROJECT_PATH, 'settings', 'secrets.json')))
+SECRET_KEY = SECRETS['SECRET_KEY']
+
+# List of Loader classes that know how to import templates from various sources.
+
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.Loader',
+    'django.template.loaders.app_directories.Loader',
+)
+
+MIDDLEWARE_CLASSES = [
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'gpp.core.middleware.InactiveUserMiddleware',
+    'gpp.core.middleware.WhosOnline',
+    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
+]
+
+ROOT_URLCONF = 'gpp.urls'
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+    os.path.join(PROJECT_PATH, 'templates'),
+)
+
+TEMPLATE_CONTEXT_PROCESSORS = (
+    "django.contrib.auth.context_processors.auth",
+    "django.core.context_processors.debug",
+    "django.core.context_processors.request",
+    "django.core.context_processors.media",
+    "django.core.context_processors.static",
+    "django.contrib.messages.context_processors.messages",
+)
+
+INSTALLED_APPS = [
+    'django.contrib.admin',
+    'django.contrib.admindocs',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.flatpages',
+    'django.contrib.humanize',
+    'django.contrib.markup',
+    'django.contrib.messages',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.staticfiles',
+    'elsewhere',
+    'tagging',
+    'haystack',
+    'queued_search',
+    'accounts',
+    'antispam',
+    'bio',
+    'bulletins',
+    'comments',
+    'contact',
+    'core',
+    'donations',
+    'downloads',
+    'forums',
+    'gcalendar',
+    'irc',
+    'legacy',
+    'mailer',
+    'membermap',
+    'messages',
+    'news',
+    'oembed',
+    'podcast',
+    'polls',
+    'potd',
+    'shoutbox',
+    'smiley',
+    'weblinks',
+    'ygroup',
+]
+
+LOGIN_URL = '/accounts/login/'
+LOGIN_REDIRECT_URL = '/profile/me/'
+LOGOUT_URL = '/accounts/logout/'
+
+FILE_UPLOAD_PERMISSIONS = 0644
+DEFAULT_FROM_EMAIL = ADMINS[0][1]
+
+#######################################################################
+# Messages
+#######################################################################
+MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
+MESSAGE_TAGS = {
+    message_constants.DEBUG: 'notice',
+    message_constants.INFO: 'info',
+    message_constants.SUCCESS: 'success',
+    message_constants.WARNING: 'alert',
+    message_constants.ERROR: 'error',
+}
+
+#######################################################################
+# Email
+#######################################################################
+EMAIL_HOST = 'localhost'
+EMAIL_PORT = 1025
+
+#######################################################################
+# Sessions
+#######################################################################
+SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
+SESSION_COOKIE_AGE = 2 * 7 * 24 * 60 * 60   # 2 weeks in seconds
+SESSION_COOKIE_DOMAIN = None
+SESSION_COOKIE_NAME = 'sg101_sessionid'
+SESSION_COOKIE_PATH = '/'
+SESSION_COOKIE_SECURE = False
+SESSION_EXPIRE_AT_BROWSER_CLOSE = False
+SESSION_SAVE_EVERY_REQUEST = False
+
+#######################################################################
+# Tagging Specific Settings
+#######################################################################
+FORCE_LOWERCASE_TAGS = True
+MAX_TAG_LENGTH = 50
+
+#######################################################################
+# Haystack Search Settings
+#######################################################################
+HAYSTACK_SITECONF = 'gpp.search_sites'
+HAYSTACK_SEARCH_ENGINE = 'xapian'
+HAYSTACK_XAPIAN_PATH = os.path.join(PROJECT_PATH, 'xapian_index')
+
+
+#######################################################################
+# GPP Specific Settings
+#######################################################################
+GPP_LOG_LEVEL = 0
+GPP_SEND_EMAIL = False
+GPP_NO_REPLY_EMAIL = 'no_reply'
+AVATAR_DIR = 'avatars'
+MAX_AVATAR_SIZE_BYTES = 2 * 1024 * 1024
+MAX_AVATAR_SIZE_PIXELS = 100
+AVATAR_DEFAULT_URL = MEDIA_URL + AVATAR_DIR + '/default.png'
+
+# Donations application settings:
+DONATIONS_DEBUG = False
+DONATIONS_ITEM_NAME = 'Donation for SurfGuitar101.com'
+DONATIONS_BUSINESS = 'brian@surfguitar101.com'
+DONATIONS_BUSINESS_DEBUG = 'bgneal_1246137628_biz@gmail.com'
+DONATIONS_GOAL = Decimal('100.00')  # monthly goal
+DONATIONS_ANON_NAME = u'Anonymous'
+DONATIONS_ITEM_NUM = '500'          # donation w/name listed
+DONATIONS_ITEM_ANON_NUM = '501'     # donation listed as anonymous
+
+# If MAILER_ENQUEUE_MAIL is True, all emails will be stored in the
+# mailer application's mail queue (database table). It is then expected
+# that a daemon or cron job will actually send the mail out. If
+# MAILER_ENQUEUE_MAIL is False, then email will only be sent if
+# the setting GPP_SEND_EMAIL (above) is True. In any event, emails
+# will be logged via the Python logger if the Python logger filter
+# DEBUG is active.
+
+MAILER_ENQUEUE_MAIL = True
+
+# Oembed settings
+OEMBED_MAXWIDTH = 480
+OEMBED_MAXHEIGHT = 295
+
+# GCalendar settings
+GCAL_CALENDAR_ID = 'i81lu3fkh57sgqqenogefd9v78@group.calendar.google.com'
+
+# Google OAuth settings
+GOOGLE_OAUTH_CONSUMER_KEY = 'surfguitar101.com'
+GOOGLE_OAUTH_PRIVATE_KEY_PATH = '/home/brian/google/myrsakey.pem'
+
+#######################################################################
+# Asynchronous settings (queues, queued_search, redis, celery, etc)
+#######################################################################
+QUEUE_BACKEND = 'redisd'
+QUEUE_REDIS_CONNECTION = 'localhost:6379'
+QUEUE_REDIS_DB = 0
+
+#######################################################################
+# Open Graph Protocol related settings
+#######################################################################
+OGP_DEFAULT_IMAGE = 'http://surfguitar101.com/media/podcast/podcast_logo.jpg'
+OGP_FB_ID = '100001558124013'
+
+#######################################################################
+# URL's of 3rd party Javascript and CSS files.
+# These dictionaries are used by core/templatetags/script_tags, and
+# should also be used by developers when creating form media classes.
+GPP_THIRD_PARTY_JS = {
+    'jquery': [
+        'http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js',
+    ],
+    'jquery-jeditable': [
+        'js/jquery.jeditable.mini.js',
+    ],
+    'jquery-ui': [
+        'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js',
+    ],
+    'markitup': [
+        'js/markitup/jquery.markitup.pack.js',
+        'js/markitup/sets/markdown/set.js',
+    ],
+    'tiny_mce': [
+        'js/tiny_mce/tiny_mce.js',
+        'js/tiny_mce_init_std.js',
+    ],
+}
+
+GPP_THIRD_PARTY_CSS = {
+    'jquery-ui': [
+        'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/themes/redmond/jquery-ui.css',
+    ],
+    'markitup': [
+        'js/markitup/skins/markitup/style.css',
+        'js/markitup/sets/markdown/style.css',
+    ],
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/settings/local.py	Wed Nov 30 02:41:18 2011 +0000
@@ -0,0 +1,82 @@
+"""
+Local Django settings.
+
+"""
+from settings.base import *
+
+DEBUG = True
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'gremmies_portal',
+        'USER': SECRETS['DB_USER'],
+        'PASSWORD': SECRETS['DB_PASSWORD'],
+    },
+}
+
+# Django Debug Toolbar support
+if DEBUG:
+    try:
+        import debug_toolbar
+    except ImportError:
+        pass
+    else:
+        i = MIDDLEWARE_CLASSES.index('django.middleware.common.CommonMiddleware')
+        MIDDLEWARE_CLASSES.insert(i + 1,
+                'debug_toolbar.middleware.DebugToolbarMiddleware')
+        INSTALLED_APPS.append('debug_toolbar')
+        DEBUG_TOOLBAR_CONFIG = {
+            'INTERCEPT_REDIRECTS': True,
+        }
+
+# Path to elsewhere application static images
+STATICFILES_DIRS.append(('elsewhere',
+    '/home/brian/coding/python/django/3rdparty/elsewhere/img'))
+
+# Logging configuration
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': True,
+    'formatters': {
+        'verbose': {
+            'format': '%(asctime)s %(levelname)s %(module)s %(process)d %(thread)d %(message)s'
+        },
+        'simple': {
+            'format': '%(asctime)s %(levelname)s %(message)s'
+        },
+    },
+    'handlers': {
+        'console': {
+            'class': 'logging.StreamHandler',
+            'level': 'DEBUG',
+            'formatter': 'simple',
+        },
+        'file': {
+            'class': 'logging.handlers.RotatingFileHandler',
+            'level': 'DEBUG',
+            'formatter': 'simple',
+            'filename': os.path.join(PROJECT_PATH, 'logs', 'sg101.log'),
+            'mode': 'a',
+            'maxBytes': 100 * 1024,
+            'backupCount': 10,
+        },
+        'mail_admins': {
+            'class': 'django.utils.log.AdminEmailHandler',
+            'level': 'ERROR',
+            'formatter': 'simple',
+        },
+    },
+    'loggers': {
+        'django':{
+            'level': 'WARNING',
+            'propagate': False,
+            'handlers': ['file'],
+        },
+    },
+    'root': {
+        'level': 'DEBUG',
+        'handlers': ['file'],
+    },
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/settings/production.py	Wed Nov 30 02:41:18 2011 +0000
@@ -0,0 +1,99 @@
+"""
+Production Django settings.
+
+"""
+from settings.base import *
+
+DEBUG = False
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'gremmies_portal',
+        'USER': SECRETS['DB_USER'],
+        'PASSWORD': SECRETS['DB_PASSWORD'],
+    },
+}
+
+# Path to elsewhere application static images
+STATICFILES_DIRS.append(('elsewhere',
+    '/home/var/django-sites/sg101/3rdparty/elsewhere/img'))
+
+STATIC_ROOT = os.path.abspath(os.path.join(PROJECT_PATH, '..', 'static_serve'))
+
+# Used cached template loader
+TEMPLATE_LOADERS = [
+    ('django.template.loaders.cached.Loader', (
+        'django.template.loaders.filesystem.Loader',
+        'django.template.loaders.app_directories.Loader',
+    )),
+]
+
+CACHES = {
+    'default': {
+        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
+        'LOCATION': '127.0.0.1:11211',
+        'TIMEOUT': 600,
+    },
+}
+CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
+CACHE_MIDDLEWARE_SECONDS = 600
+CACHE_MIDDLEWARE_KEY_PREFIX = ''
+
+EMAIL_HOST = 'localhost'
+EMAIL_PORT = 25
+
+GPP_SEND_EMAIL = True
+DONATIONS_DEBUG = False
+
+# Logging configuration
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': True,
+    'formatters': {
+        'verbose': {
+            'format': '%(asctime)s %(levelname)s %(module)s %(process)d %(thread)d %(message)s'
+        },
+        'simple': {
+            'format': '%(asctime)s %(levelname)s %(message)s'
+        },
+    },
+    'handlers': {
+        'console': {
+            'class': 'logging.StreamHandler',
+            'level': 'DEBUG',
+            'formatter': 'simple',
+        },
+        'file': {
+            'class': 'logging.handlers.RotatingFileHandler',
+            'level': 'DEBUG',
+            'formatter': 'simple',
+            'filename': os.path.join(PROJECT_PATH, 'logs', 'sg101.log'),
+            'mode': 'a',
+            'maxBytes': 100 * 1024,
+            'backupCount': 10,
+        },
+        'mail_admins': {
+            'class': 'django.utils.log.AdminEmailHandler',
+            'level': 'ERROR',
+            'formatter': 'simple',
+        },
+    },
+    'loggers': {
+        'django':{
+            'level': 'WARNING',
+            'propagate': False,
+            'handlers': ['file'],
+        },
+        'django.request':{
+            'level': 'ERROR',
+            'propagate': True,
+            'handlers': ['mail_admins'],
+        },
+    },
+    'root': {
+        'level': 'INFO',
+        'handlers': ['file'],
+    },
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/settings/test.py	Wed Nov 30 02:41:18 2011 +0000
@@ -0,0 +1,16 @@
+"""
+Settings to use when running tests. Uses sqlite for speed.
+
+"""
+from settings.base import *
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': 'dev.db',
+    },
+}
+
+# For unit-testing the Donations module w/o using the Paypal sandbox
+DONATIONS_DEBUG_VERIFY_RESPONSE = 'VERIFIED'
+DONATIONS_BUSINESS_DEBUG = 'brian@surfguitar101.com'
--- a/gpp/test_settings.py	Thu Nov 24 21:27:07 2011 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-"""
-Settings to use when running tests. Uses sqlite for speed.
-This idea was taken from
-http://blog.davidziegler.net/post/370368042/test-database-settings-in-django
-"""
-from settings import *
-
-DATABASES = {
-    'default': {
-        'ENGINE': 'django.db.backends.sqlite3',
-        'NAME': 'dev.db',
-    },
-}
-
-# For unit-testing the Donations module w/o using the Paypal sandbox
-DONATIONS_DEBUG_VERIFY_RESPONSE = 'VERIFIED'
-DONATIONS_BUSINESS_DEBUG = 'brian@surfguitar101.com'