|
# -*- coding: utf-8 -*-
from __future__ import division
import json
from django.db import transaction
from django.db.models import Q
from django_logit import logit
from django_response import response
from paginator import pagination
from TimeConvert import TimeConvert as tc
from api.tenancy_views import tenancy_tracking_info_subscribe
from kodo.decorators import check_admin
from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
from utils.error.errno_utils import TenancyStatusCode
from utils.kuaidi.synquery import KuaiDi100
@logit
@check_admin
def shot_list(request, administrator):
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
tenancy_status = request.POST.get('tenancy_status', '')
query = request.POST.get('query', '')
model_id = request.POST.get('model_id', '')
shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk')
if tenancy_status != '':
shots = shots.filter(tenancy_status=tenancy_status)
if model_id:
shots = shots.filter(model_id=model_id)
if query:
shots = shots.filter(Q(sn__icontains=query))
count = shots.count()
shots = [shot.data for shot in shots]
shots, left = pagination(shots, page, num)
return response(data={
'shots': shots,
'left': left,
'count': count,
})
@logit
@check_admin
def shot_detail(request, administrator):
shot_id = request.POST.get('shot_id', '')
try:
shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)
except TenancyShotInfo.DoesNotExist:
return response(TenancyStatusCode.TENANCY_SHOT_NOT_FOUND)
return response(data={
'shot': shot.data,
})
@logit
@check_admin
def shot_create(request, administrator):
model_id = request.POST.get('model_id', '')
model_name = request.POST.get('model_name', '')
sn = request.POST.get('sn', '')
tenancy_status = request.POST.get('tenancy_status', 0)
shot = TenancyShotInfo.objects.create(
model_id=model_id,
model_name=model_name,
sn=sn,
)
return response(data={
'shot': shot.data,
})
@logit
@check_admin
def shot_update(request, administrator):
shot_id = request.POST.get('shot_id', '')
model_id = request.POST.get('model_id', '')
model_name = request.POST.get('model_name', '')
sn = request.POST.get('sn', '')
tenancy_status = request.POST.get('tenancy_status', 0)
shot, _ = TenancyShotInfo.objects.update_or_create(shot_id=shot_id, defaults={
'model_id': model_id,
'model_name': model_name,
'sn': sn,
'tenancy_status': tenancy_status,
})
return response(data={
'shot': shot.data,
})
@logit
@check_admin
def shot_request_list(request, administrator):
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
query = request.POST.get('query', '')
start_time = request.POST.get('start_time', '')
end_time = request.POST.get('end_time', '')
request_status = request.POST.get('request_status', 'all')
reqs = TenancyShotRequestInfo.objects.filter(status=True).order_by('-pk')
if query:
shots = list(TenancyShotInfo.objects.values_list('shot_id', flat=True).filter(sn__icontains=query))
reqs = reqs.filter(Q(phone__icontains=query) | Q(name__icontains=query) | Q(shot_id__in=shots))
if request_status != 'all':
reqs = reqs.filter(request_status=request_status)
if start_time and end_time:
start_time = tc.string_to_utc_datetime(start_time, format='%Y%m%d')
end_time = tc.string_to_utc_datetime(end_time + ' 23:59:59', format='%Y%m%d %H:%M:%S')
reqs = reqs.filter(created_at__range=(start_time, end_time))
count = reqs.count()
reqs = [req.admindata for req in reqs]
reqs, left = pagination(reqs, page, num)
return response(data={
'reqs': reqs,
'left': left,
'count': count,
})
@logit
@check_admin
def shot_request_detail(request, administrator):
req_id = request.POST.get('req_id') or request.POST.get('request_id')
try:
req = TenancyShotRequestInfo.objects.get(request_id=req_id, status=True)
except TenancyShotRequestInfo.DoesNotExist:
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
return response(data={
'req': req.admindata,
})
@logit
@check_admin
@transaction.atomic
def shot_request_update(request, administrator):
req_id = request.POST.get('req_id') or request.POST.get('request_id')
shot_id = request.POST.get('shot_id', '')
name = request.POST.get('name', '')
phone = request.POST.get('phone', '')
postcode = request.POST.get('postcode', '')
location = request.POST.get('location', '')
purpose = request.POST.get('purpose', '')
return_date = request.POST.get('return_date', '')
request_status = request.POST.get('request_status', '')
express_name = request.POST.get('express_name', '')
express_com = request.POST.get('express_com', '')
tracking_number = request.POST.get('tracking_number', '')
back_express_name = request.POST.get('back_express_name', '')
back_express_com = request.POST.get('back_express_com', '')
back_tracking_number = request.POST.get('back_tracking_number', '')
try:
req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
except TenancyShotRequestInfo.DoesNotExist:
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
old_tracking_number = req.tracking_number
old_back_tracking_number = req.back_tracking_number
if req.admin_id and req.admin_id != administrator.admin_id:
return response(40001, 'No permission', '不是经办人,没有权限')
if shot_id:
req.shot_id = shot_id
if name:
req.name = name
if phone:
req.phone = phone
if postcode:
req.postcode = postcode
if location:
req.location = location
if purpose:
req.purpose = purpose
if return_date:
req.return_date = tc.to_date(return_date)
if request_status:
req.request_status = request_status
if express_name:
req.express_name = express_name
if express_com:
req.express_com = express_com
if tracking_number:
req.tracking_number = tracking_number
if back_express_name:
req.back_express_name = back_express_name
if back_express_com:
req.back_express_com = back_express_com
if back_tracking_number:
req.back_tracking_number = back_tracking_number
req.save()
if tracking_number and tracking_number != old_tracking_number:
tenancy_tracking_info_subscribe(req, 'tracking')
if back_tracking_number and back_tracking_number != old_back_tracking_number:
tenancy_tracking_info_subscribe(req, 'back_tracking')
return response(data={
'req': req.admindata,
})
@logit
@check_admin
@transaction.atomic
def shot_request_audit(request, administrator):
req_id = request.POST.get('req_id') or request.POST.get('request_id')
audit_status = request.POST.get('audit_status', 0)
try:
req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
except TenancyShotRequestInfo.DoesNotExist:
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
req.audit_status = audit_status
req.save()
return response(data={
'req': req.admindata,
})
@logit
@check_admin
@transaction.atomic
def shot_request_send(request, administrator):
req_id = request.POST.get('req_id') or request.POST.get('request_id')
express_name = request.POST.get('express_name', '')
express_com = request.POST.get('express_com', '')
tracking_number = request.POST.get('tracking_number', '')
shot_id = request.POST.get('shot_id', '')
front_cap_status = request.POST.get('front_cap_status', 0)
rear_cap_status = request.POST.get('rear_cap_status', 0)
lens_hood_status = request.POST.get('lens_hood_status', 0)
tripod_ring_status = request.POST.get('tripod_ring_status', 0)
appearance_performance_status = request.POST.get('appearance_performance_status', 0)
try:
req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
except TenancyShotRequestInfo.DoesNotExist:
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
try:
shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)
except TenancyShotInfo.DoesNotExist:
return response()
if req.admin_id and req.admin_id != administrator.admin_id:
return response(40001, 'No permission', '不是经办人,没有权限')
old_tracking_number = req.tracking_number
req.admin_id = administrator.admin_id
req.express_name = express_name
req.express_com = express_com
req.tracking_number = tracking_number
req.shot_id = shot_id
req.front_cap_status = front_cap_status
req.rear_cap_status = rear_cap_status
req.lens_hood_status = lens_hood_status
req.tripod_ring_status = tripod_ring_status
req.appearance_performance_status = appearance_performance_status
req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND
request_status_at = req.request_status_at
request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_SEND] = tc.utc_string()
req.request_status_at = request_status_at
req.save()
shot.front_cap_status = front_cap_status
shot.rear_cap_status = rear_cap_status
shot.lens_hood_status = lens_hood_status
shot.tripod_ring_status = tripod_ring_status
shot.appearance_performance_status = appearance_performance_status
shot.tenancy_status = 1
shot.save()
if tracking_number and tracking_number != old_tracking_number:
tenancy_tracking_info_subscribe(req, 'tracking')
return response(data={
'req': req.admindata,
})
@logit
@check_admin
@transaction.atomic
def shot_request_signed(request, administrator):
req_id = request.POST.get('req_id') or request.POST.get('request_id')
try:
req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True)
except TenancyShotRequestInfo.DoesNotExist:
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
if req.admin_id and req.admin_id != administrator.admin_id:
return response(40001, 'No permission', '不是经办人,没有权限')
req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED
request_status_at = req.request_status_at
request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK_SIGNED] = tc.utc_string()
req.request_status_at = request_status_at
req.save()
TenancyShotInfo.objects.filter(shot_id=req.shot_id).update(tenancy_status=0)
return response(data={
'req': req.admindata,
})
@logit
@check_admin
def shot_request_tracking_info(request, administrator):
request_id = request.POST.get('request_id', '')
type_ = request.POST.get('type', 'tracking') # tracking / back_tracking
try:
req = TenancyShotRequestInfo.objects.get(request_id=request_id, status=True)
except TenancyShotRequestInfo.DoesNotExist:
return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND)
tracking_info = {}
if type_ == 'tracking':
if req.express_com and req.tracking_number:
tracking_info = get_tracking_info(req.express_com, req.tracking_number, req.phone)
req.tracking_info = tracking_info
req.save()
else:
if req.back_express_com and req.back_tracking_number:
tracking_info = get_tracking_info(req.back_express_com, req.back_tracking_number, req.phone)
req.back_tracking_info = tracking_info
req.save()
if tracking_info:
tenancy_tracking_info_subscribe(req, type_)
return response(data={
'type': type_,
'tracking_info': tracking_info,
})
def get_tracking_info(express_com, tracking_number, phone):
tracking_info = KuaiDi100().track(express_com, tracking_number, phone=phone)
if tracking_info:
try:
tracking_info = json.loads(tracking_info)
except Exception:
tracking_info = {}
return tracking_info
|