107 lines
2.9 KiB
Python
107 lines
2.9 KiB
Python
from django.contrib import admin
|
|
|
|
from .models import (
|
|
CheatFlag,
|
|
Contest,
|
|
ContestAnswer,
|
|
ContestAttempt,
|
|
ContestQuestion,
|
|
LeaderboardSnapshot,
|
|
MathGameAttempt,
|
|
Question,
|
|
QuestionVersion,
|
|
RatingHistory,
|
|
RealtimeMatch,
|
|
)
|
|
|
|
|
|
class ContestQuestionInline(admin.TabularInline):
|
|
model = ContestQuestion
|
|
extra = 1
|
|
|
|
|
|
@admin.register(Contest)
|
|
class ContestAdmin(admin.ModelAdmin):
|
|
list_display = ("title", "kind", "track", "status", "starts_at", "ends_at")
|
|
list_filter = ("kind", "track", "status")
|
|
search_fields = ("title", "slug")
|
|
list_editable = ("status",)
|
|
ordering = ("-starts_at", "title")
|
|
inlines = [ContestQuestionInline]
|
|
|
|
|
|
@admin.register(ContestAttempt)
|
|
class ContestAttemptAdmin(admin.ModelAdmin):
|
|
list_display = ("id", "user", "contest", "status", "score", "duration_ms", "started_at")
|
|
list_filter = ("status", "contest__kind", "contest__track")
|
|
readonly_fields = ("started_at", "submitted_at")
|
|
|
|
|
|
@admin.register(CheatFlag)
|
|
class CheatFlagAdmin(admin.ModelAdmin):
|
|
list_display = ("attempt", "reason", "status", "created_at")
|
|
list_filter = ("status", "reason")
|
|
search_fields = ("attempt__user__username", "attempt__user__nickname", "reason")
|
|
list_editable = ("status",)
|
|
ordering = ("-created_at",)
|
|
|
|
|
|
@admin.register(Question)
|
|
class QuestionAdmin(admin.ModelAdmin):
|
|
list_display = ("slug", "track", "is_active", "tags")
|
|
list_filter = ("track", "is_active")
|
|
search_fields = ("slug", "versions__prompt")
|
|
list_editable = ("is_active",)
|
|
|
|
|
|
@admin.register(QuestionVersion)
|
|
class QuestionVersionAdmin(admin.ModelAdmin):
|
|
list_display = ("question", "version", "prompt", "created_at")
|
|
search_fields = ("question__slug", "prompt", "answer")
|
|
ordering = ("question", "-version")
|
|
|
|
|
|
admin.site.register(ContestAnswer)
|
|
admin.site.register(RatingHistory)
|
|
admin.site.register(LeaderboardSnapshot)
|
|
|
|
|
|
@admin.register(RealtimeMatch)
|
|
class RealtimeMatchAdmin(admin.ModelAdmin):
|
|
list_display = (
|
|
"id",
|
|
"contest",
|
|
"match_type",
|
|
"challenge_code",
|
|
"player_one",
|
|
"player_two",
|
|
"status",
|
|
"created_at",
|
|
)
|
|
list_filter = ("match_type", "status", "contest__track")
|
|
search_fields = (
|
|
"challenge_code",
|
|
"player_one__username",
|
|
"player_two__username",
|
|
)
|
|
readonly_fields = ("created_at", "started_at", "completed_at")
|
|
ordering = ("-created_at",)
|
|
|
|
|
|
@admin.register(MathGameAttempt)
|
|
class MathGameAttemptAdmin(admin.ModelAdmin):
|
|
list_display = (
|
|
"id",
|
|
"user",
|
|
"kind",
|
|
"difficulty",
|
|
"status",
|
|
"score",
|
|
"hints_used",
|
|
"started_at",
|
|
)
|
|
list_filter = ("kind", "difficulty", "status")
|
|
search_fields = ("user__username", "user__nickname")
|
|
readonly_fields = ("puzzle", "solution", "submission", "started_at", "submitted_at")
|
|
ordering = ("-started_at",)
|