@@ -29,10 +29,11 @@ from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContribution |
||
29 | 29 |
MemberActivityGroupShareInfo, MemberActivityInfo, MemberActivitySignupInfo) |
30 | 30 |
from pre.custom_message import sendtemplatemessage, sendwxasubscribemessage |
31 | 31 |
from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo |
32 |
-from utils.error.errno_utils import (AdministratorStatusCode, ComplementCodeStatusCode, |
|
32 |
+from utils.error.errno_utils import (AdministratorStatusCode, ComplementCodeStatusCode, CouponStatusCode, |
|
33 | 33 |
MemberActivityContributionStatusCode, MemberActivityContributionWelfareStatusCode, |
34 |
- MemberActivityContributionWelfareUnblockingStatusCode, ProductBrandStatusCode, |
|
35 |
- ProductCouponStatusCode, ProductMachineStatusCode, UserStatusCode) |
|
34 |
+ MemberActivityContributionWelfareUnblockingStatusCode, MemberActivityStatusCode, |
|
35 |
+ MemberGoodStatusCode, ProductCouponStatusCode, ProductMachineStatusCode, |
|
36 |
+ UserStatusCode) |
|
36 | 37 |
|
37 | 38 |
|
38 | 39 |
WECHAT = settings.WECHAT |
@@ -791,7 +792,7 @@ def member_activity_detail(request, administrator): |
||
791 | 792 |
try: |
792 | 793 |
log = MemberActivityInfo.objects.get(activity_id=activity_id) |
793 | 794 |
except MemberActivityInfo.DoesNotExist: |
794 |
- return response() |
|
795 |
+ return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) |
|
795 | 796 |
|
796 | 797 |
return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={ |
797 | 798 |
'log': log.admindetails, |
@@ -804,10 +805,10 @@ def member_activity_update(request, administrator): |
||
804 | 805 |
activity_type = int(request.POST.get('activity_type', 0)) |
805 | 806 |
title = request.POST.get('title', '') |
806 | 807 |
subtitle = request.POST.get('subtitle', '') |
807 |
- start_date = request.POST.get('start_date', '') or settings.DEFAULT_START_DATE |
|
808 |
- end_date = date = request.POST.get('date', '') or request.POST.get('end_date', '') or settings.DEFAULT_END_DATE |
|
809 |
- start_display_date = request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE |
|
810 |
- end_display_date = request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE |
|
808 |
+ start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE) |
|
809 |
+ end_date = date = tc.to_date(request.POST.get('date', '') or request.POST.get('end_date', '') or settings.DEFAULT_END_DATE) |
|
810 |
+ start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE) |
|
811 |
+ end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE) |
|
811 | 812 |
city = request.POST.get('city', '') |
812 | 813 |
location = request.POST.get('location', '') |
813 | 814 |
integral = int(request.POST.get('integral', 0)) |
@@ -828,7 +829,7 @@ def member_activity_update(request, administrator): |
||
828 | 829 |
try: |
829 | 830 |
log = MemberActivityInfo.objects.get(activity_id=activity_id, status=True) |
830 | 831 |
except MemberActivityInfo.DoesNotExist: |
831 |
- return response() |
|
832 |
+ return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) |
|
832 | 833 |
|
833 | 834 |
log.activity_type = activity_type |
834 | 835 |
log.title = title |
@@ -1246,7 +1247,7 @@ def coupon_detail(request, administrator): |
||
1246 | 1247 |
try: |
1247 | 1248 |
log = CouponInfo.objects.get(coupon_id=coupon_id) |
1248 | 1249 |
except CouponInfo.DoesNotExist: |
1249 |
- return response() |
|
1250 |
+ return response(CouponStatusCode.COUPON_NOT_FOUND) |
|
1250 | 1251 |
|
1251 | 1252 |
log = log.admindetails |
1252 | 1253 |
|
@@ -1299,7 +1300,7 @@ def coupon_update(request, administrator): |
||
1299 | 1300 |
try: |
1300 | 1301 |
log = CouponInfo.objects.get(coupon_id=coupon_id, status=True) |
1301 | 1302 |
except CouponInfo.DoesNotExist: |
1302 |
- return response() |
|
1303 |
+ return response(CouponStatusCode.COUPON_NOT_FOUND) |
|
1303 | 1304 |
|
1304 | 1305 |
log.brand_id = administrator.brand_id |
1305 | 1306 |
log.coupon_title = coupon_title |
@@ -1323,7 +1324,7 @@ def coupon_delete(request, administrator): |
||
1323 | 1324 |
try: |
1324 | 1325 |
log = CouponInfo.objects.get(coupon_id=coupon_id, status=True) |
1325 | 1326 |
except CouponInfo.DoesNotExist: |
1326 |
- return response() |
|
1327 |
+ return response(CouponStatusCode.COUPON_NOT_FOUND) |
|
1327 | 1328 |
|
1328 | 1329 |
log.status = False |
1329 | 1330 |
log.save() |
@@ -1357,7 +1358,7 @@ def member_goods_detail(request, administrator): |
||
1357 | 1358 |
try: |
1358 | 1359 |
log = GoodsInfo.objects.get(good_id=good_id) |
1359 | 1360 |
except GoodsInfo.DoesNotExist: |
1360 |
- return response() |
|
1361 |
+ return response(MemberGoodStatusCode.GOOD_NOT_FOUND) |
|
1361 | 1362 |
|
1362 | 1363 |
log = log.admindetails |
1363 | 1364 |
|
@@ -1382,7 +1383,7 @@ def member_goods_update(request, administrator): |
||
1382 | 1383 |
try: |
1383 | 1384 |
log = GoodsInfo.objects.get(good_id=good_id, status=True) |
1384 | 1385 |
except GoodsInfo.DoesNotExist: |
1385 |
- return response() |
|
1386 |
+ return response(MemberGoodStatusCode.GOOD_NOT_FOUND) |
|
1386 | 1387 |
|
1387 | 1388 |
log.title = title |
1388 | 1389 |
log.desc = desc |
@@ -1519,7 +1520,7 @@ def complement_code_audit(request, administrator): |
||
1519 | 1520 |
try: |
1520 | 1521 |
user = UserInfo.objects.get(user_id=log.user_id, status=True) |
1521 | 1522 |
except UserInfo.DoesNotExist: |
1522 |
- return response() |
|
1523 |
+ return response(UserStatusCode.USER_NOT_FOUND) |
|
1523 | 1524 |
|
1524 | 1525 |
# Send template_message |
1525 | 1526 |
data = { |
@@ -422,7 +422,7 @@ def activity_signup_info(request): |
||
422 | 422 |
try: |
423 | 423 |
contribution = MemberActivityContributionInfo.objects.get(user_id=user_id, activity_id=activity_id, content_type=0, status=True) |
424 | 424 |
except MemberActivityContributionInfo.DoesNotExist: |
425 |
- return response() |
|
425 |
+ return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND) |
|
426 | 426 |
|
427 | 427 |
return response(data={ |
428 | 428 |
'signup_info': signup_info.data, |
@@ -16,7 +16,8 @@ from staff.models import StaffDeleteClerkSaleSubmitLogInfo, StaffDeleteConsumerS |
||
16 | 16 |
from statistic.models import (ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo, |
17 | 17 |
DistributorSaleStatisticInfo, ModelSaleStatisticInfo, ProvinceSaleStatisticInfo, |
18 | 18 |
SaleclerkSaleStatisticInfo, SaleStatisticInfo) |
19 |
-from utils.error.errno_utils import AdministratorStatusCode |
|
19 |
+from utils.error.errno_utils import (AdministratorStatusCode, ProductBrandStatusCode, ProductDistributorStatusCode, |
|
20 |
+ ProductModelStatusCode, SaleclerkStatusCode, UserStatusCode) |
|
20 | 21 |
|
21 | 22 |
|
22 | 23 |
def exec_del_clerk_sale_submit(pk, admin_id): |
@@ -35,22 +36,22 @@ def exec_del_clerk_sale_submit(pk, admin_id): |
||
35 | 36 |
try: |
36 | 37 |
brand = BrandInfo.objects.get(pk=ssli.brand_pk) |
37 | 38 |
except BrandInfo.DoesNotExist: |
38 |
- return response() |
|
39 |
+ return response(ProductBrandStatusCode) |
|
39 | 40 |
|
40 | 41 |
try: |
41 | 42 |
model = ModelInfo.objects.get(pk=ssli.model_pk) |
42 | 43 |
except ModelInfo.DoesNotExist: |
43 |
- return response() |
|
44 |
+ return response(ProductModelStatusCode) |
|
44 | 45 |
|
45 | 46 |
try: |
46 | 47 |
clerk = SaleclerkInfo.objects.select_for_update().get(clerk_id=ssli.clerk_id, status=True) |
47 | 48 |
except SaleclerkInfo.DoesNotExist: |
48 |
- return response() |
|
49 |
+ return response(SaleclerkStatusCode.CLERK_NOT_FOUND) |
|
49 | 50 |
|
50 | 51 |
try: |
51 | 52 |
distributor = DistributorInfo.objects.get(distributor_id=clerk.distributor_id) |
52 | 53 |
except DistributorInfo.DoesNotExist: |
53 |
- return response() |
|
54 |
+ return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND) |
|
54 | 55 |
|
55 | 56 |
ymd = str(ssli.ymd) |
56 | 57 |
|
@@ -280,17 +281,17 @@ def exec_del_consumer_submit(pk, admin_id): |
||
280 | 281 |
try: |
281 | 282 |
brand = BrandInfo.objects.get(brand_id=ssli.brand_id) |
282 | 283 |
except BrandInfo.DoesNotExist: |
283 |
- return response() |
|
284 |
+ return response(ProductBrandStatusCode.BRAND_NOT_FOUND) |
|
284 | 285 |
|
285 | 286 |
try: |
286 | 287 |
model = ModelInfo.objects.get(model_id=ssli.model_id) |
287 | 288 |
except ModelInfo.DoesNotExist: |
288 |
- return response() |
|
289 |
+ return response(ProductModelStatusCode.MODEL_NOT_FOUND) |
|
289 | 290 |
|
290 | 291 |
try: |
291 | 292 |
user = UserInfo.objects.select_for_update().get(user_id=ssli.user_id) |
292 | 293 |
except UserInfo.DoesNotExist: |
293 |
- return response() |
|
294 |
+ return response(UserStatusCode.USER_NOT_FOUND) |
|
294 | 295 |
|
295 | 296 |
# 记录删除日志 |
296 | 297 |
StaffDeleteConsumerSubmitLogInfo.objects.create( |
@@ -8,6 +8,78 @@ class ParamStatusCode(BaseStatusCode): |
||
8 | 8 |
PARAM_NOT_FOUND = StatusCodeField(400000, 'Param Not Found', description=u'参数不存在') |
9 | 9 |
|
10 | 10 |
|
11 |
+class PermissionStatusCode(BaseStatusCode): |
|
12 |
+ """ 4099xx 权限相关错误码 """ |
|
13 |
+ PERMISSION_DENIED = StatusCodeField(409900, 'Permission Denied', description=u'权限不足') |
|
14 |
+ |
|
15 |
+ |
|
16 |
+class AdministratorStatusCode(BaseStatusCode): |
|
17 |
+ """ 操作员相关错误码 4002xx """ |
|
18 |
+ ADMINISTRATOR_NOT_FOUND = StatusCodeField(400201, 'Administrator Not Found', description=u'管理员不存在') |
|
19 |
+ ADMINISTRATOR_PERMISSION_DENIED = StatusCodeField(508002, 'Administrator Permission Denied', description=u'管理员权限不足') |
|
20 |
+ |
|
21 |
+ # 密码 |
|
22 |
+ ADMINISTRATOR_PASSWORD_ERROR = StatusCodeField(400202, 'Administrator Password Error', description=u'管理员密码错误') |
|
23 |
+ # 手机号 |
|
24 |
+ ADMINISTRATOR_PHONE_ALREADY_EXISTS = StatusCodeField(400205, 'Administrator Phone Already Exists', description=u'管理员手机号已经存在') |
|
25 |
+ # 状态 |
|
26 |
+ ADMINISTRATOR_NOT_ACTIVATED = StatusCodeField(400215, 'Administrator Not Activated', description=u'管理员未激活') |
|
27 |
+ ADMINISTRATOR_HAS_DISABLED = StatusCodeField(400216, 'Administrator Has Disabled', description=u'管理员已禁用') |
|
28 |
+ ADMINISTRATOR_HAS_DELETED = StatusCodeField(400217, 'Administrator Has Deleted', description=u'管理员已删除') |
|
29 |
+ # 管理员 |
|
30 |
+ MAINTENANCE_NOT_FOUND = StatusCodeField(400251, 'Maintenance Not Found', description=u'核销员不存在') |
|
31 |
+ |
|
32 |
+ |
|
33 |
+class OperatorStatusCode(BaseStatusCode): |
|
34 |
+ """ 操作员相关错误码 4003xx """ |
|
35 |
+ OPERATOR_NOT_FOUND = StatusCodeField(400301, 'Operator Not Found', description=u'操作员不存在') |
|
36 |
+ # 密码 |
|
37 |
+ OPERATOR_PASSWORD_ERROR = StatusCodeField(400302, 'Operator Password Error', description=u'操作员密码错误') |
|
38 |
+ # 手机号 |
|
39 |
+ OPERATOR_PHONE_ALREADY_EXISTS = StatusCodeField(400305, 'Operator Phone Already Exists', description=u'操作员手机号已经存在') |
|
40 |
+ # 状态 |
|
41 |
+ OPERATOR_NOT_ACTIVATED = StatusCodeField(400315, 'Operator Not Activated', description=u'操作员未激活') |
|
42 |
+ OPERATOR_HAS_DISABLED = StatusCodeField(400316, 'Operator Has Disabled', description=u'操作员已禁用') |
|
43 |
+ OPERATOR_HAS_DELETED = StatusCodeField(400317, 'Operator Has Deleted', description=u'操作员已删除') |
|
44 |
+ |
|
45 |
+ |
|
46 |
+class UserStatusCode(BaseStatusCode): |
|
47 |
+ """ 用户相关错误码 4005xx """ |
|
48 |
+ USER_NOT_FOUND = StatusCodeField(400501, 'User Not Found', description=u'用户不存在') |
|
49 |
+ USER_PASSWORD_ERROR = StatusCodeField(400502, 'User Password Error', description=u'用户密码错误') |
|
50 |
+ USERNAME_HAS_REGISTERED = StatusCodeField(400503, 'Username Has Registered', description=u'用户名已注册') |
|
51 |
+ # 游客 |
|
52 |
+ GUEST_NOT_ALLOWED = StatusCodeField(400511, 'Guest Not ALLOWED', description=u'游客登录未开启') |
|
53 |
+ # 身份 |
|
54 |
+ USER_NOT_LENSMAN = StatusCodeField(400521, 'User Not Lensman', description=u'用户非摄影师') |
|
55 |
+ USER_NOT_TOURGUIDE = StatusCodeField(400522, 'User Not Tourguide', description=u'用户非导游') |
|
56 |
+ |
|
57 |
+ |
|
58 |
+class PhoneStatusCode(BaseStatusCode): |
|
59 |
+ """ 手机相关错误码 4006xx """ |
|
60 |
+ PHONE_NOT_FOUND = StatusCodeField(400601, 'Phone Not Found', description=u'手机不存在') |
|
61 |
+ |
|
62 |
+ |
|
63 |
+class WechatStatusCode(BaseStatusCode): |
|
64 |
+ """ 微信相关错误码 4007xx """ |
|
65 |
+ WECHAT_NOT_FOUND = StatusCodeField(400701, 'Wechat Not Found', description=u'微信不存在') |
|
66 |
+ UNIONID_NOT_FOUND = StatusCodeField(400702, 'Unionid Not Found', description=u'微信 UNIONID 不存在') |
|
67 |
+ OPENID_NOT_FOUND = StatusCodeField(400703, 'OPENID Not Found', description=u'微信 OPENID 不存在') |
|
68 |
+ |
|
69 |
+ |
|
70 |
+class ScreenStatusCode(BaseStatusCode): |
|
71 |
+ """ 群组/团相关错误码 4030xx """ |
|
72 |
+ QRCODE_NOT_SCAN = StatusCodeField(403001, 'QRCode Not Scan', description=u'二维码未扫描') |
|
73 |
+ |
|
74 |
+ |
|
75 |
+class CouponStatusCode(BaseStatusCode): |
|
76 |
+ """ 4050xx 优惠劵相关错误码 """ |
|
77 |
+ COUPON_NOT_FOUND = StatusCodeField(405001, 'Coupon Not Found', description=u'劵不存在') |
|
78 |
+ COUPON_EXPIRED = StatusCodeField(405002, 'Coupon Expired', description=u'劵已过期') |
|
79 |
+ COUPON_PERMISSION_DENIED = StatusCodeField(405003, 'Permission Denied', description=u'核销劵权限不足') |
|
80 |
+ COUPON_HAS_USED = StatusCodeField(405004, 'Coupon Has Used', description=u'劵已核销') |
|
81 |
+ |
|
82 |
+ |
|
11 | 83 |
class SaleclerkStatusCode(BaseStatusCode): |
12 | 84 |
""" 店员相关错误码 5001xx """ |
13 | 85 |
CLERK_NOT_FOUND = StatusCodeField(500101, 'Clerk Not Found', description=u'店员不存在') |
@@ -138,75 +210,3 @@ class MaintenanceStatusCode(BaseStatusCode): |
||
138 | 210 |
""" 维修相关错误码 5080xx """ |
139 | 211 |
MAINTENACE_NOT_FOUND = StatusCodeField(508001, 'Maintenance Not Found', description=u'维修不存在') |
140 | 212 |
MAINTENACE_PERMISSION_DENIED = StatusCodeField(508002, 'Maintenance Permission Denied', description=u'维修权限不足') |
141 |
- |
|
142 |
- |
|
143 |
-class AdministratorStatusCode(BaseStatusCode): |
|
144 |
- """ 操作员相关错误码 4002xx """ |
|
145 |
- ADMINISTRATOR_NOT_FOUND = StatusCodeField(400201, 'Administrator Not Found', description=u'管理员不存在') |
|
146 |
- ADMINISTRATOR_PERMISSION_DENIED = StatusCodeField(508002, 'Administrator Permission Denied', description=u'管理员权限不足') |
|
147 |
- |
|
148 |
- # 密码 |
|
149 |
- ADMINISTRATOR_PASSWORD_ERROR = StatusCodeField(400202, 'Administrator Password Error', description=u'管理员密码错误') |
|
150 |
- # 手机号 |
|
151 |
- ADMINISTRATOR_PHONE_ALREADY_EXISTS = StatusCodeField(400205, 'Administrator Phone Already Exists', description=u'管理员手机号已经存在') |
|
152 |
- # 状态 |
|
153 |
- ADMINISTRATOR_NOT_ACTIVATED = StatusCodeField(400215, 'Administrator Not Activated', description=u'管理员未激活') |
|
154 |
- ADMINISTRATOR_HAS_DISABLED = StatusCodeField(400216, 'Administrator Has Disabled', description=u'管理员已禁用') |
|
155 |
- ADMINISTRATOR_HAS_DELETED = StatusCodeField(400217, 'Administrator Has Deleted', description=u'管理员已删除') |
|
156 |
- # 管理员 |
|
157 |
- MAINTENANCE_NOT_FOUND = StatusCodeField(400251, 'Maintenance Not Found', description=u'核销员不存在') |
|
158 |
- |
|
159 |
- |
|
160 |
-class OperatorStatusCode(BaseStatusCode): |
|
161 |
- """ 操作员相关错误码 4003xx """ |
|
162 |
- OPERATOR_NOT_FOUND = StatusCodeField(400301, 'Operator Not Found', description=u'操作员不存在') |
|
163 |
- # 密码 |
|
164 |
- OPERATOR_PASSWORD_ERROR = StatusCodeField(400302, 'Operator Password Error', description=u'操作员密码错误') |
|
165 |
- # 手机号 |
|
166 |
- OPERATOR_PHONE_ALREADY_EXISTS = StatusCodeField(400305, 'Operator Phone Already Exists', description=u'操作员手机号已经存在') |
|
167 |
- # 状态 |
|
168 |
- OPERATOR_NOT_ACTIVATED = StatusCodeField(400315, 'Operator Not Activated', description=u'操作员未激活') |
|
169 |
- OPERATOR_HAS_DISABLED = StatusCodeField(400316, 'Operator Has Disabled', description=u'操作员已禁用') |
|
170 |
- OPERATOR_HAS_DELETED = StatusCodeField(400317, 'Operator Has Deleted', description=u'操作员已删除') |
|
171 |
- |
|
172 |
- |
|
173 |
-class UserStatusCode(BaseStatusCode): |
|
174 |
- """ 用户相关错误码 4005xx """ |
|
175 |
- USER_NOT_FOUND = StatusCodeField(400501, 'User Not Found', description=u'用户不存在') |
|
176 |
- USER_PASSWORD_ERROR = StatusCodeField(400502, 'User Password Error', description=u'用户密码错误') |
|
177 |
- USERNAME_HAS_REGISTERED = StatusCodeField(400503, 'Username Has Registered', description=u'用户名已注册') |
|
178 |
- # 游客 |
|
179 |
- GUEST_NOT_ALLOWED = StatusCodeField(400511, 'Guest Not ALLOWED', description=u'游客登录未开启') |
|
180 |
- # 身份 |
|
181 |
- USER_NOT_LENSMAN = StatusCodeField(400521, 'User Not Lensman', description=u'用户非摄影师') |
|
182 |
- USER_NOT_TOURGUIDE = StatusCodeField(400522, 'User Not Tourguide', description=u'用户非导游') |
|
183 |
- |
|
184 |
- |
|
185 |
-class PhoneStatusCode(BaseStatusCode): |
|
186 |
- """ 手机相关错误码 4006xx """ |
|
187 |
- PHONE_NOT_FOUND = StatusCodeField(400601, 'Phone Not Found', description=u'手机不存在') |
|
188 |
- |
|
189 |
- |
|
190 |
-class WechatStatusCode(BaseStatusCode): |
|
191 |
- """ 微信相关错误码 4007xx """ |
|
192 |
- WECHAT_NOT_FOUND = StatusCodeField(400701, 'Wechat Not Found', description=u'微信不存在') |
|
193 |
- UNIONID_NOT_FOUND = StatusCodeField(400702, 'Unionid Not Found', description=u'微信 UNIONID 不存在') |
|
194 |
- OPENID_NOT_FOUND = StatusCodeField(400703, 'OPENID Not Found', description=u'微信 OPENID 不存在') |
|
195 |
- |
|
196 |
- |
|
197 |
-class ScreenStatusCode(BaseStatusCode): |
|
198 |
- """ 群组/团相关错误码 4030xx """ |
|
199 |
- QRCODE_NOT_SCAN = StatusCodeField(403001, 'QRCode Not Scan', description=u'二维码未扫描') |
|
200 |
- |
|
201 |
- |
|
202 |
-class PermissionStatusCode(BaseStatusCode): |
|
203 |
- """ 4099xx 权限相关错误码 """ |
|
204 |
- PERMISSION_DENIED = StatusCodeField(409900, 'Permission Denied', description=u'权限不足') |
|
205 |
- |
|
206 |
- |
|
207 |
-class CouponStatusCode(BaseStatusCode): |
|
208 |
- """ 4050xx 优惠劵相关错误码 """ |
|
209 |
- COUPON_NOT_FOUND = StatusCodeField(405001, 'Coupon Not Found', description=u'劵不存在') |
|
210 |
- COUPON_EXPIRED = StatusCodeField(405002, 'Coupon Expired', description=u'劵已过期') |
|
211 |
- COUPON_PERMISSION_DENIED = StatusCodeField(405003, 'Permission Denied', description=u'核销劵权限不足') |
|
212 |
- COUPON_HAS_USED = StatusCodeField(405004, 'Coupon Has Used', description=u'劵已核销') |