serializers.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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
  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. vcode = self.initial_data.get('vcode')
  19. appid = self.initial_data.get('appid')
  20. if mobile and vcode and appid:
  21. # VCode.verify(mobile, vcode, tenant)
  22. user = User.objects.filter(username=mobile).first()
  23. if not user:
  24. user = User.objects.create_customer(username=mobile)
  25. if not user.is_active:
  26. msg = '该账户已被禁用'
  27. raise serializers.ValidationError(msg)
  28. try:
  29. customer = Customer.getOrRegister(user=user)
  30. except:
  31. msg = '客户注册失败!'
  32. raise serializers.ValidationError(msg)
  33. payload = jwt_payload_handler(user)
  34. tenant_log(user, BizLog.INSERT,u'客户短信登录,username=%s' % user.username)
  35. return {
  36. 'token': jwt_encode_handler(payload),
  37. 'user_id': user.id,
  38. 'username': user.username,
  39. 'name': customer.name or '',
  40. 'tel': customer.tel or '',
  41. 'face': customer.face and customer.face.get_path() or '',
  42. 'gender': customer.gender or 0,
  43. 'member_id': customer.member_id or '',
  44. }
  45. else:
  46. msg = '参数无效'
  47. raise serializers.ValidationError(msg)
  48. class WechatLoginSerializer(serializers.Serializer):
  49. def validate(self, attrs):
  50. code = self.initial_data.get('code')
  51. if code:
  52. customer_wechat = CustomerWechat.login(code)
  53. if not customer_wechat.customer:
  54. return {
  55. 'bind': 0,
  56. 'openid': customer_wechat.openid,
  57. }
  58. user = customer_wechat.customer.user
  59. if not user.is_active:
  60. msg = '用户帐户已禁用.'
  61. raise serializers.ValidationError(msg)
  62. payload = jwt_payload_handler(user)
  63. tenant_log(user, BizLog.INSERT, u'用户微信登录,username=%s' % user.username)
  64. return {
  65. 'bind': 1,
  66. 'token': jwt_encode_handler(payload),
  67. 'openid': customer_wechat.openid,
  68. 'name': customer_wechat.customer.name or '',
  69. 'tel': customer_wechat.customer.tel or '',
  70. 'face': customer_wechat.customer.face and customer_wechat.customer.face.get_path() or '',
  71. 'gender': customer_wechat.customer.gender or 0,
  72. 'member_id': customer_wechat.customer.member_id or '',
  73. }
  74. else:
  75. msg = '参数无效'
  76. raise serializers.ValidationError(msg)
  77. class WechatBindSerializer(serializers.Serializer):
  78. def validate(self, attrs):
  79. appid = self.initial_data.get('appid')
  80. openid = self.initial_data.get('openid')
  81. phoneEncryptedData = self.initial_data.get('encryptedData')
  82. phoneIv = self.initial_data.get('iv')
  83. if openid and phoneEncryptedData and phoneIv:
  84. customer = CustomerWechat.bindWechat(appid, openid, phoneEncryptedData, phoneIv)
  85. user = customer.user
  86. payload = jwt_payload_handler(user)
  87. tenant_log(user, BizLog.INSERT, u'用户微信登录,username=%s' % user.username)
  88. return {
  89. 'token': jwt_encode_handler(payload),
  90. 'name': customer.name or '',
  91. 'tel': customer.tel or '',
  92. 'face': customer.face and customer.face.get_path() or '',
  93. 'gender': customer.gender or 0,
  94. 'member_id': customer.member_id or '',
  95. }
  96. else:
  97. msg = '参数无效'
  98. raise serializers.ValidationError(msg)
  99. class CustomerSerializer(serializers.ModelSerializer):
  100. face = serializers.SerializerMethodField()
  101. def get_face(self, obj):
  102. if obj.face:
  103. return {'width': obj.face.width, 'height': obj.face.height, 'url': obj.face.get_path()}
  104. return ''
  105. class Meta:
  106. model = Customer
  107. fields = ('name', 'tel', 'face')
  108. class CustomerAddressSerializer(serializers.ModelSerializer):
  109. full_addr = serializers.SerializerMethodField()
  110. def get_full_addr(self, obj):
  111. full_addr = obj.area + obj.addr
  112. return full_addr
  113. class Meta:
  114. model = CustomerAddress
  115. fields = '__all__'
  116. def create(self, validated_data):
  117. customer = self.context['request'].customer
  118. validated_data['customer'] = customer
  119. if validated_data['default']:
  120. CustomerAddress.objects.filter(Q(customer=customer), Q(delete=False)).update(default=False)
  121. instance = super(CustomerAddressSerializer, self).create(validated_data)
  122. return instance
  123. def update(self, instance, validated_data):
  124. if instance.delete:
  125. raise CustomError(u'该收货地址已经被删除,禁止操作')
  126. if validated_data['default']:
  127. CustomerAddress.objects.filter(Q(customer=instance.customer), Q(delete=False), ~Q(id=instance.id)).update(default=False)
  128. instance = super(CustomerAddressSerializer, self).update(instance, validated_data)
  129. return instance