|
# -*- coding: utf-8 -*-
from __future__ import division
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', '')
shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk')
if tenancy_status != '':
shots = shots.filter(tenancy_status=tenancy_status)
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', '')
front_cap_status = request.POST.get('front_cap_status', 1)
rear_cap_status = request.POST.get('rear_cap_status', 1)
lens_hood_status = request.POST.get('lens_hood_status', 1)
tripod_ring_status = request.POST.get('tripod_ring_status', 1)
appearance_performance_status = request.POST.get('appearance_performance_status', 1)
tenancy_status = request.POST.get('tenancy_status', 0)
shot = TenancyShotInfo.objects.create(
model_id=model_id,
model_name=model_name,
sn=sn,
front_cap_status=front_cap_status,
rear_cap_status=rear_cap_status,
lens_hood_status=lens_hood_status,
tripod_ring_status=tripod_ring_status,
appearance_performance_status=appearance_performance_status,
tenancy_status=tenancy_status,
)
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', '')
front_cap_status = request.POST.get('front_cap_status', 1)
rear_cap_status = request.POST.get('rear_cap_status', 1)
lens_hood_status = request.POST.get('lens_hood_status', 1)
tripod_ring_status = request.POST.get('tripod_ring_status', 1)
appearance_performance_status = request.POST.get('appearance_performance_status', 1)
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,
'front_cap_status': front_cap_status,
'rear_cap_status': rear_cap_status,
'lens_hood_status': lens_hood_status,
'tripod_ring_status': tripod_ring_status,
'appearance_performance_status': appearance_performance_status,
'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:
reqs = reqs.filter(Q(phone__icontains=query) | Q(name__icontains=query))
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 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', '')
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
req.express_name = express_name
req.express_com = express_com
req.tracking_number = tracking_number
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()
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)
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()
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.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.back_tracking_info = tracking_info
req.save()
if tracking_info:
tenancy_tracking_info_subscribe(req, 'tracking')
return response(data={
'type': type_,
'tracking_info': tracking_info,
})
def get_tracking_info(express_com, tracking_number):
tracking_info = KuaiDi100().track(express_com, tracking_number)
if tracking_info:
try:
tracking_info = json.loads(tracking_info)
except:
tracking_info = {}
return tracking_info
|