| @@ -2,13 +2,14 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from __future__ import division | 
| 4 | 4 |  | 
| 5 | -from django.conf import settings | |
| 5 | +from django.db import transaction | |
| 6 | 6 | from django_logit import logit | 
| 7 | 7 | from django_response import response | 
| 8 | 8 | from paginator import pagination | 
| 9 | +from TimeConvert import TimeConvert as tc | |
| 9 | 10 |  | 
| 10 | 11 | from kodo.decorators import check_admin | 
| 11 | -from tenancy.models import TenancyShotInfo | |
| 12 | +from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo | |
| 12 | 13 | from utils.error.errno_utils import TenancyStatusCode | 
| 13 | 14 |  | 
| 14 | 15 |  | 
| @@ -31,7 +32,6 @@ def shot_list(request, administrator): | ||
| 31 | 32 | @logit | 
| 32 | 33 | @check_admin | 
| 33 | 34 | def shot_detail(request, administrator): | 
| 34 | -    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | |
| 35 | 35 |      shot_id = request.POST.get('shot_id', '') | 
| 36 | 36 |  | 
| 37 | 37 | try: | 
| @@ -47,7 +47,6 @@ def shot_detail(request, administrator): | ||
| 47 | 47 | @logit | 
| 48 | 48 | @check_admin | 
| 49 | 49 | def shot_create(request, administrator): | 
| 50 | -    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | |
| 51 | 50 |      model_name = request.POST.get('model_name', '') | 
| 52 | 51 |      sn = request.POST.get('sn', '') | 
| 53 | 52 |      fittings_type = request.POST.get('fittings_type', 0) | 
| @@ -68,7 +67,6 @@ def shot_create(request, administrator): | ||
| 68 | 67 | @logit | 
| 69 | 68 | @check_admin | 
| 70 | 69 | def shot_update(request, administrator): | 
| 71 | -    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | |
| 72 | 70 |      shot_id = request.POST.get('shot_id', '') | 
| 73 | 71 |      model_name = request.POST.get('model_name', '') | 
| 74 | 72 |      sn = request.POST.get('sn', '') | 
| @@ -85,3 +83,141 @@ def shot_update(request, administrator): | ||
| 85 | 83 |      return response(data={ | 
| 86 | 84 | 'shot': shot.data, | 
| 87 | 85 | }) | 
| 86 | + | |
| 87 | + | |
| 88 | +@logit | |
| 89 | +@check_admin | |
| 90 | +def shot_request_list(request, administrator): | |
| 91 | +    page = request.POST.get('page', 1) | |
| 92 | +    num = request.POST.get('num', 20) | |
| 93 | + | |
| 94 | +    reqs = TenancyShotRequestInfo.objects.filter(status=True).order_by('-pk') | |
| 95 | + reqs = [req.data for req in reqs] | |
| 96 | + reqs, left = pagination(reqs, page, num) | |
| 97 | + | |
| 98 | +    return response(data={ | |
| 99 | + 'reqs': reqs, | |
| 100 | + 'left': left, | |
| 101 | + }) | |
| 102 | + | |
| 103 | + | |
| 104 | +@logit | |
| 105 | +@check_admin | |
| 106 | +def shot_request_detail(request, administrator): | |
| 107 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 108 | + | |
| 109 | + try: | |
| 110 | + req = TenancyShotRequestInfo.objects.get(request_id=req_id, status=True) | |
| 111 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 112 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 113 | + | |
| 114 | +    return response(data={ | |
| 115 | + 'req': req.data, | |
| 116 | + }) | |
| 117 | + | |
| 118 | + | |
| 119 | +@logit | |
| 120 | +@check_admin | |
| 121 | +@transaction.atomic | |
| 122 | +def shot_request_update(request, administrator): | |
| 123 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 124 | +    shot_id = request.POST.get('shot_id', '') | |
| 125 | +    name = request.POST.get('name', '') | |
| 126 | +    phone = request.POST.get('phone', '') | |
| 127 | +    postcode = request.POST.get('postcode', '') | |
| 128 | +    location = request.POST.get('location', '') | |
| 129 | +    purpose = request.POST.get('purpose', '') | |
| 130 | +    return_date = request.POST.get('return_date', '') | |
| 131 | +    request_status = request.POST.get('request_status', '') | |
| 132 | +    tracking_number = request.POST.get('tracking_number', '') | |
| 133 | +    back_tracking_number = request.POST.get('back_tracking_number', '') | |
| 134 | + | |
| 135 | + try: | |
| 136 | + req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True) | |
| 137 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 138 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 139 | + | |
| 140 | + if shot_id: | |
| 141 | + req.shot_id = shot_id | |
| 142 | + if name: | |
| 143 | + req.name = name | |
| 144 | + if phone: | |
| 145 | + req.phone = phone | |
| 146 | + if postcode: | |
| 147 | + req.postcode = postcode | |
| 148 | + if location: | |
| 149 | + req.location = location | |
| 150 | + if purpose: | |
| 151 | + req.purpose = purpose | |
| 152 | + if return_date: | |
| 153 | + req.return_date = tc.to_date(return_date) | |
| 154 | + if request_status: | |
| 155 | + req.request_status = request_status | |
| 156 | + if tracking_number: | |
| 157 | + req.tracking_number = tracking_number | |
| 158 | + if back_tracking_number: | |
| 159 | + req.back_tracking_number = back_tracking_number | |
| 160 | + req.save() | |
| 161 | + | |
| 162 | +    return response(data={ | |
| 163 | + 'req': req.data, | |
| 164 | + }) | |
| 165 | + | |
| 166 | + | |
| 167 | +@logit | |
| 168 | +@check_admin | |
| 169 | +@transaction.atomic | |
| 170 | +def shot_request_audit(request, administrator): | |
| 171 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 172 | +    audit_status = request.POST.get('audit_status', 0) | |
| 173 | + | |
| 174 | + try: | |
| 175 | + req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True) | |
| 176 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 177 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 178 | + | |
| 179 | + req.audit_status = audit_status | |
| 180 | + req.save() | |
| 181 | + | |
| 182 | +    return response(data={ | |
| 183 | + 'req': req.data, | |
| 184 | + }) | |
| 185 | + | |
| 186 | + | |
| 187 | +@logit | |
| 188 | +@check_admin | |
| 189 | +@transaction.atomic | |
| 190 | +def shot_request_send(request, administrator): | |
| 191 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 192 | +    tracking_number = request.POST.get('tracking_number', '') | |
| 193 | + | |
| 194 | + try: | |
| 195 | + req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True) | |
| 196 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 197 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 198 | + | |
| 199 | + req.tracking_number = tracking_number | |
| 200 | + req.save() | |
| 201 | + | |
| 202 | +    return response(data={ | |
| 203 | + 'req': req.data, | |
| 204 | + }) | |
| 205 | + | |
| 206 | + | |
| 207 | +@logit | |
| 208 | +@check_admin | |
| 209 | +@transaction.atomic | |
| 210 | +def shot_request_signed(request, administrator): | |
| 211 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 212 | + | |
| 213 | + try: | |
| 214 | + req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, status=True) | |
| 215 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 216 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 217 | + | |
| 218 | + req.request_status = '寄回已签收并检查无损坏' | |
| 219 | + req.save() | |
| 220 | + | |
| 221 | +    return response(data={ | |
| 222 | + 'req': req.data, | |
| 223 | + }) | 
| @@ -3,17 +3,19 @@ | ||
| 3 | 3 | from __future__ import division | 
| 4 | 4 |  | 
| 5 | 5 | from django.conf import settings | 
| 6 | +from django.db import transaction | |
| 6 | 7 | from django_logit import logit | 
| 8 | +from django_query import get_query_value | |
| 7 | 9 | from django_response import response | 
| 8 | 10 | from paginator import pagination | 
| 11 | +from TimeConvert import TimeConvert as tc | |
| 9 | 12 |  | 
| 10 | -from tenancy.models import TenancyShotInfo | |
| 13 | +from tenancy.models import TenancyShotInfo, TenancyShotRequestInfo | |
| 11 | 14 | from utils.error.errno_utils import TenancyStatusCode | 
| 12 | 15 |  | 
| 13 | 16 |  | 
| 14 | 17 | @logit | 
| 15 | 18 | def shot_list(request): | 
| 16 | -    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | |
| 17 | 19 |      page = request.POST.get('page', 1) | 
| 18 | 20 |      num = request.POST.get('num', 20) | 
| 19 | 21 |  | 
| @@ -29,7 +31,6 @@ def shot_list(request): | ||
| 29 | 31 |  | 
| 30 | 32 | @logit | 
| 31 | 33 | def shot_detail(request): | 
| 32 | -    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | |
| 33 | 34 |      shot_id = request.POST.get('shot_id', '') | 
| 34 | 35 |  | 
| 35 | 36 | try: | 
| @@ -40,3 +41,103 @@ def shot_detail(request): | ||
| 40 | 41 |      return response(data={ | 
| 41 | 42 | 'shot': shot.data, | 
| 42 | 43 | }) | 
| 44 | + | |
| 45 | + | |
| 46 | +@logit | |
| 47 | +def shot_request_create(request): | |
| 48 | +    shot_id = request.POST.get('shot_id', '') | |
| 49 | +    user_id = request.POST.get('user_id', '') | |
| 50 | +    name = request.POST.get('name', '') | |
| 51 | +    phone = request.POST.get('phone', '') | |
| 52 | +    postcode = request.POST.get('postcode', '') | |
| 53 | +    location = request.POST.get('location', '') | |
| 54 | +    purpose = request.POST.get('purpose', '') | |
| 55 | +    return_date = tc.to_date(request.POST.get('return_date', '') or settings.DEFAULT_START_DATE) | |
| 56 | + | |
| 57 | + req = TenancyShotRequestInfo.objects.create( | |
| 58 | + shot_id=shot_id, | |
| 59 | + user_id=user_id, | |
| 60 | + name=name, | |
| 61 | + phone=phone, | |
| 62 | + postcode=postcode, | |
| 63 | + location=location, | |
| 64 | + purpose=purpose, | |
| 65 | + return_date=return_date, | |
| 66 | + ) | |
| 67 | + | |
| 68 | +    return response(data={ | |
| 69 | + 'req': req.data, | |
| 70 | + }) | |
| 71 | + | |
| 72 | + | |
| 73 | +@logit | |
| 74 | +def shot_request_list(request): | |
| 75 | +    user_id = request.POST.get('user_id', '') | |
| 76 | +    page = request.POST.get('page', 1) | |
| 77 | +    num = request.POST.get('num', 20) | |
| 78 | + | |
| 79 | +    reqs = TenancyShotRequestInfo.objects.filter(user_id=user_id, status=True).order_by('-pk') | |
| 80 | + reqs = [req.data for req in reqs] | |
| 81 | + reqs, left = pagination(reqs, page, num) | |
| 82 | + | |
| 83 | +    return response(data={ | |
| 84 | + 'reqs': reqs, | |
| 85 | + 'left': left, | |
| 86 | + }) | |
| 87 | + | |
| 88 | + | |
| 89 | +@logit | |
| 90 | +def shot_request_detail(request): | |
| 91 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 92 | +    user_id = request.POST.get('user_id', '') | |
| 93 | + | |
| 94 | + try: | |
| 95 | + req = TenancyShotRequestInfo.objects.get(request_id=req_id, user_id=user_id, status=True) | |
| 96 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 97 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 98 | + | |
| 99 | +    return response(data={ | |
| 100 | + 'req': req.data, | |
| 101 | + }) | |
| 102 | + | |
| 103 | + | |
| 104 | +@logit | |
| 105 | +@transaction.atomic | |
| 106 | +def shot_request_signed(request): | |
| 107 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 108 | +    user_id = request.POST.get('user_id', '') | |
| 109 | + signed_images = get_query_value(request, 'signed_images', val_cast_type='listjson') | |
| 110 | + | |
| 111 | + try: | |
| 112 | + req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, user_id=user_id, status=True) | |
| 113 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 114 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 115 | + | |
| 116 | + req.tracking_signed_images = signed_images | |
| 117 | + req.request_status = '寄出已签收' | |
| 118 | + req.save() | |
| 119 | + | |
| 120 | +    return response(data={ | |
| 121 | + 'req': req.data, | |
| 122 | + }) | |
| 123 | + | |
| 124 | + | |
| 125 | +@logit | |
| 126 | +@transaction.atomic | |
| 127 | +def shot_request_sendback(request): | |
| 128 | +    req_id = request.POST.get('req_id') or request.POST.get('request_id') | |
| 129 | +    user_id = request.POST.get('user_id', '') | |
| 130 | +    back_tracking_number = request.POST.get('back_tracking_number', '') | |
| 131 | + | |
| 132 | + try: | |
| 133 | + req = TenancyShotRequestInfo.objects.select_for_update().get(request_id=req_id, user_id=user_id, status=True) | |
| 134 | + except TenancyShotRequestInfo.DoesNotExist: | |
| 135 | + return response(TenancyStatusCode.TENANCY_SHOT_REQUEST_NOT_FOUND) | |
| 136 | + | |
| 137 | + req.back_tracking_number = back_tracking_number | |
| 138 | + req.request_status = '寄出已签收' | |
| 139 | + req.save() | |
| 140 | + | |
| 141 | +    return response(data={ | |
| 142 | + 'req': req.data, | |
| 143 | + }) | 
| @@ -324,7 +324,7 @@ urlpatterns += [ | ||
| 324 | 324 | url(r'^maintenance/tracking/info/callback$', maintenance_views.maintenance_tracking_info_callback, name='maintenance_tracking_info_callback'), | 
| 325 | 325 | ] | 
| 326 | 326 |  | 
| 327 | -# 租赁 | |
| 327 | +# 租赁镜头 | |
| 328 | 328 | urlpatterns += [ | 
| 329 | 329 | # 小程序接口 | 
| 330 | 330 | url(r'^tenancy/shot/list$', tenancy_views.shot_list, name='tenancy_shot_list'), | 
| @@ -340,6 +340,19 @@ urlpatterns += [ | ||
| 340 | 340 | # 租赁申请 | 
| 341 | 341 | urlpatterns += [ | 
| 342 | 342 | # 小程序接口 | 
| 343 | + url(r'^tenancy/shot/request/create$', tenancy_views.shot_request_create, name='tenancy_shot_request_create'), | |
| 344 | + url(r'^tenancy/shot/request/list$', tenancy_views.shot_request_list, name='tenancy_shot_request_list'), | |
| 345 | + url(r'^tenancy/shot/request/detail$', tenancy_views.shot_request_detail, name='tenancy_shot_request_detail'), | |
| 346 | + url(r'^tenancy/shot/request/signed$', tenancy_views.shot_request_signed, name='tenancy_shot_request_signed'), | |
| 347 | + url(r'^tenancy/shot/request/sendback$', tenancy_views.shot_request_sendback, name='tenancy_shot_request_sendback'), | |
| 343 | 348 |  | 
| 344 | 349 | # 后台管理接口 | 
| 350 | + url(r'^admin/tenancy/shot/request/list$', tenancy_admin_views.shot_request_list, name='admin_tenancy_shot_request_list'), | |
| 351 | + url(r'^admin/tenancy/shot/request/detail$', tenancy_admin_views.shot_request_detail, name='admin_tenancy_shot_request_detail'), | |
| 352 | + url(r'^admin/tenancy/shot/request/update$', tenancy_admin_views.shot_request_update, name='admin_tenancy_shot_request_update'), | |
| 353 | + url(r'^admin/tenancy/shot/request/audit$', tenancy_admin_views.shot_request_audit, name='admin_tenancy_shot_request_audit'), | |
| 354 | + url(r'^admin/tenancy/shot/request/send$', tenancy_admin_views.shot_request_send, name='admin_tenancy_shot_request_send'), | |
| 355 | + url(r'^admin/tenancy/shot/request/signed$', tenancy_admin_views.shot_request_signed, name='admin_tenancy_shot_request_signed'), | |
| 356 | + | |
| 357 | + # 快递信息回调接口 | |
| 345 | 358 | ] | 
| @@ -113,9 +113,15 @@ class TenancyShotRequestInfo(BaseModelMixin): | ||
| 113 | 113 |  | 
| 114 | 114 | @property | 
| 115 | 115 | def data(self): | 
| 116 | + try: | |
| 117 | + shot = TenancyShotInfo.objects.get(shot_id=self.shot_id) | |
| 118 | + except TenancyShotInfo.DoesNotExist: | |
| 119 | + shot = None | |
| 116 | 120 |          return { | 
| 121 | + 'req_id': self.request_id, | |
| 117 | 122 | 'request_id': self.request_id, | 
| 118 | 123 | 'shot_id': self.shot_id, | 
| 124 | +            'shot_info': shot.data if shot else {}, | |
| 119 | 125 | 'user_id': self.user_id, | 
| 120 | 126 | 'name': self.name, | 
| 121 | 127 | 'phone': self.phone, | 
| @@ -216,3 +216,5 @@ class MaintenanceStatusCode(BaseStatusCode): | ||
| 216 | 216 | class TenancyStatusCode(BaseStatusCode): | 
| 217 | 217 | """ 租赁相关错误码 5090xx """ | 
| 218 | 218 | TENANCY_SHOT_NOT_FOUND = StatusCodeField(509001, 'Tenancy Shot Not Found', description=u'租赁镜头不存在') | 
| 219 | + | |
| 220 | + TENANCY_SHOT_REQUEST_NOT_FOUND = StatusCodeField(509011, 'Tenancy Shot Request Not Found', description=u'租赁镜头申请不存在') |