Some checks failed
Build and Deploy Backend / build-and-deploy (push) Failing after 1m36s
88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
"""
|
||
通知模块视图 - App端
|
||
"""
|
||
from rest_framework import viewsets
|
||
from rest_framework.decorators import action
|
||
from rest_framework.permissions import IsAuthenticated
|
||
from drf_spectacular.utils import extend_schema
|
||
|
||
from utils.response import success, error
|
||
from utils.exceptions import ErrorCode
|
||
from apps.admins.authentication import AppJWTAuthentication
|
||
from .models import Notification
|
||
from .serializers import NotificationSerializer
|
||
|
||
|
||
@extend_schema(tags=['通知'])
|
||
class NotificationViewSet(viewsets.ViewSet):
|
||
"""通知视图集(App端)"""
|
||
|
||
authentication_classes = [AppJWTAuthentication]
|
||
permission_classes = [IsAuthenticated]
|
||
|
||
def list(self, request):
|
||
"""
|
||
通知列表
|
||
GET /api/v1/notifications/
|
||
"""
|
||
queryset = Notification.objects.filter(user=request.user)
|
||
|
||
# 按类型筛选
|
||
ntype = request.query_params.get('type')
|
||
if ntype:
|
||
queryset = queryset.filter(type=ntype)
|
||
|
||
# 分页
|
||
page = int(request.query_params.get('page', 1))
|
||
page_size = int(request.query_params.get('page_size', 20))
|
||
start = (page - 1) * page_size
|
||
end = start + page_size
|
||
|
||
total = queryset.count()
|
||
unread_count = Notification.objects.filter(user=request.user, is_read=False).count()
|
||
notifications = queryset[start:end]
|
||
|
||
return success(data={
|
||
'total': total,
|
||
'unread_count': unread_count,
|
||
'items': NotificationSerializer(notifications, many=True).data,
|
||
})
|
||
|
||
def destroy(self, request, pk=None):
|
||
"""
|
||
删除通知
|
||
DELETE /api/v1/notifications/{id}/
|
||
"""
|
||
try:
|
||
notification = Notification.objects.get(id=pk, user=request.user)
|
||
except Notification.DoesNotExist:
|
||
return error(code=ErrorCode.NOTIFICATION_NOT_FOUND, message='通知不存在')
|
||
notification.delete()
|
||
return success(message='删除成功')
|
||
|
||
@action(detail=True, methods=['post'])
|
||
def read(self, request, pk=None):
|
||
"""
|
||
标记已读
|
||
POST /api/v1/notifications/{id}/read/
|
||
"""
|
||
try:
|
||
notification = Notification.objects.get(id=pk, user=request.user)
|
||
except Notification.DoesNotExist:
|
||
return error(code=ErrorCode.NOTIFICATION_NOT_FOUND, message='通知不存在')
|
||
|
||
notification.is_read = True
|
||
notification.save(update_fields=['is_read'])
|
||
return success(message='已标记为已读')
|
||
|
||
@action(detail=False, methods=['post'], url_path='read-all')
|
||
def read_all(self, request):
|
||
"""
|
||
全部已读
|
||
POST /api/v1/notifications/read-all/
|
||
"""
|
||
count = Notification.objects.filter(
|
||
user=request.user, is_read=False
|
||
).update(is_read=True)
|
||
return success(data={'count': count}, message=f'已将{count}条通知标记为已读')
|