Commit Graph

7329 Commits

Author SHA1 Message Date
Chris Hill-Scott
b8fe7b8e61 Revert "Merge pull request #2902 from alphagov/fix-imports"
This reverts commit e00c0355b6, reversing
changes made to 832b589980.
2020-06-26 13:42:22 +01:00
Chris Hill-Scott
e00c0355b6 Merge pull request #2902 from alphagov/fix-imports
Fix circular import
2020-06-26 12:25:42 +01:00
Chris Hill-Scott
616523bf74 Fix circular import
We changed auth.py to import from app.serialised_models here:
https://github.com/alphagov/notifications-api/pull/2887/files#diff-77cbb1e03185c7319f0311371c438b0cR11

`serialised_models.py` imports from `templates_dao.py`

`templates_dao.py` imports from `users_dao.py`

`users_dao.py` imports from `errors.py`

`errors.py` imports from `auth.py` … and the circle is complete 💥

For some reason this caused the Celery workers to crash on startup, but
not the app. Which I guess is why the integration tests didn’t catch
this?
2020-06-26 10:20:32 +01:00
Chris Hill-Scott
832b589980 Merge pull request #2898 from alphagov/fix-log-line
remove whitespace from log line
2020-06-26 09:18:54 +01:00
Chris Hill-Scott
b8c2c6b291 Merge pull request #2887 from alphagov/cache-the-serialised-things
Serialise and cache services and API keys
2020-06-26 09:18:45 +01:00
Rebecca Law
351aca2c5a Merge pull request #2897 from alphagov/get-rid-of-scheduled_for
Remove the use of schedule_for in post_notifications
2020-06-26 07:51:17 +01:00
Leo Hemsted
6318cd2a84 remove whitespace from log line
multi line strings don't handle indentation
2020-06-25 14:25:04 +01:00
Leo Hemsted
3af4974757 Merge pull request #2900 from alphagov/disable-statsd
disable statsd
2020-06-24 16:44:17 +01:00
Leo Hemsted
bb05dcf221 disable statsd 2020-06-24 16:35:44 +01:00
Rebecca Law
ce32e577b7 Remove the use of schedule_for in post_notifications.
Years ago we started to implement a way to schedule a notification. We hit a problem but we never came up with a good solution and the feature never made it back to the top of the priority list.

This PR removes the code for scheduled_for. There will be another PR to drop the scheduled_notifications table and remove the schedule_notifications service permission

Unfortunately, I don't think we can remove the `scheduled_for` attribute from the notification.serialized method because out clients might fail if something is missing. For now I have left it in but defaulted the value to None.
2020-06-24 14:54:40 +01:00
Chris Hill-Scott
d108c644bc Merge pull request #2890 from alphagov/exclude-service-letter-contacts
Don’t return letter contact blocks in service JSON
2020-06-24 09:41:08 +01:00
Chris Hill-Scott
d16d06fdef Cache serialised services in Redis
Same as we’re doing for templates.

This means avoiding a database call, even for services that don’t hit
our API so often.

They’ll still need to go to the database for the API keys, because we’re
not comfortable putting the API key secrets in Redis.

But once a service has got its keys from the database we commit the
transaction, so the connection can be freed up until we need it again to
insert the notification.
2020-06-24 08:52:12 +01:00
Chris Hill-Scott
6c0a4abd52 Serialise UUIDs to string
So that we can serialise them to JSON to store in Redis.
2020-06-24 08:51:54 +01:00
Chris Hill-Scott
6a9818b5fd Cache services and API keys in memory
Same as we’ve done for templates.

For high volume services this should mean avoiding calls to external
services, either the database or Redis.

TTL is set to 2 seconds, so that’s the maximum time it will take for
revoking an API key or renaming a service to propagate.

Some of the tests created services with the same service ID. This
caused intermittent failures because the cache relies on unique service
IDs (like we have in the real world) to key itself.
2020-06-24 08:46:13 +01:00
Chris Hill-Scott
46dbcb7e36 Commit transactions as soon no longer needed
We think that holding open database transactions while we go and do
something else is causing us to have poor performance.

Because we’re not serialising everything as soon as we pull it out of
the database we can guarantee that we don’t need to go back to the
database again.

So let’s see if explicitly closing the transaction helps with
performance.
2020-06-23 16:00:41 +01:00
Chris Hill-Scott
320bca70f7 Serialise service, API keys and permissions
By serialising these straight away we can:
- not go back to the database later, potentially closing the connection
  sooner
- potentially cache the serialised data, meaning we don’t touch the
  database at all
2020-06-23 16:00:41 +01:00
Chris Hill-Scott
d7b2cc6403 Merge pull request #2895 from alphagov/template-schema-cache
Ensure templates are cached with correct schema
2020-06-23 15:23:32 +01:00
Chris Hill-Scott
5ae3b0fc64 Ensure templates are cached with correct schema
For some reason our V1 get template response wraps the whole template in
a dictionary with one key, `'data'`:
0d99033889/app/template/rest.py (L166)

That means when the admin app caches the response it also caches it in
this format.

The API needs to do the same, otherwise it will be cacheing data with a
schema that the admin app isn’t expecting, and vice-versa.
2020-06-23 15:09:38 +01:00
Chris Hill-Scott
0d99033889 Merge pull request #2891 from alphagov/cache-serialised-template
Cache serialised template in Redis and in memory
2020-06-23 14:18:01 +01:00
Chris Hill-Scott
af1b021dbe Add test for when template is found in Redis
Ensures that we’re not calling the dao method when it is
2020-06-23 14:01:20 +01:00
Chris Hill-Scott
cb4b809131 Add extra assertion
To be crystal clear 💎
2020-06-23 13:48:55 +01:00
David McDonald
a2753eafa9 Merge pull request #2894 from alphagov/turn-on-stub
Turn on email stub for load testing
2020-06-23 12:17:09 +01:00
Pea M. Tyczynska
75a7e9b7fd Merge pull request #2892 from alphagov/refactor-crown-dependency-check
Refactor crown dependency check
2020-06-23 11:19:17 +01:00
David McDonald
48abc8ffb5 Turn on email stub for load testing 2020-06-23 11:09:24 +01:00
Chris Hill-Scott
996800f90d Cache serialised template in Redis 2020-06-23 10:03:27 +01:00
Chris Hill-Scott
2f4470edca Serialise UUID to string not UUID object
We need to serialise the template to JSON to store it in Redis. Python’s
built in JSON serialiser doesn’t know what to do with a UUID object, so
we need to manually cast it to a string instead.
2020-06-23 10:03:27 +01:00
Chris Hill-Scott
87afc439fe Cache serialised template in memory 2020-06-23 10:03:26 +01:00
Chris Hill-Scott
3e209bcaac Merge pull request #2893 from alphagov/exclude-created-by
Exclude created_by_id from TemplateSchemaNoDetail
2020-06-23 10:02:03 +01:00
Chris Hill-Scott
be86a16733 Exclude created_by_id from TemplateSchemaNoDetail
We were already excluding `created_by`, but in a different branch we
renamed the property on the schema to `created_by_id`:
https://github.com/alphagov/notifications-api/pull/2873/files#diff-691350bfe8029e08252edaad69e871b9R346-R348

We need to rename it in the exclude list to make sure that this
assertion still passes:
```
assert json_response['data'][0].keys() == {
    'folder',
    'id',
    'name',
    'template_type',
}
```
– 14e7b6b87e/tests/app/template/test_rest.py (L555-L560)
2020-06-23 09:39:11 +01:00
Chris Hill-Scott
14e7b6b87e Merge pull request #2880 from alphagov/serialise-less-stuff-templates
Exclude unneeded fields from all templates response
2020-06-23 09:07:30 +01:00
Pea Tyczynska
7a4f5a4bff Refactor crown dependency check 2020-06-22 18:14:22 +01:00
Chris Hill-Scott
14a17d675f Merge pull request #2873 from alphagov/serialise-template-immediately
Serialise template as soon as possible
2020-06-22 14:37:48 +01:00
Chris Hill-Scott
58a9862cd1 Avoid extra query when serialising Template created_by
It’s a UUID column, but by default Marshmallow wants to select the id
from the users table, not from the templates table, because the two
are foreign-keyed.

Adding the property explicity like this forces it to select from the
`created_by_id` column, but still serialises it to the `created_by`
field to avoid any breaking change.
2020-06-22 14:07:43 +01:00
Chris Hill-Scott
718f8ccad0 Remove content and subject from get all templates
Content and subject are user-submitted so are effectively unbounded in
size. And we’re serialising them for every template when sending the
list of templates to the admin app.

For the service with the most templates this results in a 1.3Mb blob of
JSON going over the wire, and being cached in Redis.

And then the admin app completely ignores these fields, because it does
show template content until you’ve clicked into a single template.

This commit adds a new query parameter, `detailed`, that the admin app
can set to `False`. When it does only the fields needed to render the
`/templates` page are returned.

This is done with a new parameter so as not to break the V1 API.
Although I looked in Kibana and it doesn’t seem like anyone external is
using this endpoint we’ve come this far without breaking the API so…
2020-06-22 13:08:41 +01:00
Chris Hill-Scott
8d61c1ef4b Add description of SerialisedModel 2020-06-22 10:20:54 +01:00
Chris Hill-Scott
5a2f2a9ec2 Rename JSONModel to SerialisedModel 2/2
This class doesn’t actually wrap JSON, it wraps serialised data.

So this name feels better.
2020-06-22 10:20:53 +01:00
Chris Hill-Scott
e6b7e0e16c Rename JSONModel to SerialisedModel 1/2
This class doesn’t actually wrap JSON, it wraps serialised data.

So this name feels better.

This commit only renames the file for an easier diff.
2020-06-22 10:20:53 +01:00
Chris Hill-Scott
608812d314 Don’t store the underlying dict
This will give us smaller objects to cache, and forces us to be explicit
about which properties we’re using.
2020-06-22 10:20:52 +01:00
Chris Hill-Scott
ad2328fc05 Serialise template immediately after fetching
This commit changes the code in post notification endpoint to handle a
serialised template (ie a `dict`) rather than a database object.

This is the first step towards being able to cache the template and not
hit the database on every request.

There should be no functional changes here, it’s just refactoring.

There are some changes to the tests where the signature of functions
has changed.

Importing of the template schema has to be done at a function level,
otherwise Marshmallow gets weird.

This commit also copies the `JSONModel` class from the admin app, which
turns serialised data (a dict made from JSON) into an object on which
certain predefined properties are allowed.

This means we can still do the caching of serialised data, without
having to change too much of the code in the app, or make it ugly by
sprinkling dict lookups everywhere.

We’re not copying all of JSONModel from the admin app, just the bits we
need. We don’t need to compare or hash these objects, they’re just used
for lookups. And redefining `__getattribute__` scares Leo.
2020-06-22 10:20:51 +01:00
Chris Hill-Scott
0d2060fcfa Don’t return letter contact blocks in service JSON
The admin app doesn’t use them:
https://github.com/alphagov/notifications-admin/search?q=letter_contact_block&unscoped_q=letter_contact_block

Instead it requests them separately when needed:
2f1e8b104b/app/models/service.py (L349-L351)

Removing this from the response means one fewer database query.
2020-06-22 10:16:30 +01:00
Pea M. Tyczynska
dcc407efea Merge pull request #2878 from alphagov/uk-prefix
Make sure people without international sms permission can send to crown dependencies
2020-06-19 16:58:48 +01:00
Pea Tyczynska
ef9f3c1e5f Make sure we check if a service can send to number harmoniously
We were checking this separately in two places in the code. Now
we will have this logic in one place, in validators.

Also pull in utils version that recognises crown depenency numbers
as international.
2020-06-19 15:59:15 +01:00
Pea Tyczynska
b0bb0b9780 Make sure people without international sms permission can send to crown dependencies 2020-06-19 15:58:22 +01:00
Katie Smith
9e7b84bda2 Merge pull request #2864 from alphagov/postage-constraints-3
Drop postage constraints
2020-06-19 15:48:38 +01:00
Katie Smith
ab956c9eb3 Update JSON schema postage validation for new values 2020-06-19 15:36:10 +01:00
Katie Smith
6cd914b9d3 Update models to remove postage constraints and add new postage types 2020-06-19 15:36:10 +01:00
Katie Smith
bdde035a0c Drop postage constraints
The constaints on notifications and notification_history have already
been dropped in production, but still exist in staging and in dev
environments.

The constraints on templates and templates_history exist in all
environments.
2020-06-19 15:36:10 +01:00
Katie Smith
4b1705aa14 Merge pull request #2869 from alphagov/update-schemas
Update template schemas to validate postage
2020-06-19 13:15:59 +01:00
Katie Smith
98a69684c5 Update get_template_by_id_response & post_template_preview_response schemas
To check the format of postage. Neither of these two schemas are used
for validating - they seem to be added for reference.
2020-06-19 08:59:27 +01:00
Katie Smith
72be10c681 Add JSON schema for updating template
We did not have a JSON schema for updating a template. Since we will
remove the postage constraint from the templates table, this adds a JSON
schema for updating a template so that we can use it to check that the
postage is one of the allowed values.
2020-06-19 08:59:27 +01:00