Nessuna descrizione

tenancy_views.py 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import json
  4. from django.conf import settings
  5. from django.db import transaction
  6. from django_logit import logit
  7. from django_query import get_query_value
  8. from django_response import response
  9. from json_response import JsonResponse
  10. from paginator import pagination
  11. from TimeConvert import TimeConvert as tc
  12. from mch.models import ModelInfo
  13. from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
  14. from utils.error.errno_utils import TenancyStatusCode
  15. from utils.kuaidi.subscribe import KuaiDi100 as KuaiDi100Subscribe
  16. @logit
  17. def shot_list(request):
  18. shots = TenancyShotInfo.objects.values_list('model_id', flat=True).filter(tenancy_status=0, status=True).order_by('model_id')
  19. shots = set(shots)
  20. shots = ModelInfo.objects.filter(model_id__in=shots)
  21. shots = [shot.admindata for shot in shots]
  22. return response(data={
  23. 'shots': shots,
  24. })
  25. @logit
  26. def shot_detail(request):
  27. shot_id = request.POST.get('shot_id', '')
  28. try:
  29. shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)
  30. except TenancyShotInfo.DoesNotExist:
  31. return response(TenancyStatusCode.TENANCY_SHOT_NOT_FOUND)
  32. return response(data={
  33. 'shot': shot.data,
  34. })
  35. @logit
  36. def shot_request_create(request):
  37. model_id = request.POST.get('model_id', '')
  38. user_id = request.POST.get('user_id', '')
  39. name = request.POST.get('name', '')
  40. phone = request.POST.get('phone', '')
  41. postcode = request.POST.get('postcode', '')
  42. location = request.POST.get('location', '')
  43. purpose = request.POST.get('purpose', '')
  44. return_date = tc.to_date(request.POST.get('return_date', '') or settings.DEFAULT_START_DATE)
  45. req = TenancyShotRequestInfo.objects.create(
  46. model_id=model_id,
  47. user_id=user_id,
  48. name=name,
  49. phone=phone,
  50. postcode=postcode,
  51. location=location,
  52. purpose=purpose,
  53. return_date=return_date,
  54. )
  55. return response(data={
  56. 'req': req.data,
  57. })
  58. @logit
  59. def shot_request_list(request):
  60. user_id = request.POST.get('user_id', '')
  61. page = request.POST.get('page', 1)
  62. num = request.POST.get('num', 20)
  63. reqs = TenancyShotRequestInfo.objects.filter(user_id=user_id, status=True).order_by('-pk')
  64. reqs = [req.data for req in reqs]
  65. reqs, left = pagination(reqs, page, num)
  66. return response(data={
  67. 'reqs': reqs,
  68. 'left': left,
  69. })
  70. @logit
  71. def shot_request_detail(request):
  72. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  73. user_id = request.POST.get('user_id', '')
  74. try:
  75. req = TenancyShotRequestInfo.objects.get(request_id=req_id, user_id=user_id, status=True)
  76. except TenancyShotRequestInfo.DoesNotExist:
  77. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  78. return response(data={
  79. 'req': req.data,
  80. })
  81. @logit
  82. @transaction.atomic
  83. def shot_request_signed(request):
  84. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  85. user_id = request.POST.get('user_id', '')
  86. signed_images = get_query_value(request, 'signed_images', val_cast_type='listjson')
  87. try:
  88. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, user_id=user_id, status=True)
  89. except TenancyShotRequestInfo.DoesNotExist:
  90. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  91. req.tracking_signed_images = signed_images
  92. req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED
  93. request_status_at = req.request_status_at
  94. request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED] = tc.utc_string()
  95. req.request_status_at = request_status_at
  96. req.save()
  97. return response(data={
  98. 'req': req.data,
  99. })
  100. @logit
  101. @transaction.atomic
  102. def shot_request_sendback(request):
  103. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  104. user_id = request.POST.get('user_id', '')
  105. back_express_com = request.POST.get('back_express_com', '')
  106. back_express_name = request.POST.get('back_express_name', '')
  107. back_tracking_number = request.POST.get('back_tracking_number', '')
  108. try:
  109. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, user_id=user_id, status=True)
  110. except TenancyShotRequestInfo.DoesNotExist:
  111. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  112. old_back_tracking_number = req.back_tracking_number
  113. req.back_express_com = back_express_com
  114. req.back_express_name = back_express_name
  115. req.back_tracking_number = back_tracking_number
  116. req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK
  117. request_status_at = req.request_status_at
  118. request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK] = tc.utc_string()
  119. req.request_status_at = request_status_at
  120. req.save()
  121. if back_tracking_number and back_tracking_number != old_back_tracking_number:
  122. tenancy_tracking_info_subscribe(req, 'back_tracking')
  123. return response(data={
  124. 'req': req.data,
  125. })
  126. def is_tenancy_tracking_signed(tracking_info):
  127. if not tracking_info:
  128. return False
  129. items = tracking_info.get('data', [])
  130. if not items:
  131. return False
  132. return items[0].get('status') == u'签收'
  133. @transaction.atomic
  134. def tenancy_tracking_info_update(req, type_, tracking_info):
  135. is_tracking_signed = is_tenancy_tracking_signed(tracking_info)
  136. if type_ == 'tracking':
  137. req.tracking_info = tracking_info
  138. req.tracking_signed = is_tracking_signed
  139. else:
  140. req.back_tracking_info = tracking_info
  141. req.back_tracking_signed = is_tracking_signed
  142. req.save()
  143. def tenancy_tracking_info_subscribe(req, type_):
  144. callbackurl = '{}/api/tenancy/tracking/info/callback?reqpk={}&type={}'.format(settings.DOMAIN, req.pk, type_)
  145. if type_ == 'tracking':
  146. express_com = req.express_com
  147. tracking_number = req.tracking_number
  148. phone = req.phone
  149. else:
  150. express_com = req.back_express_com
  151. tracking_number = req.back_tracking_number
  152. phone = req.phone
  153. return KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl)
  154. @logit(body=True)
  155. @transaction.atomic
  156. def tenancy_tracking_info_callback(request):
  157. reqpk = request.GET.get('reqpk', '')
  158. type_ = request.GET.get('type', 'tracking') # tracking / back_tracking
  159. param = request.POST.get('param', '')
  160. if not param:
  161. return response(message='Not Param')
  162. try:
  163. callback_json = json.loads(param)
  164. except Exception:
  165. return response(message='JSON Loads Error')
  166. tracking_info = callback_json.get('lastResult', {})
  167. if not tracking_info:
  168. return response(message='Not Tracking Info')
  169. try:
  170. req = TenancyShotRequestInfo.objects.select_for_update().get(pk=reqpk, status=True)
  171. except TenancyShotRequestInfo.DoesNotExist:
  172. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  173. tenancy_tracking_info_update(req, type_, tracking_info)
  174. return JsonResponse({
  175. 'result': True,
  176. 'returnCode': '200',
  177. 'message': '成功'
  178. }, safe=False)