[#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