58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
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))
|