|
# -*- coding: utf-8 -*-
from __future__ import division
from django.conf import settings
from django.db import transaction
from django_logit import logit
from django_query import get_query_value
from django_response import response
from paginator import pagination
from account.models import UserInfo
from coupon.models import UserCouponInfo
from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo,
MemberActivitySignupInfo, RightInfo)
from utils.error.errno_utils import (MemberActivityStatusCode, MemberGoodStatusCode, MemberRightStatusCode,
UserStatusCode)
from utils.redis.connect import r
from utils.redis.rkeys import MEMBER_SEND_COUPON_LIST, MEMBER_UPGRADE_INFO
from utils.redis.rshot import get_member_shot_data
@logit
def member(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
# 校验用户是否存在
try:
user = UserInfo.objects.get(user_id=user_id)
except UserInfo.DoesNotExist:
return response(UserStatusCode.USER_NOT_FOUND)
rights = RightInfo.objects.filter(status=True).order_by('position')
rights = [right.data for right in rights]
goods = GoodsInfo.objects.filter(only_for_member=False, left_num__gt=0, status=True).order_by('position')
goods = [good.data(user_id) for good in goods][:2]
member_goods = GoodsInfo.objects.filter(only_for_member=True, left_num__gt=0, minlevel__lte=user.level, status=True).order_by('position')
member_goods = [good.data(user_id) for good in member_goods]
member_goods = [good for good in member_goods if not good['has_member_exchange']]
upgrade_info, _ = r.getdel(MEMBER_UPGRADE_INFO % (brand_id, user_id))
return response(200, data={
'nickname': user.final_nickname,
'avatar': user.avatar,
'integral': user.integral,
'freeze_integral': user.freeze_integral,
'final_integral': user.final_integral,
'shots_num': user.shots_num,
'level': user.level,
'rights': rights,
'goods': goods,
'member_goods': member_goods,
'has_upgrade': bool(upgrade_info),
})
@logit
def rights(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
level = request.POST.get('level', '')
# 校验用户是否存在
try:
user = UserInfo.objects.get(user_id=user_id)
except UserInfo.DoesNotExist:
return response(UserStatusCode.USER_NOT_FOUND)
rights = RightInfo.objects.filter(status=True).order_by('position')
rights = [right.data for right in rights]
return response(200, data={
'nickname': user.final_nickname,
'avatar': user.avatar,
'integral': user.integral,
'freeze_integral': user.freeze_integral,
'final_integral': user.final_integral,
'shots_num': user.shots_num,
'level': user.level,
'rights': rights,
})
@logit
def right_detail(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
right_id = request.POST.get('right_id', '')
try:
right = RightInfo.objects.get(right_id=right_id)
except RightInfo.DoesNotExist:
return response(MemberRightStatusCode.RIGHT_NOT_FOUND)
return response(200, data={
'right': right.data,
})
@logit
def goods(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
# 校验用户是否存在
try:
user = UserInfo.objects.get(user_id=user_id)
except UserInfo.DoesNotExist:
return response(UserStatusCode.USER_NOT_FOUND)
raw_goods = GoodsInfo.objects.filter(only_for_member=False, left_num__gt=0, status=True).order_by('position')
banners = goods = []
for good in raw_goods:
if good.is_slider:
banners.append(good.data(user_id))
else:
goods.append(good.data(user_id))
return response(200, data={
'nickname': user.final_nickname,
'avatar': user.avatar,
'integral': user.integral,
'freeze_integral': user.freeze_integral,
'final_integral': user.final_integral,
'shots_num': user.shots_num,
'level': user.level,
'banners': banners,
'goods': goods,
})
@logit
def good_detail(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
good_id = request.POST.get('good_id', '')
# 校验用户是否存在
try:
user = UserInfo.objects.get(user_id=user_id)
except UserInfo.DoesNotExist:
return response(UserStatusCode.USER_NOT_FOUND)
try:
good = GoodsInfo.objects.get(good_id=good_id)
except GoodsInfo.DoesNotExist:
return response(MemberGoodStatusCode.GOOD_NOT_FOUND)
return response(200, data={
'nickname': user.final_nickname,
'avatar': user.avatar,
'integral': user.integral,
'freeze_integral': user.freeze_integral,
'final_integral': user.final_integral,
'shots_num': user.shots_num,
'level': user.level,
'good': good.details(user_id),
})
@logit
@transaction.atomic
def good_exchange(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
good_id = request.POST.get('good_id', '')
good_ids = get_query_value(request, 'good_ids', val_cast_type='listjson')
name = request.POST.get('name', '')
phone = request.POST.get('phone', '')
address = request.POST.get('address', '')
# 校验用户是否存在
try:
user = UserInfo.objects.select_for_update().get(user_id=user_id)
except UserInfo.DoesNotExist:
return response(UserStatusCode.USER_NOT_FOUND)
if good_id:
good_ids.append(good_id)
goods = []
for good_id in good_ids:
try:
good = GoodsInfo.objects.select_for_update().get(good_id=good_id)
except GoodsInfo.DoesNotExist:
return response(MemberGoodStatusCode.GOOD_NOT_FOUND)
if user.level < good.minlevel:
return response(MemberGoodStatusCode.GOOD_NO_EXCHANGE_PERMISSION)
if user.integral < good.integral:
return response(MemberGoodStatusCode.GOOD_INTEGRAL_NOT_ENOUGH)
user.integral -= good.integral
user.save()
good.left_num -= 1
good.save()
GoodsOrderInfo.objects.create(
user_id=user_id,
good_id=good_id,
good_type=good.good_type,
name=name,
phone=phone,
address=address,
)
if good.good_type == GoodsInfo.PHYSICAL:
# TODO: 通知客服发快递
pass
else:
# TODO: 发放虚拟商品
if good.coupon_id:
# 发放券
r.rpushjson(MEMBER_SEND_COUPON_LIST, {
'brand_id': brand_id,
'user_id': user_id,
'coupon_id': good.coupon_id,
})
else:
pass
goods.append(good.data(user_id))
return response(200, data={
'nickname': user.final_nickname,
'avatar': user.avatar,
'integral': user.integral,
'freeze_integral': user.freeze_integral,
'final_integral': user.final_integral,
'shots_num': user.shots_num,
'level': user.level,
'goods': goods,
})
@logit
def coupons(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
page = request.POST.get('page', 1)
num = request.POST.get('num', 20)
coupons = UserCouponInfo.objects.filter(user_id=user_id, status=True).order_by('-pk')
coupons, left = pagination(coupons, page, num)
coupons = [coupon.data for coupon in coupons]
return response(200, data={
'coupons': coupons,
'left': left,
})
@logit
def integrals(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
return response(200, data={
'shots_types': get_member_shot_data(),
'enable_photo_upvote_integral': True,
'mp_url': '',
'photo_upvote_integrals': {
'headers': [u'排名', u'日', u'周', u'月'],
'ranks': [
[u'第1名', '10', '20', '30'],
[u'第2名', '5', '10', '15'],
[u'第3名', '3', '6', '9'],
[u'第4-10名', '1', '2', '3'],
]
},
'enable_activity_integral': True,
})
@logit
def activity_list(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
raw_activitys = MemberActivityInfo.objects.filter(status=True).order_by('position')
banners = []
activitys = []
for act in raw_activitys:
if act.is_slider:
banners.append(act.data(user_id))
else:
activitys.append(act.data(user_id))
return response(200, data={
'banners': banners,
'activitys': activitys,
})
@logit
def activity_detail(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
activity_id = request.POST.get('activity_id')
try:
act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
except MemberActivityInfo.DoesNotExist:
return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
return response(200, data={
'activity': act.details(user_id),
})
@logit
def activity_signup(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
activity_id = request.POST.get('activity_id')
name = request.POST.get('name', '')
phone = request.POST.get('phone', '')
try:
act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
except MemberActivityInfo.DoesNotExist:
return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
'title': act.title,
'name': name,
'phone': phone,
})
# TODO: 立即推送模版消息(报名成功,时间,地点)
# TODO: 延迟(活动当天)推送模版消息(时间,地点)
return response(200, data={
'activity': act.data(user_id),
})
@logit
@transaction.atomic
def activity_signin(request):
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
user_id = request.POST.get('user_id', '')
activity_id = request.POST.get('activity_id')
# 校验用户是否存在
try:
user = UserInfo.objects.select_for_update().get(user_id=user_id)
except UserInfo.DoesNotExist:
return response(UserStatusCode.USER_NOT_FOUND)
try:
act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
except MemberActivityInfo.DoesNotExist:
return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
MemberActivitySigninInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
'title': act.title,
})
user.integral += act.integral
user.save()
# TODO: 立即推送模版消息(感谢您参加活动,获得的积分)
return response(200, data={
'activity': act.data(user_id),
})
|