Add deserialize method for ServiceSchema permissions field

Due to a difference in marshmallow 3, when calling
`service_schema.load()` with permissions data the permissions data was
being dropped. We could fix this by allowing the ServiceSchema to
include any unknown keys using but that have unexpected consequences.

Instead, this change adds a method so that the schema knows how to
deserialize permissions. This uses the same code that the `pre_load`
method uses, but there were errors when it wasn't included in both places.
This commit is contained in:
Katie Smith
2022-05-13 09:13:48 +01:00
parent 8e7f2615a9
commit 053397d8d4

View File

@@ -209,7 +209,7 @@ class ServiceSchema(BaseSchema, UUIDsAsStringsMixin):
created_by = field_for(models.Service, 'created_by', required=True)
organisation_type = field_for(models.Service, 'organisation_type')
letter_logo_filename = fields.Method(dump_only=True, serialize='get_letter_logo_filename')
permissions = fields.Method("service_permissions")
permissions = fields.Method("serialize_service_permissions", "deserialize_service_permissions")
email_branding = field_for(models.Service, 'email_branding')
organisation = field_for(models.Service, 'organisation')
override_flag = False
@@ -226,9 +226,21 @@ class ServiceSchema(BaseSchema, UUIDsAsStringsMixin):
def get_letter_logo_filename(self, service):
return service.letter_branding and service.letter_branding.filename
def service_permissions(self, service):
def serialize_service_permissions(self, service):
return [p.permission for p in service.permissions]
def deserialize_service_permissions(self, in_data):
if isinstance(in_data, dict) and 'permissions' in in_data:
str_permissions = in_data['permissions']
permissions = []
for p in str_permissions:
permission = ServicePermission(service_id=in_data["id"], permission=p)
permissions.append(permission)
in_data['permissions'] = permissions
return in_data
def get_letter_contact(self, service):
return service.get_default_letter_contact()