message_center.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. # -*- coding: utf-8 -*-
  2. import json
  3. from asgiref.sync import async_to_sync
  4. from channels.layers import get_channel_layer
  5. from django_restql.fields import DynamicSerializerMethodField
  6. from rest_framework import serializers
  7. from rest_framework.decorators import action, permission_classes
  8. from rest_framework.permissions import IsAuthenticated, AllowAny
  9. from application.websocketConfig import websocket_push
  10. from dvadmin.system.models import MessageCenter, Users, MessageCenterTargetUser
  11. from dvadmin.utils.json_response import SuccessResponse, DetailResponse
  12. from dvadmin.utils.serializers import CustomModelSerializer
  13. from dvadmin.utils.viewset import CustomModelViewSet
  14. class MessageCenterSerializer(CustomModelSerializer):
  15. """
  16. 消息中心-序列化器
  17. """
  18. role_info = DynamicSerializerMethodField()
  19. user_info = DynamicSerializerMethodField()
  20. dept_info = DynamicSerializerMethodField()
  21. is_read = serializers.BooleanField(read_only=True, source='target_user__is_read')
  22. def get_role_info(self, instance, parsed_query):
  23. roles = instance.target_role.all()
  24. # You can do what ever you want in here
  25. # `parsed_query` param is passed to BookSerializer to allow further querying
  26. from dvadmin.system.views.role import RoleSerializer
  27. serializer = RoleSerializer(
  28. roles,
  29. many=True,
  30. parsed_query=parsed_query
  31. )
  32. return serializer.data
  33. def get_user_info(self, instance, parsed_query):
  34. users = instance.target_user.all()
  35. # You can do what ever you want in here
  36. # `parsed_query` param is passed to BookSerializer to allow further querying
  37. from dvadmin.system.views.user import UserSerializer
  38. serializer = UserSerializer(
  39. users,
  40. many=True,
  41. parsed_query=parsed_query
  42. )
  43. return serializer.data
  44. def get_dept_info(self, instance, parsed_query):
  45. dept = instance.target_dept.all()
  46. # You can do what ever you want in here
  47. # `parsed_query` param is passed to BookSerializer to allow further querying
  48. from dvadmin.system.views.dept import DeptSerializer
  49. serializer = DeptSerializer(
  50. dept,
  51. many=True,
  52. parsed_query=parsed_query
  53. )
  54. return serializer.data
  55. class Meta:
  56. model = MessageCenter
  57. fields = "__all__"
  58. read_only_fields = ["id"]
  59. class MessageCenterTargetUserSerializer(CustomModelSerializer):
  60. """
  61. 目标用户序列化器-序列化器
  62. """
  63. class Meta:
  64. model = MessageCenterTargetUser
  65. fields = "__all__"
  66. read_only_fields = ["id"]
  67. class MessageCenterTargetUserListSerializer(CustomModelSerializer):
  68. """
  69. 目标用户序列化器-序列化器
  70. """
  71. is_read = serializers.SerializerMethodField()
  72. def get_is_read(self, instance):
  73. user_id = self.request.user.id
  74. message_center_id = instance.id
  75. queryset = MessageCenterTargetUser.objects.filter(messagecenter__id=message_center_id,users_id=user_id).first()
  76. if queryset:
  77. return queryset.is_read
  78. return False
  79. class Meta:
  80. model = MessageCenter
  81. fields = "__all__"
  82. read_only_fields = ["id"]
  83. class MessageCenterCreateSerializer(CustomModelSerializer):
  84. """
  85. 消息中心-新增-序列化器
  86. """
  87. def save(self, **kwargs):
  88. data = super().save(**kwargs)
  89. initial_data = self.initial_data
  90. target_type = initial_data.get('target_type')
  91. # 在保存之前,根据目标类型,把目标用户查询出来并保存
  92. users = initial_data.get('target_user', [])
  93. if target_type in [1]: # 按角色
  94. target_role = initial_data.get('target_role',[])
  95. users = Users.objects.filter(role__id__in=target_role).values_list('id', flat=True)
  96. if target_type in [2]: # 按部门
  97. target_dept = initial_data.get('target_dept',[])
  98. users = Users.objects.filter(dept__id__in=target_dept).values_list('id', flat=True)
  99. if target_type in [3]: # 系统通知
  100. users = Users.objects.values_list('id', flat=True)
  101. websocket_push("dvadmin", message={"sender": 'system', "contentType": 'SYSTEM',
  102. "content": '您有一条新消息~', "refresh_unread": True})
  103. targetuser_data = []
  104. for user in users:
  105. targetuser_data.append({
  106. "messagecenter": data.id,
  107. "users": user
  108. })
  109. if target_type in [1,2]:
  110. room_name = f"user_{user}"
  111. websocket_push(room_name, message={"sender": 'system', "contentType": 'SYSTEM',
  112. "content": '您有一条新消息~', "refresh_unread": True})
  113. targetuser_instance = MessageCenterTargetUserSerializer(data=targetuser_data, many=True, request=self.request)
  114. targetuser_instance.is_valid(raise_exception=True)
  115. targetuser_instance.save()
  116. return data
  117. class Meta:
  118. model = MessageCenter
  119. fields = "__all__"
  120. read_only_fields = ["id"]
  121. class MessageCenterViewSet(CustomModelViewSet):
  122. """
  123. 消息中心接口
  124. list:查询
  125. create:新增
  126. update:修改
  127. retrieve:单例
  128. destroy:删除
  129. """
  130. queryset = MessageCenter.objects.order_by('create_datetime')
  131. serializer_class = MessageCenterSerializer
  132. create_serializer_class = MessageCenterCreateSerializer
  133. extra_filter_backends = []
  134. def get_queryset(self):
  135. if self.action == 'list':
  136. return MessageCenter.objects.filter(creator=self.request.user.id).all()
  137. return MessageCenter.objects.all()
  138. def retrieve(self, request, *args, **kwargs):
  139. """
  140. 重写查看
  141. """
  142. pk = kwargs.get('pk')
  143. user_id = self.request.user.id
  144. queryset = MessageCenterTargetUser.objects.filter(users__id=user_id, messagecenter__id=pk).first()
  145. if queryset:
  146. queryset.is_read = True
  147. queryset.save()
  148. instance = self.get_object()
  149. serializer = self.get_serializer(instance)
  150. # 主动推送消息
  151. room_name = f"user_{user_id}"
  152. websocket_push(room_name, message={"sender": 'system', "contentType": 'TEXT',
  153. "content": '您查看了一条消息~', "refresh_unread": True})
  154. return DetailResponse(data=serializer.data, msg="获取成功")
  155. @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
  156. def get_self_receive(self, request):
  157. """
  158. 获取接收到的消息
  159. """
  160. self_user_id = self.request.user.id
  161. # queryset = MessageCenterTargetUser.objects.filter(users__id=self_user_id).order_by('-create_datetime')
  162. queryset = MessageCenter.objects.filter(target_user__id=self_user_id)
  163. print(queryset)
  164. # queryset = self.filter_queryset(queryset)
  165. page = self.paginate_queryset(queryset)
  166. if page is not None:
  167. serializer = MessageCenterTargetUserListSerializer(page, many=True, request=request)
  168. return self.get_paginated_response(serializer.data)
  169. serializer = MessageCenterTargetUserListSerializer(queryset, many=True, request=request)
  170. return SuccessResponse(data=serializer.data, msg="获取成功")
  171. @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
  172. def get_newest_msg(self, request):
  173. """
  174. 获取最新的一条消息
  175. """
  176. self_user_id = self.request.user.id
  177. queryset = MessageCenterTargetUser.objects.filter(users__id=self_user_id).order_by('create_datetime').last()
  178. data = None
  179. if queryset:
  180. serializer = MessageCenterTargetUserListSerializer(queryset.messagecenter, many=False, request=request)
  181. data = serializer.data
  182. return DetailResponse(data=data, msg="获取成功")
  183. @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
  184. def get_unread_msg(self, request):
  185. """获取未读消息数量"""
  186. self_user_id = self.request.user.id
  187. count = MessageCenterTargetUser.objects.filter(users__id=self_user_id,is_read=False).count()
  188. return DetailResponse(data={"count":count}, msg="获取成功")