Add URL field validation

This commit is contained in:
shamoon
2023-11-04 10:52:20 -07:00
parent 728866672b
commit aa0bc50e2d
2 changed files with 70 additions and 0 deletions

View File

@@ -2,12 +2,14 @@ import datetime
import math import math
import re import re
import zoneinfo import zoneinfo
from typing import Any
import magic import magic
from celery import states from celery import states
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.validators import URLValidator
from django.utils.crypto import get_random_string from django.utils.crypto import get_random_string
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@@ -459,6 +461,14 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer):
def get_value(self, obj: CustomFieldInstance): def get_value(self, obj: CustomFieldInstance):
return obj.value return obj.value
def run_validation(self, data: Any = ...) -> Any:
# other fields get validated by db
field = CustomField.objects.get(pk=data["field"])
if field.data_type == CustomField.FieldDataType.URL:
validator = URLValidator()
URLValidator.__call__(validator, data["value"])
return super().run_validation(data)
class Meta: class Meta:
model = CustomFieldInstance model = CustomFieldInstance
fields = [ fields = [

View File

@@ -322,3 +322,63 @@ class TestCustomField(DirectoriesMixin, APITestCase):
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(CustomFieldInstance.objects.count(), 0) self.assertEqual(CustomFieldInstance.objects.count(), 0)
self.assertEqual(len(doc.custom_fields.all()), 0) self.assertEqual(len(doc.custom_fields.all()), 0)
def test_custom_field_value_validation(self):
"""
GIVEN:
- Document & custom field exist
WHEN:
- API request to set a field value
THEN:
- HTTP 400 is returned
- No field instance is created or attached to the document
"""
doc = Document.objects.create(
title="WOW",
content="the content",
checksum="123",
mime_type="application/pdf",
)
custom_field_url = CustomField.objects.create(
name="Test Custom Field URL",
data_type=CustomField.FieldDataType.URL,
)
custom_field_int = CustomField.objects.create(
name="Test Custom Field INT",
data_type=CustomField.FieldDataType.INT,
)
resp = self.client.patch(
f"/api/documents/{doc.id}/",
data={
"custom_fields": [
{
"field": custom_field_url.id,
"value": "not a url",
},
],
},
format="json",
)
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(CustomFieldInstance.objects.count(), 0)
self.assertEqual(len(doc.custom_fields.all()), 0)
self.assertRaises(
Exception,
self.client.patch,
f"/api/documents/{doc.id}/",
data={
"custom_fields": [
{
"field": custom_field_int.id,
"value": "not an int",
},
],
},
format="json",
)
self.assertEqual(CustomFieldInstance.objects.count(), 0)
self.assertEqual(len(doc.custom_fields.all()), 0)