Files
chunyu_project/tool/views/tool_favorite_view.py
T
2026-08-05 23:59:15 +08:00

96 lines
2.9 KiB
Python

from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.parsers import JSONParser
from django.db import transaction
from ..models import Tool, ToolFavorite
class ToolFavoriteToggleView(APIView):
permission_classes = [IsAuthenticated]
parser_classes = [JSONParser]
@transaction.atomic
def post(self, request, tool_id):
try:
tool = Tool.objects.get(pk=tool_id, is_enabled=True)
except Tool.DoesNotExist:
return JsonResponse({'success': False, 'error': '工具不存在'}, status=404)
favorite, created = ToolFavorite.objects.get_or_create(
user=request.user,
tool=tool
)
if not created:
favorite.delete()
is_favorite = False
message = '已取消收藏'
else:
is_favorite = True
message = '已添加收藏'
favorite_count = ToolFavorite.objects.filter(tool=tool).count()
return JsonResponse({
'success': True,
'data': {
'id': tool.id,
'is_favorite': is_favorite,
'favorite_count': favorite_count
},
'message': message
})
class ToolFavoriteListView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
favorites = ToolFavorite.objects.select_related('tool', 'tool__category').filter(
user=request.user,
tool__is_enabled=True
).order_by('-created_at')
data = [{
'id': fav.tool.id,
'name': fav.tool.name,
'description': fav.tool.description,
'icon': fav.tool.icon,
'url_path': fav.tool.url_path,
'color': fav.tool.color,
'category': fav.tool.category.id if fav.tool.category else None,
'category_name': fav.tool.category.name if fav.tool.category else '',
'is_favorite': True,
'favorite_count': ToolFavorite.objects.filter(tool=fav.tool).count(),
'created_at': fav.created_at.isoformat()
} for fav in favorites]
return JsonResponse({
'success': True,
'data': {
'count': len(data),
'results': data
}
})
class ToolFavoriteStatusView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, tool_id):
is_favorite = ToolFavorite.objects.filter(
user=request.user,
tool_id=tool_id
).exists()
favorite_count = ToolFavorite.objects.filter(tool_id=tool_id).count()
return JsonResponse({
'success': True,
'data': {
'tool_id': tool_id,
'is_favorite': is_favorite,
'favorite_count': favorite_count
}
})