Няма описание

tenancy_views.py 7.1KB

    # -*- coding: utf-8 -*- from __future__ import division import json from django.conf import settings from django.db import transaction from django_logit import logit from django_query import get_query_value from django_response import response from json_response import JsonResponse from paginator import pagination from TimeConvert import TimeConvert as tc from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo from mch.models import ModelInfo from utils.error.errno_utils import TenancyStatusCode from utils.kuaidi.subscribe import KuaiDi100 as KuaiDi100Subscribe @logit def shot_list(request): shots = TenancyShotInfo.objects.values_list('model_id', flat=True).filter(tenancy_status=0, status=True).order_by('model_id') shots = set(shots) shots = ModelInfo.objects.filter(model_id__in=shots) shots = [shot.admindata for shot in shots] return response(data={ 'shots': shots, }) @logit def shot_detail(request): 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 def shot_request_create(request): model_id = request.POST.get('model_id', '') user_id = request.POST.get('user_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 = tc.to_date(request.POST.get('return_date', '') or settings.DEFAULT_START_DATE) req = TenancyShotRequestInfo.objects.create( model_id=model_id, user_id=user_id, name=name, phone=phone, postcode=postcode, location=location, purpose=purpose, return_date=return_date, ) return response(data={ 'req': req.data, }) @logit def shot_request_list(request): user_id = request.POST.get('user_id', '') page = request.POST.get('page', 1) num = request.POST.get('num', 20) reqs = TenancyShotRequestInfo.objects.filter(user_id=user_id, status=True).order_by('-pk') reqs = [req.data for req in reqs] reqs, left = pagination(reqs, page, num) return response(data={ 'reqs': reqs, 'left': left, }) @logit def shot_request_detail(request): req_id = request.POST.get('req_id') or request.POST.get('request_id') user_id = request.POST.get('user_id', '') try: req = TenancyShotRequestInfo.objects.get(request_id=req_id, user_id=user_id, status=True) except TenancyShotRequestInfo.DoesNotExist: return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) return response(data={ 'req': req.data, }) @logit @transaction.atomic def shot_request_signed(request): req_id = request.POST.get('req_id') or request.POST.get('request_id') user_id = request.POST.get('user_id', '') signed_images = get_query_value(request, 'signed_images', val_cast_type='listjson') try: req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, user_id=user_id, status=True) except TenancyShotRequestInfo.DoesNotExist: return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) req.tracking_signed_images = signed_images req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED request_status_at = req.request_status_at request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_SEND_SIGNED] = tc.utc_string() req.request_status_at = request_status_at req.save() return response(data={ 'req': req.data, }) @logit @transaction.atomic def shot_request_sendback(request): req_id = request.POST.get('req_id') or request.POST.get('request_id') user_id = request.POST.get('user_id', '') back_express_com = request.POST.get('back_express_com', '') back_express_name = request.POST.get('back_express_name', '') back_tracking_number = request.POST.get('back_tracking_number', '') try: req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, user_id=user_id, status=True) except TenancyShotRequestInfo.DoesNotExist: return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) old_back_tracking_number = req.back_tracking_number req.back_express_com = back_express_com req.back_express_name = back_express_name req.back_tracking_number = back_tracking_number req.request_status = TenancyShotRequestInfo.TENANCY_TRACKING_BACK request_status_at = req.request_status_at request_status_at[TenancyShotRequestInfo.TENANCY_TRACKING_BACK] = tc.utc_string() req.request_status_at = request_status_at req.save() if back_tracking_number and back_tracking_number != old_back_tracking_number: tenancy_tracking_info_subscribe(req, 'back_tracking') return response(data={ 'req': req.data, }) def is_tenancy_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'签收' @transaction.atomic def tenancy_tracking_info_update(req, type_, tracking_info): is_tracking_signed = is_tenancy_tracking_signed(tracking_info) if type_ == 'tracking': req.tracking_info = tracking_info req.tracking_signed = is_tracking_signed else: req.back_tracking_info = tracking_info req.back_tracking_signed = is_tracking_signed req.save() def tenancy_tracking_info_subscribe(req, type_): callbackurl = '{}/api/tenancy/tracking/info/callback?reqpk={}&type={}'.format(settings.DOMAIN, req.pk, type_) if type_ == 'tracking': express_com = req.express_com tracking_number = req.tracking_number phone = req.phone else: express_com = req.back_express_com tracking_number = req.back_tracking_number phone = req.phone return KuaiDi100Subscribe().submit(express_com, tracking_number, phone=phone, callbackurl=callbackurl) @logit(body=True) @transaction.atomic def tenancy_tracking_info_callback(request): reqpk = request.GET.get('reqpk', '') type_ = request.GET.get('type', 'tracking') # tracking / back_tracking param = request.POST.get('param', '') if not param: return response(message='Not Param') try: callback_json = json.loads(param) except Exception: return response(message='JSON Loads Error') tracking_info = callback_json.get('lastResult', {}) if not tracking_info: return response(message='Not Tracking Info') try: req = TenancyShotRequestInfo.objects.select_for_update().get(pk=reqpk, status=True) except TenancyShotRequestInfo.DoesNotExist: return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) tenancy_tracking_info_update(req, type_, tracking_info) return JsonResponse({ 'result': True, 'returnCode': '200', 'message': '成功' }, safe=False)