views.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. # coding=utf-8
  2. import requests
  3. from django.db import transaction
  4. from rest_framework.views import APIView
  5. from rest_framework import generics
  6. from rest_framework.decorators import action
  7. from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
  8. from rest_framework.serializers import ValidationError
  9. from rest_framework import permissions
  10. from utils import response_ok, response_error
  11. from utils.exceptions import CustomError
  12. from utils.custom_modelviewset import CustomModelViewSet
  13. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  14. from utils.permission import IsCustomerUser
  15. from apps.images.models import Images
  16. from apps.customer.models import CustomerAddress
  17. from apps.customer.filters import CustomerAddressFilter
  18. from apps.foundation.models import Config
  19. from apps.account import tenant_log
  20. from .serializers import *
  21. class CustomerLoginView(APIView):
  22. serializer_class = CustomerMobileSignSerializer
  23. def post(self, request, *args, **kwargs):
  24. ser = self.serializer_class(data=request.data)
  25. if ser.is_valid():
  26. return response_ok(ser.validated_data)
  27. else:
  28. return response_error('参数错误')
  29. class CustomerRefreshTokenView(RefreshJSONWebToken):
  30. def post(self, request, *args, **kwargs):
  31. try:
  32. ser = self.serializer_class(data=request.data)
  33. if ser.is_valid(raise_exception=True):
  34. return response_ok({'token': ser.validated_data['token']})
  35. except ValidationError as e:
  36. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  37. class CustomerVerifyTokenView(VerifyJSONWebToken):
  38. def post(self, request, *args, **kwargs):
  39. try:
  40. ser = self.serializer_class(data=request.data)
  41. if ser.is_valid(raise_exception=True):
  42. return response_ok({'token': ser.validated_data['token']})
  43. except ValidationError as e:
  44. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  45. class WxLoginView(APIView):
  46. serializer_class = WechatLoginSerializer
  47. def post(self, request, *args, **kwargs):
  48. ser = self.serializer_class(data=request.data)
  49. if ser.is_valid():
  50. return response_ok(ser.validated_data)
  51. else:
  52. return response_error('参数错误')
  53. class WxBindView(APIView):
  54. serializer_class = WechatBindSerializer
  55. def post(self, request, *args, **kwargs):
  56. ser = self.serializer_class(data=request.data)
  57. if ser.is_valid():
  58. return response_ok(ser.validated_data)
  59. else:
  60. return response_error('参数错误')
  61. class SetUserInfoView(APIView):
  62. permission_classes = [IsCustomerUser, ]
  63. def post(self, request, *args, **kwargs):
  64. appid = request.POST.get('appid')
  65. openid = request.POST.get('openid')
  66. encryptedData = request.POST.get('encryptedData')
  67. iv = request.POST.get('iv')
  68. customer_wechat = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
  69. if not customer_wechat:
  70. raise CustomError(u'未找到相应的微信客户!')
  71. customer = request.customer
  72. if customer_wechat.customer and customer_wechat.customer.id != customer.id:
  73. raise CustomError(u'该微信已同步其他客户!')
  74. if not customer_wechat.customer:
  75. customer_wechat.customer = customer
  76. customer_wechat.save()
  77. pc = WXBizDataCrypt(customer_wechat.wechat_app.authorizer_appid, customer_wechat.session_key)
  78. result = pc.decrypt(encryptedData, iv)
  79. with transaction.atomic():
  80. customer.setInfo(result['nickName'], result['gender'], result['avatarUrl'])
  81. tenant_log(customer.user, BizLog.INSERT, u'客户设置信息,id=%d' % customer.id, result)
  82. return response_ok()
  83. class CustomerInfoView(generics.RetrieveAPIView):
  84. permission_classes = [IsCustomerUser, ]
  85. # queryset = Customer.objects.filter()
  86. serializer_class = CustomerSerializer
  87. def get_object(self):
  88. # queryset = self.filter_queryset(self.get_queryset())
  89. # obj = queryset.filter(id=self.request.customer.id).first()
  90. obj = self.request.customer
  91. return obj
  92. def retrieve(self, request, *args, **kwargs):
  93. instance = self.get_object()
  94. serializer = self.get_serializer(instance)
  95. return response_ok(serializer.data)
  96. class CustomerAddressViewSet(CustomModelViewSet):
  97. permission_classes = [IsCustomerUser, ]
  98. queryset = CustomerAddress.objects.filter(delete=False)
  99. serializer_class = CustomerAddressSerializer
  100. def filter_queryset(self, queryset):
  101. queryset = queryset.filter(customer=self.request.customer)
  102. f = CustomerAddressFilter(self.request.GET, queryset=queryset)
  103. return f.qs
  104. def list(self, request, *args, **kwargs):
  105. queryset = self.filter_queryset(self.get_queryset())
  106. serializer = self.get_serializer(queryset, many=True)
  107. return response_ok(serializer.data)
  108. def perform_create(self, serializer):
  109. super(CustomerAddressViewSet, self).perform_create(serializer)
  110. instance = serializer.instance
  111. validated_data = serializer.validated_data
  112. tenant_log(instance.customer.user, BizLog.INSERT, u'客户添加收货地址,id=%d' % instance.id, validated_data)
  113. @action(methods=['post'], detail=True)
  114. def addr_update(self, request, *args, **kwargs):
  115. with transaction.atomic():
  116. instance = self.get_object()
  117. serializer = self.get_serializer(instance, data=request.data)
  118. serializer.is_valid(raise_exception=True)
  119. serializer.save()
  120. instance = serializer.instance
  121. validated_data = serializer.validated_data
  122. tenant_log(instance.customer.user, BizLog.UPDATE, u'客户修改收货地址,id=%d' % instance.id, validated_data)
  123. return response_ok()
  124. @action(methods=['get'], detail=True)
  125. def addr_destroy(self, request, *args, **kwargs):
  126. with transaction.atomic():
  127. instance = self.get_object()
  128. queryset = self.get_queryset().filter(customer=self.request.customer).exclude(id=instance.id)
  129. instance.destory(queryset)
  130. tenant_log(instance.customer.user, BizLog.INSERT, u'客户删除收货地址,id=%d' % instance.id)
  131. return response_ok()
  132. @action(methods=['get'], detail=True)
  133. def set_default(self, request, *args, **kwargs):
  134. with transaction.atomic():
  135. instance = self.get_object()
  136. self.get_queryset().filter(customer=self.request.customer, default=True).update(default=False)
  137. instance.default = True
  138. instance.save()
  139. tenant_log(instance.customer.user, BizLog.INSERT, u'客户设置默认收货地址,id=%d' % instance.id)
  140. return response_ok()