Files
webprewviewapi/submission/models.py
2025-03-07 00:06:56 +08:00

48 lines
1.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import models
from django.db.models import Sum
from django.db.models.signals import post_save
from django.dispatch import receiver
from django_extensions.db.models import TimeStampedModel
from account.models import Profile, User
from task.models import Task
class Submission(TimeStampedModel):
user = models.ForeignKey(User, on_delete=models.CASCADE)
task = models.ForeignKey(Task, on_delete=models.CASCADE)
score = models.IntegerField(default=0)
html = models.TextField(null=True, blank=True)
css = models.TextField(null=True, blank=True)
js = models.TextField(null=True, blank=True)
def __str__(self):
return f"{self.user.username} - {self.task.title}"
def get_task_type(self):
"""
返回任务的具体类型Challenge 或 Tutorial
"""
return self.task.task_type
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.user.profile.update_total_score()
# 信号处理函数
@receiver(post_save, sender=Submission)
def update_user_score(sender, instance, **kwargs):
"""
当 Submission 保存后,自动更新用户的总分
"""
total_score = (
Submission.objects.filter(user=instance.user).aggregate(
total_score=Sum("score")
)["total_score"]
or 0
)
profile, created = Profile.objects.get_or_create(user=instance.user)
profile.total_score = total_score
profile.save()