* 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.
* 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.
* Contributor and L10n Dashes are very similar. Factor up the common parts.
* Give the L10N_READOUTS constant sole discretion on what appears on the main L10n dash. I had given the template control for more flexibility, but even in this small case, I managed to get some IDs desynced, which broke a few intra-page links. As a result, add short_title and details_link_text attrs to readouts, and change L10N_READOUTS to a SortedDict.
* Add a locale arg to Readout constructor which can override the one in request. This lets the Contributor Dash always show English data, independent of what language the UI is in.
Created a new app because it involves multiple views and a cron. The
cron will need to be set up to run once/minute. It does a proxy request
to the chat server (settings.CHAT_SERVER) to get the queue status, then
stores the result in the cache (settings.CHAT_CACHE_KEY). The
/chat/queue-status/ view dumps out whatever's in the cache or returns a
503 status if the cache is empty.
* Markup, CSS, templates, and queries for the Overview and Untranslated Articles localization summaries are in place, though there's still some optimization to do.
* Add a `number()` template function for localized thousands formatting, etc.
* Stub out Contributors Dash view just so we can reverse() to it.
* Add trivial tests. Perhaps horrific ones testing the accuracy of the queries will follow. Perhaps.
* To come: WebTrends integration and the rest of the dashboard readouts