|
# -*- coding: utf-8 -*-
import json
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django_models_ext import BaseModelMixin, upload_file_path, upload_file_url, upload_path
from jsonfield import JSONField
from shortuuidfield import ShortUUIDField
from TimeConvert import TimeConvert as tc
from coupon.models import CouponInfo
from mch.models import ModelInfo
from simditor.fields import RichTextField
class GoodsInfo(BaseModelMixin):
PHYSICAL = 0
VIRTUAL = 1
GOOD_TYPE_TUPLE = (
(PHYSICAL, u'实物'),
(VIRTUAL, u'虚拟'),
)
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'品牌名称')
good_id = ShortUUIDField(_(u'good_id'), max_length=32, blank=True, null=True, help_text=u'商品唯一标识', db_index=True, unique=True)
good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True)
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称')
desc = RichTextField(_(u'desc'), blank=True, null=True, help_text=u'商品描述')
value = models.IntegerField(_(u'value'), default=99999, help_text=u'商品价值,单位分')
left_num = models.IntegerField(_(u'left_num'), default=0, help_text=u'商品库存', db_index=True)
image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品图片')
coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=u'是否为轮播商品')
slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品轮播图片')
integral = models.IntegerField(_(u'integral'), default=99999, help_text=u'兑换所需积分')
fee = models.IntegerField(_(u'fee'), default=99999, help_text=u'兑换需额外支付金额,单位分')
minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'兑换最低会员级别', db_index=True)
only_for_member = models.BooleanField(_(u'only_for_member'), default=False, help_text=u'会员专属')
only_once = models.BooleanField(_(u'only_once'), default=False, help_text=u'仅支持兑换一次')
position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
class Meta:
verbose_name = _(u'会员商品信息')
verbose_name_plural = _(u'会员商品信息')
def __unicode__(self):
return '%d' % self.pk
@property
def image_path(self):
return upload_file_path(self.image)
@property
def image_url(self):
return upload_file_url(self.image)
@property
def slider_image_path(self):
return upload_file_path(self.slider_image)
@property
def slider_image_url(self):
return upload_file_url(self.slider_image)
def has_member_exchange(self, user_id=None):
if not self.only_for_member:
return False
if not user_id:
return False
return GoodsOrderInfo.objects.filter(good_id=self.good_id, user_id=user_id).exists()
def data(self, user_id=None):
return {
'good_id': self.good_id,
'good_type': self.good_type,
'title': self.title,
'image': self.image_url,
'slider_image': self.slider_image_url,
'integral': self.integral,
'fee': self.fee,
'minlevel': self.minlevel,
'only_for_member': self.only_for_member,
'has_member_exchange': self.has_member_exchange(user_id),
'able': True,
'value': self.value,
}
def details(self, user_id):
detail = self.data(user_id)
detail['desc'] = self.desc
return detail
@property
def admindata(self):
try:
coupon = CouponInfo.objects.get(coupon_id=self.coupon_id).admindata
except CouponInfo.DoesNotExist:
coupon = {}
return {
'good_id': self.good_id,
'good_type': self.good_type,
'title': self.title,
'image': self.image_url,
'image_path': self.image_path,
'slider_image': self.slider_image_url,
'slider_path': self.slider_image_path,
'integral': self.integral,
'fee': self.fee,
'value': self.value,
'left_num': self.left_num,
'coupon': coupon,
'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
}
@property
def admindetails(self):
try:
coupon = CouponInfo.objects.get(coupon_id=self.coupon_id).admindata
except CouponInfo.DoesNotExist:
coupon = {}
return {
'good_id': self.good_id,
'good_type': self.good_type,
'title': self.title,
'image': self.image_url,
'image_path': self.image_path,
'slider_image': self.slider_image_url,
'slider_path': self.slider_image_path,
'integral': self.integral,
'fee': self.fee,
'value': self.value,
'desc': self.desc,
'left_num': self.left_num,
'coupon': coupon,
'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
}
class GoodsOrderInfo(BaseModelMixin):
PHYSICAL = 0
VIRTUAL = 1
GOOD_TYPE_TUPLE = (
(PHYSICAL, u'实物'),
(VIRTUAL, u'虚拟'),
)
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'品牌名称')
order_id = ShortUUIDField(_(u'order_id'), max_length=32, blank=True, null=True, help_text=u'订单唯一标识', db_index=True, unique=True)
user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
good_id = models.CharField(_(u'good_id'), max_length=32, blank=True, null=True, help_text=u'商品唯一标识', db_index=True)
good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True)
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称')
name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名')
phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话')
address = models.CharField(_(u'address'), max_length=255, blank=True, null=True, help_text=u'地址')
tracking_number = models.CharField(_(u'tracking_number'), max_length=255, blank=True, null=True, help_text=u'快递单号')
integral = models.IntegerField(_(u'integral'), default=99999, help_text=u'兑换所需积分')
has_send_template_message = models.BooleanField(_(u'has_send_template_message'), default=False, help_text=u'是否已发送模版消息')
send_template_message_res = JSONField(_(u'send_template_message_res'), blank=True, null=True, help_text=u'send_template_message_res')
remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注')
class Meta:
verbose_name = _(u'会员商品订单信息')
verbose_name_plural = _(u'会员商品订单信息')
def __unicode__(self):
return '%d' % self.pk
@property
def admindata(self):
good = GoodsInfo.objects.get(good_id=self.good_id)
return {
'order_id': self.order_id,
'good_id': self.good_id,
'good_name': good.title,
'good_type': good.good_type,
'user_id': self.user_id,
'user_name': self.name,
'user_phone': self.phone,
'user_address': self.address,
'tracking_number': self.tracking_number,
'integral': self.integral,
'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
'send_template_message_res': json.loads(self.send_template_message_res) if self.send_template_message_res else '',
'remark': self.remark
}
class RightInfo(BaseModelMixin):
PHYSICAL = 0
VIRTUAL = 1
COUPON = 2
RIGHT_TYPE_TUPLE = (
(PHYSICAL, u'实物'),
(VIRTUAL, u'虚拟'),
(COUPON, u'优惠券'),
)
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'品牌名称')
right_id = ShortUUIDField(_(u'right_id'), max_length=32, blank=True, null=True, help_text=u'权益唯一标识', db_index=True, unique=True)
right_type = models.IntegerField(_(u'right_type'), choices=RIGHT_TYPE_TUPLE, default=VIRTUAL, help_text=u'权益类型', db_index=True)
icon = models.ImageField(_(u'icon'), upload_to=upload_path, blank=True, null=True, help_text=u'权益图标')
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'权益名称')
subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'权益二级名称')
detail = RichTextField(_(u'detail'), blank=True, null=True, help_text=u'权益详情')
level1 = models.CharField(_(u'level1'), max_length=255, blank=True, null=True, help_text=u'level1')
level2 = models.CharField(_(u'level2'), max_length=255, blank=True, null=True, help_text=u'level2')
level3 = models.CharField(_(u'level3'), max_length=255, blank=True, null=True, help_text=u'level3')
level4 = models.CharField(_(u'level4'), max_length=255, blank=True, null=True, help_text=u'level4')
level5 = models.CharField(_(u'level5'), max_length=255, blank=True, null=True, help_text=u'level5')
minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'权益最低会员级别')
position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
# 券相关
is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=_(u'是否发券'))
coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数'))
coupon_level1_num = models.IntegerField(_(u'coupon_level1_num'), default=0, help_text=_(u'券每会员级别发放张数'))
coupon_level2_num = models.IntegerField(_(u'coupon_level2_num'), default=0, help_text=_(u'券每会员级别发放张数'))
coupon_level3_num = models.IntegerField(_(u'coupon_level3_num'), default=0, help_text=_(u'券每会员级别发放张数'))
coupon_level4_num = models.IntegerField(_(u'coupon_level4_num'), default=0, help_text=_(u'券每会员级别发放张数'))
coupon_level5_num = models.IntegerField(_(u'coupon_level5_num'), default=0, help_text=_(u'券每会员级别发放张数'))
coupon_level1_id = models.CharField(_(u'coupon_level1_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
coupon_level2_id = models.CharField(_(u'coupon_level2_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
coupon_level3_id = models.CharField(_(u'coupon_level3_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
coupon_level4_id = models.CharField(_(u'coupon_level4_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
coupon_level5_id = models.CharField(_(u'coupon_level5_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True)
class Meta:
verbose_name = _(u'会员权益信息')
verbose_name_plural = _(u'会员权益信息')
def __unicode__(self):
return '%d' % self.pk
@property
def icon_path(self):
return upload_file_path(self.icon)
@property
def icon_url(self):
return upload_file_url(self.icon)
@property
def data(self):
return {
'right_id': self.right_id,
'right_type': self.right_type,
'icon': self.icon_url,
'title': self.title,
'subtitle': self.subtitle,
'detail': self.detail,
'level1': self.level1,
'level2': self.level2,
'level3': self.level3,
'level4': self.level4,
'level5': self.level5,
'minlevel': self.minlevel,
'able': True,
'left_num': 3,
'left_tip': 3,
}
def maintaindata(self, level):
right_detail = ''
if level == 1:
right_detail = self.level1 if self.level1 else ''
elif level == 2:
right_detail = self.level2 if self.level2 else ''
elif level == 3:
right_detail = self.level3 if self.level3 else ''
elif level == 4:
right_detail = self.level4 if self.level4 else ''
elif level == 5:
right_detail = self.level5 if self.level5 else ''
return right_detail
class ShotTypeInfo(BaseModelMixin):
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'品牌名称')
shot_type_id = ShortUUIDField(_(u'shot_type_id'), max_length=32, blank=True, null=True, help_text=u'镜头类型唯一标识', db_index=True, unique=True)
shot_type_name = models.CharField(_(u'shot_type_name'), max_length=255, blank=True, null=True, help_text=u'镜头类型名称')
position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
class Meta:
verbose_name = _(u'镜头类型信息')
verbose_name_plural = _(u'镜头类型信息')
def __unicode__(self):
return '%d' % self.pk
@property
def shots(self):
models = ModelInfo.objects.filter(shot_type_id=self.shot_type_id, status=True, is_show_shot=True)
return [model.member_shot_data for model in models]
@property
def data(self):
return {
'type_id': self.shot_type_id,
'type_name': self.shot_type_name,
'shots': self.shots,
}
class MemberActivityInfo(BaseModelMixin):
ACTIVITY_STATE = (
(0, u'草稿'),
(1, u'已发布'),
(2, u'下线'),
)
brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, default='', help_text=u'品牌唯一标识', db_index=True)
brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, default='', help_text=u'品牌名称')
activity_id = ShortUUIDField(_(u'activity_id'), max_length=32, blank=True, help_text=u'活动唯一标识', db_index=True, unique=True)
title = models.CharField(_(u'title'), max_length=255, blank=True, default='', help_text=u'活动名称')
subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, default='', help_text=u'活动二级名称')
date = models.DateField(_(u'date'), blank=True, null=True, help_text=u'活动时间')
city = models.CharField(_(u'city'), max_length=255, blank=True, default='', help_text=u'活动城市')
location = models.CharField(_(u'location'), max_length=255, blank=True, default='', help_text=u'活动地点')
lat = models.FloatField(_(u'lat'), default=1.0, help_text=u'纬度')
lon = models.FloatField(_(u'lon'), default=1.0, help_text=u'经度')
integral = models.IntegerField(_(u'integral'), default=0, help_text=u'会员积分')
group_share_integral = models.IntegerField(_(u'group_share_integral'), default=0, help_text=u'群组分享会员积分')
group_share_max_integral = models.IntegerField(_(u'group_share_max_integral'), default=0, help_text=u'群组分享会员积分单人上限')
image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, help_text=u'活动内容图片')
cover = models.ImageField(_(u'cover'), upload_to=upload_path, blank=True, help_text=u'活动列表图片')
is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=u'是否为轮播活动')
slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, help_text=u'活动轮播图片')
content_rich_text = RichTextField(_(u'content_rich_text'), blank=True, default='', help_text=u'活动描述')
share_img_link = models.CharField(_(u'share_img_link'), max_length=255, blank=True, default='', help_text=u'活动图片分享')
share_h5_link = models.CharField(_(u'share_h5_link'), max_length=255, blank=True, default='', help_text=u'活动H5分享')
is_signup = models.BooleanField(_(u'is_signup'), default=True, help_text=u'是否有报名功能')
activity_state = models.IntegerField(_(u'activity_state'), choices=ACTIVITY_STATE, default=0, help_text=u'活动状态', db_index=True)
position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True)
class Meta:
verbose_name = _(u'会员活动信息')
verbose_name_plural = _(u'会员活动信息')
def __unicode__(self):
return '%d' % self.pk
@property
def image_path(self):
return upload_file_path(self.image)
@property
def image_url(self):
return upload_file_url(self.image)
@property
def cover_path(self):
return upload_file_path(self.cover)
@property
def cover_url(self):
return upload_file_url(self.cover)
@property
def slider_image_path(self):
return upload_file_path(self.slider_image)
@property
def slider_image_url(self):
return upload_file_url(self.slider_image)
@property
def final_state(self):
if not self.date:
return u'报名中'
tdate = tc.local_date()
if tdate < self.date:
return u'报名中' if self.is_signup else u'进行中'
if tdate == self.date:
return u'活动中'
return u'已结束'
def is_signed(self, user_id):
# 是否已报名
return MemberActivitySignupInfo.objects.filter(user_id=user_id, activity_id=self.activity_id, status=True).exists()
def data(self, user_id):
return {
'id': self.activity_id,
'activity_id': self.activity_id,
'title': self.title,
'subtitle': self.subtitle,
'date': self.date.strftime('%Y-%m-%d'),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'cover_url': self.cover_url,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'slider_image': self.slider_image_url,
'state': self.final_state,
'is_signed': self.is_signed(user_id),
'is_signup': self.is_signup,
}
def details(self, user_id):
return {
'id': self.activity_id,
'activity_id': self.activity_id,
'title': self.title,
'subtitle': self.subtitle,
'date': self.date.strftime('%Y-%m-%d'),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'content_rich_text': self.content_rich_text,
'cover_url': self.cover_url,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'slider_image': self.slider_image_url,
'state': self.final_state,
'is_signed': self.is_signed(user_id),
'is_signup': self.is_signup,
}
@property
def admindata(self):
return {
'id': self.activity_id,
'activity_id': self.activity_id,
'title': self.title,
'subtitle': self.subtitle,
'date': self.date.strftime('%Y-%m-%d'),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'cover_url': self.cover_url,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'slider_image': self.slider_image_url,
'state': self.final_state,
'is_signup': self.is_signup,
'share_integral': self.group_share_integral,
'share_max_integral': self.group_share_max_integral,
'is_slider': self.is_slider,
'activity_state': self.activity_state,
'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
}
@property
def admindetails(self):
return {
'id': self.activity_id,
'activity_id': self.activity_id,
'title': self.title,
'subtitle': self.subtitle,
'date': self.date.strftime('%Y-%m-%d'),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'content_rich_text': self.content_rich_text,
'cover_url': self.cover_url,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'slider_image': self.slider_image_url,
'state': self.final_state,
'is_signup': self.is_signup,
'share_integral': self.group_share_integral,
'share_max_integral': self.group_share_max_integral,
'activity_state': self.activity_state,
'is_slider': self.is_slider,
'banner_path': self.slider_image_path,
'cover_path': self.cover_path,
'created_at': tc.local_string(utc_dt=self.created_at, format='%Y-%m-%d %H:%M:%S'),
}
class MemberActivitySignupInfo(BaseModelMixin):
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'品牌名称')
signup_id = ShortUUIDField(_(u'signup_id'), max_length=32, blank=True, null=True, help_text=u'活动报名唯一标识', db_index=True, unique=True)
user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名')
phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话')
class Meta:
verbose_name = _(u'会员活动报名信息')
verbose_name_plural = _(u'会员活动报名信息')
unique_together = (
('user_id', 'activity_id'),
)
def __unicode__(self):
return '%d' % self.pk
@property
def admindata(self):
return {
'user_id': self.user_id,
'activity_id': self.activity_id,
'title': self.title,
'name': self.name,
'phone': self.phone,
}
class MemberActivitySigninInfo(BaseModelMixin):
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'品牌名称')
signin_id = ShortUUIDField(_(u'signin_id'), max_length=32, blank=True, null=True, help_text=u'活动签到唯一标识', db_index=True, unique=True)
user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
class Meta:
verbose_name = _(u'会员活动签到信息')
verbose_name_plural = _(u'会员活动签到信息')
unique_together = (
('user_id', 'activity_id'),
)
def __unicode__(self):
return '%d' % self.pk
class MemberActivityGroupShareInfo(BaseModelMixin):
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'品牌名称')
group_share_id = ShortUUIDField(_(u'group_share_id'), max_length=32, blank=True, null=True, help_text=u'活动群组分享唯一标识', db_index=True)
activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True)
share_user_id = models.CharField(_(u'share_user_id'), max_length=32, blank=True, null=True, help_text=u'分享用户唯一标识', db_index=True)
click_user_id = models.CharField(_(u'click_user_id'), max_length=32, blank=True, null=True, help_text=u'点击用户唯一标识', db_index=True)
open_gid = models.CharField(_(u'open_gid'), max_length=32, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称')
is_integral = models.BooleanField(_(u'is_integral'), default=False, help_text=u'是否有积分')
integral = models.IntegerField(_(u'integral'), default=0, help_text=u'积分')
class Meta:
verbose_name = _(u'会员活动群组分享信息')
verbose_name_plural = _(u'会员活动群组分享信息')
unique_together = (
('activity_id', 'share_user_id', 'click_user_id', 'open_gid', 'brand_id'),
)
def __unicode__(self):
return '%d' % self.pk
|