2026-09-25 18:35:16 +02:00

149 lines
3.2 KiB
Python

from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import Note
from .permissions import (
can_complete_note,
can_edit_note,
)
class NoteUserSerializer(serializers.ModelSerializer):
"""
Annuaire minimal accessible à l'équipe
sans exposer la gestion des comptes.
"""
class Meta:
model = get_user_model()
fields = [
'id',
'username',
'first_name',
'last_name',
'color',
]
read_only_fields = fields
class NoteSerializer(serializers.ModelSerializer):
author = NoteUserSerializer(
read_only=True,
)
recipients = NoteUserSerializer(
many=True,
read_only=True,
)
recipient_ids = serializers.PrimaryKeyRelatedField(
source='recipients',
queryset=get_user_model().objects.filter(
is_active=True,
),
many=True,
required=False,
write_only=True,
)
is_done = serializers.ReadOnlyField()
can_edit = serializers.SerializerMethodField()
can_complete = serializers.SerializerMethodField()
class Meta:
model = Note
fields = [
'id',
'title',
'content',
'kind',
'author',
'recipients',
'recipient_ids',
'is_public',
'is_done',
'completed_at',
'created_at',
'updated_at',
'can_edit',
'can_complete',
]
read_only_fields = [
'id',
'completed_at',
'created_at',
'updated_at',
]
def get_can_edit(self, obj):
return can_edit_note(
self.context['request'].user,
obj,
)
def get_can_complete(self, obj):
return can_complete_note(
self.context['request'].user,
obj,
)
def validate(self, attrs):
is_public = attrs.get(
'is_public',
self.instance.is_public
if self.instance
else True,
)
if 'recipients' in attrs:
recipients = attrs['recipients']
has_recipients = bool(recipients)
elif self.instance:
has_recipients = (
self.instance.recipients.exists()
)
else:
has_recipients = False
if not is_public and not has_recipients:
raise serializers.ValidationError({
'recipient_ids':
'Une publication privée doit avoir au moins un destinataire.',
})
return attrs
def update(
self,
instance,
validated_data,
):
if (
validated_data.get(
'kind',
instance.kind,
)
!= Note.Kind.TASK
):
validated_data[
'completed_at'
] = None
return super().update(
instance,
validated_data,
)
class NoteCompletionSerializer(
serializers.Serializer,
):
is_done = serializers.BooleanField()