|
# -*- 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
from utils.qiniucdn import qiniu_file_url
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)
is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=_(u'是否已上传七牛'))
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 qiniu_file_url(self.image.name, bucket='tamron') if self.is_upload_qiniu else 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 qiniu_file_url(self.slider_image.name, bucket='tamron') if self.is_upload_qiniu else 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, status=True).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),
}
@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),
}
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),
'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'是否发券'))
is_continue_send_coupon = models.BooleanField(_(u'is_continue_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_TYPE = (
(0, u'线下活动'),
(1, u'公众号文章'),
(2, u'线上活动'),
(3, u'投稿活动'),
)
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)
activity_type = models.IntegerField(_(u'activity_type'), choices=ACTIVITY_TYPE, default=0, help_text=u'活动类型', db_index=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'活动时间')
start_date = models.DateField(_(u'start_date'), blank=True, null=True, help_text=u'活动报名开始日期')
end_date = models.DateField(_(u'end_date'), blank=True, null=True, help_text=u'活动报名截止日期')
start_display_date = models.DateField(_(u'start_display_date'), blank=True, null=True, help_text=u'活动展示开始日期')
end_display_date = models.DateField(_(u'end_display_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'群组分享会员积分单人上限')
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'活动轮播图片')
cover = models.ImageField(_(u'cover'), upload_to=upload_path, blank=True, help_text=u'活动列表图片')
limit_image_num = models.IntegerField(_(u'limit_image_num'), default=3, help_text=u'限制图片数量')
image = models.ImageField(_(u'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)
is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=_(u'是否已上传七牛'))
class Meta:
verbose_name = _(u'会员活动信息')
verbose_name_plural = _(u'会员活动信息')
def __unicode__(self):
return '%d' % self.pk
@property
def slider_image_path(self):
return upload_file_path(self.slider_image)
@property
def slider_image_url(self):
return qiniu_file_url(self.slider_image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.slider_image)
@property
def cover_path(self):
return upload_file_path(self.cover)
@property
def cover_url(self):
return qiniu_file_url(self.cover.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.cover)
# @property
# def image_path(self):
# return upload_file_path(self.image)
#
# @property
# def image_url(self):
# return qiniu_file_url(self.image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.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,
'activity_type': self.activity_type,
'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
'title': self.title,
'subtitle': self.subtitle,
'date': tc.local_date_string(self.date),
'start_date': tc.local_date_string(self.start_date),
'end_date': tc.local_date_string(self.end_date),
'start_display_date': tc.local_date_string(self.start_display_date),
'end_display_date': tc.local_date_string(self.end_display_date),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'slider_image': self.slider_image_url,
'cover_url': self.cover_url,
'limit_image_num': self.limit_image_num,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'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,
'activity_type': self.activity_type,
'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
'title': self.title,
'subtitle': self.subtitle,
'date': tc.local_date_string(self.date),
'start_date': tc.local_date_string(self.start_date),
'end_date': tc.local_date_string(self.end_date),
'start_display_date': tc.local_date_string(self.start_display_date),
'end_display_date': tc.local_date_string(self.end_display_date),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'slider_image': self.slider_image_url,
'cover_url': self.cover_url,
'limit_image_num': self.limit_image_num,
'content_rich_text': self.content_rich_text,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'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,
'activity_type': self.activity_type,
'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
'title': self.title,
'subtitle': self.subtitle,
'date': tc.local_date_string(self.date),
'start_date': tc.local_date_string(self.start_date),
'end_date': tc.local_date_string(self.end_date),
'start_display_date': tc.local_date_string(self.start_display_date),
'end_display_date': tc.local_date_string(self.end_display_date),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'is_slider': self.is_slider,
'slider_image': self.slider_image_url,
'cover_url': self.cover_url,
'limit_image_num': self.limit_image_num,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'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,
'created_at': tc.local_string(utc_dt=self.created_at),
}
@property
def admindetails(self):
return {
'id': self.activity_id,
'activity_id': self.activity_id,
'activity_type': self.activity_type,
'activity_type_str': dict(MemberActivityInfo.ACTIVITY_TYPE).get(self.activity_type),
'title': self.title,
'subtitle': self.subtitle,
'date': tc.local_date_string(self.date),
'start_date': tc.local_date_string(self.start_date),
'end_date': tc.local_date_string(self.end_date),
'start_display_date': tc.local_date_string(self.start_display_date),
'end_display_date': tc.local_date_string(self.end_display_date),
'city': self.city,
'location': self.location,
'lat': self.lat,
'lon': self.lon,
'integral': self.integral,
'is_slider': self.is_slider,
'banner_path': self.slider_image_path,
'slider_image': self.slider_image_url,
'cover_path': self.cover_path,
'cover_url': self.cover_url,
'limit_image_num': self.limit_image_num,
'content_rich_text': self.content_rich_text,
'share_img_link': self.share_img_link,
'share_h5_link': self.share_h5_link,
'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,
'created_at': tc.local_string(utc_dt=self.created_at),
}
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
class MemberActivityContributionInfo(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'品牌名称')
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
|