serializers.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. # coding=utf-8
  2. import json
  3. from django.conf import settings
  4. from django.contrib.auth import get_user_model, authenticate
  5. from rest_framework import serializers
  6. from rest_framework_jwt.serializers import JSONWebTokenSerializer
  7. from rest_framework_jwt.settings import api_settings
  8. from django.contrib.auth.models import Group, Permission
  9. from apps.log.models import BizLog
  10. from utils import get_remote_addr
  11. from utils.booleancharfield import BooleanCharField
  12. from utils.exceptions import CustomError
  13. from apps.account.models import CustomerWechat
  14. User = get_user_model()
  15. jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
  16. jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
  17. class JWTSerializer(JSONWebTokenSerializer):
  18. def validate(self, attrs):
  19. credentials = {
  20. self.username_field: attrs.get(self.username_field),
  21. 'password': attrs.get('password')
  22. }
  23. if all(credentials.values()):
  24. user = authenticate(**credentials)
  25. if user:
  26. if not user.is_active:
  27. msg = u'禁用帐户,禁止登录!'
  28. BizLog.objects.addnew(user, BizLog.INSERT,u'禁用帐户[%s]尝试登录系统,IP[%s]' % (user.username, get_remote_addr(self.request)))
  29. raise serializers.ValidationError(msg)
  30. payload = jwt_payload_handler(user)
  31. BizLog.objects.addnew(user, BizLog.INSERT,
  32. u'[%s]登录系统,IP[%s]' % (user.username,get_remote_addr(self.request)))
  33. return {
  34. 'token': jwt_encode_handler(payload),
  35. 'user_id': user.id,
  36. 'username': user.username,
  37. 'name': user.name,
  38. }
  39. else:
  40. msg = u'账号或者密码错误!'
  41. raise serializers.ValidationError(msg)
  42. else:
  43. msg = u'登录参数错误.'
  44. msg = msg.format(username_field=self.username_field)
  45. raise serializers.ValidationError(msg)
  46. class EmployeeSerializer(serializers.ModelSerializer):
  47. enable_text = BooleanCharField(source='is_active', read_only=True)
  48. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  49. gender_text = serializers.CharField(source='get_gender_display', read_only=True)
  50. type_text = serializers.CharField(source='get_type_display', read_only=True)
  51. date_joined_f = serializers.DateTimeField(source='date_joined', format=settings.SHORT_DATETIME_FORMAT,
  52. read_only=True)
  53. class Meta:
  54. model = User
  55. # fields = '__all__'
  56. exclude = ('password',)
  57. def create(self, validated_data):
  58. username = self.initial_data['username']
  59. user = User.objects.filter(username=username).first()
  60. if user:
  61. if user.type == User.CUSTOMER:
  62. # 如果新添加的账号是游客,直接改成员工
  63. validated_data['create_user'] = self.context['request'].user
  64. validated_data['is_active'] = self.initial_data['is_active'] == '1'
  65. instance = super(EmployeeSerializer, self).update(user, validated_data)
  66. else:
  67. raise CustomError(u'账号[{0}]和其他员工账号重复,禁止添加。'.format(username))
  68. else:
  69. # 代理商添加的账号,默认就是操作人所在的代理商
  70. validated_data['is_active'] = self.initial_data['is_active'] == '1'
  71. user = self.context['request'].user
  72. validated_data['create_user'] = user
  73. instance = super(EmployeeSerializer, self).create(validated_data)
  74. instance.set_password(self.initial_data['password'])
  75. instance.save()
  76. return instance
  77. def update(self, instance, validated_data):
  78. username = self.initial_data['username']
  79. user = User.objects.filter(username=username).exclude(id=instance.id).first()
  80. if user:
  81. raise CustomError(u'账号[{0}]和其他员工账号重复,禁止修改。'.format(username))
  82. password = instance.password
  83. validated_data['is_superuser'] = instance.is_superuser
  84. validated_data['is_active'] = self.initial_data['is_active'] == '1'
  85. instance = super(EmployeeSerializer, self).update(instance, validated_data)
  86. if not 'password' in self.initial_data or not self.initial_data['password']:
  87. instance.password = password
  88. else:
  89. instance.set_password(self.initial_data['password'])
  90. instance.save()
  91. return instance
  92. class PermissionSerializer(serializers.ModelSerializer):
  93. class Meta:
  94. model = Permission
  95. fields = ('id', 'name',)
  96. class GroupSerializer(serializers.ModelSerializer):
  97. employees = serializers.SerializerMethodField()
  98. permissions = PermissionSerializer(many=True, read_only=True)
  99. def get_employees(self, obj):
  100. users = obj.user_set.all()
  101. data = []
  102. for user in users:
  103. data.append(user.name)
  104. return data
  105. class Meta:
  106. model = Group
  107. fields = ('id', 'name', 'permissions', 'employees',)
  108. def create(self, validated_data):
  109. user = self.context['request'].user
  110. validated_data['create_user'] = user
  111. group = Group.objects.filter(name=validated_data['name']).first()
  112. if group:
  113. raise CustomError(u'名称为[%s]的权限组已存在' % validated_data['name'])
  114. permissions = self.context['request'].data.get('permissions', None)
  115. if permissions:
  116. permissions = json.loads(permissions)
  117. else:
  118. permissions = []
  119. instance = super(GroupSerializer, self).create(validated_data)
  120. instance.permissions.set(permissions)
  121. return instance
  122. def update(self, instance, validated_data):
  123. group = Group.objects.filter(name=validated_data['name']).exclude(id=instance.id).first()
  124. if group:
  125. raise CustomError(u'名称为[%s]的权限组已存在' % validated_data['name'])
  126. permissions = self.context['request'].data.get('permissions', None)
  127. if permissions:
  128. permissions = json.loads(permissions)
  129. else:
  130. permissions = []
  131. instance = super(GroupSerializer, self).update(instance, validated_data)
  132. instance.permissions.set(permissions)
  133. return instance
  134. class GroupDictSerializer(serializers.ModelSerializer):
  135. value = serializers.CharField(source='id', read_only=True)
  136. class Meta:
  137. model = Group
  138. fields = ('value', 'name',)
  139. class WechatLoginSerializer(serializers.Serializer):
  140. def validate(self, attrs):
  141. code = self.initial_data.get('code') # 用户code
  142. appid = self.initial_data.get('appid') # 小程序appid
  143. if code and appid:
  144. customer_wechat = CustomerWechat.login(code, appid)
  145. if not customer_wechat.customer:
  146. return {
  147. 'openid': customer_wechat.openid,
  148. }
  149. user = customer_wechat.customer
  150. if not user.is_active:
  151. msg = '用户帐户已禁用.'
  152. raise serializers.ValidationError(msg)
  153. payload = jwt_payload_handler(user)
  154. return {
  155. 'user_id': user.id,
  156. 'token': jwt_encode_handler(payload),
  157. 'openid': customer_wechat.openid,
  158. 'name': customer_wechat.customer.name or '',
  159. 'tel': customer_wechat.customer.username or '',
  160. 'face': customer_wechat.customer.face,
  161. 'type': customer_wechat.customer.type,
  162. }
  163. else:
  164. msg = '参数无效'
  165. raise serializers.ValidationError(msg)
  166. class WechatBindSerializer(serializers.Serializer):
  167. def validate(self, attrs):
  168. appid = self.initial_data.get('appid')
  169. openid = self.initial_data.get('openid')
  170. phoneEncryptedData = self.initial_data.get('encryptedData')
  171. phoneIv = self.initial_data.get('iv')
  172. if openid and phoneEncryptedData and phoneIv:
  173. customer = CustomerWechat.bindWechat(appid, openid, phoneEncryptedData, phoneIv)
  174. payload = jwt_payload_handler(customer)
  175. return {
  176. 'token': jwt_encode_handler(payload),
  177. 'user_id': customer.id,
  178. 'name': customer.name or '',
  179. 'tel': customer.username or '',
  180. 'face': customer.face,
  181. 'type': customer.type,
  182. }
  183. else:
  184. msg = '参数无效'
  185. raise serializers.ValidationError(msg)