serializers.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #coding=utf-8
  2. from rest_framework import serializers
  3. from apps.exceptions import CustomError
  4. from django.db.models import Q
  5. from apps.foundation.models import BizLog
  6. from models import User, Group,SubDepartment,SubEmployee
  7. from apps.serializer_errors import dump_serializer_errors
  8. from apps.foundation.models import BizLog
  9. class EmployeeSerializer(serializers.ModelSerializer):
  10. gender_text = serializers.CharField(source='get_gender_display', read_only=True)
  11. status_text = serializers.CharField(source='get_status_display',read_only=True)
  12. class Meta:
  13. model = User
  14. fields = '__all__'
  15. @staticmethod
  16. def factory(user, data, id=None):
  17. if id:
  18. instance = User.getById(id)
  19. else:
  20. instance = None
  21. serializer = EmployeeSerializer(instance, data=data)
  22. serializer.user = user
  23. return serializer
  24. def validSave(self):
  25. if self.is_valid():
  26. return self.save()
  27. else:
  28. raise CustomError(dump_serializer_errors(self))
  29. def validate(self, data):
  30. if 'status' not in data:
  31. data['status'] = User.DIMISSION
  32. return data
  33. def create(self, validated_data):
  34. groups = validated_data.pop('groups')
  35. instance = super(EmployeeSerializer, self).create(validated_data)
  36. instance.set_password(validated_data['password'])
  37. instance.save()
  38. for group in groups:
  39. instance.groups.add(group)
  40. BizLog.objects.addnew(self.user, BizLog.INSERT, u"添加员工[%s],id=%s" % (instance.name, instance.id),validated_data)
  41. return instance
  42. def update(self, instance, validated_data):
  43. instance.groups.clear()
  44. groups = validated_data.pop('groups')
  45. for group in groups:
  46. instance.groups.add(group)
  47. BizLog.objects.addnew(self.user, BizLog.UPDATE, u"修改员工[%s],id=%s" % (instance.name, instance.id),validated_data)
  48. instance = super(EmployeeSerializer, self).update(instance, validated_data)
  49. return instance
  50. class EmployeeSafeSerializer(serializers.ModelSerializer):
  51. gender_text = serializers.CharField(source='get_gender_display', read_only=True)
  52. status_text = serializers.CharField(source='get_status_display',read_only=True)
  53. department_text = serializers.CharField(source='department.name', read_only=True)
  54. groups = serializers.StringRelatedField(many=True, read_only=True)
  55. group_ids = serializers.PrimaryKeyRelatedField(source='groups', many=True, read_only=True)
  56. sub_department_ids = serializers.SerializerMethodField()
  57. sub_employee_ids = serializers.SerializerMethodField()
  58. class Meta:
  59. model = User
  60. exclude = ('password', )
  61. def get_sub_department_ids(self, obj):
  62. data = []
  63. rows = SubDepartment.objects.filter(user=obj)
  64. data.extend([s.department_id for s in rows])
  65. return data
  66. def get_sub_employee_ids(self, obj):
  67. data = []
  68. rows = SubEmployee.objects.filter(user=obj)
  69. data.extend([s.employee_id for s in rows])
  70. return data
  71. class GroupSerializer(serializers.ModelSerializer):
  72. employees = serializers.StringRelatedField(source='user_set', many=True, read_only=True)
  73. class Meta:
  74. model = Group
  75. fields = '__all__'
  76. class GroupComboboxSerializer(serializers.ModelSerializer):
  77. value = serializers.CharField(source='id', read_only=True)
  78. class Meta:
  79. model = Group
  80. fields = ('value', 'name', )