Checks schema & layout are valid

Checks received data follows the schema
This commit is contained in:
David Taylor
2015-08-08 23:36:00 +03:00
committed by Tom Price
parent 212b055b59
commit fe943e12c1
2 changed files with 59 additions and 11 deletions

View File

@@ -1,7 +1,11 @@
from django.db import models from django.db import models
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.core.exceptions import ObjectDoesNotExist, ValidationError
import reversion import reversion
import json
import jsonschema
import datetime import datetime
from RIGS.models import RevisionMixin from RIGS.models import RevisionMixin
@@ -34,6 +38,27 @@ class Schema(models.Model, RevisionMixin):
objects = SchemaManager() objects = SchemaManager()
def clean(self):
# raise ValidationError('Invalid JSON received')
try:
jsonData = json.loads(self.schema)
except ValueError:
raise ValidationError('Invalid JSON in schema')
except:
raise
try:
jsonData = json.loads('{"data":'+self.layout+"}")
except ValueError:
raise ValidationError('Invalid JSON in layout')
except:
raise
def save(self, *args, **kwargs):
"""Call :meth:`full_clean` before saving."""
self.full_clean()
super(Schema, self).save(*args, **kwargs)
class Meta: class Meta:
ordering = ['-start_at'] ordering = ['-start_at']
get_latest_by = 'start_at' get_latest_by = 'start_at'
@@ -48,6 +73,28 @@ class Form(models.Model, RevisionMixin):
data = models.TextField(blank=False, null=False, default="{}") data = models.TextField(blank=False, null=False, default="{}")
def clean(self):
try:
jsonData = json.loads(self.data)
except ValueError:
raise ValidationError('Invalid JSON received from browser')
try:
schemaValue = json.loads(self.schema.schema)
jsonschema.validate(jsonData,schemaValue) #This will raise ValidationError if data doesn't match schema
except ObjectDoesNotExist:
pass #halfway through creation this can cause issues
except ValueError:
raise ValidationError('Invalid JSON in schema, cannot validate')
except jsonschema.ValidationError: #raise a django exception
raise ValidationError('Data is not valid, cannot save')
def save(self, *args, **kwargs):
"""Call :meth:`full_clean` before saving."""
self.full_clean()
super(Form, self).save(*args, **kwargs)
class Meta: class Meta:
permissions = ( permissions = (
('create_form', 'Can complete a form'), ('create_form', 'Can complete a form'),

View File

@@ -14,6 +14,7 @@
<hr/> <hr/>
</div> </div>
{% include 'form_errors.html' %}
<div ng-controller="FormController" class="col-sm-12"> <div ng-controller="FormController" class="col-sm-12">
<form name="theForm" sf-schema="schema" sf-form="form" sf-model="model" ng-submit="onSubmit(theForm)"> <form name="theForm" sf-schema="schema" sf-form="form" sf-model="model" ng-submit="onSubmit(theForm)">