Long ago, when the bar was all Javascript, we had the ability to have
sub-targets in a single bar. I was not able to invest the time
necessary to figure out how to do that again using the newer setup
for the fundraising bar, so instead I've added the ability to have a
stretch match bar that appears above the other one once the first
match period ends.
While it handles most of the weird cases with some grace, it will
probably look weird unless you set up a `SITE_FUNDGOAL_0` as a match
that finishes at least a week or two before `SITE_FUNDGOAL_1`.
The two aren't really aware of each other, either, so you have to
make sure the objects are updated properly (i.e., it *will* display
the stretch when `SITE_FUNDGOAL_0` ends even if there are match funds
remaining in `SITE_FUNDGOAL_0`).
A better solution should be found and implemented before 2026-11-22.
If you're actually reading this commit message for a reason other
than historical interest and that date has past, you're probably in
big trouble right now. 😬
167 lines
4.8 KiB
Python
167 lines
4.8 KiB
Python
# Copyright 2005-2008, James Garrison
|
|
# Copyright 2010, Bradley M. Kühn
|
|
|
|
# This software's license gives you freedom; you can copy, convey,
|
|
# propagate, redistribute, modify and/or redistribute modified versions of
|
|
# this program under the terms of the GNU Affero General Public License
|
|
# (AGPL) as published by the Free Software Foundation (FSF), either
|
|
# version 3 of the License, or (at your option) any later version of the
|
|
# AGPL published by the FSF.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program in a file in the toplevel directory called
|
|
# "AGPLv3". If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
from pathlib import Path
|
|
|
|
SITE_ID = 2
|
|
ROOT_URLCONF = 'conservancy.urls'
|
|
|
|
LOGGING = {
|
|
'version': 1,
|
|
'disable_existing_loggers': False,
|
|
'formatters': {
|
|
'default': {
|
|
'format': '%(asctime)s %(levelname)s %(name)s: %(message)s',
|
|
'datefmt': '%Y-%m-%d %H:%M:%S',
|
|
},
|
|
},
|
|
'filters': {
|
|
'require_debug_false': {
|
|
'()': 'django.utils.log.RequireDebugFalse'
|
|
}
|
|
},
|
|
'handlers': {
|
|
'mail_admins': {
|
|
'level': 'ERROR',
|
|
'filters': ['require_debug_false'],
|
|
'class': 'django.utils.log.AdminEmailHandler'
|
|
},
|
|
'console': {
|
|
'level': 'DEBUG',
|
|
'class': 'logging.StreamHandler',
|
|
'formatter': 'default',
|
|
},
|
|
},
|
|
'loggers': {
|
|
'django.request': {
|
|
'handlers': ['mail_admins'],
|
|
'level': 'ERROR',
|
|
'propagate': True,
|
|
},
|
|
# Avoid email notification on DisallowedHost error.
|
|
'django.security.DisallowedHost': {
|
|
'handlers': ['console'],
|
|
'propagate': False,
|
|
},
|
|
'conservancy.contacts': {
|
|
'handlers': ['console'],
|
|
'level': 'DEBUG',
|
|
'propagate': False,
|
|
},
|
|
'conservancy.supporters': {
|
|
'handlers': ['console'],
|
|
'level': 'DEBUG',
|
|
'propagate': False,
|
|
},
|
|
},
|
|
'root': {
|
|
'handlers': ['console'],
|
|
'level': 'INFO',
|
|
},
|
|
}
|
|
|
|
INSTALLED_APPS = [
|
|
'django.contrib.auth',
|
|
'django.contrib.contenttypes',
|
|
'django.contrib.sessions',
|
|
'django.contrib.sites',
|
|
'django.contrib.admin',
|
|
'django.contrib.messages',
|
|
'django.contrib.humanize',
|
|
'django.contrib.staticfiles',
|
|
'conservancy.blog',
|
|
'conservancy.contacts',
|
|
'conservancy.contractpatch',
|
|
'conservancy.events',
|
|
'conservancy.news',
|
|
'conservancy.staff',
|
|
'conservancy.worldmap',
|
|
'conservancy.supporters',
|
|
'conservancy.fundgoal',
|
|
'conservancy.assignment',
|
|
'conservancy.fossy',
|
|
'conservancy.podjango',
|
|
'conservancy.usethesource.apps.UseTheSourceConfig',
|
|
'captcha',
|
|
]
|
|
|
|
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
TEMPLATES = [
|
|
{
|
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
|
'DIRS': [
|
|
BASE_DIR / 'templates',
|
|
],
|
|
'APP_DIRS': True,
|
|
'OPTIONS': {
|
|
'context_processors': [
|
|
'django.template.context_processors.debug',
|
|
'django.template.context_processors.request',
|
|
'django.contrib.auth.context_processors.auth',
|
|
'django.contrib.messages.context_processors.messages',
|
|
'conservancy.context_processors.host_url',
|
|
'conservancy.context_processors.sitefundraiser',
|
|
]
|
|
}
|
|
}
|
|
]
|
|
|
|
# Internationalization
|
|
#
|
|
# Due to USE_TZ = False, times in the database are under the local America/New York
|
|
# timezone without any zone information.
|
|
TIME_ZONE = 'America/New_York'
|
|
LANGUAGE_CODE = 'en-us'
|
|
USE_TZ = False
|
|
|
|
STORAGES = {
|
|
'default': {
|
|
'BACKEND': 'django.core.files.storage.FileSystemStorage',
|
|
},
|
|
'staticfiles': {
|
|
'BACKEND': 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage',
|
|
},
|
|
}
|
|
|
|
STATIC_URL = '/static/'
|
|
STATIC_ROOT = BASE_DIR.parent / 'collected_static'
|
|
STATICFILES_DIRS = [
|
|
BASE_DIR / 'static',
|
|
]
|
|
|
|
MEDIA_ROOT = BASE_DIR.parent / 'media'
|
|
MEDIA_URL = '/media/'
|
|
|
|
MIDDLEWARE = [
|
|
'django.middleware.common.CommonMiddleware',
|
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
|
'django.contrib.messages.middleware.MessageMiddleware',
|
|
]
|
|
|
|
USETHESOURCE = {
|
|
'SENDER': 'compliance@sfconservancy.org',
|
|
'LIST_RECIPIENT': 'ccs-review@lists.sfconservancy.org',
|
|
}
|
|
|
|
SITE_FUNDGOAL_0 = 'cy2025-end-year-match'
|
|
SITE_FUNDGOAL_1 = 'fy2025-26-extend-match'
|
|
|