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