No Description

tenancy_admin_views.py 14KB

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