No Description

tenancy_admin_views.py 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import json
  4. from django.db import transaction
  5. from django.db.models import Q
  6. from django_logit import logit
  7. from django_response import response
  8. from paginator import pagination
  9. from TimeConvert import TimeConvert as tc
  10. from api.tenancy_views import tenancy_tracking_info_subscribe
  11. from kodo.decorators import check_admin
  12. from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
  13. from utils.error.errno_utils import TenancyStatusCode
  14. from utils.kuaidi.synquery import KuaiDi100
  15. @logit
  16. @check_admin
  17. def shot_list(request, administrator):
  18. page = request.POST.get('page', 1)
  19. num = request.POST.get('num', 20)
  20. tenancy_status = request.POST.get('tenancy_status', '')
  21. query = request.POST.get('query', '')
  22. model_id = request.POST.get('model_id', '')
  23. shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk')
  24. if tenancy_status != '':
  25. shots = shots.filter(tenancy_status=tenancy_status)
  26. if model_id:
  27. shots = shots.filter(model_id=model_id)
  28. if query:
  29. shots = shots.filter(Q(sn__icontains=query))
  30. count = shots.count()
  31. shots = [shot.data for shot in shots]
  32. shots, left = pagination(shots, page, num)
  33. return response(data={
  34. 'shots': shots,
  35. 'left': left,
  36. 'count': count,
  37. })
  38. @logit
  39. @check_admin
  40. def shot_detail(request, administrator):
  41. shot_id = request.POST.get('shot_id', '')
  42. try:
  43. shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)
  44. except TenancyShotInfo.DoesNotExist:
  45. return response(TenancyStatusCode.TENANCY_SHOT_NOT_FOUND)
  46. return response(data={
  47. 'shot': shot.data,
  48. })
  49. @logit
  50. @check_admin
  51. def shot_create(request, administrator):
  52. model_id = request.POST.get('model_id', '')
  53. model_name = request.POST.get('model_name', '')
  54. sn = request.POST.get('sn', '')
  55. tenancy_status = request.POST.get('tenancy_status', 0)
  56. shot = TenancyShotInfo.objects.create(
  57. model_id=model_id,
  58. model_name=model_name,
  59. sn=sn,
  60. )
  61. return response(data={
  62. 'shot': shot.data,
  63. })
  64. @logit
  65. @check_admin
  66. def shot_update(request, administrator):
  67. shot_id = request.POST.get('shot_id', '')
  68. model_id = request.POST.get('model_id', '')
  69. model_name = request.POST.get('model_name', '')
  70. sn = request.POST.get('sn', '')
  71. tenancy_status = request.POST.get('tenancy_status', 0)
  72. shot, _ = TenancyShotInfo.objects.update_or_create(shot_id=shot_id, defaults={
  73. 'model_id': model_id,
  74. 'model_name': model_name,
  75. 'sn': sn,
  76. 'tenancy_status': tenancy_status,
  77. })
  78. return response(data={
  79. 'shot': shot.data,
  80. })
  81. @logit
  82. @check_admin
  83. def shot_request_list(request, administrator):
  84. page = request.POST.get('page', 1)
  85. num = request.POST.get('num', 20)
  86. query = request.POST.get('query', '')
  87. start_time = request.POST.get('start_time', '')
  88. end_time = request.POST.get('end_time', '')
  89. request_status = request.POST.get('request_status', 'all')
  90. reqs = TenancyShotRequestInfo.objects.filter(status=True).order_by('-pk')
  91. if query:
  92. shots = list(TenancyShotInfo.objects.values_list('shot_id', flat=True).filter(sn__icontains=query))
  93. reqs = reqs.filter(Q(phone__icontains=query) | Q(name__icontains=query) | Q(shot_id__in=shots))
  94. if request_status != 'all':
  95. reqs = reqs.filter(request_status=request_status)
  96. if start_time and end_time:
  97. start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d')
  98. end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S')
  99. reqs = reqs.filter(created_at__range=(start_time, end_time))
  100. count = reqs.count()
  101. reqs = [req.admindata for req in reqs]
  102. reqs, left = pagination(reqs, page, num)
  103. return response(data={
  104. 'reqs': reqs,
  105. 'left': left,
  106. 'count': count,
  107. })
  108. @logit
  109. @check_admin
  110. def shot_request_detail(request, administrator):
  111. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  112. try:
  113. req = TenancyShotRequestInfo.objects.get(request_id=req_id, status=True)
  114. except TenancyShotRequestInfo.DoesNotExist:
  115. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  116. return response(data={
  117. 'req': req.admindata,
  118. })
  119. @logit
  120. @check_admin
  121. @transaction.atomic
  122. def shot_request_update(request, administrator):
  123. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  124. shot_id = request.POST.get('shot_id', '')
  125. name = request.POST.get('name', '')
  126. phone = request.POST.get('phone', '')
  127. postcode = request.POST.get('postcode', '')
  128. location = request.POST.get('location', '')
  129. purpose = request.POST.get('purpose', '')
  130. return_date = request.POST.get('return_date', '')
  131. request_status = request.POST.get('request_status', '')
  132. express_name = request.POST.get('express_name', '')
  133. express_com = request.POST.get('express_com', '')
  134. tracking_number = request.POST.get('tracking_number', '')
  135. back_express_name = request.POST.get('back_express_name', '')
  136. back_express_com = request.POST.get('back_express_com', '')
  137. back_tracking_number = request.POST.get('back_tracking_number', '')
  138. try:
  139. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  140. except TenancyShotRequestInfo.DoesNotExist:
  141. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  142. old_tracking_number = req.tracking_number
  143. old_back_tracking_number = req.back_tracking_number
  144. if req.admin_id and req.admin_id != administrator.admin_id:
  145. return response(40001, 'No permission', '不是经办人,没有权限')
  146. if shot_id:
  147. req.shot_id = shot_id
  148. if name:
  149. req.name = name
  150. if phone:
  151. req.phone = phone
  152. if postcode:
  153. req.postcode = postcode
  154. if location:
  155. req.location = location
  156. if purpose:
  157. req.purpose = purpose
  158. if return_date:
  159. req.return_date = tc.to_date(return_date)
  160. if request_status:
  161. req.request_status = request_status
  162. if express_name:
  163. req.express_name = express_name
  164. if express_com:
  165. req.express_com = express_com
  166. if tracking_number:
  167. req.tracking_number = tracking_number
  168. if back_express_name:
  169. req.back_express_name = back_express_name
  170. if back_express_com:
  171. req.back_express_com = back_express_com
  172. if back_tracking_number:
  173. req.back_tracking_number = back_tracking_number
  174. req.save()
  175. if tracking_number and tracking_number != old_tracking_number:
  176. tenancy_tracking_info_subscribe(req, 'tracking')
  177. if back_tracking_number and back_tracking_number != old_back_tracking_number:
  178. tenancy_tracking_info_subscribe(req, 'back_tracking')
  179. return response(data={
  180. 'req': req.admindata,
  181. })
  182. @logit
  183. @check_admin
  184. @transaction.atomic
  185. def shot_request_audit(request, administrator):
  186. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  187. audit_status = request.POST.get('audit_status', 0)
  188. try:
  189. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  190. except TenancyShotRequestInfo.DoesNotExist:
  191. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  192. req.audit_status = audit_status
  193. req.save()
  194. return response(data={
  195. 'req': req.admindata,
  196. })
  197. @logit
  198. @check_admin
  199. @transaction.atomic
  200. def shot_request_send(request, administrator):
  201. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  202. express_name = request.POST.get('express_name', '')
  203. express_com = request.POST.get('express_com', '')
  204. tracking_number = request.POST.get('tracking_number', '')
  205. shot_id = request.POST.get('shot_id', '')
  206. front_cap_status = request.POST.get('front_cap_status', 0)
  207. rear_cap_status = request.POST.get('rear_cap_status', 0)
  208. lens_hood_status = request.POST.get('lens_hood_status', 0)
  209. tripod_ring_status = request.POST.get('tripod_ring_status', 0)
  210. appearance_performance_status = request.POST.get('appearance_performance_status', 0)
  211. try:
  212. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  213. except TenancyShotRequestInfo.DoesNotExist:
  214. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  215. try:
  216. shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)
  217. except TenancyShotInfo.DoesNotExist:
  218. return response()
  219. if req.admin_id and req.admin_id != administrator.admin_id:
  220. return response(40001, 'No permission', '不是经办人,没有权限')
  221. old_tracking_number = req.tracking_number
  222. req.admin_id = administrator.admin_id
  223. req.express_name = express_name
  224. req.express_com = express_com
  225. req.tracking_number = tracking_number
  226. req.shot_id = shot_id
  227. req.front_cap_status = front_cap_status
  228. req.rear_cap_status = rear_cap_status
  229. req.lens_hood_status = lens_hood_status
  230. req.tripod_ring_status = tripod_ring_status
  231. req.appearance_performance_status = appearance_performance_status
  232. req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND
  233. request_status_at = req.request_status_at
  234. request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_SEND] = tc.utc_string()
  235. req.request_status_at = request_status_at
  236. req.save()
  237. shot.front_cap_status = front_cap_status
  238. shot.rear_cap_status = rear_cap_status
  239. shot.lens_hood_status = lens_hood_status
  240. shot.tripod_ring_status = tripod_ring_status
  241. shot.appearance_performance_status = appearance_performance_status
  242. shot.tenancy_status = 1
  243. shot.save()
  244. if tracking_number and tracking_number != old_tracking_number:
  245. tenancy_tracking_info_subscribe(req, 'tracking')
  246. return response(data={
  247. 'req': req.admindata,
  248. })
  249. @logit
  250. @check_admin
  251. @transaction.atomic
  252. def shot_request_signed(request, administrator):
  253. req_id = request.POST.get('req_id') or request.POST.get('request_id')
  254. try:
  255. req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
  256. except TenancyShotRequestInfo.DoesNotExist:
  257. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  258. if req.admin_id and req.admin_id != administrator.admin_id:
  259. return response(40001, 'No permission', '不是经办人,没有权限')
  260. req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED
  261. request_status_at = req.request_status_at
  262. request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED] = tc.utc_string()
  263. req.request_status_at = request_status_at
  264. req.save()
  265. TenancyShotInfo.objects.filter(shot_id=req.shot_id).update(tenancy_status=0)
  266. return response(data={
  267. 'req': req.admindata,
  268. })
  269. @logit
  270. @check_admin
  271. def shot_request_tracking_info(request, administrator):
  272. request_id = request.POST.get('request_id', '')
  273. type_ = request.POST.get('type', 'tracking') # tracking / back_tracking
  274. try:
  275. req = TenancyShotRequestInfo.objects.get(request_id=request_id, status=True)
  276. except TenancyShotRequestInfo.DoesNotExist:
  277. return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
  278. tracking_info = {}
  279. if type_ == 'tracking':
  280. if req.express_com and req.tracking_number:
  281. tracking_info = get_tracking_info(req.express_com, req.tracking_number, req.phone)
  282. req.tracking_info = tracking_info
  283. req.save()
  284. else:
  285. if req.back_express_com and req.back_tracking_number:
  286. tracking_info = get_tracking_info(req.back_express_com, req.back_tracking_number, req.phone)
  287. req.back_tracking_info = tracking_info
  288. req.save()
  289. if tracking_info:
  290. tenancy_tracking_info_subscribe(req, type_)
  291. return response(data={
  292. 'type': type_,
  293. 'tracking_info': tracking_info,
  294. })
  295. def get_tracking_info(express_com, tracking_number, phone):
  296. tracking_info = KuaiDi100().track(express_com, tracking_number, phone=phone)
  297. if tracking_info:
  298. try:
  299. tracking_info = json.loads(tracking_info)
  300. except Exception:
  301. tracking_info = {}
  302. return tracking_info