96 lines
2.9 KiB
Python
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
|
|
}
|
|
})
|