views.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. # coding=utf-8
  2. import requests
  3. from rest_framework.exceptions import NotFound
  4. from django.db import transaction
  5. from rest_framework.views import APIView
  6. from rest_framework import generics
  7. from rest_framework.decorators import action
  8. from django.db.models import Q
  9. from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
  10. from rest_framework.serializers import ValidationError
  11. from apps.WechatApplet.models import WechatApplet
  12. from utils import response_ok, response_error
  13. from apps.tenant.config.serializers import Config,ConfigSerializer
  14. from apps.tenant.option.serializers import OptionSerializer,Option
  15. from apps.tenant.area.serializers import AreaSerializer,Area
  16. from apps.tenant.building.models import Building
  17. from apps.tenant.notices.models import Notices
  18. from apps.tenant.notices.serializers import NoticesWXSerializer
  19. from apps.tenant.notices.filters import NoticesFilter
  20. from utils.permission import isLogin
  21. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  22. from apps.tenant.poster.serializer import PosterSerializer, Poster
  23. from apps.tenant.device.models import DeviceModel
  24. from .serializers import *
  25. class CustomerRefreshTokenView(RefreshJSONWebToken):
  26. def post(self, request, *args, **kwargs):
  27. try:
  28. ser = self.serializer_class(data=request.data)
  29. if ser.is_valid(raise_exception=True):
  30. return response_ok({'token': ser.validated_data['token']})
  31. except ValidationError as e:
  32. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  33. class CustomerVerifyTokenView(VerifyJSONWebToken):
  34. def post(self, request, *args, **kwargs):
  35. try:
  36. ser = self.serializer_class(data=request.data)
  37. if ser.is_valid(raise_exception=True):
  38. return response_ok({'token': ser.validated_data['token']})
  39. except ValidationError as e:
  40. return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
  41. class SetUserInfoView(APIView):
  42. permission_classes = [isLogin, ]
  43. def post(self, request, *args, **kwargs):
  44. appid = request.POST.get('appid')
  45. openid = request.POST.get('openid')
  46. encryptedData = request.POST.get('encryptedData')
  47. iv = request.POST.get('iv')
  48. customer_wechat = CustomerWechat.objects.filter(openid=openid).first()
  49. if not customer_wechat:
  50. raise CustomError(u'未找到相应的微信客户!')
  51. employee = self.request.user.employee
  52. if customer_wechat.customer and customer_wechat.customer.id != employee.id:
  53. raise CustomError(u'该微信已同步其他客户!')
  54. if not customer_wechat.customer:
  55. customer_wechat.customer = employee
  56. customer_wechat.save()
  57. pc = WXBizDataCrypt(appid, customer_wechat.session_key)
  58. result = pc.decrypt(encryptedData, iv)
  59. with transaction.atomic():
  60. if employee.name == employee.tel:
  61. employee.name = result['nickName']
  62. employee.gender = result['gender']
  63. employee.face = result['avatarUrl']
  64. employee.save()
  65. customer_log(employee, BizLog.INSERT, u'客户设置信息,id=%d' % employee.id, result)
  66. return response_ok()
  67. class WxLoginView(APIView):
  68. serializer_class = WechatLoginSerializer
  69. def post(self, request, *args, **kwargs):
  70. ser = self.serializer_class(data=request.data)
  71. if ser.is_valid():
  72. return response_ok(ser.validated_data)
  73. else:
  74. return response_error('参数错误')
  75. class WxBindView(APIView):
  76. serializer_class = WechatBindSerializer
  77. def post(self, request, *args, **kwargs):
  78. ser = self.serializer_class(data=request.data)
  79. if ser.is_valid():
  80. return response_ok(ser.validated_data)
  81. else:
  82. return response_error('参数错误')
  83. class HomeView(generics.ListAPIView):
  84. '''小程序首页数据'''
  85. queryset = Config.objects.filter()
  86. serializer_class = ConfigSerializer
  87. def filter_queryset(self, queryset):
  88. appid = self.request.GET.get('appid')
  89. app = WechatApplet.getByAppid(appid)
  90. queryset = queryset.filter(tenant=app.tenant)
  91. return queryset
  92. def list(self, request, *args, **kwargs):
  93. try:
  94. data = super(HomeView, self).list(request)
  95. except NotFound:
  96. return response_ok([])
  97. return data
  98. class PosterView(generics.ListAPIView):
  99. '''小程序首页数据'''
  100. queryset = Poster.objects.filter(enable=True)
  101. serializer_class = PosterSerializer
  102. def filter_queryset(self, queryset):
  103. is_auth = False
  104. if self.request.user and self.request.user.is_authenticated:
  105. is_auth = True
  106. queryset = queryset.filter(tenant__isnull=True)
  107. if is_auth:
  108. queryset = queryset.filter(Q(tenant__isnull=True) | Q(tenant=self.request.user.employee.tenant))
  109. return queryset
  110. def list(self, request, *args, **kwargs):
  111. try:
  112. data = super(PosterView, self).list(request)
  113. except NotFound:
  114. return response_ok([])
  115. return data
  116. class DictView(APIView):
  117. permission_classes = [isLogin, ]
  118. def get(self, request):
  119. tenant = request.user.employee.tenant
  120. ret = {
  121. 'repair_type': OptionSerializer(Option.objects.filter(delete=False,type=Option.REPAIRS_TYPE, enable=True, tenant=tenant), many=True).data,
  122. 'fault_cause': OptionSerializer(Option.objects.filter(delete=False,type=Option.FAULT_CAUSE, enable=True, tenant=tenant), many=True).data,
  123. }
  124. return response_ok(ret)
  125. class NoticesView(generics.ListAPIView):
  126. queryset = Notices.objects.filter()
  127. serializer_class = NoticesWXSerializer
  128. def filter_queryset(self, queryset):
  129. appid = self.request.GET.get('appid')
  130. app = WechatApplet.getByAppid(appid)
  131. queryset = queryset.filter(tenant=app.tenant)
  132. f = NoticesFilter(self.request.GET, queryset=queryset)
  133. return f.qs
  134. class NoticesDetailView(generics.RetrieveAPIView):
  135. queryset = Notices.objects.filter()
  136. serializer_class = NoticesWXSerializer
  137. def get_queryset(self):
  138. appid = self.request.GET.get('appid')
  139. app = WechatApplet.getByAppid(appid)
  140. queryset = self.queryset.filter(tenant=app.tenant)
  141. return queryset
  142. def retrieve(self, request, *args, **kwargs):
  143. return response_ok(NoticesWXSerializer(self.get_object()).data)
  144. class BuildingView(APIView):
  145. def get(self, request):
  146. area = request.GET.get('area')
  147. data = []
  148. rows = Building.objects.filter(area=area).values('building').order_by('building').distinct()
  149. for build in rows:
  150. build_dict = {
  151. 'name':build['building'],
  152. 'childern':[]
  153. }
  154. floors = Building.objects.filter(area=area,building=build['building']).values('floor').order_by('floor').distinct()
  155. for floor in floors:
  156. floor_dict = {
  157. 'name': floor['floor'],
  158. 'childern': []
  159. }
  160. build_dict['childern'].append(floor_dict)
  161. locations = Building.objects.filter(area=area, building=build['building'],floor=floor['floor'])
  162. for location in locations:
  163. floor_dict['childern'].append({
  164. 'id':location.id,
  165. 'name':location.location,
  166. })
  167. data.append(build_dict)
  168. return response_ok(data)
  169. class DeviceView(APIView):
  170. permission_classes = [isLogin, ]
  171. def get(self, request):
  172. param = request.GET.get('param')
  173. data = []
  174. rows = DeviceModel.objects.filter(tenant=request.user.employee.tenant)
  175. if param:
  176. rows = rows.filter(Q(name=param) | Q(device_no=param) | Q(device_model=param))
  177. else:
  178. rows = rows[:10]
  179. for item in rows:
  180. build_dict = {
  181. 'id': item.name,
  182. 'name':item.name,
  183. 'device_no':item.device_no,
  184. 'device_model':item.device_model,
  185. 'branch':item.branch,
  186. 'address':item.address,
  187. }
  188. data.append(build_dict)
  189. return response_ok(data)