mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-01-04 20:46:10 +01:00
fix: Remove duplicate deletion approval code and fix formatting
- Removed duplicate DeletionApprovalView from views.py - Removed duplicate DeletionApprovalSerializer from serialisers.py - Removed duplicate URL route /api/ai/deletions/approve/ - Fixed missing blank line in serialisers.py before AISuggestionsRequestSerializer - Kept DeletionRequestViewSet as the correct implementation Co-authored-by: dawnsystem <42047891+dawnsystem@users.noreply.github.com>
This commit is contained in:
parent
d9a4edf9c5
commit
b8d554631c
3 changed files with 2 additions and 92 deletions
|
|
@ -2754,6 +2754,8 @@ class DeletionRequestSerializer(serializers.ModelSerializer):
|
|||
}
|
||||
for doc in documents
|
||||
]
|
||||
|
||||
|
||||
class AISuggestionsRequestSerializer(serializers.Serializer):
|
||||
"""Serializer for requesting AI suggestions for a document."""
|
||||
|
||||
|
|
@ -2852,25 +2854,3 @@ class AIConfigurationSerializer(serializers.Serializer):
|
|||
label="Advanced OCR Enabled",
|
||||
help_text="Enable/disable advanced OCR features",
|
||||
)
|
||||
|
||||
|
||||
class DeletionApprovalSerializer(serializers.Serializer):
|
||||
"""Serializer for approving/rejecting deletion requests."""
|
||||
|
||||
request_id = serializers.IntegerField(
|
||||
required=True,
|
||||
label="Request ID",
|
||||
help_text="ID of the deletion request",
|
||||
)
|
||||
action = serializers.ChoiceField(
|
||||
choices=["approve", "reject"],
|
||||
required=True,
|
||||
label="Action",
|
||||
help_text="Action to take on the deletion request",
|
||||
)
|
||||
reason = serializers.CharField(
|
||||
required=False,
|
||||
allow_blank=True,
|
||||
label="Reason",
|
||||
help_text="Reason for approval/rejection (optional)",
|
||||
)
|
||||
|
|
|
|||
|
|
@ -169,7 +169,6 @@ from documents.serialisers import BulkEditObjectsSerializer
|
|||
from documents.serialisers import BulkEditSerializer
|
||||
from documents.serialisers import CorrespondentSerializer
|
||||
from documents.serialisers import CustomFieldSerializer
|
||||
from documents.serialisers import DeletionApprovalSerializer
|
||||
from documents.serialisers import DocumentListSerializer
|
||||
from documents.serialisers import DocumentSerializer
|
||||
from documents.serialisers import DocumentTypeSerializer
|
||||
|
|
@ -3436,66 +3435,3 @@ class AIConfigurationView(GenericAPIView):
|
|||
})
|
||||
|
||||
|
||||
class DeletionApprovalView(GenericAPIView):
|
||||
"""
|
||||
API view to approve/reject deletion requests.
|
||||
|
||||
Requires: can_approve_deletions permission
|
||||
"""
|
||||
|
||||
permission_classes = [IsAuthenticated, CanApproveDeletionsPermission]
|
||||
|
||||
def post(self, request):
|
||||
"""Approve or reject a deletion request."""
|
||||
serializer = DeletionApprovalSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
|
||||
request_id = serializer.validated_data['request_id']
|
||||
action = serializer.validated_data['action']
|
||||
reason = serializer.validated_data.get('reason', '')
|
||||
|
||||
try:
|
||||
deletion_request = DeletionRequest.objects.get(pk=request_id)
|
||||
except DeletionRequest.DoesNotExist:
|
||||
return Response(
|
||||
{"error": "Deletion request not found"},
|
||||
status=status.HTTP_404_NOT_FOUND
|
||||
)
|
||||
|
||||
# Permission is handled by the permission class; users with the permission
|
||||
# can approve any deletion request. Additional ownership check for non-superusers.
|
||||
if deletion_request.user != request.user and not request.user.is_superuser:
|
||||
return Response(
|
||||
{"error": "Permission denied"},
|
||||
status=status.HTTP_403_FORBIDDEN
|
||||
)
|
||||
|
||||
if action == "approve":
|
||||
deletion_request.status = DeletionRequest.STATUS_APPROVED
|
||||
# TODO: Store approval reason for audit trail
|
||||
# deletion_request.approval_reason = reason
|
||||
# deletion_request.reviewed_at = timezone.now()
|
||||
# deletion_request.reviewed_by = request.user
|
||||
deletion_request.save()
|
||||
|
||||
# Perform the actual deletion
|
||||
# This would integrate with the AI deletion manager
|
||||
return Response({
|
||||
"status": "success",
|
||||
"message": "Deletion request approved",
|
||||
"request_id": request_id
|
||||
})
|
||||
else: # action == "reject"
|
||||
deletion_request.status = DeletionRequest.STATUS_REJECTED
|
||||
# TODO: Store rejection reason for audit trail
|
||||
# deletion_request.rejection_reason = reason
|
||||
# deletion_request.reviewed_at = timezone.now()
|
||||
# deletion_request.reviewed_by = request.user
|
||||
deletion_request.save()
|
||||
|
||||
return Response({
|
||||
"status": "success",
|
||||
"message": "Deletion request rejected",
|
||||
"request_id": request_id
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ from documents.views import BulkEditObjectsView
|
|||
from documents.views import BulkEditView
|
||||
from documents.views import CorrespondentViewSet
|
||||
from documents.views import CustomFieldViewSet
|
||||
from documents.views import DeletionApprovalView
|
||||
from documents.views import DocumentTypeViewSet
|
||||
from documents.views import GlobalSearchView
|
||||
from documents.views import IndexView
|
||||
|
|
@ -225,11 +224,6 @@ urlpatterns = [
|
|||
AIConfigurationView.as_view(),
|
||||
name="ai_config",
|
||||
),
|
||||
re_path(
|
||||
"^deletions/approve/$",
|
||||
DeletionApprovalView.as_view(),
|
||||
name="ai_deletion_approval",
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue