Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 28 additions & 10 deletions solid_backend/content/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from importlib import import_module
import logging

from django.conf import settings
from rest_framework import serializers
Expand All @@ -7,6 +8,8 @@

from .models import TreeNode

logger = logging.getLogger(__name__)

SERIALIZERS = {}

if hasattr(settings, "PROFILES_SERIALIZERS"):
Expand Down Expand Up @@ -61,16 +64,31 @@ class Meta:
depth = 1


class NestedTreeNodeSerializer(IdTreeNodeSerializer):
def build_nested_field(self, field_name, relation_info, nested_depth):
if SERIALIZERS.get(field_name) is not None:
return SERIALIZERS.get(field_name), {"many": True, "required": False}

return super(NestedTreeNodeSerializer, self).build_nested_field(
field_name, relation_info, nested_depth
)

children = RecursiveSerializer(many=True, required=False)
class NestedTreeNodeSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
data = super().to_representation(instance)

# Assume leaves are the only nodes that have profiles
if not instance.get_children().exists():
# Add profile data for this node
for profile_type in SERIALIZERS.keys():
model = SERIALIZERS[profile_type].Meta.model
if hasattr(model, "get_optimized_queryset"):
profiles = model.get_optimized_queryset().filter(tree_node=instance)
else:
profiles = model.objects.filter(tree_node=instance)
data[profile_type] = SERIALIZERS[profile_type](
profiles, many=True, context=self.context
).data

# Handle children using MPTT's get_children()
else:
children = instance.get_children()
data["children"] = self.__class__(
children, many=True, context=self.context
).data

return data

class Meta:
model = TreeNode
Expand Down