* Email is sent upon saving from the admin.
* Announcements from the future are queued to be emailed around the time they become visible.
* Also do some try/finally as safety for threadlocale default language activation.
* Announcements are per group, independent of user's groups.
* Tabs are all about user's groups. Tab titles are group names.
* Add migration for unique group id in GroupDashboard because of OneToOneField.
* Create utils.py to avoid circular imports.
* [bug 623431] Remove ImageUploadAsync, VideoUploadAsync - they're not necessary.
* Also subclass them both from MediaForm, sharing some code to make this more maintanable.
* Add GalleryUpload object with plenty of comments and separation of concerns.
* Use jinja macros heavily to make the upload form's HTML more readable
* Consistency in error messages.
* Preliminary File API client-side validation (extension and file size)
* Stub for client side form validation (TODO)
* Need to test for IE (TODO)
* Set-up for CSS transitions, not implemented (TODO)
sumo.views.deprecated_redirect shows a message informing the user that the
URL has changed and they should update their bookmarks. It takes one required
argument, `url` which is passed directly to `reverse()`. Any additional kwargs
are also passed to `reverse()` as the `kwargs` argument.
* Dashboard views are now responsible for passing the active dashboard signature into the template, since only they know the params (like the locale of a LocaleDashboard).
* Tolerate non-dict Dashboard.params values to make views simpler in the common case.
* When choosing active tab, compare the whole "signature" of a dashboard, not just the slug. IOW, take params into account.
* Use class name instead of title in admin menu, since title is only defined on parametrized instances.
* Hash slug instead of class, for consistency with signatures.
* Make Dashboard._params private.
* Get rid of signature_from_params(). We don't need it since I decided it would take the original string-params format. This also lets us make _digest_params() private and an instance method.
* Added file with topic strings for l10n, and a command to generate this file.
* Article page now links to article lists by topic (instead of category).
* All non-default locales use their parent's topics for listing.
[bug 623160]
* Add GroupDashboard model
* Change dashboard_tabs from a macro to a helper so it can get at dashboards(). Rename it "user_dashboard_tabs". Remove explicit references to tabs; look them up from dashboards.user instead.
* Enable Questions dashboard.
Django's HttpRequest.is_secure() depends on an environment variable, which
is great when we're running with mod_wsgi inside the Apache process and can
rely on SetEnv HTTPS on, but when we're running as an isolated process (via
gunicorn or uWSGI or what have you) that doesn't work.
One of the upstream proxy servers (maybe even Zeus) will set an X-Scheme
header to 'https' or 'http'. With this middleware, we check the header in
is_secure() instead of relying on the environment variable.
I'm leaving this to be installed in settings_local for now, since this is
only for a test.
Passing the connection to "apply_async" started causing issues with the
latest celery update. Also up the rate limit since this seemed unnecessarily
slow in testing.