2022-08-14 11:11:21 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
2022-11-15 09:36:05 +00:00
|
|
|
import json
|
2023-01-02 17:29:46 +00:00
|
|
|
|
|
|
|
from asgiref.sync import async_to_sync
|
|
|
|
from channels.layers import get_channel_layer
|
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-12 16:53:13 +00:00
|
|
|
from dvadmin.system.models import MessageCenter, Users, MessageCenterTargetUser
|
|
|
|
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
|
2023-01-02 17:29:46 +00:00
|
|
|
from dvadmin.system.views.role import RoleSerializer
|
2022-08-14 11:11:21 +00:00
|
|
|
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
|
2023-01-02 17:29:46 +00:00
|
|
|
from dvadmin.system.views.user import UserSerializer
|
2022-08-14 11:11:21 +00:00
|
|
|
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
|
2023-01-02 17:29:46 +00:00
|
|
|
from dvadmin.system.views.dept import DeptSerializer
|
2022-11-12 16:53:13 +00:00
|
|
|
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):
|
|
|
|
"""
|
|
|
|
目标用户序列化器-序列化器
|
|
|
|
"""
|
2023-01-02 17:29:46 +00:00
|
|
|
is_read = serializers.SerializerMethodField()
|
|
|
|
|
|
|
|
def get_is_read(self, instance):
|
|
|
|
user_id = self.request.user.id
|
|
|
|
message_center_id = instance.id
|
|
|
|
queryset = MessageCenterTargetUser.objects.filter(messagecenter__id=message_center_id,users_id=user_id).first()
|
|
|
|
return queryset.is_read
|
2022-11-16 14:09:16 +00:00
|
|
|
|
2022-11-12 16:53:13 +00:00
|
|
|
class Meta:
|
2023-01-02 17:29:46 +00:00
|
|
|
model = MessageCenter
|
2022-11-12 16:53:13 +00:00
|
|
|
fields = "__all__"
|
|
|
|
read_only_fields = ["id"]
|
|
|
|
|
2023-01-02 17:29:46 +00:00
|
|
|
def websocket_push(user_id, message):
|
|
|
|
"""
|
|
|
|
主动推送消息
|
|
|
|
"""
|
|
|
|
username = "user_"+str(user_id)
|
|
|
|
print(103,message)
|
|
|
|
channel_layer = get_channel_layer()
|
|
|
|
async_to_sync(channel_layer.group_send)(
|
|
|
|
username,
|
|
|
|
{
|
|
|
|
"type": "push.message",
|
|
|
|
"json": message
|
|
|
|
}
|
|
|
|
)
|
2022-11-12 16:53:13 +00:00
|
|
|
|
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]: # 按角色
|
2023-01-02 17:29:46 +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]: # 按部门
|
2023-01-02 17:29:46 +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:删除
|
|
|
|
"""
|
2022-11-13 16:00:56 +00:00
|
|
|
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-13 16:00:56 +00:00
|
|
|
"""
|
|
|
|
重写查看
|
|
|
|
"""
|
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()
|
2023-01-02 17:29:46 +00:00
|
|
|
websocket_push(user_id, message={"sender": 'system', "contentType": 'TEXT',
|
|
|
|
"content": '您查看了一条消息~', "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
|
2023-01-02 17:29:46 +00:00
|
|
|
# queryset = MessageCenterTargetUser.objects.filter(users__id=self_user_id).order_by('-create_datetime')
|
|
|
|
queryset = MessageCenter.objects.filter(target_user__id=self_user_id)
|
|
|
|
print(queryset)
|
2022-11-13 16:00:56 +00:00
|
|
|
# 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)
|
2022-11-13 16:00:56 +00:00
|
|
|
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):
|
2022-11-13 16:00:56 +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').last()
|
2022-11-13 16:00:56 +00:00
|
|
|
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="获取成功")
|