暂无描述

models.py 17KB

    # -*- coding: utf-8 -*- from django.conf import settings 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'注册镜头时间') # 身份证信息 identity_card_number = models.CharField(_(u'identity_card_number'), max_length=32, blank=True, null=True, help_text=u'身份证号') identity_card_name = models.CharField(_(u'identity_card_name'), max_length=32, blank=True, null=True, help_text=u'身份证姓名') # 租用镜头权限 tenancy_shot_permission = models.BooleanField(_(u'tenancy_shot_permission'), default=False, 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 final_avatar(self): return self.avatar and self.avatar.replace(settings.QINIU_FILE_URL_BEFORE, settings.QINIU_FILE_URL_AFTER).replace(settings.QINIU_FILE_URL_BEFORE2, settings.QINIU_FILE_URL_AFTER) @property def data(self): return { 'user_id': self.user_id, 'name': self.name, 'username': self.username, 'nickname': self.nickname, 'avatar': self.final_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.final_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, # 身份信息 'identity_card_number': self.identity_card_number, 'identity_card_name': self.identity_card_name, 'tenancy_shot_permission': self.tenancy_shot_permission, } 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.final_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.final_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, 'tenancy_shot_permission': self.tenancy_shot_permission, } @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