serializers.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #coding=utf-8
  2. from django.contrib.auth import get_user_model
  3. from django.conf import settings
  4. from django.db.models import Q
  5. from rest_framework import serializers
  6. from rest_framework_jwt.settings import api_settings
  7. from apps.customer.models import Customer, CustomerWechat, CustomerAddress
  8. from apps.foundation.models import BizLog, Config
  9. from utils.exceptions import CustomError
  10. from apps.account import tenant_log
  11. User = get_user_model()
  12. jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
  13. jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
  14. class CustomerMobileSignSerializer(serializers.Serializer):
  15. def validate(self, attrs):
  16. mobile = self.initial_data.get('mobile')
  17. appid = Config.getConfigValue(Config.KEY_WECHAT_APPID)
  18. if mobile and appid:
  19. user = User.objects.filter(username=mobile).first()
  20. if not user:
  21. user = User.objects.create_customer(username=mobile)
  22. if user.status == User.DIMISSION:
  23. msg = '该账户已被禁用'
  24. raise serializers.ValidationError(msg)
  25. try:
  26. customer = Customer.getOrRegister(user=user)
  27. except:
  28. msg = '客户注册失败!'
  29. raise serializers.ValidationError(msg)
  30. payload = jwt_payload_handler(user)
  31. return {
  32. 'token': jwt_encode_handler(payload),
  33. 'user_id': user.id,
  34. 'customer': customer.id,
  35. 'username': user.username,
  36. 'name': customer.name or '',
  37. 'tel': customer.tel or '',
  38. 'face': customer.face or '',
  39. 'gender': customer.gender or 0,
  40. }
  41. else:
  42. msg = '参数无效'
  43. raise serializers.ValidationError(msg)
  44. class WechatLoginSerializer(serializers.Serializer):
  45. def validate(self, attrs):
  46. code = self.initial_data.get('code')
  47. if code:
  48. customer_wechat = CustomerWechat.login(code)
  49. if not customer_wechat.customer:
  50. return {
  51. 'bind': 0,
  52. 'openid': customer_wechat.openid,
  53. }
  54. user = customer_wechat.customer.user
  55. if user.status == User.DIMISSION:
  56. msg = '用户帐户已禁用.'
  57. raise serializers.ValidationError(msg)
  58. payload = jwt_payload_handler(user)
  59. tenant_log(user, BizLog.INSERT, u'用户微信登录,username=%s' % user.username)
  60. result = {
  61. 'bind': 1,
  62. 'token': 'JWT {}'.format(jwt_encode_handler(payload)),
  63. 'openid': customer_wechat.openid,
  64. 'customer': customer_wechat.customer_id,
  65. 'name': customer_wechat.customer.name or '',
  66. 'tel': customer_wechat.customer.tel or '',
  67. 'face': customer_wechat.customer.face or '',
  68. 'gender': customer_wechat.customer.gender or 0,
  69. }
  70. return result
  71. else:
  72. msg = '参数无效'
  73. raise serializers.ValidationError(msg)
  74. class WechatBindSerializer(serializers.Serializer):
  75. def validate(self, attrs):
  76. appid = Config.getConfigValue(Config.KEY_WECHAT_APPID)
  77. openid = self.initial_data.get('openid')
  78. phoneEncryptedData = self.initial_data.get('encryptedData')
  79. phoneIv = self.initial_data.get('iv')
  80. if openid and phoneEncryptedData and phoneIv:
  81. customer = CustomerWechat.bindWechat(appid, openid, phoneEncryptedData, phoneIv)
  82. user = customer.user
  83. payload = jwt_payload_handler(user)
  84. tenant_log(user, BizLog.INSERT, u'用户微信登录,username=%s' % user.username)
  85. return {
  86. 'token': 'JWT {}'.format(jwt_encode_handler(payload)),
  87. 'customer': customer.id or '',
  88. 'name': customer.name or '',
  89. 'tel': customer.tel or '',
  90. 'face': customer.face or '',
  91. 'gender': customer.gender or 0,
  92. }
  93. else:
  94. msg = '参数无效'
  95. raise serializers.ValidationError(msg)
  96. class CustomerSerializer(serializers.ModelSerializer):
  97. class Meta:
  98. model = Customer
  99. fields = ('name', 'tel', 'face')
  100. class CustomerAddressSerializer(serializers.ModelSerializer):
  101. full_addr = serializers.SerializerMethodField()
  102. def get_full_addr(self, obj):
  103. full_addr = obj.area + obj.addr
  104. return full_addr
  105. class Meta:
  106. model = CustomerAddress
  107. fields = '__all__'
  108. def create(self, validated_data):
  109. customer = self.context['request'].customer
  110. validated_data['customer'] = customer
  111. if validated_data['default']:
  112. CustomerAddress.objects.filter(Q(customer=customer), Q(delete=False)).update(default=False)
  113. instance = super(CustomerAddressSerializer, self).create(validated_data)
  114. return instance
  115. def update(self, instance, validated_data):
  116. if instance.delete:
  117. raise CustomError(u'该收货地址已经被删除,禁止操作')
  118. if validated_data['default']:
  119. CustomerAddress.objects.filter(Q(customer=instance.customer), Q(delete=False), ~Q(id=instance.id)).update(default=False)
  120. instance = super(CustomerAddressSerializer, self).update(instance, validated_data)
  121. return instance