Fixes #239: mail server information moved to config file.
Changed concatenation to string formatting.
Fix #284 -- display SplashInfo statistics on dashboard

Since the lunch choices can be overridden by tags, this dynamically
generates entries on the dashboard according to which values have been
selected.
Fix typo in 057a2bc71c
Fix #532: Update manage.py for Django 1.4
Fix #533: staticfiles setup for Django 1.4
Set up Apache to serve static files

Modify the dev server setup script to add a line to the Apache
configuration to serve static files at /static/.

Also, replace the old /media/ and /static/ URLconfs with Django's
shortcut functions that do the same thing but only in debug mode
(letting Apache serve those URLs in production mode).
Remove instructions that reference the old admin media location
Fix import for staticfiles_urlpatterns
Merge pull request #535 from learning-unlimited/django-1.4-fixes

Django 1.4 fixes
Moves admin dashboard init code from adminvitals.js to admincore.js

Fixes bug introduced in commit f0f5c97cc2, which moved code from the
dashboard to adminvitals. This broke the rest of the dashboard
(i.e. adminclass and any future dashboard modules) if adminvitals
wasn't enabled.
Add django.contrib.redirect
Update esp/esp/admin.py

Removed superfluous import
Merge pull request #541 from learning-unlimited/nil3-shorturls-3

Add django.contrib.redirect
Fixes incorrect calls to ESPError
Allows admins to see all custom forms
Fixes customform bug with option-less fields
Fixes customform bug for fields with 2+ attributes

In the Python function FormHandler._getFormMetadata(), a ValuesQuerySet
of Field objects is iterated through to construct a JSON object that is
eventually used by the custom form builder. In this ValuesQuerySet,
there might be multiple objects per Field, because of the reverse
relationship to Attribute that is included in the .values() query. The
Python function deals with this by compiling the different
attribute__attr_type and attribute__value values into a single
attributes dictionary. However, the attribute__attr_type and
attribute__value values from the _last_ object for a particular field
are left behind in the returned JSON object, and in some instances in
the form builder JavaScript code, it was these values, rather than the
full attributes object, that were being referenced. This was causing
form copying to fail in the form builder. This change fixes this,
by iterating through the attributes object rather than
attribute__attr_type and attribute__value.
Fixes bug in previous commit
Merge branch 'main' into issue239