|  | # -*- coding: utf-8 -*-
from __future__ import division
import json
from django.conf import settings
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 account.models import UserInfo
from api.tenancy_views import tenancy_tracking_info_subscribe
from kodo.decorators import check_admin
from pre.custom_message import sendtemplatemessage
from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo
from utils.error.errno_utils import TenancyStatusCode
from utils.kuaidi.synquery import KuaiDi100
WECHAT = settings.WECHAT
@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)
    if TenancyShotInfo.objects.filter(model_id=model_id, sn=sn).exists():
        return response(TenancyStatusCode.TENANCY_SHOT_ALREADY_EXIST)
    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_delete(request, administrator):
    shot_id = request.POST.get('shot_id', '')
    TenancyShotInfo.objects.filter(shot_id=shot_id).update(admin_id=administrator.admin_id, status=False)
    return response()
@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', '')
    model_id = request.POST.get('model_id', '')
    target_admin_id = request.POST.get('target_admin_id', '')
    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) | Q(request_number__icontains=query))
    if model_id:
        reqs = reqs.filter(model_id=model_id)
    if target_admin_id:
        reqs = reqs.filter(admin_id=target_admin_id)
    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')
    request_number = request.POST.get('request_number', '')
    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', '')
    remark = request.POST.get('remark', '')
    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 request_number:
        req.request_number = request_number
    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
    if remark:
        req.remark = remark
    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
def shot_request_delete(request, administrator):
    req_id = request.POST.get('req_id') or request.POST.get('request_id')
    TenancyShotRequestInfo.objects.filter(request_id=req_id, status=True).update(admin_id=administrator.admin_id, status=False)
    return response()
@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')
    request_number = request.POST.get('request_number', '')
    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.request_number = request_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()
    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()
    try:
        user = UserInfo.objects.get(user_id=req.user_id)
    except UserInfo.DoesNotExist:
        return response()
    if tracking_number and tracking_number != old_tracking_number:
        tenancy_tracking_info_subscribe(req, 'tracking')
        data = {
            "first": {
                "value": u'镜头租用申请已通过',
            },
            "thing2": {
                "value": req.name,
            },
            "character_string3": {
                "value": shot.data['model_info']['model_name'],
            },
            "character_string4": {
                "value": shot.sn,
            },
            "remark": {
                "value": u'快递已寄出,请注意查收~~~',
            }
        }
        wxcfg = WECHAT.get('MINIAPP', {})
        appid = wxcfg.get('appID')
        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))
    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
 |