Files
funnywolf b6b4cbf017 0.4.0 I always have a choice
You shape nothing until you hold everything.
2026-06-27 19:08:48 +08:00

40 lines
1.6 KiB
Python

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets, permissions
from rest_framework.filters import OrderingFilter, SearchFilter
from apps.accounts.permissions import IsBusinessWriterOrReadOnly
from apps.audit.mixins import AuditActorMixin
from apps.common.advanced_filters import AdvancedFilterBackend
from .models import Knowledge
from .serializers import KnowledgeSerializer
class KnowledgeViewSet(AuditActorMixin, viewsets.ModelViewSet):
queryset = Knowledge.objects.select_related("case")
serializer_class = KnowledgeSerializer
permission_classes = [permissions.IsAuthenticated, IsBusinessWriterOrReadOnly]
lookup_field = "id"
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter, AdvancedFilterBackend)
search_fields = ("knowledge_id", "title", "body", "source")
ordering_fields = ("created_at", "updated_at", "expires_at", "source")
filterset_fields = ("source", "case")
advanced_filter_fields = {
"knowledge_id": "text",
"source": "select",
"tags": "tag",
"title": "text",
"body": "text",
"expires_at": "date",
"created_at": "date",
"updated_at": "date",
}
def get_queryset(self):
queryset = super().get_queryset()
tags = self.request.query_params.getlist("tags")
if len(tags) == 1 and "," in tags[0]:
tags = [item.strip() for item in tags[0].split(",") if item.strip()]
for tag in tags:
queryset = queryset.filter(tags__contains=tag)
return queryset