serializers.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 apps.base import Formater
  10. from utils.exceptions import CustomError
  11. from apps.account import tenant_log
  12. User = get_user_model()
  13. jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
  14. jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
  15. class CustomerMobileSignSerializer(serializers.Serializer):
  16. def validate(self, attrs):
  17. mobile = self.initial_data.get('mobile')
  18. appid = Config.getConfigValue(Config.KEY_WECHAT_APPID)
  19. if mobile and appid:
  20. user = User.objects.filter(username=mobile).first()
  21. if not user:
  22. user = User.objects.create_customer(username=mobile)
  23. if user.status == User.DIMISSION:
  24. msg = '该账户已被禁用'
  25. raise serializers.ValidationError(msg)
  26. try:
  27. customer = Customer.getOrRegister(user=user)
  28. except:
  29. msg = '客户注册失败!'
  30. raise serializers.ValidationError(msg)
  31. payload = jwt_payload_handler(user)
  32. return {
  33. 'token': jwt_encode_handler(payload),
  34. 'user_id': user.id,
  35. 'customer': customer.id,
  36. 'username': user.username,
  37. 'name': customer.name or '',
  38. 'tel': customer.tel or '',
  39. 'face': customer.face and customer.face.get_path() or '',
  40. 'gender': customer.gender or 0,
  41. }
  42. else:
  43. msg = '参数无效'
  44. raise serializers.ValidationError(msg)
  45. class WechatLoginSerializer(serializers.Serializer):
  46. def validate(self, attrs):
  47. code = self.initial_data.get('code')
  48. if code:
  49. customer_wechat = CustomerWechat.login(code)
  50. if not customer_wechat.customer:
  51. return {
  52. 'bind': 0,
  53. 'openid': customer_wechat.openid,
  54. }
  55. user = customer_wechat.customer.user
  56. if user.status == User.DIMISSION:
  57. msg = '用户帐户已禁用.'
  58. raise serializers.ValidationError(msg)
  59. payload = jwt_payload_handler(user)
  60. tenant_log(user, BizLog.INSERT, u'用户微信登录,username=%s' % user.username)
  61. return {
  62. 'bind': 1,
  63. 'token': jwt_encode_handler(payload),
  64. 'openid': customer_wechat.openid,
  65. 'customer': customer_wechat.customer_id,
  66. 'name': customer_wechat.customer.name or '',
  67. 'tel': customer_wechat.customer.tel or '',
  68. 'face': customer_wechat.customer.face and customer_wechat.customer.face.get_path() or '',
  69. 'gender': customer_wechat.customer.gender or 0,
  70. }
  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_encode_handler(payload),
  87. 'customer': customer.id or '',
  88. 'name': customer.name or '',
  89. 'tel': customer.tel or '',
  90. 'face': customer.face and customer.face.get_path() or '',
  91. 'gender': customer.gender or 0,
  92. }
  93. else:
  94. msg = '参数无效'
  95. raise serializers.ValidationError(msg)
  96. class CustomerSerializer(serializers.ModelSerializer):
  97. face = serializers.SerializerMethodField()
  98. def get_face(self, obj):
  99. if obj.face:
  100. return {'width': obj.face.width, 'height': obj.face.height, 'url': obj.face.get_path()}
  101. return ''
  102. class Meta:
  103. model = Customer
  104. fields = ('name', 'tel', 'face')
  105. class CustomerAddressSerializer(serializers.ModelSerializer):
  106. full_addr = serializers.SerializerMethodField()
  107. def get_full_addr(self, obj):
  108. full_addr = obj.area + obj.addr
  109. return full_addr
  110. class Meta:
  111. model = CustomerAddress
  112. fields = '__all__'
  113. def create(self, validated_data):
  114. customer = self.context['request'].customer
  115. validated_data['customer'] = customer
  116. if validated_data['default']:
  117. CustomerAddress.objects.filter(Q(customer=customer), Q(delete=False)).update(default=False)
  118. instance = super(CustomerAddressSerializer, self).create(validated_data)
  119. return instance
  120. def update(self, instance, validated_data):
  121. if instance.delete:
  122. raise CustomError(u'该收货地址已经被删除,禁止操作')
  123. if validated_data['default']:
  124. CustomerAddress.objects.filter(Q(customer=instance.customer), Q(delete=False), ~Q(id=instance.id)).update(default=False)
  125. instance = super(CustomerAddressSerializer, self).update(instance, validated_data)
  126. return instance