Commit e7310329 authored by Florent Chehab's avatar Florent Chehab

Began work on models, Basic module working with usefull_links validation.

parent ef93ef29
Pipeline #26281 passed with stages
in 1 minute and 23 seconds
...@@ -4,9 +4,11 @@ from reversion_compare.admin import CompareVersionAdmin ...@@ -4,9 +4,11 @@ from reversion_compare.admin import CompareVersionAdmin
from rex.models.university import University, MainCampus from rex.models.university import University, MainCampus
from rex.models.location import Country, City from rex.models.location import Country, City
from rex.models.module import BasicModule
admin.site.register(Country) admin.site.register(Country)
admin.site.register(City) admin.site.register(City)
admin.site.register(BasicModule)
admin.site.register(University, CompareVersionAdmin) admin.site.register(University, CompareVersionAdmin)
admin.site.register(MainCampus, CompareVersionAdmin) admin.site.register(MainCampus, CompareVersionAdmin)
# Generated by Django 2.0.3 on 2018-08-18 08:44 # Generated by Django 2.0.3 on 2018-08-19 11:49
import django.core.validators import django.core.validators
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import rex.models.tools.usefullLinksField
import rex.utils.friendly_path import rex.utils.friendly_path
...@@ -14,6 +15,14 @@ class Migration(migrations.Migration): ...@@ -14,6 +15,14 @@ class Migration(migrations.Migration):
] ]
operations = [ operations = [
migrations.CreateModel(
name='BasicModule',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('comment', models.TextField()),
('usefull_links', rex.models.tools.usefullLinksField.UsefullLinksField(validators=[rex.models.tools.usefullLinksField.validate_usefull_links])),
],
),
migrations.CreateModel( migrations.CreateModel(
name='City', name='City',
fields=[ fields=[
......
from .module import Module # noqa: F401 from .module import Module # noqa: F401
from .basicModule import BasicModule # noqa: F401
from django.db import models
from rex.models.tools import UsefullLinksField
class BasicModule(models.Model):
comment = models.TextField()
usefull_links = UsefullLinksField()
# class Meta:
# abstract = True
from .DictModeViewSet import DictModeViewSet # noqa: F401 from .DictModeViewSet import DictModeViewSet # noqa: F401
from .usefullLinksField import UsefullLinksField # noqa: F401
from .validateWithRestFramework import validate_with_rest_framework # noqa: F401
from django.contrib.postgres.fields import JSONField
from django.core.exceptions import ValidationError
from rest_framework import serializers
from rex.models.tools.validateWithRestFramework import validate_with_rest_framework
class UrlAndDescriptionSerializer(serializers.Serializer):
"""
Simple serialize used to validate each usefull links objs
"""
url = serializers.URLField(required=True)
description = serializers.CharField(
required=False, allow_null=True, allow_blank=True)
def validate_usefull_links(value):
"""
Function validate the data that should be stored
in a usefull_links field
"""
if type(value) is not list:
raise ValidationError("Usefull links must be a JSON array !")
for obj in value:
validate_with_rest_framework(UrlAndDescriptionSerializer, obj)
class UsefullLinksField(JSONField):
description = "A field to store a URL and a description as single JSON data"
def __init__(self, *args, **kwargs):
kwargs['validators'] = [validate_usefull_links]
super(UsefullLinksField, self).__init__(*args, **kwargs)
from django.core.exceptions import ValidationError
def validate_with_rest_framework(serializer, value):
"""
Function to validate some data (comming from JSON)
against a serializer.
TODO add test for this...
"""
valid_ser = serializer(data=value)
if not valid_ser.is_valid():
raise ValidationError(str(valid_ser.errors))
# Also checks that no extra fields were added
if type(value) is not list:
allowed_keys = list(valid_ser.get_fields())
for key in value.keys():
if key not in allowed_keys:
raise ValidationError("Expected JSON schema not respected")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment