No Description

models.py 35KB

    # -*- 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 kodo.basemodels import BrandInfoMixin from mch.models import ModelInfo from simditor.fields import RichTextField from utils.qiniucdn import qiniu_file_url class GoodsInfo(BaseModelMixin, BrandInfoMixin): PHYSICAL = 0 VIRTUAL = 1 GOOD_TYPE_TUPLE = ( (PHYSICAL, u'实物'), (VIRTUAL, 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, BrandInfoMixin): PHYSICAL = 0 VIRTUAL = 1 GOOD_TYPE_TUPLE = ( (PHYSICAL, u'实物'), (VIRTUAL, 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, BrandInfoMixin): PHYSICAL = 0 VIRTUAL = 1 COUPON = 2 RIGHT_TYPE_TUPLE = ( (PHYSICAL, u'实物'), (VIRTUAL, u'虚拟'), (COUPON, 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, BrandInfoMixin): 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, BrandInfoMixin): ACTIVITY_TYPE = ( (0, u'线下活动'), (1, u'公众号文章'), (2, u'线上活动'), (3, u'投稿活动'), ) ACTIVITY_STATE = ( (0, u'草稿'), (1, u'已发布'), (2, 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, BrandInfoMixin): 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 { 'signup_id': self.signup_id, 'user_id': self.user_id, 'activity_id': self.activity_id, 'title': self.title, 'name': self.name, 'phone': self.phone, } class MemberActivitySigninInfo(BaseModelMixin, BrandInfoMixin): 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, BrandInfoMixin): 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, BrandInfoMixin): CONTENT_TYPE = ( (0, u'投稿'), (1, u'创作日记'), # (2, u'入围'), ) AUDIT_PASS = 1 AUDIT_STATUS = ( (0, u'未审批'), (1, u'已通过'), (2, u'未通过'), ) contribution_id = ShortUUIDField(_(u'contribution_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) content_type = models.IntegerField(_(u'content_type'), choices=CONTENT_TYPE, default=0, help_text=u'内容类型', db_index=True) # 传参图片列表(默认第一张为封面图,包括图片url、宽、高)、标题、内容(纯文本)。 title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'标题') content = models.TextField(_(u'content'), blank=True, null=True, help_text=u'内容') # content_rich_text = RichTextField(_(u'content_rich_text'), blank=True, default='', help_text=u'内容') # [{ # 'image_url': '', # 'width': 100, # 'height': 100, # }] images = JSONField(_(u'images'), default=[], help_text=u'图片列表') video_url = models.CharField(_(u'video_url'), max_length=255, blank=True, null=True, help_text=u'视频链接') audit_status = models.IntegerField(_(u'audit_status'), choices=AUDIT_STATUS, default=0, help_text=u'审批状态', db_index=True) is_selected = models.BooleanField(_(u'is_selected'), default=False, help_text=u'是否入围') class Meta: verbose_name = _(u'会员活动投稿信息') verbose_name_plural = _(u'会员活动投稿信息') def __unicode__(self): return '%d' % self.pk @property def data(self): return { 'contribution_id': self.contribution_id, 'brand_id': self.brand_id, 'brand_name': self.brand_name, 'user_id': self.user_id, 'activity_id': self.activity_id, 'content_type': self.content_type, 'content_type_str': dict(MemberActivityContributionInfo.CONTENT_TYPE).get(self.content_type), 'title': self.title, 'content': self.content, 'images': self.images, 'video_url': self.video_url or '', 'audit_status': self.audit_status, 'audit_status_str': dict(MemberActivityContributionInfo.AUDIT_STATUS).get(self.audit_status), 'is_selected': self.is_selected, 'created_at': tc.local_string(utc_dt=self.created_at), } class MemberActivityContributionWelfareInfo(BaseModelMixin, BrandInfoMixin): WELFARE_TYPE = ( (0, u'实物'), (1, u'积分'), (2, u'虚拟'), ) welfare_id = ShortUUIDField(_(u'welfare_id'), max_length=32, blank=True, null=True, help_text=u'福利唯一标识', db_index=True, unique=True) activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True) welfare_type = models.IntegerField(_(u'welfare_type'), choices=WELFARE_TYPE, default=0, help_text=u'福利类型', db_index=True) welfare_title = models.CharField(_(u'welfare_title'), max_length=255, blank=True, null=True, help_text=u'福利标题') welfare_detail = RichTextField(_(u'welfare_detail'), blank=True, null=True, help_text=u'福利详情') welfare_value = models.IntegerField(_(u'welfare_value'), default=0, help_text=_(u'福利数量')) welfare_image = models.ImageField(_(u'welfare_image'), upload_to=upload_path, blank=True, null=True, help_text=u'福利图片') 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 welfare_image_path(self): return upload_file_path(self.welfare_image) @property def welfare_image_url(self): return qiniu_file_url(self.welfare_image.name, bucket='tamron') if self.is_upload_qiniu else upload_file_url(self.welfare_image) @property def data(self): return { 'welfare_id': self.welfare_id, 'brand_id': self.brand_id, 'brand_name': self.brand_name, 'activity_id': self.activity_id, 'welfare_type': self.welfare_type, 'welfare_type_str': dict(MemberActivityContributionWelfareInfo.WELFARE_TYPE).get(self.welfare_type), 'welfare_title': self.welfare_title, 'welfare_detail': self.welfare_detail, 'welfare_value': self.welfare_value, 'welfare_image_url': self.welfare_image_url, 'welfare_image_path': self.welfare_image_path, } class MemberActivityContributionWelfareUnlockingInfo(BaseModelMixin, BrandInfoMixin): WELFARE_TYPE = ( (0, u'实物'), (1, u'积分'), (2, u'虚拟'), ) unlocking_id = ShortUUIDField(_(u'unlocking_id'), max_length=32, blank=True, null=True, help_text=u'福利解锁唯一标识', db_index=True, unique=True) admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'管理员唯一标识', db_index=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) contribution_id = models.CharField(_(u'contribution_id'), max_length=32, blank=True, null=True, help_text=u'投稿唯一标识', db_index=True) welfare_id = models.CharField(_(u'welfare_id'), max_length=32, blank=True, null=True, help_text=u'福利唯一标识', db_index=True) 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'快递单号') is_handled = models.BooleanField(_(u'is_handled'), default=False, help_text=_(u'是否已处理')) class Meta: verbose_name = _(u'会员活动投稿福利解锁信息') verbose_name_plural = _(u'会员活动投稿福利解锁信息') def __unicode__(self): return '%d' % self.pk @property def data(self): return { 'unlocking_id': self.unlocking_id, 'brand_id': self.brand_id, 'brand_name': self.brand_name, 'admin_id': self.admin_id, 'user_id': self.user_id, 'activity_id': self.activity_id, 'contribution_id': self.contribution_id, 'welfare_id': self.welfare_id, 'name': self.name, 'phone': self.phone, 'address': self.address, 'tracking_number': self.tracking_number, 'is_handled': self.is_handled, }