From 7c38befd3bfd2d04eca9f6770c0b31a2fc1c9688 Mon Sep 17 00:00:00 2001 From: Florent Chehab Date: Sat, 1 Sep 2018 11:06:41 +0200 Subject: [PATCH] Centralized tag definition --- backend/load_data/assets/tags.json | 37 +----------------- backend/migrations/0002_auto_20180901_1000.py | 34 ++++++++++++++++ backend/models/module/basicModule.py | 24 +----------- backend/models/tag/taggedItem.py | 2 + backend/models/tag/tagged_item_validation.py | 11 +++++- backend/models/tag/tags_config/__init__.py | 2 + backend/models/tag/tags_config/photos.py | 39 +++++++++++++++++++ .../models/tag/tags_config/usefull_links.py | 18 +++++++++ 8 files changed, 108 insertions(+), 59 deletions(-) create mode 100644 backend/migrations/0002_auto_20180901_1000.py create mode 100644 backend/models/tag/tags_config/__init__.py create mode 100644 backend/models/tag/tags_config/photos.py create mode 100644 backend/models/tag/tags_config/usefull_links.py diff --git a/backend/load_data/assets/tags.json b/backend/load_data/assets/tags.json index fbf8f2c3..7966e0c8 100644 --- a/backend/load_data/assets/tags.json +++ b/backend/load_data/assets/tags.json @@ -3,42 +3,7 @@ "name": "photos", "config": { "photos": { - "type": "array", - "content": { - "url": { - "type": "url", - "required": true, - "validators": { - "extension": [ - "jpg", - "jpeg", - "png", - "svg" - ] - } - }, - "title": { - "type": "text", - "required": true, - "validators": { - "max_length": 200 - } - }, - "licence": { - "type": "text", - "required": false, - "validators": { - "max_length": 200 - } - }, - "description": { - "type": "text", - "required": false, - "validators": { - "max_length": 500 - } - } - }, + "type": "photos", "required": true } } diff --git a/backend/migrations/0002_auto_20180901_1000.py b/backend/migrations/0002_auto_20180901_1000.py new file mode 100644 index 00000000..38dd59fe --- /dev/null +++ b/backend/migrations/0002_auto_20180901_1000.py @@ -0,0 +1,34 @@ +# Generated by Django 2.0.3 on 2018-09-01 08:00 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='campustaggeditem', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), + ), + migrations.AddField( + model_name='citytaggeditem', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), + ), + migrations.AddField( + model_name='countrytaggeditem', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), + ), + migrations.AddField( + model_name='universitytaggeditem', + name='custom_content', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict), + ), + ] diff --git a/backend/models/module/basicModule.py b/backend/models/module/basicModule.py index 4b91062a..af902083 100644 --- a/backend/models/module/basicModule.py +++ b/backend/models/module/basicModule.py @@ -2,27 +2,7 @@ from django.db import models from backend.models.my_model import MyModelVersionned, MyModelVersionnedSerializer, MyModelVersionnedViewSet from django.contrib.postgres.fields import JSONField from backend.models.tag.tagged_item_validation import validate_content_against_config - -USEFULL_LINKS_CONFIG = { - "usefull_links": { - "type": "array", - "content": { - "url": { - "type": "url", - "required": True, - "validators": {} - }, - "description": { - "type": "text", - "required": True, - "validators": { - "max_length": 500 - } - } - }, - "required": True - } -} +from backend.models.tag.tags_config import USEFULL_LINKS_CONFIG class BasicModule(MyModelVersionned): @@ -38,7 +18,7 @@ class BasicModuleSerializer(MyModelVersionnedSerializer): def validate(self, attrs): content = {'usefull_links': attrs['usefull_links']} - config = USEFULL_LINKS_CONFIG + config = {'usefull_links': USEFULL_LINKS_CONFIG} validate_content_against_config(config, content) return attrs diff --git a/backend/models/tag/taggedItem.py b/backend/models/tag/taggedItem.py index b248c022..cc91c549 100644 --- a/backend/models/tag/taggedItem.py +++ b/backend/models/tag/taggedItem.py @@ -2,10 +2,12 @@ from django.db import models from backend.models.my_model import MyModelVersionned, MyModelVersionnedSerializer, MyModelVersionnedViewSet from .tag import Tag from .tagged_item_validation import tagged_item_validation +from django.contrib.postgres.fields import JSONField class TaggedItem(MyModelVersionned): tag = models.ForeignKey(Tag, related_name='+', on_delete=models.PROTECT) + custom_content = JSONField(default=dict) class Meta: abstract = True diff --git a/backend/models/tag/tagged_item_validation.py b/backend/models/tag/tagged_item_validation.py index e6024657..0babe521 100644 --- a/backend/models/tag/tagged_item_validation.py +++ b/backend/models/tag/tagged_item_validation.py @@ -1,6 +1,8 @@ from .checks import check_required from .validators import validate_url, validate_text from rest_framework.validators import ValidationError +from .tags_config import PHOTOS_TAG_GONFIG +from .tags_config import USEFULL_LINKS_CONFIG def tagged_item_validation(attrs): @@ -19,15 +21,22 @@ def validate_content_against_config(config, content): field_submitted = content[field] field_config = config[field] + field_type = field_config['type'] if field_type == 'url': validate_url(field_config, field_submitted) elif field_type == 'text': validate_text(field_config, field_submitted) + elif field_type == 'photos': + validate_content_against_config({"photos": PHOTOS_TAG_GONFIG}, { + "photos": field_submitted}) + elif field_type == 'usefull_links': + validate_content_against_config({"ul": USEFULL_LINKS_CONFIG}, { + "ul": field_submitted}) elif field_type == 'array': if type(field_submitted) is not list: - raise ValidationError("A array is required here !") + raise ValidationError("An array is required here !") for item in field_submitted: validate_content_against_config(field_config['content'], item) else: diff --git a/backend/models/tag/tags_config/__init__.py b/backend/models/tag/tags_config/__init__.py new file mode 100644 index 00000000..d859e5e4 --- /dev/null +++ b/backend/models/tag/tags_config/__init__.py @@ -0,0 +1,2 @@ +from .photos import PHOTOS_TAG_GONFIG # noqa: F401 +from .usefull_links import USEFULL_LINKS_CONFIG # noqa: F401 diff --git a/backend/models/tag/tags_config/photos.py b/backend/models/tag/tags_config/photos.py new file mode 100644 index 00000000..67f1f840 --- /dev/null +++ b/backend/models/tag/tags_config/photos.py @@ -0,0 +1,39 @@ +PHOTOS_TAG_GONFIG = { + "type": "array", + "required": True, + "content": { + "url": { + "type": "url", + "required": True, + "validators": { + "extension": [ + "jpg", + "jpeg", + "png", + "svg" + ] + } + }, + "title": { + "type": "text", + "required": True, + "validators": { + "max_length": 200 + } + }, + "licence": { + "type": "text", + "required": False, + "validators": { + "max_length": 200 + } + }, + "description": { + "type": "text", + "required": False, + "validators": { + "max_length": 500 + } + } + } +} diff --git a/backend/models/tag/tags_config/usefull_links.py b/backend/models/tag/tags_config/usefull_links.py new file mode 100644 index 00000000..d86c90e3 --- /dev/null +++ b/backend/models/tag/tags_config/usefull_links.py @@ -0,0 +1,18 @@ +USEFULL_LINKS_CONFIG = { + "type": "array", + "required": True, + "content": { + "url": { + "type": "url", + "required": True, + "validators": {} + }, + "description": { + "type": "text", + "required": True, + "validators": { + "max_length": 500 + } + } + } +} -- GitLab