|
# -*- coding: utf-8 -*-
import logging
import requests
import json
from django.core.paginator import Paginator
from django.contrib.auth.hashers import check_password
from django.db import transaction
from django.db.models import Q
from django_logit import logit
from django_response import response
from django.core.files import File
from TimeConvert import TimeConvert as tc
from django.conf import settings
from pywe_token import access_token
from pywe_storage import RedisStorage
from account.models import AdministratorInfo
from goods.models import GoodsInfo, PackInfo
from kol.models import KOLInfo
from pay.models import OrderInfo
from live.models import RoomInfo, RoomGoodsInfo, RoomOrderInfo, AnchorInfo, liveGoodsInfo
from utils.error.errno_utils import AdministratorStatusCode, OrderStatusCode
from utils.redis.connect import r
logger = logging.getLogger('logit')
WECHAT = settings.WECHAT
@logit(res=True)
def login(request):
name = request.POST.get('name', '')
password = request.POST.get('password', '')
try:
administrator = AdministratorInfo.objects.get(name=name, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
if administrator.user_status == AdministratorInfo.DISABLED:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_ACTIVATED)
elif administrator.user_status == AdministratorInfo.DELETED:
return response(AdministratorStatusCode.ADMINISTRATOR_HAS_DELETED)
if not check_password(password, administrator.encryption):
return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR)
request.session['admin_id'] = administrator.admin_id
return response(200, 'Admin Login Success', '管理员登录成功', data={
'admin_id': administrator.admin_id,
'admin_type': administrator.admin_type,
})
@logit(res=True)
def order_list(request):
admin_id = request.POST.get('admin_id', '')
kol_id = request.POST.get('kol_id', '')
pack_id = request.POST.get('pack_id', '')
ftime = request.POST.get('ftime', '')
ttime = request.POST.get('ttime', '')
query = request.POST.get('query', '')
page = request.POST.get('page', 0)
num = request.POST.get('num', 20)
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
infos = OrderInfo.objects.filter(
Q(phone__contains=query) | Q(name__contains=query) & Q(kol_id__contains=kol_id) & Q(
pack_id__contains=pack_id) & Q(pay_status=1)).order_by('-paid_at')
res = []
for info in infos:
goods_info = []
try:
pack = PackInfo.objects.get(pack_id=info.pack_id)
except PackInfo.DoesNotExist:
continue
try:
kol = KOLInfo.objects.get(kol_id=info.kol_id)
except KOLInfo.DoesNotExist:
continue
for g in info.goods_info:
try:
goods = GoodsInfo.objects.get(good_id=g.get('good_id', ''))
except GoodsInfo.DoesNotExist:
continue
goods_info.append({
'title': goods.title,
'num': g.get('num', 0)
})
res.append({
'name': info.name,
'phone': info.phone,
'address': info.address,
'paid_at': tc.local_string(utc_dt=info.paid_at, format='%Y-%m-%d %H:%M'),
'order_id': info.order_id,
'transaction_id': info.transaction_id,
'tracking_number': info.tracking_number,
'goods_info': goods_info,
'kol_name': kol.name,
'pack_title': pack.title
})
return response(200, 'Order List Success', '获取订单列表成功', {
'orders': res
})
@logit(res=True)
@transaction.atomic
def order_update(request):
admin_id = request.POST.get('admin_id', '')
order_id = request.POST.get('order_id', '')
tracking_number = request.POST.get('tracking_number', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
try:
order = OrderInfo.objects.get(order_id=order_id)
except OrderInfo.DoesNotExist:
return response(OrderStatusCode.ORDER_NOT_FOUND)
order.tracking_number = tracking_number
order.save()
return response(200, 'Order Update Success', '订单更新成功')
@logit(res=True)
def live_goods_list(request):
admin_id = request.POST.get('admin_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
goods_list = liveGoodsInfo.objects.filter(status=True).order_by('-created_at')
count = goods_list.count()
goods_list = Paginator(goods_list, num).get_page(page)
goods_list = [goods.admindata for goods in goods_list]
return response(200, 'Live Goods Success', u'直播商品库获取成功', data={
'goods_list': goods_list,
'count': count,
})
@logit(res=True)
def live_goods_create(request):
admin_id = request.POST.get('admin_id', '')
goods_name = request.POST.get('goods_name', '')
goods_img = request.POST.get('goods_img', '')
price_type = int(request.POST.get('price_type', 1))
price = int(request.POST.get('price', 0))
price2 = int(request.POST.get('price2', 0))
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
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
media_id = json.loads(media).get('media_id', '')
if media_id == '':
return response()
goods_info, _ = liveGoodsInfo.objects.get_or_create(
name=goods_name,
coverImgUrl=media_id,
price_type=price_type,
price=price,
price2=price2,
goods_img=goods_img
)
data ={
"goodsInfo": {
'name': goods_name,
'coverImgUrl': media_id,
'priceType': price_type,
'price': price,
'price2': price2,
'url': 'pages/live/order/order?goods_id=' + goods_info.goods_id,
}
}
wx_goods = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=' + token), json=data).text
wx_goods = json.loads(wx_goods)
goods_info.wx_goods_id = wx_goods.get('goodsId', '')
goods_info.audit_id = wx_goods.get('auditId', '')
goods_info.url = 'pages/live/order/order?goods_id=' + goods_info.goods_id,
goods_info.save()
return response(200, 'Live Goods Create Success', u'直播商品库创建成功', data={
'goods': goods_info.admindata,
})
@logit(res=True)
def live_goods_audit(request):
admin_id = request.POST.get('admin_id', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
goods_infos = liveGoodsInfo.objects.exclude(audit_status=2)
wx_goods_ids = [goods.wx_goods_id for goods in goods_infos]
data = {
"goods_ids": wx_goods_ids
}
wx_goods_infos = requests.post(url=('https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token=' + token), json=data).text
wx_goods_infos = json.loads(wx_goods_infos).get('goods', [])
for goods in wx_goods_infos:
g = liveGoodsInfo.objects.get(wx_goods_id=goods.get('goods_id', ''), status=True)
g.audit_status = goods.get('audit_status', 0)
g.save()
return response(200, 'Live Goods Audit Success', '获取直播商品库审核状态成功')
@logit(res=True)
def live_goods_delete(request):
admin_id = request.POST.get('admin_id', '')
goods_id = request.POST.get('goods_id', '')
wx_goods_id = request.POST.get('wx_goods_id', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
status = requests.post(url=('https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=' + token), json={ 'goodsId': wx_goods_id}).text
errcode = json.loads(status).get('errcode', -1)
if errcode != 0:
return response()
try:
liveGoodsInfo.objects.filter(goods_id=goods_id, status=True).update(status=False)
except:
return response()
return response(200, 'Live Goods Delete Success', '直播商品库删除成功')
@logit(res=True)
def live_room_list(request):
admin_id = request.POST.get('admin_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
rooms = RoomInfo.objects.all()
count = rooms.count()
rooms = Paginator(rooms, num).get_page(page)
rooms = [room.admindata for room in rooms]
return response(200, 'Live Goods Success', u'直播商品库获取成功', data={
'rooms': rooms,
'count': count,
})
@logit(res=True)
def live_order_list(request):
admin_id = request.POST.get('admin_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
pay_status = request.POST.get('pay_status', '')
query = request.POST.get('query', '')
goods_name = request.POST.get('goods_name', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
orders = RoomOrderInfo.objects.filter(Q(name__contains=query) | Q(phone__contains=query)).order_by('-created_at')
if pay_status:
orders = orders.filter(pay_status=pay_status)
if goods_name:
goods_infos = liveGoodsInfo.objects.filter(goods_name__contains=goods_name)
goods_infos = [info.goods_id for info in goods_infos]
orders = orders.filter(goods_id__in=goods_infos)
count = orders.count()
orders = Paginator(orders, num).get_page(page)
orders = [order.admindata for order in orders]
return response(200, 'Live Goods Success', u'直播商品库获取成功', data={
'orders': orders,
'count': count,
})
@logit(res=True)
def fetch_wx_room_list(request):
admin_id = request.POST.get('admin_id', '')
try:
administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
except AdministratorInfo.DoesNotExist:
return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)
wxcfg = WECHAT.get('MINIAPP', {})
appid = wxcfg.get('appID')
secret = wxcfg.get('appsecret')
token = access_token(appid, secret)
rooms = RoomInfo.objects.exclude(Q(live_status=101) | Q(live_status=102))
start = 0
if rooms.count() != 0:
start = int(rooms[0].room_id) - 1
roominfos = requests.post(url=('http://api.weixin.qq.com/wxa/business/getliveinfo?access_token='+token), json={'start': 0, 'limit': 99})
roominfos = json.loads(roominfos.text).get('room_info', {})
for roominfo in roominfos:
anchor, _ = AnchorInfo.objects.get_or_create(
anchor_name=roominfo.get('anchor_name')
)
room, _ = RoomInfo.objects.get_or_create(
room_id=roominfo.get('roomid')
)
room.name = roominfo.get('name', '')
room.live_status = roominfo.get('live_status', '')
room.start_time = roominfo.get('start_time', '')
room.end_time = roominfo.get('end_time', '')
room.wx_cover_img = roominfo.get('cover_img', '')
room.wx_share_img = roominfo.get('share_img', '')
room.anchor_name = roominfo.get('anchor_name', '')
room.anchor_id = anchor.anchor_id
room.save()
return response(200, 'Fetch wx Room List Success', u'微信直播间列表获取成功')
|