@@ -887,6 +887,7 @@ def member_activity_create(request, administrator):  | 
            ||
| 887 | 887 | 
                     activity_state = int(request.POST.get('activity_state', 0))
               | 
            
| 888 | 888 | 
                     poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
               | 
            
| 889 | 889 | 
                     poster_content = request.POST.get('poster_content', '')
               | 
            
| 890 | 
                +    contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
               | 
            |
| 890 | 891 | 
                 | 
            
| 891 | 892 | 
                act = MemberActivityInfo.objects.create(  | 
            
| 892 | 893 | 
                brand_id=administrator.brand_id,  | 
            
                @@ -914,7 +915,7 @@ def member_activity_create(request, administrator):  | 
            ||
| 914 | 915 | 
                activity_state=activity_state,  | 
            
| 915 | 916 | 
                poster_kv_img_url=poster_kv_img_url,  | 
            
| 916 | 917 | 
                poster_content=poster_content,  | 
            
| 917 | 
                - contribution_content_placeholder=contribution_content_placeholder  | 
            |
| 918 | 
                + contribution_content_placeholder=contribution_content_placeholder,  | 
            |
| 918 | 919 | 
                )  | 
            
| 919 | 920 | 
                 | 
            
| 920 | 921 | 
                     return response(200, 'MemberActivityInfo Create Success', u'会员活动创建成功', data={
               | 
            
                @@ -964,8 +965,8 @@ def member_activity_register_list(request, administrator):  | 
            ||
| 964 | 965 | 
                })  | 
            
| 965 | 966 | 
                 | 
            
| 966 | 967 | 
                 | 
            
| 967 | 
                -@check_admin  | 
            |
| 968 | 968 | 
                @logit  | 
            
| 969 | 
                +@check_admin  | 
            |
| 969 | 970 | 
                def member_activity_contribute_list(request, administrator):  | 
            
| 970 | 971 | 
                     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            
| 971 | 972 | 
                     activity_id = request.POST.get('activity_id', '')
               | 
            
                @@ -0,0 +1,87 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +from __future__ import division  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.conf import settings  | 
            |
| 6 | 
                +from django_logit import logit  | 
            |
| 7 | 
                +from django_response import response  | 
            |
| 8 | 
                +from paginator import pagination  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                +from kodo.decorators import check_admin  | 
            |
| 11 | 
                +from tenancy.models import TenancyShotInfo  | 
            |
| 12 | 
                +from utils.error.errno_utils import TenancyStatusCode  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                +  | 
            |
| 15 | 
                +@logit  | 
            |
| 16 | 
                +@check_admin  | 
            |
| 17 | 
                +def shot_list(request, administrator):  | 
            |
| 18 | 
                +    page = request.POST.get('page', 1)
               | 
            |
| 19 | 
                +    num = request.POST.get('num', 20)
               | 
            |
| 20 | 
                +  | 
            |
| 21 | 
                +    shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk')
               | 
            |
| 22 | 
                + shots = [shot.data for shot in shots]  | 
            |
| 23 | 
                + shots, left = pagination(shots, page, num)  | 
            |
| 24 | 
                +  | 
            |
| 25 | 
                +    return response(data={
               | 
            |
| 26 | 
                + 'shots': shots,  | 
            |
| 27 | 
                + 'left': left,  | 
            |
| 28 | 
                + })  | 
            |
| 29 | 
                +  | 
            |
| 30 | 
                +  | 
            |
| 31 | 
                +@logit  | 
            |
| 32 | 
                +@check_admin  | 
            |
| 33 | 
                +def shot_detail(request, administrator):  | 
            |
| 34 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 35 | 
                +    shot_id = request.POST.get('shot_id', '')
               | 
            |
| 36 | 
                +  | 
            |
| 37 | 
                + try:  | 
            |
| 38 | 
                + shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)  | 
            |
| 39 | 
                + except TenancyShotInfo.DoesNotExist:  | 
            |
| 40 | 
                + return response(TenancyStatusCode.TENANCY_SHOT_NOT_FOUND)  | 
            |
| 41 | 
                +  | 
            |
| 42 | 
                +    return response(data={
               | 
            |
| 43 | 
                + 'shot': shot.data,  | 
            |
| 44 | 
                + })  | 
            |
| 45 | 
                +  | 
            |
| 46 | 
                +  | 
            |
| 47 | 
                +@logit  | 
            |
| 48 | 
                +@check_admin  | 
            |
| 49 | 
                +def shot_create(request, administrator):  | 
            |
| 50 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 51 | 
                +    model_name = request.POST.get('model_name', '')
               | 
            |
| 52 | 
                +    sn = request.POST.get('sn', '')
               | 
            |
| 53 | 
                +    fittings_type = request.POST.get('fittings_type', 0)
               | 
            |
| 54 | 
                +    tenancy_status = request.POST.get('tenancy_status', 0)
               | 
            |
| 55 | 
                +  | 
            |
| 56 | 
                + shot = TenancyShotInfo.objects.create(  | 
            |
| 57 | 
                + model_name=model_name,  | 
            |
| 58 | 
                + sn=sn,  | 
            |
| 59 | 
                + fittings_type=fittings_type,  | 
            |
| 60 | 
                + tenancy_status=tenancy_status,  | 
            |
| 61 | 
                + )  | 
            |
| 62 | 
                +  | 
            |
| 63 | 
                +    return response(data={
               | 
            |
| 64 | 
                + 'shot': shot.data,  | 
            |
| 65 | 
                + })  | 
            |
| 66 | 
                +  | 
            |
| 67 | 
                +  | 
            |
| 68 | 
                +@logit  | 
            |
| 69 | 
                +@check_admin  | 
            |
| 70 | 
                +def shot_update(request, administrator):  | 
            |
| 71 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 72 | 
                +    shot_id = request.POST.get('shot_id', '')
               | 
            |
| 73 | 
                +    model_name = request.POST.get('model_name', '')
               | 
            |
| 74 | 
                +    sn = request.POST.get('sn', '')
               | 
            |
| 75 | 
                +    fittings_type = request.POST.get('fittings_type', 0)
               | 
            |
| 76 | 
                +    tenancy_status = request.POST.get('tenancy_status', 0)
               | 
            |
| 77 | 
                +  | 
            |
| 78 | 
                +    shot, _ = TenancyShotInfo.objects.update_or_create(shot_id=shot_id, defaults={
               | 
            |
| 79 | 
                + 'model_name': model_name,  | 
            |
| 80 | 
                + 'sn': sn,  | 
            |
| 81 | 
                + 'fittings_type': fittings_type,  | 
            |
| 82 | 
                + 'tenancy_status': tenancy_status,  | 
            |
| 83 | 
                + })  | 
            |
| 84 | 
                +  | 
            |
| 85 | 
                +    return response(data={
               | 
            |
| 86 | 
                + 'shot': shot.data,  | 
            |
| 87 | 
                + })  | 
            
                @@ -0,0 +1,42 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +from __future__ import division  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.conf import settings  | 
            |
| 6 | 
                +from django_logit import logit  | 
            |
| 7 | 
                +from django_response import response  | 
            |
| 8 | 
                +from paginator import pagination  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                +from tenancy.models import TenancyShotInfo  | 
            |
| 11 | 
                +from utils.error.errno_utils import TenancyStatusCode  | 
            |
| 12 | 
                +  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                +@logit  | 
            |
| 15 | 
                +def shot_list(request):  | 
            |
| 16 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 17 | 
                +    page = request.POST.get('page', 1)
               | 
            |
| 18 | 
                +    num = request.POST.get('num', 20)
               | 
            |
| 19 | 
                +  | 
            |
| 20 | 
                +    shots = TenancyShotInfo.objects.filter(status=True).order_by('-pk')
               | 
            |
| 21 | 
                + shots = [shot.data for shot in shots]  | 
            |
| 22 | 
                + shots, left = pagination(shots, page, num)  | 
            |
| 23 | 
                +  | 
            |
| 24 | 
                +    return response(data={
               | 
            |
| 25 | 
                + 'shots': shots,  | 
            |
| 26 | 
                + 'left': left,  | 
            |
| 27 | 
                + })  | 
            |
| 28 | 
                +  | 
            |
| 29 | 
                +  | 
            |
| 30 | 
                +@logit  | 
            |
| 31 | 
                +def shot_detail(request):  | 
            |
| 32 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 33 | 
                +    shot_id = request.POST.get('shot_id', '')
               | 
            |
| 34 | 
                +  | 
            |
| 35 | 
                + try:  | 
            |
| 36 | 
                + shot = TenancyShotInfo.objects.get(shot_id=shot_id, status=True)  | 
            |
| 37 | 
                + except TenancyShotInfo.DoesNotExist:  | 
            |
| 38 | 
                + return response(TenancyStatusCode.TENANCY_SHOT_NOT_FOUND)  | 
            |
| 39 | 
                +  | 
            |
| 40 | 
                +    return response(data={
               | 
            |
| 41 | 
                + 'shot': shot.data,  | 
            |
| 42 | 
                + })  | 
            
                @@ -5,7 +5,7 @@ from django_file_upload import views as file_views  | 
            ||
| 5 | 5 | 
                 | 
            
| 6 | 6 | 
                from api import (admin_views, clerk_views, complement_views, distributor_views, encrypt_views, express_views, log_views,  | 
            
| 7 | 7 | 
                maintenance_point_views, maintenance_views, mch_views, member_views, model_views, operator_views,  | 
            
| 8 | 
                - refresh_views, sr_views, staff_views, wx_views, wxa_views)  | 
            |
| 8 | 
                + refresh_views, sr_views, staff_views, tenancy_admin_views, tenancy_views, wx_views, wxa_views)  | 
            |
| 9 | 9 | 
                from miniapp import qy_views  | 
            
| 10 | 10 | 
                from miniapp import views as mini_views  | 
            
| 11 | 11 | 
                from page import oauth_views, sale_views, screen_views  | 
            
                @@ -307,15 +307,39 @@ urlpatterns += [  | 
            ||
| 307 | 307 | 
                 | 
            
| 308 | 308 | 
                # 维修  | 
            
| 309 | 309 | 
                urlpatterns += [  | 
            
| 310 | 
                + # 小程序接口  | 
            |
| 310 | 311 | 
                url(r'^maintenance/add$', maintenance_views.maintenance_add, name='maintenance_add'),  | 
            
| 311 | 312 | 
                url(r'^maintenance/delete$', maintenance_views.maintenance_delete, name='maintenance_delete'),  | 
            
| 312 | 313 | 
                url(r'^maintenance/list$', maintenance_views.maintenance_list, name='maintenance_list'),  | 
            
| 313 | 314 | 
                url(r'^maintenance/detail$', maintenance_views.maintenance_detail, name='maintenance_detail'),  | 
            
| 314 | 315 | 
                 | 
            
| 316 | 
                + # 后台管理接口  | 
            |
| 315 | 317 | 
                url(r'^admin/maintenance/update$', maintenance_views.maintenance_update, name='maintenance_update'),  | 
            
| 316 | 318 | 
                url(r'^admin/maintenance/list$', maintenance_views.maintenance_list, name='maintenance_list'),  | 
            
| 317 | 319 | 
                url(r'^admin/maintenance/close$', maintenance_views.maintenance_close, name='maintenance_close'),  | 
            
| 318 | 320 | 
                 | 
            
| 319 | 321 | 
                url(r'^admin/maintenance/tracking/info$', maintenance_views.maintenance_tracking_info, name='maintenance_tracking_info'),  | 
            
| 322 | 
                +  | 
            |
| 323 | 
                + # 快递信息回调接口  | 
            |
| 320 | 324 | 
                url(r'^maintenance/tracking/info/callback$', maintenance_views.maintenance_tracking_info_callback, name='maintenance_tracking_info_callback'),  | 
            
| 321 | 325 | 
                ]  | 
            
| 326 | 
                +  | 
            |
| 327 | 
                +# 租赁  | 
            |
| 328 | 
                +urlpatterns += [  | 
            |
| 329 | 
                + # 小程序接口  | 
            |
| 330 | 
                + url(r'^tenancy/shot/list$', tenancy_views.shot_list, name='tenancy_shot_list'),  | 
            |
| 331 | 
                + url(r'^tenancy/shot/detail$', tenancy_views.shot_detail, name='tenancy_shot_detail'),  | 
            |
| 332 | 
                +  | 
            |
| 333 | 
                + # 后台管理接口  | 
            |
| 334 | 
                + url(r'^admin/tenancy/shot/list$', tenancy_admin_views.shot_list, name='admin_tenancy_shot_list'),  | 
            |
| 335 | 
                + url(r'^admin/tenancy/shot/detail$', tenancy_admin_views.shot_detail, name='admin_tenancy_shot_detail'),  | 
            |
| 336 | 
                + url(r'^admin/tenancy/shot/create$', tenancy_admin_views.shot_create, name='admin_tenancy_shot_create'),  | 
            |
| 337 | 
                + url(r'^admin/tenancy/shot/update$', tenancy_admin_views.shot_update, name='admin_tenancy_shot_update'),  | 
            |
| 338 | 
                +]  | 
            |
| 339 | 
                +  | 
            |
| 340 | 
                +# 租赁申请  | 
            |
| 341 | 
                +urlpatterns += [  | 
            |
| 342 | 
                + # 小程序接口  | 
            |
| 343 | 
                +  | 
            |
| 344 | 
                + # 后台管理接口  | 
            |
| 345 | 
                +]  | 
            
                @@ -16,17 +16,17 @@ class PermissionStatusCode(BaseStatusCode):  | 
            ||
| 16 | 16 | 
                class AdministratorStatusCode(BaseStatusCode):  | 
            
| 17 | 17 | 
                """ 操作员相关错误码 4002xx """  | 
            
| 18 | 18 | 
                ADMINISTRATOR_NOT_FOUND = StatusCodeField(400201, 'Administrator Not Found', description=u'管理员不存在')  | 
            
| 19 | 
                - ADMINISTRATOR_PERMISSION_DENIED = StatusCodeField(508002, 'Administrator Permission Denied', description=u'管理员权限不足')  | 
            |
| 19 | 
                + ADMINISTRATOR_PERMISSION_DENIED = StatusCodeField(400202, 'Administrator Permission Denied', description=u'管理员权限不足')  | 
            |
| 20 | 20 | 
                 | 
            
| 21 | 
                - # 密码  | 
            |
| 22 | 
                - ADMINISTRATOR_PASSWORD_ERROR = StatusCodeField(400202, 'Administrator Password Error', description=u'管理员密码错误')  | 
            |
| 23 | 21 | 
                # 手机号  | 
            
| 24 | 22 | 
                ADMINISTRATOR_PHONE_ALREADY_EXISTS = StatusCodeField(400205, 'Administrator Phone Already Exists', description=u'管理员手机号已经存在')  | 
            
| 23 | 
                + # 密码  | 
            |
| 24 | 
                + ADMINISTRATOR_PASSWORD_ERROR = StatusCodeField(400210, 'Administrator Password Error', description=u'管理员密码错误')  | 
            |
| 25 | 25 | 
                # 状态  | 
            
| 26 | 26 | 
                ADMINISTRATOR_NOT_ACTIVATED = StatusCodeField(400215, 'Administrator Not Activated', description=u'管理员未激活')  | 
            
| 27 | 27 | 
                ADMINISTRATOR_HAS_DISABLED = StatusCodeField(400216, 'Administrator Has Disabled', description=u'管理员已禁用')  | 
            
| 28 | 28 | 
                ADMINISTRATOR_HAS_DELETED = StatusCodeField(400217, 'Administrator Has Deleted', description=u'管理员已删除')  | 
            
| 29 | 
                - # 管理员  | 
            |
| 29 | 
                + # 核销员  | 
            |
| 30 | 30 | 
                MAINTENANCE_NOT_FOUND = StatusCodeField(400251, 'Maintenance Not Found', description=u'核销员不存在')  | 
            
| 31 | 31 | 
                 | 
            
| 32 | 32 | 
                 | 
            
                @@ -211,3 +211,8 @@ class MaintenanceStatusCode(BaseStatusCode):  | 
            ||
| 211 | 211 | 
                """ 维修相关错误码 5080xx """  | 
            
| 212 | 212 | 
                MAINTENACE_NOT_FOUND = StatusCodeField(508001, 'Maintenance Not Found', description=u'维修不存在')  | 
            
| 213 | 213 | 
                MAINTENACE_PERMISSION_DENIED = StatusCodeField(508002, 'Maintenance Permission Denied', description=u'维修权限不足')  | 
            
| 214 | 
                +  | 
            |
| 215 | 
                +  | 
            |
| 216 | 
                +class TenancyStatusCode(BaseStatusCode):  | 
            |
| 217 | 
                + """ 租赁相关错误码 5090xx """  | 
            |
| 218 | 
                + TENANCY_SHOT_NOT_FOUND = StatusCodeField(509001, 'Tenancy Shot Not Found', description=u'租赁镜头不存在')  |