diff --git a/prompt/api.py b/prompt/api.py index 1558583..628a9d8 100644 --- a/prompt/api.py +++ b/prompt/api.py @@ -109,7 +109,7 @@ def delete_message_pair(request, message_id: int): """ asst_msg = get_object_or_404(Message, id=message_id, role="assistant") - if asst_msg.conversation.user != request.user: + if asst_msg.conversation.user != request.user and request.user.role != RoleChoices.SUPER: raise HttpError(403, "只能删除自己的消息") # Find the preceding user message diff --git a/prompt/migrations/0006_message_submission_cascade_delete.py b/prompt/migrations/0006_message_submission_cascade_delete.py new file mode 100644 index 0000000..65f434c --- /dev/null +++ b/prompt/migrations/0006_message_submission_cascade_delete.py @@ -0,0 +1,20 @@ +# Generated by Django 6.0.1 on 2026-04-16 06:15 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('prompt', '0005_message_add_submission_fk'), + ('submission', '0010_remove_conversation_fk'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='submission', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='source_message', to='submission.submission'), + ), + ] diff --git a/prompt/models.py b/prompt/models.py index c817e23..7d5b034 100644 --- a/prompt/models.py +++ b/prompt/models.py @@ -1,7 +1,5 @@ import uuid from django.db import models -from django.db.models.signals import pre_delete -from django.dispatch import receiver from django_extensions.db.models import TimeStampedModel from account.models import User from task.models import Task @@ -38,7 +36,7 @@ class Message(models.Model): "submission.Submission", null=True, blank=True, - on_delete=models.SET_NULL, + on_delete=models.CASCADE, related_name="source_message", ) @@ -47,10 +45,3 @@ class Message(models.Model): def __str__(self): return f"[{self.role}] {self.content[:50]}" - - -@receiver(pre_delete, sender=Message) -def delete_linked_submission(sender, instance, **kwargs): - if instance.submission_id: - from submission.models import Submission - Submission.objects.filter(id=instance.submission_id).delete() diff --git a/submission/api.py b/submission/api.py index 1558ac1..6ec9d45 100644 --- a/submission/api.py +++ b/submission/api.py @@ -39,6 +39,7 @@ def create_submission(request, payload: SubmissionIn): """ task = get_object_or_404(Task, id=payload.task_id) + manual_asst_msg = None if payload.prompt: conversation = ( Conversation.objects.filter(user=request.user, task=task) @@ -53,7 +54,7 @@ def create_submission(request, payload: SubmissionIn): Message.objects.create( conversation=conversation, role="user", content=payload.prompt, source="manual" ) - Message.objects.create( + manual_asst_msg = Message.objects.create( conversation=conversation, role="assistant", content="", @@ -83,8 +84,11 @@ def create_submission(request, payload: SubmissionIn): js=payload.js, ) - # Link assistant message if provided - if payload.message_id: + # Link assistant message to submission + if manual_asst_msg: + manual_asst_msg.submission = submission + manual_asst_msg.save(update_fields=["submission"]) + elif payload.message_id: try: msg = Message.objects.get( id=payload.message_id, @@ -207,11 +211,12 @@ def clear_all_flags(request): @login_required def delete_submission(request, submission_id: UUID): submission = get_object_or_404(Submission, id=submission_id) - if submission.user != request.user: + if submission.user != request.user and request.user.role != RoleChoices.SUPER: raise HttpError(403, "只能删除自己的提交") - # Delete linked message pair if present + # 找到关联的助手消息,再找前一条用户消息 asst_msg = Message.objects.filter(submission=submission).first() + user_msg = None if asst_msg: user_msg = ( Message.objects.filter( @@ -222,11 +227,12 @@ def delete_submission(request, submission_id: UUID): .order_by("-created") .first() ) - if user_msg: - user_msg.delete() - asst_msg.delete() - submission.delete() + submission.delete() # CASCADE 自动删除关联的 asst_msg + + if user_msg: + user_msg.delete() + return {"message": "删除成功"}