serializers.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #coding=utf-8
  2. from rest_framework import serializers
  3. from apps import base
  4. from apps.account.models import User
  5. from apps.base import Formater
  6. from apps.exceptions import CustomError
  7. from apps.foundation.models import BizLog
  8. from apps.office.models import Notice, NoticeReply, NoticeBrowseRecord
  9. from apps.serializer_errors import dump_serializer_errors
  10. from libs.booleancharfield import CountShowCharField
  11. class NoticeSerializer(serializers.ModelSerializer):
  12. department_name = serializers.CharField(source='department.name', read_only=True)
  13. priority_text = serializers.CharField(source='get_priority_display', read_only=True)
  14. dendline = serializers.DateTimeField(format=base.DATE_FORMAT)
  15. company_name = serializers.CharField(source='company.name', read_only=True)
  16. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT1, read_only=True)
  17. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  18. receiver_count = serializers.SerializerMethodField()
  19. reply_count = serializers.SerializerMethodField()
  20. null = serializers.SerializerMethodField()
  21. class Meta:
  22. model = Notice
  23. fields = '__all__'
  24. def get_receiver_count(self, obj):
  25. receiver_count = User.objects.filter(department__lft__gte=obj.department.lft, department__rgt__lte=obj.department.rgt,status=User.INSERVICE).count()
  26. return receiver_count
  27. def get_reply_count(self, obj):
  28. reply_count = NoticeReply.objects.filter(notice=obj).values_list('create_user', flat=True).distinct().count()
  29. return reply_count
  30. def get_null(self, obj):
  31. receiver_count = User.objects.filter(department__lft__gte=obj.department.lft,
  32. department__rgt__lte=obj.department.rgt, status=User.INSERVICE).count()
  33. reply_count = NoticeReply.objects.filter(notice=obj).values_list('create_user', flat=True).distinct().count()
  34. if receiver_count == 0:
  35. null = '0%'
  36. else:
  37. null = str(round(reply_count * 1.0 / receiver_count * 100 * 100) / 100) + '%'
  38. return null
  39. @staticmethod
  40. def factory(user, data, id=None):
  41. if id:
  42. instance = Notice.getById(id)
  43. else:
  44. instance = None
  45. serializer = NoticeSerializer(instance, data=data)
  46. serializer.user = user
  47. return serializer
  48. def create(self, validated_data):
  49. validated_data['create_user'] = self.user
  50. validated_data['create_user_department'] = self.user.department
  51. validated_data['company'] = self.user.department.getCompany()
  52. notice = Notice.objects.create(**validated_data)
  53. BizLog.objects.addnew(
  54. self.user,
  55. BizLog.INSERT,
  56. u"添加公告[%s],id=%d" % (notice.title, notice.id),
  57. validated_data
  58. )
  59. return notice
  60. def update(self, instance, validated_data):
  61. instance = super(NoticeSerializer, self).update(instance, validated_data)
  62. BizLog.objects.addnew(
  63. self.user,
  64. BizLog.UPDATE,
  65. u"修改公告[%s],id=%d" % (instance.title, instance.id),
  66. validated_data
  67. )
  68. return instance
  69. def validSave(self):
  70. if self.is_valid():
  71. return self.save()
  72. else:
  73. raise CustomError(dump_serializer_errors(self))
  74. class NoticeBrowseRecordSerializer(serializers.ModelSerializer):
  75. browse_user_text = serializers.CharField(source='browse_user.name', read_only=True)
  76. department_text = serializers.CharField(source='department.name', read_only=True)
  77. class Meta:
  78. model = NoticeBrowseRecord
  79. fields = '__all__'
  80. @staticmethod
  81. def factory(user, data, id=None):
  82. if id:
  83. instance = NoticeBrowseRecord.getById(id)
  84. else:
  85. instance = None
  86. serializer = NoticeBrowseRecordSerializer(instance, data=data)
  87. serializer.user = user
  88. return serializer
  89. def create(self, validated_data):
  90. validated_data['browse_user'] = self.user
  91. validated_data['department'] = self.user.department
  92. instance = NoticeBrowseRecord.objects.create(**validated_data)
  93. BizLog.objects.addnew(
  94. self.user,
  95. BizLog.INSERT,
  96. u"添加浏览记录[%s],id=%d" % (instance.notice.title, instance.id),
  97. validated_data
  98. )
  99. return instance
  100. def update(self, instance, validated_data):
  101. instance = super(NoticeBrowseRecordSerializer, self).update(instance, validated_data)
  102. BizLog.objects.addnew(
  103. self.user,
  104. BizLog.UPDATE,
  105. u"修改浏览记录[%s],id=%d" % (instance.notice.title, instance.id),
  106. validated_data
  107. )
  108. return instance
  109. def validSave(self):
  110. if self.is_valid():
  111. return self.save()
  112. else:
  113. raise CustomError(dump_serializer_errors(self))
  114. class NoticeReplySerializer(serializers.ModelSerializer):
  115. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  116. department_text = serializers.CharField(source='department.name', read_only=True)
  117. class Meta:
  118. model = NoticeReply
  119. fields = '__all__'
  120. @staticmethod
  121. def factory(user, data, id=None):
  122. if id:
  123. instance = NoticeReply.getById(id)
  124. else:
  125. instance = None
  126. serializer = NoticeReplySerializer(instance, data=data)
  127. serializer.user = user
  128. return serializer
  129. def create(self, validated_data):
  130. validated_data['create_user'] = self.user
  131. validated_data['department'] = self.user.department
  132. instance = NoticeReply.objects.create(**validated_data)
  133. BizLog.objects.addnew(
  134. self.user,
  135. BizLog.INSERT,
  136. u"添加回复[%s],id=%d" % (instance.notice.title, instance.id),
  137. validated_data
  138. )
  139. return instance
  140. def update(self, instance, validated_data):
  141. instance = super(NoticeReplySerializer, self).update(instance, validated_data)
  142. BizLog.objects.addnew(
  143. self.user,
  144. BizLog.UPDATE,
  145. u"修改回复[%s],id=%d" % (instance.notice.title, instance.id),
  146. validated_data
  147. )
  148. return instance
  149. def validSave(self):
  150. if self.is_valid():
  151. return self.save()
  152. else:
  153. raise CustomError(dump_serializer_errors(self))