live admin api

FFIB 5 年之前
父节点
当前提交
b3e96ee50a
共有 4 个文件被更改,包括 167 次插入5 次删除
  1. 123 1
      api/admin_views.py
  2. 10 0
      api/urls.py
  3. 29 0
      live/migrations/0016_auto_20200524_2041.py
  4. 5 4
      live/models.py

+ 123 - 1
api/admin_views.py

@@ -10,6 +10,7 @@ from django.db import transaction
10 10
 from django.db.models import Q
11 11
 from django_logit import logit
12 12
 from django_response import response
13
+from django.core.files import File
13 14
 from TimeConvert import TimeConvert as tc
14 15
 from django.conf import settings
15 16
 
@@ -151,7 +152,7 @@ def live_goods_list(request):
151 152
     except AdministratorInfo.DoesNotExist:
152 153
         return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
153 154
 
154
-    goods_list = liveGoodsInfo.objects.all()
155
+    goods_list = liveGoodsInfo.objects.filter(status=True).order_by('-created_at')
155 156
     count = goods_list.count()
156 157
     goods_list = Paginator(goods_list, num).get_page(page)
157 158
     goods_list = [goods.admindata for goods in goods_list]
@@ -162,6 +163,127 @@ def live_goods_list(request):
162 163
     })
163 164
 
164 165
 @logit(res=True)
166
+def live_goods_create(request):
167
+    admin_id = request.POST.get('admin_id', '')
168
+    goods_name = request.POST.get('goods_name', '')
169
+    goods_img = request.POST.get('goods_img', '')
170
+    price_type = int(request.POST.get('price_type', 1))
171
+    price = int(request.POST.get('price', 0))
172
+    price2 = int(request.POST.get('price2', 0))
173
+
174
+    try:
175
+        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
176
+    except AdministratorInfo.DoesNotExist:
177
+        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
178
+    
179
+
180
+    wxcfg = WECHAT.get('MINIAPP', {})
181
+
182
+    appid = wxcfg.get('appID')
183
+    secret = wxcfg.get('appsecret')
184
+    token = access_token(appid, secret)
185
+
186
+    media = requests.post(url=('https://api.weixin.qq.com/cgi-bin/media/upload?access_token=' + token + '&type=image'), files={'media': open(settings.MEDIA_ROOT + '/' + goods_img, 'rb')}).text
187
+    media_id = json.loads(media).get('media_id', '')
188
+
189
+    if media_id == '':
190
+        return response()
191
+    
192
+    goods_info, _ = liveGoodsInfo.objects.get_or_create(
193
+        name=goods_name,
194
+        coverImgUrl=media_id,
195
+        price_type=price_type,
196
+        price=price,
197
+        price2=price2,
198
+        goods_img=goods_img
199
+    )
200
+
201
+    data ={
202
+        "goodsInfo": {
203
+            'name': goods_name,
204
+            'coverImgUrl': media_id,
205
+            'priceType': price_type,
206
+            'price': price,
207
+            'price2': price2,
208
+            'url': 'pages/live/order/order?goods_id=' + goods_info.goods_id,
209
+        }
210
+    } 
211
+
212
+    wx_goods = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=' + token), json=data).text
213
+    wx_goods = json.loads(wx_goods)
214
+    goods_info.wx_goods_id = wx_goods.get('goodsId', '')
215
+    goods_info.audit_id = wx_goods.get('auditId', '')
216
+    goods_info.url = 'pages/live/order/order?goods_id=' + goods_info.goods_id,
217
+    goods_info.save()
218
+
219
+    return response(200, 'Live Goods Create Success', u'直播商品库创建成功', data={
220
+        'goods': goods_info.admindata,
221
+    })
222
+
223
+@logit(res=True)
224
+def live_goods_audit(request):
225
+    admin_id = request.POST.get('admin_id', '')
226
+    try:
227
+        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
228
+    except AdministratorInfo.DoesNotExist:
229
+        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
230
+    
231
+
232
+    wxcfg = WECHAT.get('MINIAPP', {})
233
+
234
+    appid = wxcfg.get('appID')
235
+    secret = wxcfg.get('appsecret')
236
+    token = access_token(appid, secret)
237
+
238
+    goods_infos = liveGoodsInfo.objects.exclude(audit_status=2)
239
+    wx_goods_ids = [goods.wx_goods_id for goods in goods_infos]
240
+
241
+    data = {
242
+        "goods_ids": wx_goods_ids
243
+    }
244
+    wx_goods_infos = requests.post(url=('https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token=' + token), json=data).text
245
+    wx_goods_infos = json.loads(wx_goods_infos).get('goods', [])
246
+
247
+    for goods in wx_goods_infos:
248
+        g = liveGoodsInfo.objects.get(wx_goods_id=goods.get('goods_id', ''), status=True)
249
+        g.audit_status = goods.get('audit_status', 0)
250
+        g.save()
251
+    
252
+    return response(200, 'Live Goods Audit Success', '获取直播商品库审核状态成功') 
253
+
254
+
255
+@logit(res=True)
256
+def live_goods_delete(request):
257
+    admin_id = request.POST.get('admin_id', '')
258
+    goods_id = request.POST.get('goods_id', '')
259
+    wx_goods_id = request.POST.get('wx_goods_id', '')
260
+    try:
261
+        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
262
+    except AdministratorInfo.DoesNotExist:
263
+        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
264
+    
265
+
266
+    wxcfg = WECHAT.get('MINIAPP', {})
267
+
268
+    appid = wxcfg.get('appID')
269
+    secret = wxcfg.get('appsecret')
270
+    token = access_token(appid, secret)
271
+
272
+    status = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=' + token), json={ 'goodsId': wx_goods_id}).text
273
+    errcode = json.loads(status).get('errcode', -1)
274
+
275
+    if errcode != 0:
276
+        return response()
277
+    
278
+    try:
279
+        liveGoodsInfo.objects.filter(goods_id=goods_id, status=True).update(status=False)
280
+    except:
281
+        return response()
282
+    
283
+    return response(200, 'Live Goods Delete Success', '直播商品库删除成功') 
284
+
285
+
286
+@logit(res=True)
165 287
 def live_room_list(request):
166 288
     admin_id = request.POST.get('admin_id', '')
167 289
     page = request.POST.get('page', 1)

+ 10 - 0
api/urls.py

@@ -1,6 +1,7 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3 3
 from django.conf.urls import url
4
+from django_file_upload import views as file_views
4 5
 
5 6
 from api import admin_views, mini_views, oauth_views, pack_views
6 7
 from pay import views as pay_views
@@ -32,6 +33,11 @@ urlpatterns += [
32 33
     url(r'^mini/live/login$', mini_views.mini_live_login_api, name='mini_live_login_api'),
33 34
 ]
34 35
 
36
+# 图片上传
37
+urlpatterns += [
38
+    url(r'^upload$', file_views.file_upload, name='file_upload'),
39
+]
40
+
35 41
 urlpatterns += [
36 42
     url(r'^admin/login$', admin_views.login, name='login'),
37 43
 
@@ -40,6 +46,10 @@ urlpatterns += [
40 46
 
41 47
     # 直播
42 48
     url(r'^admin/live/goods/list$', admin_views.live_goods_list, name='live_goods_list'),   # 直播商品库列表
49
+    url(r'^admin/live/goods/create$', admin_views.live_goods_create, name='live_goods_create'),
50
+    url(r'^admin/live/goods/delete$', admin_views.live_goods_delete, name='live_goods_delete'),
51
+    url(r'^admin/live/goods/audit$', admin_views.live_goods_audit, name='live_goods_audit'),
52
+
43 53
     url(r'^admin/live/room/list$', admin_views.live_room_list, name='live_room_list'),   # 直播间列表
44 54
     url(r'^admin/live/order/list$', admin_views.live_order_list, name='live_order_list'),   # 直播间列表
45 55
 

+ 29 - 0
live/migrations/0016_auto_20200524_2041.py

@@ -0,0 +1,29 @@
1
+# Generated by Django 2.2.12 on 2020-05-24 12:41
2
+
3
+from django.db import migrations, models
4
+import django_models_ext.fileext
5
+
6
+
7
+class Migration(migrations.Migration):
8
+
9
+    dependencies = [
10
+        ('live', '0015_roomuserinfo_live_status'),
11
+    ]
12
+
13
+    operations = [
14
+        migrations.AlterField(
15
+            model_name='livegoodsinfo',
16
+            name='audit_id',
17
+            field=models.CharField(blank=True, db_index=True, default=0, help_text='审核单ID', max_length=255, verbose_name='audit_id'),
18
+        ),
19
+        migrations.AlterField(
20
+            model_name='livegoodsinfo',
21
+            name='coverImgUrl',
22
+            field=models.CharField(blank=True, db_index=True, help_text='微信mediaID', max_length=255, verbose_name='coverImgUrl'),
23
+        ),
24
+        migrations.AlterField(
25
+            model_name='livegoodsinfo',
26
+            name='goods_img',
27
+            field=models.FileField(blank=True, help_text='商品图', upload_to=django_models_ext.fileext.upload_path, verbose_name='goods_img'),
28
+        ),
29
+    ]

+ 5 - 4
live/models.py

@@ -120,10 +120,11 @@ class liveGoodsInfo(BaseModelMixin):
120 120
     goods_id = ShortUUIDField(_('goods_id'), max_length=32, blank=True, help_text='商品ID', unique=True)
121 121
 
122 122
     wx_goods_id = models.CharField(_('wx_goods_id'), max_length=255, blank=True, help_text='微信商品ID', db_index=True)
123
-    audit_id = models.CharField(_('anchor_name'), max_length=255, blank=True, help_text='审核单ID', db_index=True)
123
+    audit_id = models.CharField(_('audit_id'), default=0, max_length=255, blank=True, help_text='审核单ID', db_index=True)
124
+    # 商品状态,0:未审核。1:审核中,2:审核通过,3:审核驳回
124 125
     audit_status = models.IntegerField(_('audit_status'), default=0, blank=True, help_text='审核状态', db_index=True)
125 126
 
126
-    goods_img = models.ImageField(_('goods_img'), upload_to=upload_path, help_text='商品图')
127
+    goods_img = models.FileField(_('goods_img'), upload_to=upload_path, blank=True, help_text='商品图')
127 128
 
128 129
     # {
129 130
     #   "goodsInfo": {
@@ -135,7 +136,7 @@ class liveGoodsInfo(BaseModelMixin):
135 136
     #   "url":"pages/index/index"
136 137
     #   }
137 138
     # }
138
-    coverImgUrl = models.CharField(_('anchor_name'), max_length=255, blank=True, help_text='微信mediaID', db_index=True)
139
+    coverImgUrl = models.CharField(_('coverImgUrl'), max_length=255, blank=True, help_text='微信mediaID', db_index=True)
139 140
     name = models.CharField(_('name'), max_length=34, help_text='商品', blank=True, db_index=True)
140 141
 
141 142
     # 价格类型,1:一口价,2:价格区间,3:显示折扣价;1:一口价,只需要传入price,price2不传;2:价格区间,price字段为左边界,price2字段为右边界,price和price2必传。3:折扣价,price字段为原价,price2字段为现价, price和price2必传
@@ -169,7 +170,7 @@ class liveGoodsInfo(BaseModelMixin):
169 170
             'goods_img': self.goods_img_url,
170 171
             'name': self.name,
171 172
             'coverImgUrl': self.coverImgUrl,
172
-            'price_type': self.price,
173
+            'price_type': self.price_type,
173 174
             'price': self.price,
174 175
             'price2': self.price2,
175 176
             'url': self.url