update
This commit is contained in:
@@ -25,6 +25,7 @@ api = NinjaAPI()
|
|||||||
|
|
||||||
api.add_router("account/", "account.api.router")
|
api.add_router("account/", "account.api.router")
|
||||||
api.add_router("tutorial/", "task.tutorial.router")
|
api.add_router("tutorial/", "task.tutorial.router")
|
||||||
|
api.add_router("challenge/", "task.challenge.router")
|
||||||
api.add_router("submission/", "submission.api.router")
|
api.add_router("submission/", "submission.api.router")
|
||||||
api.add_router("upload/", "utils.upload.router")
|
api.add_router("upload/", "utils.upload.router")
|
||||||
|
|
||||||
|
|||||||
63
task/challenge.py
Normal file
63
task/challenge.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
from typing import List
|
||||||
|
from ninja import Router
|
||||||
|
from django.shortcuts import get_object_or_404
|
||||||
|
from account.decorators import super_required
|
||||||
|
from .schemas import ChallengeAll, ChallengeIn, ChallengeSlim
|
||||||
|
from .models import Challenge
|
||||||
|
|
||||||
|
router = Router()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/list", response=List[ChallengeSlim])
|
||||||
|
@super_required
|
||||||
|
def challenge(request):
|
||||||
|
"""
|
||||||
|
后台显示所有的列表
|
||||||
|
"""
|
||||||
|
return Challenge.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/display", response=List[ChallengeSlim])
|
||||||
|
def get_all_public_display(request):
|
||||||
|
"""
|
||||||
|
前台显示所有公开的挑战
|
||||||
|
"""
|
||||||
|
return Challenge.objects.filter(is_public=True)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/{display}", response=ChallengeAll)
|
||||||
|
def get(request, display: int):
|
||||||
|
return get_object_or_404(Challenge, display=display)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/")
|
||||||
|
@super_required
|
||||||
|
def create_or_update(request, payload: ChallengeIn):
|
||||||
|
try:
|
||||||
|
item = Challenge.objects.get(display=payload.display)
|
||||||
|
item.title = payload.title
|
||||||
|
item.content = payload.content
|
||||||
|
item.score = payload.score
|
||||||
|
item.is_public = payload.is_public
|
||||||
|
item.save()
|
||||||
|
return {"message": "更新成功"}
|
||||||
|
except Challenge.DoesNotExist:
|
||||||
|
Challenge.objects.create(**payload.dict())
|
||||||
|
return {"message": "创建成功"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.put("/public/{display}")
|
||||||
|
@super_required
|
||||||
|
def toggle_public(request, display: int):
|
||||||
|
item = get_object_or_404(Challenge, display=display)
|
||||||
|
item.is_public = not item.is_public
|
||||||
|
item.save()
|
||||||
|
label = "公开" if item.is_public else "隐藏"
|
||||||
|
return {"message": f"【{item.display}】{item.title} 已{label}"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.delete("/{display}")
|
||||||
|
@super_required
|
||||||
|
def remove(request, display: int):
|
||||||
|
Challenge.objects.filter(display=display).delete()
|
||||||
|
return {"message": "删除成功"}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Generated by Django 6.0.1 on 2026-03-03 14:59
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('task', '0004_alter_task_task_type'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='task',
|
||||||
|
options={},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='task',
|
||||||
|
name='display',
|
||||||
|
field=models.IntegerField(db_index=True, verbose_name='序号'),
|
||||||
|
),
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='task',
|
||||||
|
unique_together={('display', 'task_type')},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -8,7 +8,7 @@ class TaskTypeChoices(models.TextChoices):
|
|||||||
|
|
||||||
|
|
||||||
class Task(TimeStampedModel):
|
class Task(TimeStampedModel):
|
||||||
display = models.IntegerField(unique=True, db_index=True, verbose_name="序号")
|
display = models.IntegerField(db_index=True, verbose_name="序号")
|
||||||
title = models.CharField(max_length=100, verbose_name="标题")
|
title = models.CharField(max_length=100, verbose_name="标题")
|
||||||
content = models.TextField(verbose_name="内容")
|
content = models.TextField(verbose_name="内容")
|
||||||
task_type = models.CharField(
|
task_type = models.CharField(
|
||||||
@@ -19,6 +19,9 @@ class Task(TimeStampedModel):
|
|||||||
)
|
)
|
||||||
is_public = models.BooleanField(default=False, verbose_name="是否公开")
|
is_public = models.BooleanField(default=False, verbose_name="是否公开")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ("display", "task_type")
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if not self.task_type:
|
if not self.task_type:
|
||||||
self.task_type = self.__class__.__name__.lower()
|
self.task_type = self.__class__.__name__.lower()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from ninja import Schema, ModelSchema
|
from ninja import Schema, ModelSchema
|
||||||
from .models import Tutorial
|
from .models import Tutorial, Challenge
|
||||||
|
|
||||||
|
|
||||||
class TutorialSlim(Schema):
|
class TutorialSlim(Schema):
|
||||||
@@ -19,3 +19,24 @@ class TutorialIn(Schema):
|
|||||||
title: str
|
title: str
|
||||||
content: str
|
content: str
|
||||||
is_public: bool = False
|
is_public: bool = False
|
||||||
|
|
||||||
|
|
||||||
|
class ChallengeSlim(Schema):
|
||||||
|
display: int
|
||||||
|
title: str
|
||||||
|
score: int
|
||||||
|
is_public: bool
|
||||||
|
|
||||||
|
|
||||||
|
class ChallengeAll(ModelSchema):
|
||||||
|
class Meta:
|
||||||
|
model = Challenge
|
||||||
|
fields = "__all__"
|
||||||
|
|
||||||
|
|
||||||
|
class ChallengeIn(Schema):
|
||||||
|
display: int
|
||||||
|
title: str
|
||||||
|
content: str
|
||||||
|
score: int = 0
|
||||||
|
is_public: bool = False
|
||||||
|
|||||||
Reference in New Issue
Block a user