serializers.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # coding=utf-8
  2. import json
  3. from rest_framework import serializers
  4. from apps.tenant.employee.models import Employee
  5. from utils.exceptions import CustomError
  6. from apps.account.models import User
  7. class EmployeeSerializer(serializers.ModelSerializer):
  8. gender_text = serializers.CharField(source='get_gender_display', read_only=True)
  9. status_text = serializers.CharField(source='get_status_display', read_only=True)
  10. create_time = serializers.DateTimeField(source='user.date_joined', read_only=True)
  11. username = serializers.CharField(source='user.username', read_only=True)
  12. position_text = serializers.CharField(source='position.name', read_only=True)
  13. area_text = serializers.SerializerMethodField()
  14. department_text = serializers.CharField(source='department.name', read_only=True)
  15. area = serializers.SerializerMethodField()
  16. group_ids = serializers.PrimaryKeyRelatedField(source='user.groups', many=True, read_only=True)
  17. groups = serializers.SerializerMethodField()
  18. forbid_baoxiu_text = serializers.SerializerMethodField()
  19. type_text = serializers.CharField(source='get_type_display', read_only=True)
  20. def get_area_text(self, obj):
  21. if obj.department:
  22. return obj.department.area.name
  23. return ''
  24. def get_area(self, obj):
  25. if obj.department:
  26. return obj.department.area.id
  27. return ''
  28. def get_forbid_baoxiu_text(self, obj):
  29. if obj.forbid_baoxiu:
  30. return u'是'
  31. return u'否'
  32. def get_groups(self, obj):
  33. return ','.join(obj.user.groups.values_list('display_name', flat=True))
  34. class Meta:
  35. model = Employee
  36. fields = '__all__'
  37. def create(self, validated_data):
  38. username = self.initial_data['tel']
  39. # 判断用户是否已经注册登陆过
  40. password = None
  41. if self.initial_data['password']:
  42. password = self.initial_data['password']
  43. user = User.objects.filter(username=username).first()
  44. if not user:
  45. # 创建user实例
  46. is_active = 1 if self.initial_data['status'] != '4' else 0
  47. user = User.objects.create_tenant(username, password, is_active=is_active)
  48. validated_data['user'] = user
  49. validated_data['create_user'] = self.context['request'].user
  50. validated_data['tenant'] = self.context['request'].user.employee.tenant
  51. validated_data['type'] = Employee.EMPLOYEE
  52. try:
  53. instance = super(EmployeeSerializer, self).create(validated_data)
  54. except Exception as e:
  55. if e.args[0] == 1062:
  56. raise CustomError(u'该手机号已被游客或者其他员工使用,请检查!')
  57. groups = self.context['request'].data.get('groups', None)
  58. if groups:
  59. groups = json.loads(groups)
  60. else:
  61. groups = []
  62. for group in groups:
  63. instance.user.groups.add(group)
  64. return instance
  65. def update(self, instance, validated_data):
  66. instance.user.groups.clear()
  67. groups = self.context['request'].data.get('groups', None)
  68. if groups:
  69. groups = json.loads(groups)
  70. else:
  71. groups = []
  72. for group in groups:
  73. instance.user.groups.add(group)
  74. if instance.tenant != self.context['request'].user.employee.tenant:
  75. raise CustomError(u'禁止跨租户操作!')
  76. username = self.initial_data['tel']
  77. if username and self.initial_data['password'].strip() != '':
  78. if instance.user:
  79. user = {
  80. 'username': username,
  81. 'password': self.initial_data['password'],
  82. 'is_active': 1 if self.initial_data['status'] != '4' else 0,
  83. 'type':2,
  84. }
  85. instance.user.update_item(user)
  86. else:
  87. is_active = 1 if self.initial_data['status'] != '4' else 0
  88. user = User.objects.create_tenant(username,
  89. self.initial_data['password'],
  90. is_active=is_active)
  91. validated_data['user'] = user
  92. instance = super(EmployeeSerializer, self).update(instance, validated_data)
  93. return instance