django-vue-admin/backend/dvadmin/system/views/message_center.py

200 lines
7.6 KiB
Python
Raw Normal View History

2022-08-14 11:11:21 +00:00
# -*- coding: utf-8 -*-
2022-11-15 09:36:05 +00:00
import json
2022-08-14 11:11:21 +00:00
from django_restql.fields import DynamicSerializerMethodField
2022-11-12 16:53:13 +00:00
from rest_framework import serializers
2022-08-14 11:11:21 +00:00
from rest_framework.decorators import action, permission_classes
from rest_framework.permissions import IsAuthenticated, AllowAny
2022-11-16 14:09:16 +00:00
from application.websocketConfig import websocket_push
2022-11-12 16:53:13 +00:00
from dvadmin.system.models import MessageCenter, Users, MessageCenterTargetUser
from dvadmin.system.views.dept import DeptSerializer
2022-08-14 11:11:21 +00:00
from dvadmin.system.views.role import RoleSerializer
from dvadmin.system.views.user import UserSerializer
2022-11-12 16:53:13 +00:00
from dvadmin.utils.json_response import SuccessResponse, DetailResponse
2022-08-14 11:11:21 +00:00
from dvadmin.utils.serializers import CustomModelSerializer
from dvadmin.utils.viewset import CustomModelViewSet
class MessageCenterSerializer(CustomModelSerializer):
"""
消息中心-序列化器
"""
role_info = DynamicSerializerMethodField()
user_info = DynamicSerializerMethodField()
2022-11-12 16:53:13 +00:00
dept_info = DynamicSerializerMethodField()
2022-11-16 14:09:16 +00:00
is_read = serializers.BooleanField(read_only=True, source='target_user__is_read')
2022-08-14 11:11:21 +00:00
def get_role_info(self, instance, parsed_query):
2022-11-16 14:09:16 +00:00
roles = instance.target_role.all()
2022-08-14 11:11:21 +00:00
# You can do what ever you want in here
# `parsed_query` param is passed to BookSerializer to allow further querying
serializer = RoleSerializer(
roles,
many=True,
parsed_query=parsed_query
)
return serializer.data
def get_user_info(self, instance, parsed_query):
users = instance.target_user.all()
# You can do what ever you want in here
# `parsed_query` param is passed to BookSerializer to allow further querying
serializer = UserSerializer(
users,
many=True,
parsed_query=parsed_query
)
return serializer.data
2022-11-12 16:53:13 +00:00
def get_dept_info(self, instance, parsed_query):
dept = instance.target_dept.all()
# You can do what ever you want in here
# `parsed_query` param is passed to BookSerializer to allow further querying
serializer = DeptSerializer(
dept,
many=True,
parsed_query=parsed_query
)
return serializer.data
2022-11-16 14:09:16 +00:00
2022-08-14 11:11:21 +00:00
class Meta:
model = MessageCenter
fields = "__all__"
read_only_fields = ["id"]
2022-11-12 16:53:13 +00:00
class MessageCenterTargetUserSerializer(CustomModelSerializer):
"""
目标用户序列化器-序列化器
"""
2022-11-16 14:09:16 +00:00
2022-11-12 16:53:13 +00:00
class Meta:
model = MessageCenterTargetUser
fields = "__all__"
read_only_fields = ["id"]
2022-11-16 14:09:16 +00:00
2022-11-12 16:53:13 +00:00
class MessageCenterTargetUserListSerializer(CustomModelSerializer):
"""
目标用户序列化器-序列化器
"""
2022-11-16 14:09:16 +00:00
2022-11-12 16:53:13 +00:00
class Meta:
model = MessageCenterTargetUser
fields = "__all__"
read_only_fields = ["id"]
def to_representation(self, instance):
data = super().to_representation(instance)
data['title'] = instance.messagecenter.title
data['content'] = instance.messagecenter.content
data['target_type'] = instance.messagecenter.target_type
data['id'] = instance.messagecenter.id
return data
2022-08-14 11:11:21 +00:00
class MessageCenterCreateSerializer(CustomModelSerializer):
"""
消息中心-新增-序列化器
"""
def save(self, **kwargs):
data = super().save(**kwargs)
initial_data = self.initial_data
target_type = initial_data.get('target_type')
# 在保存之前,根据目标类型,把目标用户查询出来并保存
2022-11-16 14:09:16 +00:00
users = initial_data.get('target_user', [])
if target_type in [1]: # 按角色
2022-08-14 11:11:21 +00:00
target_role = initial_data.get('target_role')
2022-11-16 14:09:16 +00:00
users = Users.objects.exclude(is_deleted=True).filter(role__id__in=target_role).values_list('id', flat=True)
if target_type in [2]: # 按部门
2022-08-14 11:11:21 +00:00
target_dept = initial_data.get('target_dept')
2022-11-16 14:09:16 +00:00
users = Users.objects.exclude(is_deleted=True).filter(dept__id__in=target_dept).values_list('id', flat=True)
if target_type in [3]: # 系统通知
users = Users.objects.exclude(is_deleted=True).values_list('id', flat=True)
targetuser_data = []
for user in users:
targetuser_data.append({
"messagecenter": data.id,
"users": user
})
2022-11-12 16:53:13 +00:00
targetuser_instance = MessageCenterTargetUserSerializer(data=targetuser_data, many=True, request=self.request)
targetuser_instance.is_valid(raise_exception=True)
targetuser_instance.save()
2022-11-16 14:09:16 +00:00
for user in users:
unread_count = MessageCenterTargetUser.objects.filter(users__id=user, is_read=False).count()
websocket_push(user, {"sender": 'system', "contentType": 'TEXT',
"content": {"model": 'message_center', "unread": unread_count}})
2022-08-14 11:11:21 +00:00
return data
class Meta:
model = MessageCenter
fields = "__all__"
read_only_fields = ["id"]
class MessageCenterViewSet(CustomModelViewSet):
"""
消息中心接口
list:查询
create:新增
update:修改
retrieve:单例
destroy:删除
"""
queryset = MessageCenter.objects.order_by('create_datetime')
2022-08-14 11:11:21 +00:00
serializer_class = MessageCenterSerializer
create_serializer_class = MessageCenterCreateSerializer
extra_filter_backends = []
2022-11-12 16:53:13 +00:00
def get_queryset(self):
2022-11-16 14:09:16 +00:00
if self.action == 'list':
2022-11-12 16:53:13 +00:00
return MessageCenter.objects.filter(creator=self.request.user.id).all()
return MessageCenter.objects.all()
def retrieve(self, request, *args, **kwargs):
"""
重写查看
"""
2022-11-12 16:53:13 +00:00
pk = kwargs.get('pk')
user_id = self.request.user.id
2022-11-16 14:09:16 +00:00
queryset = MessageCenterTargetUser.objects.filter(users__id=user_id, messagecenter__id=pk).first()
2022-11-12 16:53:13 +00:00
if queryset:
queryset.is_read = True
queryset.save()
instance = self.get_object()
serializer = self.get_serializer(instance)
2022-11-16 14:09:16 +00:00
# 主动推送消息
unread_count = MessageCenterTargetUser.objects.filter(users__id=user_id, is_read=False).count()
websocket_push(user_id, {"sender": 'system', "contentType": 'TEXT',
"content": {"model": 'message_center', "unread": unread_count}})
2022-11-12 16:53:13 +00:00
return DetailResponse(data=serializer.data, msg="获取成功")
2022-11-16 14:09:16 +00:00
@action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
def get_self_receive(self, request):
2022-08-14 11:11:21 +00:00
"""
获取接收到的消息
"""
self_user_id = self.request.user.id
2022-11-25 09:06:54 +00:00
queryset = MessageCenterTargetUser.objects.filter(users__id=self_user_id).order_by('-create_datetime')
# queryset = self.filter_queryset(queryset)
2022-08-14 11:11:21 +00:00
page = self.paginate_queryset(queryset)
if page is not None:
2022-11-12 16:53:13 +00:00
serializer = MessageCenterTargetUserListSerializer(page, many=True, request=request)
2022-08-14 11:11:21 +00:00
return self.get_paginated_response(serializer.data)
2022-11-12 16:53:13 +00:00
serializer = MessageCenterTargetUserListSerializer(queryset, many=True, request=request)
return SuccessResponse(data=serializer.data, msg="获取成功")
@action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
2022-11-16 14:09:16 +00:00
def get_newest_msg(self, request):
"""
获取最新的一条消息
"""
self_user_id = self.request.user.id
2022-11-25 09:06:54 +00:00
queryset = MessageCenterTargetUser.objects.filter(users__id=self_user_id).order_by('create_datetime').last()
data = None
if queryset:
serializer = MessageCenterTargetUserListSerializer(queryset, many=False, request=request)
data = serializer.data
2022-11-16 14:09:16 +00:00
return DetailResponse(data=data, msg="获取成功")