Source code for ox.apps.content.serializers

from django.utils.html import strip_tags
from rest_framework import serializers

from ox.core.serializers import ModelSerializer

from . import models, mixins


__all__ = (
    "RichTextField",
    "StripCharField",
    # ----
    "DynamicBlockSerializer",
    "VariableInfoSerializer",
    "RendererSerializer",
    # ----
    "TemplatePackSerializer",
)


# ---- Reusable serializer/fields ----
[docs] class RichTextField(mixins.RichTextFieldMixin, serializers.CharField): """Handles cleaning input HTML rich text content."""
[docs] def to_internal_value(self, value): return self.clean(super().to_internal_value(value))
[docs] class StripCharField(serializers.CharField): """Strip HTML tags of provided input."""
[docs] def to_internal_value(self, value): return strip_tags(value).strip()
# ---- Dynamic Blocks ----
[docs] class DynamicBlockSerializer(serializers.Serializer): """Serialize a :py:class:`~.blocks.DynamicBlock`.""" name = serializers.CharField() group = serializers.CharField() label = serializers.CharField() icon = serializers.CharField() inline = serializers.BooleanField()
[docs] class VariableInfoSerializer(serializers.Serializer): label = serializers.CharField() description = serializers.CharField() optional = serializers.BooleanField()
[docs] class RendererSerializer(serializers.Serializer): """Serialize a :py:class:`~.renderers.Renderer` informations. Note: variables are rendered as a list with extra value ``name``. """ blocks = DynamicBlockSerializer(many=True)
[docs] def to_representation(self, instance): data = super().to_representation(instance) vars_ser = VariableInfoSerializer(instance.variables.values(), many=True) vars = [] for name, info in zip(instance.variables.keys(), vars_ser.data): vars.append({"name": name, **info}) data["variables"] = vars return data
# ---- Models ----
[docs] class TemplatePackSerializer(ModelSerializer): template_dir = serializers.CharField() static_dir = serializers.CharField() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if request := self.context.get("request"): if not request.user.has_perm("ox_content.change_templatepack"): del self.fields["template_dir"] del self.fields["static_dir"] class Meta: model = models.TemplatePack fields = "__all__"