|
# -*- coding: utf-8 -*-
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django_models_ext import BaseModelMixin, SexModelMixin
from TimeConvert import TimeConvert as tc
from kodo.basemodels import LensmanTypeBoolMixin
from mch.models import ConsumeInfoSubmitLogInfo, MaintenancemanInfo, SaleclerkInfo
from sales.models import SalesResponsibilityInfo
class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
APP_USER = 0
WX_USER = 1
USER_USER = 8
GUEST_USER = 9
LENSMAN_USER = 10
TOURGUIDE_USER = 11
MINIAPP_USER = 12
QYMINIAPP_USER = 22
OAUTH_USER = 13
USER_FROM = (
(APP_USER, u'APP 创建用户'),
(WX_USER, u'微信授权用户'),
(USER_USER, u'用户端用户'),
(GUEST_USER, u'游客用户'),
(LENSMAN_USER, u'摄影师端用户'),
(TOURGUIDE_USER, u'导游端用户'),
(MINIAPP_USER, u'小程序端用户'),
(QYMINIAPP_USER, u'企业微信小程序端用户'),
(OAUTH_USER, u'网页授权用户'),
)
UNVERIFIED = 0
ACTIVATED = 1
DISABLED = 2
DELETED = 3
ASSIGN = 10
USER_STATUS = (
(UNVERIFIED, u'未验证'),
(ACTIVATED, u'已激活'),
(DISABLED, u'已禁用'),
(DELETED, u'已删除'),
(ASSIGN, u'已分配'),
)
MALE = 1
FEMALE = 0
SEX_TYPE = (
(MALE, u'男'),
(FEMALE, u'女'),
)
MEMBER_NO = 0
MEMBER_LRC = 1
MEMBER_SILVER = 2
MEMBER_GOLD = 3
MEMBER_WHITE_GOLD = 4
MEMBER_BLACK_GOLD = 5
LEVEL_TUPLE = (
(MEMBER_NO, u'非会员'),
(MEMBER_LRC, u'LRC会员'),
(MEMBER_SILVER, u'银卡会员'),
(MEMBER_GOLD, u'金卡会员'),
(MEMBER_WHITE_GOLD, u'白金卡会员'),
(MEMBER_BLACK_GOLD, u'黑金卡会员'),
)
user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True, unique=True)
user_from = models.IntegerField(_(u'user_from'), choices=USER_FROM, default=APP_USER, help_text=u'用户来源', db_index=True)
uuid = models.CharField(_(u'uuid'), max_length=255, blank=True, null=True, help_text=u'通用唯一识别码 (Universally Unique Identifier)', db_index=True)
# APP 创建用户
username = models.CharField(_(u'username'), max_length=255, blank=True, null=True, help_text=u'用户用户名', db_index=True, unique=True)
password = models.CharField(_(u'password'), max_length=255, blank=True, null=True, help_text=u'用户密码')
# 微信授权用户
appid = models.CharField(_(u'appid'), max_length=32, blank=True, null=True, help_text=u'appId', db_index=True)
unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True)
openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True)
# 企业微信授权用户
userid = models.CharField(_(u'userid'), max_length=32, blank=True, null=True, help_text=u'企业微信 userid', db_index=True)
# 用户基本信息
name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名')
sex = models.IntegerField(_(u'sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.UNKNOWN, help_text=u'用户性别')
nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户昵称')
avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像')
phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'用户电话', db_index=True)
country = models.CharField(_(u'country'), max_length=255, blank=True, null=True, help_text=u'用户国家')
province = models.CharField(_(u'province'), max_length=255, blank=True, null=True, help_text=u'用户省份')
city = models.CharField(_(u'city'), max_length=255, blank=True, null=True, help_text=u'用户城市')
location = models.CharField(_(u'location'), max_length=255, blank=True, null=True, help_text=u'用户地址')
province_code = models.CharField(_(u'province_code'), max_length=255, blank=True, null=True, help_text=u'用户省份编码')
province_name = models.CharField(_(u'province_name'), max_length=255, blank=True, null=True, help_text=u'用户省份信息')
# 用户身份
islensman = models.BooleanField(_(u'islensman'), default=False, help_text=_(u'摄影师?'))
istourguide = models.BooleanField(_(u'istourguide'), default=False, help_text=_(u'导游?'))
balance = models.IntegerField(_(u'balance'), default=0, help_text=u'用户余额(分)')
freeze_income_balance = models.IntegerField(_(u'freeze_income_balance'), default=0, help_text=u'用户收入冻结余额(分)')
freeze_expense_balance = models.IntegerField(_(u'freeze_expense_balance'), default=0, help_text=u'用户支出冻结余额(分)')
user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'用户状态')
outtake_status = models.IntegerField(_(u'outtake_status'), choices=USER_STATUS, default=UNVERIFIED, help_text=u'花絮摄影师状态')
assign_ip = models.CharField(_(u'assign_ip'), max_length=32, blank=True, null=True, help_text=_(u'分配IP'))
assign_at = models.DateTimeField(_(u'assign_at'), blank=True, null=True, help_text=_(u'分配时间'))
signup_ip = models.CharField(_(u'signup_ip'), max_length=32, blank=True, null=True, help_text=_(u'注册IP'))
signup_at = models.DateTimeField(_(u'signup_at'), blank=True, null=True, help_text=_(u'注册时间'))
login_ip = models.CharField(_(u'login_ip'), max_length=32, blank=True, null=True, help_text=_(u'登录IP'))
login_at = models.DateTimeField(_(u'login_at'), blank=True, null=True, help_text=_(u'登录时间'))
subscribe = models.IntegerField(_(u'subscribe'), default=0, help_text=u'是否关注', db_index=True)
new_subscribe = models.BooleanField(_(u'new_subscribe'), default=False, help_text=_(u'是否新增关注'))
code_version = models.IntegerField(_(u'code_version'), default=1, help_text=u'统览码版本', db_index=True)
has_membercard = models.BooleanField(_(u'has_membercard'), default=False, help_text=_(u'是否激活会员卡'))
membercardid = models.CharField(_(u'membercardid'), max_length=32, blank=True, null=True, help_text=_(u'会员卡编号'), db_index=True)
memberusercardcode = models.CharField(_(u'memberusercardcode'), max_length=32, blank=True, null=True, help_text=_(u'用户会员卡编号'), db_index=True)
test_user = models.BooleanField(_(u'test_user'), default=False, help_text=_(u'是否为测试用户'))
# 会员信息
integral = models.IntegerField(_(u'integral'), default=0, help_text=u'会员积分')
freeze_integral = models.IntegerField(_(u'freeze_integral'), default=0, help_text=u'会员冻结积分')
shots_num = models.IntegerField(_(u'shots_num'), default=0, help_text=u'主持镜头数')
level = models.IntegerField(_(u'level'), choices=LEVEL_TUPLE, default=MEMBER_NO, help_text=u'会员等级')
# 优惠券信息
coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'优惠券过期时间'))
# 维修员信息
is_maintenance = models.BooleanField(_(u'is_maintenance'), default=False, help_text=_(u'是否维修员'))
resgister_at = models.DateTimeField(_(u'resgister_at'), blank=True, null=True, help_text=_(u'注册镜头时间'))
class Meta:
verbose_name = _(u'userinfo')
verbose_name_plural = _(u'userinfo')
unique_together = (
('appid', 'userid'),
)
def __unicode__(self):
return '%d' % self.pk
@property
def final_integral(self):
return self.integral + self.freeze_integral
@property
def final_nickname(self):
if self.user_from == self.APP_USER:
return self.username
elif self.user_from == self.WX_USER:
return self.nickname
elif self.user_from == self.GUEST_USER:
return self.nickname
elif self.user_from == self.LENSMAN_USER:
return self.name
elif self.user_from == self.TOURGUIDE_USER:
return self.name
elif self.user_from == self.MINIAPP_USER:
return self.nickname
return self.nickname
@property
def data(self):
return {
'user_id': self.user_id,
'name': self.name,
'username': self.username,
'nickname': self.nickname,
'avatar': self.avatar,
'phone': self.phone,
}
@property
def cardList(self):
return [
{
'cardId': self.membercardid,
'code': self.memberusercardcode
}
]
def srinfo(self, brand_id=None):
try:
sr = SalesResponsibilityInfo.objects.get(brand_id=brand_id, unionid=self.unionid, user_status=SalesResponsibilityInfo.ACTIVATED)
except SalesResponsibilityInfo.DoesNotExist:
sr = None
return sr.base_data if sr else {
'sr_id': '',
'is_sr': False,
'is_super_sr': False,
}
def brandata(self, brand_id=None):
if self.unionid:
try:
saleclerk = SaleclerkInfo.objects.get(brand_id=brand_id, unionid=self.unionid, status=True)
except SaleclerkInfo.DoesNotExist:
saleclerk = None
saleclerk_info = saleclerk.data if saleclerk and saleclerk.is_auth else {}
else:
saleclerk_info = {}
return {
'has_unionid': bool(self.unionid),
'user_id': self.user_id,
'name': self.name,
'username': self.username,
'nickname': self.nickname,
'avatar': self.avatar,
'phone': self.phone,
'subscribe': self.subscribe,
're_membercard': True if self.has_membercard and not self.memberusercardcode else False,
'has_membercard': self.has_membercard,
'membercardid': self.membercardid,
'memberusercardcode': self.memberusercardcode,
'cardList': self.cardList,
'saleclerk': bool(saleclerk_info),
'saleclerk_info': saleclerk_info,
'sr_info': self.srinfo(brand_id),
# 会员信息
'integral': self.integral,
'freeze_integral': self.freeze_integral,
'shots_num': self.shots_num,
'level': self.level,
}
def brand_qydata(self, brand_id=None):
if self.phone:
try:
saleclerk = SaleclerkInfo.objects.get(brand_id=brand_id, clerk_phone=self.phone, status=True)
except SaleclerkInfo.DoesNotExist:
saleclerk = None
saleclerk_info = saleclerk.data if saleclerk and saleclerk.is_auth else {}
else:
saleclerk_info = {}
try:
maintenance = MaintenancemanInfo.objects.get(brand_id=brand_id, user_id=self.user_id, status=True)
except MaintenancemanInfo.DoesNotExist:
maintenance = {}
maintenance_info = maintenance.data if maintenance and self.is_maintenance else {}
return {
'has_unionid': bool(self.unionid),
'user_id': self.user_id,
'name': self.name,
'username': self.username,
'nickname': self.nickname,
'avatar': self.avatar,
'phone': self.phone,
'subscribe': self.subscribe,
're_membercard': True if self.has_membercard and not self.memberusercardcode else False,
'has_membercard': self.has_membercard,
'membercardid': self.membercardid,
'memberusercardcode': self.memberusercardcode,
'cardList': self.cardList,
'saleclerk': bool(saleclerk_info),
'saleclerk_info': saleclerk_info,
'sr_info': self.srinfo(brand_id),
# 会员信息
'integral': self.integral,
'freeze_integral': self.freeze_integral,
'shots_num': self.shots_num,
'level': self.level,
# 维修员信息
'is_maintenance': bool(maintenance_info),
'maintenance': maintenance_info,
}
@property
def sendcustomwxamessage(self):
# 关注公众号 + 未领保修卡 + 已绑定镜头
return self.subscribe and not self.has_membercard and self.shots_num
@property
def admindata(self):
models = ConsumeInfoSubmitLogInfo.objects.filter(user_id=self.user_id, dupload=False, status=True).values_list('model_uni_name', flat=True)
return {
'user_id': self.user_id,
'nickname': self.nickname,
'avatar': self.avatar,
'phone': self.phone,
'sex': self.sex,
'province': self.province,
'city': self.city,
'province_name': self.province_name,
'subscribe': self.subscribe,
'membercardid': self.membercardid,
'memberusercardcode': self.memberusercardcode,
'created_at': tc.local_string(utc_dt=self.created_at),
'code_version': self.code_version,
# 商品信息
'models': list(models),
# 会员信息
'integral': self.integral,
'shots_num': self.shots_num,
'level': self.level,
}
@property
def cardata(self):
return {
# 'brand_id': self.brand_id,
'card_id': self.membercardid,
'code': self.memberusercardcode,
}
class UserIntegralIncomeExpensesInfo(BaseModelMixin):
PRODUCT = 0
SHARE = 1
CONTRIBUTE = 2
MEMBER_ACTIVITY_CONTRIBUTION_WELFARE = 99
INTEGRAL_FROM = (
(PRODUCT, u'产品'),
(SHARE, u'分享'),
(CONTRIBUTE, u'投稿'),
(MEMBER_ACTIVITY_CONTRIBUTION_WELFARE, u'会员活动投稿福利'),
)
user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)
brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')
model_id = models.CharField(_(u'model_id'), max_length=32, blank=True, null=True, help_text=u'型号唯一标识', db_index=True)
model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')
code = models.CharField(_(u'code'), max_length=32, blank=True, null=True, help_text=u'机身码', db_index=True)
integral_from = models.IntegerField(_(u'integral_from'), choices=INTEGRAL_FROM, default=PRODUCT, help_text=u'积分来源')
integral = models.IntegerField(_(u'integral'), default=0, help_text=u'增减积分')
final_integral = models.IntegerField(_(u'final_integral'), default=0, help_text=u'最终积分')
remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注')
class Meta:
verbose_name = _(u'userinfointegralincomeexpensesinfo')
verbose_name_plural = _(u'userinfointegralincomeexpensesinfo')
def __unicode__(self):
return '%d' % self.pk
|