from django.contrib.auth import get_user_model from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from core.serializers.mini import UserMiniSerializer User = get_user_model() class BaseModelSerializer(serializers.ModelSerializer): """ Base serializer for all models inheriting from BaseModel. Returns audit fields with a nested user mini representation. """ id = serializers.UUIDField(read_only=True) created_by = UserMiniSerializer(read_only=True) updated_by = UserMiniSerializer(read_only=True) created_at = serializers.SerializerMethodField() updated_at = serializers.SerializerMethodField() can_delete = serializers.SerializerMethodField() class Meta: model = None fields = ( "id", "created_by", "updated_by", "created_at", "updated_at", "can_delete", ) read_only_fields = fields def to_internal_value(self, data): if isinstance(data, dict): data = data.copy() for name, field in self.fields.items(): if ( name in data and data[name] is None and isinstance(field, (serializers.CharField, serializers.URLField)) ): data[name] = "" return super().to_internal_value(data) @extend_schema_field(serializers.CharField) def get_created_at(self, obj) -> str: return obj.created_at_display @extend_schema_field(serializers.CharField) def get_updated_at(self, obj) -> str: return obj.updated_at_display @extend_schema_field(serializers.BooleanField) def get_can_delete(self, obj) -> bool: return bool(getattr(obj, "can_delete", False))