Always return a string in the 'message' field

Other errors return a formatted string from the message field. A
dashboard failing validation should follow this pattern so that
API clients can simply output the string rather than processing
it.
Add cascade option to drop tables tool

The script will fail without this as it needs to cascade to other
relations
Add comment explaining add_node params

It's difficult to see what is required without this
Merge pull request #220 from alphagov/bugfix-error-message-string

Always return a string in the 'message' field
Merge pull request #224 from alphagov/correct-links-output-in-dashboard-api

Update transaction and other links in api response
Merge pull request #227 from alphagov/explain-add-node-params

Add comment explaining add_node params
Merge pull request #226 from alphagov/add-cascade-option-to-drop-tables-tool

Add cascade option to drop tables tool
[#77608474] Add `DashboardViewsGetTestCase` to `test_dashboard.py`

- Doesn't make assertions about UUIDs, as they constantly seem to change. **I THINK** this is by design, but would like to check before having this merged.
[#77608474] Implement dashboard `GET`

**Nicer implementation pattern suggestions welcome**

- We're still using the same url here, so the `dashboard` method routes to a `get_dashboard` method, which feels properly dumb but...
  - I didn't want to wrestle with trying to route based on the request inside `urls.py`
  - Annoyingly this means that `@require_http_methods` on the `dashboard` method now takes `(['POST', 'PUT', 'GET'])` which feels extra dumb, because we're putting routing logic in a bloody view.
[#78806122] Return 400 on module validation error

At the moment we fail with a 500 for what should be a 400.

This change required blank=True to be set on a few models. The 'null'
argument only applies to whether the database field can be null. The
'blank' argument applies to the validation.
Merge pull request #232 from alphagov/get_dashboard

[#77608474] Implement dashboard `GET`
Merge pull request #228 from alphagov/fail-module-create-with-error

[#78806122] Return 400 on module validation error
[#78806122] Return 400 on module validation error

At the moment we fail with a 500 for what should be a 400.

This change required blank=True to be set on a few models. The 'null'
argument only applies to whether the database field can be null. The
'blank' argument applies to the validation.
[#78806182] Roll back dashboard if any part fails

If any part of a dashboard creation (ie. dashboard, modules, links etc)
fails then the entire transaction should be rolled back. This has been
done by wrapping the view in a transaction. Unfortunately the
transaction provided by Django isn't really suitable for views so this
commit also introduces a view decorator that will roll back the
transaction if the response code is an error.
Merge pull request #229 from alphagov/transaction-on-dashboard

[#78806182] Roll back dashboard if any part fails
Implementation of returning modules

Return only the module if the slug contains a module slug - that is the
slug is of the form /<dashboard-slug>/<module-slug> - ie a dashboard has
been found for <dashboard-slug> and there is a remaining part of the url
that corresponds to a slug in the dashboards modules.
Add logic for finding tabs when specified

Also refactored the module finding logic as some of it was similar to
tab finding logic
Move logic from view to model

Further changes might use the presenter pattern, but for now it is good
to have all the spotlightify logic in one place.
Merge pull request #231 from alphagov/update-slug-for-modules-and-tabs

Add modules and tabs logic to dashboard view
Remove json.dumps() for options in dashboard tests

These calls to json.dumps() around the options dictionary was causing
the tests for fail locally for me. However, the tests didn't fail
when run on Travis.