Skip to content
Snippets Groups Projects
Commit 6a4bafc7 authored by Jean-Baptiste's avatar Jean-Baptiste
Browse files

update: depth and many_depth configurable on Model

parent 23a9e9c3
No related branches found
No related tags found
1 merge request!43Resolve "Error while submiting a form with nested fields"
Pipeline #831 passed
from django.db.models import options from django.db.models import options
__version__ = '0.0.0' __version__ = '0.0.0'
options.DEFAULT_NAMES += ('lookup_field', 'rdf_type', 'rdf_context', 'auto_author', 'view_set', 'container_path', 'permission_classes', 'serializer_fields', 'nested_fields') options.DEFAULT_NAMES += ('lookup_field', 'rdf_type', 'rdf_context', 'auto_author', 'view_set', 'container_path', 'permission_classes', 'serializer_fields', 'nested_fields', 'depth', 'many_depth')
\ No newline at end of file \ No newline at end of file
...@@ -54,6 +54,8 @@ class Model(models.Model): ...@@ -54,6 +54,8 @@ class Model(models.Model):
class Meta: class Meta:
default_permissions = ('add', 'change', 'delete', 'view', 'control') default_permissions = ('add', 'change', 'delete', 'view', 'control')
abstract = True abstract = True
depth = 1
many_depth = 0
@classmethod @classmethod
def resolve_id(cls, id): def resolve_id(cls, id):
......
...@@ -225,6 +225,11 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -225,6 +225,11 @@ class LDPSerializer(HyperlinkedModelSerializer):
return data return data
def build_field(self, field_name, info, model_class, nested_depth):
nested_depth = self.compute_depth(nested_depth, model_class)
return super().build_field(field_name, info, model_class, nested_depth)
def build_standard_field(self, field_name, model_field): def build_standard_field(self, field_name, model_field):
class JSonLDStandardField: class JSonLDStandardField:
parent_view_name = None parent_view_name = None
...@@ -253,6 +258,8 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -253,6 +258,8 @@ class LDPSerializer(HyperlinkedModelSerializer):
return type(field_class.__name__ + 'Valued', (JSonLDStandardField, field_class), {}), field_kwargs return type(field_class.__name__ + 'Valued', (JSonLDStandardField, field_class), {}), field_kwargs
def build_nested_field(self, field_name, relation_info, nested_depth): def build_nested_field(self, field_name, relation_info, nested_depth):
nested_depth = self.compute_depth(nested_depth, self.Meta.model)
class NestedLDPSerializer(self.__class__): class NestedLDPSerializer(self.__class__):
class Meta: class Meta:
...@@ -321,11 +328,21 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -321,11 +328,21 @@ class LDPSerializer(HyperlinkedModelSerializer):
kwargs['required'] = False kwargs['required'] = False
return NestedLDPSerializer, kwargs return NestedLDPSerializer, kwargs
@classmethod
def compute_depth(cls, depth, model_class, name='depth'):
try:
model_depth = getattr(model_class._meta, 'depth', getattr(model_class.Meta, 'depth', 10))
depth = min(depth, int(model_depth))
except AttributeError:
depth = min(depth, int(getattr(model_class._meta, 'depth', 1)))
return depth
@classmethod @classmethod
def many_init(cls, *args, **kwargs): def many_init(cls, *args, **kwargs):
kwargs['child'] = cls(**kwargs) kwargs['child'] = cls(**kwargs)
try: try:
cls.Meta.depth = kwargs['context']['view'].many_depth cls.Meta.depth = cls.compute_depth(kwargs['context']['view'].many_depth, cls.Meta.model, 'many_depth')
except KeyError: except KeyError:
pass pass
return ContainerSerializer(*args, **kwargs) return ContainerSerializer(*args, **kwargs)
...@@ -359,9 +376,9 @@ class LDPSerializer(HyperlinkedModelSerializer): ...@@ -359,9 +376,9 @@ class LDPSerializer(HyperlinkedModelSerializer):
return instance return instance
def attach_related_object(self, instance, validated_data): def attach_related_object(self, instance, validated_data):
ModelClass = self.Meta.model model_class = self.Meta.model
info = model_meta.get_field_info(ModelClass) info = model_meta.get_field_info(model_class)
many_to_many = {} many_to_many = {}
for field_name, relation_info in info.relations.items(): for field_name, relation_info in info.relations.items():
if relation_info.to_many and relation_info.reverse and not (field_name in validated_data): if relation_info.to_many and relation_info.reverse and not (field_name in validated_data):
......
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.db.models.signals import pre_save
from django.dispatch import receiver
from djangoldp.models import Model from djangoldp.models import Model
...@@ -11,9 +9,8 @@ class Skill(Model): ...@@ -11,9 +9,8 @@ class Skill(Model):
obligatoire = models.CharField(max_length=255) obligatoire = models.CharField(max_length=255)
slug = models.SlugField(blank=True, null=True, unique=True) slug = models.SlugField(blank=True, null=True, unique=True)
class Meta: class Meta:
serializer_fields=["@id", "title"] serializer_fields = ["@id", "title"]
lookup_field = 'slug' lookup_field = 'slug'
...@@ -23,8 +20,8 @@ class JobOffer(Model): ...@@ -23,8 +20,8 @@ class JobOffer(Model):
slug = models.SlugField(blank=True, null=True, unique=True) slug = models.SlugField(blank=True, null=True, unique=True)
class Meta: class Meta:
nested_fields=["skills"] nested_fields = ["skills"]
container_path="job-offers/" container_path = "job-offers/"
lookup_field = 'slug' lookup_field = 'slug'
...@@ -51,6 +48,10 @@ class LDPDummy(Model): ...@@ -51,6 +48,10 @@ class LDPDummy(Model):
class Invoice(Model): class Invoice(Model):
title = models.CharField(max_length=255, blank=True, null=True) title = models.CharField(max_length=255, blank=True, null=True)
class Meta:
depth = 2
nested_fields = ["batches"]
class Batch(Model): class Batch(Model):
invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='batches') invoice = models.ForeignKey(Invoice, on_delete=models.CASCADE, related_name='batches')
...@@ -58,6 +59,7 @@ class Batch(Model): ...@@ -58,6 +59,7 @@ class Batch(Model):
class Meta: class Meta:
serializer_fields = ['@id', 'title', 'invoice', 'tasks'] serializer_fields = ['@id', 'title', 'invoice', 'tasks']
nested_fields = ["tasks"]
class Task(models.Model): class Task(models.Model):
...@@ -66,6 +68,3 @@ class Task(models.Model): ...@@ -66,6 +68,3 @@ class Task(models.Model):
class Meta: class Meta:
serializer_fields = ['@id', 'title', 'batch'] serializer_fields = ['@id', 'title', 'batch']
...@@ -53,7 +53,7 @@ class Save(TestCase): ...@@ -53,7 +53,7 @@ class Save(TestCase):
]} ]}
} }
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills", "slug")} meta_args = {'model': JobOffer, 'depth': 2, 'fields': ("@id", "title", "skills", "slug")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -73,7 +73,7 @@ class Save(TestCase): ...@@ -73,7 +73,7 @@ class Save(TestCase):
}, },
]} ]}
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")} meta_args = {'model': JobOffer, 'depth': 2, 'fields': ("@id", "title", "skills")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -95,7 +95,7 @@ class Save(TestCase): ...@@ -95,7 +95,7 @@ class Save(TestCase):
{"@id": "_.123", "title": "skill3 NEW", "obligatoire": "obligatoire"}, {"@id": "_.123", "title": "skill3 NEW", "obligatoire": "obligatoire"},
]} ]}
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")} meta_args = {'model': JobOffer, 'depth': 2, 'fields': ("@id", "title", "skills")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -112,7 +112,7 @@ class Save(TestCase): ...@@ -112,7 +112,7 @@ class Save(TestCase):
skill2 = Skill.objects.create(title="skill2", obligatoire="obligatoire") skill2 = Skill.objects.create(title="skill2", obligatoire="obligatoire")
job = {"title": "job test"} job = {"title": "job test"}
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")} meta_args = {'model': JobOffer, 'depth': 2, 'fields': ("@id", "title", "skills")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -130,7 +130,7 @@ class Save(TestCase): ...@@ -130,7 +130,7 @@ class Save(TestCase):
job = JobOffer.objects.create(title="job test") job = JobOffer.objects.create(title="job test")
skill = {"title": "new SKILL"} skill = {"title": "new SKILL"}
meta_args = {'model': Skill, 'depth': 1, 'fields': ("@id", "title")} meta_args = {'model': Skill, 'depth': 2, 'fields': ("@id", "title")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('SkillSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('SkillSerializer', (LDPSerializer,), {'Meta': meta_class})
......
...@@ -24,7 +24,7 @@ class Update(TestCase): ...@@ -24,7 +24,7 @@ class Update(TestCase):
]} ]}
} }
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")} meta_args = {'model': JobOffer, 'depth': 2, 'fields': ("@id", "title", "skills")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -73,7 +73,7 @@ class Update(TestCase): ...@@ -73,7 +73,7 @@ class Update(TestCase):
] ]
} }
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")} meta_args = {'model': JobOffer, 'depth': 2, 'fields': ("@id", "title", "skills")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -128,7 +128,7 @@ class Update(TestCase): ...@@ -128,7 +128,7 @@ class Update(TestCase):
] ]
} }
meta_args = {'model': JobOffer, 'depth': 1, 'fields': ("@id", "title", "skills")} meta_args = {'model': JobOffer, 'depth': 2, 'fields': ("@id", "title", "skills")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('JobOfferSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -171,7 +171,7 @@ class Update(TestCase): ...@@ -171,7 +171,7 @@ class Update(TestCase):
] ]
} }
meta_args = {'model': Thread, 'depth': 1, 'fields': ("@id", "description", "message_set")} meta_args = {'model': Thread, 'depth': 2, 'fields': ("@id", "description", "message_set")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('ThreadSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('ThreadSerializer', (LDPSerializer,), {'Meta': meta_class})
...@@ -235,7 +235,7 @@ class Update(TestCase): ...@@ -235,7 +235,7 @@ class Update(TestCase):
] ]
} }
meta_args = {'model': Thread, 'depth': 1, 'fields': ("@id", "description", "message_set")} meta_args = {'model': Thread, 'depth': 2, 'fields': ("@id", "description", "message_set")}
meta_class = type('Meta', (), meta_args) meta_class = type('Meta', (), meta_args)
serializer_class = type(LDPSerializer)('ThreadSerializer', (LDPSerializer,), {'Meta': meta_class}) serializer_class = type(LDPSerializer)('ThreadSerializer', (LDPSerializer,), {'Meta': meta_class})
......
...@@ -89,8 +89,8 @@ class LDPViewSet(LDPViewSetGenerator): ...@@ -89,8 +89,8 @@ class LDPViewSet(LDPViewSetGenerator):
"""An automatically generated viewset that serves models following the Linked Data Platform convention""" """An automatically generated viewset that serves models following the Linked Data Platform convention"""
fields = None fields = None
exclude = None exclude = None
depth = 1 depth = 2
many_depth = 0 many_depth = 1
renderer_classes = (JSONLDRenderer,) renderer_classes = (JSONLDRenderer,)
parser_classes = (JSONLDParser,) parser_classes = (JSONLDParser,)
authentication_classes = (NoCSRFAuthentication,) authentication_classes = (NoCSRFAuthentication,)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment