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() system_prompt = models.TextField()
user_prompt = models.TextField() user_prompt = models.TextField()
analysis = models.TextField() analysis = models.TextField()
is_pinned = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True) create_time = models.DateTimeField(auto_now_add=True)
class Meta: class Meta:

View File

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

View File

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

View File

@@ -1,5 +1,4 @@
from account.decorators import teacher_admin_required from account.decorators import teacher_admin_required
from account.models import User
from utils.api import APIView from utils.api import APIView
from ..models import AIAnalysis from ..models import AIAnalysis
@@ -21,10 +20,26 @@ class AIAnalysisAdminAPI(APIView):
username = request.GET.get("username") username = request.GET.get("username")
if username: if username:
try: qs = qs.filter(user__username__icontains=username)
user = User.objects.get(username=username)
except User.DoesNotExist: if request.GET.get("pinned_only") == "true":
return self.error("User not found") pinned = qs.filter(is_pinned=True)
qs = qs.filter(user=user) return self.success(AIAnalysisListSerializer(pinned, many=True).data)
return self.success(self.paginate_data(request, qs, AIAnalysisListSerializer)) 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.decorators import login_required, teacher_admin_required
from account.models import User from account.models import User
from ai.models import AIAnalysis from ai.models import AIAnalysis
from ai.serializers import AIAnalysisDetailSerializer
from flowchart.models import FlowchartSubmission, FlowchartSubmissionStatus from flowchart.models import FlowchartSubmission, FlowchartSubmissionStatus
from problem.models import Problem from problem.models import Problem
from submission.models import JudgeStatus, Submission from submission.models import JudgeStatus, Submission
@@ -800,6 +801,16 @@ class ClassPKAnalysisAPI(APIView):
return "\n".join(lines) 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): class AIHintAPI(APIView):
@login_required @login_required
def post(self, request): def post(self, request):