re> 80
+    "十",
81
+    "百",
82
+    "千",
83
+]
84
+UNIT_UP_ORDER_AN2CN = [
85
+    "",
86
+    "拾",
87
+    "佰",
88
+    "仟",
89
+    "万",
90
+    "拾",
91
+    "佰",
92
+    "仟",
93
+    "亿",
94
+    "拾",
95
+    "佰",
96
+    "仟",
97
+    "万",
98
+    "拾",
99
+    "佰",
100
+    "仟",
101
+]
102
+STRICT_CN_NUMBER = {
103
+    "零": "零",
104
+    "一": "一壹",
105
+    "二": "二贰",
106
+    "三": "三叁",
107
+    "四": "四肆",
108
+    "五": "五伍",
109
+    "六": "六陆",
110
+    "七": "七柒",
111
+    "八": "八捌",
112
+    "九": "九玖",
113
+    "十": "十拾",
114
+    "百": "百佰",
115
+    "千": "千仟",
116
+    "万": "万",
117
+    "亿": "亿",
118
+}
119
+NORMAL_CN_NUMBER = {
120
+    "零": "零〇",
121
+    "一": "一壹幺",
122
+    "二": "二贰两",
123
+    "三": "三叁仨",
124
+    "四": "四肆",
125
+    "五": "五伍",
126
+    "六": "六陆",
127
+    "七": "七柒",
128
+    "八": "八捌",
129
+    "九": "九玖",
130
+    "十": "十拾",
131
+    "百": "百佰",
132
+    "千": "千仟",
133
+    "万": "万",
134
+    "亿": "亿",
135
+}

+ 29 - 0
utils/cn2an/performance.py

@@ -0,0 +1,29 @@
1
+import torbjorn as tbn
2
+
3
+from .an2cn import An2Cn
4
+from .cn2an import Cn2An
5
+
6
+ac = An2Cn()
7
+ca = Cn2An()
8
+
9
+an = 9876543298765432
10
+cn = "九千八百七十六万五千四百三十二亿九千八百七十六万五千四百三十二"
11
+
12
+
13
+@tbn.run_time
14
+def run_cn2an_ten_thousand_times() -> None:
15
+    for _ in range(10000):
16
+        result = ca.cn2an(cn)
17
+        assert result == an
18
+
19
+
20
+@tbn.run_time
21
+def run_an2cn_ten_thousand_times() -> None:
22
+    for _ in range(10000):
23
+        result = ac.an2cn(an)
24
+        assert result == cn
25
+
26
+
27
+if __name__ == '__main__':
28
+    run_cn2an_ten_thousand_times()
29
+    run_an2cn_ten_thousand_times()

+ 104 - 0
utils/cn2an/transform.py

@@ -0,0 +1,104 @@
1
+import re
2
+from warnings import warn
3
+
4
+from .cn2an import Cn2An
5
+from .an2cn import An2Cn
6
+from .conf import UNIT_CN2AN
7
+
8
+
9
+class Transform(object):
10
+    def __init__(self) -> None:
11
+        self.all_num = "零一二三四五六七八九"
12
+        self.all_unit = "".join(list(UNIT_CN2AN.keys()))
13
+        self.cn2an = Cn2An().cn2an
14
+        self.an2cn = An2Cn().an2cn
15
+        self.cn_pattern = f"负?([{self.all_num}{self.all_unit}]+点)?[{self.all_num}{self.all_unit}]+"
16
+        self.smart_cn_pattern = f"-?([0-9]+.)?[0-9]+[{self.all_unit}]+"
17
+
18
+    def transform(self, inputs: str, method: str = "cn2an") -> str:
19
+        if method == "cn2an":
20
+            inputs = inputs.replace("廿", "二十").replace("半", "0.5").replace("两", "2")
21
+            # date
22
+            inputs = re.sub(
23
+                fr"((({self.smart_cn_pattern})|({self.cn_pattern}))年)?([{self.all_num}十]+月)?([{self.all_num}十]+日)?",
24
+                lambda x: self.__sub_util(x.group(), "cn2an", "date"), inputs)
25
+            # fraction
26
+            inputs = re.sub(fr"{self.cn_pattern}分之{self.cn_pattern}",
27
+                            lambda x: self.__sub_util(x.group(), "cn2an", "fraction"), inputs)
28
+            # percent
29
+            inputs = re.sub(fr"百分之{self.cn_pattern}",
30
+                            lambda x: self.__sub_util(x.group(), "cn2an", "percent"), inputs)
31
+            # celsius
32
+            inputs = re.sub(fr"{self.cn_pattern}摄氏度",
33
+                            lambda x: self.__sub_util(x.group(), "cn2an", "celsius"), inputs)
34
+            # number
35
+            output = re.sub(self.cn_pattern,
36
+                            lambda x: self.__sub_util(x.group(), "cn2an", "number"), inputs)
37
+
38
+        elif method == "an2cn":
39
+            # date
40
+            inputs = re.sub(r"(\d{2,4}年)?(\d{1,2}月)?(\d{1,2}日)?",
41
+                            lambda x: self.__sub_util(x.group(), "an2cn", "date"), inputs)
42
+            # fraction
43
+            inputs = re.sub(r"\d+/\d+",
44
+                            lambda x: self.__sub_util(x.group(), "an2cn", "fraction"), inputs)
45
+            # percent
46
+            inputs = re.sub(r"-?(\d+\.)?\d+%",
47
+                            lambda x: self.__sub_util(x.group(), "an2cn", "percent"), inputs)
48
+            # celsius
49
+            inputs = re.sub(r"\d+℃",
50
+                            lambda x: self.__sub_util(x.group(), "an2cn", "celsius"), inputs)
51
+            # number
52
+            output = re.sub(r"-?(\d+\.)?\d+",
53
+                            lambda x: self.__sub_util(x.group(), "an2cn", "number"), inputs)
54
+        else:
55
+            raise ValueError(f"error method: {method}, only support 'cn2an' and 'an2cn'!")
56
+
57
+        return output
58
+
59
+    def __sub_util(self, inputs, method: str = "cn2an", sub_mode: str = "number") -> str:
60
+        try:
61
+            if inputs:
62
+                if method == "cn2an":
63
+                    if sub_mode == "date":
64
+                        return re.sub(fr"(({self.smart_cn_pattern})|({self.cn_pattern}))",
65
+                                      lambda x: str(self.cn2an(x.group(), "smart")), inputs)
66
+                    elif sub_mode == "fraction":
67
+                        if inputs[0] != "百":
68
+                            frac_result = re.sub(self.cn_pattern,
69
+                                                 lambda x: str(self.cn2an(x.group(), "smart")), inputs)
70
+                            numerator, denominator = frac_result.split("分之")
71
+                            return f"{denominator}/{numerator}"
72
+                        else:
73
+                            return inputs
74
+                    elif sub_mode == "percent":
75
+                        return re.sub(f"(?<=百分之){self.cn_pattern}",
76
+                                      lambda x: str(self.cn2an(x.group(), "smart")), inputs).replace("百分之", "") + "%"
77
+                    elif sub_mode == "celsius":
78
+                        return re.sub(f"{self.cn_pattern}(?=摄氏度)",
79
+                                      lambda x: str(self.cn2an(x.group(), "smart")), inputs).replace("摄氏度", "℃")
80
+                    elif sub_mode == "number":
81
+                        return str(self.cn2an(inputs, "smart"))
82
+                    else:
83
+                        raise Exception(f"error sub_mode: {sub_mode} !")
84
+                else:
85
+                    if sub_mode == "date":
86
+                        inputs = re.sub(r"\d+(?=年)",
87
+                                        lambda x: self.an2cn(x.group(), "direct"), inputs)
88
+                        return re.sub(r"\d+",
89
+                                      lambda x: self.an2cn(x.group(), "low"), inputs)
90
+                    elif sub_mode == "fraction":
91
+                        frac_result = re.sub(r"\d+", lambda x: self.an2cn(x.group(), "low"), inputs)
92
+                        numerator, denominator = frac_result.split("/")
93
+                        return f"{denominator}分之{numerator}"
94
+                    elif sub_mode == "celsius":
95
+                        return self.an2cn(inputs[:-1], "low") + "摄氏度"
96
+                    elif sub_mode == "percent":
97
+                        return "百分之" + self.an2cn(inputs[:-1], "low")
98
+                    elif sub_mode == "number":
99
+                        return self.an2cn(inputs, "low")
100
+                    else:
101
+                        raise Exception(f"error sub_mode: {sub_mode} !")
102
+        except Exception as e:
103
+            warn(str(e))
104
+            return inputs

+ 40 - 0
utils/cn2an/transform_test.py

@@ -0,0 +1,40 @@
1
+import unittest
2
+
3
+from .transform import Transform
4
+
5
+
6
+class TransformTest(unittest.TestCase):
7
+    def setUp(self) -> None:
8
+        self.strict_data_dict = {
9
+            "小王捡了100块钱": "小王捡了一百块钱",
10
+            "用户增长最快的3个城市": "用户增长最快的三个城市",
11
+            "小王的生日是2001年3月4日": "小王的生日是二零零一年三月四日",
12
+            "小王的生日是2012年12月12日": "小王的生日是二零一二年十二月十二日",
13
+            "今天股价上涨了8%": "今天股价上涨了百分之八",
14
+            "第2天股价下降了-3.8%": "第二天股价下降了百分之负三点八",
15
+            "抛出去的硬币为正面的概率是1/2": "抛出去的硬币为正面的概率是二分之一",
16
+            "现在室内温度为39℃,很热啊!": "现在室内温度为三十九摄氏度,很热啊!",
17
+            "创业板指9月9日早盘低开1.57%": "创业板指九月九日早盘低开百分之一点五七"
18
+        }
19
+
20
+        self.smart_data_dict = {
21
+            "约2.5亿年~6500万年": "约250000000年~65000000年",
22
+            "廿二日,日出东方": "22日,日出东方",
23
+            "大陆": "大陆",
24
+            "半斤": "0.5斤",
25
+            "两个": "2个",
26
+        }
27
+
28
+        self.t = Transform()
29
+
30
+    def test_transform(self) -> None:
31
+        for strict_item in self.strict_data_dict.keys():
32
+            self.assertEqual(self.t.transform(strict_item, "an2cn"), self.strict_data_dict[strict_item])
33
+            self.assertEqual(self.t.transform(self.strict_data_dict[strict_item], "cn2an"), strict_item)
34
+
35
+        for smart_item in self.smart_data_dict.keys():
36
+            self.assertEqual(self.t.transform(smart_item, "cn2an"), self.smart_data_dict[smart_item])
37
+
38
+
39
+if __name__ == '__main__':
40
+    unittest.main()

:art: Add tenancy shot request relative apis · 9161390df8 - Gogs: Go Git Service

:art: Add tenancy shot request relative apis

huangqimin001 3 years ago
parent
commit
9161390df8
5 changed files with 267 additions and 9 deletions
  1. 141 5
      api/tenancy_admin_views.py
  2. 104 3
      api/tenancy_views.py
  3. 14 1
      api/urls.py
  4. 6 0
      tenancy/models.py
  5. 2 0
      utils/error/errno_utils.py

+ 141 - 5
api/tenancy_admin_views.py

@@ -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
+    })

+ 104 - 3
api/tenancy_views.py

@@ -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
+    })

+ 14 - 1
api/urls.py

@@ -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
 ]

+ 6 - 0
tenancy/models.py

@@ -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,

+ 2 - 0
utils/error/errno_utils.py

@@ -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'租赁镜头申请不存在')

Sign In - Gogs: Go Git Service

Sign In