Skip to content

Commit

Permalink
Merge pull request #3 from openimis/feature/CM-28
Browse files Browse the repository at this point in the history
CM-28: add schema validation features
  • Loading branch information
sniedzielski committed May 30, 2023
2 parents b7e3569 + 806a00a commit f3763d9
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Generated by Django 3.2.19 on 2023-05-29 13:37

from django.db import migrations

from core.models import Role, RoleRight

benefit_plan_rights = [170001, 170002, 170003, 170004]
imis_administrator_system = 64


def add_rights(apps, schema_editor):
role = Role.objects.get(is_system=imis_administrator_system)
for right_id in benefit_plan_rights:
if not RoleRight.objects.filter(validity_to__isnull=True, role=role, right_id=right_id).exists():
_add_right_for_role(role, right_id)


def _add_right_for_role(role, right_id):
RoleRight.objects.create(role=role, right_id=right_id, audit_user_id=1)


def remove_rights(apps, schema_editor):
RoleRight.objects.filter(
role__is_system=imis_administrator_system,
right_id__in=benefit_plan_rights,
validity_to__isnull=True
).delete()


class Migration(migrations.Migration):

dependencies = [
('social_protection', '0003_beneficiary_historicalbeneficiary'),
]

operations = [
migrations.RunPython(add_rights, remove_rights),
]
16 changes: 15 additions & 1 deletion social_protection/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
BenefitPlan,
Beneficiary
)
from social_protection.validation import validate_bf_unique_code, validate_bf_unique_name
from social_protection.validation import validate_bf_unique_code, validate_bf_unique_name, validate_json_schema
import graphene_django_optimizer as gql_optimizer


Expand Down Expand Up @@ -55,6 +55,11 @@ class Query:
bf_name=graphene.String(required=True),
description="Checks that the specified Benefit Plan name is valid"
)
bf_schema_validity = graphene.Field(
ValidationMessageGQLType,
bf_schema=graphene.String(required=True),
description="Checks that the specified Benefit Plan schema is valid"
)

def resolve_bf_code_validity(self, info, **kwargs):
if not info.context.user.has_perms(SocialProtectionConfig.gql_benefit_plan_search_perms):
Expand All @@ -74,6 +79,15 @@ def resolve_bf_name_validity(self, info, **kwargs):
else:
return ValidationMessageGQLType(True)

def resolve_bf_schema_validity(self, info, **kwargs):
if not info.context.user.has_perms(SocialProtectionConfig.gql_benefit_plan_search_perms):
raise PermissionDenied(_("unauthorized"))
errors = validate_json_schema(kwargs['bf_schema'])
if errors:
return ValidationMessageGQLType(False, error_message=errors[0]['message'])
else:
return ValidationMessageGQLType(True)

def resolve_benefit_plan(self, info, **kwargs):
filters = append_validity_filter(**kwargs)

Expand Down
12 changes: 10 additions & 2 deletions social_protection/validation.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import json

import jsonschema

from django.core.exceptions import ValidationError
Expand Down Expand Up @@ -65,11 +67,17 @@ def validate_bf_unique_name(name, uuid=None):

def validate_json_schema(schema):
try:
if not isinstance(schema, dict):
schema = json.loads(schema)
jsonschema.Draft7Validator.check_schema(schema)
return []
except jsonschema.exceptions.SchemaError as e:
except jsonschema.exceptions.SchemaError as schema_error:
return [{"message": _("social_protection.validation.benefit_plan.invalid_schema" % {
'error': e
'error': str(schema_error)
})}]
except ValueError as json_error:
return [{"message": _("social_protection.validation.benefit_plan.invalid_json" % {
'error': str(json_error)
})}]


Expand Down

0 comments on commit f3763d9

Please sign in to comment.