update
This commit is contained in:
18
ai/migrations/0004_add_is_pinned_to_aianalysis.py
Normal file
18
ai/migrations/0004_add_is_pinned_to_aianalysis.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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()),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -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})
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user