| 
              # -*- coding: utf-8 -*-
from __future__ import division
import json
from django.conf import settings
from django_logit import logit
from django_response import response
from paginator import pagination
from TimeConvert import TimeConvert as tc
from maintenance.models import ExpressCompanyInfo, MaintenaceInfo
from utils.admin_utils import is_admin, is_maintenanceman
from utils.error.errno_utils import MaintenanceStatusCode
from utils.kuaidi.synquery import KuaiDi100
@logit
def maintenance_add(request):
    user_id = request.POST.get('user_id', '')
    name = request.POST.get('name', '')
    phone = request.POST.get('phone', '')
    address = request.POST.get('address', '')
    model_id = request.POST.get('model_id', '')
    log_id = request.POST.get('log_id', '')
    sn = request.POST.get('sn', '')
    desc = request.POST.get('desc', '')
    point_id = request.POST.get('point_id', '')
    point_name = request.POST.get('point_name', '')
    express_name = request.POST.get('express_name', '')
    tracking_number = request.POST.get('tracking_number', '')
    maintenance_status = request.POST.get('maintenance_status', u'寄出运送中')
    try:
        company = ExpressCompanyInfo.objects.get(name=express_name, status=True)
    except ExpressCompanyInfo.DoesNotExist:
        company = None
    maintenance = MaintenaceInfo.objects.create(
        user_id=user_id,
        name=name,
        phone=phone,
        address=address,
        model_id=model_id,
        log_id=log_id,
        sn=sn,
        desc=desc,
        point_id=point_id,
        point_name=point_name,
        express_name=express_name,
        express_com=company.com if company else '',
        tracking_number=tracking_number,
        maintenance_status=maintenance_status,
        maintenance_status_at={maintenance_status: tc.utc_datetime()}
    )
    return response(data={
        'maintenance_id': maintenance.id,
    })
@logit
def maintenance_delete(request):
    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
    maintenance_id = request.POST.get('maintenance_id', '')
    user_id = request.POST.get('user_id', '')
    try:
        maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
    except MaintenaceInfo.DoesNotExist:
        return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
    if user_id != maintenance.user_id and not is_maintenanceman(brand_id, user_id):
        return response(MaintenanceStatusCode.MAINTENACE_PERMISSION_DENIED)
    maintenance.status = False
    maintenance.save()
    return response()
@logit
def maintenance_update(request):
    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
    maintenance_id = request.POST.get('maintenance_id', '')
    admin_id = request.POST.get('admin_id', '')
    user_id = request.POST.get('user_id', '')
    name = request.POST.get('name', '')
    phone = request.POST.get('phone', '')
    address = request.POST.get('address', '')
    sn = request.POST.get('sn', '')
    desc = request.POST.get('desc', '')
    point_id = request.POST.get('point_id', '')
    point_name = request.POST.get('point_name', '')
    express_name = request.POST.get('express_name', '')
    tracking_number = request.POST.get('tracking_number', '')
    back_express_name = request.POST.get('back_express_name', '')
    back_tracking_number = request.POST.get('back_tracking_number', '')
    maintenance_status = request.POST.get('maintenance_status', u'寄出运送中')
    try:
        maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
    except MaintenaceInfo.DoesNotExist:
        return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
    if user_id != maintenance.user_id and not is_admin(brand_id, admin_id):
        return response(MaintenanceStatusCode.MAINTENACE_PERMISSION_DENIED)
    if name:
        maintenance.name = name
    if phone:
        maintenance.phone = phone
    if address:
        maintenance.address = address
    if sn:
        maintenance.sn = sn
    if desc:
        maintenance.desc = desc
    if point_id:
        maintenance.point_id = point_id
    if point_name:
        maintenance.point_name = point_name
    if express_name:
        try:
            company = ExpressCompanyInfo.objects.get(name=express_name, status=True)
        except ExpressCompanyInfo.DoesNotExist:
            company = None
        maintenance.express_name = express_name
        maintenance.express_com = company.com if company else ''
    if tracking_number:
        maintenance.tracking_number = tracking_number
    if back_express_name:
        try:
            company = ExpressCompanyInfo.objects.get(name=back_express_name, status=True)
        except ExpressCompanyInfo.DoesNotExist:
            company = None
        maintenance.back_express_name = back_express_name
        maintenance.back_express_com = company.com if company else ''
    if back_tracking_number:
        maintenance.back_tracking_number = back_tracking_number
    if maintenance_status:
        maintenance.maintenance_status = maintenance_status
        maintenance_status_at = maintenance.maintenance_status_at
        maintenance_status_at[maintenance_status] = tc.utc_datetime()
        maintenance.maintenance_status_at = maintenance_status_at
    maintenance.save()
    return response()
@logit
def maintenance_list(request):
    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
    admin_id = request.POST.get('admin_id', '')
    user_id = request.POST.get('user_id', '')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)
    maintenances = MaintenaceInfo.objects.filter(status=True)
    if not is_admin(brand_id, admin_id):
        maintenances = maintenances.filter(user_id=user_id)
    count = maintenances.count()
    maintenances = [maintenance.data for maintenance in maintenances]
    maintenances, left = pagination(maintenances, page, num)
    return response(data={
        'maintenaces': maintenances,
        'count': count,
        'left': left,
    })
@logit
def maintenance_detail(request):
    maintenance_id = request.POST.get('maintenance_id', '')
    try:
        maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
    except MaintenaceInfo.DoesNotExist:
        return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
    return response(data={
        'maintenace': maintenance.data,
    })
def is_tracking_signed(tracking_info):
    if not tracking_info:
        return False
    items = tracking_info.get('data', [])
    if not items:
        return False
    return items[0].get('status') == u'签收'
@logit
def maintenance_tracking_info(request):
    maintenance_id = request.POST.get('maintenance_id', '')
    type_ = request.POST.get('type', 'tracking')  # tracking / back_tracking
    try:
        maintenance = MaintenaceInfo.objects.get(id=maintenance_id, status=True)
    except MaintenaceInfo.DoesNotExist:
        return response(MaintenanceStatusCode.MAINTENACE_NOT_FOUND)
    tracking_info = {}
    if type_ == 'tracking':
        if maintenance.express_com and maintenance.tracking_number:
            tracking_info = KuaiDi100().track(maintenance.express_com, maintenance.tracking_number)
    else:
        if maintenance.back_express_com and maintenance.back_tracking_number:
            tracking_info = KuaiDi100().track(maintenance.back_express_com, maintenance.back_tracking_number)
    if tracking_info:
        try:
            tracking_info = json.loads(tracking_info)
        except Exception:
            tracking_info = {}
    if tracking_info:
        if type_ == 'tracking':
            maintenance.tracking_info = tracking_info
            maintenance.tracking_signed = is_tracking_signed(tracking_info)
        else:
            maintenance.back_tracking_info = tracking_info
            maintenance.back_tracking_signed = is_tracking_signed(tracking_info)
        maintenance.save()
    return response(data={
        'type': type_,
        'tracking_info': tracking_info,
    })
 
  |