| 
              # -*- 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', '')
    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', '')
    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('model_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 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()
    old_tracking_number = req.tracking_number
    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()
    TenancyShotInfo.objects.filter(shot_id=req.shot_id).update(tenancy_status=1)
    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()
    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
 
  |