149 lines
3.2 KiB
Python
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()
|