重构数据

This commit is contained in:
2025-03-07 00:06:56 +08:00
parent 317f29b486
commit c95dafe14d
32 changed files with 219 additions and 215 deletions

0
submission/__init__.py Normal file
View File

3
submission/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
submission/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class SubmissionConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'submission'

View File

@@ -0,0 +1,37 @@
# Generated by Django 5.1.6 on 2025-03-06 16:03
import django.db.models.deletion
import django_extensions.db.fields
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('task', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Submission',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')),
('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')),
('score', models.IntegerField(default=0)),
('html', models.TextField(blank=True, null=True)),
('css', models.TextField(blank=True, null=True)),
('js', models.TextField(blank=True, null=True)),
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='task.task')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'get_latest_by': 'modified',
'abstract': False,
},
),
]

View File

47
submission/models.py Normal file
View File

@@ -0,0 +1,47 @@
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()