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. 😬
This change removes the unused `ContactEntry` model and the `subscribe` view and
replaces it with an `Unsubscription` model and an `unsubscribe` view. It works
similarly, but is intended to be used with the `list-unsubscribe` and
`list-unsubscribe-post` headers.
This middleware is mostly redundant:
* redirecting to canonical URLs can be done more simply in Apache
* appending a forward slash is a default in CommonMiddleware now
* we're no longer using Squid cache
May need to update Apache to strip/redirect trailing "index.html".
The advantage of this approach is that the production and dev configurations are
in version control, so there's less opportunity for surprises.
As advocated by Jacob Kaplan-Moss (OSCON 2011) and Two Scoops of Django book.