# -*- 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'微信直播间列表获取成功')