135 lines
4.7 KiB
Python
135 lines
4.7 KiB
Python
from rest_framework import serializers
|
|
from django.contrib.auth import get_user_model
|
|
from .models import FolderStructure, FolderPermission, FolderBookmark, FolderActivity
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class FolderStructureSerializer(serializers.ModelSerializer):
|
|
"""Serializer for folder structures."""
|
|
|
|
path = serializers.CharField(source='get_path', read_only=True)
|
|
children = serializers.SerializerMethodField()
|
|
email_count = serializers.SerializerMethodField()
|
|
unread_count = serializers.SerializerMethodField()
|
|
permissions = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = FolderStructure
|
|
fields = '__all__'
|
|
read_only_fields = ('user', 'created_at', 'updated_at')
|
|
|
|
def get_children(self, obj):
|
|
children = obj.get_children()
|
|
return FolderStructureSerializer(children, many=True, context=self.context).data
|
|
|
|
def get_email_count(self, obj):
|
|
# This would need to be implemented based on your email folder relationship
|
|
return 0
|
|
|
|
def get_unread_count(self, obj):
|
|
# This would need to be implemented based on your email folder relationship
|
|
return 0
|
|
|
|
def get_permissions(self, obj):
|
|
if obj.is_shared:
|
|
permissions = obj.permissions.all()
|
|
return FolderPermissionSerializer(permissions, many=True).data
|
|
return []
|
|
|
|
|
|
class FolderPermissionSerializer(serializers.ModelSerializer):
|
|
"""Serializer for folder permissions."""
|
|
|
|
user_name = serializers.CharField(source='user.get_full_name', read_only=True)
|
|
user_email = serializers.CharField(source='user.email', read_only=True)
|
|
granted_by_name = serializers.CharField(source='granted_by.get_full_name', read_only=True)
|
|
|
|
class Meta:
|
|
model = FolderPermission
|
|
fields = '__all__'
|
|
read_only_fields = ('granted_by', 'granted_at')
|
|
|
|
|
|
class FolderBookmarkSerializer(serializers.ModelSerializer):
|
|
"""Serializer for folder bookmarks."""
|
|
|
|
folder_name = serializers.CharField(source='folder.name', read_only=True)
|
|
folder_path = serializers.CharField(source='folder.get_path', read_only=True)
|
|
|
|
class Meta:
|
|
model = FolderBookmark
|
|
fields = '__all__'
|
|
read_only_fields = ('user', 'created_at')
|
|
|
|
|
|
class FolderActivitySerializer(serializers.ModelSerializer):
|
|
"""Serializer for folder activities."""
|
|
|
|
user_name = serializers.CharField(source='user.get_full_name', read_only=True)
|
|
user_email = serializers.CharField(source='user.email', read_only=True)
|
|
folder_name = serializers.CharField(source='folder.name', read_only=True)
|
|
|
|
class Meta:
|
|
model = FolderActivity
|
|
fields = '__all__'
|
|
read_only_fields = ('created_at',)
|
|
|
|
|
|
class FolderCreateSerializer(serializers.ModelSerializer):
|
|
"""Serializer for creating folders."""
|
|
|
|
class Meta:
|
|
model = FolderStructure
|
|
fields = ('name', 'description', 'parent', 'folder_type', 'color', 'icon', 'sort_order')
|
|
|
|
def validate_name(self, value):
|
|
user = self.context['request'].user
|
|
parent = self.initial_data.get('parent')
|
|
|
|
# Check for duplicate names in the same parent folder
|
|
if FolderStructure.objects.filter(
|
|
user=user,
|
|
name=value,
|
|
parent_id=parent
|
|
).exists():
|
|
raise serializers.ValidationError("A folder with this name already exists in the same location.")
|
|
|
|
return value
|
|
|
|
|
|
class FolderShareSerializer(serializers.Serializer):
|
|
"""Serializer for sharing folders."""
|
|
|
|
user_email = serializers.EmailField()
|
|
permission = serializers.ChoiceField(choices=FolderPermission.PERMISSION_CHOICES)
|
|
|
|
def validate_user_email(self, value):
|
|
user = self.context['request'].user
|
|
if value == user.email:
|
|
raise serializers.ValidationError("You cannot share a folder with yourself.")
|
|
|
|
try:
|
|
User.objects.get(email=value)
|
|
except User.DoesNotExist:
|
|
raise serializers.ValidationError("User with this email does not exist.")
|
|
|
|
return value
|
|
|
|
|
|
class FolderMoveSerializer(serializers.Serializer):
|
|
"""Serializer for moving folders."""
|
|
|
|
new_parent = serializers.IntegerField(required=False, allow_null=True)
|
|
new_sort_order = serializers.IntegerField(required=False)
|
|
|
|
def validate_new_parent(self, value):
|
|
if value is not None:
|
|
user = self.context['request'].user
|
|
try:
|
|
folder = FolderStructure.objects.get(id=value, user=user)
|
|
return folder
|
|
except FolderStructure.DoesNotExist:
|
|
raise serializers.ValidationError("Parent folder does not exist or you don't have access to it.")
|
|
return None
|