From f916c4fffe33c8a6306d9c46b2761f331c303bd4 Mon Sep 17 00:00:00 2001 From: Suryashankar Das Date: Tue, 19 Jul 2022 18:24:22 +0530 Subject: [PATCH] run schema validations on save --- care/facility/api/viewsets/asset.py | 9 ++++++++- .../migrations/0302_auto_20220719_1755.py | 20 +++++++++++++++++++ care/facility/models/asset.py | 4 ++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 care/facility/migrations/0302_auto_20220719_1755.py diff --git a/care/facility/api/viewsets/asset.py b/care/facility/api/viewsets/asset.py index 92dfff1f23..e42a3ab526 100644 --- a/care/facility/api/viewsets/asset.py +++ b/care/facility/api/viewsets/asset.py @@ -1,3 +1,4 @@ +from django.core.exceptions import ValidationError as ModelValidationError from django.db.models import Q from django.http import Http404 from django.shortcuts import get_object_or_404 @@ -7,7 +8,8 @@ from rest_framework import filters as drf_filters from rest_framework import status from rest_framework.decorators import action -from rest_framework.exceptions import ValidationError, APIException +from rest_framework.exceptions import APIException, ValidationError +from rest_framework.fields import get_error_detail from rest_framework.mixins import ( CreateModelMixin, ListModelMixin, @@ -135,6 +137,11 @@ def get_queryset(self): ) return queryset + def handle_exception(self, exc): + if isinstance(exc, ModelValidationError): + exc = ValidationError(detail=get_error_detail(exc)) + return super().handle_exception(exc) + @swagger_auto_schema(responses={200: UserDefaultAssetLocationSerializer()}) @action(detail=False, methods=["GET"]) def get_default_user_location(self, request, *args, **kwargs): diff --git a/care/facility/migrations/0302_auto_20220719_1755.py b/care/facility/migrations/0302_auto_20220719_1755.py new file mode 100644 index 0000000000..7139e3b6ef --- /dev/null +++ b/care/facility/migrations/0302_auto_20220719_1755.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.11 on 2022-07-19 12:25 + +import care.utils.models.validators +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('facility', '0301_auto_20220709_2051'), + ] + + operations = [ + migrations.AlterField( + model_name='asset', + name='meta', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict, validators=[care.utils.models.validators.JSONFieldSchemaValidator({'$schema': 'http://json-schema.org/draft-07/schema#', 'anyOf': [{'$ref': '#/definitions/onvif'}, {'$ref': '#/definitions/hl7monitor'}, {'$ref': '#/definitions/empty'}], 'definitions': {'empty': {'additionalProperties': False, 'type': 'object'}, 'hl7monitor': {'additionalProperties': False, 'properties': {'insecure_connection': {'type': 'boolean'}, 'local_ip_address': {'type': 'string'}, 'middleware_hostname': {'type': 'string'}}, 'required': ['local_ip_address', 'middleware_hostname'], 'type': 'object'}, 'onvif': {'additionalProperties': False, 'properties': {'camera_access_key': {'type': 'string'}, 'insecure_connection': {'type': 'boolean'}, 'local_ip_address': {'type': 'string'}, 'middleware_hostname': {'type': 'string'}, 'port': {'type': 'number'}}, 'required': ['local_ip_address', 'middleware_hostname', 'camera_access_key', 'port'], 'type': 'object'}}})]), + ), + ] diff --git a/care/facility/models/asset.py b/care/facility/models/asset.py index 70f0a0874c..ec23319290 100644 --- a/care/facility/models/asset.py +++ b/care/facility/models/asset.py @@ -91,6 +91,10 @@ class Meta: def __str__(self): return self.name + def save(self, *args, **kwargs) -> None: + self.clean_fields() + return super().save(*args, **kwargs) + class UserDefaultAssetLocation(BaseModel): user = models.ForeignKey(User, on_delete=models.PROTECT, null=False, blank=False)