From 9fbab91cf9c0811e54f33661c937eaa24718d2c6 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sun, 7 Jun 2026 05:05:46 -0600 Subject: [PATCH] check if stale --- submission/api.py | 33 +++++++++++++++++++ .../0012_submissionaward_is_stale.py | 16 +++++++++ submission/models.py | 1 + submission/schemas.py | 1 + 4 files changed, 51 insertions(+) create mode 100644 submission/migrations/0012_submissionaward_is_stale.py diff --git a/submission/api.py b/submission/api.py index f945969..9dd357f 100644 --- a/submission/api.py +++ b/submission/api.py @@ -104,6 +104,7 @@ def _award_item_manage_out(item: SubmissionAward): "sort_order": item.sort_order, "awarded_at": item.awarded_at, "has_prompt_chain": has_prompt_chain, + "is_stale": item.is_stale, } @@ -187,6 +188,13 @@ def create_submission(request, payload: SubmissionIn): except Message.DoesNotExist: pass # invalid message_id — submission already created, silently skip + # Mark any showcased older submissions from same user+task as stale + SubmissionAward.objects.filter( + submission__user=request.user, + submission__task=task, + is_stale=False, + ).exclude(submission=submission).update(is_stale=True) + return {"id": str(submission.id)} @@ -705,6 +713,31 @@ def delete_manage_award_item(request, item_id: int): return {"message": "删除成功"} +@router.put("/showcase/manage/items/{item_id}/refresh", response=AwardItemManageOut) +@admin_required +def refresh_manage_award_item(request, item_id: int): + """切换创意工坊条目到该学生该挑战的最新提交""" + item = get_object_or_404( + SubmissionAward.objects.select_related( + "submission", "submission__user", "submission__task" + ), + id=item_id, + ) + latest = ( + Submission.objects.filter( + user=item.submission.user, + task=item.submission.task, + ) + .order_by("-created") + .first() + ) + if latest and latest.pk != item.submission_id: + item.submission = latest + item.is_stale = False + item.save(update_fields=["submission", "is_stale"]) + return _award_item_manage_out(item) + + @router.get("/showcase/{submission_id}/", response=ShowcaseDetailOut) @login_required def get_showcase_detail(request, submission_id: UUID): diff --git a/submission/migrations/0012_submissionaward_is_stale.py b/submission/migrations/0012_submissionaward_is_stale.py new file mode 100644 index 0000000..5bc7bb7 --- /dev/null +++ b/submission/migrations/0012_submissionaward_is_stale.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("submission", "0011_add_award_submissionaward"), + ] + + operations = [ + migrations.AddField( + model_name="submissionaward", + name="is_stale", + field=models.BooleanField(default=False, verbose_name="有更新提交"), + ), + ] diff --git a/submission/models.py b/submission/models.py index c53484e..e351f92 100644 --- a/submission/models.py +++ b/submission/models.py @@ -205,6 +205,7 @@ class SubmissionAward(TimeStampedModel): awarded_at = models.DateTimeField( auto_now_add=True, db_index=True, verbose_name="授奖时间" ) + is_stale = models.BooleanField(default=False, verbose_name="有更新提交") class Meta: unique_together = ("submission", "award") diff --git a/submission/schemas.py b/submission/schemas.py index 7da6478..13f60cd 100644 --- a/submission/schemas.py +++ b/submission/schemas.py @@ -271,6 +271,7 @@ class AwardItemManageOut(Schema): sort_order: int awarded_at: datetime has_prompt_chain: bool + is_stale: bool = False class ShowcaseDetailOut(Schema):