check if stale
This commit is contained in:
@@ -104,6 +104,7 @@ def _award_item_manage_out(item: SubmissionAward):
|
|||||||
"sort_order": item.sort_order,
|
"sort_order": item.sort_order,
|
||||||
"awarded_at": item.awarded_at,
|
"awarded_at": item.awarded_at,
|
||||||
"has_prompt_chain": has_prompt_chain,
|
"has_prompt_chain": has_prompt_chain,
|
||||||
|
"is_stale": item.is_stale,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -187,6 +188,13 @@ def create_submission(request, payload: SubmissionIn):
|
|||||||
except Message.DoesNotExist:
|
except Message.DoesNotExist:
|
||||||
pass # invalid message_id — submission already created, silently skip
|
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)}
|
return {"id": str(submission.id)}
|
||||||
|
|
||||||
|
|
||||||
@@ -705,6 +713,31 @@ def delete_manage_award_item(request, item_id: int):
|
|||||||
return {"message": "删除成功"}
|
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)
|
@router.get("/showcase/{submission_id}/", response=ShowcaseDetailOut)
|
||||||
@login_required
|
@login_required
|
||||||
def get_showcase_detail(request, submission_id: UUID):
|
def get_showcase_detail(request, submission_id: UUID):
|
||||||
|
|||||||
16
submission/migrations/0012_submissionaward_is_stale.py
Normal file
16
submission/migrations/0012_submissionaward_is_stale.py
Normal file
@@ -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="有更新提交"),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -205,6 +205,7 @@ class SubmissionAward(TimeStampedModel):
|
|||||||
awarded_at = models.DateTimeField(
|
awarded_at = models.DateTimeField(
|
||||||
auto_now_add=True, db_index=True, verbose_name="授奖时间"
|
auto_now_add=True, db_index=True, verbose_name="授奖时间"
|
||||||
)
|
)
|
||||||
|
is_stale = models.BooleanField(default=False, verbose_name="有更新提交")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ("submission", "award")
|
unique_together = ("submission", "award")
|
||||||
|
|||||||
@@ -271,6 +271,7 @@ class AwardItemManageOut(Schema):
|
|||||||
sort_order: int
|
sort_order: int
|
||||||
awarded_at: datetime
|
awarded_at: datetime
|
||||||
has_prompt_chain: bool
|
has_prompt_chain: bool
|
||||||
|
is_stale: bool = False
|
||||||
|
|
||||||
|
|
||||||
class ShowcaseDetailOut(Schema):
|
class ShowcaseDetailOut(Schema):
|
||||||
|
|||||||
Reference in New Issue
Block a user