This commit is contained in:
2026-06-04 08:44:58 -06:00
parent 6a870875ee
commit 513743c767
6 changed files with 54 additions and 7 deletions

View File

@@ -0,0 +1,18 @@
# Generated by Django 6.0.4 on 2026-06-04 14:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ai', '0003_alter_aianalysis_model'),
]
operations = [
migrations.AddField(
model_name='aianalysis',
name='is_pinned',
field=models.BooleanField(default=False),
),
]

View File

@@ -11,6 +11,7 @@ class AIAnalysis(models.Model):
system_prompt = models.TextField()
user_prompt = models.TextField()
analysis = models.TextField()
is_pinned = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:

View File

@@ -9,7 +9,7 @@ class AIAnalysisListSerializer(serializers.ModelSerializer):
class Meta:
model = AIAnalysis
fields = ["id", "create_time", "username", "class_name"]
fields = ["id", "create_time", "username", "class_name", "is_pinned"]
class AIAnalysisDetailSerializer(serializers.ModelSerializer):

View File

@@ -7,6 +7,7 @@ from ..views.oj import (
AIHeatmapDataAPI,
AIHintAPI,
AILoginSummaryAPI,
AIPinnedReportAPI,
ClassPKAnalysisAPI,
)
@@ -17,5 +18,6 @@ urlpatterns = [
path("ai/hint", AIHintAPI.as_view()),
path("ai/heatmap", AIHeatmapDataAPI.as_view()),
path("ai/login_summary", AILoginSummaryAPI.as_view()),
path("ai/pinned", AIPinnedReportAPI.as_view()),
path("ai/class_pk", ClassPKAnalysisAPI.as_view()),
]

View File

@@ -1,5 +1,4 @@
from account.decorators import teacher_admin_required
from account.models import User
from utils.api import APIView
from ..models import AIAnalysis
@@ -21,10 +20,26 @@ class AIAnalysisAdminAPI(APIView):
username = request.GET.get("username")
if username:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
return self.error("User not found")
qs = qs.filter(user=user)
qs = qs.filter(user__username__icontains=username)
if request.GET.get("pinned_only") == "true":
pinned = qs.filter(is_pinned=True)
return self.success(AIAnalysisListSerializer(pinned, many=True).data)
return self.success(self.paginate_data(request, qs, AIAnalysisListSerializer))
@teacher_admin_required
def post(self, request):
report_id = request.data.get("id")
try:
report = AIAnalysis.objects.select_related("user").get(id=report_id)
except AIAnalysis.DoesNotExist:
return self.error("AIAnalysis not found")
if report.is_pinned:
report.is_pinned = False
else:
AIAnalysis.objects.filter(user=report.user, is_pinned=True).update(is_pinned=False)
report.is_pinned = True
report.save(update_fields=["is_pinned"])
return self.success({"is_pinned": report.is_pinned})

View File

@@ -14,6 +14,7 @@ from django.utils.dateparse import parse_datetime
from account.decorators import login_required, teacher_admin_required
from account.models import User
from ai.models import AIAnalysis
from ai.serializers import AIAnalysisDetailSerializer
from flowchart.models import FlowchartSubmission, FlowchartSubmissionStatus
from problem.models import Problem
from submission.models import JudgeStatus, Submission
@@ -800,6 +801,16 @@ class ClassPKAnalysisAPI(APIView):
return "\n".join(lines)
class AIPinnedReportAPI(APIView):
@login_required
def get(self, request):
try:
report = AIAnalysis.objects.get(user=request.user, is_pinned=True)
except AIAnalysis.DoesNotExist:
return self.success(None)
return self.success(AIAnalysisDetailSerializer(report).data)
class AIHintAPI(APIView):
@login_required
def post(self, request):